Apache Solr 9.0 扫描版PDF提取时OCR未生效问题咨询
问题根因
OCR流程不触发是三个明确问题导致的:
- Solr 9.0 内置的
solr-extraction模块搭载的是精简版Tika依赖,未打包Tesseract OCR相关解析器、依赖包和语言模型,默认仅支持提取原生文本类PDF、Office文档的内容,本身不具备OCR能力,和你单独部署的带全量组件的tika:1.24-full不是同一套运行环境。 - 即使补全OCR依赖,Tika默认会关闭扫描版PDF的内嵌图像提取开关,不会主动把PDF里的扫描页图像送给OCR引擎识别,必须显式传参开启该逻辑。
- 你代码中传入的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
相关产品推荐
相关产品推荐

