Java利用itextpdf实现pdf文件生成

前言

最近公司让写一个数据页面生成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>
相关推荐
jonyleek13 分钟前
数据可视化:JVS-BI仪表盘图表样式配置全攻略,打造个性化数据展示!
java·大数据·信息可视化·数据挖掘·数据分析·自动化·软件需求
WangMing_X13 分钟前
C# 单个函数实现各进制数间转换
java·开发语言·算法·c#·winform·软件
南宫生27 分钟前
贪心算法理论基础和习题【算法学习day.17】
java·学习·算法·leetcode·链表·贪心算法
jc0803kevin32 分钟前
solidity的struct对象,web3j java解析输出参数
java·web3·solidity
勇敢滴勇36 分钟前
【C++】继承和多态常见的面试问题
java·c++·面试
nice6666040 分钟前
初识JDBC
java·数据库·sql·mysql·idea
计算机学姐42 分钟前
基于SpringBoot的汽车票网上预订系统
java·vue.js·spring boot·后端·mysql·java-ee·mybatis
screamn1 小时前
Sentinel详解
java·sentinel
哎呦没1 小时前
农村扶贫管理:SpringBoot解决方案
java·spring boot·后端
只看见而已1 小时前
锁升级及线程池相关
java·开发语言