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



Background

我正在一个节点.js快速应用程序中工作,我们需要生成PDF。 目前我们正在使用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,但不将其写入磁盘,而是立即在响应中将其返回给客户端?

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

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

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

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

最新更新