在文档处理工作流中,从 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 文档中的文本是最常见的操作之一。该库提供了直接获取全文文本的方法,能够快速将文档内容转换为纯文本字符串。
实现步骤:
- 创建
Document对象并加载Word文档; - 调用
Document.getText()方法获取所有文本内容; - 将获取的字符串写入文本文件或进行后续处理。
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 文档中的图片可能嵌入在正文段落、表格、文本框、页眉页脚等不同位置。因此,提取图片需要遍历整个文档的对象结构,识别所有图片类型的元素。
实现思路:
- 创建
Document对象并加载文档; - 使用队列或递归方式遍历文档中的复合对象;
- 检查每个子对象的类型是否为图片;
- 如果是图片,提取其图像数据并保存为文件。
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() 集合进行定向提取。这些功能组合起来,能够满足文档内容解析和资源分离的常见需求,在数据迁移、内容分析和文档归档等应用场景中具有一定的参考价值。