Apache Pdf Box处理多PDF时部分文件页数返回0,重试恢复正常
PDF页数偶尔返回0的原因分析
以下是导致该问题的几种常见原因:
- 文件未完全写入/IO竞争:如果目标PDF文件正处于生成、复制或其他进程写入的状态,此时
PDDocument.load读取的是不完整的文件,PDF结构未初始化完成,会返回0页。重试时文件已写入完毕,就能正常解析。 - PDFBox资源或缓存冲突:Apache PDFBox在快速批量加载文件时,可能出现底层文件句柄未及时释放、缓存未同步的情况,导致第一次读取失败。重试时资源已释放,解析恢复正常。
- 不规范的PDF文件结构:部分PDF存在格式瑕疵(比如交叉引用表损坏、页面对象标记异常),第一次加载时PDFBox无法正确识别结构,但第二次加载时内部的修复逻辑(或缓存机制)能正确解析页数。
- 文件系统缓存延迟:如果文件存储在网络共享盘、外部移动存储上,可能存在文件系统缓存同步延迟,第一次读取时获取的是不完整数据,第二次读取时缓存同步完成,即可正常识别页数。
代码优化建议
可以给方法增加重试逻辑,同时先校验文件的可读取状态,避免读取不完整的文件:
public static int getPageCount(Path file) throws IOException { int retryCount = 3; int pageCount = 0; while (retryCount-- > 0) { if (!Files.isReadable(file) || Files.size(file) == 0) { try { Thread.sleep(100); continue; } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException("Interrupted while waiting for file", e); } } try (PDDocument document = PDDocument.load(file.toFile())) { pageCount = document.getNumberOfPages(); break; } catch (IOException e) { if (retryCount == 0) { throw e; } try { Thread.sleep(100); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new IOException("Interrupted during retry", ie); } } } return pageCount; }
内容的提问来源于stack exchange,提问作者Akhil Kumar
相关产品推荐
相关产品推荐

