1.背景
项目需求需要做PDF报表,产品经理要求还不能太难看,既然是PDF嘛,那肯定要求除了文字表格以外,还要有折线图、饼图、柱状图、玫瑰图啥的,各种花里胡哨的图,美其名曰既然要做就要比别的厂商做的好看,还要支持定时生成,日报、周报、月报啥的,还要支持定时发送给客户,邮件、企业微信等。需求已经通过了,接下来产品经理的工作就是盯着苦逼程序猿了。
2.难点与方案
由于要求图表各种样式,并且用户可进行边预览边配置操作样式模板,这样少不了前端的工作,前端要生成好看的图表还是有很多现成的组件的,如Echarts等现成的工具,但是还要求定时生成、发送,那这块肯定要后端来做了。作为一名java程序员,咱也只能面向百度编程,发现常规的一般有iText、JFreeChart等三方类库可以调用实现,但是整了几个demo发现展示效果并不如意、不入产品经理的法眼(我只是个垃圾java程序员,你要整这么好看让前端搞去),然后还不怎么能满足那些动态配置、预览等要求,另外就是要了解学习这些三方API,感觉这玩意做复杂的业务还挺费劲,学习成本又高,我这么懒可不想做这些工作。挠了几天头发后(已经剩的不多了),换了个思路。
方案思路:
既然要就要动态配置模板,还要边预览,那就让前端来搞好了,就当正常界面来做,随便用户怎么操作,操作完后生成模板,后端接口返回数据,前端来填充就好了,至于怎么个花里胡哨,你们前端来定,我是后端,咱也不会界面的花里胡哨。关键点就是数据填充好后,怎么生成pdf报表?至于发送啥的都不是啥问题,你只要pdf文件生成了,我想怎么发就怎么发,发到美国都可以。调研发现,我只需要一个工具,就是把界面变成PDF文件的工具。这个工具远在天边近在眼前,既然预览的报表界面是通过浏览器来看的,那我整个浏览器行不行,你浏览器能展示的东西我都能展示,到时候界面做的不好看那你就找前端去,我后端是永不背锅,毕竟他做出来能展示的咱也能展示。
3.实现
生成工具:chrome --headless(如不了解,自行百度,很多帖子都说的很好)
实现思路:内置一些报表模板或让用户通过界面配置一些报表模板(当然大题结构还是要固定下来的),如要展示哪方面的数据(结合业务),以什么形式展示(各种图表),然后固定报表模板和样式,前后端约定数据格式,前端根据模板做样式展示,然后调用后端接口获取具体数据进行填充展示,后端根据界面的路由通过chrome --headless来将某个路由界面的数据输出到pdf文件中。文件生成成功后接下来就没啥大问题了。
工具安装:chrome或其衍生物(chromium、browser360)
环境一般分为x86(amd64)和aarch64(arm64),操作系统也会有稍许影响,一般是依赖问题,但根据安装信息依次安装缺少的依赖就行。目前我由于做过些国产环境的适配,所以经过一些踩坑,也适配了一些国产环境现成的安装包,一键安装即可,已亲测成功支持如下:
格式:CPU + OS ,其中aarch64环境为国产服务器环境,鲲鹏、飞腾均可使用
统信UOS也适配过,但是之前的安装包忘了放哪了,评论可提供相关帮助
-
x86
- centos7、kylin10、openEuler
下载地址: chrome安装包
- centos7、kylin10、openEuler
-
aarch64 (鲲鹏920 or 飞腾)
- kylin10(银河麒麟v10)
- openEuler(欧拉)
下载地址链接: browser360安装包
安装好后调用命令生成PDF即可:
-
x86环境
/opt/google/chrome/chrome --headless --enable-logging --disable-gpu --no-sandbox --acceptSslCerts --acceptInsecureCerts --ignore-certificate-errors --window-size=1920,1080 https://127.0.0.1:80/index.html --print-to-pdf=/data/test.pdf --virtual-time-budget=10000 --print-to-pdf-no-header -
aarch64环境
/opt/browser360/arm64_64k/browser360-cn --headless --enable-logging --disable-gpu --no-sandbox --acceptSslCerts --acceptInsecureCerts --ignore-certificate-errors --window-size=1920,1080 https://127.0.0.1:80/index.html --print-to-pdf=/data/test.pdf --virtual-time-budget=10000 --print-to-pdf-no-header
加粗字解释:第一个为安装后的的可执行文件位置,第二个为你所需要的界面路径,第三个为你本地的文件地址(pdf文件要事先创建)。browser360安装脚本里做了软链接,链接地址为/opt/google/chrome/chrome,其实如果用安装包里的安装脚本安装的话只需要第一条命令就行(x86)。