【问题标题】:Uploading pdfkit pdf stream to S3 bucket from Lambda function gives Error: Cannot determine length of [object PDFDocument]从 Lambda 函数将 pdfkit pdf 流上传到 S3 存储桶会出现错误:无法确定 [object PDFDocument] 的长度
【发布时间】:2018-10-09 14:35:09
【问题描述】:

我在创建 pdf 的 lamda 函数中使用 pdfkit,然后应该将 pdf 上传到 S3 存储桶。但是当我测试函数时,我得到 Error: Cannot determine length of [object PDFDocument]

这是我的功能:

var PDFDocument = require('pdfkit');
var AWS = require('aws-sdk');
process.env['PATH'] = process.env['PATH'] + ':' +         
process.env['LAMBDA_TASK_ROOT'];
exports.handler = function(event, context) {

// create a document and pipe to a blob
var doc = new PDFDocument();

// draw some text
doc.fontSize(25)
.text('Hello World', 100, 80);

var params = {
  Bucket : "test-bucket",
  Key : event.pdf_name + ".pdf",
  Body : doc
}

var s3 = new AWS.S3();
s3.putObject(params, function(err, data) {
  if (err) {
    console.log(err)
  } else {
    context.done(null, { status: 'pdf created' });
    doc.end();
  }
 });

};

我做错了什么?如果需要,我如何提供文件大小?这是执行此操作的好方法还是有更好的方法将 pdf 文件流上传到 s3 存储桶?

【问题讨论】:

    标签: pdf amazon-s3 upload aws-lambda node-pdfkit


    【解决方案1】:

    这是我的解决方案:

    const PDFDocument = require('pdfkit');
    const fs = require("fs");
    const AWS = require('aws-sdk');
    const s3 = new AWS.S3();
    
    exports.handler = function (event, callback) {
        let doc = new PDFDocument;
        let fileName = "yourfile.pdf";
    
        //We use Lambdas temp folder to store file temporarily.
        //When Lambda execution ends temp is flushed
        let file = fs.createWriteStream("/tmp/" + fileName);
    
        doc.pipe(file);
        doc.text("hello");
        // # Finalize PDF file 
        doc.end();
    
        // Send pdf file to s3
        file.on("finish", function () {
    
            //get the file size
            const stats = fs.statSync("/tmp/" + fileName);
            console.log("filesize: " + stats.size);
    
            console.log("starting s3 putObject");
            s3.putObject({
                Bucket: "[your-bucket]",
                Key: fileName,
                Body: fs.createReadStream("/tmp/" + fileName),
                ContentType: "application/pdf",
                ContentLength: stats.size,
            }, function (err) {
                if (err) {
                    console.log(err, err.stack);
                    callback(err);
                } else {
                    console.log("Done");
                    callback(null, "done");
                }
            });
        });
    }
    

    此解决方案的关键要素是使用文件流和 lambda 临时文件夹。 file.on("finish") 用于实际检查文件写入是否结束。

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2018-08-13
      • 2018-08-31
      • 2020-10-17
      • 2022-11-19
      • 1970-01-01
      • 2015-10-28
      • 2018-06-19
      • 2020-02-14
      相关资源
      最近更新 更多