在很多企业办公和数据分析的场景中,PDF 中常常存放着报表、清单或统计数据。相比 PDF,CSV 文件 更易于在 Excel 或数据库中进行进一步处理。因此,我们常常需要一种方式,将 PDF 中的表格数据批量抽取并导出为 CSV 文件。
本文将介绍如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自动转换。
文章目录
-
- 环境准备
- [PDF 表格导出为 CSV:完整流程](#PDF 表格导出为 CSV:完整流程)
-
- [Step 1: 加载 PDF 文档](#Step 1: 加载 PDF 文档)
- [Step 2: 提取 PDF 表格数据](#Step 2: 提取 PDF 表格数据)
- [Step 3: 保存为 CSV 文件](#Step 3: 保存为 CSV 文件)
- PDF转CSV完整Java代码示例
- 进阶扩展
-
- [1. 每个表格单独保存](#1. 每个表格单独保存)
- [2. 合并所有表格到一个文件](#2. 合并所有表格到一个文件)
- 总结
环境准备
在项目中引入 Free Spire.PDF for Java,可以通过 下载 jar 包,或使用 Maven:
xml
<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 文件:
java
import com.spire.pdf.*;
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("Sample.pdf");
Step 2: 提取 PDF 表格数据
Spire.PDF 提供 PdfTableExtractor
类来专门识别表格。
我们识别指定 PDF 页面中的指定表格,然后逐行逐列读取表格内容,并用 StringBuilder
拼接为 CSV 格式。
java
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 中的特殊字符(如逗号、引号):
java
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:
java
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代码示例
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;
}
}
转换结果示例:

进阶扩展
上面的示例将 所有表格合并到一个 CSV 文件 中。在实际业务中,我们还可能有不同的需求:
1. 每个表格单独保存
如果 PDF 每页包含多个表格,可以为每个表格生成独立的 CSV 文件:
java
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 文件中,方便统一分析。下面的示例展示了如何实现:
java
// 用于合并所有跨页表格的内容
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 文件。整体流程分为:
- 加载 PDF 文档
- 提取表格数据
- 写入 CSV 文件
并扩展了 分表导出 与 合并导出 两种常见应用场景。
这种方式可以高效处理 PDF 报表、财务清单、问卷统计等数据,极大减少人工操作的工作量。
更多功能与案例请参考:Spire.PDF for Java 教程中心