我一直在嘗試編寫一個簡單的控制檯應用程序或PowerShell腳本來從大量PDF文檔中提取文本。有幾種庫和CLI工具可以提供這種功能,但事實證明,沒有人能夠可靠地識別文檔結構。特別是我關心的是對文本列的認識。即使是非常昂貴的PDFLib TET工具也經常會忽略兩列相鄰文本的內容。如果識別PDF文檔中的文本結構非常困難,那麼PDF閱讀器如何做到這一點呢?
人們經常注意到PDF格式沒有任何列的概念,甚至沒有字。有關SO的類似問題的幾個答案提到這一點。問題非常嚴重,甚至需要學術研究。 This journal article筆記:
在PDF文件中的所有數據對象表示在 視覺化的方式,作爲一般... 不傳達更高層次的文本單位如 令牌信息運營商的序列,關於這樣 單位之間的邊界線,或列信息只能間接的通過空白
因此,所有的提取工具,我已經試過(iTextSharp的之外,PDFlib TET和Python PDFMiner)沒有認識到文本列邊界。在這些工具中,PDFLib TET表現最好。
但是,SumatraPDF是一款非常輕巧的開源PDF閱讀器,以及許多其他類似軟件可以完美地識別列和文本區域。如果我在其中一個應用程序中打開文檔,請選擇頁面上的所有文本(或者使用CTRL + A甚至整個文檔)將其複製並粘貼到文本文件中,文本將以正確的順序幾乎完美地呈現。它偶爾會將頁腳和標題文本混合到其中一列中。
所以我的問題是,這些應用程序如何執行看起來如此困難的事情(即使對於像PDFLib這樣的昂貴工具)呢?
2014年3月31日編輯:我發現PDFBox在文本提取方面比iTextSharp好得多(儘管有定製的策略實現),PDFLib TET稍好於PDFBox,但它相當昂貴。 Python PDFMiner是無望的。我見過的最好結果來自Google。您可以將PDF(每次2GB)上傳到Google雲端硬盤,然後將其作爲文本下載。這就是我正在做的。我寫了一個小工具,將我的PDF分成10個頁面文件(Google僅轉換前10頁),然後下載後再將它們拼接在一起。
編輯2014年4月7日。取消我的最後一個。最好的提取是通過MS Word實現的。這可以在Acrobat Pro中自動執行(工具>操作嚮導>創建新操作)。 Word到文本可以使用.NET OpenXml庫自動進行。 Here is a class,它會非常整齊地提取(docx到txt)。我最初的測試發現MS Word轉換在文檔結構方面更加準確,但是一旦轉換爲純文本,這並不重要。
我不知道其他產品,在* iTextSharp *的情況下,雖然,您沒有得到最終完整的文本提取器。相反,您會得到一個帶有兩個示例策略的框架,一個非常簡單(以PDF中的繪圖命令的順序獲取文本)和一個位置感知(從上到下,從左到右讀取)。後者可以很容易地(例如,通過@David給出的提示)擴展以嘗試和識別列。這意味着一些工作,但似乎還沒有人投入這個問題,並允許結果進入iTextSharp的開源。 – mkl
使用Word的好選擇。另一種可能性是在Word中使用VBA從文檔中提取所需的任何信息。 –