在很多企业办公和数据分析的场景中,PDF 中常常存放着报表、清单或统计数据。相比 PDF,CSV 文件 更易于在 Excel 或数据库中进行进一步处理。因此,我们常常需要一种方式,将 PDF 中的表格数据批量抽取并导出为 CSV 文件。

本文将介绍如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自动转换。

文章目录

    • 环境准备
    • PDF 表格导出为 CSV:完整流程
      • Step 1: 加载 PDF 文档
      • Step 2: 提取 PDF 表格数据
      • Step 3: 保存为 CSV 文件
      • PDF转CSV完整Java代码示例
    • 进阶扩展
      • 1. 每个表格单独保存
      • 2. 合并所有表格到一个文件
    • 总结


环境准备

在项目中引入 Free Spire.PDF for Java,可以通过 下载 jar 包,或使用 Maven:

<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories>
<dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>9.13.0</version>
</dependency>

PDF 表格导出为 CSV:完整流程

通过 Java 程序结合 Free Spire.PDF,可以实现从 加载 PDF、提取表格、到生成 CSV 文件 的完整自动化流程,下面我们将详细介绍如何实现这个自动化流程。

Step 1: 加载 PDF 文档

首先,创建 PdfDocument 对象并加载需要处理的 PDF 文件:

import com.spire.pdf.*;PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("Sample.pdf");

Step 2: 提取 PDF 表格数据

Spire.PDF 提供 PdfTableExtractor 类来专门识别表格。
我们识别指定 PDF 页面中的指定表格,然后逐行逐列读取表格内容,并用 StringBuilder 拼接为 CSV 格式。

import com.spire.pdf.utilities.*;
import java.io.*;StringBuilder sb = new StringBuilder();PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 提取第一页的表格
PdfTable[] tables = extractor.extractTable(0);if (tables != null) {// 获取第一个表格PdfTable table = tables[0];for (int row = 0; row < table.getRowCount(); row++) {for (int col = 0; col < table.getColumnCount(); col++) {sb.append(escapeCsvField(table.getText(row, col)));if (col < table.getColumnCount() - 1) sb.append(",");}sb.append("\n");}
}

这里我们还需要一个工具方法来处理 CSV 中的特殊字符(如逗号、引号):

private static String escapeCsvField(String text) {if (text == null) return "";text = text.replaceAll("[\\n\\r]", "");if (text.contains(",") || text.contains(";") || text.contains("\"")) {text = text.replace("\"", "\"\"");text = "\"" + text + "\"";}return text;
}

Step 3: 保存为 CSV 文件

将拼接好的字符串写入文件,最终得到一个标准的 CSV:

