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

Java實(shí)現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼

 更新時(shí)間:2025年08月31日 09:32:33   作者:Eiceblue  
在很多企業(yè)辦公和數(shù)據(jù)分析的場(chǎng)景中,PDF 中常常存放著報(bào)表、清單或統(tǒng)計(jì)數(shù)據(jù),本文將介紹如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自動(dòng)轉(zhuǎn)換,感興趣的看了解下

在很多企業(yè)辦公和數(shù)據(jù)分析的場(chǎng)景中,PDF 中常常存放著報(bào)表、清單或統(tǒng)計(jì)數(shù)據(jù)。相比 PDF,CSV 文件 更易于在 Excel 或數(shù)據(jù)庫(kù)中進(jìn)行進(jìn)一步處理。因此,我們常常需要一種方式,將 PDF 中的表格數(shù)據(jù)批量抽取并導(dǎo)出為 CSV 文件。

本文將介紹如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自動(dòng)轉(zhuǎn)換。

環(huán)境準(zhǔn)備

在項(xiàng)目中引入 Free Spire.PDF for Java,可以通過(guò) 下載 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 表格導(dǎo)出為 CSV:完整流程

通過(guò) Java 程序結(jié)合 Free Spire.PDF,可以實(shí)現(xiàn)從 加載 PDF、提取表格、到生成 CSV 文件 的完整自動(dòng)化流程,下面我們將詳細(xì)介紹如何實(shí)現(xiàn)這個(gè)自動(dòng)化流程。

Step 1: 加載 PDF 文檔

首先,創(chuàng)建 PdfDocument 對(duì)象并加載需要處理的 PDF 文件:

import com.spire.pdf.*;

PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("Sample.pdf");

Step 2: 提取 PDF 表格數(shù)據(jù)

Spire.PDF 提供 PdfTableExtractor 類來(lái)專門識(shí)別表格。

我們識(shí)別指定 PDF 頁(yè)面中的指定表格,然后逐行逐列讀取表格內(nèi)容,并用 StringBuilder 拼接為 CSV 格式。

import com.spire.pdf.utilities.*;
import java.io.*;

StringBuilder sb = new StringBuilder();

PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 提取第一頁(yè)的表格
PdfTable[] tables = extractor.extractTable(0);

if (tables != null) {
    // 獲取第一個(gè)表格
    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");
    }
}

這里我們還需要一個(gè)工具方法來(lái)處理 CSV 中的特殊字符(如逗號(hào)、引號(hào)):

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 文件

將拼接好的字符串寫入文件,最終得到一個(gè)標(biāo)準(zhǔn)的 CSV:

try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {
    writer.write(sb.toString());
}
pdf.close();
System.out.println("PDF 表格已成功導(dǎo)出為 CSV。");

PDF轉(zhuǎn)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 表格已成功導(dǎo)出為 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;
    }
}

轉(zhuǎn)換結(jié)果示例

進(jìn)階擴(kuò)展

上面的示例將 所有表格合并到一個(gè) CSV 文件 中。在實(shí)際業(yè)務(wù)中,我們還可能有不同的需求:

1. 每個(gè)表格單獨(dú)保存

如果 PDF 每頁(yè)包含多個(gè)表格,可以為每個(gè)表格生成獨(dú)立的 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());
            }
        }
    }
}

這樣,每個(gè)表格會(huì)被單獨(dú)導(dǎo)出,命名為 Page0_Table0.csv 等。

2. 合并所有表格到一個(gè)文件

有時(shí)我們不想把每個(gè)表格拆開保存,而是希望把整份 PDF 中的表格內(nèi)容都匯總到同一個(gè) CSV 文件中,方便統(tǒng)一分析。下面的示例展示了如何實(shí)現(xiàn):

// 用于合并所有跨頁(yè)表格的內(nèi)容
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");
            }
        }
    }
}

// 統(tǒng)一寫入一個(gè) CSV 文件
try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output/MergedTable.csv"), "UTF-8")) {
    writer.write(mergedTableContent.toString());
}

運(yùn)行后,PDF 中的所有表格會(huì)被逐一讀取并寫入 同一個(gè) CSV 文件,文件路徑為 output/MergedTables.csv。

總結(jié)

本文介紹了如何在 Java 中使用 Free Spire.PDF for Java 將 PDF 中的表格內(nèi)容導(dǎo)出為 CSV 文件。整體流程分為:

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

并擴(kuò)展了 分表導(dǎo)出合并導(dǎo)出 兩種常見應(yīng)用場(chǎng)景。

這種方式可以高效處理 PDF 報(bào)表、財(cái)務(wù)清單、問(wèn)卷統(tǒng)計(jì)等數(shù)據(jù),極大減少人工操作的工作量。

