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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:03