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

利用Java提取PDF表格到文本、CSV及excel工作表

 更新時間:2024年09月26日 10:43:10   作者:Eiceblue  
如何精準(zhǔn)地提取PDF格式中嵌入的表格數(shù)據(jù),并將其無縫轉(zhuǎn)換為更加易于分析和操作的形式,是一項(xiàng)重要的文檔處理技巧,本文將介紹如何利用Java從PDF文檔提取表格數(shù)據(jù),并寫入文本文件、CSV文件以及Excel工作表,需要的朋友可以參考下

引言

如何精準(zhǔn)地提取PDF格式中嵌入的表格數(shù)據(jù),并將其無縫轉(zhuǎn)換為更加易于分析和操作的形式,如純文本、CSV文件或Excel工作表,是一項(xiàng)重要的文檔處理技巧。使用Java,我們可以簡單地實(shí)現(xiàn)這一過程。本文將介紹如何利用Java從PDF文檔提取表格數(shù)據(jù),并寫入文本文件、CSV文件以及Excel工作表。

本文所使用的方法提取PDF表格主要需要免費(fèi)的Free Spire.PDF for Java庫,可下載導(dǎo)入或通過Maven導(dǎo)入:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

提取PDF表格需要用到庫中的PdfTableExtractor類。我們可以為載入的PDF文件創(chuàng)建PdfTableExtractor對象,然后使用PdfTableExtractor.extractTable()方法根據(jù)頁面在文檔中的參數(shù)提取指定PDF頁面上所有表格,最后再使用PdfTable.getText()方法即可獲取表格中的數(shù)據(jù)。以下是一般操作步驟示例:

  • 創(chuàng)建PdfDocument對象并使用PdfDocument.loadFromFile()方法載入PDF文檔。
  • 使用載入的PDF文檔創(chuàng)建PdfTableExtractor對象。
  • 使用PdfTableExtractor.extractTable()方法提取每個頁面上的表格。
  • 使用PdfTable.getText()方法獲取PDF表格的單元格數(shù)據(jù)。

使用上述方法獲取表格數(shù)據(jù)后,我們就可以將其寫入文本文件,或搭配其他工具制作CSV或Excel文件了。

提取PDF表格數(shù)據(jù)寫入文本文件

使用PdfTableExtractor.extractTable()方法提取表格并使用PdfTable.getText()方法獲取單元格數(shù)據(jù)后,我們可以通過構(gòu)建字符串并寫入文本文件來實(shí)現(xiàn)提取表格并保存為文本文件的目的。以下是詳細(xì)操作步驟:

  1. 導(dǎo)入所需模塊。
  2. 創(chuàng)建PdfDocument對象并使用PdfDocument.loadFromFile()方法載入PDF文檔。
  3. 使用載入的PDF文檔創(chuàng)建PdfTableExtractor對象。
  4. 遍歷頁面,使用PdfTableExtractor.extractTable()方法提取每個頁面上的所有表格。
  5. 遍歷提取到的表格,為每個表格創(chuàng)建一個StringBuilder對象。
  6. 遍歷表格中的行和列,使用PdfTable.getText()方法獲取每個單元格的數(shù)據(jù)并去除換行符。然后將單元格數(shù)據(jù)添加到StringBuilder對象。
  7. StringBuilder對象寫入文本文件。
  8. 釋放資源。

代碼示例

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;

public class 從PDF中提取文本 {
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建一個PdfDocument對象
        PdfDocument pdf = new PdfDocument();
        // 加載一個PDF文檔
        pdf.loadFromFile("Sample.pdf");

        // 創(chuàng)建一個PdfTableExtractor對象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 從每一頁中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不為空,則遍歷表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // 創(chuàng)建一個StringBuilder對象
                    StringBuilder tableText = new StringBuilder();
                    // 遍歷行和列
                    for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                            // 獲取單元格文本并移除換行符
                            String cellText = table.getText(rowIndex, colIndex);
                            cellText = cellText.replaceAll("\\r|\\n", "");
                            if (colIndex < table.getColumnCount() - 1) {
                                tableText.append(cellText).append("\t");
                            } else {
                                tableText.append(cellText).append("\n");
                            }
                        }
                    }
                    // 將表格寫入文本文件
                    try (FileWriter writer = new FileWriter("output/Tables/Page" + (pageIndex+1) + "-Table" + (tableIndex+1) + ".txt")) {
                        writer.write(tableText.toString());
                    }
                }
            }
        }
    }
}

提取結(jié)果

提取PDF表格數(shù)據(jù)寫入CSV文件

我們也可以用同樣的方法提取表格數(shù)據(jù),然后搭配其他模塊,如opencsv,將提取到的數(shù)據(jù)寫入CSV文件。也可以使用下面的提取PDF表格寫入Excel文件,最后保存時保存為CSV文件。
opencsv:

