我在节点服务器上使用pdfkit(https://github.com/devongovett/pdfkit),通常创建pdf文件,然后将它们上传到s3。 问题是pdfkit示例将pdf文档管道传输到节点写入流,该文件将文件写入磁盘,我按照示例操作并正常工作,但我现在的要求是将pdf文档管道传输到内存流而不是保存它在磁盘上(我还是上传到s3)。 我已经遵循了一些节点内存流程序,但它们似乎都没有与我一起使用pdf管道,我只能将字符串写入内存流。 所以我的问题是:如何将pdf工具包输出传输到内存流(或类似的东西),然后将其作为上传到s3的对象读取?
var fsStream = fs.createWriteStream(outputPath + fileName);
doc.pipe(fsStream);
提前致谢。
答案 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的答案。首先,您需要使用memorystream
或npm
将yarn
添加到项目中。
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