跳到正文
MyDSH我的 DSH 实战笔记
English
独立维护,非DeepSeek官方;与mydsh.dev等其他MyDSH站点无关联。

首页/工作区与文件/文件读取与格式

扫描版 PDF 没有文本层:读出来是空的,不是读错了

一批 PDF 处理完,有些条目内容明显不对或者干脆空白,第一反应是模型读错了。

已核验版本与环境核验日期2026-11-14
工具
pymupdf(PyMuPDF)+ Python 3.13
样本
100份自造PDF,20份只有图像无文本层
核验日期
2026-11-14

可复制指令

python -c "import pymupdf,sys;d=pymupdf.open(sys.argv[1]);t=''.join(p.get_text() for p in d);print(len(t.strip()),'chars',sum(len(p.get_images(full=True)) for p in d),'images')" file.pdf

先给结论:扫描件读不出内容不是失败,是它本来就没有可读的文字。PDF里的文字有两种存在形式——文本层(可抽取的字符)和图像(像素)。扫描件只有后者。

实测两份文件,区别一眼可见:

文件页数可抽取字符数内嵌图片数能读出正文吗
有文本层的PDF1340能
同一页渲染成图再包成PDF101不能

检测方法(不依赖任何模型):

import pymupdf
d = pymupdf.open(path)
txt = "".join(p.get_text() for p in d)
print(len(txt.strip()), "字符", sum(len(p.get_images(full=True)) for p in d), "张图")

字符数为0而图片数大于0,就是扫描件。这个判断可以在把文件交给模型之前做完,省一整轮。

为什么这件事必须先查

模型拿到一份没有文本层的PDF,只有三种可能:说读不出、编一段看起来合理的内容、或者转去用OCR(如果工具链里有)。第三种最好,前两种都是你要花时间分辨的坏结果。

所以配方的正确写法是:先列出无文本层的文件,单独说明,不要静默跳过,也不要让它猜。这比事后核对产物省事得多。

怎么办

  1. 批量跑一遍字符数检测,把0字符的挑出来单独列一节。
  2. 有OCR就过一遍OCR;没有就在产物里标「读取失败·无文本层」,保留文件名与页数。
  3. 在给模型的指令里明确写:读不到正文的标「读取失败」,不要根据文件名推测内容。

怎么算跑通

照着逐条对,全过才算完成。有一条没过,先解决它再往下。

  • 能对一份文件说出「字符数」和「图片数」两个数
  • 扫描件被单独列出,没有被静默跳过
  • 产物里没有出现「根据文件名推测」的内容

会失败在哪

现象 / 原因 / 怎么办,按实际踩到的顺序写。

现象原因怎么办
所有PDF都返回0字符整批都是扫描件,或读的是加密/损坏文件抽一份用阅读器打开确认能不能选中文字;能选中就说明抽取方式有问题
字符数不为0但内容是乱码字体没内嵌,字符映射缺失(常见于中文老PDF)同上,先人工打开核对;这类要按「不可信」处理,不能直接进产物

来源

标「已核验」的,来自本站实跑;标「公开资料整理」的,逐条附出处。