# 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下

1702036832796.png

# 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

1702037564442.png

# 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图片

1702036508657.png

# 常见问题

# 问题1:麒麟OS设置环境变量,退出终端就失效。

解决办法:使用软连接方式可解决。ln -s /usr/local/node/bin/node /usr/bin/node

# 问题二:安装chromium提示rpm包未签名,无法安装。

解决办法: yum安装加上参数- -nogpgcheck yum install --enablerepo=kylinos - -nogpgcheck chromium 安装chromium报错: 缺如下依赖:

1702037791200.png

如客户有源,可进入/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

1702037797719.png

# 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

创建人:wyx
修改人:het、yangtao