ChatGPT 报 'No Text Could Be Extracted From This File'(扫描件 / 手写 PDF)

扫描件或手写 PDF 报 'No text could be extracted from this file',或者抽取器只读文本层导致模型瞎编内容。最快修法:上传每页图片,别传 PDF。

你上传一份扫描合同或一张手写笔记另存的 PDF,ChatGPT 回 No text could be extracted from this file、抽出来是空、或者更糟——编出看起来合理但对不上原页的内容。原因是:默认 PDF 抽取器(Code Interpreter / 高级数据分析里的 pdfplumber / PyPDF)只读文档的文本层。纯图片 PDF 没有文本层,抽取器拿到的就是 ""

最快修法(一分钟内搞定):别传 PDF。把每页转成 PNG 或 JPG,改传图片。ChatGPT 会把图片走 vision 通道(截至 2026 年 6 月为 GPT-5.5),印刷体和手写体都能直接 OCR。很多用户反映:同样的内容,传图片能”完美”识别,传 PDF 却失败。

如果你确实需要一份可搜索的 PDF(用于归档、周期性流程、或给同事),就先在上传前把文件 OCR 好——步骤见下文。

行为变了吗?(2026 年 6 月)

新模型(GPT-5.4 / GPT-5.5)在网页版里有时会对纯图片 PDF 自动套用 vision OCR,于是偶尔一份一年前会失败的扫描件现在也能读出来。但这个行为不稳定——取决于你的订阅档位和上传走的是哪条后端通道,Free / 旧通道仍然把纯图片 PDF 当空白。把自动 OCR 当成意外之喜,别当保证。靠谱的做法依旧是:传图片,或者上传前先 OCR,并且每次都验证结果(见”验证修复”)。

你属于哪一类?

症状可能原因去看
No text could be extracted from this file,每页都空完全没有文本层(纯扫描 / 照片)Step 1,再 Step 2 或 5
印刷字能抽出来,手写部分空OCR 跳过手写Step 5(vision)
输出是 ~~%@# 一类乱码语言包选错Step 3(设 -l
读是读了,但编出原页没有的内容模型在空抽取上幻觉Step 1 先证实是空,再 Step 5
一份数字版 PDF(文字可选)也报错PDF 结构异常Step 6(重排)

常见原因

1. PDF 完全没有文本层

打印机扫描成 PDF、照片存成 PDF、“打印到 PDF”图片——都没文本层。pdfplumber.extract_text() 返回 ""。ChatGPT 正确地说没字,然后要么拒绝(No text could be extracted from this file),要么——如果你逼它”先随便总结一下”——就开始编。

如何判断:在任意阅读器里打开 PDF,用光标尝试选文字。选不动(光标始终是箭头、不是文本插入光标),就是没文本层。

2. 手写体让常规 OCR 直接失败

即使 PDF 经过 OCR 预处理,手写部分通常也被跳过。Acrobat OCR 是为印刷字体调的;旁注里的连笔、签名、表单手填几乎一定丢。开源 OCR 更差:截至 2026 年,Tesseract 在真实手写体上基本不可用(连笔体跑分远低于可用阈值)。手写直接上 vision(Step 5)。

如何判断:印刷部分能抽出来,手写部分一片空。

3. 内置抽取在 vision 之前就接管了

当你附的是 PDF 时,Code Interpreter 第一反应是 pdfplumber。即使模型能用 vision,PDF 这条路也不会稳定 fallback 过去。改附图片就把内容直接送进 vision 通道——这正是 Step 5 有效的原因。

4. 扫描质量差:倾斜、低 DPI、JPEG 失真

低于 200 DPI、倾斜 > 5 度、或者重压缩的 JPEG-in-PDF,会把大多数 OCR 引擎坑住。Tesseract 对印刷体至少要 300 DPI(此时准确率 95%+);低于约 200 DPI 准确率就崩。

5. 非英文手写 / 混合脚本

OCR 引擎需要对应脚本的语言包。中文手写笔记用纯英文 Tesseract 跑出来一片乱码。Acrobat Pro 默认按你的地区设置走,不会自动识别混合脚本。

最短修复路径

Step 1:判断 PDF 是否有文本层

让 ChatGPT 在 Code Interpreter 里跑下面这段(或本地跑):

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 或 vision;部分有、部分没,文档就是混合的——只 OCR 缺的那几页。(这一步也能证实模型给你的”总结”是真是假:0 字符就说明它根本没东西可总结。)

Step 2:传每页图片、别传 PDF(最快,无需安装)

最快的可靠修法。把每页导出为图片再附到对话里:

  • 文件已经打开了?多数 PDF 阅读器里:把每页另存为 PNG / JPG,或者放大后截图。
  • 脚本化、从 PDF 来:
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")

然后点 ChatGPT 的回形针,附上 page_1.pngpage_2.png……,说:“把每张图上的文字转写出来,包括手写部分,再汇总。” vision 能在一遍里处理印刷体和手写体。

