2012-11-12 105 views
0

閱讀multicolumned PDF文檔iText的閱讀multicolumned PDF文檔

當iText的閱讀PDF(提取網頁內容到一個字符串變量),那麼內容就會被固定在那裏:

reader = new PdfReader(getResources().openRawResource(R.raw.resume1)); 
original_content = PdfTextExtractor.getTextFromPage(reader, 2); 
String sub_content = original_content.trim().replaceAll(" {2,}", " "); 
sub_content = sub_content.trim().replaceAll("\n ", "\n"); 
sub_content = sub_content.replaceAll("(.+)(?<!\\.)\n(?!\\W)", "$1 "); 

如果文檔僅爲1列,但如果文檔具有多列,則會每行提取文檔1。它會結合左列和右列。

我使用this作爲樣本PDF,這是來自START QA文檔。

如何閱讀多版本的PDF文檔?

回答

2

有兩種不同的方法來解決這個問題,使用哪一種方法取決於PDF本身。

  1. 如果在PDF中的問題網頁內容字符串已經是所需的順序:而是隱含使用的使用PdfTextExtractor.getTextFromPage過載的LocationTextExtractionStrategy的,明確使用SimpleTextExtractionStrategy;你的情況:

    original_content = PdfTextExtractor.getTextFromPage(reader, 2, new SimpleTextExtractionStrategy()); 
    
  2. 如果有問題的PDF頁面內容的字符串所需的順序不而是隱含使用的PdfTextExtractor.getTextFromPage您使用過載LocationTextExtractionStrategy的,明確的在FilteredTextRenderListener中包含一個這樣的策略,限制它僅接收單個列的區域的文本;你的情況:

    Rectangle left = new Rectangle(0, 0, 306, 792); 
    Rectangle right = new Rectangle(306, 0, 612, 792); 
    RenderFilter leftFilter = new RegionTextRenderFilter(left); 
    RenderFilter rightFilter = new RegionTextRenderFilter(right); 
    [...] 
    TextExtractionStrategy strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), leftFilter); 
    original_content = PdfTextExtractor.getTextFromPage(reader, 2, strategy); 
    originalContent += " "; 
    strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), rightFilter); 
    original_content += PdfTextExtractor.getTextFromPage(reader, 2, strategy); 
    
+0

謝謝你的回答,MKL。我已經嘗試了您發佈的兩種代碼,第二種方法與我的要求一起使用了1列和2列的pdf。第一種方法存在問題,似乎它從pdf中提取時除去了多餘的pdf(沒有使用3個或更多列的PDF文檔進行嘗試),所以刪除了雙'\ n'。順便說一下,第一種方法是否可能只提取PDF而不編輯內容的形式? –

+0

其實第一種方法(SimpleTextExtractionStrategy)是對頁面內容進行最少操縱的方法,它只在座標跳轉所提示的地方插入空格和換行符。第二種方法更符合單個文本段的座標分析。 – mkl

+0

謝謝mkl,但我只想'SimpleTextExtractionStrategy'提取內容而不操作'\ n'。 –