需求分析
项目中用到了 Echarts,想要把图文混排,当然包括 echarts 生成的 Canvas 图也导出 PDF。
设计和实现时,分析了 POI、iText、freemaker、world 的 xml 模版、Jquery-printArea.js、JQuery Plugin-TableExport、flying saucer 等等技术组合,不尽人意。甚至因为echarts不支持后端调用导出图片(没有简单易行的办法),一度考虑要在导出时用JfreeCharts 重新画一遍图表。一是不能完整体现原有设计样式,二是工期不支持这么庞大的工作量(硬撸代码解析 html 生成word 或 pdf。好吧,也同时觉得挺 low 的);
最终选择了 wkhtmltopdf,实现了预期目标。整理成笔记,分享给大家。同时,发现 docker hub 有 wkhtmltopdf 基于 apline 搭建的 web service 镜像,生产环境可以上 Docker 的同学有福了,这应该是个更加高效的方案。后续考虑整合到支撑平台中,一并开源出来。
笔记本实验
本地测试为 Mac Book,生产环境请自行评估调整。
下载和安装
B4下,brew 仓库里居然没有,所以 brew install wkhtmltopdf 安装报错。
直接贴官方链接了:有依赖亲自行安装依赖;
验证
ChinaDreams:workspace kangcunhua$ wkhtmltopdf --version
wkhtmltopdf 0.12.4 (with patched qt)
测试
联网抓取
ChinaDreams:~ kangcunhua$ wkhtmltopdf --header-center '报表' --outline --header-line --margin-top 2cm --header-line http://www.qq.com/ qq.pdf
本地页面测试
index.html见静态页面
–zoom 4 是 Mac book 上实验出来的参数,这样页面是正常A4宽幅;在 windows10、Suse 11 下不用加这个参数。
toc 参数生成目录,包括左侧导航;—toc-header-text自定义目录名;
ChinaDreams:~ kangcunhua$ wkhtmltopdf --zoom 4 toc --toc-header-text "第四季度季报" index.html export.pdf
模拟商业环境
我们拿到项目中实践验证下方案。商业项目,往往是残酷的要求,会遇到各种各样 demo 时碰不上的挑战。
思路还是先用 docker 神器,模拟商业环境,验证方案,然后再修订验证后的方案到正式项目环境验证。
客户方提供的环境是 SuSE。我们先来看看是哪个版本
cat /etc/SuSE-release # 可以看到补丁版本
SUSE LINUX Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 4
请 Docker 神器
查找 SuSE 镜像,恰好有一个11版本的,下载镜像先
$ docker search SUSE # yuzhenpin/suse-11-sp3-x86_64-java
$ docker pull yuzhenpin/suse-11-sp3-x86_64-java
启动镜像
docker run --name suse-ep -it yuzhenpin/suse-11-sp3-x86_64-java /bin/bash
9e023776a1d5:/ # java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
9e023776a1d5:/ # id
uid=0(root) gid=0(root) groups=0(root)
9e023776a1d5:/ # groupadd prms && useradd -d /prms -g prms -m prms
9e023776a1d5:/ # passwd prms
9e023776a1d5:/ # su prms
安装和配置
因为下载的二进制版本的,直接把 wkhtmltopdf 拷贝进容器即可。index.html 是写的测试页面,后文附有源码:此文件用到的jquery 相关 js 直接引用了 CDN,故实验在联网环境下进行的。
ChinaDreams:copy2docker kangcunhua$ docker cp wkhtmltox-0.12.4_linux-generic-amd64.tar.xz su-ext:/prms/workspace
ChinaDreams:copy2docker kangcunhua$ docker cp index.html su-ext:/prms/workspace
检查运行依赖
使用 ldd 命令,not found 的就是对应的依赖包不存在:
7d183ecb0026:/prms/workspace/wkhtmltox/bin # ldd wkhtmltopdf
linux-vdso.so.1 => (0x00007ffe40bd2000)
libXrender.so.1 => not found
libfontconfig.so.1 => not found
libfreetype.so.6 => not found
libXext.so.6 => not found
libX11.so.6 => not found
libz.so.1 => /lib64/libz.so.1 (0x00007f9ca59ad000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9c