node.js使用puppeteer来html生成pdf

本文介绍了如何在Windows 10环境下使用Node.js的Puppeteer库将HTML转换为PDF,包括目录结构、nvm管理Node.js多版本以及Linux下配置Puppeteer的常见问题。此外,还提到了wkhtmltopdf工具结合PHP的PDF生成方案。
摘要由CSDN通过智能技术生成

一,环境:

操作系统:windows10  macOS12 centos7
node版本:v16.14.0  (最低12)
npm:6.14.10
puppeteer : ^13.0.1
puppeteer : https://github.com/puppeteer/puppeteer
puppeteer文档:http://www.puppeteerjs.com/
nvm管理切换多个node.js  http://nvm.uihtm.com/  

背景:
1, wkhtmltopdf  的截图对于页面中图片过多的场景 不友好,容生成失败,
2,不想使用上述的技术,推荐 微软的 edge 浏览器插件 fireshot (PRO版本是10天试用期)

3, wkhtmltopdf 参考: wkhtmltopdf  + php
4, 参考: https://www.cnblogs.com/jiangwz/p/9890472.html

二,目录结构

在这里插入图片描述

1, index.js
try {
   
    const puppeteer = require("puppeteer");

    (async () => {
   
        const timeout = 1000 * 60 * 10;
        const browser = await puppeteer.launch({
   
            timeout: timeout,
            args: ['--no-sandbox', '--disable-setuid-sandbox']
        });
        const page = await browser.newPage();

        // 参数配置 --site 站点(1-5) --url 页面链接 --path 保存位置
        const defParams = {
   
            path: "test.pdf",
            width: 1176,
            height: 868,
            left: 20,
            right: 20,
            printBackground: true,
            timeout: timeout,
            // format: "a3",
            // landscape: true,
            // preferCSSPageSize: true,
        };
        const siteParams = {
   
            1: {
   
                width: 1176,
                height: 868,
            },
            2: {
   
                width: 1176,
                height: 868,
            },
            3: {
   
                width: 1176,
                height: 868,
            },
            4: {
   
                width: 1176,
                height: 868,
            },
            5: {
   
                width: 1176,
                height: 868,
            },
        }

        // 参数归整
        const arguments = process.argv.splice(2);
        const nodeParams = {
   }; // --url 页面链接
        const params = {
   }; // 最终参数
        const reg = /^--/;
        for (let i = 0; i < arguments.length; i++) {
   
            if (reg.test(arguments[i]) && !reg.test(arguments[i + 1])) {
   
                nodeParams[arguments[i].substring(2)] = isNaN(arguments[i + 1]) ? arguments[i + 1] : Number(arguments[i + 1]);
            }
        }
        Object.assign(params, defParams, siteParams[nodeParams.site] || {
   }, nodeParams);
        // console.log(params)

        // 必传项 --url 页面链接 --path 保存位置/xxx/xxx.pdf
        if (!params.url) {
   
            console.log('Error:', '请传入页面链接 --url');
            process.exit(1);
        }
        if (!params.path) {
   
            console.log('Error:', '请传入保存位置 --path');
            process.exit(1);
        }

        // 执行
        await page.setDefaultNavigationTimeout(params.timeout);
        await page.setDefaultTimeout(params.timeout);
        await page.goto(params.url, {
    waitUntil: 'networkidle0' });
        // 解决头部绝对定位遮挡
        // await page.addStyleTag({
   
        //     content: '.report-pdf-hd{position: relative;margin-bottom: -40px;}.report-pdf-hd .head-top-static{position: relative;margin-bottom: -40px;}'
        // })
        await page.pdf({
   
            path: params.path,
            width: params.width,
            height: params.height,
            margin: {
   
                left: params.left,
                right: params.right,
            },
            printBackground: params.printBackground
        });
        await browser.close();
    })();
} catch (err) {
   
    console.log('Error:', err);
    process.exit(1);
}

2,package.json
{
   
    "name": "puppeteer",
    "version": "1.0.0",
    "description": "pdf生成工具",
    "main": "index.js",
    "scripts": {
   },
    "author": ""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值