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

Mah*_*zat 10 memorystream pdfkit node.js

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

var fsStream = fs.createWriteStream(outputPath + fileName); 
doc.pipe(fsStream);
Run Code Online (Sandbox Code Playgroud)

提前致谢.

小智 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')
Run Code Online (Sandbox Code Playgroud)

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


jos*_*736 4

无需使用中间内存流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);
Run Code Online (Sandbox Code Playgroud)

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