java - 使用 PDFBox PDFPagePanel 时出现 IndexOutOfBounds 异常

标签 java swing pdfbox indexoutofboundsexception

我正在尝试使用 PDFBox 的 PDFPagePanel 将 PDF 文件加载到基于 Swing 的电子书阅读器应用程序中。

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(),也会得到同样的错误。如有任何帮助,我们将不胜感激。

最佳答案

问题是 pdfDocpanel.setPage() 之后立即关闭。但是,PDFPagePanel 仅在显示页面时才尝试处理 pdf 流。要克服此异常,请确保文档在 PDFPagePanel 仍在使用时可用。您可能需要将文档设置为成员变量,因为一旦文档离开范围,GC 可能会收集它,从而触发其关闭。

关于java - 使用 PDFBox PDFPagePanel 时出现 IndexOutOfBounds 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720502/

相关文章:

java - 如何使用 Java 对具有可见签名和文本的 PDF 文档进行数字签名

java - 搜索 Facebook 上的公开帖子

java - 修复由于 JTextArea 导致的 GUI 无响应的问题?

java - 大数错误

java - 为什么 JLabel 不遵循 GridLayout 以及如何消除之间的间隙?

java - 如何用鼠标单击任何java组件而不覆盖实际鼠标

java - Apache PDFBox - 无法读取 PDF 中的所有字段

java - 将 PDF 转换为多页 tiff(第 4 组)

java - 解码多次编码的字符串

java - Spring MVC - 将一个错误映射到多个字段