Node express HTML到PDF
我正在寻找一个pdf版本的网页直接呈现到浏览器使用快速。类似于express.render()的内容仅将页面呈现为pdf格式 我发现了一个模块,可以将HTML或URL转换为pdf 我需要知道的是,如何在HTTP路由处理程序中直接使用来自该库的响应来使用PDF响应请求,我不希望存储PDF,我只想动态渲染它,并将其作为缓冲区或流返回到浏览器 这是模块提供的基本API:Node express HTML到PDF,html,node.js,express,pdf,Html,Node.js,Express,Pdf,我正在寻找一个pdf版本的网页直接呈现到浏览器使用快速。类似于express.render()的内容仅将页面呈现为pdf格式 我发现了一个模块,可以将HTML或URL转换为pdf 我需要知道的是,如何在HTTP路由处理程序中直接使用来自该库的响应来使用PDF响应请求,我不希望存储PDF,我只想动态渲染它,并将其作为缓冲区或流返回到浏览器 这是模块提供的基本API: var pdf = require('html-pdf'); pdf.create(html).toFile([filepath,
var pdf = require('html-pdf');
pdf.create(html).toFile([filepath, ]function(err, res){
console.log(res.filename);
});
pdf.create(html).toStream(function(err, stream){
stream.pipe(fs.createWriteStream('./foo.pdf'));
});
pdf.create(html).toBuffer(function(err, buffer){
console.log('This is a buffer:', Buffer.isBuffer(buffer));
});
我想使用以下方法之一流或缓冲区,并将其包装到如下路由处理程序中:
router.get('invoice/pdf', function(req, res) {
res.status(200).send(..pdf data);
});
在节点中,仅使用流就很容易做到这一点。在
缓冲区上使用流的主要原因是流不需要像缓冲区那样将其所有数据保留在内存中。相反,它可以根据需要向读写器提供数据。这意味着它是轻量级的,并且在延迟和吞吐量方面会有更好的性能
在您的例子中,您只需要将流的内容直接传输到res
对象
router.get('/invoice/pdf', (req, res) => {
pdf.create(html).toStream((err, pdfStream) => {
if (err) {
// handle error and return a error response code
console.log(err)
return res.sendStatus(500)
} else {
// send a status code of 200 OK
res.statusCode = 200
// once we are done reading end the response
pdfStream.on('end', () => {
// done reading
return res.end()
})
// pipe the contents of the PDF directly to the response
pdfStream.pipe(res)
}
})
})
这正是为什么我问我想知道最好的方法,这正是你所指定的。谢谢我是否需要指定响应为pdf res.setHeader('Content-type','application/pdf');Express应该自动检测文件扩展名,因此不需要,但是,如果愿意,您可以显式设置它。如果Express检测到您已经通过res.setHeader()
为响应对象的标题提供了内容类型
标题,则它将跳过为该标题分配值的过程。您可能想要更正的代码中的轻微键入错误在stream.on和stream.pipe上都被称为stream;-)@MartinWebb谢谢,有时直接在答案框中编写代码会导致一些错误>。