java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java PDF转CSV

Java轻松提取PDF表格数据并转换为CSV

作者:缺点内向

在日常工作中,你是否曾为从 PDF 中手动复制粘贴表格数据而抓狂,下面小编就和大家详细介绍一下如何使用Java轻松高效地将提取的PDF 表格数据转换为CSV吧

在日常工作中,你是否曾为从 PDF 中手动复制粘贴表格数据而抓狂?面对那些包含财务报表、物流清单、统计报告或各种数据清单的 PDF 文件,你是否也曾想过,如果能自动化地将这些表格数据提取出来,并转换为易于处理的 CSV 格式,那该多好?

今天,我就来为大家揭秘如何在 Java 中实现这一目标,告别繁琐的手动操作,轻松高效地将 PDF 表格数据转换为 CSV。

为什么我们需要从 PDF 中提取表格数据

PDF 格式因其出色的跨平台兼容性和视觉保真度,被广泛应用于文档共享和归档。然而,它的优势也恰恰是其在数据处理方面的局限:

将 PDF 表格数据转换为 CSV (Comma Separated Values) 格式,则能带来诸多便利:

因此,掌握 PDF 表格的自动化提取技术,对于提升数据处理效率和业务自动化水平至关重要。

借助 Spire.PDF for Java 实现 PDF 到 CSV 的高效转换

Spire.PDF for Java 是一款功能全面、性能卓越的 Java PDF 处理库。它提供了丰富的 API,用于创建、编辑、转换、打印和渲染 PDF 文档。尤其在 PDF 表格提取方面,Spire.PDF for Java 能够智能识别 PDF 中的表格结构,并以结构化的方式返回数据,极大地简化了开发难度。

下面,我们来详细分解如何使用它来完成 PDF 到 CSV 的转换:

环境准备:引入 Spire.PDF for Java 依赖

首先,你需要在你的 Maven 或 Gradle 项目中引入 Spire.PDF for Java 依赖。

Maven:

<repositories>
    <repository>
        <id>e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>10.X.X</version> <!-- 请替换为最新版本号 -->
    </dependency>
</dependencies>

Gradle:

repositories {
    maven { url 'https://repo.e-iceblue.cn/repository/maven-public/' }
}
dependencies {
    implementation 'e-iceblue:spire.pdf:10.X.X' // 请替换为最新版本号
}

请访问 Spire.PDF for Java 官网获取最新的版本号。

核心步骤分解与代码示例

现在,我们来看具体的代码实现。假设我们有一个名为 tableSample.pdf 的 PDF 文件,其中包含我们需要提取的表格数据。

