如何配置PDFBox/Tika忽略字体信息仅提取文本?
解决Tika 1.28.1解析PDF时字体内存占用过高导致OOM的问题
核心配置:禁用字体加载
你需要通过PDFParserConfig的setDisableFontLoading(true)配置来完全禁止加载字体信息到内存,这个配置是控制底层PDFBox是否加载字体数据的关键——setExtractFontNames()仅控制是否输出字体名称,无法阻止字体数据被加载到内存。
代码示例:
// 初始化PDF解析配置 PDFParserConfig pdfConfig = new PDFParserConfig(); // 禁用字体加载,彻底避免字体数据占用内存 pdfConfig.setDisableFontLoading(true); // 关闭字体名称提取(如果不需要相关输出) pdfConfig.setExtractFontNames(false); // 禁用图片提取(仅需文本时可开启,进一步降低内存) pdfConfig.setExtractImages(false); // 配置解析器 AutoDetectParser parser = new AutoDetectParser(); parser.setPDFParserConfig(pdfConfig); // 后续使用该parser执行文本提取流程
其他降低内存占用的建议
- 使用流式解析:采用Tika的流式解析模式(
ParsingReader),逐段处理文档内容,避免一次性将整个PDF加载到内存中。 - 配置PDFBox内存策略:通过
PDFParserConfig.setMemoryUsageSetting(MemoryUsageSetting.setupTempFileOnly()),让PDFBox使用临时文件存储中间数据,减少堆内存占用。 - 关闭不必要的提取项:禁用注释、元数据等非必要内容的提取,比如设置
pdfConfig.setExtractComments(false)、pdfConfig.setExtractMetadata(false)(如果索引不需要元数据)。 - 拆分大文档:对于超大PDF,先拆分为多个小文档分段解析,处理完成后及时释放内存。
- 优化JVM参数:临时增大堆内存(如
-Xmx8g)作为应急方案,但优先通过解析配置优化内存使用。
内容的提问来源于stack exchange,提问作者curiousity
相关产品推荐
相关产品推荐

