我正在尝试使用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,但我不认为这是问题所在。
答案 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/。这应该会在浏览器中触发下载。