2013-12-21 4 views
2

Я пытаюсь использовать PDFPagePanel PDFBox для загрузки PDF-файлов в приложение для чтения электронных книг Swing.IndexOutOfBounds Исключение при использовании PDFBox PDFPagePanel

PDDocument pdfDoc = PDDocument.load(file); 
List<PDPage> pages = (List<PDPage>) pdfDoc.getDocumentCatalog().getAllPages(); 
PDFPagePanel panel = new PDFPagePanel(); 
panel.setPage(pages.get(0)); 
pdfDoc.close();   
JFrame frame = new JFrame(); 
frame.add(panel); 
frame.setVisible(true); 

Это в теории должно работать, так как PDFPagePanel просто JPanel и файл открывается, как представляется, следует читать правильно, как я могу использовать текстовый съемник для извлечения текста штраф и получить метаданные. Однако всякий раз, когда я бегу, я получаю следующее исключение: IndexOutOfBounds

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at org.apache.pdfbox.io.RandomAccessBuffer.seek(RandomAccessBuffer.java:84) 
    at org.apache.pdfbox.io.RandomAccessFileInputStream.read(RandomAccessFileInputStream.java:96) 
    at java.io.BufferedInputStream.fill(Unknown Source) 
    at java.io.BufferedInputStream.read1(Unknown Source) 
    at java.io.BufferedInputStream.read(Unknown Source) 
    at java.io.FilterInputStream.read(Unknown Source) 
    at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:161) 
    at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:98) 
    at org.apache.pdfbox.cos.COSStream.doDecode(COSStream.java:295) 
    at org.apache.pdfbox.cos.COSStream.doDecode(COSStream.java:237) 
    at org.apache.pdfbox.cos.COSStream.getUnfilteredStream(COSStream.java:172) 
    at org.apache.pdfbox.pdfparser.PDFStreamParser.<init>(PDFStreamParser.java:108) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:251) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:235) 
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:215) 
    at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:125) 
    at org.apache.pdfbox.pdfviewer.PDFPagePanel.paint(PDFPagePanel.java:98) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at java.awt.Window.paint(Unknown Source) 
    at javax.swing.RepaintManager$3.run(Unknown Source) 
    at javax.swing.RepaintManager$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.access$1000(Unknown Source) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

страница помещать его в PDFPagePanel (pages.get (0)), безусловно, существует. Я получаю ту же ошибку, если попытаюсь использовать convertToImage() на странице. Любая помощь приветствуется.

+0

Что произойдет, если – csmckelvey

ответ

3

Проблема в том, что pdfDoc был закрыт немедленно после panel.setPage(). Однако PDFPagePanel пытается обработать поток pdf только при отображении страницы. Чтобы преодолеть это исключение, убедитесь, что документ доступен, пока он все еще используется PDFPagePanel. Возможно, вам придется сделать документ переменной-членом, так как GC может собрать его, как только документ покинет область действия, которая вызовет его закрытие.

+0

Да, это работает! Спасибо. Мне нужно добавить документ как переменную-член, но это нормально. Спасибо. – LadyBernkastel

+0

@LadyRacheya Добро пожаловать! Я рад, что это помогло :) – tenorsax

+1

@Aqua спасибо за решение, моя проблема связана с вашим ответом. – pudaykiran

Смежные вопросы