pdftotext无法读取部分PDF文件,如何识别并过滤不可读取的PDF
两个PDF的差异原因
出现提取结果差异的核心原因是两份PDF的文本编码配置不同:
- 可正常提取的PDF嵌入了标准Unicode字符映射表,
pdftotext可以直接将PDF内的字形编码转换为可读文本 - 提取为乱码的PDF属于两种异常情况之一:要么是使用了无Unicode映射的自定义私有编码字体,工具无法完成编码转换;要么是扫描件生成的图片类PDF,仅保留了字形矢量/像素信息,没有内嵌可读文本层
不可读取PDF的检测与剔除方案
最简便的实现方式是在现有提取逻辑后新增可读性校验,通过判断可打印字符占比筛选合格文件,参考实现代码如下:
import pdftotext import string def is_readable_text(text, threshold=0.7): # 空文本直接判定为不可读 if not text.strip(): return False # 可打印字符集合,可根据你的业务场景增删支持的字符 valid_chars = set(string.printable + ',。、;:「」『』()【】《》?!·—') valid_count = 0 for char in text: # 兼容中文字符判断 if char in valid_chars or ('\u4e00' <= char <= '\u9fff'): valid_count += 1 # 有效字符占比高于阈值则判定为可读 return valid_count / len(text) >= threshold bill_full = [] file_path = "sample.pdf" try: with open(file_path, "rb") as f: pdf = pdftotext.PDF(f) bill = "" for page in pdf: bill += page if is_readable_text(bill): bill_full.append(bill) else: print(f"{file_path} 文本不可读,已从流程中剔除") except Exception as e: # 额外捕获PDF加密、文件损坏等解析异常 print(f"{file_path} 解析失败:{str(e)},已从流程中剔除")
可根据你的数据集特性调整threshold阈值:如果文档以英文为主,可将阈值上调至0.8~0.85;如果文档包含大量特殊符号,可适当降低阈值。如果后续需要处理被剔除的扫描类PDF,可补充OCR识别流程。
内容的提问来源于stack exchange,提问作者ZMV
相关产品推荐
相关产品推荐

