Java使用iText生成复杂PDF表格详解

Java使用iText生成复杂PDF表格详解

本文解析一段使用Java和iText库生成复杂PDF表格的代码,试用各种需求导出功能。通过逐行分析,帮助读者掌握关键知识点。


一、代码功能概述

该方法用于生成耕地地力保护补贴分户信息的PDF报表,包含以下核心功能:

  1. 从服务层获取数据
  2. 设置HTTP响应头实现文件下载
  3. 创建PDF文档并设置中文格式
  4. 构建复杂表头(多行合并)
  5. 动态填充表格数据
  6. 添加备注说明

二、核心知识点解析

1. HTTP响应设置

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"XXXXXXXXXXX登记表.pdf\"");

作用

  • setContentType:指定响应内容为PDF格式
  • Content-Disposition:触发浏览器下载行为,指定默认文件名
  • 中文文件名需要URL编码处理(示例未展示)

2. 初始化PDF文档

Document document = new Document(PageSize.A4.rotate());
PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
document.open();

关键点

  • PageSize.A4.rotate() 设置横向A4页面
  • 通过response.getOutputStream()获取输出流
  • 必须执行document.open()document.close()

3. 中文字体处理

BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
Font font = new Font(baseFont, 12);

说明

  • STSong-Light 是常用中文字体
  • UniGB-UCS2-H 指定中文编码
  • EMBEDDED 将字体嵌入PDF,确保跨系统显示一致

4. 复杂表头构建

表格结构

PdfPTable table = new PdfPTable(23);
float[] columnWidths = {5,10,10,...}; //23列宽定义
table.setWidths(columnWidths);

合并技巧

  • 通过setRowspan()setColspan()实现单元格合并
  • 三行表头结构:
    1. 基础信息(合并3行)
    2. 补贴面积相关(合并2行)
    3. 扣除面积明细

示例代码片段

// 合并3行的单元格
PdfPCell cell = new PdfPCell(new Phrase("序号", font));
cell.setRowspan(3);
table.addCell(cell);

// 合并12列的标题
PdfPCell mainTitle = new PdfPCell(new Phrase("2023年耕地地力保护补贴", font));
mainTitle.setColspan(12);

5. 动态数据填充

数据遍历

for (int i = 0; i < list.size(); i++) {
    AuditCityAreadetail detail = list.get(i);
    // 添加23列数据...
}

安全处理

String nullSafeToString(Object obj) {
    return obj != null ? obj.toString() : "";
}

// 身份证脱敏
DesensitizedUtil.desensitizedIdNumber(detail.getIDCard())

单元格样式

BiConsumer<String, Font> addCell = (text, fontStyle) -> {
    PdfPCell cell = new PdfPCell(new Phrase(text, fontStyle));
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    table.addCell(cell);
};

6. 异常处理

try {
    // 主要逻辑
} catch (Exception e) {
    e.printStackTrace(); // 生产环境应记录日志
} finally {
    if(document.isOpen()) document.close();
}

优化建议

  • 使用日志框架(Log4j/SLF4J)记录错误
  • 添加具体异常处理(IOException等)
  • 返回错误信息给前端

三、完整流程总结

  1. 数据准备:从Service层获取列表和汇总数据
  2. 响应配置:设置PDF下载头信息
  3. 文档初始化:创建横向A4文档
  4. 内容构建
    • 添加主标题
    • 插入单位信息(含当前日期)
    • 构建复杂表格
    • 填充动态数据
    • 添加备注说明
  5. 资源释放:关闭文档和输出流

示例代码地址导出PDF

掌握这些技巧后,您可以轻松生成包含复杂中文表格的PDF文档。欢迎在评论区交流使用心得!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值