【问题标题】:Upload pdfmake buffer to s3将pdfmake缓冲区上传到s3
【发布时间】:2019-02-21 19:02:40
【问题描述】:

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

      })
    })

当我在 notepad++ 中打开在 s3 中创建的文件时,它“看起来”像一个正确的 pdf。 IE。它以

开头

%PDF-1.3

并且有很多特殊字符。

如果我将文档定义复制到 pdfmake playground 并保存 pdf,然后再次在 notepad++ 中查看,它看起来与我在 s3 中保存的类似,可读文本相同,但特殊字符块不同

【问题讨论】:

  • 嗨。您可以尝试使用另一个通用文件来查看 pdfMake 是否存在特定问题或您上传的方式是否有问题?

标签: node.js pdf amazon-s3 pdfmake


【解决方案1】:

使用缓冲区,然后将相同的缓冲区作为参数传递给 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();

【讨论】:

  • 您好,请发布您的问题或您在使用此代码时遇到的问题,否则我们将不知道如何为您提供帮助。查看此链接以获取有关如何提出好问题的信息:stackoverflow.com/help/how-to-ask
【解决方案2】:

如果您的缓冲区很大,您不能直接将其推送到 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(); }

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2021-02-04
    • 2014-10-26
    • 2023-01-24
    • 1970-01-01
    • 2022-01-27
    • 2020-10-18
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多