2017-05-17 17 views
1

我用apache的PDFBox版本2.0.x解析PDF文檔 我看到很多關於從實際內容中分離頁眉/頁腳的問題。 我的發現是這些部分有一些概念(在我的示例PDF中),因爲SortByPosition標誌對內容寫入文本的順序有影響。 當我將SortByPosition設置爲false時,我首先獲得頁眉/頁腳,然後是正文(對於每個頁面都重複此操作)。 當我將SortByPostion設置爲true時,我按照它在PDF閱讀器屏幕上顯示的順序獲取內容。Apache PDFBox PDFTextStripper訪問頁面的文本部分,我該怎麼辦?

PDFTextStripper textStripper = new PDFTextStripper(); 
textStripper.setSortByPosition(true); 

String content = textStripper.getText(pdf); 
System.out.println(content); 

因此,內部這些文本片段可用一個單獨的「文本塊」。 我的問題是:有沒有辦法讓我單獨訪問這些塊?

下面這一段代碼進行排序標誌的輸出爲真

部首PDF MIC

Vandaag Meer的擔1 pagina
門自我介紹geschreven

Header PDF MIC

Dan is第2頁
更多信息在線英語字典

並且這與排序標誌輸出到假

部首PDF MIC

Vandaag Meer的擔1個pagina

門mij geschreven

頁眉PDF MIC

丹DIT pagina 2

會見veel米爾teksten恩woorden。

+1

如果你知道的座標,使用PDFTextStripperByArea。我們感謝 –

+0

@TilmanHausherr PDF文件會由不同供應商提供,我們這樣做,我不知道的佈局/事先協調,但我們可以從PDF/A符合假設的頁眉/頁腳/頁碼很好。如果您收到來自不同供應商 – mpjjonker

+1

PDF文件,爲什麼你認爲你可以做一個內部結構的使用來解析PDF它們全部? *我們可以假設一個頁眉/頁腳/頁碼*卻怎麼也不能*將通過機器識別?想想對你的使用情況適當的標準,那麼我會幫助您實現我們做DIS。 * PDF/A *遵守什麼味道? PDF/A-1A? 1B? 2A? 2B? 2U? 3A? 3B?第三個?這 – mkl

回答

1

感謝@mkl的提示和技巧,這裏是笏我做:

,它使用的PDFMarkedContentExtractor Java代碼件,這隻需在第一頁,但我們可以把這個所有頁面。 在代碼的下面可以找到System.out日誌的輸出。

ExtraMetaData emd = new ExtraMetaData(); //this my own class to carry the header and footer  

PDFMarkedContentExtractor markedContentExtractor = new PDFMarkedContentExtractor(); 
       markedContentExtractor.processPage(document.getPage(0)); 
       List<PDMarkedContent> markedContents = markedContentExtractor.getMarkedContents(); 
       for (Iterator iterator = markedContents.iterator(); iterator.hasNext();) { 
        PDMarkedContent pdMarkedContent = (PDMarkedContent) iterator.next(); 
        System.out.println(pdMarkedContent.getTag()+" --> "+pdMarkedContent.getContents()+ " "+pdMarkedContent.getProperties()); 
        COSDictionary pdmcProperties = pdMarkedContent.getProperties(); 
        if (pdmcProperties.containsKey("Subtype")) { 
         COSBase cosBase = pdmcProperties.getDictionaryObject("Subtype"); 
         if (((COSName)cosBase).getName().equalsIgnoreCase("Footer")) { 
          emd.setFooter(getContentAsString(pdMarkedContent)); 
         } 
         if (((COSName)cosBase).getName().equalsIgnoreCase("Header")) { 
          emd.setHeader(getContentAsString(pdMarkedContent)); 
         }   
        } 
        if (pdmcProperties.containsKey("Attached")) { 
         COSArray cosArray = (COSArray) pdmcProperties.getDictionaryObject("Attached"); 
         for (COSBase cosBase2 : cosArray) { 
          if (((COSName)cosBase2).getName().equalsIgnoreCase("Bottom")) { 
           emd.setFooter(getContentAsString(pdMarkedContent)); 
          } 
          if (((COSName)cosBase2).getName().equalsIgnoreCase("Top")) { 
           emd.setHeader(getContentAsString(pdMarkedContent)); 
          }   

         } 
        } 

       } 

輸出

工件 - > [ - ,, 1 ,, - ,] COSDictionary COSName {{附} {COSArray [COSName {頂}]}; {COSName類型} :分頁COSName {};}

工件 - > [] COSDictionary COSName {{附} {COSArray [COSName底部{}]}; COSName} {類型:COSName分頁{};}

P - > [M,J,..., - ,, 2,0,1,6,2,1,7,2 ,, /,B,]COSDictionary COSName {} {MCID:COSInt {0};}

相關問題