最近遇到一个需求,需要使用Java生成PDF文件,网上的资料很杂乱,故整理记录一下

首先引入pom依赖

<!-- pdf:start --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency><!-- 支持中文 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!-- 支持css样式渲染 --><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.16</version></dependency><!-- 转换html为标准xhtml包 --><dependency><groupId>net.sf.jtidy</groupId><artifactId>jtidy</artifactId><version>r938</version></dependency>
<!-- pdf:end -->

将生成代码PDF的工具类放入项目中

package com.seezoon.admin.framework.utils;import com.itextpdf.text.pdf.BaseFont;
import com.seezoon.admin.framework.utils.bean.ContractDynamicParam;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.xhtmlrenderer.pdf.ITextRenderer;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;/*** @Description: 生成PDF合同工具类* @author liguodong* @date 2022年3月6日 下午5:19:32*/
public class GeneratePdfUtil {//private static final String TEMPORARY_CONTRACT_HTML = "E:\\workspace\\dytc\\dytc\\seezoon-admin-server\\src\\main\\resources\\contract\\temporary.html";// 临时HTML合同,用于转PDF格式private static final String TEMPORARY_CONTRACT_HTML = "/data/file/contract/temporary.html";//private static final String SIMSUM_FILE = "E:\\workspace\\dytc\\dytc\\seezoon-admin-server\\src\\main\\resources\\common\\simsun.ttc";// 添加字体,解决中文支持问题private static final String SIMSUM_FILE = "/data/file/common/simsun.ttc";public static String GenerateContract(ContractDynamicParam param) throws Exception {// 生成html合同generateHTML(param.getTemplatePath(), param.getTemplateName(), param.getContractParam());// 根据html合同生成pdf合同generatePDF(param.getContractPath() + param.getContractName());// 删除临时html格式合同removeFile(TEMPORARY_CONTRACT_HTML);return param.getContractPath() + param.getContractName();}/*** @Description 生成html格式合同*/private static void generateHTML(String templatePath, String templateName, Map<String, Object> paramMap) throws Exception {Configuration cfg = new Configuration();cfg.setDefaultEncoding("UTF-8");/*** 1.setClassForTemplateLoading(this.getClass(), "/HttpWeb");* 基于类路径,HttpWeb包下的framemaker.ftl文件* 2.setDirectoryForTemplateLoading(new File("/template"));* 基于文件系统,template目录下的文件* 3.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");* 基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl文件*/cfg.setDirectoryForTemplateLoading(new File(templatePath));// templateName.ftl为要装载的模板Template template = cfg.getTemplate(templateName);File outHtmFile = new File(TEMPORARY_CONTRACT_HTML);Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outHtmFile)));// 将参数输出到模版,并操作到HTML上template.process(paramMap, out);out.close();}/*** @Description 根据html生成pdf格式合同*/private static void generatePDF(String pdfUrl) throws Exception {File htmFile = new File(TEMPORARY_CONTRACT_HTML);File pdfFile = new File(pdfUrl);System.out.println(pdfUrl);String url = htmFile.toURI().toURL().toString();OutputStream os = new FileOutputStream(pdfFile);ITextRenderer renderer = new ITextRenderer();renderer.setDocument(url);org.xhtmlrenderer.pdf.ITextFontResolver fontResolver = renderer.getFontResolver();// 解决中文支持问题fontResolver.addFont(SIMSUM_FILE, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);renderer.layout();renderer.createPDF(os);os.close();}/*** @Description 移除文件*/private static void removeFile(String fileUrl) {File file = new File(fileUrl);file.delete();}public static void returnPdfStream(HttpServletResponse response, String pathName) throws Exception {response.setContentType("application/pdf");File file = new File(pathName);if (file.exists()) {FileInputStream in = new FileInputStream(file);OutputStream out = response.getOutputStream();byte[] b = new byte[1024 * 5];int n;while ((n = in.read(b)) != -1) {out.write(b, 0, n);}out.flush();in.close();out.close();}}
}
package com.seezoon.admin.framework.utils.bean;import lombok.Data;import java.util.Map;/*** @Description: 生成PDF参数* @author lgd* @date 2022年4月27日 下午6:04:56*/
@Data
public class ContractDynamicParam {private String templatePath;// 模版路径private String templateName;// 模板文件名(.ftl结尾)private String contractPath;// 合同生成路径private String contractName;// 合同生成文件名(.pdf结尾)private Map<String, Object> contractParam;// 合同所需参数public ContractDynamicParam(String templatePath, String templateName, String contractPath, String contractName, Map<String, Object> contractParam) {this.templatePath = templatePath;this.templateName = templateName;this.contractPath = contractPath;this.contractName = contractName;this.contractParam = contractParam;}}

工具类中配置了项目的路径,一个是临时模板,另一个是字体,需要放入相应的路径下,临时模板不用建,项目会自动生成,字体需要进行引入

配置相应的模板!!!重点

先使用world画出模板的表格,我这边使用的是office 2019,然后转化为HTML格式

转化的链接Word转HTML——免费在线Word转网页 (docpe.com)

将转化的html后缀修改为ftl格式,并且在插入值得地方用${值}表示

注意!!!

我这边遇到了一个font-family字体无法转化的bug,修改方法是将项目中的所有的font-family用空格替换掉

然后调用main方法进行测试

public static void main(String[] args) throws Exception {Map<String, Object> paramMap = new HashMap<String, Object>();paramMap.put("XM", "張三冯");paramMap.put("AH", "(2015)****字第0***0号");paramMap.put("CSKSRQ", "2016年10月31日00时00分");paramMap.put("KHZH", "271**********07279975");paramMap.put("FYMC", "****人民法院");paramMap.put("JSRQ", "2017-06-14");paramMap.put("KZZT", "1");paramMap.put("LCZH", "987234234");paramMap.put("DATE", "2017年03月24日09时39分");paramMap.put("CKWH", "(2015)*****字第0**20-1**0号裁定书");paramMap.put("SKSE", "100");paramMap.put("CSJSRQ", "2016年10月31日 00时00分");paramMap.put("KHWD", "images/stamp.jpg");ContractDynamicParam param = new ContractDynamicParam(TEMPLATES_PATH, "pdfDemo.ftl", CONTRACT_PATH, "pdfDemo5.pdf", paramMap);GeneratePdfUtil.GenerateContract(param);System.out.println("====test生成PDF合同成功====");}

至此就完成了,以后有空会补充一下具体细节

有需要demo的可以移步链接去下载

java使用itext生成pdfdemo,直接执行main方法可用!代码文档中有配置文件的详细介绍-Java文档类资源-CSDN下载java使用itext导出pdf,可以生成表格、文字、图片等,demo中详细介绍了使用的版本,可能出更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/enhengguodong/85007061

使用Java生成PDF文件相关推荐

