1

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

我看过这个问题Read pdf using iText但他似乎通过更改此文件的位置解决了他的问题。这对我不起作用,因为我在某些文件中的某些位置遇到异常 - 所以不是文件本身,而是有问题的页面导致异常。

堆栈跟踪是

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引无效:com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(Unknown Source) at com.lowagie.text.pdf.CMapAwareDocumentFont.decode(Unknown Source) at com 的 02 .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 (未知来源)在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(未知来源)在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(未知来源)在 com.lowagie.text.pdf.parser .PdfTextExtractor.getTextFromPage(未知来源)在 com.pdfextractor.main.Extractor。主要(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);

        }       
    }
    }
4

3 回答 3

1

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

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

您确定 iText 的getTextFromPage(int)索引从 1 开始,而不是(几乎)标准的 0?

于 2009-11-18T04:47:05.033 回答
0

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

于 2009-11-18T08:25:50.190 回答
0

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

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

于 2013-01-20T16:16:43.683 回答