文档很长就分批 5–10 页附,避免上下文爆掉。

Step 3:用 Tesseract OCR(免费、可脚本化,得到可搜索文件)

当你需要一个可搜索的文本文件或 PDF——比如用于周期性流程:

# macOS 安装
brew install tesseract tesseract-lang
brew install poppler  # 提供 pdftoppm

# PDF 按 300 DPI 转图片再 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(任何已装的包都行:-l deu-l fra 等)。把 ocr-output.txt 上传给 ChatGPT,别再传原 PDF。注意:Tesseract 对干净的印刷扫描件很强(300 DPI 下 95%+),但对手写很差——手写改用 Step 5。

Step 4:Adobe Acrobat Pro OCR(印刷扫描件质量最好,图形界面)

Acrobat Pro 里:工具 → 扫描和 OCR → 识别文本 → 在此文件中。选对语言,保存。新 PDF 带可选文本层;再上传给 ChatGPT,内置抽取就能正常工作。Acrobat 自动做倾斜矫正和低 DPI 清理——有 Pro 许可证的话效果最好、操作最少。周期性工作可以录一个 Action Wizard 动作,整个文件夹一键 OCR。

Step 5:手写直接送 vision(最准)

OCR 真搞不定(连笔、墨水褪色、非拉丁手写),就完全跳过 OCR,让 ChatGPT vision 读你在 Step 2 导出的图片:

逐字转写每张图上的手写内容。看不清的词标 [illegible],不要猜。然后给我一份干净的汇总。

[illegible] 这条很关键——它能阻止模型为填空而编词,而编词正是”看着合理却写错”的头号成因。vision 模型处理连笔体明显比任何开源 OCR 强。

Step 6:如果是数字版 PDF 仍报错——重排它

如果 PDF 确实有可选文字却还是报 No text could be extracted from this file,多半是文件结构不规范(某些第三方导出器会产出这种)。在 Chrome 或 Edge 里打开,选 打印 → 另存为 PDF(或 “Microsoft Print to PDF”),重新上传这份重排后的副本。这会重建一个 ChatGPT 能解析的干净结构。或者在阅读器里选中文字,直接粘进对话框。

偶尔一次用 Google Docs 自动 OCR(无需安装)

把 PDF 上传到 Google Drive,右键 → 打开方式 → Google Docs。Drive 自动 OCR 并转文档。把结果文本复制进 ChatGPT,或导出 TXT / DOCX 再上传。字迹清楚一致的手写也能凑合用。免费、无需安装。

验证修复

OCR 完成后,先再跑一次文本层探针,再相信任何总结:

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,验证更简单:拿模型转写出的两三行,跟原页上你能读出的内容对一下。

预防

  • PDF 给 ChatGPT 之前,先验证文本可选。选不了就传图片或先 OCR。
  • 手写笔记拍照、光线足,作为图片上传别存 PDF——vision 天然处理图像,绕开坏掉的 PDF 路径。
  • 周期性工作(发票处理、合同审阅)一次性把 OCR 步骤建好(Tesseract 脚本或 Acrobat Action Wizard),只把 OCR 输出给 ChatGPT。
  • 扫描至少 300 DPI,存成带嵌入文本层的 PDF(Acrobat 开了 OCR 默认就这么做)。
  • 混合语言文档按段落分别用对应语言包 OCR,不要一遍跑完整个文件。

常见问题

为什么 ChatGPT 报 “No text could be extracted from this file”? 这份 PDF 是纯图片(扫描或照片),没有文本层,抽取器读到零字符。改传每页图片,或者先把文件 OCR 一遍。

现在 ChatGPT 能自己 OCR 扫描件 PDF 吗? 有时能。截至 2026 年 6 月,GPT-5.4/5.5 可能对图片 PDF 自动套用 vision OCR,但跨档位、跨后端都不稳定,Free / 旧通道仍然失败。别指望它——要结果稳定就传图片或上传前 OCR。

为什么它会编出扫描件里没有的内容? 当抽取返回空字符串、你又非要它总结,模型就会用看似合理的猜测来填空。跑 Step 1 的探针,确认它到底有没有读到东西,再去信输出。

传图片还是传 PDF? 图片。附 PNG / JPG 页面会把内容直接走 vision(印刷体和手写体都处理);PDF 会先走文本层抽取,扫描件上这一步会失败。

手写的最佳免费方案是什么? 对上传的页面图片用 ChatGPT 自带的 vision,或者字迹清楚时用 Google Docs 自动 OCR。Tesseract 对印刷扫描件很强,但截至 2026 年在手写上不靠谱。

OCR 输出是一堆乱码符号——哪里错了? OCR 用错了语言包。用匹配的 -l 代码重跑 Tesseract(比如简体中文用 -l chi_sim,中英混合用 -l eng+chi_sim),或者在 Acrobat 里识别文本前先选对语言。

标签: #ChatGPT #ChatGPT 文件 #排查 #排查 #ocr