java 模板转PDF(合同)详细讲解
我是一个刚刚入职的小白,领导扔给我一个word文档合同模板,然后去生成一个PDF电子签章,话不多说直接看代码,
导入jar包
<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>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.9</version>
</dependency>
模板合同
这里需要注意的是,领导给我的是word文档需要转换成html格式,链接: 在线转换格式.转换html完成后,把html代码所有内容复制到**.ftl**文件,如图和代码![在这里插入图片描述](https://img-blog.csdnimg.cn/20201201163843671.png
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="Aspose.Words for .NET 15.1.0.0" />
<title></title>
<style>
body{
font-family: SimSun;
padding: 0pt 45pt 0pt;
}
</style>
</head>
<body>
<div>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:center; widows:0"><span style=" font-size:14pt; font-weight:bold">XXXX</span><span
style=" font-size:14pt; font-weight:bold">皮皮虾</span><span style=" font-size:14pt; font-weight:bold">XXXXXXXX授权书</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.8pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">尊敬的客户:为了维护您的权益,请在签署本授权书前,仔细阅读本授权书各条款(特别是黑体字条款),关注您的权利、义务</span><span
style=" font-size:10.5pt">。如有任何疑问,请向经办人咨询。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.8pt; widows:0"><span
style=" font-size:10.5pt"> </span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; widows:0"><span style=" font-size:10.5pt; font-weight:bold">XXXXXXXXXXXXXXXX</span><span
style=" font-size:10.5pt; font-weight:bold">有限公司</span><span style=" font-size:10.5pt">:</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt 0.75pt; orphans:0; text-align:justify; text-indent:21pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">一</span><span style=" font-size:10.5pt; font-weight:bold">、</span><span
style=" font-size:10.5pt; font-weight:normal">XXXXXXXXX不可撤XXXXXXXX:</span><span style=" font-size:10.5pt; font-weight:bold">贵司</span><span
style=" font-size:10.5pt; font-weight:bold">按照国家相关规定采集并向金融信用信息基础数据库及其他依法成立的征信机构提供XXXXXXXXXXXXXXXXXXX在内的信用信息(包含XXXXXXXXXXXXXX合同义务产生的</span><span
style=" font-size:10.5pt; font-weight:bold; text-decoration:underline">不良</span><span style=" font-size:10.5pt; font-weight:bold">信息</span><span
style=" font-size:10.5pt; font-weight:bold">)</span><span style=" font-size:10.5pt; font-weight:bold">。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt 0.75pt; orphans:0; text-align:justify; text-indent:21pt; widows:0"><span
style=" font-size:10.5pt">二</span><span style=" font-size:10.5pt">、</span><span
style=" font-size:10.5pt; font-weight:bold">本人知悉</span><span style=" font-size:10.5pt; font-weight:bold">贵司</span><span
style=" font-size:10.5pt; font-weight:bold">向征信机构提供不良信用信息前,可以选择以电子邮件、短信、纸质信件等任一方式通知XXXXXX</span><span
style=" font-size:10.5pt; font-weight:bold">,其中以电子邮件、短信方式发出通知的,发出即视为通知有效送达</span><span style=" font-size:10.5pt; font-weight:bold">。本人知悉,当本人联系信息变更时,需要及时更新,确保及时收到通知。若本人未及时更新,本人留存的联系方式视为有效联系方式,通过该联系方式通知本人时,视为有效送达本人。但是,依照法律、行政法规规定公开的不良信息除外。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt 0.75pt; orphans:0; text-align:justify; text-indent:21pt; widows:0"><span
style=" font-size:10.5pt">三</span><span style=" font-size:10.5pt">、XXXXXXXX同意并不可撤销地XXXXXXX:</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">根据国家有关规定,在办理涉及本人的业务时,有权向金融信用信息基础数据库及其他依法成立的征信机构查询、打印、保存本人的</span><span
style=" font-size:10.5pt; font-weight:bold">个人信息及</span><span style=" font-size:10.5pt; font-weight:bold">信用信息,并用于下述用途:</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:15.75pt; widows:0"><span
style=" font-size:10.5pt">(一)审核本人</span><span style="font-family:仿宋_GB2312; font-size:10.5pt">(</span><span
style=" font-size:10.5pt">本人配偶</span><span style=" font-size:10.5pt">、XXX借款人、XXXXX借款人配偶)</span><span
style=" font-size:10.5pt"> 就借款向贵司申请融资担保服务</span><span style=" font-size:10.5pt">的办理;</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:15.75pt; widows:0"><span
style=" font-size:10.5pt">(二)审核本人作为提出</span><span style=" font-size:10.5pt">XXXXXXXXXX申请</span><span
style=" font-size:10.5pt">的XX、组织或机构的XX人、XX人、XX人、XX人、XX者、XX人或XX团队主要成员的信用信息;</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:15.75pt; widows:0"><span
style=" font-size:10.5pt">(三)对已向XX或XX人、XX人、XX人、XX者、XX个人、XX或XX</span><span style=" font-size:10.5pt">提供</span><span
style=" font-size:10.5pt">的</span><span style=" font-size:10.5pt">XXXXXXXXXX服务</span><span
style=" font-size:10.5pt">进行</span><span style=" font-size:10.5pt">提供后的</span><span
style=" font-size:10.5pt">XXXXX管理;</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:15.75pt; widows:0"><span
style=" font-size:10.5pt">(四)审核XXXXXXXX异议申请;</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:15.75pt; widows:0"><span
style=" font-size:10.5pt">(五)向XXXXXXXX的其他</span><span style=" font-size:10.5pt">贵司</span><span
style=" font-size:10.5pt">合法XX范围内的业务</span><span style=" font-size:10.5pt">,XX与XX业务相关的XX咨询业务,XX顾问中介服务等</span><span
style=" font-size:10.5pt">。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.6pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">四</span><span style=" font-size:10.5pt; font-weight:bold">、如果</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">超出XX权XX进行XXXXXXX和XXX使用,则</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">应XXXX与此有关的法律责任。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt 7.15pt; orphans:0; text-align:justify; text-indent:15.45pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">五</span><span style=" font-size:10.5pt; font-weight:bold">、</span><span
style="font-family:仿宋; font-size:14pt; font-weight:normal"> </span><span style=" font-size:10.5pt; font-weight:bold">若本人在</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">业务XX办理,XX接受</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">文件管理要求将XX授权书及XX信用报告XX</span><span
style=" font-size:10.5pt; font-weight:bold">贵司</span><span style=" font-size:10.5pt; font-weight:bold">留存,无须退回XX</span><span
style=" font-size:10.5pt; font-weight:bold">。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.6pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">六</span><span style=" font-size:10.5pt; font-weight:bold">、本授权书内容与相关业务的合同条款不一致的,无论相关合同在本授权书之前或之后签署,XX以本授权书的XX为准,但相关合同条款明确约定是针对本授权书XXXXX所做XXXXX的除外。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.6pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold"> </span><span style=" font-size:10.5pt; font-weight:bold">七</span><span
style=" font-size:10.5pt; font-weight:bold">、本授权书有效期至XXXXX业务结清或终止之日止(XXXX征信异议XXXX除外)。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.6pt; widows:0"><span
style=" font-size:10.5pt; font-weight:bold">XXXXXX声明:XXXXX已仔细阅读上述所有条款,并已特别注意字体加黑的内容。</span><span style=" font-size:10.5pt; font-weight:bold">贵司</span><span
style=" font-size:10.5pt; font-weight:bold">已应XXXXXXX要求对相关条款予以XXXXXXXX。XXXXX对所有条款的含义及相应的XXXXX已全部</span><span
style=" font-size:10.5pt; font-weight:bold; text-decoration:underline">知晓</span><span style=" font-size:10.5pt; font-weight:bold">并充分理解,XXXXXXX自愿作出上述授权、XXXX和XXXXX。XXXXX承诺本授权书授权事项为不可撤销之授权,XXXXXX签字或以其他方式确认之XXXXXXXXXX。</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; text-indent:20.6pt; widows:0"><span
style="font-family:Calibri; font-size:10.5pt; font-weight:bold"> </span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; padding-left:6.2pt; text-align:justify; text-indent:-6.2pt; widows:0"><span
style=" font-size:10.5pt">本人(签名):${pre.myName} 联系电话:${pre.phone}</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; padding-left:6.2pt; text-align:justify; text-indent:-6.2pt; widows:0"><span
style=" font-size:10.5pt">证件名称:${pre.cerName} 证件号码:${pre.cerNumber} </span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; padding-left:6.2pt; text-align:justify; text-indent:-6.2pt; widows:0"><span
style=" font-size:10.5pt">联系地址:</span><span style=" font-size:10.5pt">${pre.address} </span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; padding-left:6.2pt; text-align:justify; text-indent:-6.2pt; widows:0"><span
style=" font-size:10.5pt">签署日期:${pre.year}年${pre.month}月${pre.day}日</span></p>
<p style="line-height:22pt; margin:0pt 0pt 1pt; orphans:0; text-align:justify; widows:0"><span style="font-family:Calibri; font-size:10.5pt; font-weight:bold"> </span></p>
</div>
</body>
</html>
Controller层
package com.nswt.credit.ws.file;
import com.nswt.common.util.FtlToHtml;
import com.nswt.common.util.HtmlToPdf;
import com.nswt.credit.model.file.Guarantee;
import com.nswt.credit.model.file.PerLetter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
@RestController
@RequestMapping("/api/pdf")
@Transactional(rollbackFor = Throwable.class)
@Slf4j
public class PdfController {
@Autowired
HtmlToPdf htmlToPdf;
@RequestMapping(method = RequestMethod.POST, value = "createGuarantee")
public void getGuarantee(@RequestBody Guarantee gua) throws Exception {
//模板名称
String templateName = "Text.ftl";
//获取当前时间
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
int year = calendar.get(Calendar.YEAR);
gua.setYear(String.valueOf(year));
int month = calendar.get(Calendar.MONTH) + 1;
gua.setMonth(String.valueOf(month));
int day = calendar.get(Calendar.DATE);
gua.setDay(String.valueOf(day));
Map<String, Object> map = new HashMap<>();//构建模板所需数据
map.put("gua", gua);
FtlToHtml ftlToHtml = new FtlToHtml();
String html = ftlToHtml.getHtmlString(templateName, map);
//生成PDF
htmlToPdf.makePdf(html);
}
}
实体类Guarantee
package com.nswt.credit.model.file;
import lombok.Data;
import java.util.Date;
@Data
public class Guarantee {
//本人姓名
private String myName;
//联系电话
private String phone;
//身份证号
private String idNumber;
//地址
private String address;
//签署日期
private Date date;
private String year;
private String month;
private String day;
}
工具类FtlToHtml
package com.nswt.common.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
/**
* @Description: 根据模板转换为html
* @Auther: Shierbao⸙
* @Date: 2019/11/3 20:14
*/
@Component
@Slf4j
public class FtlToHtml {
/**
* 功能描述: 根据模板及数据模型获取html字符串
* @param ftlName: ftl模板名称
* @param mode: 数据模型
* @return: java.lang.String
* @date: 2019/11/3 20:28
*/
public String getHtmlString(String ftlName, Map<String, Object> mode){
String sysname = System.getProperty ("os.name");
String path = "";
if (sysname != null && sysname.toLowerCase().contains("windows")) {
//windows系统
path = this.getClass().getResource("/").toString().replaceAll("file:/", "");
} else {
//linux或unix系统
path = "/home/risk/app/mservices/risk-job-executor/resources";
}
String ftlPath = path + "/file/ftl";
Writer writer = null;
String htmlContent = "";
try {
//创建freeMarker配置实例
Configuration configuration = new Configuration(Configuration.getVersion());
// 获取模版路径
configuration.setDirectoryForTemplateLoading(new File(ftlPath));
//设置模板编码格式
configuration.setDefaultEncoding("UTF-8");
configuration.setNumberFormat("#.#######");
//加载模版文件
Template template = configuration.getTemplate(ftlName);
writer = new StringWriter();
//替换模板
template.process(mode, writer);
//获取内容
htmlContent = writer.toString();
} catch (Exception e) {
throw new RuntimeException("模板转换失败");
} finally {
try {
if (null != writer) {
writer.flush();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return htmlContent;
}
}
工具类HtmlToPdf
@Component
public class HtmlToPdf {
public void makePdf(String html) throws Exception {
// html = html.replaceAll("\"", "'").replaceAll("<style>", "<style>body{font-family:simsun;}</style>"); //注意这里为啥要写这个,主要是替换成这样的字体,如果不设置中文有可能显示不出来。
// System.out.println(html);
String id = IdUtils.create();//这里是随机生成窜字符,做练习可以去掉,id需要改变
File pdfOutputFile = new File("F:/", id + ".pdf");
OutputStream os = new FileOutputStream(pdfOutputFile); //生成PDF文件的路径
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver font = renderer.getFontResolver();
font.addFont("F:/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//添加中文识别,这里是设置的宋体,Linux下要换成对应的字体
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(os);
renderer.finishPDF();
}
}
测试结果
总结
word文档转HTML,然后把HTML代码全部复制到**.ftl文件下,利用工具类FtlToHtml把.ftl文件的内容以字符串类型输出,最后利用工具类HtmlToPdf把字符串类型的HTML代码转成PDF即可。