# (最新)Puppeteer打印部署手册
# 背景
标准产品的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服务部署
任选一种方案即可,推荐docker容器部署。可以将 Puppeteer 服务与 OA 系统部署在同一台服务器,也可以分离部署,建议集中部署。
# 方式一:(推荐)Docker部署
该方案适用于Linux下允许使用docker容器化的客户环境
# 一键安装脚本部署
- 下载部署包
部署包地址:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/all_in_one/puppeteer_chromium_offline_pkg.tar.gz
部署包中的puppeteer-service.js文件第一行记录有容器的更新日期
并将部署包上传至服务器 /data/Seeyon 目录下

- 检查包完整性
MD5: 0b9924856c1082f0c0c67b7917984df1
cd /data/Seeyon
md5sum puppeteer_chromium_offline_pkg.tar.gz

- 解压部署包
cd /data/Seeyon
tar -zvxf puppeteer_chromium_offline_pkg.tar.gz
# 查看解压目录
ls puppeteer_chromium

- 安装并启动
cd /data/Seeyon/puppeteer_chromium
chmod +x *.sh
./install.sh

- 查看容器状态
# 查看容器
docker ps -a
# 查看容器日志
docker logs -f --tail 50 puppeteer_chromium
- 更新字体
将字体文件拷贝到 /data/Seeyon/puppeteer_chromium/fonts 目录下,再执行以下命令
# 刷新字体缓存
docker exec -it puppeteer_chromium fc-cache -f
# 注意:重启容器后都应该执行以上命令刷新缓存!
# 最新脚本中已包含刷新字体命令
- OA配置文件修改
编辑base/conf/systemCtp.properties配置文件,按示例增加配置,如下:
puppeteerPrint.printServer = true
# 将下列IP地址替换为puppeteer容器所在宿主机IP(容器端口默认16395)
puppeteerPrint.remoteUrl = http://10.1.131.118:16395
puppeteerPrint.switch = true
修改配置文件后,请根据下文介绍下载并更新OA补丁,最后重启OA
# 手动部署
如果使用自动脚本部署,则不需要参考此步骤。
# 先决条件
部署puppeteer之前必须先部署docker环境,请参考文档:https://open.seeyoncloud.com/v5doc/142/1190/2230.html
# 下载镜像
AMD64架构:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/amd64/new/puppeteer_chromium.tar.gz
ARM64架构:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/arm64/new/puppeteer_chromium.tar.gz
# 导入镜像
# 新建目录
mkdir /tmp/puppeteer_chromium
# 将下载的镜像上传至服务器 /tmp/puppeteer_chromium 目录
# 解压镜像
cd /tmp/puppeteer_chromium
tar -zvxf puppeteer_chromium.tar.gz
# 导入镜像
docker load -i puppeteer_chromium.tar
# 查看镜像
docker images
# 添加字体(可选)
由于字体版权原因,初始镜像不带字体,请参考下列步骤添加
# 新建字体目录 /tmp/puppeteer_chromium/fonts_local
mkdir -p /tmp/puppeteer_chromium/fonts_local
# 拷贝字体文件到/tmp/puppeteer_chromium/fonts_local目录下
# Centos系统字体目录 /usr/share/fonts,Windows字体目录 C:\Windows\Fonts
cp -r /usr/share/fonts/* /tmp/puppeteer_chromium/fonts_local/
# 创建Dockerfile
cat >> /tmp/puppeteer_chromium/Dockerfile << EOF
FROM puppeteer_chromium:base
# 复制本地字体文件到系统字体目录
COPY fonts_local /usr/share/fonts/truetype/custom/
# 更新字体缓存
RUN fc-cache -f -v
EOF
# 添加镜像tag
docker tag puppeteer_chromium:V1 puppeteer_chromium:base
# 构建镜像
cd /tmp/puppeteer_chromium
docker build -t puppeteer_chromium:V1 .
# 运行puppeteer容器
docker run -d --name puppeteer_chromium_v1 --restart always -p 16395:16395 --memory="2g" puppeteer_chromium:V1
# 测试puppeteer容器
# 在服务器上执行以下命令检查容器状态,10.1.131.118为容器所在宿主机IP
curl -s -X GET http://10.1.131.118:16395/health
# 查看容器日志
docker logs -f --tail 50 puppeteer_chromium_v1
# OA配置文件修改
编辑base/conf/systemCtp.properties配置文件,按示例增加配置,如下:
puppeteerPrint.printServer = true
# 将下列IP地址替换为puppeteer容器所在宿主机IP(容器端口默认16395)
puppeteerPrint.remoteUrl = http://10.1.131.118:16395
puppeteerPrint.switch = true
修改配置文件后,请根据下文介绍下载并更新OA补丁,最后重启OA
# 方式二:Chroot部署
该方案适用于Linux下不允许使用docker容器化的客户环境
# 先决条件
所有操作均需在 root 用户下执行,以确保系统级权限操作的正确性。
# 下载rootfs部署包
AMD64架构:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/amd64/new/rootfs_x64.tar.gz
ARM64架构:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/arm64/new/rootfs_arm64.tar.gz
# 部署puppeteer rootfs
# 新建目录
mkdir -p /data/Seeyon/A8/puppeteer_chromium
# 将rootfs_x64.tar.gz或rootfs_arm64.tar.gz上传至服务器/data/Seeyon/A8/puppeteer_chromium目录
# 切换目录,并解压
cd /data/Seeyon/A8/puppeteer_chromium
tar -zvxf rootfs_x64.tar.gz
# 启动服务
cd /data/Seeyon/A8/puppeteer_chromium
# 命令参考: ./service.sh start|stop|status|restart
./service.sh start
注:服务脚本启动后严禁删除rootfs目录
# 测试服务状态
# 在服务器上执行以下命令检查服务状态,10.1.131.118为服务器IP
curl -s -X GET http://10.1.131.118:16395/health
# OA配置文件修改
编辑base/conf/systemCtp.properties配置文件,按示例增加配置,如下:
# 修改为node的实际安装路径(绝对路径)
puppeteerPrint.nodePath = node
# puppeteer模块安装路径
puppeteerPrint.puppeteerPath = /app/node_modules/puppeteer-core
# chromium安装路径
puppeteerPrint.chromiumPath = /app/chrome/chrome
puppeteerPrint.linux.chrootPath = /data/v5/rootfs
puppeteerPrint.linux.tempFolder = /tmp
# 截图打印使用puppeteer时,必须要配置为true
puppeteerPrint.switch = true
修改配置文件后,请根据下文介绍下载并更新OA补丁,最后重启OA
# 方式三:Windows部署
# 安装 Node.js
官方下载地址:https://nodejs.org/en/download
选择v22(lts)版本,选择 Windows x64架构,下载msi安装包或二进制包均可(二进制包部署需手动添加node到环境变量)

二进制包安装(可选部署方式)
将下载的node-v20.19.0-win-x64.zip 解压至 d:\node-v20.19.0-win-x64
打开系统属性,右键点击“此电脑”或“我的电脑”,选择“属性”,点击“高级系统设置”。
在“系统属性”窗口中,点击“环境变量”按钮。编辑系统变量:
在“系统变量”部分,找到并选择“Path”变量,然后点击“编辑”。
在“编辑环境变量”窗口中,点击“新建”按钮,添加 Node 的安装路径(例如:d:\node-v20.19.0-win-x64\)。
验证node命令(必须)
打开命令提示符(CMD),输入以下命令以验证 Node.js 和 npm 是否正确安装:
# 如果安装成功,你将看到 Node.js 和 npm 的版本号。
node -v
npm -v
# 安装puppeteer
新建目录d:\puppeteer_chromium
再打开命令提示符(CMD),执行以下命令
cd /d d:\puppeteer_chromium
# 需要通外网
npm install puppeteer-core@23.11.1 --registry https://registry.npmmirror.com/
安装完成后会生成以下文件

# 安装chromium
chrome下载地址: https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/win64/chrome-win64.zip
将chrome-win64.zip解压至d:\puppeteer_chromium目录下,如图

# 测试打印功能
新建文本文件: test.js,内容如下:
const puppeteer = require('D:/puppeteer_chromium/node_modules/puppeteer-core');
console.log(process.argv);
(async () => {
const browser = await puppeteer.launch({
headless: true,
executablePath: process.argv[2], // 确保这里提供的是正确的浏览器可执行文件路径
args: ['--no-sandbox', '--disable-setuid-sandbox'],
defaultViewport: {
width: 1245,
height: 700
}
});
const page = await browser.newPage();
await page.goto(process.argv[3]);
await page.screenshot({ path: 'puppeteer-test.png', fullPage: true });
await browser.close();
})();
打开CMD执行命令
# 执行后会在命令行所在目录生成一个png图片: puppeteer-test.png
node test.js d:\puppeteer_chromium\chrome-win64\chrome.exe http://www.baidu.com

# OA配置文件修改
编辑base/conf/systemCtp.properties配置文件,按示例增加配置,如下:
# 开启puppeteer打印
puppeteerPrint.switch = true
# node路径
puppeteerPrint.nodePath = d:/node-v20.19.0-win-x64/node.exe
# puppeteer路径
puppeteerPrint.puppeteerPath = D:/puppeteer_chromium/node_modules/puppeteer-core
# chrome路径,开启远程打印可不填
puppeteerPrint.chromiumPath = d:/puppeteer_chromium/chrome-win64/chrome.exe
修改配置文件后,请根据下文介绍下载并更新OA补丁,最后重启OA
# puppeteer协同补丁包
# 适配版本
| 协同版本 | 说明 |
|---|---|
| V10.X | 无更新补丁 |
| V10.0 | 需更新补丁 |
| V9.0SP1 | 需更新补丁 |
| V8.2SP1 | 需更新补丁 |
| V8.1SP2 | 需更新补丁 |
| V8.1SP1 | 需更新补丁 |
| V8.0SP2 | 需更新补丁 |
| 其余版本 | 暂未支持,请联系研发团队确认 |
# 获取补丁包
下载地址:https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/puppeteer_V8.zip
# 补丁包说明
补丁包puppeteer_V8.zip解压后,会得到三个不同版本的补丁包。请根据实际使用的OA版本选择对应的补丁。
seeyon.zip为手动打补丁文件,备份后直接覆盖即可。seeyonS1.zip为S1打补丁文件。src.zip为本补丁对应的源码,所属工程为cap-runtime,客开可根据实际需求将该源码合并到自身工程中。

# Linux下解压命令参考
unzip puppeteer_V8.zip #zip包名根据实际情况调整
# 更新补丁
协同OA停服,备份ApacheJetspeed/webapps/seeyon
根据实际情况选择对应补丁文件进行更新
启动OA服务
快速跳转