网站首页 > 技术文章 正文
最近做了一个奇葩的需求,研究了一下Java纯后端生成PDF报表的方案,顺便将研究的方案做个总结复盘,分享一下。
需求分析:Java后端定时任务统计汇总成报表数据,并生成PDF格式的报表文件,并通过邮件、企业微信等发送给指定接收人。报表界面包含动态文字说明、折线图、饼图、条形图等图表,界面效果和前端生成的界面相同。
功能难点:前端要生成样式好看的图表比较简单,像Echarts这些前端工具都有现成的功能来完成。但是现在的需求是后端定时任务生成报表文件,报表界面的渲染都必须有后端来完成,由于缺少前端的用户操作动作,也无法在前端生成图表的图片后传到后端来。
方案一:
使用FreeMarker+iText生成PDF文件。
原理和流程:
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。
iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。
具体的流程如下:
缺点:这种方案只能生成很简单的Table模板,由于iText对html的要求非常严格,太复杂的界面会报错,所以无法生成Echarts的图表。
方案二:
SwingUI+JFreeChart+JFreePDF生成PDF文件
这里JFreeChart和JFreePDF都是maven依赖包
JFreeChart是Java客户端应用的一个界面组件,在SwingUI上画出图表控件。
JFreePDF是能将JPanel面板截屏生成PDF的插件。
流程和原理:
缺点:
由于是将JPanel截屏生成的PDF。所以界面样式上比较难看,比不上前端界面生成的报表页面。
而且JFreePDF这个maven依赖的插件是基于JDK11开发的,如果要兼容JDK8,就要到github上将源码下载下来,自己编译生成一个兼容JDK8的依赖包。
方案三:(最终采用方案)
使用wkhtmltopdf+静态html界面生成pdf界面
wkhtmltopdf是一个将静态html网页截屏生成pdf文件的工具,Linux、Mac、Windows各个操作系统的版本都有。只需要输入目标网页的URL就能将网页完成的导出PDF文件。
流程和原理:
1.在操作系统安装wkhtmltopdf工具
2.前端编码html+jquery+echarts的纯静态页面,由于wkhtmltopdf工具使用内置的WebKit内核版本较低,所以不兼容太新的js语言,像VueJS这些最新的框架就无法使用这个工具。目前测试的能够兼容的echarts版本是4.2.1.
3.调用wkhtmltopdf命令输入静态网页地址生成pdf文件。
之前为了调试网页写了一个Java桌面应用来调用wkhtmltopdf工具生成pdf。
github地址:https://github.com/WrathLi/html2pdf
缺点:
1.需要在服务器系统中先安装wkhtmltopdf工具;
2.只能单独开发一个纯静态的html页面来生成报表
优点:
界面美观,因为是直接截取html网页,所以和前端生成的图表样式一样。
开发量最小。
最终效果:
猜你喜欢
- 2024-10-25 文档在线预览新版(四)使用js前端组件实现文档在线预览
- 2024-10-25 细聊Vue 3 系列之 JSX 语法(vue中jsx语法)
- 2024-10-25 一篇文章教你并列比较React.js和Vue.js的语法【实践】
- 2024-10-25 带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】
- 2024-10-25 10个Vue开发技巧「实践」(vue开发视频教程)
- 2024-10-25 Python开发打印服务(2)(python打印代码)
- 2024-10-25 Vue.js 项目实践——创建记忆卡片游戏
- 2024-10-25 让Jenkins自动部署你的Vue项目「实践」
- 2024-10-25 Java实战系列-前端VUE代码开发及接口流程设计(1)
- 2024-10-25 Vue高性能渲染大数据Tree组件「实践」
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)