Java利用itextpdf实现pdf文件生成

news2024/11/25 15:58:21

前言

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

  1. 资源下载
  2. 后台私信(一键三连哦!!!)

二、前期准备

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;

    @Override
    public 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名称
    // 参数四:response
    pdfGenerator.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;

    @Override
    public 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 /> Insurance
                period
             </td>
             <td colspan="5">${period}</td>
          </tr>
       </table>
    </div>

    <div class="signature">
       <br /> <br />
       <table class="signature_table" style="border: 0; width: 100%;">
          <tr>
             <th
                   style="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;">总经理签名:
                <br /> <span style="font-size:10px">Authorized Signature</span>
             </th>
             <td
                   style="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;"></td>
             <th
                   style="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;">公司签章:
                <br /><span style="font-size:10px">Company Stamp</span>
             </th>
             <td
                   style="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 17%;"></td>
             <th
                   style="border: 0; font-size: 12px; font-weight: bold; text-align: left; width: 16%;">签发日期:<br />
                <span style="font-size:10px">Issue Date</span>
             </th>
             <td
                   style="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>

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

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

相关文章

RTP H264封包和解包分析

基础理论 RTSP RTP RTCP SDP基础知识-CSDN博客 RTP协议回顾以及网络知识补充 ​ ​ 举例&#xff1a;在客户端向服务器发送 1MB 数据的过程中&#xff0c;涉及到多个网络层次的概念&#xff0c;包括数据切割、最大传输单元&#xff08;MTU&#xff09;、最大段大小&#xf…

项目管理——Gantt图与Pert图

目录 前言相关知识点相关题目 前言 本文是在关于软考中软件设计师中的项目管理中的知识点&#xff0c;关于Gantt图与Pert图 相关知识点 甘特&#xff08;Gantt&#xff09;图 优点 可以清晰的描述每个任务从何时开始的&#xff0c;到何时结束&#xff0c;任务的进程情况以及…

服务端测试开发必备的技能:Mock测试!

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求 依赖的接口还未开发完成&#…

分治算法(4)_快速选择_库存管理III_面试题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(4)_快速选择_库存管理III_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f…

《自然语言处理NLP》—— 词嵌入(Word Embedding)及 Word2Vec 词嵌入方法

文章目录 一、词嵌入介绍1.示例介绍2.词嵌入的主要特点3.常见的词嵌入方法3.词嵌入的应用 二、Word2Vec 词嵌入方法1. 连续词袋模型&#xff08;CBOW&#xff09;2. Skip-gram模型3.Word2Vec方法的应用 在了解词嵌入之前需要了解什么是 独热编码&#xff08;One-Hot Encoding&…

ITSS-IT服务项目经理的价值体现

&#xff08;1&#xff09;技能提升&#xff1a;对于获得ITSS认证的服务项目经理而言&#xff0c;熟练掌握各种运维工具的使用能更精准地量化工作成果&#xff0c;更有效地管理信息技术服务流程。 这不仅提升了服务质量&#xff0c;还能在工作中展现出更高的效率和准确性&…

金蝶云星空个别字段无法录入异常处理

用户反馈&#xff0c;在录入单据时&#xff0c;第一条数据能录入数量&#xff0c;新增第二条时就无法录入。 用户反馈截图如下&#xff1a; 我登录自己的账号查看&#xff0c;并未发现相同的问题&#xff0c;同时用户也说已经退出重新登录过&#xff0c;问题依旧。 到现场看用…

硬货!Zabbix监控AIX系统服务案例

本文将介绍如何使用Zabbix自定义键值脚本方式监控AIX 系统IBM CICS中间件进程服务以及日志文件等信息。 Customer Information Control System (CICS) Transaction Server 是 IBM 针对 z/OS 的多用途事务处理软件。这是一个功能强大的应用程序服务器&#xff0c;用于大型和小型…

input 标签拥有了一种新的类型 :datetime-local 可以同时输入时间和日期