  1. iText5实现Java生成PDF文件完整版,二维码

    iText5实现Java生成PDF文件完整版 vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ? Vue打印文件(v-print ...

  2. # Java 生成pdf文件

    Java 生成pdf文件 引入依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> <depend ...

  3. Java生成PDF文件_自用

    Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...

  4. Java生成PDF文件(Itext篇)

    在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样 ...

  5. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

  6. Java生成PDF文件,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  7. java生成pdf字体居中,Java生成pdf文件,解决中文乱码问题

    如下代码使用itext生成pdf文件,通过设置中文字体避免乱码. /** * AsianTest.java */ import java.io.FileOutputStream; import jav ...

  8. java 生成pdf文件,添加图片

    所需要的包: 1.  iText    下载地址:  http://nchc.dl.sourceforge.net/sourceforge/itext/itext-2.0.3.jar 2.  iTex ...

  9. java生成pdf文件流_java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做...

    展开全部 一.iText介绍 iText是着名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的32313133353236313431303231363533e4b893e5b1 ...

  10. java 生成pdf文件_Java 中HTTP响应数据生成PDF,PDF文件的读取

    将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因, 废话少说,先说踩的坑 1.区分字符流.字节流 这里可以百度一下,但是简言之就是: j ...

最新文章

  1. Windows Server 2012正式版RDS系列⑦
  2. C++ exception 类继承结构图
  3. 常见java面试题 普通类和抽象类的区别?
  4. 多点在线构建Noxmobi全球化精准营销系统
  5. 临死之前我要写一本《中国哲学史——以自然主义和人道主义的矛盾为视角》...
  6. dubbo内置哪几种服务容器_Dubbo服务提供者几种启动方式
  7. 关于a+b共创建了几个对象的问题
  8. IntelliJ Cannot find declaration to goto----解决方案
  9. 数据库系统原理笔记:关系数据库设计
  10. java实现linux中gzip压缩解压缩算法:byte[]字节数组,文件,字符串,数据流的压缩解压缩
  11. java 实现poi方式读取word文件内容
  12. python根据文件名筛选文件_Python-实现筛选出文件夹下含有特定名字的文件
  13. java做度量衡换算器,磅换算计算器(公斤和磅在线换算器)
  14. js制作网页动态背景
  15. 2022/11/6周报
  16. if控制条件——BMI
  17. PPT文字过少时,如何排版比较好
  18. Fiddler抓包工具配置--IE、Chrome
  19. java2.0qq同步_qq同步助手2.0 apk下载
  20. java与jasper模板_ireport中使用java进行pdf转化,jasper作为模板

热门文章

  1. 第一章ASP程序设计概述
  2. JAVA环境变量配置方法(Windows)
  3. Sort代码详解学习
  4. 记一次大量数据导入导出SAP系统实验
  5. python大数据毕设选题
  6. IDEA---SVN安装及配置
  7. ioca0中断 pic单片机_PIC单片机学习心得
  8. python怎么通过手机号定位_基于Python的免费手机号码归属地查询
  9. 计算机编程—必备基础知识点
  10. xencenter服务器不显示,XenCenter 不能连接 XenServer 解决方法