HTML和puppeteer转换为pdf

时间:2019-03-21 06:39:55

标签: html node.js express pdf puppeteer

我是nodejs,express和puppeteer的新手。任务是创建将html转换为pdf的网络服务器。经过研究,我发现了puppeteer和phantomsjs用于此目的(但是phantomjs不再受支持)。 我创建了一个简单的Web服务器,该服务器使用html和其他设置来处理json。但是phantomjs比puppeteer更快,也许我有一些错误?

操纵者代码:
路线:

router.post("/raw", jsonParser, async function(request, response) {
        html2PdfConverter(request.body.html, pdf => {
        response.setHeader('Content-Type', 'application/pdf');
        response.send(pdf);
      }, 
        request.body.options,
        request.body.puppeteerArgs, 
        request.body.remoteContent).catch(err => {
        console.log(err);
        response.status(500).send('An error occurred');
      });
    });

Html2PdfConverter

const puppeteer = require('puppeteer');

let convertHTMLToPDF = async (html, callback, options = null, puppeteerArgs=null, remoteContent=true) => {
    if (typeof html !== 'string') {
        throw new Error(
            'Invalid Argument: HTML expected as type of string and received a value of a different type. Check your request body and request headers.'
        );
    }
    let browser;
    if (puppeteerArgs) {
        browser = await puppeteer.launch(puppeteerArgs);
    } else {
        browser = await puppeteer.launch();
    }

    const page = await browser.newPage();
    if (!options) {
        options = { format: 'Letter' };
    }

    if (remoteContent === true) {
        await page.goto(`data:text/html,${html}`, {
            waitUntil: 'networkidle0'
        });
    } else {
        await page.setContent(html);
    }

    await page.pdf(options).then(callback, function(error) {
        console.log(error);
    });
    await browser.close();
};

module.exports = convertHTMLToPDF;

我认为phantomjs的工作速度更快,因为pdf方法返回流,并且在Temp文件夹中创建html和pdf文件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是目前不使用phantomjs的两个主要原因,

  • phantomjs已过时,在您需要时不提供支持
  • 它使用的是旧的渲染器,这就是为什么它速度快的原因,因为它与您的内容没有太多关系。

如果您希望puppeteer更快,可以肯定地禁用puppeteer提供的许多最新功能,但是pdf看起来可能不干净,就像启用了所有功能一样。