PDF OCR 识别出来是乱码?常见原因和解决办法
来自 FreePDF 团队 ·
扫描件做完 OCR,复制一段出来,粘贴得到的却是「Tbe qnick hrown f0x」这种东西。或者单词都对,可第四行的半句话跑进了第二行。OCR 是在根据像素猜字母,猜错的原因多半出在页面图像本身,而不是哪个隐藏设置没调好。
中文扫描件,先看这一段
我们的 OCR 只识别英文,也没有可以切换的语言选项。中文、日文、韩文、阿拉伯文、俄文这类文字,识别出来要么是一堆莫名其妙的字符,要么干脆什么都没有。这跟扫描质量无关,重扫多少遍都一样。法文、德文能认出一部分,但带重音的字母会丢掉,或者被换成长得像的字母。
中文文件需要用装了中文语言包的 OCR 软件。如果你愿意用命令行,可以在自己电脑上装 ocrmypdf(我们背后用的就是这个开源工具)和 Tesseract 的中文语言包,运行时用 -l 指定语言:简体是 -l chi_sim,繁体是 -l chi_tra,中英混排可以写成 -l chi_sim+eng。
先把识别出来的文字整个看一遍
在 PDF 阅读器里搜索,只能告诉你某个词有没有找到。想知道 OCR 到底认出了什么,就把做过 OCR 的文件放进 PDF 转文字,打开生成的 .txt 读一读。通常会看到下面三种情况之一:
- 某一页什么都没有。页面是横着的、太淡,或者整页被跳过了。
- 单词都对,顺序乱了。这是版面问题,比如分栏、表格,或者页面扫歪了。
- 单词里满是错字母。问题在图像质量、字体或者语言上。
PDF 转文字自己也有「运行 OCR」选项,用的是和 PDF OCR 文字识别同一个引擎。如果你最后只要 .txt,可以直接从扫描件一步转出来。
页面上本来就有一层文字
我们的 OCR 会跳过已经有文字的页面,不会覆盖原有的字。大多数时候这是对的,可如果原有的那层文字本身就是乱码,就帮了倒忙。有些扫描仪会自己先做一遍粗糙的 OCR;还有些 PDF 里的字体,复制出来全是符号,因为文件里压根没记录每个字形对应的是哪个字符。工具一看这页有文字,就不去动它,原样把乱码还给你。
办法是先把页面「压平」成纯图片:
- 用 PDF 转 JPG 转换,分辨率选「高(300 DPI)」。
- 用 JPG 转 PDF 把这些图片重新合成一个 PDF。转换前检查一下顺序,「按名称排序」会把 page_10 排到 page_2 前面,用上下箭头调好。
- 对新文件运行 PDF OCR 文字识别。
压平后的副本会丢掉链接和表单字段,所以原文件要留着。另外,这个办法只对英文页面有效,中文页面压平之后照样得交给中文 OCR。熟悉命令行的话,ocrmypdf 的 --force-ocr 和 --redo-ocr 参数就是专门处理这种情况的。
该改的是扫描件,不是设置
真正负责识别的是 Tesseract 引擎,它最擅长的是干净、端正、300 dpi 左右的页面。大部分乱码都能追到下面几个原因:
- 分辨率低或者模糊。用 300 dpi 重扫,字很小的用 400 dpi。模糊的图事后再放大,细节也回不来。
- 页面扫歪了。我们识别前不会自动纠偏,哪怕只歪几度,也可能把一行字拆开,或者把不同行的片段拼到一起。重新扫正,或者换一个能自动裁边、拉平的扫描 App。
- 页面横着或者倒着。这种也不会自动旋转。先用 PDF 旋转处理一下,注意它会把所有页面一起转。
- 对比度太低。褪色的复写联、铅笔字、彩色纸张,都会让字和背景很难区分开。
怎么扫都认不好的内容
手写字是最大的难关。Tesseract 是为印刷体设计的,页边上的手写批注基本只会变成噪点。花体、很粗的装饰字体,还有印在照片或花纹底图上的字,情况也差不多。表格和多栏页面则常常每个字符都认对了,却是横着一路读过去,把几栏串成一行,搜索没问题,复制出来却读不通。碰到这类内容,OCR 能帮你搜到东西,但要一字不差的文本,还是只能手动录入。
常见问题
再跑一遍 OCR,会不会更准?
不会。第二遍会发现第一遍留下的文字层,然后每一页都跳过。要么按上面的方法把文件压平,要么更好的做法:拿一份更清晰的扫描件重新来。
为什么 0 和 O、1 和 l 老是认混?
分辨率低的时候,这几个字符的形状几乎一模一样,引擎只能二选一。扫得清楚一点会好很多。发票金额、银行账号这种错一位就出事的内容,用之前一定要对照页面原图核一遍。