如何用pypdf的PdfReader检测PDF无可读文本或为扫描件
检测PDF是否无可读文本(识别扫描件类PDF)
核心逻辑
扫描件类PDF本质是图片封装的文件,没有内嵌可提取的文本内容。通过提取指定页数的文本并判断有效内容长度,就能快速识别这类PDF。你可以选择优先检查全文件,也可以只检查前几页(比如前3页)来提升效率,一旦发现无有效文本就终止后续操作。
实现代码
方案1:检查前N页(高效快速)
适合快速判断,避免处理大文件的耗时:
from pypdf import PdfReader def is_scan_like_pdf(pdf_path, check_pages=3): reader = PdfReader(pdf_path) # 取实际页数和指定检查页数的较小值,防止文件页数不足 check_count = min(check_pages, len(reader.pages)) for i in range(check_count): page_text = reader.pages[i].extract_text() # 过滤空白字符后判断长度,排除仅含空格、换行的无效内容 cleaned_text = page_text.strip() if page_text else "" if len(cleaned_text) > 0: return False # 检测到可读文本,不是扫描件类PDF return True # 指定页数都无有效文本,大概率是扫描件 # 使用示例 pdf_path = 'resources/something.pdf' if is_scan_like_pdf(pdf_path): print("该PDF大概率无可读文本(可能是扫描件),终止操作") else: reader = PdfReader(pdf_path) all_text = [page.extract_text() for page in reader.pages] # 后续文本处理逻辑
方案2:检查全文件(精准判断)
需要确保整个PDF都无文本时使用:
from pypdf import PdfReader def has_no_readable_text(pdf_path): reader = PdfReader(pdf_path) for page in reader.pages: page_text = page.extract_text() cleaned_text = page_text.strip() if page_text else "" if len(cleaned_text) > 0: return False return True # 使用示例 pdf_path = 'resources/something.pdf' if has_no_readable_text(pdf_path): print("该PDF无可读文本,终止操作") else: reader = PdfReader(pdf_path) all_text = [page.extract_text() for page in reader.pages] # 后续文本处理逻辑
补充说明
- 若PDF存在扫描页与文本页混合的情况,可调整判断逻辑(比如允许一定比例的空白页)。
extract_text()可能提取到少量乱码或空白字符,用strip()过滤后判断长度能避免误判。- 如需更精准识别,可结合OCR工具(如pytesseract)验证,但会增加复杂度和耗时,上述方法属于轻量级快速判断方案。
内容的提问来源于stack exchange,提问作者brot
相关产品推荐
相关产品推荐

