javascript - 如何在 Node 环境中使用 Puppeteer 创建 PDF 而无需将其写入磁盘

标签 javascript node.js express puppeteer

背景

我在需要生成 PDF 的 node.js Express 应用程序中工作。目前我们正在使用来自 Google 的 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,而不是将其写入磁盘,而是立即在响应中将其返回给客户端?

最佳答案

奇怪,我也有同样的需求。

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

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

  • path <string> The file path to save the PDF to. If path is a relative path, then it is resolved relative to current working directory. If no path is provided, the PDF won't be saved to the disk.
  • returns: <Promise<Buffer>> Promise which resolves with PDF buffer.
async generatePdf(url) {
   await page.goto(url, {waitUntil: 10000});
   const buffer = await page.pdf({
      format: 'A4'
   });
   return buffer;
}

关于javascript - 如何在 Node 环境中使用 Puppeteer 创建 PDF 而无需将其写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50651591/

相关文章:

javascript - 将数组传递给 app.get() 的第一个参数的替代方法是什么?

javascript - 如何在 fancybox 中水平放置我的图像列表

javascript - ng-mousedown 和 ng-mouseup 在手机中不起作用

javascript - 如何清除Azure Map的绘制形状

javascript - 如何将 Canvas 数据 uri 上传到 amazon s3 服务器

javascript - 在 Node js 中使用 rm 进行扩展通配

javascript - 如何使用文本 anchor : middle in fabric js

node.js - 在 sequelize 中加入同一张表并在 excel 中打印

javascript - 防止 Express.js 崩溃

node.js - 文件上传到数据库(后端)的问题