使用itext操作填充pdf模板(Java)

1,624 阅读2分钟

问题

在日常工作中需要自定义填充pdf

一.前期准备

1.工具下载

我尝试使用了两个软件:

  1. 万兴PDF,比较好用、一摸就会,但是耐不住要花钱充会员
  2. AcrobatPro DC2022(绿色版),网上有很多版本,但是大部分会安装失败。 这里提供我使用的安装包。
  3. 链接:mp.weixin.qq.com/s/9FKqcg8NE… (教程来自:软件管家)

2.制作pdf

(1)准备pdf:创建word表格并转换为pdf image.png (2)创建pdf表单:将pdf文件在AcrobatPro DC里打开,然后选择工具----》准备表单 image.png 之后如下图,双击表格----》设置文本域属性----》在”一般“里设置名称(关键字)----》可以在”外观“ 里设计字体大小和字体----》可以在”选项“里设置对齐方式。pdf设置完成 image.png

二.实现

1.依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
<!--pdf合并使用-->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.4</version>
</dependency>

2.代码

@Test
public void testPdf() {
    String inputFileName = "C:\Users\86155\Desktop\学习信息登记表.pdf";//pdf模板路径
    String outputFileName = "C:\Users\86155\Desktop\1.pdf";//输出路径
    OutputStream os = null;
    PdfStamper ps = null;
    PdfReader reader = null;
    try {
        os = new FileOutputStream(new File(outputFileName));
        reader = new PdfReader(inputFileName);// 读入pdf表单
        ps = new PdfStamper(reader, os);// 根据表单生成一个新的pdf
        AcroFields form = ps.getAcroFields();// 获取pdf表单
        // 给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
        //方法一:使用自定义文件中的字体
        //BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simkai.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttf为系统自带,可以该路径下查找
        // 方法二:使用iTextAsian.jar中的字体
        //BaseFont bf =BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//谨慎选用,会出现中文乱码
        BaseFont bf =BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",false);
        form.addSubstitutionFont(bf);
        Map<String, Object> data = new HashMap<String, Object>();// 填充的数据

        data.put("name1","李四");
        data.put("name2","王五");
        data.put("name3","赵六");
        data.put("phone1","17755660022");
        data.put("phone2","18866009911");
        data.put("phone3","19900003456");
        for (String key : data.keySet()) {  // 遍历data 给pdf表单表格赋值
            form.setField(key, data.get(key).toString());
        }
        ps.setFormFlattening(true);
        System.out.println("===============PDF导出成功=============");
    } catch (Exception e) {
        System.out.println("===============PDF导出失败=============");
        e.printStackTrace();
    } finally {
        try {
            ps.close();
            reader.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.结果

填充结果如图: image.png

4.扩展

  1. 问题:将生成的pdf上传云存储器的方法,比如上传到阿里云的oss
  2. 思路:在生成PDF的时候,选择生成一个临时文件,然后在根据文件路径拿到文件,并转为InputStream,就可以上传了。