这类问题我又碰上了一次。把 30 页扫描合同用 PyPDF2 抽文本再发给模型,返回内容只剩页码,抽出来的字符串几乎是空的,文件本身是图片型 PDF,一页就是一张扫描图。

第一反应是「直接传 PDF 要走文件接口而不是文本」,验证下来不成立。

排查方向其实有限,先把可能性排一排。扫描件没有文本层 抽取结果为空;解析库只拿到空白字符;页面旋转导致阅读顺序错乱。

第一件事是判断 PDF 有没有文本层

python -c "import pdfplumber;print(len((pdfplumber.open('c.pdf').pages[0].extract_text() or '').strip()))"

再往下按页渲染成图片再送视觉模型

python -c "import fitz;d=fitz.open('c.pdf');p=d[0].get_pixmap(dpi=200);p.save('p1.png')"

控制单页分辨率与体积

python -c "from PIL import Image;im=Image.open('p1.png');im.thumbnail((1600,1600));im.save('p1s.jpg',quality=85)"

批量跑完再合并结构化结果

python pdf_vision.py --in c.pdf --dpi 200 --out pages.jsonl

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

恢复的判定其实很直接。每页都能抽到正文,金额与页码能对上,空白页数量为零。

PDF 分文本型和图片型,抽取为空时别再调参数,渲染成图走视觉输入才是正路。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189