将pdfmake缓冲区上传到s3

时间:2018-09-17 19:52:03

标签: node.js pdf amazon-s3 pdfmake

如何将在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>

2 个答案:

答案 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();