PDF對企業應用來說是剛需。
然而PDF顯然不是一種對機器友好的格式,它只是對人類友好,就是說方便閱讀列印,但讓程式去提取其中的內容卻很難。下面簡單說說為什麼是這樣。
以前還讀書的時候(20+年前了),一個同學跟我展示了PDF文件,他說這種格式不是普通的文字,它是圖片,所以比較大。其實他說的並不完全正確,pdf中可以包含圖片,也可以包含文字,且其中的文字跟傳統的點陣圖還真是不一樣。那麼PDF中的內容究竟是什麼?
以增值稅普通發票的電子檔為例,相信大家手頭都有,對,就這個:
上面的文字究竟是圖還是文字?上面的印章是不是點陣圖?
判斷是不是點陣圖很簡單,就是用一個PDF閱讀器開啟,Adobe的或者福昕的都行,選擇“Select”工具,看看上面的文字能否選中。你很快就發現,不光上面的楷體字、宋體字能選中,印章裡的文字居然也能選中,並且能複製下來,你把複製下來的文字貼到記事本里,這就是普通的文字。
這是不是就說明PDF裡的文字就是我們常規理解的文字呢?其實沒那麼簡單,PDF的一個特性就是不管處於怎樣的環境,PDF都能顯示出完整的、一致的內容。這意味著這張發票放到一個完全不支援中文的系統中,它也能顯示出上面的漢字,並且效果完全一直,當然也包含了不同的字型,楷體,宋體,都沒問題,這就比較厲害了。
其實原理也不難,那就是把字型資訊直接嵌入到PDF檔案內部。也許你覺得不對,我一箇中文宋體的字型檔就有超過10MB了,而我的PDF才幾百K,怎麼可能?——要做到這點也不難,只嵌入部分即可。用福昕的PDF閱讀器開啟這張電子檔發票,選單"File" - "Properties" - "Fonts",你會看到這樣的資訊:
KaiTi,很明顯是楷體,SimSun這是宋體,STSong則是華文宋體,而且編碼格式都有,上面的UniGB-UCS2-H是什麼編碼格式我不太清楚,可能是Unicode,UC應該是Unicode的簡寫。
這裡順便提個事情,就是字型的侵權問題,如果在自己生成的PDF中嵌入字型廠商未授權的字型,很可能會造成侵權!而如果你做了一個網頁,網頁上指定了用未授權的字型(如微軟雅黑)顯示一段文字,這樣則不會造成侵權,原因在於你並沒有在網頁上嵌入微軟雅黑,你只是告訴使用者的瀏覽器,這段文字建議用微軟雅黑顯示,使用者看到的微軟雅黑字型還是使用者自己電腦提供的,跟你沒有關係,所以不會造成侵權,侵不侵權在於你是否二次“釋出”了這個字型。其實要避免侵權也不難,對我們來說,用可免費商用的字型即可,目前還不少,如Google的Noto系列,華為鴻蒙Sans、阿里巴巴普惠體以及小米最近釋出的MiSans,這些都是可以免費商用的。
字型,本質上來說是向量圖,當然過去也曾經有過點陣字型,但現在基本算是淘汰了,向量圖一個特點是無論你放大多少倍,它都不會失真或出現馬賽克,所以一定要我說PDF中儲存的文字到底是圖還是字,那我就說,那是向量圖,這肯定是正確的,因為如今的字型本質上就是向量圖嘛。
而PDF中除了字之外,別的你能看到的很多的元素,其實也都是向量圖,如表格的線條,印章的圓圈這些,要證明也很簡單,使勁放大,看看有沒有失真出現馬賽克或者模糊即可。
當然了PDF中還可能有點陣圖,判斷方法還是上面提到的,放大來看。
PDF的文字的組織形式與我們txt,word或是html都不太一樣,舉個例子,你開啟PDF看到的兩個挨在一塊的文字,如“力量”,這兩個字你覺得它是一個連在一起的詞,其實未必,很可能它是通過兩個不同的座標來指定的,從文件結構上來說,你讀取“力”字,不意味著它的下一個元素就一定是“量”字,儘管視覺上是這樣。這就給我們提取PDF的文字資訊帶來很大的挑戰,我們很難通過直接分析PDF的文件結構提取其中的文字,比較穩妥的方法還是得通過顯示的結果來獲取內容,是的,就是OCR的路線。但即便要使用OCR的路線,也是問題很多,下面這個例子就反映了一個很典型的問題:
閱讀器顯示的“μ”和“接”中間的這個符號在我看來很像一個豎線,即“|”,而實際上它卻是英文字母“l”,用閱讀器複製到記事本中可以證實這點,確實是字母“l”,只不過Windows10種的字母“l”顯示得跟數值“1”一模一樣,真是令人無語,如果使用OCR的方式,字母“l”很可能就被識別為豎線,或者字母“I”(大寫的i),還有就是“μ”這種希臘字母,在OCR中直接被識別成了英文字母“u”,這就很明顯有問題了,對於需要精確匯入資訊的企業應用來說,這顯然是不行的。
另一個問題也在上圖中有體現,就是對空格的理解,福昕閱讀器複製出來的內容中包含了一個空格,而別的沒有,究竟有沒有這個空格,這個很難說,就像我在黑板上寫了兩個字,間隔遠點就算有空格,間隔近了就沒有空格,可這個遠和近如何界定,這個就比較難辦了。
我曾經做過一套PDF內容提取的框架,能通過一些配置資訊嘗試從PDF中提取文字內容,但遇到了很大的麻煩,就如上面提到的那樣,兩個看上去連貫的文字,讀出來的先後順序是沒法保證的,繞來繞去還繞回了OCR的路子,但OCR也是問題不少,總得來說,對於需要精準資訊提取的應用來說,真是最好別用PDF了。——但話雖然這麼說,客戶可不一定能理解,做和不做也不完全由得技術說了算,現實如此也……