itext生成pdf文件demo示例

需求

在PDF文件中植入一些信息(pdf模版)

制作模版

可以看到下面红色箭头标注位置,这都是我们需要动态写入数据的表单域,可以使用wps等工具来制作

点击编辑表单,可以给对应空间添加表单域,表单域名称是key,在后续我们填充数据时以此来映射

实战

pdf编辑好以后我们就可以开始编写代码了,首先添加Maven坐标

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>

添加pdf处理工具类

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;/*** pdf电子合同工具*/
public class PdfUtil {/*** 根据PDF模版生成PDF文件** @param templateFilePath*            PDF模版文件路径* @param data*            表单数据* @param imageData*            图片数据 VALUE为图片文件路径* @param formFlattening*            false:生成后的PDF文件表单域仍然可编辑 true:生成后的PDF文件表单域不可编辑* @param pdfFilePath*            生成PDF的文件路径*/public static void createPdf(String templateFilePath, HashMap<String, String> data,HashMap<String, String> imageData, boolean formFlattening, String pdfFilePath) throws Exception {PdfReader reader = null;ByteArrayOutputStream bos = null;PdfStamper pdfStamper = null;FileOutputStream fos = null;try {// 读取PDF模版文件reader = new PdfReader(templateFilePath);// 输出流bos = new ByteArrayOutputStream();// 构建PDF对象pdfStamper = new PdfStamper(reader, bos);// 获取表单数据AcroFields form = pdfStamper.getAcroFields();// 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体 Adobe 宋体 std LBaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bfChinese);// 表单赋值for (String key : data.keySet()) {form.setField(key, data.get(key), true);// 也可以指定字体form.setFieldProperty(key, "textfont", bfChinese, null);}// 添加图片if (null != imageData && imageData.size() > 0) {for (String key : imageData.keySet()) {List<AcroFields.FieldPosition> fieldPositions = form.getFieldPositions(key);int pageNo = fieldPositions.get(0).page;Rectangle signRect = form.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 读图片Image image = Image.getInstance(imageData.get(key));// 获取操作的页面PdfContentByte under = pdfStamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}}// 如果为false那么生成的PDF文件还能编辑,一定要设为truepdfStamper.setFormFlattening(formFlattening);pdfStamper.close();// 保存文件fos = new FileOutputStream(pdfFilePath);fos.write(bos.toByteArray());fos.flush();} finally {if (null != fos) {try {fos.close();} catch (Exception e) {e.printStackTrace();}}if (null != bos) {try {bos.close();} catch (Exception e) {e.printStackTrace();}}if (null != reader) {try {reader.close();} catch (Exception e) {e.printStackTrace();}}}}}
public static void main(String[] args) throws Exception {HashMap<String, String> data = new HashMap<>();data.put("busLicenseName", "李四便利店");data.put("provinceName", "李四");data.put("cityName", "深圳");data.put("areaName", "南山区");data.put("address", "科兴科技园");data.put("busLicenseNum", "XXXXXXX");// busLicense 为多选框data.put("busLicense", "Yes");data.put("cardName", "李四");data.put("phone", "手机");data.put("mailbox", "123465798@qq.com");data.put("crpExpY", "2028");data.put("crpExpM", "06");data.put("crpExpD", "10");data.put("idCardNo", "李四身份证");data.put("now", DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN));// HashMap<String, String> data = new HashMap<>();HashMap<String, String> imageData = new HashMap<>();// 在线签名网址:https://tools.kalvinbg.cn/txt/signimageData.put("signPic", "C:\\Users\\XXXX\\Downloads\\Kalvin在线工具签名.png");String templateFilePath = "C:\\Users\\XXXX\\Downloads\\测试pdf.pdf";String pdfFilePath = "C:\\Users\\XXXX\\Downloads\\new_" + "xxxx" + ".pdf";File file = new File(pdfFilePath);// 根据PDF模版生成PDF文件PdfUtil.createPdf(templateFilePath, data, imageData, true, pdfFilePath);
}

最终生成如下,这里有用到文本域、多选按钮、签名植入,下面圈出多选框以及签名图片,文字大小样式可在制作pdf模版时指定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络专线学习

准备工作&#xff1a; https://help.aliyun.com/zh/express-connect/user-guide/before-you-start?spma2c4g.11186623.0.0.593f6746C17guR 专线接入流程 https://help.aliyun.com/zh/express-connect/user-guide/process-of-creating-a-dedicated-physical-connection?spma2c…

Redis 哨兵主备切换的数据丢失问题应该怎么解决?

引言&#xff1a;Redis作为一种高性能的内存数据库&#xff0c;广泛应用于分布式系统中。为了保证服务的高可用性&#xff0c;Redis提供了哨兵&#xff08;Sentinel&#xff09;机制&#xff0c;用于监控和管理Redis实例的自动故障恢复。然而&#xff0c;即使在哨兵的保护下&am…

Golang | Leetcode Golang题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; func countPrimes(n int) int {primes : []int{}isPrime : make([]bool, n)for i : range isPrime {isPrime[i] true}for i : 2; i < n; i {if isPrime[i] {primes append(primes, i)}for _, p : range primes {if i*p > n {break}…

idea 项目互联网转内网开发 依赖报错问题 maven问题

场景&#xff1a; 这个问题困扰好久&#xff0c;通过分析后&#xff0c;发现是maven配置问题&#xff0c;废话不多说&#xff0c;上干活。 问题描述 项目互联网从转内网开发&#xff0c;提前下载好repository&#xff0c;跟项目一起导入内网&#xff0c;导入后&#xff0c;发…

行内块元素的幽灵空白问题:揭秘与解决策略

在CSS布局中&#xff0c;行内块元素&#xff08;inline-block&#xff09;的使用可以提供更多的控制和灵活性&#xff0c;但它们也可能带来一些棘手的问题&#xff0c;尤其是所谓的“幽灵空白”问题。本文将探讨这一问题的原因&#xff0c;以及如何通过几种不同的方法来解决它。…

ubuntu 18 虚拟机安装(6) postgresql pg_dump pg_restore

ubuntu 18 虚拟机安装&#xff08;6&#xff09; postgres pg_dump pg_restore postgresql 10.3 下的 pg_dump、pg_restore https://blog.csdn.net/ctypyb2002/article/details/79881745 pg_dump pg_dump dumps a database as a text file or to other formats.Usage:pg_dum…

django带了一个权限系统

Django 自带了一个强大的权限系统&#xff0c;它允许开发者精细地控制应用程序中的访问权限。这个系统主要包括用户(User)、用户组(Group)、权限(Permission)以及对象权限(Object-level Permissions)几个核心组件。以下是该权限系统的详细解析&#xff1a; 1. 用户(User) 模型…

IPython高级技巧:使用%edit命令编辑变量和函数

IPython是一个强大的交互式Python解释器&#xff0c;它提供了许多有用的命令和功能来增强Python编程体验。%edit命令是IPython中一个非常实用的功能&#xff0c;它允许用户在IPython环境中直接编辑变量或函数&#xff0c;并立即应用更改。本文将详细介绍如何在IPython中使用%ed…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

phpSpider实用案例分享:如何爬取电商网站的商品信息?

phpspider实用案例分享&#xff1a;如何爬取电商网站的商品信息&#xff1f; 随着电商行业的蓬勃发展&#xff0c;越来越多的企业和个人开始在互联网上开设自己的电商网站。这些网站上展示的商品信息是用户进行购物和交易的主要依据。对于一些市场研究人员、竞争对手或者开发者…

Scrapy中爬虫优化技巧分享

scrapy是一个非常有用的python爬虫框架&#xff0c;它可以帮助我们轻松地从不同的网站上获取数据。同时&#xff0c;scrapy也有越来越多的用户在使用它来爬取数据&#xff0c;因此&#xff0c;在使用scrapy的过程中&#xff0c;我们需要考虑如何优化我们的爬虫&#xff0c;以便…

读AI新生:破解人机共存密码笔记15辅助博弈

1. 辅助博弈 1.1. assistance game 1.2. 逆强化学习如今已经是构建有效的人工智能系统的重要工具&#xff0c;但它做了一些简化的假设 1.2.1. 机器人一旦通过观察人类学会了奖励函数&#xff0c;它就会采用奖励函数&#xff0c;这样它就可以执行相同的任务 1.2.1.1. 解决这…

Dominate_一个用于生成和操作 HTML 文档的 Python 库

目录 01初识 Dominate 什么是 Dominate&#xff1f; 为什么选择 Dominate&#xff1f; 安装与配置 02Dominate 的基本使用 创建简单的 HTML 文档 添加表格 嵌套结构 03Dominate 的高级功能 动态内容生成 使用…

算法训练 | 动态规划Part11 | 1143.最长公共子序列、392.判断子序列

目录 1143.最长公共子序列 动态规划法 392.判断子序列 动态规划法 1143.最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法 解题思路 本题和动态规划&#xff1a;718. 最长…

Edu Codeforces Round167 (Div2)--(A~D)题解

Problem - A - Codeforces 思路&#xff1a;当且仅当y<-2是追不上的。 void solve(){ Aint x,y; cin>>x>>y;if(y<-2) cout<<"NO"<<endl;else cout<<"YES"<<endl; } Problem - B - Codefor…

C++编程逻辑讲解step by step:重载运算符+和-,实现按订单出入库操作。

题目 每按订单发一次货品A&#xff0c;库存都会相应地减少&#xff0c;每次退货&#xff0c;库存都会增加。分别定义货品A库存和订单为两个类&#xff1a;Inventory和Order&#xff0c;库存类Inventory中有货品名称、货品余量属性&#xff1b;订单类Order中有货品名称、数量、…

CSF视频文件格式转换WMV格式

如果大家看过一些高校教学讲解视频的话&#xff0c;很可能见过这样一个难得的格式&#xff0c;".csf "&#xff0c;非常漂亮 。 用暴风影音都可以打开观看&#xff0c;会自动下载解码。 但是一旦我们想要利用或者上传视频的时候就麻烦了&#xff0c;一般网站不认这…

下载旧版本vscode及扩展,离线下载远程linux服务器插件

背景 工作的内网没有网络&#xff0c;无法使用网络来下载插件和vscode软件&#xff0c;且有远程linux服务器需求&#xff0c;linux服务器中lib相关库比较旧且无法更新&#xff0c;所以需要选择一个旧版本的vscode&#xff0c;相应插件也需要选择旧版本的 旧版本vscode下载 没…

Windows下activemq集群配置(broker-network)

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.activemq架构 3.activemq集群配置 activemq集群配置基于Networks of Brokers 这种HA方案的优点&#xff1a;是占用的节点数更少(只需要2个节点),而且2个broker都可以响应消息的接收与发送。不足&#xff…

Docker 部署 MariaDB 数据库 与 Adminer 数据库管理工具

文章目录 MariaDBmariadb.cnf开启 binlog Adminerdocker-compose.ymlAdminer 连接 MariaDB MariaDB MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。 官网&#xff1a;https://mariadb.com/镜像&#xff…