# Node+Puppeteer+Chromium打印服务部署手册
# 背景
标准产品的CAP4报表等功能由于涉及很多后台算力,在进行报表打印时,均采用后端无头浏览器打印技术。
标准产品默认的后台打印使用PhantomJS技术,这种技术在信创环境支持较弱,同时随着PhantomJS不再维护,其功能在非信创环境下的兼容性也越来越差。
当项目上遇到无法使用默认的PhantomJS打印时,则需要考虑替代方案,目前市面推荐的是采用“Node+Puppeteer+Chromium”替代(后文均简称Puppeteer)。
Puppeteer: 是 Google Chrome 的 Headless 版本的一个工具,它提供了一个高级的 API 来控制 Chrome。与 PhantomJS 相比,Puppeteer 提供了更为强大的功能,并且是 Chrome 团队官方支持的项目。
哪些需要更换Puppeteer方案?
1、麒麟信创系统下,使用CAP4表单打印功能时(如报表打印、报表转发、CAP4表单转新闻公告空白或失败),提示“执行截图服务失败”。
2、客开使用htmltopdf接口,后台打印生成PDF进行归档操作失败,查看日志均体现在PhantomJS不可用。
3、移动端进行打印时,显示不全,上报BUG后研发建议更换为Puppeteer模式。
本文档提供详细安装部署步骤。
# 注意事项
要切换使用Puppeteer需要做两件事:
第一步:在OA服务器上部署Puppeteer相关组件,依次部署Node、Puppeteer和Chromium内核。
环境 | 部署方法 |
---|---|
麒麟ARM64环境 | 快速跳转 |
UOS系统 | 快速跳转 |
Linux系统X86环境 | 快速跳转 |
Windows系统X86环境 | 快速跳转 |
第二步:做代码适配
- V8.2SP1及更早版本,分销项目走技术服务支持申请流程,获取代码适配包
- V8.2SP1及更早版本,直销项目,由项目组客开人员通过致远Ctp-Studio申请“客开复用插件:Puppeteer信创打印适配”项目,参照项目源码适配到客户版本上即可
- V9.0及未来版本已经内置代码,无需申请,通过SeeyonConfig调整选择Puppeteer即可。
代码适配培训视频路径[客开知识大纲3.0/2024客开知识成果案例分享/第六期/Puppeteer打印模式代码适配.mp4],链接:https://pan.baidu.com/s/1xRY4yTJRu6D429ssCZRbOw 提取码:y7w0
# V9.0以上启用Puppeteer代码方法
V9.0版本已经支持开启新版打印服务,不需要单独适配代码,只需要部署环境。以下是V9.0版本开启新版打印服务的步骤:
进入/data/v5/Seeyon/A8/ApacheJetspeed/conf windows运行SeeyonConfig.cmd linux运行SeeyonConfig.sh
下拉菜单选择true,点击确认即可开启新版打印服务代码。
特别注意:不是简单通过SeeyonConfig开启Puppeteer就行,还需要安装Puppeteer相关服务,安装方法见下文。
# V9.0以上无图形化界面启用方法
则添加如下配置至/data/v5/Seeyon/A8/base/conf/systemCtp.properties
puppeteerPrint.switch = true
puppeteerPrint.nodePath = node
puppeteerPrint.puppeteerPath = /usr/local/puppeteer
puppeteerPrint.chromiumPath = /usr/bin/chromium-browser
保存后续重启OA生效。
特别注意:不是简单通过SeeyonConfig开启Puppeteer就行,还需要安装Puppeteer相关服务,安装方法见下文。
# 麒麟ARM64环境部署Puppeteer相关服务
# 下载安装包
安装包下载地址(support平台,需登录):https://support.seeyon.com/cbo_cptjxx.html?id=1734389726015655938
# 1.将安装包传到/usr/local下
# 2.安装node
cd /usr/local
tar -zxvf node-v16.20.0-linux-arm64.tar.gz
mv node-v16.20.0-linux-arm64 node
/usr/local/node/bin/node -v
vim /etc/profile
将如下内容添加到/etc/profile
export NODE_HOME=/usr/local/node
export NODE_PATH=/usr/local/node/lib/node_modules
export PATH=$PATH:$NODE_HOME/bin:$NODE_PATH
再执行如下命令:
source /etc/profile
查看版本:
node -v
# 3.安装puppeteer
cd /usr/local
tar -zxvf puppeteer.tar.gz
# 离线安装puppeteer
npm i -g puppeteer/
# 4.安装chromium
# 4.1 kylinos SP1版本安装chromium
# 4.1.1.1 配置yum源(麒麟sp1版本)
备份之前的/etc/yum.repos.d/下的repo文件并移出本目录
cat > /etc/yum.repos.d/kylin_aarch64.repo <<EOF
[ks10-adv-os]
name = Kylin Linux Advanced Server 10 - Os
baseurl = http://update.cs2c.com.cn:8080/NS/V10/V10SP1/os/adv/lic/base/aarch64/
gpgcheck = 0
enabled = 1
[ks10-adv-updates]
name = Kylin Linux Advanced Server 10 - Updates
baseurl = http://update.cs2c.com.cn:8080/NS/V10/V10SP1/os/adv/lic/updates/aarch64/
gpgcheck = 0
enabled = 1
[ks10-adv-addons]
name = Kylin Linux Advanced Server 10 - Addons
baseurl = http://update.cs2c.com.cn:8080/NS/V10/V10SP1/os/adv/lic/addons/aarch64/
gpgcheck = 0
enabled =1
[kylinos]
name = kylinos
baseurl = http://archive2.kylinos.cn/rpm/kylin/Library/custom/kylin-server/KY10-GFB-aarch64/
enabled = 0
gpgcheck = 0
EOF
# 4.1.1.2 安装chromium(麒麟sp1版本)
yum clean all
yum makecache
yum install --enablerepo=kylinos chromium
查看版本:
/usr/bin/chromium -version
# 4.1.2 离线安装chromium(麒麟sp1版本)
cd /usr/local
unzip chromium.zip
cd chromium
# 创建本地的yum源
createrepo ./
# 备份之前的/etc/yum.repos.d/下的repo文件并移出本目录
vi /etc/yum.repos.d/kylinos.repo
[local]
name=local
baseurl=file:///usr/local/chromium
enable=1
gpgcheck=0
# 安装chromium
yum clean all
yum makecache
yum -y install chromium
# 4.2 kylinos SP2版本安装chromium
cd /usr/local
unzip chromium.zip
cd chromium
rpm -ivh chromium-81.0.4044.138-2.ky10.aarch64.rpm
查看缺失的依赖包,例如minizip-compat-devel:
SP2的版本请参考如下连接去下载chromium的依赖包: https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/ 例如下载缺失的依赖minizip-compat-devel: https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/minizip-devel-1.2.11-20.ky10.aarch64.rpm 下载好依赖包后使用: rpm -ivh xxxx.rpm进行安装。 直到将chromium安装好:
# 4.3 kylinos SP3版本安装chromium
cd /usr/local
unzip chromium.zip
cd chromium
rpm -ivh chromium-81.0.4044.138-2.ky10.aarch64.rpm
查看缺失的依赖包,例如minizip-compat-devel::
SP2的版本请参考如下连接去下载chromium的依赖包: https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/aarch64/Packages/ 例如下载缺失的依赖minizip-compat-devel: https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/aarch64/Packages/minizip-devel-1.2.11-20.ky10.aarch64.rpm 下载好依赖包后使用: rpm -ivh xxxx.rpm进行安装。 直到将chromium安装好:
# 5.截图打印测试:
# 5.1 chromium测试:
执行命令(http://127.0.0.1:9060/console 为可以访问的有页面的url):
/usr/bin/chromium-browser --no-sandbox --headless --disable-gpu --disable-software-rasterizer --print-to-pdf=./test.pdf http://127.0.0.1:9060/console
当前目录生成test.pdf
# 5.2 node js打印测试:
# 新建文件test.js
cat > test.js << EOF
const puppeteer = require("puppeteer");
(async () => {
const browser =await puppeteer.launch( {
headless: true,
executablePath:'/usr/bin/chromium-browser'});
console.log(134);
const page = await browser.newPage();
await page.setViewport({
width: 1400,
height: 800,
});
await page.goto("https://baidu.com");
await page.screenshot({ path: "example.png" ,fullPage: true })
await browser.close();
})();
EOF
# 保存后执行
/usr/local/node/bin/node test.js
查看当前目录的example.png图片
# 常见问题
# 问题1:麒麟OS设置环境变量,退出终端就失效。
解决办法:使用软连接方式可解决。ln -s /usr/local/node/bin/node /usr/bin/node
# 问题二:安装chromium提示rpm包未签名,无法安装。
解决办法: yum安装加上参数- -nogpgcheck yum install --enablerepo=kylinos - -nogpgcheck chromium 安装chromium报错: 缺如下依赖:
如客户有源,可进入/usr/local/chromium 先成功安装chromium-common-81.0.4044.138-2.ky10.aarch64.rpm rpm -ivh chromium-common-81.0.4044.138-2.ky10.aarch64.rpm 根据报错在/usr/local/chromium 找到缺少的依赖进行rpm -ivh 包名安装。 使用yum install chromium-81.0.4044.138-2.ky10.aarch64.rpm
# UOS系统部署Puppeteer相关服务
UOS环境部署node+puppeteer+chromium,可以使用麒麟OS的包。但只能手工使用rpm -ivh
安装chromium,遇到依赖报错,也是用麒麟OS的依赖。
# CentOS系统X86环境部署Puppeteer相关服务
# 公网安装
# 1.安装node
tar -zxvf node-v16.20.0-linux-x86_64.tar.gz
mv node-v16.20.0-linux-x86_64 node
# 添加环境变量:
vim /etc/profile 将如下配置加入文件到最后
export NODE_HOME=/usr/local/node
export NODE_PATH=/usr/local/node/lib/node_modules
export PATH=$PATH:$NODE_HOME/bin:$NODE_PATH
source /etc/profile
node -v
# 更换源:
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 安装puppeteer:
npm i puppeteer --save-dev
yum install epel-release
# 安装chromium
yum -y install chromium
rpm -ivh libatomic-4.8.5-44.el7.x86_64.rpm
rpm -ivh nss-mdns-0.14.1-9.el7.x86_64.rpm
rpm -ivh chromium-common-116.0.5845.96-1.el7.x86_64.rpm
rpm -ivh chromium-116.0.5845.96-1.el7.x86_64.rpm
# 运行chromium-browser ,报错如下:
[90311:90311:0828/112645.177541:ERROR:zygote_host_impl_linux.cc(100)] Running as root without --no-sandbox is not supported. See https://crbug.com/63818
vim /usr/bin/chromium-browser
# 按G键,跳到最后一行,按i进入插入模式,
# 将 exec -a "$0" "$HERE/chrome" "$@" 改为
exec -a "$0" "$HERE/chrome" "$@" --user-data-dir --no-sandbox
# 再次运行即可
puppeteer 21.0.0版本,延迟打印 page.waitFor() 函数现在已被弃用并被page.waitForTimeout() 取代。
# 离线安装chromium
1、找一台能访问公网的centos7服务器,使用如下命令将chromium所需的依赖包下载到/tmp目录,目录可自行修改 yum install --downloadonly --downloaddir=/tmp/ chromium 2、做本地yum 源: 可参考如下链接:https://blog.csdn.net/2302_77228926/article/details/139559880 本地yum源做好之后,直接安装chromium: yum -y install chromium 其余的puppeteer和node,可以参考上面的安装方式。
# Windows系统X86环境部署Puppeteer相关服务
# 1.运行node-v18.17.1-x64.msi
下载地址:https://registry.npmmirror.com/-/binary/node/latest-v18.x/node-v18.17.1-x64.msi
选择固定目录安装例如D盘创建node目录,选择安装到D:\node
# 2.打开cmd窗口运行
npm config set prefix "D:\node\node_global"
npm config set cache "D:\node\node_cache"
# 3.运行
npm i puppeteer -g
# 4.安装chrome浏览器。
桌面找到chrome图标,点击右键,找到chrome.exe的路径。
新建test.js(替换puppeteer和chrome路径即可)
内容如下:
const puppeteer = require("D:/node/node_global/node_modules/puppeteer");
(async () => {
const browser =await puppeteer.launch( {
headless: true,
executablePath:'C:/Program Files/Google/Chrome/Application/chrome.exe'});
console.log(134);
const page = await browser.newPage();
await page.setViewport({
width: 1400,
height: 800,
});
await page.goto("https://baidu.com");
await page.screenshot({ path: "example.png" ,fullPage: true })
await browser.close();
})();
cmd窗口进入test.js所在目录。
运行node test.js
成功的话就在当前目录会生成example.png
打印截图中文乱码终极解决办法:
yum install wqy-microhei-fonts.noarch -y
yum install wqy-unibit-fonts.noarch -y
yum install wqy-zenhei-fonts.noarch -y
# 已完成项目
已完成项目记录:支持单编号 PMP-JFZC-2023-3966、PMP-JFZC-2023-3566、PMP-KKZY-2023-4597、PMP-KKZY-2023-3343、PMP-KKZY-2023-2004