PDF模板制作与填充(Java)

1.PDF模板制作
  • 准备原始模板

准备一个原始PDF模板,可以编辑好Word,预留出要填充的部分,再转换成PDF格式。

  • 设置表单域

用任意PDF编辑器打开PDF模板文件,设置表单域,下面以WPS为例:



拖动文本域到需要填充的位置,调整区域大小和位置,然后双击设置文本域属性




此处我添加了3个文本域,分别是NAME (姓名)、GENDER (性别)、IDNUMBER(身份证号),然后保存即可。

2.相关依赖
xml 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.1.2</version>
</dependency>
3.模板填充
java 复制代码
package com.visy.utils;

import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author visy.wang
 * @date 2024/11/7 18:29
 */
public class PdfUtil {
    private final static Logger logger = LoggerFactory.getLogger(PdfUtil.class);

    /**
     * PDF模板填充
     * @param tmplUrl 模板地址(可以是本地文件路径,也可以是Url)
     * @param targetFile 目标PDF(基于模板填充后的输出)
     * @param fieldMap 表单域(<表单域名称,表单域填充值>)
     */
    public static void templateFill(String tmplUrl, File targetFile, Map<String, Object> fieldMap){
        ByteArrayOutputStream bos = null;
        FileOutputStream fos = null;
        try {
            PdfReader reader = new PdfReader(tmplUrl);
            PdfStamper ps = new PdfStamper(reader, bos = new ByteArrayOutputStream());

            AcroFields acroFields = ps.getAcroFields();

            //解决中文
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
            acroFields.addSubstitutionFont(bfChinese);

            //模板表单域赋值
            Map<String, AcroFields.Item> fields = acroFields.getFields();
            for (Map.Entry<String, AcroFields.Item> field : fields.entrySet()) {
                String fieldName = field.getKey();
                if(Objects.nonNull(fieldName) && fieldMap.containsKey(fieldName)){
                    Object fieldValue = fieldMap.get(fieldName);
                    acroFields.setField(fieldName, Objects.isNull(fieldValue) ? "" : fieldValue.toString());
                }
            }

            ps.setFreeTextFlattening(true);
            ps.setFormFlattening(true);
            ps.close();

            fos = new FileOutputStream(targetFile);
            fos.write(bos.toByteArray());
            fos.flush();
        }catch (Exception e){
            logger.info("fillPdfTemplate error: {}", e.getMessage(), e);
            throw new RuntimeException(e.getMessage(), e);
        }finally {
            try{
                if(Objects.nonNull(fos)){
                    fos.close();
                }
                if(Objects.nonNull(bos)){
                    bos.close();
                }
            }catch(Exception e){
                logger.info("fillPdfTemplate close error: {}", e.getMessage(), e);
            }
        }
    }

    public static void main(String[] args) {
        String tmplUrl = "E:\\test\\pdf\\PDF测试模板.pdf";
        File targetFile = new File("E:\\test\\pdf\\目标PDF.pdf");
        Map<String,Object> fieldMap = new HashMap<>();
        fieldMap.put("NAME", "张三");
        fieldMap.put("GENDER", "男");
        fieldMap.put("IDNUMBER", "513126198803120435");

        //基于模板生成文件
        templateFill(tmplUrl, targetFile, fieldMap);

        System.out.println("生成完毕:"+targetFile.getAbsolutePath());
    }
}
4.控制台输出
java 复制代码
生成完毕:E:\test\pdf\目标PDF.pdf
5.目标PDF
相关推荐
Theodore_10221 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸2 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象3 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了3 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·3 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王4 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神4 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342735 小时前
Java实现离线身份证号码OCR识别
java·开发语言