Java 实现 Word 文档文本与图片提取的方法

在文档处理工作流中,从 Word 文件中提取核心内容是一项基础而频繁的需求。无论是为了文本分析、数据迁移,还是构建文档素材库,将文字和图片分别提取出来都能显著提高后续处理的灵活性。手动操作在面对批量文档时效率较低,而编程方式则能够实现自动化处理。本文将介绍如何利用 Java 语言,从 Word 文档中分别提取文本内容和图片资源。

环境配置

本文示例基于 Spire.Doc for Java 库实现。若使用 Maven 管理项目依赖,可在 pom.xml 中添加以下配置:

xml 复制代码
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc</artifactId>
        <version>14.6.0</version>
    </dependency>
</dependencies>

对于不使用 Maven 的项目,可下载 JAR 包并手动添加到项目的构建路径中。

文本提取:获取文档全部文字内容

提取 Word 文档中的文本是最常见的操作之一。该库提供了直接获取全文文本的方法,能够快速将文档内容转换为纯文本字符串。

实现步骤:

  1. 创建 Document 对象并加载Word文档;
  2. 调用 Document.getText() 方法获取所有文本内容;
  3. 将获取的字符串写入文本文件或进行后续处理。
java 复制代码
import com.spire.doc.Document;
import java.io.FileWriter;
import java.io.IOException;

public class ExtractTextDemo {
    public static void main(String[] args) throws IOException {
        Document document = new Document();
        document.loadFromFile("示例文档.docx");

        // 获取文档中的全部文本
        String text = document.getText();

        // 写入文本文件
        try (FileWriter writer = new FileWriter("文档文本内容.txt")) {
            writer.write(text);
        }

        document.dispose();
    }
}

这种方式的优点在于代码简洁,能够快速获取文档中的全部文字内容。需要注意的是,提取结果不保留任何格式信息(如字体、颜色、字号等),适合用于全文搜索、文本分析或内容摘要等场景。

图片提取:遍历文档树获取图片资源

Word 文档中的图片可能嵌入在正文段落、表格、文本框、页眉页脚等不同位置。因此,提取图片需要遍历整个文档的对象结构,识别所有图片类型的元素。

实现思路:

  1. 创建 Document 对象并加载文档;
  2. 使用队列或递归方式遍历文档中的复合对象;
  3. 检查每个子对象的类型是否为图片;
  4. 如果是图片,提取其图像数据并保存为文件。
java 复制代码
import com.spire.doc.Document;
import com.spire.doc.DocumentObjectType;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.interfaces.IDocumentObject;
import com.spire.doc.interfaces.ICompositeObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;

public class ExtractImagesDemo {
    public static void main(String[] args) throws IOException {
        Document document = new Document();
        document.loadFromFile("示例文档.docx");

        Queue<ICompositeObject> nodes = new LinkedList<>();
        nodes.add(document);

        int imageIndex = 0;

        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;
                    BufferedImage image = picture.getImage();
                    File outputFile = new File(String.format("图片_%d.png", imageIndex++));
                    ImageIO.write(image, "PNG", outputFile);
                }
            }
        }

        document.dispose();
        System.out.println("共提取图片:" + imageIndex + " 张");
    }
}

这段代码能够遍历文档中的所有图片,包括嵌入在表格、文本框或页眉页脚中的图片,并将其保存为 PNG 格式。如果需要 JPG 格式,可修改 ImageIO.write() 的第二个参数。

提取批注中的内容

批注是 Word 文档中常见的协作标记,其中也可能包含重要的文字信息或图片。提取批注内容需要从 Document.getComments() 集合入手。

提取批注文本的示例:

java 复制代码
import com.spire.doc.Document;
import com.spire.doc.Comment;
import com.spire.doc.documents.Paragraph;

public class ExtractCommentsDemo {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("含批注的文档.docx");

        for (int i = 0; i < doc.getComments().getCount(); i++) {
            Comment comment = doc.getComments().get(i);
            System.out.println("批注 #" + (i + 1) + ":");
            for (int j = 0; j < comment.getBody().getParagraphs().getCount(); j++) {
                Paragraph para = comment.getBody().getParagraphs().get(j);
                System.out.println(para.getText());
            }
        }

        doc.dispose();
    }
}

提取批注中的图片则需要进一步遍历批注内部的段落,检查其中是否包含 DocPicture 对象,方法与提取正文图片类似。

应用场景与处理建议

文本提取适用于全文检索、内容比对、语料库构建等场景;图片提取则适用于素材归档、图像识别预处理、多媒体内容管理等需求。

性能考虑:对于包含大量图片或复杂结构的文档,遍历操作可能耗时较长,建议在批量处理时控制并发数量。

格式兼容:不同版本的 Word 文档(.doc与.docx)内部结构存在差异,该库对两种格式均提供支持,但在处理旧版 .doc 文件时,部分格式特性可能受限。

资源管理 :每次操作完成后调用 dispose() 方法释放文档对象占用的资源,是避免内存泄漏的规范做法。

总结

本文介绍了利用 Java 语言从 Word 文档中提取文本和图片的技术方案。全文文本提取通过 Document.getText() 方法可一次性完成,操作简便,结果适合用于纯文本场景。图片提取则需要遍历文档的对象树结构,识别并保存所有图片类型的元素,该方法能够覆盖正文、表格、文本框和页眉页脚等多个位置的图片资源。此外,针对批注中的内容,可通过 Document.getComments() 集合进行定向提取。这些功能组合起来,能够满足文档内容解析和资源分离的常见需求,在数据迁移、内容分析和文档归档等应用场景中具有一定的参考价值。

相关推荐
蝎子莱莱爱打怪2 小时前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
Csvn2 小时前
Rsync 文件同步与增量备份 — 运维的数据守门员
后端
苏三说技术2 小时前
推荐一个牛逼的智能代码审查系统
后端
倾颜3 小时前
从 GitHub Actions 到本地兜底发布:AI Mind 容器化上线的一次真实收口
后端
像我这样帅的人丶你还3 小时前
Java 后端详解(二):注解、参数绑定、评论与用户认证
后端
用户762352425913 小时前
深入理解AQS之独占锁ReentrantLock
后端
用户762352425913 小时前
理解 CAS & Atomic 原子操作类
后端
SimonKing3 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员