使用Node.js提示下载PDF

时间:2015-12-08 12:47:17

标签: node.js

我正在尝试使用Node.js提示下载在服务器上生成的PDF。目前我可以将其保存到服务器但不强制下载。

我正在使用npm html-pdf,目前正在使用此代码保存到服务器。

  pdf.create(htmlbody).toStream(function(err, stream){
    console.log(stream);

    if (err) return next(err);

    stream.pipe(fs.createWriteStream('./foo.pdf'));

    res.status(200);
    res.send('Success');
  });

如何强行下载?

我尝试设置标题

res.setHeader('content-type', 'application/pdf');
res.setHeader("Content-Disposition", "attachment; filename="+pdfName+";");

我正在测试localhost,但我不认为这是问题所在。

1 个答案:

答案 0 :(得分:1)

您不必将其保存到服务器(除非这是业务逻辑要求)。你能做的就是这样:

pdf.create(htmlbody).toStream(function(err, stream){

  if (err) return next(err);

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

  stream.pipe(res);
});

基本上,您需要做的就是设置相应的标头,然后将stream的{​​{1}}管道传输到html-pdf流。

如果您需要先将PDF保存在服务器上,那么您必须将其写入文件系统,一旦完成,请将其读回并再次通过响应流发送

修改:这是带有完整工作示例的代码段(在Node v4.0.0上运行)。

res

将上述内容保存为var http = require('http'); var pdf = require('html-pdf'); const PORT = 8765; var server = http.createServer((req, res) => { var html = '<html><head><title>PDF Test</title></head><body><h1>Welcome</h1><p>This is a test to see if we can get <b>PDF generation</b> to work on the server side.</p><p>PDF files can be very tricky to do on the server so this will take a bit of <u>hit and trail</u> before we can be confident it works fine.</p></body></html>'; pdf.create(html).toStream((err, stream) => { if (err) { console.error(err); res.status(500); res.end(JSON.stringify(err)); return; } res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', 'attachment; filename=test-file.pdf;'); stream.pipe(res); }); }); server.listen(PORT, () => { console.log('Server listening on Port: %s', PORT); }); ,然后使用节点(pdf.js)运行并打开http://localhost:8765/。这应该会在浏览器中触发下载。