欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java輕松提取PDF表格數(shù)據(jù)并轉(zhuǎn)換為CSV

 更新時間:2025年09月18日 08:20:17   作者:缺點內(nèi)向  
在日常工作中,你是否曾為從 PDF 中手動復制粘貼表格數(shù)據(jù)而抓狂,下面小編就和大家詳細介紹一下如何使用Java輕松高效地將提取的PDF 表格數(shù)據(jù)轉(zhuǎn)換為CSV吧

在日常工作中,你是否曾為從 PDF 中手動復制粘貼表格數(shù)據(jù)而抓狂?面對那些包含財務報表、物流清單、統(tǒng)計報告或各種數(shù)據(jù)清單的 PDF 文件,你是否也曾想過,如果能自動化地將這些表格數(shù)據(jù)提取出來,并轉(zhuǎn)換為易于處理的 CSV 格式,那該多好?

今天,我就來為大家揭秘如何在 Java 中實現(xiàn)這一目標,告別繁瑣的手動操作,輕松高效地將 PDF 表格數(shù)據(jù)轉(zhuǎn)換為 CSV。

為什么我們需要從 PDF 中提取表格數(shù)據(jù)

PDF 格式因其出色的跨平臺兼容性和視覺保真度,被廣泛應用于文檔共享和歸檔。然而,它的優(yōu)勢也恰恰是其在數(shù)據(jù)處理方面的局限:

  • 難以直接編輯和分析: PDF 旨在作為“電子紙”,其內(nèi)容通常是固定的,難以直接修改或進行數(shù)據(jù)分析。
  • 數(shù)據(jù)孤島: 重要的表格數(shù)據(jù)被“鎖定”在 PDF 中,無法直接導入數(shù)據(jù)庫、電子表格或其他業(yè)務系統(tǒng)進行進一步處理。

將 PDF 表格數(shù)據(jù)轉(zhuǎn)換為 CSV (Comma Separated Values) 格式,則能帶來諸多便利:

  • 數(shù)據(jù)分析友好: CSV 是一種純文本格式,易于導入 Excel、Google Sheets 或各種數(shù)據(jù)分析工具進行統(tǒng)計、篩選和可視化。
  • 系統(tǒng)集成: 方便將數(shù)據(jù)導入數(shù)據(jù)庫、CRM、ERP 等系統(tǒng),實現(xiàn)數(shù)據(jù)共享和業(yè)務流程自動化。
  • 減少錯誤: 自動化提取避免了手動復制粘貼可能引入的錯誤,確保數(shù)據(jù)準確性。

因此,掌握 PDF 表格的自動化提取技術(shù),對于提升數(shù)據(jù)處理效率和業(yè)務自動化水平至關(guān)重要。

借助 Spire.PDF for Java 實現(xiàn) PDF 到 CSV 的高效轉(zhuǎn)換

Spire.PDF for Java 是一款功能全面、性能卓越的 Java PDF 處理庫。它提供了豐富的 API,用于創(chuàng)建、編輯、轉(zhuǎn)換、打印和渲染 PDF 文檔。尤其在 PDF 表格提取方面,Spire.PDF for Java 能夠智能識別 PDF 中的表格結(jié)構(gòu),并以結(jié)構(gòu)化的方式返回數(shù)據(jù),極大地簡化了開發(fā)難度。

下面,我們來詳細分解如何使用它來完成 PDF 到 CSV 的轉(zhuǎn)換:

環(huán)境準備:引入 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> <!-- 請?zhí)鎿Q為最新版本號 -->
    </dependency>
</dependencies>

Gradle:

repositories {
    maven { url 'https://repo.e-iceblue.cn/repository/maven-public/' }
}
dependencies {
    implementation 'e-iceblue:spire.pdf:10.X.X' // 請?zhí)鎿Q為最新版本號
}

請訪問 Spire.PDF for Java 官網(wǎng)獲取最新的版本號。

核心步驟分解與代碼示例

