【问题标题】:itextpdf exception when closing document with JFreeChart added添加 JFreeChart 关闭文档时出现 itextpdf 异常
【发布时间】:2017-11-13 13:53:51
【问题描述】:

我正在尝试将 JFreeChart 添加到我的 PDF 文件中,并且在 itextpdf 的内部深处遇到了异常。我不知道我做错了什么或异常真正告诉我什么。这是我的代码段:

try {
            PdfWriter writer=PdfWriter.getInstance(document,new FileOutputStream(filePath.getText()));
            document.open();
            document.add(setParagraph("Stoker Monitor Report",titleFont));
            document.add(setParagraph(name.getText(),subTitleFont));
            document.add(setParagraph(date.getText(),dateFont));
            PdfContentByte cb=writer.getDirectContent();
            Float height=7.f;
            Float width=11.69f;
            PdfTemplate tp=cb.createTemplate(width,height);
            Graphics2D g2D=new PdfGraphics2D(cb,width,height);
            Rectangle2D r2D=new Rectangle2D.Double(0,0,width,height);
            Chart.getInstance().getChart().draw(g2D,r2D);
            tp.addTemplate(tp, 0, 0);
        } catch (FileNotFoundException | DocumentException e1) {
            System.err.println("Unable to open "+filePath.getText()+" for writing");
            e1.printStackTrace();
        }
        document.close();

异常即将结束。这是堆栈跟踪:

Exception in thread "AWT-EventQueue-0" com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced save/restore state operators.
at com.itextpdf.text.pdf.PdfContentByte.sanityCheck(PdfContentByte.java:4193)
at com.itextpdf.text.pdf.PdfContentByte.reset(PdfContentByte.java:1813)
at com.itextpdf.text.pdf.PdfContentByte.reset(PdfContentByte.java:1801)
at com.itextpdf.text.pdf.PdfWriter.resetContent(PdfWriter.java:746)
at com.itextpdf.text.pdf.PdfDocument.endPage(PdfDocument.java:1061)
at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:882)
at com.itextpdf.text.Document.close(Document.java:415)
at stokerMonitor.CreateReport$CreateButtonListener.actionPerformed(CreateReport.java:152)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(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$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.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)

我不知道这意味着什么,因为它不涉及我的任何代码。我假设我传递的参数中有一些东西导致了这种情况,但我不知道该看什么。有人可以为我解释这个例外并指出我正确的方向吗? TIA。

【问题讨论】:

    标签: java exception itext jfreechart


    【解决方案1】:

    当你从不知道从哪里复制代码时忘记了一行:

    PdfTemplate tp=cb.createTemplate(width,height);
    Graphics2D g2D=new PdfGraphics2D(cb,width,height);
    Rectangle2D r2D=new Rectangle2D.Double(0,0,width,height);
    Chart.getInstance().getChart().draw(g2D,r2D);
    g2D.dispose();
    cb.addTemplate(tp, 0, 0);
    

    没有dispose(),你会得到各种奇怪的错误。

    tp.addTemplate(tp, 0, 0); 也应该是 cb.addTemplate(tp, 0, 0);

    【讨论】:

    • 谢谢,这消除了错误,但我没有得到任何输出。回到绘图板上。无论如何,我并没有完全忘记,我只是没有意识到这是必要的。我想当线程结束时,对象会被正常的垃圾回收释放。
    • 在创建PdfGraphics2D 对象时,会调用saveState() 方法来保存图形状态,以免图形状态因绘图指令而改变。 dispose() 方法调用restoreState() 方法将状态恢复到开始绘制之前的状态。您总是需要为每个保存状态操作恢复状态,否则 PDF 语法是错误的。它与垃圾回收无关,但对于 PDF 语法的一致性是必需的。
    • 第二次检查后,我明白为什么什么都看不见了。我会更新我的答案。
    • 谢谢。我想通了那部分。虽然我正在旋转横向页面,但我猜我必须切换高度和宽度,这是错误的。使用正确的值,我在新页面上获得了部分图表。我想我现在需要调整尺寸和位置才能将它放在我想要的位置。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多