2016-02-11 122 views
2

我正在使用iText從特定位置的pdf文件中提取一些文本。 爲了做到這一點,我使用的LocationTextExtractionStrategy:iText:使用LocationTextExtractionStrategy從pdf文件中提取的文本的順序錯誤

public static void main(String[] args) throws Exception { 

    PdfReader pdfReader = new PdfReader("location_text_extraction_test.pdf"); 

    Rectangle rectangle = new Rectangle(38, 0, 516, 516); 

    RenderFilter[] filter = {new RegionTextRenderFilter(rectangle)}; 
    TextExtractionStrategy strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter); 
    String text = PdfTextExtractor.getTextFromPage(pdfReader, 1, strategy); 

    System.out.println(text); 

    pdfReader.close(); 
} 

Link to pdf file

的問題是,所提取的文本是在錯誤的順序:

enter image description here

應該怎樣提取作爲:

Part Description Quantity Unit Price Total For Line Extended Price 
Landing Fee 1.00 407.84 $ USD 407.84 407.84 $ 

被提取爲:

Total For Line Extended Price 
Part Description Quantity Unit Price 
1.00 407.84 $ USD 407.84 407.84 $ 
Landing Fee 

需要注意的是,當我在Acrobat中打開PDF,選擇所有文本使用Ctrl + A,複製,然後粘貼在文本編輯器的一切按正確順序排列。

有沒有辦法解決這個問題? 非常感謝;)

+0

最有可能的「總延長線價格」略高於「零件描述數量單價」,因此之前提取。 – mkl

+0

答案有幫助嗎?如果沒有,請指出問題所在。 – mkl

+0

對不起,我很忙,無法測試答案中提供的解決方案。我會盡快找到一些時間;) –

回答

3

的原因這僅僅是「總線路擴展價格」是一個Ÿ在的507.37座標,而「部分說明數量單價」爲y的506.42座標。

LocationTextExtractionStrategy允許通過僅考慮y座標的整數部分的小變化,但即使整數部分在這裏也不同。因此,它假定前面的標題在後面的標題之上,並相應地輸出其結果。

在這種變化的情況下,通常第一次嘗試可能是嘗試SimpleTextExtractionStrategy。不幸的是,這在這裏沒有幫助,因爲前面的文本實際上是在後面的文本之前繪製的因此,這種策略也會以錯誤的順序返回標題。

在這種情況下,您需要一種工作方式不同的策略,例如,戰略HorizontalTextExtractionStrategyHorizontalTextExtractionStrategy2(取決於您的iText版本,前者爲iText 5.5.8,後者爲當前開發代碼5.5.9-SNAPSHOT)從this answer。使用它,你會得到

Part Description Quantity Unit Price Total For Line Extended Price 
Landing Fee 1.00 407.84 $ USD 407.84 407.84 $ 
Parking 1.00 101.96$ USD 101.96 101.96$ 
??? 1.00 51.65$ USD 51.65 51.65$ 
Pax Baggage Handling Fee 5.00 8.49$ USD 42.45 42.45 $ 
Pax Airport Tax 5.00 26.36 $ USD 131.80 131.80$ 
GA terminal for crew on Arr ferry fit 1.00 125.00$ USD 125.00 125.00$ 
VIP lounge for Pax on Dep. 5.00 124.00$ USD 620.00 620.00 $ 
GA terminal for crew on dep. 1.00 125.00$ USD 125.00 125.00$ 
VIP lounge for Guest on Dep. 1.00 38.00$ USD 38.00 38.00 $ 
Crew transfer on arr 1.00 70.00 $ USD 70.00 70.00 $ 
Crew transfer on dep 1.00 70.00 $ USD 70.00 70.00 $ 
Lavatory Service 1.00 75.00 $ USD 75.00 75.00 $ 
Catering-ISS 1.00 1,324.28 $ USD 1,324.28 1,324.28 $ 
Ground Handling 1.00 190.00$ USD 190.00 190.00$ 
Pax Handling 1.00 190.00$ USD 190.00 190.00$ 
Push Back 1.00 83.00 $ USD 83.00 83.00 $ 
Towing 1.00 110.00$ USD 110.00 110.00$ 

但不幸的是,這些策略失敗(使用TextExtraction測試方法testLocation_text_extraction_test的結果),如果有不同的邊對邊柱重疊的線路,例如在您的文件中列出發票收件人地址和其右側的信息。

您可以嘗試調整水平策略(例如通過分析橫向間隔來分隔列)或嘗試組合方法,即使用同一文檔的多個策略的輸出。

相關問題