Java 获取PNG图像/BuffereImage并将其添加到现有的PDF中

Java 获取PNG图像/BuffereImage并将其添加到现有的PDF中,java,pdf,itext,Java,Pdf,Itext,我正在尝试创建一个类来获取图像,它可以是BuffereImage、RenderImage或png、gif或jpeg类型的图像文件,并将其添加到现有的PDF中 我曾尝试使用缓冲图像和渲染图像,并将其传递给函数并将其添加到PDF中,但总是出现错误,因此我现在尝试将图像文件添加到PDF中,在运行时更改任何代码时,我总是会遇到不同的错误 我当前遇到的错误是: 线程“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException中出现异常 我当前尝试使用的代码是:

我正在尝试创建一个类来获取图像,它可以是BuffereImage、RenderImage或png、gif或jpeg类型的图像文件,并将其添加到现有的PDF中

我曾尝试使用缓冲图像和渲染图像,并将其传递给函数并将其添加到PDF中,但总是出现错误,因此我现在尝试将图像文件添加到PDF中,在运行时更改任何代码时,我总是会遇到不同的错误

我当前遇到的错误是:

线程“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException中出现异常

我当前尝试使用的代码是:

public ExportToPDF() throws IOException {



    PdfDocument pdfDoc = new PdfDocument(new PdfWriter("pdf.pdf"));


    java.awt.Image image1 = ImageIO.read(new File("test.gif"));



    Document doc = new Document(pdfDoc);


    pdfDoc.addNewPage(PageSize.A4);

    doc.add(image1);


    doc.close();

}
到目前为止,我已经花了好几个小时在这个问题上,但我真的找不到一个方法让它发挥作用,任何帮助都将不胜感激。我已经搜索了互联网寻求帮助,我看到的唯一没有尝试过的方法是使用.getInstance,但是当我尝试使用它时,它会说无法解析符号

任何帮助都将不胜感激

完整堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException
at java.io.RandomAccessFile.readBytes(Native Method)
at java.io.RandomAccessFile.read(RandomAccessFile.java:377)
at javax.imageio.stream.FileImageInputStream.read(FileImageInputStream.java:117)
at com.sun.imageio.plugins.common.SubImageInputStream.read(SubImageInputStream.java:61)
at com.sun.imageio.plugins.common.InputStreamAdapter.read(InputStreamAdapter.java:47)
at java.io.SequenceInputStream.read(SequenceInputStream.java:207)
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at com.sun.imageio.plugins.png.PNGImageReader.decodePass(PNGImageReader.java:1112)
at com.sun.imageio.plugins.png.PNGImageReader.decodeImage(PNGImageReader.java:1223)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1338)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1614)
at javax.imageio.ImageIO.read(ImageIO.java:1448)
at javax.imageio.ImageIO.read(ImageIO.java:1308)
at CE201.ExportToPDF.<init>(ExportToPDF.java:26)
at CE201.CsvGUI$7.actionPerformed(CsvGUI.java:256)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

尝试移动
pdfDoc.addNewPage(PageSize.A4)至之前<代码>单据单据=新单据(pdfDoc)
@ElliottFrisch谢谢你的建议,我试过了,但仍然得到了相同的错误。你没有发布完整的堆栈跟踪,确切地说是哪一行抛出了
索引outofboundsexception
?@ElliottFrisch我已经添加了它,谢谢你没有文件“test.gif”。将完整路径添加到gif(并确保它是有效的图像文件)。实际上,为什么png文件以gif结尾?也许再检查一下。
public void actionPerformed(ActionEvent e) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    WritableImage img = fxPanel.getScene().snapshot(null);
                    File file = new File("test.png");
                    RenderedImage renderedImage = SwingFXUtils.fromFXImage(img, null);

                    try {
                        ImageIO.write(renderedImage, "PNG", file);
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }