OCR 辨識出來是亂碼?原因和解決方法
由 FreePDF 團隊撰寫 ·
掃描檔跑完 OCR,複製一段出來,貼上後卻是「Tbe qnick hrown f0x」這種東西。又或者單字都對,第四行的半句話卻跑到第二行去了。OCR 是從像素去猜字母,猜錯的原因多半出在頁面影像本身,而不是哪個隱藏設定沒調好。
中文掃描檔,請先看這段
我們的 OCR 只辨識英文,也沒有可以切換的語言選項。中文、日文、韓文、阿拉伯文、俄文這類文字,出來要不是一堆看不懂的符號,就是什麼都沒有。這跟掃描品質無關,重掃幾次都一樣。法文、德文可以認出一部分,但有重音符號的字母會被吃掉,或換成長得像的字母。
中文檔案要交給裝了中文語言套件的 OCR 軟體。如果你願意用命令列,可以在自己的電腦裝 ocrmypdf(我們背後用的就是這套開源工具)和 Tesseract 的中文語言套件,執行時用 -l 指定語言:繁體中文是 -l chi_tra,中英混排可以寫 -l chi_tra+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 老是搞混?
解析度低的時候,這幾個字元的形狀幾乎一樣,引擎只能二選一。掃清楚一點會改善很多。發票金額、銀行帳號這種錯一碼就出事的內容,使用前一定要對照頁面原圖核對一次。