如何将在pdfmake中创建的pdf上传到s3?
当我使用以下代码将pdf上传到S3时,创建了一个文件,但是当我打开文件时,它是空白的pdf。我知道我的文档定义会创建适当的pdf,因为我可以将其输出到控制台并在pdfmake网站上进行验证。
pdfMake.createPdf(dd).getBuffer((buffer) => {
var s3 = new AWS.S3()
s3.putObject({
Bucket: s3UserFilesBucket,
Key: 'filename.pdf',
Body: buffer.toString('binary')
}, function (resp) {
})
})
当我在记事本++中打开在s3中创建的文件时,它“看起来”像是正确的pdf。即它以
开头%PDF-1.3
,并且有很多特殊字符。
如果我将文档定义复制到pdfmake游乐场并保存pdf,然后再次在notepad ++中查看,它看起来与我在s3中保存的相似,可读文本相同,但是特殊字符块不同< / p>
答案 0 :(得分:1)
如果你的缓冲区很大,你不能直接把它推送到 S3 存储桶,你需要使用 fs 写入文件并将其保存在 tmp 文件夹中,然后将该 tmp 文件夹推送到 S3
这会将您的 pdf 文档内容转换为缓冲区
getDoc(pdfDoc, cb) {
// buffer the output
var chunks = [];
pdfDoc.on("data", function (chunk) {
chunks.push(chunk);
});
pdfDoc.on("end", function () {
var result = Buffer.concat(chunks);
cb(null, result, pdfDoc._pdfMakePages);
});
pdfDoc.on("error", cb);
pdfDoc.end(); }
const fileName = `/tmp/${event.executionId}.pdf`;
async generatePdf(filename) : Promise<void> {
return new Promise((resolve, reject) => {
const printer = new pdfPrinter(FONTS);
const pdfDoc = printer.createPdfKitDocument(docDefinition);
this.getDoc(pdfDoc, function (err, buffer, pages) {
if (err) {
reject(err);
} else {
fs.writeFileSync(filename, Buffer.from(buffer));
resolve();
}
});
}); }
s3Key = `public/processed/pdfs/xyz.pdf`;
await generatePdf();
const fileBody = await promises.readFile(fileName);
const upload = await s3Service.uploadObject(BUCKET_NAME, fileBody, s3Key);
console.log(JSON.stringify(upload));
public async uploadObject(
bucketName: string,
fileBody: any,
key: string
): Promise<S3.CompleteMultipartUploadOutput> {
return this.s3
.upload({
Key: key,
Bucket: bucketName,
Body: fileBody,
})
.promise(); }
答案 1 :(得分:0)
使用缓冲区,然后将相同的缓冲区作为参数传递给AWS s3.putObject函数。以下代码会将正确的pdf文件内容(由pdfmake生成)上传到S3存储桶。
const pdfMake = printer.createPdfKitDocument(dd);
let chunks = [];
pdfMake.on("data", chunk => {
chunks.push(chunk);
});
pdfMake.on("end", () => {
const result = Buffer.concat(chunks);
var s3 = new AWS.S3();
s3.putObject(
{
Bucket: s3UserFilesBucket,
Key: "filename.pdf",
Body: result
},
function(resp) {}
);
});
pdfMake.end();