配置Apache Tika解析/忽略CFF字体以解决PDF解析报错问题
解决Apache Tika解析含CFF字体PDF时的EOFException错误
问题背景
我们通过以下命令行调用Apache Tika解析PDF:
java -Dlog4j2.formatMsgNoLookups=true -Xms512m -Xmx16384m -jar /tika/tika-app-2.9.1.jar --config=/tika/tika-ocr-config.xml -t test.pdf
待解析的test.pdf包含CFF字体,导致Tika抛出如下错误:
ERROR [main] 17:05:36,671 org.apache.pdfbox.pdmodel.font.PDCIDFontType0 Can't read the embedded CFF font QLVBNN+HiddenHorzOCR java.io.EOFException: null
当前使用的tika-ocr-config.xml基础配置:
<parser class="org.apache.tika.parser.pdf.PDFParser"> <params> <param name="extractInlineImages" type="bool">false</param> <param name="ocrStrategy" type="string">no_ocr</param> <!-- 是否检测文本角度并对应提取文本 PDFBOX-4371 --> <param name="detectAngles" type="bool">true</param> </params> </parser>
已知Apache Tika内置CFF字体解析相关模块,需要实现:要么配置Tika使用该模块解析CFF字体,要么忽略CFF字体相关报错以继续解析。
解决方案
1. 配置PDFParser启用字体容错解析
Tika依赖的PDFBox已内置CFF字体解析能力,报错大概率是字体文件损坏或解析容错未开启。可在tika-ocr-config.xml中添加参数启用容错:
<parser class="org.apache.tika.parser.pdf.PDFParser"> <params> <param name="extractInlineImages" type="bool">false</param> <param name="ocrStrategy" type="string">no_ocr</param> <param name="detectAngles" type="bool">true</param> <!-- 跳过无法读取的缺失/损坏字体 --> <param name="skipMissingFonts" type="bool">true</param> <!-- 禁用自动空格,避免字体解析冲突 --> <param name="enableAutoSpace" type="bool">false</param> </params> </parser>
2. 抑制CFF字体相关错误日志
如果不需要提取该CFF字体对应的文本,可通过调整日志级别抑制报错,不影响后续解析:
修改命令行,添加日志级别降级参数:
java -Dlog4j2.formatMsgNoLookups=true -Xms512m -Xmx16384m \ -Dorg.apache.pdfbox.pdmodel.font.PDCIDFontType0.level=WARN \ -jar /tika/tika-app-2.9.1.jar --config=/tika/tika-ocr-config.xml -t test.pdf
此参数将该字体类的日志从ERROR降至WARN,错误信息不再输出,Tika会继续处理PDF其他内容。
3. 升级Tika版本
当前使用的Tika 2.9.1可能存在已知的CFF解析bug,建议升级至最新稳定版(如2.9.2及以上),新版本会同步PDFBox的修复补丁,大概率解决EOFException问题。
内容的提问来源于stack exchange,提问作者Rupam Roy
相关产品推荐
相关产品推荐

