# HTML aus JEditorPane drucken



## GRudiD (19. Mrz 2006)

Hallo,

ich möchte einen automatisch generierten HTML-Quellcode als Seite (mit Tabellen, Listen etc.), wie er z.B. im IE angezeigt wird, ausdrucken lassen. Anzeigen lassen könnte ich mir das ja mit einer JEditorPane o.ä. Nur mit dem Ausdrucken des Inhalts habe ich meine Probleme. Im FAQ habe ich bereits nachgesehen, jedoch komme ich ich irgendwie mit dem dort angegebenen Quelltext nicht klar. 

Mein bisheriger Stand:

```
DocFlavor docFlavor = DocFlavor.STRING.TEXT_HTML;
Doc doc = new SimpleDoc("<html>ajdh</html>", docFlavor, null);
// alternativ dazu:
// Doc doc = new SimpleDoc(textPane.getText(), docFlavor, null);

PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
DocPrintJob docPrintJob = PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
try {
	docPrintJob.print(doc, printRequestAttributeSet);
} catch (PrintException exception) {
	exception.printStackTrace();
}
```

Wenn ich den docFlavor auf STRING.TEXT_HTML bzw. STRING.TEXT_PLAIN setze, erhalte ich die Exception

```
sun.print.PrintJobFlavorException: invalid flavor
```

Bei jeglichen anderen Konfigurationen

```
java.lang.IllegalArgumentException: data is not of declared type
```

Was mache ich dabei falsch bzw. wie kann ich das Problem lösen?


----------



## André Uhres (19. Mrz 2006)

```
PrintUtilities.printComponent((Component)jEditorPane, false);
```


```
import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

/** A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  PrintUtilities.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 *  


 *  If you are going to be printing many times, it is marginally more
 *  efficient to first do the following:
 *  <PRE>
 *    PrintUtilities printHelper = new PrintUtilities(theComponent);
 *  </PRE>
 *  then later do printHelper.print(). But this is a very tiny
 *  difference, so in most cases just do the simpler
 *  PrintUtilities.printComponent(componentToBePrinted).
 *
 *  7/99 Marty Hall, [url]http://www.apl.jhu.edu/~hall/java/[/url]
 *  May be freely used or adapted.
 */

public class PrintUtilities implements Printable {
    private Component componentToBePrinted;
    
    public static void printComponent(Component c, boolean landscape) {
        new PrintUtilities(c, landscape).print();
    }
    boolean landscape=false;
    public PrintUtilities(Component componentToBePrinted, boolean landscape) {
        this.componentToBePrinted = componentToBePrinted;
        this.landscape=landscape;
        pageFormat2 = new PageFormat();
        pageFormat2.setOrientation(PageFormat.PORTRAIT);
        if(landscape) pageFormat2.setOrientation(PageFormat.LANDSCAPE);
        paper = new Paper();
        // Set to A4 size.
        paper.setSize(594.936, 841.536);
        // Set the margins.
        paper.setImageableArea(50, 50, 494.936, 741.536);
        pageFormat2.setPaper(paper);
    }
    
    public void print() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable(this, pageFormat2);
        if (printJob.printDialog())
            try {
                printJob.print();
            } catch(PrinterException pe) {
                System.out.println("Error printing: " + pe);
            }
    }
    
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
        if (pageIndex > 0) {
            return(NO_SUCH_PAGE);
        } else {
            Graphics2D g2d = (Graphics2D)g;
            g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

            disableDoubleBuffering(componentToBePrinted);
            System.out.println("Print Utility is now  painting...");
            componentToBePrinted.paint(g2d);
            enableDoubleBuffering(componentToBePrinted);
            return(PAGE_EXISTS);
        }
    }
    
    /** The speed and quality of printing suffers dramatically if
     *  any of the containers have double buffering turned on.
     *  So this turns if off globally.
     *  @see enableDoubleBuffering
     */
    public static void disableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(false);
    }
    
    /** Re-enables double buffering globally. */
    
    public static void enableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(true);
    }

    PageFormat pageFormat2=null;
    Paper paper=null;
    
}
```


----------



## GRudiD (20. Mrz 2006)

Erst einmal danke für die schnelle Antwort. Die Methode funktioniert soweit ganz gut. 

Trotzdem habe ich dabei ein paar Probleme:
- leider kann ein mehrseitiger Text nicht gedruckt werden
- die Breite der Komponente muss vorher irgendwie an die Breite des Papiers angepasst werden


----------

