在工作中,有很多数据需要导出成PDF,比如账单、数据报表、简历等等。有很多方法可以做PDF的导出,JAVA就有很好的组件可以做这个事情。可以根据项目做不同的选择,下面我们简单探讨一下。

常用的导出方法对比 调研对

常用PDF导出方法 调研对象 优点 缺点 分页 图片 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 class="item inline-block">
    <h4>密码:</h4>
   <p>{{.Password}}</p>

下面的函数可以方便的读取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

在工作中,有很多数据需要导出成PDF,比如账单、数据报表、简历等等。有很多方法可以做PDF的导出,JAVA就有很好的组件可以做这个事情。可以根据项目做不同的选择,下面我们简单探讨一下。常用的导出方法对比调研对常用PDF导出方法 调研对象 优点 缺点 分页 图片 jsPDF 1、整个过程在客户端执行(不需要服务器参与),调用简单 ...... <button ng-click="generatePdf()">生成账单</button> <div id="zero">HelloWorld</div> <script src="static/libs/jsPDF-master/dist/jspdf.debug.js"></script> <script src="static/libs/jsPDF-master/dist/jspdf.min.js"&gt export function downloadFile(fileName, content) { const a = document.createElement('a'); const event = document.createEvent('MouseEvents'); const blo 1、打开网页链接,点击浏览器右上角的【设置】-【打印】,或者直接按【Ctrl+P】 2、选择【另存为PDF】-【保存】 3、【修改文件名称】为“推文发布日期+推文名称”-【保存】 4、pdf文件保存的地址位置 5、注意:PDF只能显示静态图片(jpg、png),不能保存视...