You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:36:11