Java实现从Word文档中提取文本和图像

 更新时间:2026年03月25日 10:03:37   作者:缺点内向  
在 Java 开发项目中,处理 Microsoft Word 文档是常见场景,例如,内容管理系统需要批量解析文档文本用于搜索索引,数据迁移工具需分离图像以便独立存储,本文介绍如何借助 Spire.Doc for Java 库实现这一功能,需要的朋友可以参考下

引言

在 Java 开发项目中,处理 Microsoft Word 文档是常见场景。例如,内容管理系统需要批量解析文档文本用于搜索索引,数据迁移工具需分离图像以便独立存储,或内容分析应用要提取素材进行二次加工。此时,从 Word 文件中精确提取文本和图像就显得尤为重要。

本文介绍如何借助 Spire.Doc for Java 库实现这一功能。该库提供文档加载、对象遍历和元素提取的 API,支持 DOC 和 DOCX 等格式,无需安装 Microsoft Office,即可完成操作。以下内容以开发者视角,逐步说明实现步骤,附带完整可运行代码。

1. 环境准备

确保开发环境为 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。准备好测试文档,例如 sample.docx,其中包含普通文本、标题和嵌入图像。

2. 提取文本

提取文本的核心是加载文档后调用 getText() 方法,该方法会返回文档中所有可见文本内容(包括正文、页眉、页脚等),以字符串形式呈现。后续可将其保存为 .txt 文件或进一步处理(如分词、存储到数据库)。

完整示例代码如下:

import com.spire.doc.Document;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractTextFromWord {
    public static void main(String[] args) throws IOException {
        // 创建 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 关闭流,避免资源泄漏。
    若只需提取特定部分(如仅正文),可遍历 document.getSections()Paragraph 对象,自定义过滤逻辑。

运行后,extracted_text.txt 即包含完整文本,可直接用于后续业务处理。

3. 提取图像

Word 文档中的图像以 DocPicture 对象形式存在,可能嵌套在段落、文本框、表格或页眉中。因此不能简单遍历顶层元素,而需采用广度优先搜索(BFS)遍历整个文档对象树。

核心步骤:

  1. 加载文档。
  2. 使用队列存储复合对象(ICompositeObject),从根节点 Document 开始遍历。
  3. 遇到子节点为 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) {
                    // 复合对象继续入队
                    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 实现队列,实现 BFS 遍历,确保所有嵌套图像都被发现。
  • DocumentObjectType.Picture 是判断图像的关键枚举。
  • ImageIO.write() 支持 PNG、JPG 等格式,可根据 picture.getImageType() 动态选择。
  • 建议提前创建 output 目录,或添加 mkdirs() 逻辑。

该方法能完整提取文档内所有独立图像,包括形状中嵌入的图片。

4. 注意事项与最佳实践

  • 异常处理:实际项目中应包裹 loadFromFileImageIO 操作,捕获 IOExceptionException
  • 性能:对于超大文档(数百页),遍历过程耗时可接受,但建议分批处理或增加进度提示。
  • 格式支持:同时兼容 .doc(旧版)和 .docx(新版)。
  • 权限与路径:确保程序对输入文件有读取权限,对输出目录有写入权限。
  • 进一步扩展:可结合 Paragraph.getChildObjects() 实现按章节提取,或将图像直接转换为 Base64 用于 Web 展示。
  • 许可证:免费版存在功能限制(如水印),生产环境建议评估商业版需求。

5. 总结

通过 Spire.Doc for Java 的 DocumentICompositeObjectDocPicture 等 API,从 Word 文档中提取文本和图像变得简洁高效。上述两个示例只需几十行代码即可运行,适合快速集成到各类 Java 项目中。开发者可根据实际业务,在此基础上扩展为批量处理、按条件过滤或结合其他库(如 Apache Tika 做进一步解析)。

完整代码可直接复制到 IDE 测试,建议准备不同结构的 Word 样本文档验证效果。掌握这一技能后,Word 文档处理将不再是开发瓶颈。

以上就是Java实现从Word文档中提取文本和图像的详细内容,更多关于Java提取Word文本和图像的资料请关注脚本之家其它相关文章!

相关文章

  • Java Thread之Sleep()案例详解

    Java Thread之Sleep()案例详解

    这篇文章主要介绍了Java Thread之Sleep()案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • dependencies导致的Maven依赖出错包红问题解决方法

    dependencies导致的Maven依赖出错包红问题解决方法

    多模块和分布式开发一般都是有专门的的dependencies来进行jar包的版本依赖问题,本文主要介绍了dependencies导致的Maven依赖出错包红问题解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • java使用链表来模拟栈的入栈出栈操作实例代码

    java使用链表来模拟栈的入栈出栈操作实例代码

    这篇文章主要介绍了java 使用链表来模拟栈的入栈出栈操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • java基础之初始化ArrayList时直接赋值的4种方式总结

    java基础之初始化ArrayList时直接赋值的4种方式总结

    ArrayList是Java中的一个类,它是Java集合框架中的一部分,用于实现动态数组,下面这篇文章主要给大家介绍了关于java基础之初始化ArrayList时直接赋值的4种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Springboot项目的服务器部署与发布方式

    Springboot项目的服务器部署与发布方式

    本文记录了将Springboot项目部署到服务器并发布的过程,包括在IDEA中打包、选择服务器、连接服务器、安装环境、上传jar包、配置环境变量以及运行项目等步骤
    2025-03-03
  • Java打包可执行JAR文件的三种方式详解

    Java打包可执行JAR文件的三种方式详解

    很多 Java 开发者都遇到过这样的问题,一打包就报错 ClassNotFoundException,其实这就是JAR 包没打好,下面我们就来看看Maven打可执行 JAR 的三种详细方法吧
    2025-12-12
  • 使用Maven打包时包含资源文件和源码到jar的方法

    使用Maven打包时包含资源文件和源码到jar的方法

    这篇文章主要介绍了使用Maven打包时包含资源文件和源码到jar的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 详解Java 缺失的特性扩展方法

    详解Java 缺失的特性扩展方法

    这篇文章主要为大家介绍了Java 缺失的特性扩展方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 一文详解Java中多进程与多线程处理

    一文详解Java中多进程与多线程处理

    在Java编程中,多进程和多线程是两种常见的并发编程技术,用于提高程序的执行效率和响应速度,本文将为大家简单介绍一下多进程与多线程处理的相关知识,希望对大家有所帮助
    2025-01-01
  • Java CompletableFuture之异步执行、链式调用、组合多个Future、异常处理和超时控制等详解

    Java CompletableFuture之异步执行、链式调用、组合多个Future、异常处理和超时控制等详

    这篇文章主要介绍了Java CompletableFuture之异步执行、链式调用、组合多个Future、异常处理和超时控制等用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论