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

Java實現(xiàn)從Word文檔中提取文本和圖像

 更新時間:2026年03月25日 10:03:37   作者:缺點內(nèi)向  
在 Java 開發(fā)項目中,處理 Microsoft Word 文檔是常見場景,例如,內(nèi)容管理系統(tǒng)需要批量解析文檔文本用于搜索索引,數(shù)據(jù)遷移工具需分離圖像以便獨立存儲,本文介紹如何借助 Spire.Doc for Java 庫實現(xiàn)這一功能,需要的朋友可以參考下

引言

在 Java 開發(fā)項目中,處理 Microsoft Word 文檔是常見場景。例如,內(nèi)容管理系統(tǒng)需要批量解析文檔文本用于搜索索引,數(shù)據(jù)遷移工具需分離圖像以便獨立存儲,或內(nèi)容分析應(yīng)用要提取素材進行二次加工。此時,從 Word 文件中精確提取文本和圖像就顯得尤為重要。

本文介紹如何借助 Spire.Doc for Java 庫實現(xiàn)這一功能。該庫提供文檔加載、對象遍歷和元素提取的 API,支持 DOC 和 DOCX 等格式,無需安裝 Microsoft Office,即可完成操作。以下內(nèi)容以開發(fā)者視角,逐步說明實現(xiàn)步驟,附帶完整可運行代碼。

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

確保開發(fā)環(huán)境為 JDK 8 或更高版本。推薦使用 Maven 管理依賴,在 pom.xml 中添加以下配置:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc</artifactId>
        <version>14.3.1</version>
    </dependency>
</dependencies>

若不使用 Maven,可從官方站點下載 Spire.Doc.jar 并添加到項目 classpath。準(zhǔn)備好測試文檔,例如 sample.docx,其中包含普通文本、標(biāo)題和嵌入圖像。

2. 提取文本

提取文本的核心是加載文檔后調(diào)用 getText() 方法,該方法會返回文檔中所有可見文本內(nèi)容(包括正文、頁眉、頁腳等),以字符串形式呈現(xiàn)。后續(xù)可將其保存為 .txt 文件或進一步處理(如分詞、存儲到數(shù)據(jù)庫)。

完整示例代碼如下:

import com.spire.doc.Document;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractTextFromWord {
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建 Document 對象并加載 Word 文檔
        Document document = new Document();
        document.loadFromFile("sample.docx");
        // 獲取文檔全部文本
        String text = document.getText();
        // 保存為 TXT 文件
        writeStringToTxt(text, "extracted_text.txt");
        System.out.println("文本提取完成,已保存至 extracted_text.txt");
    }
    private static void writeStringToTxt(String content, String txtFileName) throws IOException {
        try (FileWriter writer = new FileWriter(txtFileName)) {
            writer.write(content);
        }
    }
}

說明

  • loadFromFile() 支持絕對路徑或相對路徑,自動識別 DOC/DOCX。
  • getText() 返回的字符串已去除大部分控制字符,但保留換行和空格。
  • 使用 try-with-resources 關(guān)閉流,避免資源泄漏。
    若只需提取特定部分(如僅正文),可遍歷 document.getSections()Paragraph 對象,自定義過濾邏輯。

運行后,extracted_text.txt 即包含完整文本,可直接用于后續(xù)業(yè)務(wù)處理。

3. 提取圖像

Word 文檔中的圖像以 DocPicture 對象形式存在,可能嵌套在段落、文本框、表格或頁眉中。因此不能簡單遍歷頂層元素,而需采用廣度優(yōu)先搜索(BFS)遍歷整個文檔對象樹。

核心步驟:

  1. 加載文檔。
  2. 使用隊列存儲復(fù)合對象(ICompositeObject),從根節(jié)點 Document 開始遍歷。
  3. 遇到子節(jié)點為 Picture 類型時,提取 BufferedImage 并保存。

完整代碼如下:

import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
import com.spire.doc.interfaces.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;

public class ExtractImagesFromWord {
    public static void main(String[] args) throws IOException {
        // 加載文檔
        Document document = new Document();
        document.loadFromFile("sample.docx");

        // BFS 遍歷隊列
        Queue<ICompositeObject> nodes = new LinkedList<>();
        nodes.add(document);

        // 存儲提取的圖像
        List<BufferedImage> images = new ArrayList<>();

        // 遍歷文檔樹
        while (!nodes.isEmpty()) {
            ICompositeObject node = nodes.poll();
            for (int i = 0; i < node.getChildObjects().getCount(); i++) {
                IDocumentObject child = node.getChildObjects().get(i);
                if (child instanceof ICompositeObject) {
                    // 復(fù)合對象繼續(xù)入隊
                    nodes.add((ICompositeObject) child);
                } else if (child.getDocumentObjectType() == DocumentObjectType.Picture) {
                    // 提取圖像
                    DocPicture picture = (DocPicture) child;
                    images.add(picture.getImage());
                }
            }
        }

        // 保存所有圖像(確保 output 目錄存在)
        File outputDir = new File("output");
        if (!outputDir.exists()) {
            outputDir.mkdirs();
        }
        for (int i = 0; i < images.size(); i++) {
            File file = new File(outputDir, String.format("image_%d.png", i));
            ImageIO.write(images.get(i), "PNG", file);
            System.out.println("已保存圖像: " + file.getName());
        }

        System.out.println("共提取 " + images.size() + " 張圖像");
    }
}

說明

  • 使用 LinkedList 實現(xiàn)隊列,實現(xiàn) BFS 遍歷,確保所有嵌套圖像都被發(fā)現(xiàn)。
  • DocumentObjectType.Picture 是判斷圖像的關(guān)鍵枚舉。
  • ImageIO.write() 支持 PNG、JPG 等格式,可根據(jù) picture.getImageType() 動態(tài)選擇。
  • 建議提前創(chuàng)建 output 目錄,或添加 mkdirs() 邏輯。

