2017-11-13 2 views
1

Ich versuche, ein JFreeChart zu meiner PDF-Datei hinzuzufügen und bekomme eine Ausnahme tief im Inneren von itextpdf. Ich habe keine Ahnung, was ich falsch mache oder was mir die Ausnahme wirklich sagt. Hier ist mein Code-Segment:itextpdf Ausnahme beim Schließen des Dokuments mit JFreeChart hinzugefügt

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(); 

Die Ausnahme ist auf den Abschluss. Hier ist der Stacktrace:

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) 

Ich habe keine Ahnung, was das bedeutet, da es nichts von meinem Code beinhaltet. Ich nehme an, dass etwas in den Parametern, die ich passiere, das verursacht, aber ich habe keine Ahnung, was ich sehen soll. Kann jemand diese Ausnahme für mich interpretieren und mir in die richtige Richtung weisen? TIA.

Antwort

1

Sie eine Zeile vergessen haben, wenn Sie Ihren Code kopiert wer weiß, wo:

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); 

Ohne die dispose(), können Sie alle Arten von seltsamen Fehlermeldungen erhalten.

Auch sollte tp.addTemplate(tp, 0, 0);cb.addTemplate(tp, 0, 0);

+0

Dank sein, dass der Fehler losgeworden, aber ich bekomme nichts für die Ausgabe. Zurück zum Zeichenbrett darauf. Jedenfalls habe ich nicht genau vergessen, ich habe einfach nicht gemerkt, dass es notwendig war. Ich dachte, dass das Objekt mit der normalen Garbage Collection freigegeben würde, wenn der Thread beendet wäre. –

+0

Wenn Sie ein 'PdfGraphics2D'-Objekt erstellen, wird die' saveState() '-Methode aufgerufen, um den Grafikzustand zu speichern, bevor er aufgrund von Zeichenanweisungen geändert wird. Die Methode 'dispose()' ruft die Methode 'restoreState()' auf, um den Zustand wiederherzustellen, der vor dem Beginn des Zeichnens vorhanden war. Sie müssen den Status für jeden Speicherstatusvorgang immer wiederherstellen, da sonst die PDF-Syntax falsch ist. Es hängt nicht mit der Speicherbereinigung zusammen, sondern ist für die Konsistenz der PDF-Syntax erforderlich. –

+0

Bei der zweiten Inspektion sehe ich, warum nichts sichtbar ist. Ich werde meine Antwort aktualisieren. –

Verwandte Themen