<dependency>
  <groupId>com.opencsv</groupId>
  <artifactId>opencsv</artifactId>
  <version>5.9</version>
</dependency>

以下是搭配opencsv提取PDF表格數(shù)據(jù)并寫入CSV文件的操作步驟:

  1. 導(dǎo)入所需模塊。
  2. 創(chuàng)建PdfDocument對象并使用PdfDocument.loadFromFile()方法載入PDF文檔。
  3. 使用載入的PDF文檔創(chuàng)建PdfTableExtractor對象。
  4. 歷頁面面,使用PdfTableExtractor.extractTable()方法提取每個頁面上的所有表格。
  5. 遍歷提取的表格,并構(gòu)建CSV文件名。
  6. 創(chuàng)建CSVWriter對象,遍歷表格行以及行中的列,使用PdfTable.getText()方法獲取每個單元格的數(shù)據(jù)并去除換行符,將提取的每行表格數(shù)據(jù)構(gòu)建為字符串列表。最后將字符串列表寫入為CSV數(shù)據(jù)行。
  7. 釋放資源。

代碼示例

import com.opencsv.CSVWriter;
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;

public class 從PDF表格提取到CSV {
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建一個PdfDocument對象
        PdfDocument pdf = new PdfDocument();
        // 加載一個PDF文檔
        pdf.loadFromFile("Sample.pdf");

        // 創(chuàng)建一個PdfTableExtractor對象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 從每一頁中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不為空,則遍歷表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // 創(chuàng)建CSV文件名
                    String csvFileName = "output/Tables/Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv";
                    // 創(chuàng)建一個CSVWriter對象
                    try (CSVWriter writer = new CSVWriter(new FileWriter(csvFileName))) {
                        // 遍歷行和列
                        for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                            String[] row = new String[table.getColumnCount()];
                            for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                                // 獲取單元格文本并移除換行符
                                String cellText = table.getText(rowIndex, colIndex).replaceAll("\\r?\\n", "");
                                row[colIndex] = cellText;
                            }
                            // 將行寫入CSV文件
                            writer.writeNext(row);
                        }
                    }
                }
            }
        }
        // 關(guān)閉PDF文檔
        pdf.close();
    }
}

提取結(jié)果

提取PDF表格數(shù)據(jù)寫入Excel文件

保存PDF表格到表格需要用到Free Spire.XLS for Java。我們可以提取到PDF文檔表格單元格數(shù)據(jù)后,使用Worksheet.getRange().setText()方法將數(shù)據(jù)寫入到創(chuàng)建的Excel工作表的相應(yīng)單元格并保存,從而實(shí)現(xiàn)PDF表格數(shù)據(jù)到Excel文件的提取。同時,我們還可以在保存文件時將格式參數(shù)設(shè)置為CSV,實(shí)現(xiàn)PDF表格數(shù)據(jù)到CSV文件的提取。
Free Spire.XLS for Java:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.3.0</version>
</dependency>

以下是詳細(xì)操作步驟:

  1. 導(dǎo)入所需模塊。
  2. 創(chuàng)建PdfDocument對象并使用PdfDocument.loadFromFile()方法載入PDF文檔。
  3. 創(chuàng)建Workbook對象,并使用Workbook.getWorksheets().clear()方法清除默認(rèn)工作表。
  4. 使用載入的PDF文檔創(chuàng)建PdfTableExtractor對象。
  5. 歷頁面面,使用PdfTableExtractor.extractTable()方法提取每個頁面上的所有表格。
  6. 遍歷提取的表格,使用Workbook.getWorksheets().add()方法為每個表格創(chuàng)建一個指定名稱的工作表。
  7. 遍歷表格行和列,使用PdfTable.getText()方法獲取每個單元格的數(shù)據(jù)并去除換行符,然后使用Worksheet.getRange().setText()方法將單元格數(shù)據(jù)寫入到工作表的相應(yīng)單元格。
  8. 設(shè)置工作表單元格的格式。
  9. 使用Worksheet.autoFitRow()Worksheet.autoFitColumn()方法自動調(diào)整行高和列寬。
  10. 可以使用Worksheet.saveToFile()方法將工作表保存為CSV文件。
  11. 使用Workbook.saveToFile()方法保存工作簿為Excel文件。
  12. 釋放資源。

代碼示例

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

