# (最新)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模式。

# 一、镜像信息

项目
AMD64镜像 puppeteer-service-amd64.tgz (opens new window)
ARM64镜像 puppeteer-service-arm64.tgz (opens new window)
服务端口 16395
内存建议 4GB
磁盘空间 2GB+

# 二、部署步骤

# 2.1 下载镜像

从华为云OBS下载对应架构的镜像包:

# AMD64 架构
wget https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/amd64/puppeteer-service-amd64.tgz

# ARM64 架构(信创环境)
wget https://puppeteer-chromium.obs.cn-north-4.myhuaweicloud.com/arm64/puppeteer-service-arm64.tgz

# 2.2 解压并导入镜像

# 解压镜像
tar -zxvf puppeteer-service-amd64.tgz   # AMD64
tar -zxvf puppeteer-service-arm64.tgz   # ARM64

# 导入镜像
docker load -i puppeteer-service-amd64.tar   # AMD64
docker load -i puppeteer-service-arm64.tar   # ARM64

# 查看导入的镜像
docker images | grep puppeteer-service

# 2.3 启动容器

docker run -d \
  --name puppeteer-service \
  --restart unless-stopped \
  --memory="4g" \
  --memory-swap="6g" \
  --cpus="4.0" \
  --cpu-quota=-1 \
  --shm-size="2g" \
  --ulimit nofile=65536:65536 \
  --ulimit nproc=65536:65536 \
  -p 16395:16395 \
  -e TZ=Asia/Shanghai \
  -e NODE_ENV=production \
  -e SAVE_SCREENSHOTS=true \
  -v $(pwd)/logs:/app/logs \
  -v $(pwd)/screenshots:/app/screenshots \
  -v /usr/share/fonts:/usr/share/fonts:ro \
  -v /dev/shm:/dev/shm \
  --cap-add=SYS_ADMIN \
  --security-opt seccomp=unconfined \
  --tmpfs /tmp:rw,noexec,nosuid,size=2g \
  --tmpfs /run:rw,noexec,nosuid,size=256m \
  puppeteer-service:latest

# 2.4 刷新字体缓存

# 刷新字体
docker exec puppeteer-service fc-cache -f

# 查看已安装字体
docker exec puppeteer-service fc-list

# 2.5 验证服务

# 检查容器状态
docker ps -a | grep puppeteer

# 检查服务健康状态
curl -s -X GET http://<服务器IP>:16395/health

# 查看容器日志
docker logs -f --tail 50 puppeteer-service

# 三、OA配置修改

# V10.0SP1及以下版本

编辑base/conf/systemCtp.properties配置文件,按示例增加配置,如下:

puppeteerPrint.printServer = true
# 将下列IP地址替换为puppeteer容器所在宿主机IP(容器端口默认16395)
puppeteerPrint.remoteUrl = http://10.1.131.118:16395
puppeteerPrint.switch = true

配置修改后需重启OA服务

# 四、打印测试

  1. 重启OA服务后,登录系统
  2. 使用CAP4表单打印功能进行测试
  3. 检查报表打印、报表转发等功能是否正常

# 五、镜像导出(用于离线部署)

如需在其他服务器部署,可将镜像导出为tar包:

# AMD64
docker save puppeteer-service:latest | gzip > puppeteer-service-amd64.tgz

# ARM64
docker save puppeteer-service:latest | gzip > puppeteer-service-arm64.tgz

# 六、常见问题

# Q1: 打印内容显示异常(缺少文字)

字体未正确加载,执行字体刷新:

docker exec puppeteer-service fc-cache -f
docker restart puppeteer-service

# Q2: 容器启动失败

检查内存和权限配置,确保足够的系统资源。

# Q3: 连接超时

确认防火墙已开放16395端口:

firewall-cmd --add-port=16395/tcp --permanent
firewall-cmd --reload
编撰人:wangyxyf