JXPanel mit seinen Komponenten auf PDF mit iText ausgeben

Status
Nicht offen für weitere Antworten.

Tobi

Mitglied
Hallo zusammen,

ich möchte gerne bei mir ein programm erweitern. Um zu testen ob es funktioniert, was ich vor habe, hab ich ein kleines Beispiel durchgemacht.

Ich möchte mit dem PDF-Framework iText einiges als PDF ausgeben. Darunter befindet sich
unter anderem ein JXPanel. Dies funktioniert soweit auch, aber leider nur halb. Auf diesem Panel befinden sich noch anderen Komponenten, die Labels etc. Und diese werden beim Export in das PDF nicht berücksichtigt. Hier noch der Code dazu.

Wie bekomme ich das hin, dass auch die Komponenten, die sich auf dem JXPanel (toolbar) mitgelifert und somit auf dem PDF angezeigt werden?

Java:
public void createPdf(JXPanel toolbar) {

        Document document = new Document();
        try {
 
            PdfWriter writer;

            writer = PdfWriter.getInstance(document, new FileOutputStream("shapes.pdf"));

            document.open();
            PdfContentByte cb = writer.getDirectContent();
            PdfTemplate tp = cb.createTemplate(500, 500);
            Graphics2D g2;

            g2 = tp.createGraphicsShapes(500, 500);

            try{
            toolbar.print(g2);
            }
            catch(Exception e){
            
            e.getMessage();
            e.getStackTrace();

            }

            g2.dispose();
            cb.addTemplate(tp, 30, 300);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
        document.close();
    }
 
Danke für den Tip. Aber es sollte einen professionelleren Eindruck machen als es ein Screenshot macht.
 
wo ist den der unterschied? du kannst doch im sagen von wo bis wo er das Bild erzeugen soll!
Code:
robot.createScreenCapture(new Rectangle(50, 100, 400, 200));

die Werte musst du nur noch so setzten das es nur dein JXPanel enthält!
 
Der Unterschied liegt darin, dass da einfach noch mehr dahinter hängt. Es sollen noch andere Werte auf die Ausgabe kommen, beispielsweise Diagramme, die mit jFreeChart erstellt worden sind.
 
Java:
// ...
            Graphics2D g2 = tp.createGraphicsShapes(500, 500);
 
            Robot robot = null;
            try {
            	robot = new Robot();
            }catch (AWTException e) {
            	e.printStackTrace();
            }
            BufferedImage img = robot.createScreenCapture(new Rectangle(50, 100, 400, 200));
            g2.drawImage(img, 0, 0, null);
            g2.dispose();

// ...

wo ist jetzt der Unterschied zu deinem, das du da nicht weiterkommst?
 
Wie kann ich da sicher gehen, dass ich auch immer das drauf haben, was ich möchte?

Weil das Panel wird nicht immer am gleichen Platz sein, bzw es ist ein Baum aus vielen Panels in unterschiedlichen Ebenen dargestellt. Dann ist der Baum auch immer unterschiedliche groß, je nach Einstellung der Suchfilter.
 
von Component gibt es eine Methode
Code:
getLocationOnScreen()
das sollte dir weiterhelfen!
 
Vielen Dank für die Antworten. Leder bringt mich das mit den Screenshots aber nicht wirklich weiter. Wenn ich eine Abfrage habe, kann sich das Ergebnis aber auch über mehrere Seiten hinweg erstrecken. D.h. dann muss gescrollt werden.

Da das Programm ja schon besteht und ich es nur erweitern soll ist dieser Ansatz also nicht praktikabel.
 
Also wenn ich paint() benutze sieht es gleich aus.

Das hier ist die Exceptioon dazu:

Java:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: null incompatible with Text-specific antialiasing enable key
	at java.awt.RenderingHints.put(Unknown Source)
	at java.awt.RenderingHints.putAll(Unknown Source)
	at com.lowagie.text.pdf.PdfGraphics2D.addRenderingHints(Unknown Source)
	at org.jvnet.substance.SubstanceTableUI.update(SubstanceTableUI.java)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at com.mq.app.proco.print.Export.createPdf(Export.java:216)
	at com.mq.app.proco.print.Export$4.actionPerformed(Export.java:158)
	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 org.jvnet.substance.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:111)
	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.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)
 
Mal probiert dieses "Text-specific antialiasing enable key" abzuschalten?
Alternativ das JXPanel erst auf ein BufferedImage ausgeben lassen und dieses dann wiederum auf das Graphics-Objekt von IText zeichnen lassen.
 
Mal probiert dieses "Text-specific antialiasing enable key" abzuschalten?
Alternativ das JXPanel erst auf ein BufferedImage ausgeben lassen und dieses dann wiederum auf das Graphics-Objekt von IText zeichnen lassen.

Ich hab da schon gegooglet (schreib man das so ???:L ) wie man das ausschalten kann, aber ich hab keine Ahnung wie? Vielleicht jemand eine Idee?

Wie ich das mitm BufferedImage dazwischen packen soll verstehe ich auch noch nicht so ganz.
 
Java:
int height = toolbar.getHeight();
int width = toolbar.getWidth();
BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
toolbar.paint(img.getGraphics());

das BufferedImage kannst du dann einfach mit IText in ein IText Image laden.

Java:
Image img = Image.getInstance(img, Color.red); //AWT Image als ITextImage laden.

Document document = new Document(PageSize.A4); //PDF Dokument

Document.add(img); //IMG zum Dokument hinzufügen
 
Zuletzt bearbeitet:
Also ich hab den Fehler nun gefunden. Die Exception mit dem Text-specific antialiasing kommt vom Substance. Wenn ich das LaF auf System umstelle bekomme ich nun eine Ausgabe. Allerdings funktioniert die Ausgabe nur so weit, dass ich keine Labels angezeigt bekomme. Nun habe ich dann das mit dem BufferedImage versucht und nun funktioniert es.

Jedoch hab ich nun noch eine andere Frage. Ich wollte eigenltich einen Baum abbilden, bzw. im PDF ausgeben, der mit Panels aufgebaut ist. D.h. es sind verschieden Farbige Panels mit Werten untereinander gezeichnet und in einem Baum struktieriert (auf 3 Ebenen). Nun kann es vorkommen, dass der Baum über die Anzeige hinaus geht, d.h. gescrollt werden muss. Aber die Sachen werden mir ja nicht angezeigt, bzw. ausgedruckt, stimm das?
 
Da ich hier die Beiträge nciht editieren kann noch ein Zusatz von mir.

Das mit dem BufferedImage funktioniert zwar, jedoch habe ich die Befürchtung, dass ich mit Overflows zu tun bekomme, da man je nach Filter auch mal dreistellige Panel-Anzahlen zeichnen muss. Ich denke nicht, dass ich damit weiter kommen werde.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben