基于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)