html转pdf最佳实践

需求背景:生成证书需要根据不同的用户生成用户对应数据的证书。

实现方案:前端提供证书的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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值