Чтение PDF-документа с iText иногда не работает - PullRequest
1 голос
/ 18 ноября 2009

Я использую iText для чтения из PDF-документа. Я получаю ArrayIndexOutOfBoundsException. Странно то, что это происходит только для определенных файлов и в определенных местах в этих файлах. Я подозреваю, что это как-то связано с тем, как PDF кодируется в этих местах, но не могу понять, в чем проблема.

Я посмотрел на этот вопрос Прочитайте PDF, используя iText , но он, похоже, решил свою проблему, изменив местоположение этого файла. Это не сработает для меня, так как я получаю исключение в определенных местах в некоторых файлах, поэтому исключение вызывает не сам файл, а рассматриваемая страница.

Трассировка стека

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: Неверный индекс: 02 на com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (неизвестный источник) на com.lowagie.text.pdf.CMapAwareDocumentFont.decode (неизвестный источник) на com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (неизвестный источник) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (неизвестный источник) в 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 (Неизвестный источник) at 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 ]

1 голос
/ 18 ноября 2009

Большинство классов / библиотек Java ожидают, что такой метод, как getTextFromPage(int), будет проиндексирован, начиная с 0 - это означает, что getTextFromPage(0) должен вернуть текст со страницы 1, getTextFromPage(1) должен вернуть текст со страницы 2.

Ваш цикл for, вызывающий исключение ArrayIndexOutOfBoundsException, индексируется, начиная с 1.

Вы уверены, что getTextFromPage(int) в iText индексируется, начиная с 1, а не (почти) стандартного 0?

0 голосов
/ 20 января 2013

У меня похожая проблема, и она всегда возникала, когда текст содержит специальные символы. Интересно, есть ли способ обойти кодировку?

(Обновлено) У меня была эта проблема с com.itextpdf.itextpdf из 5.1.3, но после обновления до 5.3.4. Эта проблема была исправлена.

0 голосов
/ 18 ноября 2009

Вы пробовали публиковать сообщения в очень активном списке рассылки IText?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...