首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Express.js中读取和生成pdf?

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

Stack Overflow用户
提问于 2018-06-10 05:53:47
回答 1查看 160关注 0票数 2

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

代码语言:javascript
复制
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。所以有些东西被破坏了。你知道问题可能是什么以及如何解决它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 05:58:18

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

您必须等待文件完全写入,然后才能读取它。无论如何,您不需要将其写入文件来发送内容,如果您不需要文件在磁盘上持久化,您可以直接通过管道将其传输到res

代码语言:javascript
复制
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);

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

如果要将其保存到文件中,然后进行读取,则可以执行以下操作:

代码语言:javascript
复制
const write = fs.createWriteStream('./basics.pdf');
pdfDoc.pipe(write);

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

pdfDoc.end();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50778855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档