Java实现PDF表格转换为CSV
在很多企业办公和数据分析的场景中,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;}
}
转换结果示例:
进阶扩展
上面的示例将 所有表格合并到一个 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 文件。整体流程分为:
- 加载 PDF 文档
- 提取表格数据
- 写入 CSV 文件
并扩展了 分表导出 与 合并导出 两种常见应用场景。
这种方式可以高效处理 PDF 报表、财务清单、问卷统计等数据,极大减少人工操作的工作量。
更多功能与案例请参考:Spire.PDF for Java 教程中心