Node express HTML到PDF

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,

我正在寻找一个pdf版本的网页直接呈现到浏览器使用快速。类似于express.render()的内容仅将页面呈现为pdf格式

我发现了一个模块,可以将HTML或URL转换为pdf

我需要知道的是,如何在HTTP路由处理程序中直接使用来自该库的响应来使用PDF响应请求,我不希望存储PDF,我只想动态渲染它,并将其作为缓冲区或流返回到浏览器

这是模块提供的基本API:

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谢谢,有时直接在答案框中编写代码会导致一些错误>。