一、常用根据模板创建pdf两种方式
- (创建**.ftl模板**)文本复制到word -> 转html -> 写好模板参数 -> 转成.ftl
(使用模板)获取.ftl文件 -> 填充参数 -> 转html -> 创建pdf将要生成pdf的文本复制到word,在要填充参数的地方写上${}(FTL语法),再转换成html(这里注意不要用word自带的另存为转成html,会出现字符编码、缺少标签等很多的问题),将html文件的后缀改成.ftl,这样这个.ftl文件就是搞好的pdf模板了。
- 直接创建pdf模板,使用Adobe Acrobat DC工具给pdf填充文本域,保存后即为模板。(使用模板)获取pdf模板 -> 填充参数 -> 创建pdf
这篇文章就先只介绍方式2(pdf模板创建pdf)
二、使用pdf模板创建pdf
1.创建PDF模板
工具资源https://download.csdn.net/download/qq_43647116/46414910
我使用的是Adobe Acrobat DC工具,以下操作为该软件的流程。
1.将要制作为模板的pdf用Adobe Acrobat DC打开,如下界面。
2.找到并点击准备表单,工具 ->表单和签名->准备表单,点击后选择开始即可。
3.添加文本域
工具会自动查找需要添加文本域的地方,还是挺智能的,也可以手动添加。如果添加图片,也要使用文本域,虽然有个图片域,但是使用图片域添加图片不能对图片进行缩放。
4.保存后就是项目中要用的pdf模板啦。
Java实现代码
所需依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
代码
public class CreatePdf {
public static void main(String[] args) throws Exception {
createPdf();
}
/**
* Adobe Acrobat Pro DC 创建模板
*
* @throws Exception
*/
public static void createPdf() throws Exception {
// 填充创建pdf
PdfReader reader = null;
PdfStamper stamp = null;
String pdfTemplatePath = "D:\\idea\\workspace\\project\\project_1\\project\\test\\src\\main\\resources\\template.pdf";
String createPath = "D:\\idea\\workspace\\project\\project_1\\project\\test\\src\\main\\resources\\";
try {
reader = new PdfReader(pdfTemplatePath);
String time = new SimpleDateFormat("dd-HH-mm-ss").format(new Date());
// 创建生成报告名称
File stampFile = new File(createPath, time + ".pdf");
stamp = new PdfStamper(reader, new FileOutputStream(stampFile));
// 取出报表模板中的所有字段
AcroFields form = stamp.getAcroFields();
// 填充数据,对应文本域名称
// form.setField("fill_1", "张三");
// form.setField("fill_2", "21");
form.setField("fill_3", "2021");
form.setField("fill_4", "21");
form.setField("fill_5", "91");
// 实际项目中可以遍历map装入数据
// for (Entry<String, String> entry : map.entrySet()) {
// form.setField(entry.getKey(), entry.getValue());
// }
// 插入图片
int pageNo = form.getFieldPositions("image").get(0).page;
Rectangle signRect = form.getFieldPositions("image").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 图片路径,url或绝对路径都可
Image image = Image.getInstance("https://pics1.baidu.com/feed/f2deb48f8c5494ee9189fe82cd246ff89b257ede.jpeg?token=e5fe9ba1fd2d2324f8981468d8ad329a");
// 获取操作的页面
PdfContentByte under = stamp.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
// 这里true表示pdf可编辑
stamp.setFormFlattening(true);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stamp != null) {
stamp.close();
}
if (reader != null) {
reader.close();
}
}
}
}