当前位置: 首页 > 知识库问答 >
问题:

Node js加速puppeteer html到pdf

凌永逸
2023-03-14

我有一个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秒,有没有一种方法可以加快整个过程?我在某处读到,我可以启动无头浏览器一次,然后我将只创建一个新的页面,而不是每次我请求文件时都启动一个浏览器。我找不出做这件事的正确方法。

共有2个答案

陶英纵
2023-03-14

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

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

>

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

    创建一个函数代码,它将在循环中完成主要任务。

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

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

    >

  • 创建实例:

    const browser=await Puppeteer.Launch({“headless”:false});常量page=await Browser.newPage();Page.SetViewPort({“width”:1280,“height”:1024});

    我将它放在实时异步函数中,如(async()=>{})();

    在我的例子中,mongo db中有一组URL,在得到它之后,我运行了一个循环:

    for( const entrie of entries)
        {
           const url  = entrie[1];
           const  id = entrie[0];
    
           await get_aplicants_data(page,url,id,collection);
    
        }
    

    在get_aplicants_data()中,我根据加载的页面实现了一个逻辑:

    await page.goto(url);//转到url

    ....prcess页数据的代码

    您还可以循环加载url,然后放入您的逻辑

    (希望我给了你一些帮助)

  • 白驰
    2023-03-14

    您可以将page创建移动到一个util中,并将其提升以重用它。

    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()
    }
    
     类似资料:
    • 你可以通过执行npm run preview -- --report来分析webpack打包之后的结果,观察各个静态资源的大小。你可以发现占用空间最多的是第三方依赖。如vue、element-ui、 ECharts等。 你可以使用 CDN 外链的方式引入这些第三方库,这样能大大增加构建的速度(通过 CDN 引入的资源不会经 webpack 打包)。如果你的项目没有自己的CDN服务的话,使用一些第三

    • 加速计 jd.startAccelerometer(Object object) 开始监听加速度数据。 参数 Object object 属性 类型 默认值 必填 说明 interval string normal 否 监听加速度数据回调函数的执行频率 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 complete funct

    • 本文向大家介绍用Cython加速Python到“起飞”(推荐),包括了用Cython加速Python到“起飞”(推荐)的使用技巧和注意事项,需要的朋友参考一下 事先声明,标题没有把“Python”错打成“Cython”,因为要讲的就是名为“Cython”的东西。 Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优

    • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况相关,通常不适用于Internet的全球受众。要获得使该问题更广泛适用的帮助,请访问帮助中心。 8年前关闭。 PHP有一种非常快速的方法将值附加到数组: 在python中不需要索引号的最简单方法是什么?另外,有没有一种简单的方法可以使用嵌套在字典中的列表来执行此操作,例如此PHP等效项。 问题答案:

    • 在xlsx工作簿中,有些单元格具有一些无界的SUMIF公式,如下所示:。使用ApachePOI5.0.0对一个SUMIF函数的评估持续100ms,对给定工作簿的评估持续几分钟。 提高执行持续时间的一种方法是将公式绑定到如下内容:。在我的情况下,这不是一个解决方案,因为我不是xlsx文件的作者,系统从未知的人那里获取未知的xlsx文件(因此我不能仅仅告诉他们限制SUMIF范围)。 的当前实现迭代给定

    • Julia有一个非常好的特性,可以访问自己的语法树,这使得以编程方式生成新函数变得很容易,但它比普通的Julia代码慢得多。 例如: 有没有办法给提供与普通Julia代码相同的速度? @Ivarne建议我提供我的项目的细节。我想使用Julia的元编程功能来计算符号导数并运行它们。 我编写了一个函数,它接受and表达式和一个参数,并返回一个新表达式,该表达式是相对于的导数。不幸的是,结果需要太长时间