使用pdfkit生成PDF文件并在Node.js-Express.js中将其发送到浏览器

22

我正在使用pdfkit生成pdf文件,希望将其发送到浏览器。

但是我遇到了消息"TypeError: listener must be a function", 而且文件生成在我不想要的父目录中。

有人能告诉我如何生成pdf文件并将其发送到浏览器而不存储在父目录中吗?
我在这里使用expressjs。

我的代码

var PDFDocument = require('pdfkit');                      
var fs=require('fs');
doc = new PDFDocument();
doc.moveTo(300, 75)
   .lineTo(373, 301)
   .lineTo(181, 161)
   .lineTo(419, 161)
   .lineTo(227, 301)
   .fill('red', 'even-odd');  

var loremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in...';  

doc.y = 320;
doc.fillColor('black')
doc.text(loremIpsum, {
   paragraphGap: 10,
   indent: 20,
   align: 'justify',
   columns: 2
});  

doc.write('out.pdf');
res.download('out.pdf');

我发布了一个新问题,需要您的建议。http://stackoverflow.com/questions/36802587/pdfkit-not-able-to-open-the-pdf-generated - Abhishek Kumar
2个回答

23

doc.write是引起问题的代码行,它也是一个弃用的方法,因此不要使用它。相反,使用管道告诉您的文档在哪里流传信息,并记得使用doc.end()关闭它,就像这样:

doc = new PDFDocument();
doc.pipe( fs.createWriteStream('out.pdf') );

// rest of the code goes here...

doc.end();

请注意,doc.pipe()不一定要放在顶部,只是对我来说更有意义(您可以将其放在doc.end()之前或之后)。这并不重要,它仍然可以正常工作。最后,请注意,您可以使用pipe直接流式传输到响应,无需先创建文件,然后再下载它,即:

doc.pipe( res )

1
仍然在本地目录中生成文件,我想将此文件作为下载发送到浏览器。 - Sachin
2
现在我收到了错误信息uncaughtException: path必须是一个字符串。 - Sachin
我已经发布了我的新问题https://dev59.com/SmAg5IYBdhLWcg3waKV2 - Sachin
19
将原来的代码中的 fs.createWriteStream(res) 替换为 res 即可,修改后的代码为 doc.pipe(res) - Artur Czyżewski
我必须设置头文件才能使其运行。就像这个例子中所示:https://dev59.com/cX7aa4cB1Zd3GeqPp2pi - davidinteract
显示剩余4条评论

5

所以,尝试使用

doc.pipe(res);


我在Node上创建了一个服务,将数据作为参数传递,并将我的数据管道化到响应中。我使用doc.pipe(res)实现了这一点。在我的React端,我使用axios调用并将响应吸收到arraybuffer中,然后将其写入blob。 - Rahil Lakhani
不要忘记使用 doc.end() 结束流。 - vs4vijay
嗨,我陷入了类似的困境,不同之处在于我的代码将在AWS API网关中执行。我已经在此链接中编写了描述,如果有人能够查看并提供帮助,那将是非常有帮助的。https://stackoverflow.com/questions/57256887/invalid-pdf-structure-error-message-with-nodejs-pdfkit - NinjaDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接