使用iText阅读PDF文档有时无法正常工作

时间:2009-11-18 04:21:36

标签: java exception pdf itext

我正在使用iText阅读PDF文档。我得到一个ArrayIndexOutOfBoundsException。奇怪的是它只发生在某些文件和这些文件中的某些位置。我怀疑这与PDF在这些位置编码的方式有关,但无法弄清问题是什么。

我看过这个问题Read pdf using iText,但他似乎通过改变这个文件的位置来解决他的问题。这对我来说不起作用,因为我在某些文件中的某些位置获得了异常 - 所以它不是文件本身,而是导致异常的相关页面。

堆栈跟踪

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:无效索引:02       at com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(Unknown Source)       at 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(Unknown Source)       at com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke(Unknown Source)       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(Unknown Source)       在com.pdfextractor.main.Extractor.main(Extractor.java:61)

第61行对应此行:
    content = extractor.getTextFromPage(page);
所以很明显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);

        }       
    }
    }

3 个答案:

答案 0 :(得分:1)

大多数Java类/库希望像getTextFromPage(int)这样的方法从0开始编制索引 - 这意味着getTextFromPage(0)应该从第1页返回文本,getTextFromPage(1)应该从页面返回文本2。

导致ArrayIndexOutOfBoundsException的for循环从1开始编制索引。

您确定iText的getTextFromPage(int)是从1开始编号而不是(几乎)标准0吗?

答案 1 :(得分:0)

您是否尝试在非常活跃的IText邮件列表上发帖?

答案 2 :(得分:0)

我有一个类似的问题,它总是出现在文本包含特殊字符的地方。我想知道是否有办法解决编码问题。

(更新) 我在5.1.3的com.itextpdf.itextpdf中遇到了这个问题,但在更新到5.3.4之后。这个问题已得到解决。