2011-01-11 27 views
2

我正在使用PDFBox從PDF中提取文本。 PDF有一個表格結構,它非常簡單,列間距也非常寬。保留PDFBox文本提取中的「long」空格

這個工作非常好,除了所有類型的水平空間都被轉換爲單個空格字符,所以我不能再分開各列(一列中的空格看起來就像列之間的空格)。

我明白,一個通用的解決方案是很辛苦,但在這種情況下,列是真的相距甚遠,使得具有「長間隔」和「字與字之間的空間」之間的簡單區別就足夠了。

有沒有辦法告訴PDFBox將多於x英寸的水平空白轉換爲單個空間以外的東西?比例方法(x英寸變成y空格)也可以工作。

pdftotext C library/tool有一個'-layout'開關,試圖保留佈局。基本上,如果我可以用PDFBox來模擬,那將是完美的。

+0

你可能想看看[這個答案](https://stackoverflow.com/a/45842515/1729265)。 – mkl 2017-10-16 04:18:41

回答

2

似乎沒有爲此設置,但我可以修改PDFTextStripper工具的源以在遇到「長」空間時輸出列分隔符(|)。在構建輸出行的代碼中,可以查看當前字母和前一個字母的x位置,並且如果足夠大,請執行特殊操作。 PDFTextStripper擁有許多受保護的方法,但事實證明它們並非全部可擴展。我最終不得不復制整個班級來改變私人方法。

看看那裏的代碼,我稱自己很幸運,使用特定的PDF,這種簡單的方法是成功的。更普遍的解決方案似乎非常棘手。

+1

你必須改變哪種私人方法,你是如何改變它的? – 2015-12-18 15:16:17

1

PDF文本提取很困難。

如果文本是輸出作爲一個大的字符串由空格等隔開: -

PDFTextOut("  Column 1     Column 2   Column 3"); 

並且正在使用固定寬度的字體,例如信使則理論上可以計算出的空間的項之間的數因爲每個字符都是相同的寬度。如果字體與Arial成比例,則計算更困難。

在現實中大多數的PDF文件的每個文本塊逐個放到直接到其位置上產生。因此,技術上沒有空格字符或列之間的任何其他字符。文本只是放置在頁面上的絕對位置。

PDFMoveTo(100,100); 
PDFTextOut("Column 1"); 
PDFMoveTo(250,100); 
PDFTextOut("Column 2"); 

爲了對PDF文檔進行數據抽取你必須做一點點工作,通過匹配列數據使用像素位置,你所提到的和做一些假設,並有一點點的發現和運氣。

+1

好,PDF文本提取是困難的,但xpdf中的pdftotext的佈局保存選項工作得很好。將是不錯的有類似的東西PDFBox的(已經成功地保存閱讀順序,在將文本在同一行到相同的輸出線,並在分組字成詞)。這個明文輸出是否足夠清晰以滿足以下解析邏輯(即必須重構表格),這是另一個問題。幸運的是,在我的情況下,它的工作。 – Thilo 2011-01-12 07:13:52