Apache PDFBox回退字体警告问题及缓存相关技术咨询
使用tabula(内部依赖Apache PDFBox进行PDF提取)时,执行代码后触发字体相关警告,且循环处理每个PDF时都会重复出现:
WARNING: Using fallback font LiberationSans for base font Times-Roman with tabula which internally uses PDFBox for extraction.
循环处理时的警告:
WARNING: Using fallback font 'LiberationSans' for 'MP0001'
org.apache.pdfbox.pdmodel.font.PDType1Font <init>
WARNING: Using fallback font LiberationSans for base font Times-Roman
使用的代码:
import tabula tabula.read_pdf(pdf_file)
已尝试执行命令但问题未解决:
apt-get install -q -y libpdfbox-java
疑问:
- 不确定这是否是字体缓存构建过程,且该警告在循环处理每个PDF时都会出现;
- 是否可以将这些字体缓存,仅构建一次?
- 能否解释该现象的底层原理?
1. 这不是字体缓存构建过程
这些警告和缓存无关,每次处理PDF时触发,是因为PDFBox解析当前PDF时,找不到文档中引用的字体(比如Times-Roman、MP0001)。每次加载新PDF都会重新检查字体可用性,找不到就抛出警告,和缓存构建没有关系。
2. 无法通过缓存字体消除警告,但可禁用警告输出
PDFBox的字体 fallback逻辑是针对每个PDF文档单独执行的——不同PDF可能引用不同的缺失字体,没法一次性缓存所有可能的缺失字体来避免警告。但你可以通过调整日志级别屏蔽这些警告:
- Python端直接调整tabula日志级别:
import logging from tabula.io import logger # 将tabula日志级别设为ERROR,屏蔽WARNING级别的输出 logger.setLevel(logging.ERROR) - 或通过JPype配置Java日志系统(tabula依赖JPype调用PDFBox):
import jpype import jpype.imports from java.util.logging import Level, Logger jpype.startJVM() # 获取PDFBox字体模块的日志器,设置为仅输出严重错误 font_logger = Logger.getLogger("org.apache.pdfbox.pdmodel.font") font_logger.setLevel(Level.SEVERE)
3. 底层原理解释
PDF文档通常不会嵌入所有使用的字体,只会记录字体名称(比如Times-Roman)。当PDFBox解析PDF时:
- 首先尝试在系统中查找与名称匹配的字体,找到则用它提取文本;
- 找不到时,就触发字体 fallback机制,使用预设的替代字体(这里是
LiberationSans)保证文本能正常提取,同时抛出警告提示缺失的字体。
每次处理新PDF时,PDFBox都会重新检查该文档引用的所有字体——因为不同PDF的字体引用可能不同,所以每次都会执行检查流程,导致警告重复出现。
安装libpdfbox-java无效的原因是:该包仅提供PDFBox的Java库,但系统中依然缺少PDF里引用的目标字体(比如MP0001是自定义或少见字体,Times-Roman可能未在系统中正确安装对应字体文件)。
内容的提问来源于stack exchange,提问作者omkulkarni22

