Почему я получаю IllegalStateException: индекс не найден в методе получения PDFBOX PDPageTree? - PullRequest
0 голосов
/ 04 июля 2019

Моя программа должна прочитать первые страницы PDF-файла и для этого использует PDFBox 2.0.15.Это часто работает, но для некоторых документов (отсканированных PDF-файлов со сканера / принтера, которые не могут быть общими) я получаю вышеупомянутое исключение, хотя индексный цикл не превышает PdPageTree getCount():

PDPageTree allPages = pdf.getPages();
int pageLimit = allPages.getCount();
System.err.println("Page Tree has " + pageLimit + " pages"); // 1 page reported

for (int i = 0; i < pageLimit; i++) {

    System.err.println("i = " + i); // prints 0


    PDPage page = allPages.get(i); // => java.lang.IllegalStateException: Index not found: 1 (1-based page numbering as written in the javadoc but get() is 0-based)
…
}

И трассировка стека:

java.lang.IllegalStateException: Index not found: 1
    at org.apache.pdfbox.pdmodel.PDPageTree.get(PDPageTree.java:298)
    at org.apache.pdfbox.pdmodel.PDPageTree.get(PDPageTree.java:227)
    at myProject.tools.analyzePDF(Tools.java:1159)
    at java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
    at java.base/java.util.HashMap$KeySpliterator.tryAdvance(HashMap.java:1624)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.MatchOps$MatchTask.doLeaf(MatchOps.java:306)
    at java.base/java.util.stream.MatchOps$MatchTask.doLeaf(MatchOps.java:277)
    at java.base/java.util.stream.AbstractShortCircuitTask.compute(AbstractShortCircuitTask.java:115)
    at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
    at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
    at java.base/java.util.stream.MatchOps$MatchOp.evaluateParallel(MatchOps.java:242)
    at java.base/java.util.stream.MatchOps$MatchOp.evaluateParallel(MatchOps.java:196)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    at java.base/java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:528)
    at myProject.State.StartState$1.run(StartState.java:135)
    at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
    at java.base/java.util.TimerThread.run(Timer.java:506)

Почему я получаю это исключение, хотя pageCount () верна?

У задействованных файлов PDF есть следующие общие метаданные:

  • Производитель:Eastman Kodak Company
  • Создатель: Smart Touch 1.3
  • Формат: PDF 1.4
  • Оптимизирован: Нет
  • Защищен: Нет
  • Формат бумаги: А4 портрет
...