import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class PdfTableToCsvConverter {

    public static void main(String[] args) {
        // 1. 加载 PDF 文档
        String pdfFilePath = "data/tableSample.pdf"; // 替换为你的 PDF 文件路径
        String csvOutputFilePath = "output/extracted_table.csv"; // CSV 输出路径

        PdfDocument pdfDocument = new PdfDocument();
        try {
            pdfDocument.loadFromFile(pdfFilePath);
            System.out.println("PDF 文档加载成功:" + pdfFilePath);

            // 2. 创建 PdfTableExtractor 实例
            PdfTableExtractor extractor = new PdfTableExtractor(pdfDocument);

            // 使用 FileWriter 写入 CSV 文件
            try (FileWriter csvWriter = new FileWriter(csvOutputFilePath)) {
                // 遍历 PDF 的每一页
                for (int pageIndex = 0; pageIndex < pdfDocument.getPages().getCount(); pageIndex++) {
                    System.out.println("正在处理第 " + (pageIndex + 1) + " 页...");

                    // 3. 识别并提取表格
                    // extractTable(int pageIndex) 方法返回当前页的所有表格
                    PdfTable[] tableLists = extractor.extractTable(pageIndex);

                    if (tableLists != null && tableLists.length > 0) {
                        for (PdfTable table : tableLists) {
                            System.out.println("  发现表格,行数:" + table.getRowCount() + ", 列数:" + table.getColumnCount());

                            // 4. 将提取到的数据写入 CSV
                            for (int row = 0; row < table.getRowCount(); row++) {
                                StringBuilder rowData = new StringBuilder();
                                for (int column = 0; column < table.getColumnCount(); column++) {
                                    // 获取单元格文本
                                    String cellText = table.getText(row, column);
                                    // 对包含逗号或双引号的文本进行处理,避免 CSV 格式错误
                                    if (cellText.contains(",") || cellText.contains(""")) {
                                        cellText = """ + cellText.replace(""", """") + """;
                                    }
                                    rowData.append(cellText);
                                    if (column < table.getColumnCount() - 1) {
                                        rowData.append(","); // 添加逗号分隔
                                    }
                                }
                                csvWriter.append(rowData.toString()).append("\n"); // 写入一行数据并换行
                            }
                            // 每个表格之间可以添加一个空行,或者其他分隔符,以便区分
                            csvWriter.append("\n"); 
                        }
                    } else {
                        System.out.println("  第 " + (pageIndex + 1) + " 页未检测到表格。");
                    }
                }
                System.out.println("数据已成功提取并保存到:" + csvOutputFilePath);
            } catch (IOException e) {
                System.err.println("写入 CSV 文件时发生错误:" + e.getMessage());
            }

        } catch (Exception e) {
            System.err.println("处理 PDF 文件时发生错误:" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (pdfDocument != null) {
                pdfDocument.close(); // 关闭文档,释放资源
                pdfDocument.dispose();
            }
        }
    }
}

代码说明:

运行上述代码,你就可以将 tableSample.pdf 中的所有表格数据提取出来,并保存到 extracted_table.csv 文件中。

深入优化与注意事项

尽管 Spire.PDF for Java 已经非常强大,但在实际应用中,我们仍需考虑一些优化和注意事项:

复杂表格处理

合并单元格与跨页表格: Spire.PDF for Java 通常能较好地处理合并单元格和跨页表格。对于跨页表格,它会尝试在不同页面上识别出表格的各个部分。如果遇到识别不准确的情况,可能需要结合其他文本提取功能,或者进行二次数据清洗。

非标准表格: 对于那些并非严格意义上的表格(例如,仅通过线条或文本排版模拟的表格),Spire.PDF for Java 的智能识别可能无法完全捕捉。在这种情况下,你可能需要结合 PdfTextFinder 等工具,通过文本定位和正则表达式来提取数据,然后手动构建表格结构。

性能考量

大型 PDF 文件: 处理包含数百上千页的大型 PDF 文件时,内存消耗和处理时间可能会增加。建议:

数据清洗与验证

其他功能延伸

Spire.PDF for Java 不仅仅局限于表格提取。它还提供了强大的文本提取、图片提取、内容替换、文档合并/拆分、PDF 到其他格式(如 Word、Excel、图片)的转换等功能。你可以根据项目需求,进一步探索和利用这些功能,实现更复杂的 PDF 处理任务。

处理复杂的 PDF 转 CSV 场景

实际应用中,PDF 文件常常包含多个表格、跨多页,或表格结构不规则。下面介绍如何应对这些情况。

单页包含多个表格

extractTable(i) 返回的 PdfTable[] 包含该页中检测到的所有表格,可以将每个表单独保存为不同的 CSV 文件:

for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tableLists = extractor.extractTable(i);

    if (tableLists != null) {
        for (int t = 0; t < tableLists.length; t++) {
            PdfTable table = tableLists[t];
            StringBuilder tableContent = new StringBuilder();

            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/Tables/Table_Page" + i + "_Index" + t + ".csv"), "UTF-8")) {
                writer.write(sb.toString());
            }
        }
    }
}

跨页或大表格

如果表格跨越多页,可以逐页提取并 追加写入,以避免覆盖:

StringBuilder sb = 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 (PdfTable table : tables) {
            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");
            }
        }
    }
}

FileWriter writer = new FileWriter("MergedTables.csv");
writer.write(sb.toString());
writer.close();

格式限制

CSV 只能存储纯文本,像合并单元格、字体、图片等格式会丢失。如果需要保留样式,可以导出为 Excel(.xlsx)。

CSV 特殊字符处理

在写入 CSV 时,逗号、分号、双引号、换行等特殊字符可能会破坏文件结构。 上述 Java 示例中的 escapeCsvField 方法可以去除换行并安全转义。

更复杂的场景下,可以使用 Spire.XLS for Java,通过简单的 Java 代码将表格数据写入 Excel,再将 Excel 工作表保存为 CSV,无需手动处理特殊字符。

总结

通过本文的介绍,相信你已经掌握了如何在 Java 中使用 Spire.PDF for Java 库来高效地将 PDF 表格数据转换为 CSV 格式。这款工具凭借其智能的表格识别能力和简洁的 API,极大地简化了数据提取的复杂性,帮助开发者从 PDF 的“数据孤岛”中解放数据价值。

到此这篇关于Java轻松提取PDF表格数据并转换为CSV的文章就介绍到这了,更多相关Java PDF转CSV内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文