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

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.lryc.cn/news/480042.html

相关文章:

  • LeetCode题练习与总结:迷你语法分析器--385
  • Unity WebGL交互通信
  • 王道考研之数据结构
  • 实习冲刺Day17
  • 我自己nodejs练手时常用的一些库基础用法
  • 岛屿数量问题
  • 智能制造基础- TPM(全面生产维护)
  • C++学习笔记----11、模块、头文件及各种主题(一)---- 模板概览与类模板(4)
  • 【力扣热题100】[Java版] 刷题笔记-160. 相交链表
  • 多线程和线程同步复习
  • 贝式计算的 AI4S 观察:使用机器学习对世界进行感知与推演,最大魅力在于横向扩展的有效性
  • 容器化技术入门:Docker详解
  • 基于SSM(Spring + Spring MVC + MyBatis)框架的药房管理系统
  • 在服务器里安装2个conda
  • web安全漏洞之ssrf入门
  • 《NoSQL 基础知识总结》
  • 高校宿舍信息管理系统小程序
  • 2.索引:MySQL 索引分类
  • sklearn红酒数据集分类器的构建和评估
  • 【IC验证面试常问-4】
  • 【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
  • 书生浦语第四期基础岛L1G4000-InternLM + LlamaIndex RAG 实践
  • 基于ViT的无监督工业异常检测模型汇总
  • 数据库管理-第258期 23ai:Oracle Data Redaction(20241104)
  • 运放进阶篇-多种波形可调信号发生器-产生方波-三角波-正弦波
  • CSS中的变量应用——:root,Sass变量,JavaScript中使用Sass变量
  • WPF+MVVM案例实战与特效(二十八)- 自定义WPF ComboBox样式:打造个性化下拉菜单
  • 速盾:怎么使用cdn加速?
  • C++ 优先算法 —— 三数之和(双指针)
  • YOLOv7-0.1部分代码阅读笔记-yolo.py