引言
在 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)遍历整个文档对象树。
核心步骤:
- 加载文档。
- 使用队列存储复合对象(
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()逻辑。
该方法能完整提取文档内所有独立图像,包括形状中嵌入的图片。
4. 注意事项与最佳实践
- 异常处理:实际项目中应包裹
loadfromfile和imageio操作,捕获ioexception和exception。 - 性能:对于超大文档(数百页),遍历过程耗时可接受,但建议分批处理或增加进度提示。
- 格式支持:同时兼容
.doc(旧版)和.docx(新版)。 - 权限与路径:确保程序对输入文件有读取权限,对输出目录有写入权限。
- 进一步扩展:可结合
paragraph.getchildobjects()实现按章节提取,或将图像直接转换为 base64 用于 web 展示。 - 许可证:免费版存在功能限制(如水印),生产环境建议评估商业版需求。
5. 总结
通过 spire.doc for java 的 document、icompositeobject 和 docpicture 等 api,从 word 文档中提取文本和图像变得简洁高效。上述两个示例只需几十行代码即可运行,适合快速集成到各类 java 项目中。开发者可根据实际业务,在此基础上扩展为批量处理、按条件过滤或结合其他库(如 apache tika 做进一步解析)。
完整代码可直接复制到 ide 测试,建议准备不同结构的 word 样本文档验证效果。掌握这一技能后,word 文档处理将不再是开发瓶颈。
以上就是java实现从word文档中提取文本和图像的详细内容,更多关于java提取word文本和图像的资料请关注代码网其它相关文章!
发表评论