节点js,将pdfkit传送到内存流

时间:2016-02-26 17:48:56

标签: node.js memorystream pdfkit

我在节点服务器上使用pdfkit(https://github.com/devongovett/pdfkit),通常创建pdf文件,然后将它们上传到s3。 问题是pdfkit示例将pdf文档管道传输到节点写入流,该文件将文件写入磁盘,我按照示例操作并正常工作,但我现在的要求是将pdf文档管道传输到内存流而不是保存它在磁盘上(我还是上传到s3)。 我已经遵循了一些节点内存流程序,但它们似乎都没有与我一起使用pdf管道,我只能将字符串写入内存流。 所以我的问题是:如何将pdf工具包输出传输到内存流(或类似的东西),然后将其作为上传到s3的对象读取?

var fsStream = fs.createWriteStream(outputPath + fileName); 
doc.pipe(fsStream);

提前致谢。

5 个答案:

答案 0 :(得分:6)

2020年的最新答案。由于“ PDFDocument实例 是可读的节点流 ”,因此无需引入新的内存流。

您可以使用get-stream包来简化将文件传递回调用者之前等待文档完成的过程。 https://www.npmjs.com/package/get-stream

const PDFDocument = require('pdfkit')
const getStream = require('get-stream')

const pdf = () => {
  const doc = new PDFDocument()
  doc.text('Hello, World!')
  doc.end()
  return await getStream.buffer(doc)
}


// Caller could do this:
const pdfBuffer = await pdf()
const pdfBase64string = pdfBuffer.toString('base64')

如果您的需求不同,则不必返回缓冲区。 get-stream自述文件提供了其他示例。

答案 1 :(得分:3)

不需要使用中间内存流 1 - 只需将pdfkit输出流直接传输到HTTP上传流中。

根据我的经验,在处理流时,AWS SDK是垃圾,因此我通常使用request

var upload = request({
    method: 'PUT',
    url: 'https://bucket.s3.amazonaws.com/doc.pdf',
    aws: { bucket: 'bucket', key: ..., secret: ... }
});

doc.pipe(upload);

1 - 事实上,通常不希望使用内存流,因为这意味着缓存RAM中的整个内容,这正是流应该避免的内容!

答案 2 :(得分:0)

您可以尝试这样的操作,并将其上传到end事件中的S3。

var doc = new pdfkit();

var MemoryStream = require('memorystream');
var memStream = new MemoryStream(null, {
   readable : false
});

doc.pipe(memStream);

doc.on('end', function () {
   var buffer = Buffer.concat(memStream.queue);
   awsservice.putS3Object(buffer, fileName, fileType, folder).then(function () { }, reject);
})

答案 3 :(得分:0)

我尝试使用pdfmake而不是pdfkit来调整@bolav的答案。首先,您需要使用memorystreamnpmyarn添加到项目中。

const MemoryStream = require('memorystream');
const PdfPrinter = require('pdfmake');
const pdfPrinter = new PdfPrinter();
const docDef = {};
const pdfDoc = pdfPrinter.createPdfKitDocument(docDef);
const memStream = new MemoryStream(null, {readable: false});
const pdfDocStream = pdfDoc.pipe(memStream);
pdfDoc.end();
pdfDocStream.on('finish', () => {
  console.log(Buffer.concat(memStream.queue);
});

答案 4 :(得分:0)

我的代码为pdfkit返回base64:

import * as PDFDocument from 'pdfkit'
import getStream from 'get-stream'

const pdf = {
  createPdf: async (text: string) => {
    const doc = new PDFDocument()
    doc.fontSize(10).text(text, 50, 50)
    doc.end()

    const data = await getStream.buffer(doc)
    let b64 = Buffer.from(data).toString('base64')
    return b64
  }
}

export default pdf