# Drucken eines "Formulars" in abgeänderter Form



## DerKleineBaer (30. Sep 2010)

Hallo zusammen,

ich schreibe an einem Programm, mit dem ich etwas drucken will.
Ich habe Textfelder, Label und Button im Frame. In die Textfelder gibt der User etwas ein. 
Das soll anschließend gedruckt werden können. 
Allerdings nicht so, wie es gerade sichtbar ist, sondern in schöner aufbereiteter Weise.
Also beispielsweise sollen anschließend noch weitere Angaben sichtbar sein oder die Textfelder nicht als Textfelder. 
Lauter solche Dinge.
Ich habe schon nach Möglichkeiten gesucht, daraus vielleicht ein PDF zu machen, damit man es anschließend ausdrucken kann. 
Aber natürlich auch in aufbereiteter Weise.
Ist das irgendwie möglich? Entweder direkt im Programm drucken oder als PDF speichern und dann drucken? Also dass man allgemein drucken kann weiß ich natürlich. Aber wichtig ist eben das veränderte Aussehen des "Formulars".

Viele Grüße


----------



## André Uhres (2. Okt 2010)

DerKleineBaer hat gesagt.:


> ich schreibe an einem Programm, mit dem ich etwas drucken will.
> ... Allerdings nicht so, wie es gerade sichtbar ist, sondern in schöner aufbereiteter Weise.



Hallo Bär ,

wir können einfach eine Druckvorschau machen, so wie wir sie gerade wünschen, und diese dann drucken. Unten findest du ein kleines Beispiel dazu.

Gruß,
André


```
/*
 * JavaPrinting.java
 * 
 * needs the class ContainerPrintable.java
 * Here it is:
 * http://wiki.byte-welt.de/wiki/ContainerPrintable
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.util.logging.*;
import javax.print.attribute.*;
import javax.swing.*;

public class JavaPrinting {

    private JFrame frame;
    private JTextField tfBlabla1, tfBlabla2;
    private JDialog previewDialog;
    private PrintPanel printPanel;

    public JavaPrinting() {
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                JavaPrinting javaPrinting = new JavaPrinting();
                javaPrinting.createAndShow();
            }
        };
        SwingUtilities.invokeLater(gui);
    }

    public void createAndShow() {
        frame = new JFrame("JavaPrinting");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        JPanel controlPanel = createControls();
        frame.add(controlPanel, BorderLayout.NORTH);
        JPanel mainPanel = createMainPanel();
        frame.add(mainPanel);
        frame.setVisible(true);
    }

    private JPanel createControls() {
        JPanel panel = new JPanel();
        JButton btPrintPreview = new JButton(new PreviewAction());
        panel.add(btPrintPreview);
        return panel;
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        tfBlabla1 = new JTextField("blabla1");
        panel.add(tfBlabla1);
        tfBlabla2 = new JTextField("blabla2");
        panel.add(tfBlabla2);
        return panel;
    }

    private void preview() {
        previewDialog = new JDialog();
        previewDialog.setTitle("Print Preview");
        printPanel = new PrintPanel();
        JScrollPane scroller = new JScrollPane(printPanel);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        previewDialog.add(scroller);
        JPanel controls = new JPanel();
        JButton btPrint = new JButton(new PrintAction());
        controls.add(btPrint);
        previewDialog.add(controls, BorderLayout.NORTH);
        // do the print layout:
        printPanel.addElement(new JLabel("This is my Java Printing!"),
                printPanel.getFont(PrintPanel.FONT0));
        printPanel.addElement(new JLabel(tfBlabla1.getText()),
                printPanel.getFont(PrintPanel.FONT1));
        printPanel.addElement(new JLabel(tfBlabla2.getText()),
                printPanel.getFont(PrintPanel.FONT1));
        previewDialog.add(printPanel, BorderLayout.CENTER);
        //
        previewDialog.setSize(800, 500);
        previewDialog.setLocationRelativeTo(null);
        previewDialog.setVisible(true);
    }

    private class PrintAction extends AbstractAction {

        public PrintAction() {
            putValue(AbstractAction.NAME, "Print...");
        }

        public void actionPerformed(final ActionEvent e) {
            printPanel.print();
        }
    }

    private class PreviewAction extends AbstractAction {

        public PreviewAction() {
            putValue(AbstractAction.NAME, "Preview");
        }

        public void actionPerformed(final ActionEvent e) {
            preview();
        }
    }
}

class PrintPanel extends JPanel {

    public static int FONT0 = 0;
    public static int FONT1 = 1;
    private PrintRequestAttributeSet attr;
    private Font[] fonts = new Font[]{getFont().deriveFont(Font.BOLD, 36f),
        getFont().deriveFont(Font.PLAIN, 18f)};

    public PrintPanel() {
        setLayout(new GridLayout(0, 1));
    }

    public void print() {
        ContainerPrintable.print(getPrintable());
    }

    public Font getFont(final int type) {
        return fonts[type];
    }

    public void addElement(final JComponent comp, final Font font) {
        comp.setFont(font);
        add(comp);
    }

    private Printable getPrintable() {
        Printable printable = new ContainerPrintable(this);
        return printable;
    }
}
```


----------



## jgh (2. Okt 2010)

nett 

gibt es eigentlich eine Klasse, die aus Java herraus eine LaTex-Datei in eine Pdf-Datei "kompiliert"
Also ich würde gerne eine gewisse Struktur -Überschriften, Deckblatt, Formatierungen, Nummerierungen etc- wie in einer Latex-Datei erstellen, gewisse Daten aus der Applikation entnehmen und eine LaTex-Datei erstellen, die dann zu einer PDF-Datei kompiliert wird.


----------



## DerKleineBaer (2. Okt 2010)

Hallo André, 

vielen Dank.
Das werde ich mal ausprobieren. 

Viele Grüße


----------



## DerKleineBaer (3. Okt 2010)

Also das funktioniert super. 
Gibt es jetzt auch noch eine Möglichkeit, den preview als PDF zu speichern?


----------



## André Uhres (4. Okt 2010)

DerKleineBaer hat gesagt.:


> Gibt es jetzt auch noch eine Möglichkeit, den preview als PDF zu speichern?


Man kann z.B. PDFCreator im Druckdialog einfach als Drucker wählen (PDFCreator ist kostenfrei und leicht zu installieren).

Gruß,
Andrè


----------

