弹射起步
126.18M · 2026-03-26
在 Java 开发项目中,处理 Microsoft Word 文档是常见场景。例如,内容管理系统需要批量解析文档文本用于搜索索引,数据迁移工具需分离图像以便独立存储,或内容分析应用要提取素材进行二次加工。此时,从 Word 文件中精确提取文本和图像就显得尤为重要。
本文介绍如何借助 Spire.Doc for Java 库实现这一功能。该库提供文档加载、对象遍历和元素提取的 API,支持 DOC 和 DOCX 等格式,无需安装 Microsoft Office,即可完成操作。以下内容以开发者视角,逐步说明实现步骤,附带完整可运行代码。
确保开发环境为 JDK 8 或更高版本。推荐使用 Maven 管理依赖,在 pom.xml 中添加以下配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url></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,其中包含普通文本、标题和嵌入图像。
提取文本的核心是加载文档后调用 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() 返回的字符串已去除大部分控制字符,但保留换行和空格。document.getSections() 和 Paragraph 对象,自定义过滤逻辑。运行后,extracted_text.txt 即包含完整文本,可直接用于后续业务处理。
Word 文档中的图像以 DocPicture 对象形式存在,可能嵌套在段落、文本框、表格或页眉中。因此不能简单遍历顶层元素,而需采用广度优先搜索(BFS)遍历整个文档对象树。
核心步骤:
ICompositeObject),从根节点 Document 开始遍历。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() 逻辑。该方法能完整提取文档内所有独立图像,包括形状中嵌入的图片。
loadFromFile 和 ImageIO 操作,捕获 IOException 和 Exception。.doc(旧版)和 .docx(新版)。Paragraph.getChildObjects() 实现按章节提取,或将图像直接转换为 Base64 用于 Web 展示。通过 Spire.Doc for Java 的 Document、ICompositeObject 和 DocPicture 等 API,从 Word 文档中提取文本和图像变得简洁高效。上述两个示例只需几十行代码即可运行,适合快速集成到各类 Java 项目中。开发者可根据实际业务,在此基础上扩展为批量处理、按条件过滤或结合其他库(如 Apache Tika 做进一步解析)。
完整代码可直接复制到 IDE 测试,建议准备不同结构的 Word 样本文档验证效果。掌握这一技能后,Word 文档处理将不再是开发瓶颈。