在工作中,有很多数据需要导出成PDF,比如账单、数据报表、简历等等。有很多方法可以做PDF的导出,JAVA就有很好的组件可以做这个事情。可以根据项目做不同的选择,下面我们简单探讨一下。
常用的导出方法对比调研对
调研对象 | 优点 | 缺点 | 分页 | 图片 |
---|---|---|---|---|
jsPDF | 1、整个过程在客户端执行(不需要服务器参与),调用简单 | 1、生成的pdf为图片形式,且内容失真 | 支持 | 支持 |
iText | 1、功能基本可以实现,比较灵活2、生成pdf质量较高 | 1、对html标签严;格,少一个结束标签就会报错;2、后端实现复杂,服务器需要安装字体;3、图片渲染比较复杂(暂时还没解决) | 支持 | 支持 |
wkhtmltopdf | 1、调用方式简单(只需执行一行脚本);2、生成pdf质量较高 | 1、服务器需要安装wkhtmltopdf环境;2、根据网址生成pdf,对于有权限控制的页面需要在拦截器进行处理 | 支持 | 支持 |
goPdf | 1.可以用Golang实现pdf的生成 | 1. 后端为golang写的服务;2. 需要开发者实现所有元素的绘制,代码量大、容易出错、不够灵活 | 支持 | 支持 |
html2canvas+jsPDF
原理是利用html2canvas遍历页面中的dom节点,渲染成canvas image,再用jsPDF把canvas image转化为pdf,最后转化的pdf的内容都是图片形式,类似于把整个网页截图、切割,再一页一页拼接成一个完整的pdf。
这种方法的优点是所有的过程都由js在客户端完成,不需要依赖服务器。
目前发现的两个比较明显的缺点:
1、生成的pdf质量不高,失真比较严重;
2、在分页处如果有图片的话,不会自动识别隔页处理(甚至一行文字也能给你上下一分为二),图片也会很容易被一分为二
iText
iText是一个第三方报表java插件,可以在后端利用java随意生成、转化pdf文件,提供了很多api,比较灵活。
需要注意的是:
1、如果页面中有中文,服务器端需要下载字体库simsun.ttc,在后台进行引用,同时在页面的样式中加入对应字体的定义
2、页面中如果有图片,如果图片引用是绝对路径或者base64则不用考虑,如果是相对路径,需要在后台用renderer.getSharedContext().setBaseURL("图片绝对路径目录");来指定图片路径,否则图片无法渲染。
3、要转化的页面必须是标准的XHTML页面,有一处不符合规范就会报错
wkhtmltopdf
wkhtmltopdf是一个可以把html转为pdf的插件,有windows、linux等平台的版本,最大的特点就是使用简单,语言无关性
使用方法:
wkhtmltopdf https://www.baidu.com/ feishu.pdf
注意:需要按照插件
为什么要选择wkhtmltopdf
1. 可以使用html模版作为页面的基础框架
2. 可以比较容易的把数据灌入html模版
3. 对于html修改比较灵活,颜色及样式比较容易修改与构建
比如Golang对于HTML模版支持的还是比较好的,可以把HTML模版定义成类似下面的格式:
<div class="item inline-block">
<h4>用户名:</h4>
<p>{{.UserName}}</p>
</div>
<div class="item inline-block">
<h4>密码:</h4>
<p>{{.Password}}</p>
</div>
下面的函数可以方便的读取Globalization的HTML模版,然后就可以调用wkhtmltopdf进行转换。
func GeneratePdf(locale string, data ExportData) ([]byte, error) {
ext := "html"
htmlTplName := utils.GetHtmlTemplatePath("use_info", ext, locale)
tmpl, err := template.ParseFiles(htmlTplName)
if err != nil {
return nil, err
}
buf := &bytes.Buffer{}
tmpl.Execute(buf, data)
return buf.Bytes(), nil
}
对于golang调用wkhtmltopdf,这里就不再阐述了,可以在github上搜一个库进行调用。(GitHub - lawenliu/wkhtmltopdf-go: Go wrapper for wkhtmltopdf, used to convert html pages to pdf.)
参考地址:LiveToolkit