2014-03-27 25 views
6

我一直在嘗試編寫一個簡單的控制檯應用程序或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轉換在文檔結構方面更加準確,但是一旦轉換爲純文本,這並不重要。

+0

我不知道其他產品,在* iTextSharp *的情況下,雖然,您沒有得到最終完整的文本提取器。相反,您會得到一個帶有兩個示例策略的框架,一個非常簡單(以PDF中的繪圖命令的順序獲取文本)和一個位置感知(從上到下,從左到右讀取)。後者可以很容易地(例如,通過@David給出的提示)擴展以嘗試和識別列。這意味着一些工作,但似乎還沒有人投入這個問題,並允許結果進入iTextSharp的開源。 – mkl

+0

使用Word的好選擇。另一種可能性是在Word中使用VBA從文檔中提取所需的任何信息。 –

回答

8

我曾經寫過一種算法,它完全符合您提到的PDF編輯器產品,它仍然是今天使用的頭號PDF編輯器。對於你提到的(我認爲)有幾個原因,但重要的是重點。

你是正確的,PDF(通常)不包含任何結構信息。 PDF對頁面的可視化表示感興趣,不一定在頁面「意味着什麼」。這意味着它最純粹的形式並不需要關於行,段落,列或類似的東西的信息。實際上,它甚至不需要關於文本本身的信息,並且有大量的PDF文件,甚至無法複製和粘貼文本而沒有以亂碼結束。

所以,如果你想能夠提取格式化文本,你必須看看頁面上的所有文本,也許考慮到一些線條藝術信息,你必須將它們重新拼回去。通常情況下,通過編寫一個引擎來查看空白處,然後首先確定線是什麼,段落是什麼等等。衆所周知,表格很難,因爲它們如此多樣化。

可選策略可能是:

  • 看看其中的一些是在提供一些 PDF文件結構的信息。某些PDF/A文件和所有PDF/UA文件(PDF用於歸檔和PDF用於通用可訪問性)必須具有可以很好地用於檢索結構的結構信息。其他PDF文件也可能具有該信息。
  • 看看PDF文檔的創建者,並具有特定的算法來很好地處理這些PDF。如果您知道您只對Word感興趣,或者如果您知道您將要處理的PDF文件中的99%將會來自Word 2011,則可能值得使用該知識。

那麼爲什麼有些產品比其他產品更好呢?重點我猜。 PDF規範非常廣泛,有些工具更側重於較低級別的PDF任務,還有一些更側重於較高級別的PDF任務。有些面向「辦公室」使用 - 有些面向「圖形藝術」使用。根據您的焦點,您可能會決定某個特性值得關注或不值得關注。

此外,這可能看起來像一個糟糕的答案,但我相信它實際上是真實的,這是一個算法上困難的問題,它只需要一位天才開發人員實現一個算法,比市場上的一般產品。這是其中一個領域 - 如果你很聰明,並且你有足夠的重點來關注它,特別是如果你有一個好主意,你在寫這個目標市場是什麼 - 你會做對的,而其他人都會得到平庸的。

(不,我沒有得到它右後衛然後當我在寫代碼 - 我們從來沒有足夠的重視,以有始有終,使東西是非常好的)

+1

關於「正確」:這可能被認爲是「一個移動的目標」。假設左邊有三行小文本,右邊是兩行較大的文本。廣義文本提取器能夠在原始文本的「正確」順序上假設*任何*嗎? – usr2564301

+1

完全正確。問題在於我們大部分時間都在處理大量設計繁重的文檔,而文本識別並不像雜誌設計人員在頁面上做的那樣。對於簡單的業務報告而言,做出正確的事情比在InDesign中設計的文件更容易。 –

5

要正確提取格式化文本庫/實用程序應:

  1. 檢索有關PDF中使用的字體的屬性正確的信息(字形大小,提示信息等)
  2. 保持圖形狀態(即非字體參數如文本和頁面縮放等)
  3. 實現一些算法來決定頁面上的哪些符號應該像字,行或列一樣處理。

我不是你問題中提到的產品的專家,所以下面的結論應該與一粒鹽一起服用。

不需要的工具draw在前兩個要求中,PDFs的專業知識往往較少。他們不必在更深層次上處理字體細節,並且在維護圖形狀態時可能沒有經過很好的測試。

將PDF轉換爲圖像的任何體面的工具可能遲早會意識到其在文本定位中的缺點。修復這些將有助於提取文本。

+0

其實暗示是不需要的 - 一個小的細節評論你的好答案。 –