Загрузка pdfkit pdf потока в корзину S3 из лямбда-функции выдает ошибку: невозможно определить длину [object PDFDocument]

Я использую pdfkit в функции lamda, которая создает PDF, а затем должна загрузить PDF в корзину S3. Но когда я тестирую функцию, я получаю сообщение об ошибке: не удается определить длину [объекта 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?

2 ответа

Вот мое решение:

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 file 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") используется для фактической проверки завершения записи файла.

если вы хотите, чтобы pdf был доступен для пользователей, не забудьте добавить следующий атрибут. также при использовании s3client для цифрового океана это сработало для меня.

Другие вопросы по тегам