You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:45:07