最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

將 PDF 表格數(shù)據(jù)轉換為 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ù)據(jù)處理效率和業(yè)務自動化水平至關重要。

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

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

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

環(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)。假設我們有一個名為 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(); // 關閉文檔,釋放資源
                pdfDocument.dispose();
            }
        }
    }
}

代碼說明:

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

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

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

盡管 Spire.PDF for Java 已經(jīng)非常強大,但在實際應用中,我們仍需考慮一些優(yōu)化和注意事項:

復雜表格處理

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

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

性能考量

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

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

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

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

其他功能延伸

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

處理復雜的 PDF 轉 CSV 場景

實際應用中,PDF 文件常常包含多個表格、跨多頁,或表格結構不規(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 時,逗號、分號、雙引號、換行等特殊字符可能會破壞文件結構。 上述 Java 示例中的 escapeCsvField 方法可以去除換行并安全轉義。

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

總結

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

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

相關文章

  • Maven快速入門和常用配置方式

    Maven快速入門和常用配置方式

    Apache?Maven?是一個強大的?Java?項目管理工具,通過項目對象模型(POM)和生命周期管理構建、依賴和文檔,?它支持依賴管理、構建繼承和站點生成,簡化構建過程并確保環(huán)境一致性,?關鍵指令如mvn?clean、mvn?compile和mvn?package等幫助完成構建任務
    2026-05-05
  • application.yml文件中如何開啟mybatis自動駝峰映射

    application.yml文件中如何開啟mybatis自動駝峰映射

    這篇文章主要介紹了application.yml文件中開啟mybatis自動駝峰映射的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot實現(xiàn)HTTP服務監(jiān)聽的代碼示例

    SpringBoot實現(xiàn)HTTP服務監(jiān)聽的代碼示例

    前后端分離項目中,在調用接口調試時候,我們可以通過cpolar內網(wǎng)穿透將本地服務端接口模擬公共網(wǎng)絡環(huán)境遠程調用調試,本次教程我們以Java服務端接口為例,需要的朋友可以參考下
    2023-05-05
  • Java單測void類型的方法詳解

    Java單測void類型的方法詳解

    這篇文章主要給大家介紹了Java中單測void類型的方法,文中給出了詳細的示例代碼,相信對大家的理解和學習具有一定的參考借鑒價值,需要的朋友可以跟著小編下面來一起學習學習吧。
    2017-01-01
  • java四種訪問權限實例分析

    java四種訪問權限實例分析

    這篇文章主要介紹了java四種訪問權限實例分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • SpringMVC注解的入門實例詳解

    SpringMVC注解的入門實例詳解

    這篇文章主要為大家介紹了SpringMVC注解的入門實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • MyBatis自定義映射關系和關聯(lián)查詢實現(xiàn)方法詳解

    MyBatis自定義映射關系和關聯(lián)查詢實現(xiàn)方法詳解

    這篇文章主要介紹了MyBatis自定義映射關系和關聯(lián)查詢實現(xiàn)方法,當POJO屬性名與數(shù)據(jù)庫列名不一致時,需要自定義實體類和結果集的映射關系,在MyBatis注解開發(fā)中,使用@Results定義并使用自定義映射,使用 @ResultMap使用自定義映射
    2023-04-04
  • springboot多環(huán)境進行動態(tài)配置的方法

    springboot多環(huán)境進行動態(tài)配置的方法

    這篇文章主要介紹了springboot多環(huán)境下如何進行動態(tài)配置,本文主要分享了如何在springboot的項目中使用多環(huán)境配置,重點是”spring.profiles.active“屬性,需要的朋友可以參考下
    2022-06-06
  • 如何通過Kaptcha在Web頁面生成驗證碼

    如何通過Kaptcha在Web頁面生成驗證碼

    這篇文章主要介紹了如何通過Kaptcha在Web頁面生成驗證碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 關于.java編譯成.class?與?.class反編譯成.java問題

    關于.java編譯成.class?與?.class反編譯成.java問題

    這篇文章主要介紹了關于.java編譯成.class?與?.class反編譯成.java問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

台东县| 兴城市| 盘锦市| 龙里县| 兴宁市| 龙泉市| 长寿区| 林口县| 新疆| 紫阳县| 昭苏县| 海宁市| 油尖旺区| 高阳县| 新乡县| 色达县| 北京市| 汉源县| 临夏市| 满洲里市| 康定县| 赤水市| 台南县| 阿巴嘎旗| 武城县| 东阳市| 寿光市| 从化市| 德安县| 达拉特旗| 容城县| 鸡泽县| 体育| 康乐县| 贵阳市| 临邑县| 大城县| 晴隆县| 高密市| 定边县| 舒兰市|