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

Tobi

Mitglied
Danke für den Tip. Aber es sollte einen professionelleren Eindruck machen als es ein Screenshot macht.
 

max40

Bekanntes Mitglied
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!
 

Tobi

Mitglied
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.
 

max40

Bekanntes Mitglied
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?
 

Tobi

Mitglied
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.
 

max40

Bekanntes Mitglied
von Component gibt es eine Methode
Code:
getLocationOnScreen()
das sollte dir weiterhelfen!
 

Tobi

Mitglied
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.
 

Tobi

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

HoaX

Top Contributor
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.
 

Tobi

Mitglied
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.
 

Dissi

Aktives Mitglied
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:

Tobi

Mitglied
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?
 

Tobi

Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Buchstabe durch seinen Nachfolger ersetzen Allgemeine Java-Themen 29
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
G hat jeder thread seinen eigenen stacktrace? Allgemeine Java-Themen 2
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
M Monitoring JMX-Komponenten Allgemeine Java-Themen 0
Fab1 Komponenten eines zweiten Java Programms auslesen Allgemeine Java-Themen 8
P Komponenten kommunikation Allgemeine Java-Themen 7
S Applet nicht signierte Komponenten feststellen Allgemeine Java-Themen 6
J Java Komponenten / Framework Allgemeine Java-Themen 5
N Gridbaglayout - Abstände zwischen Komponenten einstellen Allgemeine Java-Themen 2
C Komponenten einer WebSeite Allgemeine Java-Themen 4
B Eingabemaske Komponenten aktivieren, funktionert nicht (sehr kurios) Allgemeine Java-Themen 2
J Modul/Komponenten/Addon-Programmierung Allgemeine Java-Themen 3
sliwalker Designfrage: Dateninhalte in Komponenten variabel halten Allgemeine Java-Themen 4
G SWT Komponenten ausdrucken ? Allgemeine Java-Themen 3
MQue Komponenten einem JPanel hinzufügen Allgemeine Java-Themen 9
MQue Fokus von Komponenten/JFrame Allgemeine Java-Themen 3
Z variabel Komponenten erstellen oder Compie Allgemeine Java-Themen 4
A Komponenten binär in Datei schreiben Allgemeine Java-Themen 11
G Panel mit vielen Komponenten verbraucht viel Speicher Allgemeine Java-Themen 3
R Umstieg von Delphi (Komponenten) Allgemeine Java-Themen 4
S Swing - Problem mit Fenster-/Komponenten-Größe Allgemeine Java-Themen 3
B Grafische Oberfläche - Welche Komponenten? Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben