这类问题我又碰上了一次。把 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 分文本型和图片型,抽取为空时别再调参数,渲染成图走视觉输入才是正路。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