try (Writer writer = new OutputStreamWriter(new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {writer.write(sb.toString());
}
pdf.close();
System.out.println("PDF 表格已成功导出为 CSV。");

PDF转CSV完整Java代码示例

import com.spire.pdf.*;
import com.spire.pdf.utilities.*;import java.io.*;public class PdfToCsvExample {public static void main(String[] args) throws Exception {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("Sample.pdf");StringBuilder sb = new StringBuilder();PdfTableExtractor extractor = new PdfTableExtractor(pdf);PdfTable[] tables = extractor.extractTable(0);if (tables != null) {PdfTable table = tables[0];for (int row = 0; row < table.getRowCount(); row++) {for (int col = 0; col < table.getColumnCount(); col++) {sb.append(escapeCsvField(table.getText(row, col)));if (col < table.getColumnCount() - 1) sb.append(",");}sb.append("\n");}}try (Writer writer = new OutputStreamWriter(new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {writer.write(sb.toString());}pdf.close();System.out.println("PDF 表格已成功导出为 CSV。");}private static String escapeCsvField(String text) {if (text == null) return "";text = text.replaceAll("[\\n\\r]", "");if (text.contains(",") || text.contains(";") || text.contains("\"")) {text = text.replace("\"", "\"\"");text = "\"" + text + "\"";}return text;}
}

转换结果示例

使用Java转换PDF表格为CSV文件

进阶扩展

上面的示例将 所有表格合并到一个 CSV 文件 中。在实际业务中,我们还可能有不同的需求:

1. 每个表格单独保存

如果 PDF 每页包含多个表格,可以为每个表格生成独立的 CSV 文件:

for (int i = 0; i < pdf.getPages().getCount(); i++) {PdfTableExtractor extractor = new PdfTableExtractor(pdf);PdfTable[] tables = extractor.extractTable(i);if (tables != null) {for (int t = 0; t < tables.length; t++) {StringBuilder tableContent = new StringBuilder();PdfTable table = tables[t];for (int row = 0; row < table.getRowCount(); row++) {for (int col = 0; col < table.getColumnCount(); col++) {tableContent.append(escapeCsvField(table.getText(row, col)));if (col < table.getColumnCount() - 1) tableContent.append(",");}tableContent.append("\n");}try (Writer writer = new OutputStreamWriter(new FileOutputStream("output/Page" + i + "_Table" + t + ".csv"), "UTF-8")) {writer.write(tableContent.toString());}}}
}

这样,每个表格会被单独导出,命名为 Page0_Table0.csv 等。

2. 合并所有表格到一个文件

有时我们不想把每个表格拆开保存,而是希望把整份 PDF 中的表格内容都汇总到同一个 CSV 文件中,方便统一分析。下面的示例展示了如何实现:

// 用于合并所有跨页表格的内容
StringBuilder mergedTableContent = new StringBuilder();for (int i = 0; i < pdf.getPages().getCount(); i++) {PdfTableExtractor extractor = new PdfTableExtractor(pdf);PdfTable[] tables = extractor.extractTable(i);if (tables != null) {for (int t = 0; t < tables.length; t++) {PdfTable table = tables[t];for (int row = 0; row < table.getRowCount(); row++) {for (int col = 0; col < table.getColumnCount(); col++) {mergedTableContent.append(escapeCsvField(table.getText(row, col)));if (col < table.getColumnCount() - 1) mergedTableContent.append(",");}mergedTableContent.append("\n");}}}
}// 统一写入一个 CSV 文件
try (Writer writer = new OutputStreamWriter(new FileOutputStream("output/MergedTable.csv"), "UTF-8")) {writer.write(mergedTableContent.toString());
}

运行后,PDF 中的所有表格会被逐一读取并写入 同一个 CSV 文件,文件路径为 output/MergedTables.csv

总结

本文介绍了如何在 Java 中使用 Free Spire.PDF for Java 将 PDF 中的表格内容导出为 CSV 文件。整体流程分为:

  1. 加载 PDF 文档
  2. 提取表格数据
  3. 写入 CSV 文件

并扩展了 分表导出合并导出 两种常见应用场景。

这种方式可以高效处理 PDF 报表、财务清单、问卷统计等数据,极大减少人工操作的工作量。

更多功能与案例请参考:Spire.PDF for Java 教程中心

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

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

相关文章

具有类人先验知识的 Affordance-觉察机器人灵巧抓取

25年8月来自武汉大学、阿里达摩院、湖畔研究中心、浙大和清华的论文“Towards Affordance-Aware Robotic Dexterous Grasping with Human-like Priors”。 能够泛化抓取目标的灵巧手是开发通用具身人工智能的基础。然而&#xff0c;之前的方法仅仅关注低级抓取稳定性指标&#…

项目管理的关键成功因素

项目管理的关键成功因素包括&#xff1a;目标明确、科学规划、有效沟通、资源保障、风险管理、团队协作、持续监控与总结改进。目标明确保证方向不偏移、科学规划确保执行有章可循、有效沟通减少误解与冲突、资源保障提供坚实支撑、风险管理帮助预防问题、团队协作提升整体效率…

[光学原理与应用-338]:ZEMAX - Documents\Zemax\Samples

Documents\Zemax\Samples 是 Zemax OpticStudio 软件自带的样例文件目录&#xff0c;包含大量预设的光学设计案例&#xff0c;涵盖镜头设计、照明系统、公差分析、非序列光学等多个领域。这些样例是学习软件功能、验证设计方法和快速启动项目的宝贵资源。以下是该目录的详细解析…

el-table合并列实例

想要实现效果&#xff1a;目前接口返回数据data:[{companyCode: "NXKYS",companyName:1123,costContractId:1123,costContractName:1123,createBy:1123,details:[{brand:1123,contractItemName:1123,modelSpec:1123,projectItemId:1123,requestQty:1123,transactionZ…

虚假 TradingView Facebook 广告在全球传播 Android 间谍软件

一项快速发展的恶意广告活动最初通过 Meta 的广告网络针对 Windows 用户&#xff0c;现已将其范围扩展到 Android 设备&#xff0c;推广伪装成合法交易应用程序的 Brokewell 恶意软件的高级版本。 Bitdefender Labs 警告称&#xff0c;此次移动攻击活动目前已在全球范围内展开…

Android系统框架知识系列(十九):Android安全架构深度剖析 - 从内核到应用的全栈防护

​关键词​&#xff1a;安全启动链、应用沙箱、SELinux、硬件安全模块、权限控制、零信任架构一、Android安全架构的基本概念与背景1. 移动安全环境的特殊性Android作为全球最大的移动操作系统&#xff0c;面临着独特的安全挑战&#xff1a;​移动设备的安全威胁维度​&#xf…

智能消防栓闷盖终端:让城市消防管理更智慧高效

然而您是否知道&#xff0c;这些传统的消防栓常常面临非法开启、人为破坏、水压不足等管理难题&#xff1f;当火灾真正发生时&#xff0c;它们能否可靠地提供"救命水"&#xff1f;如今&#xff0c;随着智能消防栓闷盖终端的出现&#xff0c;这一切正在悄然改变。 智…

【系统架构设计(一)】系统工程与信息系统基础上:系统工程基础概念

文章目录一、系统工程的基本概念二、系统工程方法论1、霍尔三维结构&#xff1a;硬科学2、切克兰德方法&#xff1a;软科学思维3、其他三、系统工程生命周期管理1、生命周期阶段划分2、生命周期方法论系统工程与信息系统基础为复杂系统设计提供从思维方法到具体技术的全方位指导…

[p2p-Magnet] 队列与处理器 | DHT路由表

第6章&#xff1a;队列与处理器 在第5章&#xff1a;分类器中&#xff0c;我们了解了系统如何分析原始种子数据。但当系统突然发现数百万新种子时&#xff0c;如何高效处理这些海量任务&#xff1f;这就是队列与处理器系统的职责所在。 核心概念 任务队列 功能定位&#xf…

Spring JDBC 源码初探:异常处理体系

一、Spring JDBC 异常体系简介 当我们使用 Spring JDBC 进行数据访问时&#xff0c;大多数人关注的是 JdbcTemplate 如何简化数据库操作&#xff0c;却很少有人去深入理解异常体系。事实上&#xff0c;异常不仅仅是错误提示&#xff0c;它是系统健壮性、可维护性的重要一环。JD…

如何提高微型导轨的生产效率?

在精密机械制造领域&#xff0c;每一个细微的元件都可能成为决定产品性能和品质的关键因素。而微型导轨正是体型小、高精度优势&#xff0c;在精密制造领域得到广泛应用&#xff0c;它高效支撑着现代工业的生产方式和效率。那么&#xff0c;如何提高微型导轨的生产效率呢&#…

轻量xlsx读取库xlsx_drone的编译与测试

这个库是在看其他网页时&#xff0c;作为和功能丰富的xlsxio库的对比来的&#xff0c;按照xlsx_drone github页面介绍&#xff0c; 特征 不使用任何外部应用程序来解析它们。注重速度而不是功能。简单的接口。UTF-8 支持。 安装 直接将 src 和 ext 文件夹复制并粘贴到项目根文…

Linux/UNIX系统编程手册笔记:文件I/O、进程和内存分配

文件 I/O 深度解析&#xff1a;掌握通用 I/O 模型的核心逻辑 在 Linux 系统编程中&#xff0c;文件 I/O 是程序与外部设备&#xff08;文件、设备等 &#xff09;交互的基础。从打开文件到读写数据&#xff0c;再到关闭资源&#xff0c;一系列系统调用构成了通用 I/O 模型的核心…

C++转置正方形矩阵

C转置正方形矩阵&#xff0c;就是正方形矩阵的a[i][j]a[j][i]。输入31 2 34 5 6 7 8 9输出1 4 72 5 83 6 9#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;int arr[n5][n5];for(int i0;i<n;i){for(int j0;j<n;j){cin>>arr[i][j]…

Ztero文献管理工具插件设置——亲测有效

一、Zotero简介与安装 Zotero是一款开源文献管理软件&#xff0c;能够帮助我们方便地收集、整理、引用和导出文献。它作为一个"在你的网页浏览器中工作的个人研究助手"&#xff0c;可以捕获网页内容并自动添加引用信息。 安装步骤&#xff1a; 访问Zotero官网&…

【gflags】安装与使用

gflags1. 介绍2. 安装3. 使用3.1 头文件3.2 定义参数3.3 访问参数3.4 不同文件访问参数3.5 初始化所有参数3.6 运行参数设置3.7 配置文件的使用3.8 特殊参数标识1. 介绍 gflags 是 Google 开发的一个开源库&#xff0c;用于 C 应用程序中命令行参数的声明、定义和解析。gflags…

基于MATLAB的三维TDOA定位算法仿真实现

一、算法原理与仿真框架 三维TDOA&#xff08;Time Difference of Arrival&#xff09;定位通过测量信号到达多个基站的时间差&#xff0c;结合几何关系反演目标位置。其核心步骤包括&#xff1a;几何建模&#xff1a;建立目标与基站间的距离差方程&#xff0c;形如下式&#x…

Linux-搭建DNS服务器

Linux-搭建DNS服务器1. 安装软件bind2.修改配置文件3. 在其他机器上测试DNS服务器4. 配置本地域名解析5. 优化后的zone1. 安装软件bind bind是历史非常悠久&#xff0c;而且性能非常好的dns域名系统的软件 [rootdns-server ~]# yum install bind bind-utils -y 启动named服务 …

从全栈开发视角看Java与前端技术融合实践

从全栈开发视角看Java与前端技术融合实践 面试场景记录&#xff1a;一次真实的面试对话 面试官&#xff1a;你好&#xff0c;很高兴见到你。我是这次面试的负责人&#xff0c;可以简单介绍一下你自己吗&#xff1f; 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;今年…

第二阶段WinForm-11:自定义控件

1_继承链 &#xff08;1&#xff09;Form1的继承链&#xff1a;Form1>Form>ContainerControl>ScrollableControl>Control &#xff08;2&#xff09;Button的继承链&#xff1a;Button>ButtonBase>Control>Component 2_自定义控件 &#xff08;1&…