# (最新)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 目录下

1764236556720.png

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

1764238647888.png

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

1764236930352.png

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

1764237450461.png

  • 查看容器状态
# 查看容器
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到环境变量)

1758088539894.jpg

二进制包安装(可选部署方式)

  • 将下载的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/

安装完成后会生成以下文件

1741658955580png

# 安装chromium

chrome下载地址: https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/win64/chrome-win64.zip

chrome-win64.zip解压至d:\puppeteer_chromium目录下,如图

1741659100605png

# 测试打印功能

新建文本文件: 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

1741659437601png

# 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,客开可根据实际需求将该源码合并到自身工程中。

1765354272175.png

# Linux下解压命令参考
unzip puppeteer_V8.zip #zip包名根据实际情况调整

# 更新补丁

  • 协同OA停服,备份ApacheJetspeed/webapps/seeyon

  • 根据实际情况选择对应补丁文件进行更新

  • 启动OA服务

编撰人:wangyxyf、huanghail