【问题标题】:Node js speed up puppeteer html to pdfNode js 加速 puppeteer html 到 pdf
【发布时间】:2021-06-19 05:23:33
【问题描述】:

我有一个 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


    【解决方案1】:

    您可以将 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()
    }
    

    【讨论】:

      【解决方案2】:

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

      如何实现这个?将您的功能简化为三个步骤:

      1. 创建一个浏览器实例。不管有没有无头。如果你在 X 环境下运行 app,你可以启动一个窗口,看看你的 puppetter 做了什么

      2. 创建一个函数代码,循环执行主要任务。

      3. 块完成后,调用await page.goto(url)(其中“page”是browser.newPage()的实例)并再次运行您的函数。

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

      1. 创建实例:

        const browser = await puppeteer.launch( {'headless' : false }); 常量页面 = 等待 browser.newPage(); page.setViewport({'width' : 1280, 'height' : 1024 });

      我把它放在像(async ()=>{})();这样的实时异步函数中

      1. 获取数据

      我的情况,一组url在mongo db中,得到它后,我跑了一个循环:

      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() 中,我根据加载的页面实现了一个逻辑:

        等待 page.goto(url); // 跳转到网址

      .... 处理页面数据的代码

      你也可以循环加载url,然后放入你的逻辑

      希望能给你一些帮助)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-14
        • 2018-08-29
        • 2020-01-01
        • 2021-08-26
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多