2009-11-18 83 views
1

我正在使用iText從PDF文檔中讀取數據。我得到一個ArrayIndexOutOfBoundsException。奇怪的是,它只發生在某些文件和這些文件中的某些位置。我懷疑這與PDF在這些位置進行編碼的方式有關,但無法弄清楚問題所在。使用iText閱讀PDF文檔有時無法工作

我已看過這個問題Read pdf using iText但他似乎已通過更改此文件的位置解決了他的問題。這對我不起作用,因爲我在某些文件的某些位置得到異常 - 所以它不是文件本身,而是引起異常的頁面。

堆棧跟蹤是

異常在線程 「主」 java.lang.ArrayIndexOutOfBoundsException:無效指數:02 在com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(未知來源) 在com.lowagie.text.pdf.CMapAwareDocumentFont.decode(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString(未知來源) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke(Unknown So urce) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(Unknown Source) at com.lowagie.text.pdf。 parser.PdfTextExtractor.getTextFromPage(未知來源) 在com.pdfextractor.main.Extractor.main(Extractor.java:61)

而線61對應於該行:
含量= extractor.getTextFromPage (頁);
所以看起來非常明顯,getTextFromPage()方法不起作用。

public static void main(String[] args) throws IOException{ 
    ArrayList<String> keywords = new ArrayList<String>(); 
     keywords.add("location"); 
     keywords.add("Mass Spectrometry"); 
     keywords.add("vacuole"); 
     keywords.add("cytosol"); 

    String directory = "C:/Ankur/Projects/PEB/Extractor/papers/"; 
    File directoryToRead = new File(directory); 
    String[] sa_filesToRead = directoryToRead.list(); 
    List<String> filesToRead = Arrays.asList(sa_filesToRead); 

    Iterator<String> fileItr = filesToRead.iterator(); 
    while(fileItr.hasNext()){   

     String nextFile = fileItr.next(); 

     PdfReader reader = new PdfReader(directory+nextFile); 
     int noPages = reader.getNumberOfPages(); 
     PdfTextExtractor extractor = new PdfTextExtractor(reader); 

    String content=""; 
    for(int page=1;page<=noPages;page++){ 
     int index = 1; 
     System.out.println(page); 
     content = extractor.getTextFromPage(page); 

     }  
    } 
    } 
+0

相關:http://stackoverflow.com/questions/1753752/arrayindexoutofboundsexception-not-being-caught-and_ignored – 2009-11-18 07:29:49

回答

1

大多數Java類/庫期待像getTextFromPage(int)的方法進行索引從0開始的 - 這意味着getTextFromPage(0)應該從第1頁返回文本,getTextFromPage(1)應返回從第2頁文本

您的循環,導致ArrayIndexOutOfBoundsException索引從1開始。

是否確定iText的getTextFromPage(int)從1開始索引而不是(幾乎)標準0?

+2

沒有頁面從1開始我剛剛證實了這一點。這個錯誤發生在page = 31和39頁時,所以這真的很奇怪。 – Ankur 2009-11-18 04:50:04

+0

這是真的。分頁從1開始,而不是從0開始。 – 2009-11-19 19:11:26

+0

你爲什麼接受這個答案? – MrDrews 2012-02-06 15:56:57

0

您是否嘗試過在非常活躍的IText郵件列表上發帖?

+0

是的 - 同樣的問題已經發布了三次,沒有得到答覆。 – Ankur 2009-11-18 11:51:04

0

我有一個類似的問題,它總是發生在文本包含特殊字符的地方。我想知道是否有解決編碼問題的方法。

(已更新) 我有5.1.3的com.itextpdf.itextpdf這個問題,但它已更新到5.3.4後。此問題已得到解決。