2011-09-28 184 views
6

我正在做一個Java程序來讀取加密的PDF文件,並提取文件頁面的內容,包括文本,圖像和它們的位置(x,y座標)文件。現在我正在使用PDFBox來達到此目的,並且我正在獲取文本和圖像。但我無法獲得文字位置和圖像位置。閱讀一些加密的PDF文件也有一些問題。使用PDFBox讀取文本和圖像位置(xy座標)

回答

2

看看org.apache.pdfbox.examples.util.PrintTextLocations。我已經使用了它,並且對PDF文檔中元素和邊界框的佈局進行分析非常有幫助。它還顯示用白色墨水打印的項目,或者在可打印區域外面(可能是文檔水印,或作者遺漏的「遺忘」項目)。

用例:

java -cp app/target/pdfbox-app-1.5.0.jar org.apache.pdfbox.examples.util.PrintTextLocations ~/tmp/mydoc.pdf >~/tmp/out-text-locations.txt 

你會得到類似的東西:

Processing page: 0 
String[53.9,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=4.6679993]A 
String[58.568,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=2.6640015]f 
String[61.232002,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=1.6679993]e 
... 

,你可以很容易地解析和使用繪製元素的位置,邊界框,而「流」 (通過所有元素的軌跡)等等。我相信你已經知道,你會發現PDF幾乎不可能轉換成文本。它實際上只是一個圖形描述格式(即打印機或屏幕),而不是標記語言。您可以輕鬆製作一個打印「Hello world」的PDF文件,但它會隨機跳過字符位置(如果您願意,可以使用不同於任何ISO字符編碼的字形),從而使PDF很難轉換爲文本。沒有「單詞」或「段落」的概念。例如,兩列文檔可能是分析文本的噩夢。

對於你的問題的第二部分,我有很好的效果使用xpdf的3.02版本,固定Xref.cc後(請XRef::okToPrint()XRef::okToChange()XRef::okToCopy()XRef::okToAddNotes()都返回gTrue)。這是處理鎖定的文件,而不是加密的文件(還有其他的utils)。