Java使用IText根据pdf模板创建pdf文件

1.导包

 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>

2.绘制pdf模板
在这里插入图片描述
3.示例代码

/*** 读取pdf模板填充生成pdf文件并转为字节数组* @return*/
public byte[] createPdf() {//获取源数据(一般从数据库查询,此处通过构造数据简化处理)List<Plan> plans = this.getPlans();final int size = plans.size();//临时文件final String outputFilePath = "D:/" + System.currentTimeMillis() + ".pdf";OutputStream os = null;PdfStamper ps = null;PdfReader reader = null;PdfReader reader2 = null;Document document = null;ByteArrayOutputStream byteArrayOutputStream = null;PdfCopy pdfNew = null;try {//读入pdf表单reader = new PdfReader(this.getClass().getResourceAsStream("/template/test.pdf"));//根据表单生成一个新的pdfos = Files.newOutputStream(new File(outputFilePath).toPath());ps = new PdfStamper(reader, os);//获取pdf表AcroFields form = ps.getAcroFields();form.setField("contractNo", "HT2024042501");//合同号form.setField("paymentDate", "2022-12-01");//放款日期form.setField("expiredDate", "2023-12-01");//到期日期ps.setFormFlattening(true);List<AcroFields.FieldPosition> table = form.getFieldPositions("table");Rectangle rect = table.get(0).position;PdfPTable pTable = new PdfPTable(8);BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);Font fontZH = new Font(bfChinese, 10f, 0);pTable.getDefaultCell().setHorizontalAlignment(1);pTable.setWidthPercentage(100.0f);float totalWidth = rect.getRight() - rect.getLeft() - 1;//计算表格宽度float[] columnWidth = {(float) (totalWidth * 0.05), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.13), (float) (totalWidth * 0.13), (float) (totalWidth * 0.09)};pTable.setTotalWidth(columnWidth);pTable.setLockedWidth(true);for (Plan plan : plans) {Integer periodNo = plan.getPeriodNo();int border = (periodNo % 12 == 0 || periodNo == size) ? Rectangle.BOTTOM : Rectangle.NO_BORDER;pTable.addCell(generateCell(String.valueOf(periodNo), border, fontZH));pTable.addCell(generateCell(plan.getMatchDate(), border, fontZH));pTable.addCell(generateCell(plan.getRepayOriginal(), border, fontZH));pTable.addCell(generateCell(plan.getPenalty(), border, fontZH));pTable.addCell(generateCell(plan.getRepayAmount(), border, fontZH));pTable.addCell(generateCell(plan.getRestOriginal(), border, fontZH));pTable.addCell(generateCell(plan.getRepayDate(), border, fontZH));pTable.addCell(generateCell(plan.getRepayStatus(), border, fontZH));}pTable.setKeepTogether(true);pTable.setSplitLate(false);pTable.setSplitRows(true);//计算需要分页的总页数int totalpage = size % 12 == 0 ? size / 12 : size / 12 + 1;if (totalpage == 1) {//获table页面PdfContentByte under = ps.getOverContent(1);//添加tablepTable.writeSelectedRows(0, -1, rect.getLeft(), rect.getTop(), under);} else {for (int i = 1; i <= totalpage; i++) {PdfContentByte under = ps.getOverContent(i);if (i == 1) {pTable.writeSelectedRows(0, 12, rect.getLeft(), rect.getTop(), under);} else {pTable.writeSelectedRows((i - 1) * 12, i * 12, rect.getLeft(), rect.getTop(), under);}}}ps.close();reader2 = new PdfReader(outputFilePath);document = new Document(reader2.getPageSizeWithRotation(1));byteArrayOutputStream = new ByteArrayOutputStream();pdfNew = new PdfCopy(document, byteArrayOutputStream);document.open();PdfImportedPage page;for (int i = 1; i <= totalpage; i++) {page = pdfNew.getImportedPage(reader2, i);pdfNew.addPage(page);}document.close();os.close();pdfNew.close();reader.close();reader2.close();FileUtils.delete(new File(outputFilePath));return byteArrayOutputStream.toByteArray();} catch (Exception e) {e.printStackTrace();} finally {try {if (ps != null) {ps.close();}if (reader != null) {reader.close();}if (os != null) {os.close();}if (document != null) {document.close();}if (pdfNew != null) {pdfNew.close();}if (reader2 != null) {reader2.close();}if (byteArrayOutputStream != null) {byteArrayOutputStream.close();}} catch (Exception e) {e.printStackTrace();}}return null;
}private List<Plan> getPlans() {List<Plan> plans = new ArrayList<Plan>();for(int i=1;i<=12;i++) {plans.add(new Plan(i,"2023-"+String.format("%02d", i)+"-01","999","-", "999","0","2023-"+String.format("%02d", i)+"-01", "已结清"));}return plans;
}private PdfPCell generateCell(String value, int border, Font fontZH) {PdfPCell cell = new PdfPCell(new Phrase(value, fontZH));cell.setBorder(border);cell.setHorizontalAlignment(Element.ALIGN_CENTER);return cell;}public static void main(String [] args) throws FileNotFoundException, IOException {//将字节流转为pdf文件放于D盘OutputStream fileOut = new FileOutputStream("D:/a.pdf");fileOut.write(new TestPdf().createPdf());}

4.执行结果
在这里插入图片描述
5.所用到jar包下载地址
itextpdf-5.5.10.jar

欢迎大家积极留言交流学习心得,点赞的人最美丽!

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

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

相关文章

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

安装OceanBase的机器如果出现故障,应该如何处理

背景 OBD&#xff08;OceanBase Deployer&#xff09;&#xff0c;是OceanBase社区版的专属安装部署工具。它支持命令行或白屏界面部署&#xff0c;将复杂的配置流程标准化&#xff0c;大大降低了集群部署的难度。 有用户在使用过程中提出问题——“当我所在的OBD机器…

OceanBase 分布式数据库【信创/国产化】- OceanBase V4.3 更新了什么 What‘s New

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase V4.3 更新了什么 Whats New前言OceanBase 数据更新架构Whats NewOLAP 能力列存引擎旁路导入新向量化引擎物化视图OceanBase 分布式数据库【信创/国产化】- OceanBase V4.3 更新了什么 What’s…

Java在区块链开发中的作用及发展

Java在区块链开发中的作用以及发展 一、引言 随着信息技术的飞速发展&#xff0c;区块链技术作为一种新兴的去中心化分布式账本技术&#xff0c;正逐渐引起人们的广泛关注。区块链以其独特的不可篡改、去中心化、安全可信等特性&#xff0c;在数字货币、供应链管理、金融科技…

mac下安装python并编写脚本实现s3上传功能

mac下安装python并编写脚本实现s3上传功能 步骤一&#xff1a;安装 Python 31. 安装 Homebrew&#xff08;如果尚未安装&#xff09;&#xff1a;2. 使用 Homebrew 安装 Python 3&#xff1a;3. 验证安装&#xff1a;4.安装boto3&#xff1a; 步骤二&#xff1a;编写 S3 上传脚…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序&#xff1a; https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办&#xff08;调节音量&#xff09;树莓派上的音乐播放器&#xff08;可选&#xff09;命令行直接放歌&#xff08;尝试放mp3歌曲&#xff09; …

nginx负载均衡策略

1、轮询&#xff08;Round Robin&#xff09;-默认 依次转发&#xff0c;适用于多台服务器性能相近 2、加权轮询&#xff08;Weighted Round Robin&#xff09; weight高的优先分配&#xff0c;适用于多台服务器性能相差较大 3、IP hash 基于客户端 IP 地址的负载均衡策略&a…

Windows 本地直接使用 SSH,SFTP 以及 SFTP下载文件到 Windows/mac 本地或上传(没有客户端时)

windows 本地打开 ssh 以及 sftp 等的方式 1.win(windows图标那个键) r 直接搜 然后从打开的位置运行 如果是打开 sftp 前面的 ssh 换一下成sftp 就行 直接从地址栏输入也可以直接转过去 通过 windows 的工具直接访问 sftp 后将文件下载到自己的windows 或 mac 上 先通过…

【C++】---STL之list的模拟实现

【C】---STL之list的模拟实现 一、list模拟实现思路二、结点类的实现三、list迭代器的实现1、ListIterator类2、构造函数3、operator*运算符重载5、operator->运算符重载6、operator&#xff01;运算符重载7、operator运算符重载8、前置9、后置10、前置--11、后置-- 四、lis…

JAVAEE—HTTPS和ssl证书

0[toc] 什么是HTTPS HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况而HTTPS则是新采用加密的方式进行传输 为什么需要HTTPS 为什么要使用HTTPS呢&#xff1f;这…

win c++使用lua环境配置 5.3.5版本

编译lua 下载lua源码&#xff0c;github仓库 使用vs编译源码&#xff0c;新建一个静态库项目(只会生成lib文件)&#xff0c;想要dll的话就新建dll项目&#xff08;有一个lib文件和dll文件&#xff09; 把lua源码下面的文件夹都是&#xff0c;复制到vs项目中 lib目录是我手动…

配置etcd、apiserver使用的cpu和内存资源

etcd pod 默认使用的cpu和内存都是100M,当集群变大时,资源会不够用,导致异常,如: apiserver 默认使用cpu为250M k8s-master121 kubelet[31020]: E0425 14:41:54.026671 31020 controller.go:187] failed to update lease, error: etcdserver: request timed out kubelet[3…

四、搭建 FFmpeg,实战直播推流

目录 1、FFmpeg 简介 2、FFmpeg 项目组成 3、使用 ffmpeg 的方式分为两种: 5、FFmpeg 命令行 <

MongoDB聚合运算符:$sinh

MongoDB聚合运算符&#xff1a;$sinh 文章目录 MongoDB聚合运算符&#xff1a;$sinh语法使用举例双曲正弦值角度双曲正弦值弧度 $sinh聚合运算符用来计算双曲正弦值&#xff0c;返回以弧度为单位的指定表达式的双曲正弦值。 语法 { $sinh: <expression> }<expression…

【QEMU系统分析之启动篇(十七)】

系列文章目录 第十七章 QEMU系统仿真的显示初始化分析 文章目录 系列文章目录第十七章 QEMU系统仿真的显示初始化分析 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的启动分析1.系统仿真的初始化代码2.主循环数据初始化3. qemu_init_displays()init_displaystate()qemu_di…

4.25java项目小结

完成了头像的显示&#xff0c;能将头像设置圆形&#xff0c;从数据库传输头像&#xff0c;客户端接收并在界面上展示&#xff0c;并能从文件选择图片 、

Golang | Leetcode Golang题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; func groupAnagrams(strs []string) [][]string {mp : map[[26]int][]string{}for _, str : range strs {cnt : [26]int{}for _, b : range str {cnt[b-a]}mp[cnt] append(mp[cnt], str)}ans : make([][]string, 0, len(mp))for _, v : ra…

20240425金融读报:银行绿色数据收集ESG银行物联网智慧贵金属案例

1、银行与绿色产业之间风险-存在环保信息壁垒&#xff1a;收集政府何市场披露数据&#xff0c;生成ESG报告&#xff0c;作为评级、贷款依据或强控指标 2、 中国建设银行智慧贵金属-》同理可推智慧押品&#xff1a;1、梳理需求&#xff08;看现有贵金属操作流程&#xff0c;并分…

金融级国产化替代中间件有哪些?

过去&#xff0c;国内中间件市场一直由IBM、Oracle等国际大型企业所主导&#xff0c;这在一定程度上限制了对国内企业多样化和个性化需求的满足&#xff0c;尤其是在实现底层硬件与上层应用软件之间高效、精准匹配方面。面对日益复杂的国际局势&#xff0c;金融安全已成为国家整…

docker 安装 Sql Server

docker 安装 Sql Server 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?viewsql-server-ver16&tabscli&pivotscs1-bash 安装命令 sudo: 这是一个在 Linux 系统上以超级用户权限运行命令的关键字。它用于确保…