現(xiàn)在,我們來看具體的代碼實現(xiàn)。假設(shè)我們有一個名為 tableSample.pdf 的 PDF 文件,其中包含我們需要提取的表格數(shù)據(jù)。

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. 創(chuàng)建 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("  發(fā)現(xiàn)表格,行數(shù):" + table.getRowCount() + ", 列數(shù):" + table.getColumnCount());

                            // 4. 將提取到的數(shù)據(jù)寫入 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"); // 寫入一行數(shù)據(jù)并換行
                            }
                            // 每個表格之間可以添加一個空行,或者其他分隔符,以便區(qū)分
                            csvWriter.append("\n"); 
                        }
                    } else {
                        System.out.println("  第 " + (pageIndex + 1) + " 頁未檢測到表格。");
                    }
                }
                System.out.println("數(shù)據(jù)已成功提取并保存到:" + csvOutputFilePath);
            } catch (IOException e) {
                System.err.println("寫入 CSV 文件時發(fā)生錯誤:" + e.getMessage());
            }

        } catch (Exception e) {
            System.err.println("處理 PDF 文件時發(fā)生錯誤:" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (pdfDocument != null) {
                pdfDocument.close(); // 關(guān)閉文檔,釋放資源
                pdfDocument.dispose();
            }
        }
    }
}

代碼說明:

  • PdfDocument.loadFromFile(): 用于加載指定的 PDF 文件。
  • PdfTableExtractor: Spire.PDF for Java 提供的表格提取工具類。
  • extractor.extractTable(pageIndex): 這是核心方法,它會智能分析指定頁面的內(nèi)容,識別出其中的表格結(jié)構(gòu),并返回一個 PdfTable 數(shù)組。
  • PdfTable.getRowCount()PdfTable.getColumnCount(): 獲取提取到表格的行數(shù)和列數(shù)。
  • PdfTable.getText(row, column): 獲取指定單元格的文本內(nèi)容。
  • CSV 格式化: 代碼中包含了簡單的 CSV 格式化邏輯,特別是針對含有逗號或雙引號的單元格內(nèi)容,使用雙引號包裹并對內(nèi)部雙引號進行轉(zhuǎn)義,以確保生成的 CSV 文件格式正確。

運行上述代碼,你就可以將 tableSample.pdf 中的所有表格數(shù)據(jù)提取出來,并保存到 extracted_table.csv 文件中。

深入優(yōu)化與注意事項

盡管 Spire.PDF for Java 已經(jīng)非常強大,但在實際應用中,我們?nèi)孕杩紤]一些優(yōu)化和注意事項:

復雜表格處理

合并單元格與跨頁表格: Spire.PDF for Java 通常能較好地處理合并單元格和跨頁表格。對于跨頁表格,它會嘗試在不同頁面上識別出表格的各個部分。如果遇到識別不準確的情況,可能需要結(jié)合其他文本提取功能,或者進行二次數(shù)據(jù)清洗。

非標準表格: 對于那些并非嚴格意義上的表格(例如,僅通過線條或文本排版模擬的表格),Spire.PDF for Java 的智能識別可能無法完全捕捉。在這種情況下,你可能需要結(jié)合 PdfTextFinder 等工具,通過文本定位和正則表達式來提取數(shù)據(jù),然后手動構(gòu)建表格結(jié)構(gòu)。

性能考量

大型 PDF 文件: 處理包含數(shù)百上千頁的大型 PDF 文件時,內(nèi)存消耗和處理時間可能會增加。建議:

  • 分批處理: 如果可能,將大型 PDF 文件拆分為多個小文件進行處理。
  • 優(yōu)化循環(huán): 確保在循環(huán)中沒有進行不必要的對象創(chuàng)建或復雜計算。
  • 及時釋放資源: 始終在 finally 塊中調(diào)用 pdfDocument.close()pdfDocument.dispose() 來釋放資源。

數(shù)據(jù)清洗與驗證

  • 數(shù)據(jù)質(zhì)量: 即使是智能提取,也可能因為 PDF 文件的質(zhì)量(如掃描件、低分辨率)導致提取到的數(shù)據(jù)不完全干凈。在將數(shù)據(jù)導入最終系統(tǒng)之前,務必進行數(shù)據(jù)清洗(去除多余空格、統(tǒng)一格式等)和驗證。
  • 頭部信息: 提取到的表格可能不包含明確的列頭。你可能需要根據(jù)業(yè)務邏輯,在生成 CSV 文件時手動添加列頭,或者通過分析第一行數(shù)據(jù)來識別列頭。

其他功能延伸

Spire.PDF for Java 不僅僅局限于表格提取。它還提供了強大的文本提取、圖片提取、內(nèi)容替換、文檔合并/拆分、PDF 到其他格式(如 Word、Excel、圖片)的轉(zhuǎn)換等功能。你可以根據(jù)項目需求,進一步探索和利用這些功能,實現(xiàn)更復雜的 PDF 處理任務。

