当前位置: 首页 > article >正文

PDF模板制作与填充(Java)

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

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

  • 设置表单域

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

2.相关依赖
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.1.2</version>
</dependency>
3.模板填充
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.控制台输出
生成完毕:E:\test\pdf\目标PDF.pdf
5.目标PDF

在这里插入图片描述


http://www.kler.cn/a/385399.html

相关文章:

  • 用 Collections.synchronizedSet 创建线程安全的 HashSet
  • 软考系统架构设计师论文:论边缘计算及其应用
  • Ubuntu22.04安装DataEase
  • 一:时序数据库-Influx应用
  • Me-LLaMA——用于医疗领域的新型开源大规模语言模型
  • 内置函数【MySQL】
  • 高级SQL技巧:提升数据库性能与查询效率
  • 【每日一题】2015考研数据结构 - 求不重复的链表元素
  • 使用PEFT在多个AMD GPU上进行StarCoder的指令微调
  • 【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)
  • vue之组件网站(后续补)
  • Java基础Day-Fourteen
  • [产品管理-59]:项目组合中产品或项目的类型分类
  • 【电机控制器】STC8H1K芯片——UART串口通信
  • 【K8S系列】K8S 集群 CPU 爆满导致 Pod Pending 状态的分析与解决方案
  • MySQL 到 ClickHouse 数据同步优化(三)
  • Redis3:Hash类型、List类型、Set类型、SortedSet类型
  • Am I Isolated:一款安全态势基准测试工具
  • 【数据集】【YOLO】【目标检测】摔跤识别数据集 5097 张,YOLO行人摔倒识别算法实战训练教程!
  • 自动打电话机器人,好用吗?
  • Trimble X12三维激光扫描仪正在改变游戏规则【上海沪敖3D】
  • UE4/5 编译报错 MSB3073
  • 【Python图像处理】进阶实战指南
  • Spark集群模式搭建之Yarn模式
  • NoETL自动化指标平台为数据分析提质增效,驱动业务决策
  • 域名+服务器+Nginx+宝塔使用SSL证书配置HTTPS