图一为原有的pdf格式的模板,图中的蓝色区域是可以填充内容的区域,区域固定不可根据填充的内容自动扩充。为了可以使模板更加灵活,设计了html模板,如图二所示,该模板构造为:第1部分是一个样式居中的<div>标签,第2、4部分是一个<table>表格,第3部分是一个具有首行缩进样式的<div>标签。
2.准备fft格式的字体文件,用户html生成pdf时的字体渲染。
二、开发工作
1.创建maven项目,导包
<!-- 添加itext 7 用到的包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>${itext.version}</version>
<type>pom</type>
</dependency>
<!--itext7 html转pdf用到的包-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>2.0.0</version>
</dependency>
<!--itext7支持中文-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.1.2</version>
</dependency>
<!--jsoup 操作html的包-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
2.将准备的字体和html模板复制到项目的resources目录中。
* @param baseUri html用到的css、js、图片等资源根目录。
* @param src html模板文件路径
* @param dest 生成的pdf文件输出的路径
* @throws IOException
public void createPdf(String baseUri, String src, String dest) throws IOException {
try {
//字体方案
fontProgram = FontProgramFactory.createFont(FONT);
//转换为pfd中的属性设置对象
ConverterProperties proper = new ConverterProperties();
//字体设置,解决中文不显示问题
FontSet fontSet = new FontSet();
fontSet.addFont(fontProgram, PdfEncodings.IDENTITY_H);
FontProvider fontProvider = new FontProvider(fontSet);
proper.setFontProvider(fontProvider);
//html用到的css、js、图片等资源根目录。
proper.setBaseUri(baseUri);
//开始转换
HtmlConverter.convertToPdf(new FileInputStream(src),
new FileOutputStream(dest), proper);
} catch (java.io.IOException e) {
e.printStackTrace();
准备一篇文章,如下图三所示,该文章的大小为1.07MB,将这些文字填充到html中的效果图为图四,执行程序转成pdf文件,所有时间为1680ms。