需求背景:生成证书需要根据不同的用户生成用户对应数据的证书。
实现方案:前端提供证书的html页面地址,后端需要把地址转成pdf。
技术难点:证书数据需要请求后端接口获取,也即html页面需要先动态渲染再转成pdf。
后端语言:JAVA
技术选型:无论是pdf相关工具jar包,或是wkhtmltopdf二进制工具,都无法完美的解决上述技术难点;基于前端同事以前有使用node puppeteer实现过类似需求,琢磨着能不能JAVA通过调用node脚本的方式去实现,最后验证此方案可行。
步骤说明:基于Centos 7.x
第一步:安装node环境(推荐nvm方式)
# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
# 设置淘宝镜像
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
# source环境生效
source ~/.nvm/nvm.sh
# 安装对应版本node
nvm install v14.1.0
第二步:安装puppeteer库
# 设置淘宝仓库
npm config set registry https://registry.npm.taobao.org
# 安装puppeteer
npm install puppeteer --save
第三步:下载puppeteer对应的驱动,例如722234(驱动可以模仿打开浏览器动作)
wget https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/722234/chrome-linux.zip
unzip chrome-linux.zip -d /usr/local
第四步:安装google浏览器
yum install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
第五步:show code(html2pdf.js)
const puppeteer = require('puppeteer');
const args = process.argv.slice(2);
(async () => {
// Create a browser instance
const browser = await puppeteer.launch({
executablePath : '/usr/local/chrome-linux/chrome',
headless : true,
args: ['--no-sandbox']
});
// Create a new page
const page = await browser.newPage();
// Website URL to export as pdf
const website_url = args[0];
// Open URL in current page
await page.goto(website_url, { waitUntil: 'networkidle0' });
//To reflect CSS used for screens instead of print
await page.emulateMediaType('screen');
// Downlaod the PDF
const pdf = await page.pdf({
path: args[1],
margin: { top: '0px', right: '0px', bottom: '0px', left: '0px' },
printBackground: true,
format: 'A4',
});
// Close the browser instance
await browser.close();
})();
第六步:JAVA执行node脚本,命令示例如下==》
~/.nvm/versions/node/v14.1.0/bin/node /usr/local/html2pdf/html2pdf.js https://www.baidu.com/ baidu.pdf
FAQ:
1、chrome驱动缺少so依赖
# 查看驱动缺少so
ldd /usr/local/chrome-linux/chrome | grep not
# 示例==》
libXcomposite.so.1 => not found
# 安装so依赖,取上述so前缀即可
yum install libXcomposite* -y
2、中文乱码
# 查看Windows字体
C:\Windows\Fonts
# 上传中文相关字体(比如宋体)到服务器字体目录下
mkdir -p /usr/share/fonts/zh_CN/TrueType/