到此這篇關(guān)于Java實(shí)現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼的文章就介紹到這了,更多相關(guān)Java PDF表格轉(zhuǎn)CSV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中使用?POI的示例代碼

    SpringBoot中使用?POI的示例代碼

    這篇文章主要介紹了SpringBoot中使用POI的實(shí)例詳解,包括引入poi的jar包和創(chuàng)建excel的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Springboot網(wǎng)站第三方登錄 微信登錄

    Springboot網(wǎng)站第三方登錄 微信登錄

    這篇文章主要為大家詳細(xì)介紹了Springboot網(wǎng)站第三方登錄 ,微信登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • SpringBoot項(xiàng)目集成第三方CAS-client jar包的方法

    SpringBoot項(xiàng)目集成第三方CAS-client jar包的方法

    本文介紹了SpringBoot中集成第三方CAS-clientjar包的兩種核心方式,涵蓋了從背景原理到實(shí)操步驟、依賴沖突解決、打包配置及常見問(wèn)題排查的全面內(nèi)容,通過(guò)對(duì)比兩種集成方式,提出了選型建議,并強(qiáng)調(diào)了依賴管理的規(guī)范性,為實(shí)際項(xiàng)目開發(fā)提供了全面指導(dǎo),感興趣的朋友一起看看吧
    2025-12-12
  • XXL-Job端口額外占用問(wèn)題的解決方法小結(jié)

    XXL-Job端口額外占用問(wèn)題的解決方法小結(jié)

    最近博主在Spring整合XXL-JOB到項(xiàng)目時(shí)發(fā)現(xiàn)了個(gè)問(wèn)題,注冊(cè)執(zhí)行器需要額外占用端口,也就是我們每啟動(dòng)一個(gè)程序,除了程序本身的API端口外,還需要額外開放一個(gè)執(zhí)行器端口,所以本文給大家分享了XXL-Job端口額外占用問(wèn)題的解決方法小結(jié),需要的朋友可以參考下
    2024-05-05
  • MyBatis-Plus中靜態(tài)工具Db的多種用法及實(shí)例分析

    MyBatis-Plus中靜態(tài)工具Db的多種用法及實(shí)例分析

    本文將詳細(xì)講解MyBatis-Plus中靜態(tài)工具Db的各種用法,并結(jié)合具體案例進(jìn)行演示和說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java中的數(shù)組與集合基本用法詳解

    Java中的數(shù)組與集合基本用法詳解

    本文介紹了Java數(shù)組和集合框架的基礎(chǔ)知識(shí),數(shù)組部分涵蓋了一維、二維及多維數(shù)組的聲明、初始化、訪問(wèn)與遍歷方法,以及Arrays類的常用操作,對(duì)Java數(shù)組與集合相關(guān)知識(shí)感興趣的朋友一起看看吧
    2025-07-07
  • Java編譯生成多個(gè).class文件的原理和作用

    Java編譯生成多個(gè).class文件的原理和作用

    作為一名經(jīng)驗(yàn)豐富的開發(fā)者,在Java項(xiàng)目中執(zhí)行編譯后,可能會(huì)發(fā)現(xiàn)一個(gè).java源文件有時(shí)會(huì)產(chǎn)生多個(gè).class文件,從技術(shù)實(shí)現(xiàn)層面詳細(xì)剖析這一現(xiàn)象
    2025-04-04
  • 詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn)

    詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn)

    這篇文章主要介紹了詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 一文搞懂Spring AOP的五大通知類型

    一文搞懂Spring AOP的五大通知類型

    本文將詳細(xì)為大家介紹Spring AOP的五種通知類型(前置通知、后置通知、返回通知、異常通知、環(huán)繞通知),感興趣的朋友可以了解一下
    2022-06-06
  • java 面向?qū)ο竺嬖嚰\

    java 面向?qū)ο竺嬖嚰\

    這篇文章主要介紹了java 面向?qū)ο竺嬖嚰\的相關(guān)資料,這里整理了面向?qū)ο蟮幕A(chǔ)知識(shí),幫助大家學(xué)習(xí)理解此部分的知識(shí),需要的朋友可以參考下
    2016-11-11

最新評(píng)論

眉山市| 宿州市| 东源县| 水富县| 雅江县| 上饶县| 鸡东县| 综艺| 光泽县| 蒙城县| 镇安县| 舞钢市| 清徐县| 株洲县| 承德市| 咸宁市| 辉县市| 桂林市| 保定市| 汉寿县| 顺平县| 开封市| 澎湖县| 项城市| 凭祥市| 赤峰市| 古蔺县| 柏乡县| 丹东市| 中江县| 山阳县| 洛南县| 林甸县| 蛟河市| 普安县| 涞水县| 密山市| 灌云县| 建德市| 怀远县| 嘉祥县|