likes
comments
collection
share

记录一下puppeteer的使用(生成PDF)将 html 转成 PDF 的方式有很多种,对于前端开发来说常用的是使用

作者站长头像
站长
· 阅读数 38

将 html 转成 PDF 的方式有很多种,对于前端开发来说常用的是使用 html2canvas + jspdf,原理是先将 html 页面转化成 canvas 图片,再通过 jspdf 转成 pdf 图片,这种方式有很多的不足主要有以下几点:

  • 清晰度低:由于是将 HTML 内容转换为图像,图像质量和文字清晰度可能不如直接生成的 PDF
  • 性能差:对于较大的页面生成和渲染时间可能会较慢
  • 安全性低:对于此种方式只能在客户端进行转化,客户端环境多样经常会有广告注入导致生成的 pdf 带有广告

当需要避开以上几个缺点时就需要考虑是否有其他的方式,本文就来介绍下使用 nodejs+puppeteer 来生成 PDF 的方式

实现

对于 puppeteer 铺怕特使用 HTML 生成 PDF 文件主要有两种方式,一种是通过浏览器打开网站地址,另一种是传输 html 字符串,下面介绍下两种方式的实现

  • 通过设置 HTML 字符串来生成 PDF 文件,主要流程如下:

    • browser.newPage()打开空白页面
    • page.setContent 设置页面内容
    • 设置生产 PDF 文件的路径
    • page.pdf 生成 pdf 文件
  • 通过在服务打开浏览器进入需要转换的页面来生成,主要流程如下:

    • browser.newPage()打开空白页面
    • page.goto 进入需要生成 pdf 的网站
    • 设置生产 PDF 文件的路径
    • page.pdf 生成 pdf 文件
const puppeteer = require("puppeteer");
const fs = require('fs');

//生成PDF文件
const generatPDFFile = async (page, str) => {
  const path = `${Date.now()}.pdf`;
  if(str){
    console.log('--------- page set content --------');
    await page.setContent(str,{ waitUntil: 'networkidle0'});
  }
  await page.pdf({ path, format: "A4" });
};

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: ["--no-sandbox"],
  });
  const page = await browser.newPage();
  //通过HTML字符串生成
  const htmlStr = fs.readFileSync('./demo.html').toString();
  await generatPDFFile(page,htmlStr);

  //通过页面生成
  await page.goto("https://www.baidu.com");
  await generatPDFFile(page);

  await browser.close();
})();

总结

对于功能的实现往往都有多种方式,每种方式都有各自的优缺点,使用哪种方式取决于该功能服务的对象。在实际业务中选择用puppeteer来生成PDF一般是因为用户对于网页内容的准确性要求非常,由于客户端的网络环境和设备的多样性和复杂性,相应的对客户端生成pdf的准确性也是无法保证。因此使用服务端nodejs+puppeteer生成PDF是我们最优的选择。

转载自:https://juejin.cn/post/7381407777599143988
评论
请登录