Node.js将Html生成PDF - 仅支持18+

封装工具   2024-08-13 12:45   104   0  
const puppeteer = require('puppeteer');

async function generatePdf(url, filePath) {
    // 启动无头浏览器
    const browser = await puppeteer.launch({
        headless: true, // 设置为 false 以在调试时看到浏览器窗口
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--enable-accelerated-2d-canvas',
            '--enable-aggressive-domstorage-flushing'
        ],
        ignoreHTTPSErrors: true,
        timeout: 60000,
    });
    const page = await browser.newPage();

    // 设置视口大小
    await page.setViewport({
        width: 800,
        height: 1130,
        deviceScaleFactor: 1,
    });

    // 导航到指定的 URL
    await page.goto(url, { waitUntil: 'networkidle0' });

    // 等待特定元素加载完成(如果需要的话)
    // await page.waitForSelector('.mod-article-content');

    // 导出 PDF 的格式
    const options = {
        // 纸张尺寸
        width: '800px',
        height: '1130px',
        // 打印背景,默认为 false
        printBackground: true,
        // 不展示页眉
        displayHeaderFooter: true,
        // 页眉与页脚样式,可在此处展示页码等
        headerTemplate: '<div style="text-align: center;">Header</div>',
        footerTemplate: '<div style="text-align: center;">Page <span class="pageNumber"></span></div>',
        path: filePath // 指定生成的 PDF 文件存放路径
    };

    // 生成 PDF
    await page.pdf(options);

    // 关闭页面
    await page.close();

    // 关闭 Chromium
    await browser.close();
}

// 调用函数
generatePdf('https://www.baidu.com/', 'baidu.pdf')
    .then(() => console.log('PDF generated successfully.'))
    .catch(error => console.error('Failed to generate PDF:', error));
  1. 下载 puppeteer  - 执行 npm i puppeteer

  2. 执行 npx puppeteer browsers install chrome

  3. 将上述代码放置项目中 配置完成调用。