桃园结义 , 版权所有丨如未注明 , 均为原创丨转载请注明

Java中使用 FreeMarker 生成pdf盖章合同文件

桃园小编 1726次浏览 0个评论 扫描二维码

Java中使用freemarker可以生成word、pdf、html、图片。

本篇博客将详细讲解Java中使用freemarker生成pdf盖章合同。

一、前提条件:

1. itextpdf jar包:iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

2. freemarker/velocity jar包:html内容都是动态渲染的,因此我们需要加入模板引擎支持,可以使用FreeMarker/Velocity,这里使用FreeMarker。

3. xhtmlrenderer jar包:它是基于iText的,支持对CSS高级特性的解析。

4. jpedal jar包:使用Jpedal组件,可以把pdf转成图片。如果需要将pdf转图片,需要用到该jar。

*5*. iText默认是不支持中文的,因此需要添加对应的中文字体,比如黑体simhei.ttf,宋体simsun.ttc。具体字体及源码下载链接:CSDN下载源码字体地址

二、代码:

1.生成合同的动态参数类:

public class ContractDynamicParam {
	private String templatePath;// 模版路径
	private String templateName;// 模板文件名(.ftl结尾)
	private String contractPath;// 合同生成路径
	private String contractName;// 合同生成文件名(.pdf结尾)
	private Map<String, Object> contractParam;// 合同所需参数

   get,set,构造方法省略......

2.生成PDF合同工具类:

public class GeneratePdfUtil {

	private static final String TEMPORARY_CONTRACT_HTML = "src/main/resources/contract/temporary.html";// 临时HTML合同,用于转PDF格式

	private static final String SIMSUM_FILE = "src/main/resources/common/simsun.ttc";// 添加字体,解决中文支持问题

	/**
	 * @Description 生成合同
	 * @author taohanlin
	 * @date 2018年8月27日 下午6:06:46
	 * @action GenerateContract
	 * @return String
	 * @throws Exception
	 */
	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 null;
	}

	/**
	 * @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);

		String url = htmFile.toURI().toURL().toString();

		OutputStream os = new FileOutputStream(pdfFile);
		org.xhtmlrenderer.pdf.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();
	}
}

3.freemarker模版文件:

①contract.ftl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>合同打印</title>
<meta name="viewport" content="width=device-width, initial-scale=0.5"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">body {font-family: SimSun;}</style>
  </head>
  <body >
 <table>
<tr><td><h1 style="font-size:16px;font-weight:700;margin:6px 0;">三、合同金额</h1></td></tr>
<tr><td>合同金额:</td></tr>
<tr><td>人民币  ${capitalMoney}  大写</td></tr>
<tr><td>人民币 ${lowercaseMoney}  小写</td></tr>
<tr><td style="width:400px;height:50px;">电  话:${phone}</td><td style="width:400px;height:50px;"> 电  话:${mobilePhone}</td></tr>
<tr><td style="width:400px;height:50px;">签订时间:${signingTime} </td><td style="width:400px;height:50px;"> 合同结束时间:${endTime}</td></tr>
  </table>
      <p style="margin: 60px 0;">此处加盖代理机构合同审核章,并签署日期(同时甲方、乙方、代理机构加盖骑缝章)</p>
      <h1 style="font-size:16px;font-weight:700;margin:6px 0;text-align: center;">成 交 货 物 清 单</h1>
 
 <table style="border-collapse:collapse;margin:10px 0;borderColor:#000000;height:40;cellPadding:1;width:100%;" align="center" border="1" >
        <tr>
          <td>序号</td><td>品目</td><td>品牌</td><td>产品型号</td><td>单价</td><td>数量</td><td>金额(元)</td>
        </tr>
        ###ordersList###
  </table>
  </body>
</html>

pdfDemo.ftl

<!DOCTYPE HTML>
<html>
	<head>
	
	</head>
	<body style="font-family: SimSun;line-height:1">
		<div style="width:100%;">
			
			<p align="center">
				<span style="font-size:20px;font-weight:bolder;"><b>${FYMC!"   "}</b></span><br/>
				<span style="font-size:25px;font-weight:bolder;"><b>协助执行通知书</b></span><br/>
				<span style="font-size:14px;font-weight:bolder;"><b>(回执)</b></span><br/>
			</p>
				
			<p style="line-height:32px;text-indent:2em">
				<div>${FYMC!"   "}:</div>
			</p>
			<p style="text-indent:2em;word-break:break-all">
			           <div style="padding-left:30px">你院${CKWH}执行裁定书、${AH!"   "}协助执行通知书收悉,我行处理结果如下:</div>
			</p>
			<#if  KZZT == "1">
				<p style="text-indent:2em">
				   
					<div style="padding-left:30px">
					     被执行人(或其他法律地位)${XM!"    "}在我行${KHZH}账户内的
						${LCZH}金融资产
						${SKSE}份(计量单位)已被冻结,冻结期限自
					       ${CSKSRQ}至
					       ${CSJSRQ},该金融资产交易限制将于 ${CSJSRQ}解除。
					</div>
				</p>
			</#if> 
			<#if  KZZT == "2">
				<p style="text-indent:2em">
				     
					<div style="padding-left:30px">
					        因${WNKZYY}原因,被执行人(或其他法律地位)${XM!"    "}在我行
					                ${KHZH}账户内的
					                ${LCZH}金融资产未能冻结。
					  </div>
				     
				</p>
			</#if>
			<div style="background:url(${KHWD!"0"});background-repeat: no-repeat;background-position: center;background-position:top;width:250px;height:250px;margin-right: 10px;margin-top: 100px;float: right;padding-top: 150px;padding-left: 100px;padding-right: 10px">
			     <div style="margin-top: -70px;padding-top: 0px">${DATE!"    "}</div>			
			</div>	
		</div>
	</body>
</html>

4.测试类:

public class GeneratePdfUtilTest {

	private static final String TEMPLATES_PATH = "src/main/resources/templates/";

	private static final String CONTRACT_PATH = "src/main/resources/contract/";

	public static void main2(String[] args) throws Exception {
			Map<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put("capitalMoney", "一千万元整");
			paramMap.put("lowercaseMoney", "10000000.00");
			paramMap.put("phone", "027-123456");
			paramMap.put("mobilePhone", "185****5565");
			paramMap.put("signingTime", "2018.10.21");
			paramMap.put("endTime", "2020.10.21");
		ContractDynamicParam param = new ContractDynamicParam(TEMPLATES_PATH, "contract.ftl", CONTRACT_PATH, "contract.pdf", paramMap);
		GeneratePdfUtil.GenerateContract(param);
		System.out.println("====test2生成PDF合同成功====");
	}

	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合同成功====");
	}
}

5.生成的pdf文件截图:

具体字体及源码下载链接:CSDN下载源码字体地址

百度已收录

桃园结义 , 版权所有丨如未注明 , 均为原创丨转载请注明Java中使用 FreeMarker 生成pdf盖章合同文件

您必须 登录 才能发表评论!