Node js 加速 puppeteer html 到 pdf

问题描述 投票:0回答:2

我有一个 Node js 应用程序,它创建我希望用户下载的动态内容。

static async downloadPDF(res, html, filename) {
    const puppeteer = require('puppeteer');
    
    const browser = await puppeteer.launch({
        headless: true
    });
    
    const page = await browser.newPage()
    
    await page.setContent(html, {
        waitUntil: 'domcontentloaded'
    })
    
    const pdfBuffer = await page.pdf({
        format: 'A4'
    });
    
    res.set("Content-Disposition", "attachment;filename=" + filename + ".pdf");
    res.setHeader("Content-Type", "application/pdf");
    res.send(pdfBuffer);
    
    await browser.close()
}

创建一个大小约为 100kb 的 pdf 文件大约需要 10 秒,有没有办法加快整个过程? 我在某处读到,我可以启动无头浏览器一次,然后我只会创建一个新页面,而不是每次请求文件时启动浏览器。 我找不到正确的方法。

html node.js pdf-generation puppeteer
2个回答
2
投票

您可以将

page
创建移动到实用程序并将其提升以重新使用它。

const puppeteer = require('puppeteer');

let page;

const getPage = async () => {
  if (page) return page;

  const browser = await puppeteer.launch({
    headless: true,
  });

  page = await browser.newPage();

  return page;
};

.

const getPage = require('./getPage');

static async downloadPDF(res, html, filename) {
    const page = await getPage()
}

1
投票

是的,没有理由每次都启动浏览器。您可以设置 Puppeteer 来调用新的 url 并获取内容。不用每次都启动,会更快。

如何实施?将您的功能分为三个步骤:

  1. 创建一个浏览器实例。不管无头与否。如果您在 X 环境中运行应用程序,您可以启动一个窗口,看看您的 Puppeteer 做了什么。

  2. 创建一个功能代码,它将循环执行主要任务。

  3. 块完成后,调用

    await page.goto(url)
    (其中“page”是
    browser.newPage()
    的实例)并再次运行您的函数。

这是函数式代码的一种可能的解决方案:

  1. 创建实例:
const browser = await puppeteer.launch( {'headless' : false });
const page = await browser.newPage();
page.setViewport({'width' : 1280, 'height' : 1024 });

我已将其放入实时异步函数中,例如

(async ()=>{})();

  1. 获取数据:

就我而言,Mongo DB 中有一组 URL。拿到它们后,我跑了一个周期:

for( const entrie of entries)
{
  const url  = entrie[1];
  const  id = entrie[0];
  
  await get_aplicants_data(page,url,id,collection);
}
  1. get_aplicants_data()
    中,我根据加载的页面实现了一个逻辑:
await page.goto(url);  // Going to url 
//.... code to process page data

您也可以循环加载 URL,然后放入您的逻辑。

希望能给你一些帮助。

© www.soinside.com 2019 - 2024. All rights reserved.