Java基于itext实现pdf模板填充

Itext简介

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库 。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件 。iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了 。

准备工作

【Java基于itext实现pdf模板填充】第一步,使用Word编辑一个模板(template.docx),然后另存为PDF文件(template.pdf)


Java基于itext实现pdf模板填充

word模板


第二步,使用pdf编辑工具(Adobe Acrobat Pro)打开template.pdf,点击准备表单,增加变量文本域


Java基于itext实现pdf模板填充

编辑pdf模板


这样一个pdf模板就准备好了

功能实现

  • 添加maven依赖,本教程基于Itext5实现
com.itextpdfitextpdf5.5.10com.itextpdfitext-asian5.2.0
  • 创建实体类
@Data@NoArgsConstructor@AllArgsConstructor@Builderstatic class Leave {private String name;private String year;private String month;private String day;private String reason;private String beginDate;private String endDate;private String phone;}
  • 创建工具类
import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;import java.beans.PropertyDescriptor;import java.io.File;import java.io.FileOutputStream;import java.lang.reflect.Field;public class ReflectPdfUtil {public static void createPdf(T t, String templatePath, String targetPath) throws Exception {PdfReader reader = null;PdfStamper stamp = null;try {reader = new PdfReader(templatePath);if (!new File(templatePath).exists())new File(templatePath).mkdirs();Integer index = targetPath.lastIndexOf("/");String filename = targetPath.substring(index1);String filepath = targetPath.substring(0, index);File deskFile = new File(filepath, filename);stamp = new PdfStamper(reader, new FileOutputStream(deskFile));AcroFields form = stamp.getAcroFields();Field[] declaredFields = t.getClass().getDeclaredFields();for (Field field:declaredFields) {String fieldName = field.getName();PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, t.getClass());form.setField(fieldName, descriptor.getReadMethod().invoke(t).toString());}stamp.setFormFlattening(true);} catch (Exception e) {e.printStackTrace();} finally {if (stamp != null) {stamp.close();}if (reader != null) {reader.close();}}}}
  • 创建测试类
public class Test {public static void main(String[] args) throws Exception {Leave leave = Leave.builder().name("张三").year("2021").month("03").day("10").reason("身体不适").beginDate("2021-03-11").endDate("2021-03-12").phone("13800000000").build();createPdf(leave, "test-demo/data/template.pdf", "test-demo/data/张三的请假条.pdf");}}
最终效果


Java基于itext实现pdf模板填充

效果图

相关经验推荐