使用Java生成PDF文件

使用Java生成PDF文件java 使用 itext 生成 pdf 直接执行 main 方法可用

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

首先引入pom依赖

 
   
   
   
     com.itextpdf 
    
   
     itextpdf 
    
   
     5.5.11 
    
   
   
   
     com.itextpdf.tool 
    
   
     xmlworker 
    
   
     5.5.11 
    
   
   
   
   
     com.itextpdf 
    
   
     itext-asian 
    
   
     5.2.0 
    
   
   
   
   
     org.xhtmlrenderer 
    
   
     flying-saucer-pdf-itext5 
    
   
     9.1.16 
    
   
   
   
   
     net.sf.jtidy 
    
   
     jtidy 
    
   
     r938 
    
   
  

将生成代码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
  
  
  
  
  
  
  
    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 
  
    contractParam;// 合同所需参数 public ContractDynamicParam(String templatePath, String templateName, String contractPath, String contractName, Map 
   
     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 
  
    paramMap = new HashMap 
   
     (); paramMap.put("XM", "張三冯"); paramMap.put("AH", "(2015)字第0*0号"); paramMap.put("CSKSRQ", "2016年10月31日00时00分"); paramMap.put("KHZH", ""); paramMap.put("FYMC", "人民法院"); paramMap.put("JSRQ", "2017-06-14"); paramMap.put("KZZT", "1"); paramMap.put("LCZH", ""); paramMap.put("DATE", "2017年03月24日09时39分"); paramMap.put("CKWH", "(2015)*字第020-10号裁定书"); 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下载频道.使用Java生成PDF文件https://download.csdn.net/download/enhengguodong/85007061

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218533.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:01
下一篇 2026年3月18日 上午7:02


相关推荐

  • swing58_ML2437A

    swing58_ML2437A给定一个长度为 n 的整数序列,初始时序列为 {1,2,…,n−1,n}。序列中的位置从左到右依次标号为 1∼n。我们用 [l,r] 来表示从位置 l 到位置 r 之间(包括两端点)的所有数字构成的子序列。现在要对该序列进行 m 次操作,每次操作选定一个子序列 [l,r],并将该子序列中的所有数字进行翻转。例如,对于现有序列 1 3 2 4 6 5 7,如果某次操作选定翻转子序列为 [3,6],那么经过这次操作后序列变为 1 3 5 6 4 2 7。请你求出经过 m 次操作后的序列。输入格式第

    2022年8月10日
    9
  • 由于插件问题导致PyCharm卸载重装后打不开

    由于插件问题导致PyCharm卸载重装后打不开由于插件问题导致 PyCharm 卸载重装后打不开前因解决方法写在最后前因由于本人的 PyCharm 是 2020 年版本的 因为是当年下载的嘛 这些天接到一个项目 和别人对接代码后发现该项目采用的 python 版本是 3 10 我也不知道为什么要用到怎么高的版本 而且我 2020 年的版本的 PyCharm 不支持 3 10 o 最后想了想还是升级一下 PyCharm 吧 然后卸载旧版 PyCharm 的时候没有勾选删除旧的设定还有插件 这导致了在重装新版的时候会自动下载会插件 问题就在这里 因为我的插件里有的

    2026年3月27日
    2
  • 解决Destroying ProtocolHandler [“ajp-apr-8009“]

    解决Destroying ProtocolHandler [“ajp-apr-8009“]今天刚开始调JSP网站,还好好的,后来中间注销了电脑一次,再打开调试它,就遇到了这个无法启动服务器的问题:DestroyingProtocolHandler[“ajp-apr-8009”]上网百度了下,说是端口号被占用了。解决办法:1、查看端口号被占用情况:步骤:调出命令窗:开始->运行->cmd,然后输入命令:netstat-ano如图(记下来占用该

    2025年8月26日
    5
  • POSTMAN自动生成接口文档_接口测试用例自动生成工具

    POSTMAN自动生成接口文档_接口测试用例自动生成工具介绍drf-spectacular是为DjangoRESTFramework生成合理灵活的OpenAPI3.0模式。它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不

    2022年7月30日
    12
  • 基于DNS的GSLB,基于应用重定向的GSLB,基于主机路由注入的GSLB

    基于DNS的GSLB,基于应用重定向的GSLB,基于主机路由注入的GSLB基于DNS的GSLB,基于应用重定向的GSLB,基于IP地址伪装(三角传输)的GSLB,基于主机路由注入的GSLB(Anycast)引言在过去的几年中,随着互联网的快速发展和企业应用WEB化,服务器负载均衡(SLB)技术已经不再陌生。服务器负载均衡根据用户数据请求中的4-7层信息将其智能转发到后端少则数台多则成…

    2022年5月9日
    48
  • asp.net中通过input file上传文件

    asp.net中通过input file上传文件前台: 后台:

    2022年7月17日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号