跳到主要内容
AZ Tools

为什么你的 PDF 搜不到文字

PDF 不是一种恰好排好版的文本格式,它是一份页面描述:一串「在这个位置画这个字形」「在这个矩形里画这张图」的指令。文字处理软件生成的页面画的是字符,所以能搜索;扫描仪或手机相机生成的页面只画了一张照片,而文件里没有任何东西知道那张照片写了什么。

屏幕上看起来完全一样的两种页面

文字页面里有字体、字符编码和坐标。扫描页面里通常只有一张图像,就是整张纸,别的什么都没有。两者都会被画成一页写满字的纸,在正常缩放下你分辨不出来。

差别只在有人试图「读」这一页而不是「画」这一页时才显现:搜索、选中、复制、屏幕阅读器、抓取数据的程序。它们都需要字符,而扫描页面里一个字符也没有。

几秒钟分辨的方法

试着选中一行。如果光标不是把词高亮起来,而是在一片区域上画出一个矩形,那这一页就是图像。然后把页面放到很大:真正的文字是按字体轮廓重新绘制的,放多大都清晰,而扫描件会露出像素。

文件大小是另一条线索。一页纯文字通常只有几 KB,一页扫描件因为是照片,往往几百 KB 到几 MB。一份二十页、四十 MB 的文档,不管看起来多整齐,都是扫描出来的。

复制出来是乱码的情况

有时页面里确实有文字,复制出来却仍然是一堆没有意义的字符。生成程序只嵌入字体的一个子集,并且可以随意给字形编号,所以字母 A 存下来的编码可以是任意数字。把这些数字还原成真实字符的那张对照表是可选的;一旦缺失或出错,抽取就会忠实地返回错误的字母。

同一处还会带来两个小现象。连字是单个字形,所以一个词里的 fi 或 ffi 可能被并成一个字符,或者干脆丢失。而且 PDF 里并没有你以为的那种空格字符——词与词之间的间隔通常只是「移动到新位置」的指令,这就是抽取出的文字有时会把词粘在一起的原因。

为什么词序是乱的

PDF 里没有任何东西声明阅读顺序。字形是按生成程序输出的先后画出来的;在双栏排版里,这可能意味着左栏一行、右栏一行,一路交替到底。

所以每个抽取器都得靠几何位置把顺序重建出来,而页眉、脚注、表格和侧边栏正是这套猜测失效的地方。如果抽出的文字一个不少却顺序错乱,原因就在这里——这和一页根本没有文字是两回事。

OCR 实际添加了什么

光学字符识别不会改动那张图。它读取图像、猜出字符,再把结果作为看不见的文字写到对应位置上:你看到的仍然是扫描图像,搜索找到的是压在下面的那层文字。

这意味着 OCR 的质量会被固定下来,而图像不会。它常犯的错误会留在之后的每一次搜索里:把 rn 读成 m,把大写 O 读成 0,把小写 l 读成数字 1。语言判断错了更糟,因为带重音的字母和非拉丁文字会被硬塞进所选字母表允许的范围里。

已经做过 OCR 却还是搜不到时

分辨率是最常见的原因。识别需要印刷面上大约 300 dpi;低于 200 左右,小字的笔画会粘连,准确率断崖式下跌。斜着拍的照片还会带来倾斜,而歪掉的行会在字符识别开始之前就把找行的那一步弄乱。

还有两种看着像 OCR 没做好、其实不是的情况。文档可能被加密并设了禁止抽取的权限,于是文字明明在,查看器却拒绝交出来。另外,页面可能是通过页面属性而不是图像本身被旋转的,这会让文字层与你看到的字相差九十度。

行之有效的处理顺序

先把文字抽出来读一遍,那才是关于这个文件到底装了什么的事实。什么都没有,说明是扫描件;内容齐全但顺序乱,是顺序问题而不是缺一层;结构认得出但字母是错的,说明字体对照表坏了,正确的做法是从原始文档重新导出,而不是跟抽取器较劲。

如果是扫描件,在归档之前先做识别,并保留原件:OCR 是写进文件里的猜测,图像才是证据。而且要用你手上最高的分辨率去做,因为先压缩页面,毁掉的正是识别器需要的那些细节。

相关工具