public class 從PDF表格提取到Excel {
    public static void main(String[] args) {
        // 創(chuàng)建一個PdfDocument對象
        PdfDocument pdf = new PdfDocument();
        // 加載一個PDF文檔
        pdf.loadFromFile("G:/Documents/Sample73.pdf");

        // 創(chuàng)建一個Workbook對象
        Workbook workbook = new Workbook();
        workbook.getWorksheets().clear();

        // 創(chuàng)建一個PdfTableExtractor對象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 從每一頁中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不為空,則遍歷表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    // 向工作簿中添加一個工作表
                    Worksheet sheet = workbook.getWorksheets().add("Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1));
                    // 遍歷表格中的行和列
                    for (int rowIndex = 0; rowIndex < tables[tableIndex].getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < tables[tableIndex].getColumnCount(); colIndex++) {
                            // 獲取單元格文本并移除換行符
                            String cellText = tables[tableIndex].getText(rowIndex, colIndex).replaceAll("\\r|\\n", "");
                            // 將單元格文本寫入工作表
                            sheet.getCellRange(rowIndex+1, colIndex+1).setText(cellText);
                        }
                    }
                    // 設(shè)置單元格樣式
                    CellRange[] rows = sheet.getRows();
                    rows[0].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                    rows[0].getStyle().getFont().setSize(12);
                    rows[0].getStyle().getFont().isBold(true);
                    rows[0].getStyle().setHorizontalAlignment(HorizontalAlignType.Center);
                    for (int i = 1; i < rows.length; i++) {
                        rows[i].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                        rows[i].getStyle().getFont().setSize(12);
                        rows[i].getStyle().setHorizontalAlignment(HorizontalAlignType.Left);
                    }
                    // 自動調(diào)整行和列
                    for (int i = 0; i < rows.length; i++) {
                        sheet.autoFitRow(i+1);
                    }
                    for (int i = 0; i < sheet.getColumns().length; i++) {
                        sheet.autoFitColumn(i+1);
                    }
                    // 保存工作表為CSV文件
                    // sheet.saveToFile("output/Tables/PDFTableToCSV-Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv", ",");
                }
            }
        }

        // 保存工作簿
        workbook.saveToFile("output/PDFTableToExcel.xlsx");
        // 關(guān)閉PDF文檔
        pdf.close();
        // 釋放工作簿資源
        workbook.dispose();
    }
}

提取結(jié)果

本文演示了如何使用Java提取PDF表格數(shù)據(jù)寫入文本、CSV以及Excel文件。

以上就是利用Java提取PDF表格到文本、CSV及excel工作表的詳細(xì)內(nèi)容,更多關(guān)于Java提取PDF表格的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用Java生成二維碼并附帶文字信息

    用Java生成二維碼并附帶文字信息

    這篇文章主要介紹了用Java生成二維碼并附帶文字信息,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Idea 2020.2 創(chuàng)建web、Spring項(xiàng)目的教程圖解

    Idea 2020.2 創(chuàng)建web、Spring項(xiàng)目的教程圖解

    這篇文章主要介紹了Idea 2020.2 創(chuàng)建web、Spring項(xiàng)目的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 使用MappingJackson2XmlView實(shí)現(xiàn)JSON到XML的視圖轉(zhuǎn)換

    使用MappingJackson2XmlView實(shí)現(xiàn)JSON到XML的視圖轉(zhuǎn)換

    MappingJackson2XmlView來實(shí)現(xiàn)從JSON到XML格式的響應(yīng)轉(zhuǎn)換,本文將通過案例,將展示如何將JSON格式的數(shù)據(jù)轉(zhuǎn)換為XML格式,以滿足不同客戶端的數(shù)據(jù)交換需求,需要的朋友可以參考下
    2024-07-07
  • SpringBoot使用Captcha生成驗(yàn)證碼

    SpringBoot使用Captcha生成驗(yàn)證碼

    這篇文章主要介紹了SpringBoot如何使用Captcha生成驗(yàn)證碼,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-04-04
  • 詳解如何在Java8中創(chuàng)建和使用線程池

    詳解如何在Java8中創(chuàng)建和使用線程池

    在 Java 8 中,線程池(Thread Pool)是一種管理線程資源的機(jī)制,能夠有效地控制并發(fā)執(zhí)行的線程數(shù)量,減少線程創(chuàng)建和銷毀的開銷,提高系統(tǒng)的性能,本篇文章將詳細(xì)介紹如何在 Java 8 中創(chuàng)建和使用線程池,需要的朋友可以參考下
    2024-06-06
  • Java異常處理UncaughtExceptionHandler使用實(shí)例代碼詳解

    Java異常處理UncaughtExceptionHandler使用實(shí)例代碼詳解

    當(dāng)一個線程由于未捕獲異常即將終止時,Java虛擬機(jī)將使用thread . getuncaughtexceptionhandler()查詢線程的uncaughtException處理程序,并調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)傳遞
    2023-03-03
  • java 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法

    java 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法

    下面小編就為大家?guī)硪黄猨ava 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • java算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼

    java算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}

    關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸

    這篇文章主要介紹了關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴},本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot啟動原理深入解析

    SpringBoot啟動原理深入解析

    我們開發(fā)任何一個Spring Boot項(xiàng)目都會用到啟動類,下面這篇文章主要給大家介紹了關(guān)于SpringBoot啟動原理解析的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04

最新評論