Python读取PDF触发PDFPageCountError报错的原因与解决方法
报错核心原因
- 代码存在基础逻辑错误:你贴的代码中变量名大小写不统一,定义文件列表用的是小写开头的
foundfiles,循环判断时误用大写开头的FoundFiles;PDF计数变量定义为numberoffoundPDFs,累加时却用NumberFoundPDFs。Python对变量名大小写敏感,这部分逻辑要么直接抛运行时错误,要么文件匹配完全错乱,会将非PDF文件误判为PDF送入解析流程。 - 文件校验逻辑缺失:你仅通过
.pdf后缀判断文件类型,没有做真实格式校验。合法PDF文件的前4字节固定为%PDF标识,只要后缀被改成.pdf的非PDF文件(比如同步盘未下载完成的占位文件、软件崩溃生成的0字节临时文件、其他格式强制改后缀的文件),都会触发「找不到trailer字典」「无法读取xref表」这类解析错误。 - 环境变动触发全量报错:近期所有文件夹都触发该问题的常见诱因包括:同步盘(OneDrive/坚果云等)开启了「按需下载」功能,本地存储的只是云端文件的快捷方式而非真实PDF内容;升级过PDF解析依赖(比如poppler、PyPDF2/pypdf)后,新版本对非标准PDF的容错阈值降低,旧版本能自动跳过的异常新版本直接抛错;磁盘文件系统错误导致文件读取内容异常,并非PDF本身损坏。
可行修复方案
- 第一步先修正代码逻辑bug,去掉不必要的路径切换操作,增加PDF文件头校验,过滤假PDF文件,参考代码如下:
import os target_path = r"D:\Users\Folder\example\...\2_ZWB" # 只遍历路径下的文件,过滤文件夹 all_files = [f for f in os.listdir(target_path) if os.path.isfile(os.path.join(target_path, f))] pdf_count = 0 valid_pdf_paths = [] for file_name in all_files: file_abs_path = os.path.join(target_path, file_name) # 不区分大小写判断pdf后缀 if file_name.lower().endswith(".pdf"): pdf_count += 1 # 读取文件头校验是否为真PDF with open(file_abs_path, "rb") as f: if f.read(4) == b"%PDF": valid_pdf_paths.append(file_abs_path) print(f"扫描到后缀为pdf的文件共{pdf_count}个,其中真实有效PDF文件{len(valid_pdf_paths)}个")
- 第二步排查环境异常:如果文件存在同步盘目录下,先右键目标文件夹选择「始终保留在此设备上」,等待所有文件完整下载到本地后再运行程序;如果近期升级过PDF解析相关依赖,回退到此前正常运行的版本即可。
- 第三步增加异常容错逻辑,批量处理时不要让单个坏文件中断全流程,将解析失败的文件单独记录后续排查,参考逻辑:
# 替换为你实际使用的PDF/OCR导入,比如from PyPDF2 import PdfReader from pdf2image import convert_from_path success_count = 0 error_records = [] for pdf_path in valid_pdf_paths: try: # 此处替换为你原有的PDF读取、OCR处理逻辑 pdf_pages = convert_from_path(pdf_path) # 后续OCR处理代码... success_count += 1 except Exception as e: error_records.append(f"文件处理失败:{pdf_path},错误信息:{str(e)}") continue print(f"处理完成,成功解析PDF共{success_count}个,失败{len(error_records)}个") for err in error_records: print(err)
- 对文件头正常但解析报错的PDF,可以用
pikepdf库自动修复,核心逻辑是打开文件后重新保存,即可重建损坏的xref表和trailer字典,修复后再送入OCR流程即可:
import pikepdf def fix_corrupted_pdf(input_path, fixed_output_path): with pikepdf.open(input_path) as pdf: pdf.save(fixed_output_path)
内容的提问来源于stack exchange,提问作者David_Python
相关产品推荐
相关产品推荐

