Загрузка 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 был доступен для пользователей, не забудьте добавить следующий атрибут