Apache Tika无法提取Word(.doc/.docx)嵌入图片文本,求解决方案
Apache Tika提取Word嵌入图片文本的问题解决
问题描述
使用Apache Tika提取.doc/.docx文件文本时,普通文本可正常提取,但嵌入图片中的文本无法识别:
- .doc文档返回类似
_2147483647.unknown的占位符内容 - .docx文档仅返回图片文件名(如
image1.jpeg, image2.jpg)
已安装Tesseract OCR,需解决嵌入图片的文本提取问题。
当前使用的代码:
public String extractTextFromWord(MultipartFile wordFile) throws IOException, TikaException, SAXException { if (wordFile.isEmpty()) { return null; } // media type Tika tika = new Tika(); String mediaType = tika.detect(wordFile.getInputStream()); if (Set.of( "application/x-tika-msoffice", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ).contains(mediaType)) { // extract text Parser parser = new AutoDetectParser(); ContentHandler contentHandler = new BodyContentHandler(-1); ParseContext parseContext = new ParseContext(); parseContext.set(TesseractOCRConfig.class, new TesseractOCRConfig()); parseContext.set(Parser.class, parser); parser.parse(wordFile.getInputStream(), contentHandler, new Metadata(), parseContext); return contentHandler.toString(); } throw new RuntimeException("File is not a valid Microsoft Word document!"); }
解决步骤
1. 完善Tesseract OCR配置
你当前仅初始化了TesseractOCRConfig但未做必要配置,需明确启用图片处理,并在Tesseract未加入系统环境变量时指定安装路径:
TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); // 若Tesseract不在系统PATH中,取消注释并指定路径(示例) // ocrConfig.setTesseractPath("/usr/bin/tesseract"); // Linux/Mac // ocrConfig.setTesseractPath("C:\\Program Files\\Tesseract-OCR"); // Windows ocrConfig.setEnableImageProcessing(true);
2. 启用Office文档内嵌图片提取
添加OfficeParserConfig配置,让Tika解析Office文档时主动提取内嵌图片,而非仅返回占位符:
OfficeParserConfig officeConfig = new OfficeParserConfig(); officeConfig.setExtractInlineImages(true); // 核心配置:开启内嵌图片提取 parseContext.set(OfficeParserConfig.class, officeConfig);
3. 修改后的完整代码
public String extractTextFromWord(MultipartFile wordFile) throws IOException, TikaException, SAXException { if (wordFile.isEmpty()) { return null; } // 检测文件类型 Tika tika = new Tika(); String mediaType = tika.detect(wordFile.getInputStream()); if (Set.of( "application/x-tika-msoffice", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ).contains(mediaType)) { // 初始化解析器和处理组件 Parser parser = new AutoDetectParser(); ContentHandler contentHandler = new BodyContentHandler(-1); ParseContext parseContext = new ParseContext(); // 配置Tesseract OCR TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); // 按需指定Tesseract路径 // ocrConfig.setTesseractPath("你的Tesseract安装路径"); ocrConfig.setEnableImageProcessing(true); // 配置Office文档解析规则 OfficeParserConfig officeConfig = new OfficeParserConfig(); officeConfig.setExtractInlineImages(true); // 注入配置到解析上下文 parseContext.set(TesseractOCRConfig.class, ocrConfig); parseContext.set(OfficeParserConfig.class, officeConfig); parseContext.set(Parser.class, parser); parser.parse(wordFile.getInputStream(), contentHandler, new Metadata(), parseContext); return contentHandler.toString(); } throw new RuntimeException("File is not a valid Microsoft Word document!"); }
4. 依赖检查
确保项目依赖包含Tika的OCR模块及标准解析包(以Maven为例):
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.9.1</version> <!-- 使用最新稳定版 --> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-ocr-tesseract</artifactId> <version>2.9.1</version> </dependency>
关键说明
OfficeParserConfig.setExtractInlineImages(true)是解决问题的核心:让Tika不再忽略Office文档中的内嵌图片,而是将其传递给OCR引擎处理。- Tesseract路径必须正确配置:若未加入系统PATH,必须通过代码指定,否则Tika无法调用OCR服务。
- 保持依赖版本一致:所有Tika相关依赖需使用同一版本,避免版本冲突导致的解析异常。
内容的提问来源于stack exchange,提问作者slt
相关产品推荐
相关产品推荐

