# pdf-research **Repository Path**: EverSpring007/pdf-research ## Basic Information - **Project Name**: pdf-research - **Description**: 通过JAVA实现pdf导出的几种实现 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 12 - **Forks**: 1 - **Created**: 2022-09-28 - **Last Updated**: 2025-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: pdf ## README # 1.简介 ![](doc/PDF生成.png) 上图为导出pdf的几种方式,有基于工具的,代码实现主要是JAVA。 * flying-saucer:对html,xhtml等做渲染,个人理解就是相当于浏览器对css/html的展示一样,导成pdf的功能是靠iText等实现的 * flying-saucer-pdf:基于iText 2.x的实现 * flying-saucer-pdf-openpdf:基于openpdf实现 * flying-saucer-pdf-iText5:基于iText5实现 * openpdf:基于iText的开源版本,可免费使用,目前一直有人维护。功能上比iText少,比如电子签名(个人认知,虽然提供了`PdfSignature`,`PdfSignatureAppearance` 等,但个人从源码的test中也没有感觉适用生成电子签名的方式,知道的朋友交流一下) * iText:传说是adobe公司的,而pdf又以adobe pdf市场占用率最高,可想而知对pdf的支持是最好的。iText有3个大版本,iText 2.x可以免费使用, iText 5.x部分商用,iText 7.x全商用,所以到用iText得摸着腰包来选择。iText 7说是性能比5有55%的提升,后期有时间测一把。 # 2.使用 分支: * master:基于openpdf实现(可商用,所以定为主分支) * iText-5:基于iText 5实现(尚未开始) pdf生成组件,支持以下无参、有参方式生成pdf: 1. 无参:静态文件,比如静态html(css最高支持css 2.1,不支持css3) 2. 有参:pdf表单域,可通过Acrobat或者福昕等工具制作 3. 有参:模板引擎动态生成,thymeleaf和Freemarker ## 2.1 依赖 依赖版本 ``` 9.1.22 5.2.0 2.6.10 2.3.31 3.1.20 ``` 公共依赖 ```xml org.xhtmlrenderer flying-saucer-pdf-openpdf com.itextpdf itext-asian ``` ### 2.1.1 thymeleaf模板引擎依赖 ```xml org.springframework.boot spring-boot-starter-thymeleaf ognl ognl ``` ### 2.1.2 Freemarker模板引擎依赖 ```xml org.freemarker freemarker ``` # 2.详细介绍 ## 2.1 工具类 各工具类demo见*Test.java **PdfTextUtils**: 把静态html、xhtml转成pdf **PdfAcroUtils**: 把pdf表单域的模板转成pdf工具类 **PdfFreemarkerUtils**: 把freemarker模板赋值后转成pdf **PdfThymeleafUtils**: 把thymeleaf模板赋值后转后pdf ## 3.2 使用方法 ### 3.2.1 带模板引擎的模板路径 * 配置模板默认放在`resources/templates`目录下,需要自定义的可以通过*Utils的`setTemplateDirPath`变更存放目录 ### 3.2.2 字体及中文 * 表单域用模板中定义好的字体 * 其他生成工具类中默认为resources下的`simsun.ttc`,在html中需要同时指定字体为`SimSun`,比如css通用指定 ```css body{font-family: 'SimSun'} ``` 可通过`setFontPath`自定义字体路径 * 转换的方法是通过`export()`转换成`byte[]`数组,如果需要生成文件,可自行转换