處理復雜的 PDF 轉(zhuǎn) CSV 場景

實際應用中,PDF 文件常常包含多個表格、跨多頁,或表格結(jié)構(gòu)不規(guī)則。下面介紹如何應對這些情況。

單頁包含多個表格

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 時,逗號、分號、雙引號、換行等特殊字符可能會破壞文件結(jié)構(gòu)。 上述 Java 示例中的 escapeCsvField 方法可以去除換行并安全轉(zhuǎn)義。

更復雜的場景下,可以使用 Spire.XLS for Java,通過簡單的 Java 代碼將表格數(shù)據(jù)寫入 Excel,再將 Excel 工作表保存為 CSV,無需手動處理特殊字符。

總結(jié)

通過本文的介紹,相信你已經(jīng)掌握了如何在 Java 中使用 Spire.PDF for Java 庫來高效地將 PDF 表格數(shù)據(jù)轉(zhuǎn)換為 CSV 格式。這款工具憑借其智能的表格識別能力和簡潔的 API,極大地簡化了數(shù)據(jù)提取的復雜性,幫助開發(fā)者從 PDF 的“數(shù)據(jù)孤島”中解放數(shù)據(jù)價值。

到此這篇關(guān)于Java輕松提取PDF表格數(shù)據(jù)并轉(zhuǎn)換為CSV的文章就介紹到這了,更多相關(guān)Java PDF轉(zhuǎn)CSV內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Springboot注解形式進行模糊查詢

    使用Springboot注解形式進行模糊查詢

    這篇文章主要介紹了使用Springboot注解形式進行模糊查詢的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java文件上傳下載代碼實例

    java文件上傳下載代碼實例

    這篇文章主要介紹了java文件上傳下載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 使用Arthas定位問題及分析

    使用Arthas定位問題及分析

    本文通過使用Arthas工具對一個bug進行分析,發(fā)現(xiàn)該bug的原因是不同類型的動態(tài)代理(JDK和CGlib)實現(xiàn)機制的不同導致的
    2025-01-01
  • SpringBoot Actuator未授權(quán)訪問漏洞解決方案

    SpringBoot Actuator未授權(quán)訪問漏洞解決方案

    工作的時候遇到過提示Spring Boot后端存在Actuator未授權(quán)訪問漏洞,網(wǎng)上有很多詳細的解釋文章,在這里做一個簡單的總結(jié)、介紹和分享,需要的朋友可以參考下
    2023-09-09
  • IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    這篇文章主要介紹了IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java調(diào)用DOS實現(xiàn)定時關(guān)機的實例

    Java調(diào)用DOS實現(xiàn)定時關(guān)機的實例

    Java調(diào)用DOS實現(xiàn)定時關(guān)機的實例,需要的朋友可以參考一下
    2013-04-04
  • java利用DFA算法實現(xiàn)敏感詞過濾功能

    java利用DFA算法實現(xiàn)敏感詞過濾功能

    在最近的開發(fā)中遇到了敏感詞過濾,便去網(wǎng)上查閱了很多敏感詞過濾的資料,在這里也和大家分享一下自己的理解。下面這篇文章主要給大家介紹了關(guān)于java利用DFA算法實現(xiàn)敏感詞過濾功能的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • SpringBoot整合Mongodb實現(xiàn)增刪查改的方法

    SpringBoot整合Mongodb實現(xiàn)增刪查改的方法

    這篇文章主要介紹了SpringBoot整合Mongodb實現(xiàn)簡單的增刪查改,MongoDB是一個以分布式數(shù)據(jù)庫為核心的數(shù)據(jù)庫,因此高可用性、橫向擴展和地理分布是內(nèi)置的,并且易于使用。況且,MongoDB是免費的,開源的,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • 一文帶你搞懂SpringBoot中自動裝配原理

    一文帶你搞懂SpringBoot中自動裝配原理

    這篇文章主要為大家詳細介紹了SpringBoot中自動裝配原理的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2025-01-01
  • 為zookeeper配置相應的acl權(quán)限

    為zookeeper配置相應的acl權(quán)限

    這篇文章主要介紹了為zookeeper配置相應的acl權(quán)限的相關(guān)實例,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09

最新評論