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

Apache Solr 9.0 扫描版PDF提取时OCR未生效问题咨询

问题根因

OCR流程不触发是三个明确问题导致的:

  1. Solr 9.0 内置的solr-extraction模块搭载的是精简版Tika依赖,未打包Tesseract OCR相关解析器、依赖包和语言模型,默认仅支持提取原生文本类PDF、Office文档的内容,本身不具备OCR能力,和你单独部署的带全量组件的tika:1.24-full不是同一套运行环境。
  2. 即使补全OCR依赖,Tika默认会关闭扫描版PDF的内嵌图像提取开关,不会主动把PDF里的扫描页图像送给OCR引擎识别,必须显式传参开启该逻辑。
  3. 你代码中传入的MIME类型image/pdf是非法值,PDF的标准MIME类型为application/pdf,MIME类型写错会导致Tika无法匹配对应解析器,直接跳过内容提取流程。
解决步骤
  • 第一步:补全Solr侧的OCR运行依赖
    将对应版本的OCR相关jar包全部放入Solr的server/solr-webapp/webapp/WEB-INF/lib/目录,需要的包包括Tika标准解析器包、tess4j(Tesseract的Java调用封装)及其全部传递依赖;同时在Solr运行的操作系统层安装Tesseract OCR引擎,以及你需要识别的对应语言模型包,确保Solr进程的运行用户有权限直接调用tesseract命令。
    如果不想处理Tika版本冲突(Solr 9内置Tika为2.x版本,和你测试用的Tika 1.24存在API不兼容问题),更稳妥的方案是放弃内置的ExtractingRequestHandler,自定义更新逻辑:先调用你部署在9998端口的独立Tika服务提取文本,再将提取出的文本作为字段写入Solr,不用折腾依赖兼容。
  • 第二步:修改solrconfig.xml配置,添加OCR相关默认参数
    在/update/extract请求处理器的defaults配置块中补充以下参数,默认开启OCR和PDF内嵌图像提取:
    <!-- 指定允许触发OCR的文件类型 -->
    <str name="ocr.include">application/pdf,image/png,image/jpeg</str>
    <!-- 开启PDF内嵌图像提取,扫描PDF识别必须开 -->
    <str name="pdf.extractInlineImages">true</str>
    <!-- OCR超时时间,单位秒,大文件可以调大 -->
    <str name="tesseractOCRParser.timeout">120</str>
    <!-- 指定OCR识别语言,英文填eng,中英混合填eng+chi_sim -->
    <str name="tesseractOCRParser.language">eng</str>
    
  • 第三步:修正SolrJ代码中的错误配置
    修正错误的MIME类型,同时可显式传入OCR开关参数做兜底,避免默认配置不生效:
    fun index(file: File) {
            val urlString = "http://localhost:8983/solr/films";
            val solr = HttpSolrClient.Builder(urlString).build()
            solr.parser = XMLResponseParser()
            val req = ContentStreamUpdateRequest("/update/extract")
    
            // 修正为标准PDF MIME类型,删除错误的image/pdf
            req.addFile(file, "application/pdf")
            req.setParam("literal.id", file.name);
            // 显式传参兜底开启OCR和内嵌图像提取
            req.setParam("pdf.extractInlineImages", "true")
            req.setParam("ocr.enable", "true")
            req.setAction(ACTION.COMMIT, true, true)
            val result = solr.request(req)
    
            println("Result: $result")
        }
    
  • 第四步:验证配置生效
    重启Solr后先通过命令行调用提取接口做测试,确认OCR正常工作再走代码索引:
    curl "http://localhost:8983/solr/films/update/extract?extractOnly=true&pdf.extractInlineImages=true&ocr.enable=true" -T "285 October-5.pdf"
    
    如果返回结果中包含识别出的文本内容,说明配置正常。
补充说明

你之前单独部署的Tika服务无法识别扫描版PDF,也是因为没有传开启内嵌图像提取的参数:默认情况下Tika处理PDF时只会提取原生文本,不会主动抽取内嵌图像跑OCR,只有直接传入图片文件时才会路由到Tesseract解析器。给请求加上X-Tika-PDFextractInlineImages: true头就能让独立Tika服务正常识别扫描PDF,测试命令如下:

curl -H "X-Tika-PDFextractInlineImages: true" -T "285 October-5.pdf" http://localhost:9998/tika

内容的提问来源于stack exchange,提问作者Tyler DeWitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:27:06