目前用于输入时间的控件有三种&#xff1a; typedate : 输入日期 typetime: 输入时间 typedatetime-local : 输入日期和时间 <input type"datetime-local" /><input type"date" /><input type"time" />

通义灵码 AI 程序员来了!丨阿里云云原生 9 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码 AI 程序员开启邀测&#xff0c;全流程开…

MarkText常用设置及快捷命令

1、设置自动保存 2、设置打开的默认目录 3、设置本地图片保存位置 4、常用快捷命令 1、 新建文档CtrlT 2、 打开侧边栏CtrlJ 3、 显示源代码CtrlE(再次按可切回正常界面)

Linux相关概念和易错知识点(14)(进程终止、进程退出、退出信息)

1.进程终止 &#xff08;1&#xff09;错误码 对于程序常见错误信息&#xff0c;C/C提供了信息解释&#xff0c;保存在<string.h>&#xff0c;使用strerror(错误码)就可以查询 错误信息成立的前提是错误码要和错误信息匹配&#xff0c;我们需要结合C/C给我们的错误码来…

股市入门常见术语介绍

鉴于最近行情讨论火热&#xff0c;我也想借此平台&#xff0c;结合我大学时期身边同学老师的投资经历&#xff0c;写一篇交易入门术语简介。内容不多但是足以达到科普之用。​ 希望大家能谨慎对待投资&#xff0c;始终保持谦虚学习的态度。不要迷失在瞬息万变的金融市场&#x…

第十九节 图像的缩放与插值

图像插值 最常见的四种插值算法 INTER_NEARRST0 INTER_LINEAR1 INTER_CUBIC2 INTER_LANCZOS44 相关应用场景 几何变换&#xff0c;透视变换&#xff0c;插值计算新像素resize&#xff0c; 如果size有值&#xff0c;使用size做缩放插值&#xff0c;否则根据fx与fy卷积。…

HUAWEI_HCIA_实验指南_Lib2.2_理解ARP及Proxy ARP

1、原理概述 ARP(Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进行IP地址到以太网MAC地址的解析&#xff0c;无需网络管理员手工处理。静态ARP是建立I…

基于JAVA+SpringBoot+Vue的实习管理系统

基于JAVASpringBootVue的实习管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈喽兄…

<Project-6 pdf2tx> Python Flask 应用:图片PDF图书的中文翻译解决方案

重要更新&#xff01; Modified on 8oct24. P6已经被 P8 替代&#xff0c;后着支持多任务&#xff0c;多翻译机。在速度与资源占用上&#xff0c;都好于这个P6。 新的 P8 文章链接&#xff1a; &#xff1c;Project-8 pdf2tx-MM&#xff1e; Python Flask应用&#xff1a;在…

59 mysql 存储引擎之 PERFORMANCE_SCHEMA

前言 我们这里来看一下 performance_schema 存储引擎, 我们常见的那些 general_log, slow_log什么的, 都是基于 performance_schema 它主要是 使用 ha_perfschema 下面 api 来操作 performance_schema 中的信息 我们这里基于 performance_schema.variables_by_thread 这张基…

RGB转HDMI方案、MS7210驱动——FPGA学习笔记20

一、简介 见HDMI彩条显示——FPGA学习笔记12-CSDN博客 二、TMDS编码原理 HDMI 采用 TMDS (Time Minimized Differential Signal) 最小化传输差分信号传输技术&#xff0c; 是美国 Silicon Image 公司开发的一项高速数据传输技术&#xff0c; 将视频、 音频、 控制信号进行编码…

电脑上下载配置Flutter Sdk及如何配置Flutter国内镜像

电脑上面下载配置 Flutter Sdk &#xff08;所有版本方法一 样&#xff09;&#xff1a; 1 、下载 Flutter SDK https://flutter.dev/docs/development/tools/sdk/releases#windows 2 、把下载好的 Flutter SDK 随便减压到你想安装 Sdk 的目录 如减压到 &#xff08; F:\flu…