如何在Express.js中阅读和生成pdf?

时间:2018-06-09 21:53:47

标签: node.js express

我在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.所以有些东西被破坏了。知道问题可能是什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

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

您必须等到文件完全写入,然后才能阅读。无论如何,您不需要将其写入文件来发送内容,如果您不需要将文件保留在磁盘上,您只需将其传送到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();