Java利用itextpdf实现pdf文件生成
前言
最近公司让写一个数据页面生成pdf的功能,找了一些市面代码感觉都太麻烦,就自己综合性整合了一个便捷的工具类,开发只需简单组装数据直接调用即可快速生成pdf文件。望大家一起学习!!!
代码获取方式:
- 资源下载
- 后台私信(一键三连哦!!!)
二、前期准备
1、html模版(放置接口所在项目的resourcess/templates/
)
需要准备一个要看到的pdf模版,利用html代码形式简单输出,其中需要动态填充的地方需要用变量进行填充
比如页面显示:
姓名:韩云中
性别:男
<div>姓名:${name}性别:${sex}
</div>
2、数据实体
AbstractDocumentVo
必须继承 会有个findPrimaryKey
方法需要实现,return一个你这条数据的标识即可
实体字段名称必须与html
的${}
内容一致
public class User extends AbstractDocumentVo {private String name;private String sex;@Overridepublic String findPrimaryKey() {// 数据标识 id或则其它均可return this.name;}
}
三、代码开发
实现接口
@GetMapping("/testCreatePdf")
public void testCreatePdf(HttpServletResponse response) {// 方式一:前端直接给你传递这个对象// 方式二:通过前端传递的标识,自行去库中进行数据获取// ** 两种方式都需要保证html用到的字段不能存在null 不然报错User user = new User();user.setName("");user.setSex("");// 生成pdf路径PdfDocumentGenerator pdfGenerator = new PdfDocumentGenerator();// 生成pdf // 参数一:classpath中templates下对应要用的模版名称 // 参数二:模板数据 // 参数三:生成pdf名称// 参数四:responsepdfGenerator.generate("overseaAssistance.html", overseaVo, "2.pdf", response);
}
四、结果
得到自己想要的pdf文件
测试数据
java实体
package com.yxy.aob.controller;import com.yxy.common.core.utils.file.pdf.AbstractDocumentVo;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** @Description:* @Author: Hyz* @Date: 2024/10/11 11:22* @Version:1.0*/
@EqualsAndHashCode(callSuper = true)
@Data
public class OverseaVo extends AbstractDocumentVo {/*** 标识*/private String policyNo;/*** 投保人姓名*/private String holderName;/*** 投被保人关系*/private String relation;/*** 投保人联络地址*/private String holderAdress;/*** 投保人邮编*/private String holderPostCode;/*** 被保险人姓名*/private String insuredName;/*** 被保险人姓名拼音*/private String insuredPingyinName;/*** 被保险人护照号码*/private String insuredPassportNo;/*** 被保险人性别*/private String insuredSex;/*** 被保险人出生日期*/private String insuredBirthday;/*** 被保险人电话*/private String insuredPhone;/*** 被保险人证件号码*/private String insuredIDNo;/*** 前往国家或地区*/private String destination;/*** 受益人姓名*/private String beneficiaryName;/*** 备注*/private String remarks;/*** 保险期间*/private String period;/*** 境外意外伤害或残疾保额*/private String accidentalSumInsured;/*** 紧急救援医疗保额*/private String emergencySumInsured;/*** 附加境外紧急救援医保额*/private String medicalSumInsured;/*** 总保费*/private String premium;/*** 签发日期*/private String issueDate;/*** 省份*/private String branchName;/*** 合作公司名称*/private String companyName;@Overridepublic String findPrimaryKey() {return this.policyNo;}
}
html模版
<html>
<head><title></title><style type="text/css">body {margin-left: 45px;margin-right: 45px;font-family: Arial Unicode MS;font-size: 10px;}table {margin: auto;width: 100%;border-collapse: collapse;border: 1px solid #444444;}th,td {border: 1px solid #444444;font-size: 10px;margin-left: 5px;}.mcContent {line-height: 180%;padding: 20px;}.logo {text-align: center;}.title {text-align: center;font-weight: bold;font-size: 20px;}.notes {font-weight: normal;margin-left: 5px;margin-right: 5px;line-height: 18px;}.text_content {margin-left: 5px;margin-right: 5px;line-height: 18px;}.sum_insured_first_row {width: 20%;}.sum_insured_span {font-size: 10px;}.special_agreements_div {page-break-before: always;font-size: 14px;margin-top: 20px;}.special_agreements_div .special_agreements {font-size: 18px;font-weight: bold;}.title_right {width: 100%;margin: 0 auto;}.title_right p {text-align: left;margin: 0;margin-left: 50%;padding: 0;}@page {size: 8.5in 11in;@bottom-center{content:"page "counter(page)" of "counter(pages);}.signature {margin: 0 auto;clear: both;font-size: 16px;font-weight: bold;}.signature_table {/* font-size: 16px; */font-weight: bold;}</style>
</head>
<body>
<div><div class="title">测试PDF生成--<p>测试单号:${policyNo}</p></div><div class="insurance_info"><table class="insurance_info_table" cellpadding="0" cellspacing="0"width="100%"><tr><td width="20%" colspan="3">投保人<br /> Policyholder</td><td width="43%" colspan="3">${holderName}<br /></td><td width="15%">与被保险人关系<br /> Relationship with the Insured</td><td >${relation}</td></tr><tr><td width="20%" colspan="3">联络地址<br /> Correspondence Address</td><td width="43%" colspan="3">${holderAdress}</td><td width="15%">邮编<br /> Postal Code</td><td >${holderPostCode}</td></tr><tr class="td_width1"><td width="20%" colspan="3">被保险人姓名<br /> Name of the Insured</td><td width="13%">${holderName}</td><td width="10%">(拼音)<br /> (Pinyin)</td><td width="18%">${insuredPingyinName}</td><td width="15%">护照号码<br /> Passport No</td><td>${insuredPassportNo}</td></tr><tr><td width="5%">性别<br /> Sex</td><td width="5%">${insuredSex}</td><td width="10%">出生日期<br /> Date of Birth</td><td width="13%">${insuredBirthday}</td><td width="10%">电话<br /> Telephone No.</td><td width="18%">${insuredPhone}</td><td width="15%">证件号码 <br />ID No.</td><td >${insuredIDNo}</td></tr><tr><td colspan="3">请详细列明前往国家或地区<br /> Destination</td><td colspan="3">${destination}</td><td>受益人姓名<br /> Beneficiary</td><td>${beneficiaryName}</td></tr><tr><td class="address_class" colspan="3">备注 <br /> Remarks</td><td colspan="5">${remarks}</td></tr><tr><td class="address_class" colspan="3">保险期间 <br /> Insuranceperiod</td><td colspan="5">${period}</td></tr></table></div><div class="signature"><br /> <br /><table class="signature_table" style="border: 0; width: 100%;"><tr><thstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;">总经理签名:<br /> <span style="font-size:10px">Authorized Signature</span></th><tdstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;"></td><thstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;">公司签章:<br /><span style="font-size:10px">Company Stamp</span></th><tdstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;"></td><thstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 16%;">签发日期:<br /><span style="font-size:10px">Issue Date</span></th><tdstyle="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 16%;">${issueDate}</td></tr></table></div><div class="text_content"><br /> 我从来不是那样的人,不能耐心地拾起一地碎片,把它们凑合在一起,然后对自己说,这个修补好了的东西,跟新的完全一样。一样东西破碎了就是破碎了,我宁愿记住它最好时的模样,而不想把它修补好,然后终生看着那些碎了的地方。</div></div>
</body>
</html>
相关文章:

Java利用itextpdf实现pdf文件生成
前言 最近公司让写一个数据页面生成pdf的功能,找了一些市面代码感觉都太麻烦,就自己综合性整合了一个便捷的工具类,开发只需简单组装数据直接调用即可快速生成pdf文件。望大家一起学习!!! 代码获取方式&am…...

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序
2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂,同时在铁路线上增建一个车站,用来运送成品油。由于这种模式具有一定的普遍性,油田设计院希望建立管线建设费用最省的一般数学模型与方法。 1. 针对两炼…...

datawhale大模型bot应用开发--task3:工作流
目录 一、介绍:Coze工作流 1.1工作流应用场景 1.2什么是工作流 1.3思考环节 二、各个工作流详情 2.1情感分类工作流 2.2 随机数工作流 2.3 必应搜索工作流 2.4 天气查询工作流 三、集合上面五个工作流的总工作流 一、介绍:Coze工作流 1.1工作…...

期货配资系统风控逻辑开发/完整源代码
期货配资系统风控逻辑的开发是确保系统安全、稳定、高效运行的关键环节。以下是对期货配资系统风控逻辑开发的详细分析: 一、风险识别与评估 风险来源分析: 市场风险:期货市场价格波动带来的风险。信用风险:投资者或配资方违约的…...

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭
故障现象 一辆2023款零跑C01纯电车,累计行驶里程约为2万km,车主进厂反映,后备厢盖无法电动打开和关闭。 故障诊断 接车后试车,操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮,可以听到后备厢盖解锁的…...

分布式存储架构 与分布式一致性协议
分布式存储架构可以分为无中心节点架构和有中心节点架构。它们的设计在系统中的角色分配、数据管理、协调方式等方面有所不同。 1. 无中心节点架构(Decentralized/Peer-to-Peer Architecture) 在无中心节点的分布式存储架构中,所有节点都是…...

Unity Apple Vision Pro 保姆级开发教程 - Simulator 模拟器使用
教程视频 Apple VisionPro Simulator 模拟器使用教程 VsionOS Simulator 简介 visionOS Simulator 是一个用于开发和测试 visionOS 应用程序的工具。它模拟 Apple Vision Pro 的运行环境,帮助开发者在没有硬件设备的情况下创建、调试和优化他们的应用程序。VisionO…...

Vue 之 插件与组件的区别
在 Vue.js 中,插件(Plugin)和组件(Component)都是用来扩展 Vue 功能的重要工具,但它们的应用场景和使用方式有所不同。本文将通过对比的方式,帮助开发者更好地理解两者的区别,并通过…...

了解 ChatGPT 中的公平性问题
了解 ChatGPT 中的公平性问题 最近,OpenAI 又发布了一篇新的博客。他们谈论了一个有趣又重要的话题——用户的身份如何影响 ChatGPT 的回答。 这项研究揭示了一个鲜明的事实,那就是 AI 可能会无意间对人类产生刻板印象。很可能这些刻板印象源自 AI 训练过程中使用的数据,而这…...

【PHP】安装swoole时报错:No package ‘libbrotlienc‘ found
一、环境 Debian 11(bullseye) PHP 8.2.14 Swoole 5.1.4 二、过程 今天在安装Swoole 5.1.4的时候报错,错误信息如下: configure: error: Package requirements (libbrotlienc) were not met:No package libbrotlienc foundConsider adjusting the PK…...

postgresql执行计划解读案例
简介 SQL优化中读懂执行计划尤其重要,以下举例说明在执行计划中常见的参数其所代表的含义。 创建测试数据 -- 创建测试表 drop table if exists customers ; drop table if exists orders ; drop table if exists order_items ; drop table if exists products ;…...

Matlab实现粒子群优化算法优化随机森林算法模型 (PSO-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 粒子群优化算法(PSO)是一种启发式搜索方法,灵感来源于鸟类群体觅食的行为。在PSO中,每个解都是搜索空间中的一个“粒子”,这些粒子以一定的速度飞行&am…...

使用 EasyExcel 相邻数据相同时行和列的合并,包括动态表头、数据
前言 在处理 Excel 文件时,经常会遇到需要对表格中的某些单元格进行合并的情况,例如合并相同的行或列。Apache POI 是一个强大的工具,但它使用起来相对复杂。相比之下,EasyExcel 是一个基于 Apache POI 的轻量级 Excel 处理库&am…...

985研一学习日记 - 2024.10.16
一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部,明天练胸和三头 3、LeetCode刷了3题 旋转图像:…...

安装mysql 5.5.62
1>先检查是否存在其他版本mysql rpm -qa|grep -i mariadb 存在则卸载 yum -y remove maria* 2>下载mysql 5.5.62 wget https://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.62-linux-glibc2.12-x86_64.tar.gz 3>确认系统是否安装libaio库 yum -y install libai…...

AnaTraf | 网络性能监控系统的价值
目录 1. IT运维工程师 2. 网络管理员 3. 安全团队(网络安全工程师) 4. 业务部门(应用开发人员、产品经理) 5. 管理层与决策者(CTO/CIO、IT经理) 6. 最终用户(普通员工) 总结&…...

决策树和集成学习的概念以及部分推导
一、决策树 1、概述 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树的建立过程: 特征选择:选择有较强分类能力的特征决策树生成…...

servlet基础与环境搭建(idea版)
文章目录 环境变量配置安包装环境变量配置JDK 配置 静态网页动态网页(idea)给模块添加 web框架新版本 2023 之后的 idea,使用方法二idea 目录介绍建立前端代码启动配置 环境变量配置 tomcat 环境变量 安包装 环境变量配置 JDK 配置 静态网页…...

【10月最新】植物大战僵尸杂交版新僵尸预告(附最新版本下载链接)
【BOSS僵尸】埃德加二世 【新BOSS僵尸】埃德加二世 “埃德加博士的克隆体。驾驶着最新一代小型化机甲,致力于为戴夫博士扫清障碍。” -体型(模型大小)小于原版僵王的头 -血量120000(原版僵王复仇的2倍),免疫…...

网络编程-UDP以及数据库mysql
UDP通信流程 服务端客户端有一个邮箱socket()有一个邮箱socket()绑定地址bind()发送数据sendto接收数据recvfrom关闭close()关闭colse() //服务端 #include "head.h" // ./server 10001 int main(int argc,char *argv[]) {// 1、创建socket套接字// 参数1ÿ…...

ubuntu 20.04 安装ros1
步骤 1:设置系统 首先,确保系统环境是最新的: sudo apt update sudo apt upgrade 步骤 2:设置源和密钥 添加 ROS 软件源: 首先,确保 curl 和 gnupg 已安装: sudo apt install curl gnupg2…...

ShardingSphere-Proxy 数据库中间件MySql分库分表环境搭建
一. ShardingSphere-Proxy简介 1、简介 Apache ShardingSphere 是一款开源分布式数据库生态项目,旨在碎片化的异构数据库上层构建生态,在最大限度的复用数据库原生存算能力的前提下,进一步提供面向全局的扩展和叠加计算能力。其核心采用可插…...

Pytest+selenium UI自动化测试实战实例
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 今天来说说pytest吧,经过几周的时间学习,有收获也有疑惑,总之最后还是搞个小项目出来证明自己的努力不没有白费 环境准备 1 …...

服务器技术研究分析:存储从HBM到CXL
服务器变革:存储从HBM到CXL 在《从云到端,AI产业的新范式(2024)》中揭示,传统服务器价格低至1万美金,而配备8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。 从供…...

下载并安装 WordPress 中文版
下载并安装 WordPress 中文版 1. 安装 LAMP 环境(Linux, Apache, MySQL, PHP)1. 安装 Apache2. 安装 MySQL3. 安装 PHP1. 下载并安装 WordPress 中文版1. 下载 WordPress2. 配置文件权限3 . 创建 MySQL 数据库4 . 配置 WordPress1. 安装 LAMP 环境(Linux, Apache, MySQL, PH…...

从零开始的LeetCode刷题日记:515.在每个树行中找最大值
一.相关链接 题目链接:515.在每个树行中找最大值 二.心得体会 这道题也是层序遍历,只需要记录每一层的最大值即可,反复比较记录最大值。 三.代码 class Solution { public:vector<int> largestValues(TreeNode* root) {vector<…...

C语言 | Leetcode C语言题解之第492题构造矩形
题目: 题解: class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };...

在FastAPI网站学python:虚拟环境创建和使用
Python虚拟环境(virtual environment)是一个非常重要的工具,它允许开发者为每个项目创建独立的Python环境,隔离您为每个项目安装的软件包,从而避免不同项目之间的依赖冲突。 学习参考FastAPI官网文档:Virt…...

安全风险评估(Security Risk Assessment, SRA)
安全风险评估(Security Risk Assessment, SRA)是识别、分析和评价信息安全风险的过程。它帮助组织了解其信息资产面临的潜在威胁,以及这些威胁可能带来的影响。通过风险评估,组织可以制定有效的风险管理策略,以减少或控…...

SQL Injection | SQL 注入 —— 布尔盲注
关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:布尔盲注 —— 理论篇 布尔盲注(Boolean-Based Blind Injection)是一种常见的 SQL 注入技术,它适用于那些 SQL 注入时,查询结果不会直…...