博客 / 詳情

返回

Java實現PDF表格提取並導出CSV

在很多企業辦公和數據分析的場景中,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 教程中心

user avatar beiyinglunkuo 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.