該方法能完整提取文檔內(nèi)所有獨立圖像,包括形狀中嵌入的圖片。

4. 注意事項與最佳實踐

  • 異常處理:實際項目中應(yīng)包裹 loadFromFileImageIO 操作,捕獲 IOExceptionException。
  • 性能:對于超大文檔(數(shù)百頁),遍歷過程耗時可接受,但建議分批處理或增加進度提示。
  • 格式支持:同時兼容 .doc(舊版)和 .docx(新版)。
  • 權(quán)限與路徑:確保程序?qū)斎胛募凶x取權(quán)限,對輸出目錄有寫入權(quán)限。
  • 進一步擴展:可結(jié)合 Paragraph.getChildObjects() 實現(xiàn)按章節(jié)提取,或?qū)D像直接轉(zhuǎn)換為 Base64 用于 Web 展示。
  • 許可證:免費版存在功能限制(如水?。?,生產(chǎn)環(huán)境建議評估商業(yè)版需求。

5. 總結(jié)

通過 Spire.Doc for Java 的 Document、ICompositeObjectDocPicture 等 API,從 Word 文檔中提取文本和圖像變得簡潔高效。上述兩個示例只需幾十行代碼即可運行,適合快速集成到各類 Java 項目中。開發(fā)者可根據(jù)實際業(yè)務(wù),在此基礎(chǔ)上擴展為批量處理、按條件過濾或結(jié)合其他庫(如 Apache Tika 做進一步解析)。

完整代碼可直接復(fù)制到 IDE 測試,建議準(zhǔn)備不同結(jié)構(gòu)的 Word 樣本文檔驗證效果。掌握這一技能后,Word 文檔處理將不再是開發(fā)瓶頸。

以上就是Java實現(xiàn)從Word文檔中提取文本和圖像的詳細內(nèi)容,更多關(guān)于Java提取Word文本和圖像的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java Thread之Sleep()案例詳解

    Java Thread之Sleep()案例詳解

    這篇文章主要介紹了Java Thread之Sleep()案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法

    dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法

    多模塊和分布式開發(fā)一般都是有專門的的dependencies來進行jar包的版本依賴問題,本文主要介紹了dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • java使用鏈表來模擬棧的入棧出棧操作實例代碼

    java使用鏈表來模擬棧的入棧出棧操作實例代碼

    這篇文章主要介紹了java 使用鏈表來模擬棧的入棧出棧操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java基礎(chǔ)之初始化ArrayList時直接賦值的4種方式總結(jié)

    java基礎(chǔ)之初始化ArrayList時直接賦值的4種方式總結(jié)

    ArrayList是Java中的一個類,它是Java集合框架中的一部分,用于實現(xiàn)動態(tài)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)之初始化ArrayList時直接賦值的4種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Springboot項目的服務(wù)器部署與發(fā)布方式

    Springboot項目的服務(wù)器部署與發(fā)布方式

    本文記錄了將Springboot項目部署到服務(wù)器并發(fā)布的過程,包括在IDEA中打包、選擇服務(wù)器、連接服務(wù)器、安裝環(huán)境、上傳jar包、配置環(huán)境變量以及運行項目等步驟
    2025-03-03
  • Java打包可執(zhí)行JAR文件的三種方式詳解

    Java打包可執(zhí)行JAR文件的三種方式詳解

    很多?Java?開發(fā)者都遇到過這樣的問題,一打包就報錯?ClassNotFoundException,其實這就是JAR?包沒打好,下面我們就來看看Maven打可執(zhí)行?JAR?的三種詳細方法吧
    2025-12-12
  • 使用Maven打包時包含資源文件和源碼到j(luò)ar的方法

    使用Maven打包時包含資源文件和源碼到j(luò)ar的方法

    這篇文章主要介紹了使用Maven打包時包含資源文件和源碼到j(luò)ar的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Java?缺失的特性擴展方法

    詳解Java?缺失的特性擴展方法

    這篇文章主要為大家介紹了Java?缺失的特性擴展方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 一文詳解Java中多進程與多線程處理

    一文詳解Java中多進程與多線程處理

    在Java編程中,多進程和多線程是兩種常見的并發(fā)編程技術(shù),用于提高程序的執(zhí)行效率和響應(yīng)速度,本文將為大家簡單介紹一下多進程與多線程處理的相關(guān)知識,希望對大家有所幫助
    2025-01-01
  • Java CompletableFuture之異步執(zhí)行、鏈?zhǔn)秸{(diào)用、組合多個Future、異常處理和超時控制等詳解

    Java CompletableFuture之異步執(zhí)行、鏈?zhǔn)秸{(diào)用、組合多個Future、異常處理和超時控制等詳

    這篇文章主要介紹了Java CompletableFuture之異步執(zhí)行、鏈?zhǔn)秸{(diào)用、組合多個Future、異常處理和超時控制等用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

大宁县| 辽宁省| 伊宁市| 隆昌县| 阿克陶县| 武城县| 洞头县| 阳谷县| 扬州市| 乌拉特后旗| 卓资县| 乌苏市| 修武县| 高淳县| 关岭| 佛坪县| 永宁县| 桃源县| 肇源县| 同江市| 清涧县| 宝鸡市| 酉阳| 江城| 德阳市| 集贤县| 读书| 龙岩市| 桂东县| 瓦房店市| 庆城县| 牡丹江市| 贵州省| 绥化市| 渭源县| 齐齐哈尔市| 抚顺市| 夹江县| 射阳县| 泌阳县| 叙永县|