express.js – 创build一个新的pdf并强制下载,而不保存在服务器上

我正在使用pdfkit的express.js来生成pdf并强制下载给用户。 为此,我使用了属于express.js的res.download函数。 我也可以通过pipe将PDF文件解压缩到res ,但是下载不会启动。

好的,那么我的问题是:是否有可能以某种方式在服务器上创buildPDF并将其存储在“内存”或类似的东西? 目前我必须定义一个pdf的创build地点,然后从这个位置读取并提供给用户。 基本上,我想“跳过”保存到磁盘和从磁盘读取,但仍然强制下载的用户。

也许我不是在这里理解一些概念,所以任何forms的解释都非常感谢!

代码如下:

 router.get('/pdf/:id', function(req, res) { Order._getById(req.params.id). then(function(order) { if (order !== null) { var doc = new PDFDocument(); var result = order.toJSON(); var products = result.products; var user = result.user; var comments = result.comments; doc.registerFont('arial', path.join(__dirname, '../fonts', 'arial' , 'arial.ttf')); for (var i in products) { var product = products[i]; doc.font('arial').text(product.name); doc.image(path.join(__dirname,'../uploads','thumb', product.picture), {scale: 1.0}); doc.font('arial').text(product.price + ' €'); } var r = doc.pipe(fs.createWriteStream(path.join(__dirname, '../uploads', 'out.pdf'))); doc.end(); r.on('finish', function(){ //the response is a "forced" download of a file I had to save on the disk res.download(path.join(__dirname, '../uploads', 'out.pdf')); }); } else { res.json(false); } }); }); 

再次,如果我不保存文件,只是这样做: doc.pipe(res); pdf是在新标签中打开的,而不是强制下载。

我认为这是答案…我可以将结果传递给客户端,但标题需要设置,即:

  res.writeHead(200, { 'Content-Type': 'application/pdf', 'Access-Control-Allow-Origin': '*', 'Content-Disposition': 'attachment; filename=out.pdf' });