首页 > 解决方案 > 如何在 Express.js 中读取和生成 pdf?

问题描述

我在 Express.js 中有一个代码段,如下所示:

var pdf = printer.createPdfKitDocument(docDefinition);
pdf.pipe(fs.createWriteStream(filePath));
pdf.end();

// Send the pdf to the client.
var file = fs.createReadStream(filePath);
var stat = fs.statSync(filePath);
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);
file.pipe(res);

我可以看到该文件实际上是在服务器中创建的,但是当我准备好它时createReadStream,我得到它的大小为 0。所以有些东西被破坏了。知道问题可能是什么以及如何解决吗?

标签: node.jsexpress

解决方案


该文件没有损坏,您将代码视为同步的,但是是异步的。

您必须等到文件完全写入,然后才能读取它。无论如何,您无需将其写入文件即可发送内容,如果您不需要将文件保存在磁盘上,则可以将其通过管道传输到res.

res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);

const pdf = printer.createPdfKitDocument(docDefinition);
pdf.pipe(res);

如果您希望将其保存到文件中,然后读取它,您可以执行以下操作:

const write = fs.createWriteStream('./basics.pdf');
pdfDoc.pipe(write);

write.on('finish', () => {
   fs.createReadStream('./basics.pdf')
      .pipe(res); // 
});

pdfDoc.end();

推荐阅读