你上传一份扫描合同或手写笔记另存的 PDF,ChatGPT 回”我读不出来”、抽出来是空、或者更糟——编出看起来合理但对不上原页的内容。原因是默认 PDF 抽取器(Code Interpreter 里的 PyPDF / pdfplumber)只读文本层。纯图片 PDF 没有文本层。模型的 vision 能看图,但 PDF 不会自动走 vision 路径。修法:上传前先 OCR,或者把每页转成图片再明确丢给 vision。
常见原因
1. PDF 完全没有文本层
打印机扫描成 PDF、照片存成 PDF、“打印到 PDF”图片——都没文本层。pdfplumber.extract_text() 返回 ""。ChatGPT 正确地说没字、然后要么放弃、要么编。
如何判断:在任意阅读器里打开 PDF,尝试用光标选文字。选不动(光标始终是箭头、不是文本插入光标),就是没文本层。
2. 手写体让常规 OCR 直接失败
即使 PDF 经过 OCR 预处理,手写部分通常也被跳过。Acrobat OCR 是为印刷字体调的;旁注里的连笔、签名、表单手填几乎一定丢。
如何判断:印刷部分能抽出来,手写部分一片空。
3. 内置抽取在 vision 之前就接管了
Code Interpreter 见到 PDF 第一反应是 pdfplumber。即使模型能用 vision,也不会自动 fallback。你必须明说”把每页转成图片、再去看图”。
4. 扫描质量差:倾斜、低 DPI、JPEG 失真
低于 200 DPI、倾斜 > 5 度、或者重压缩的 JPEG-in-PDF,大多数 OCR 引擎都会被坑。Tesseract 准确率掉到 50% 以下。
5. 非英文手写 / 混合脚本
OCR 需要对应语言包。中文手写笔记用英文 Tesseract 跑出来一片乱码。Acrobat Pro 默认按你地区设置走,不会自动识别混合脚本。
最短修复路径
Step 1:判断 PDF 是否有文本层
import pdfplumber
with pdfplumber.open("/mnt/data/file.pdf") as pdf:
for i, page in enumerate(pdf.pages):
text = page.extract_text() or ""
print(f"page {i+1}: {len(text)} chars")
每页都是 0 字符就一定需要 OCR;部分有部分没,就只 OCR 缺的那几页。
Step 2:用 Adobe Acrobat Pro 本地 OCR
Acrobat Pro:工具 - 扫描和 OCR - 识别文本 - 在此文件中。选对语言,保存。新 PDF 带可选文本层。再上传给 ChatGPT,内置抽取就能正常工作。
Acrobat 自动做倾斜矫正和低 DPI 清理——有 Pro 许可证的话效果最好、操作最少。
Step 3:免费 / 脚本化流程用 Tesseract
# macOS 安装
brew install tesseract tesseract-lang
brew install poppler # 提供 pdftoppm
# PDF 转图片再 OCR
pdftoppm -r 300 input.pdf page -png
for f in page-*.png; do
tesseract "$f" "${f%.png}" -l eng
done
# 合并 OCR 文本
cat page-*.txt > ocr-output.txt
中英混合用 -l eng+chi_sim。把 ocr-output.txt 上传给 ChatGPT,别再传原 PDF。
Step 4:偶尔一次用 Google Docs 自动 OCR
把 PDF 上传到 Google Drive,右键 - 打开方式 - Google Docs,Drive 自动 OCR 并转文档。复制文本贴给 ChatGPT,或导出 TXT 上传。
字迹清楚一致的手写也能凑合用。免费、无需安装。
Step 5:手写直接送 vision
OCR 真的搞不定(连笔、墨水褪色),跳过 OCR、用 ChatGPT vision:
from pdf2image import convert_from_path
images = convert_from_path("/mnt/data/file.pdf", dpi=300)
for i, img in enumerate(images):
img.save(f"/tmp/page_{i+1}.png")
然后在对话里直接附 page_1.png、page_2.png,说:“把每张图上的手写体转写出来再汇总。” vision 模型在连笔体上比 OCR 明显更强。
文档很长就分批 5-10 页处理,避免上下文爆掉。
验证修复
OCR 完成后,先再跑一次文本层探针,再相信任何 summary:
import pdfplumber
with pdfplumber.open("/mnt/data/ocred.pdf") as pdf:
print("pages:", len(pdf.pages))
print("first page chars:", len(pdf.pages[0].extract_text() or ""))
print("sample:", (pdf.pages[0].extract_text() or "")[:200])
非零字符数 + 能认出来的样本文本 = OCR 成功。样本是 ~~%@# 这种就是 OCR 引擎匹配错了语言包——换正确 -l 参数重跑。
预防
- PDF 给 ChatGPT 之前一定验证文本可选。选不了就先 OCR。
- 周期性流程(发票处理、合同审阅)一次性用 Tesseract 或 Acrobat Pro Action Wizard 建好 OCR 管线,只把 OCR 输出给 ChatGPT。
- 手写笔记拍照、光线足,作为图片上传别存 PDF——vision 天然处理图像。
- 扫描至少 300 DPI,存成带嵌入文本层的 PDF(Acrobat OCR 默认行为)。
- 混合语言文档按段落分别用对应语言包 OCR,不要一遍跑完。
Related
- ChatGPT uploaded PDF not analyzed correctly
- ChatGPT image upload not understood
- ChatGPT large document incomplete analysis
- ChatGPT file type unsupported
- ChatGPT file analysis too shallow
- ChatGPT image edit not applied
标签: #ChatGPT #ChatGPT 文件 #排查 #排查 #ocr