介绍
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。
由模板生成PDF的具体流程如下
java代码实现
pom文件引用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pdf</groupId>
<artifactId>pdf</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.6</version>
</dependency>
</dependencies>
</project>
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(images/${KHWD!"0"}.jpg);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>
main函数调用
public static void main(String[] args) throws Exception {
// 这里是选择某个模板
String templateName = "201";
Map<String, Object> paramMap = new HashMap<String, Object>();
//这里是给具体的某些字段赋值
paramMap.put("ZJHKZH", "271003********279975");
paramMap.put("KYYE", "79244.95");
paramMap.put("LXFS", "配置web.xml中LXFS属性,例如(张小凡,123,4567,8909)");
paramMap.put("KHWD", "123");
paramMap.put("CSKSRQ", "2016年10月31日00时00分");
paramMap.put("KSRQ", "2017-03-14");
paramMap.put("YE","94444.95");
paramMap.put("KHZH","271**********07279975");
paramMap.put("AH", "(2015)****字第0***0号");
paramMap.put("CKH", "(2017)法YH****9控字第*号");
paramMap.put("YDJAH", "(2015)***执字第00020号");
paramMap.put("KZCS", "01");
paramMap.put("XM", "秀不行不行的。哈哈哈哈!!");
paramMap.put("FYMC", "****人民法院");
paramMap.put("JSRQ", "2017-06-14");
paramMap.put("KZZT", "1");
paramMap.put("SE", "100");
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("questionMainOrder","ygc");
paramMap.put("standardScore","sunny");
//调用具体的实现方法
contractHandler(templateName, paramMap);
}
定义变量
private static final String TEMPLATE = "D:\\project\\pdf\\src\\main\\webapp\\templates\\";//模板存储路径
private static final String CONTRACT = "D:\\project\\pdf\\src\\main\\webapp\\contract\\";
private static final String PDFNAME = "pdfDemo";//pdf文件名
private static final String HTMLNAME = "pdfDemo";//html文件名
contractHandler方法
public static void contractHandler(String templateName,
Map<String, Object> paramMap) throws Exception {
// 获取本地模板存储路径、合同文件存储路径
String templatePath = TEMPLATE;
String contractPath = CONTRACT;
// 组装html和pdf合同的全路径URL
String localHtmlUrl = contractPath + HTMLNAME + ".html";
String localPdfPath = contractPath + "/";
// 判断本地路径是否存在如果不存在则创建
File localFile = new File(localPdfPath);
if (!localFile.exists()) {
localFile.mkdirs();
}
String localPdfUrl = localFile + "/" + PDFNAME + ".pdf";
templateName = templateName + ".ftl";
htmHandler(templatePath, templateName, localHtmlUrl, paramMap);// 生成html合同
pdfHandler(localHtmlUrl, localPdfUrl);// 根据html合同生成pdf合同
deleteFile(localHtmlUrl);// 删除html格式合同
System.out.println("PDF生成成功");
}
生成HTML格式合同
private static void htmHandler(String templatePath, String templateName,
String htmUrl, Map<String, Object> paramMap) throws Exception {
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("UTF-8");
cfg.setDirectoryForTemplateLoading(new File(templatePath));
Template template = cfg.getTemplate(templateName);
File outHtmFile = new File(htmUrl);
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outHtmFile)));
template.process(paramMap, out);
out.close();
}
生成PDF格式合同
private static void pdfHandler(String htmUrl, String pdfUrl)
throws DocumentException, IOException {
File htmFile = new File(htmUrl);
File pdfFile = new File(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(TEMPLATE+"simsun.ttc",
// BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
try {
fontResolver.addFont(TEMPLATE + "simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (com.itextpdf.text.DocumentException e) {
e.printStackTrace();
}
renderer.layout();
try {
renderer.createPDF(os);
} catch (com.itextpdf.text.DocumentException e) {
e.printStackTrace();
}
os.close();
}
删除HTML文件
private static void deleteFile(String fileUrl) {
File file = new File(fileUrl);
file.delete();
}
大功告成
根据上述代码即可生成PDF文件啦,当然运用到项目中还是需要做适当的变化的
PDF结果如下: