CentOS7, CentOS8下部署使用Puppeteer Html转PDF

2021 年 7 月 7 日 0 条评论 5.93k 次阅读 0 人点赞

基于Puppeteer@10.1.0 + CentOS8.2

 

最近有个项目需要将网页转成pdf,刚开始试了html2canvas + jsPdf 的方案,这种方案是先将网页转成图片,然后再将图片塞到Pdf里。这种方式存在的问题是图片清晰度不是很高,网页不能过长,否则后续的页面有可能渲染数据会丢失。

也想过直接调用浏览器的打印网页,但是由于我们的设计页面是双倍A4的分辨率,打印的时候需要手动调整缩放,又由于这个A4纸的长宽比不是整数,而浏览器的打印缩放比例又只能设置是整数,所以就导致在分页的时候,总会有一点点错位,这种错位在页数比较多的时候,更加明显。

随后想起了puppeteer,这是google推出的一个Node库,提供了一些高级API可以通过devtools协议来控制Chromium,这个库使用起来真的是非常方便。先在个人macOS上安装调试的,生成的Pdf很方便,满足实际需求。整个安装过程也很简单,本机有nodejs环境的话,直接通过 npm i puppeteer 即可安装使用,基本不会有什么其他问题。
随后准备将该功能部署到服务端使用,建议在最低Centos7及上安装,Centos6上就不要折腾了,依赖环境库总有问题,至今无解

Centos安装 puppeteer之前,先安装下类库,不然运行肯定要报错
官方给出了各个包的安装方式

yum install libnss3.so pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

 

然后安装 puppeteer,如果服务器使用的是root用户,则需要加上  --unsafe-perm=true --allow-root 参数

npm install puppeteer --unsafe-perm=true --allow-root

另外需注意,如果使用root用户调用puppeteer,则需要在 launch 中增加参数:--no-sandbox 才能正常运行。

使用方法 NodeJS脚本:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: true,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
        ]
    });
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com', { waitUntil: 'networkidle2' });
    await page.pdf({
        path: 'content.pdf',
        format: 'A4',
        //width: '1190px',
        //height: '1684px',
        printBackground: true,
    });

    await browser.close();
})()

 

chromium的安装路径在项目路径下 ~/node_modules/puppeteer/.local-chromium/linux-884014/chrome-linux
如果你上面的代码执行报错的话,可能就还是缺少类库,你可以到chromium的安装路径下执行:ldd chrome | grep not  判断还缺少哪些类库,如果都不缺的话,则没有任何返回

[root@staging pptr-pdf]# cd node_modules/puppeteer/.local-chromium/linux-884014/chrome-linux/
[root@staging chrome-linux]#  ldd chrome | grep not
./chrome: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./chrome)
./chrome: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by ./chrome)
        libXss.so.1 => not found
        libatk-bridge-2.0.so.0 => not found
        libatspi.so.0 => not found
        libgtk-3.so.0 => not found
        libgdk-3.so.0 => not found
[root@staging chrome-linux]# 

比如上面就缺少了好几个类库,例如缺少 libXss.so.1   就执行命令:yum install libXss
类库安装完成后,重新执行上面的node脚本就可以了。

创建Pdf的时候,遇到中文字体的问题,这个时候把需要的字体传到服务器上即可。
将需要的字体传到服务器上的字体目录下
/usr/share/fonts

然后执行命令刷新字体

# 刷新字体缓存
fc-cache -f

# 查看已经安装的字体
fc-list

 

雷雷

这个人太懒什么东西都没留下

文章评论(0)

(Spamcheck Enabled)