Java实现PDF表格转换为CSV

发布于:2025-08-31 ⋅ 阅读:(21) ⋅ 点赞:(0)

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

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


环境准备

在项目中引入 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 教程中心


网站公告

今日签到

点亮在社区的每一天
去签到