如何在节点环境中使用Puppeteer创建PDF而不将其写入磁盘

时间:2018-06-01 22:15:14

标签: javascript node.js express puppeteer

背景

我正在使用node.js表达应用程序,我们需要生成PDF。目前我们正在使用谷歌的Puppeteer,这使得这很简单。在文档中,它显示的方式是通过将路径传递给对象,该对象告诉Puppeteer在哪里编写PDF。

问题

我不想将此PDF文件写入磁盘。这里的目标是让客户端达到生成PDF并返回给客户端的终点。创建一个文件2秒会增加一点点状态,这使我必须处理更多的麻烦才能部署到生产环境。

示例

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(
      'https://example.com/',
    );
    await page.pdf({
      path: filePath,
      format: 'A4',
      margin: {
        top: '20px',
        left: '20px',
        right: '20px',
        bottom: '20px',
      },
    });
    await browser.close();

问题

在这个代码示例中,我创建了一个PDF并将其存储到磁盘。如何创建此PDF但不是将其写入磁盘,而是立即将其返回给客户端?

1 个答案:

答案 0 :(得分:8)

奇怪我也有同样的要求。

问题本身相对简单。您需要做的就是删除path属性并等待page.pdf完成其任务,它将返回一个bytearray,只需将其作为响应发送。

您可以找到page.pdf(options)的文档:

  
      
  • path< string>保存PDF的文件路径。如果path是相对路径,则相对于当前工作目录解析它。如果未提供路径,则不会将PDF保存到磁盘。
  •   
  • 返回:< Promise< Buffer>>使用PDF缓冲区解析的承诺。
  •   
async generatePdf(url) {
   await page.goto(url, {waitUntil: 10000});
   const buffer = await page.pdf({
      format: 'A4'
   });
   return buffer;
}