# Drucken



## SilentJ (9. Mai 2006)

Hallo,

ich nutze Java JAI und würde gerne ein Bild ausdrucken. Vorzugsweise mit dem Windows-Druckdialog. Das Problem ist, dass ich das Bild in Abhängigkeit zur gewählten Druckeinstellung skalieren muss. Das Skalieren ist technisch kein Proble, nur habe ich noch nicht mit dem Windows Druckdialog gearbeitet. Hat jemand vielleicht einen guten Tipp oder Codeschnipsel, bevor ich mich selbst an die Arbeit mache?

Michael


----------



## thE_29 (9. Mai 2006)

Wo könnten deiner Meinung nach Codeschnipsel zu finden sein??

Mhm... in den FAQs VIELLEICHT!!! oder unter Codeschnipsel.. Aber nein, bevor man nachsieht geht man lieber fragen...

http://www.java-forum.org/de/viewtopic.php?t=7843 3tes Bsp!


----------



## SilentJ (9. Mai 2006)

Ich weiß nicht, was in deinem Leben falsch gelaufen ist, thE_29, aber deinen Frust auf was auch immer an mir durch GROßBUCHSTABEN und sinnfreie Kommentare abbauen zu wollen, das muss ich nicht haben.

Sicher gibt es Schnipsel, nur leider finde ich kein wirklich konsistentes Beispiel für mein Problem. Gerade beim Java Print API hat sich einiges getan mit den letzten Versionen.


----------



## Dominicana (9. Mai 2006)

2 Klassen : 

*1. PrintGraphics.java*

```
import java.util.Arrays;
import java.awt.Image;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.DocPrintJob;
import javax.print.Doc;
import javax.print.SimpleDoc;
import javax.print.PrintException;

public class PrintGraphics {
    PageFormat pageFormat;
    Paper paper;
    public static void main(String args []) {
//        new PrintGraphics();
    }
    public PrintGraphics(Image image) {
        final String sErrNoPrintService = "Es ist kein passender Print-Service installiert.";
        String s2ndParm = null;
        int idxPrintService = -1;
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(MediaSizeName.ISO_A4);
        aset.add(OrientationRequested.LANDSCAPE);
        aset.add(PrintQuality.HIGH);
        aset.add(new MediaPrintableArea(10, 10, 190, 277, MediaPrintableArea.MM));
        try {
            PrintService prservDflt = PrintServiceLookup.lookupDefaultPrintService();
            PrintService[] prservices = PrintServiceLookup.lookupPrintServices(flavor, aset);
            if (null == prservices || 0 >= prservices.length) {
                if (null != prservDflt) {
                    prservices = new PrintService[] { prservDflt };
                } else {
                    System.err.println(sErrNoPrintService);
                    System.exit(3);
                }
            }
            PrintService prserv = null;
            if (0 <= idxPrintService && idxPrintService < prservices.length) {
                prserv = prservices[idxPrintService];
            } else {
                if (!Arrays.asList(prservices).contains(prservDflt)) {
                    prservDflt = null;
                }
                prserv = ServiceUI.printDialog(null, 50, 50, prservices, prservDflt, null, aset);
            }
            if (null != prserv ) {
                pageFormat = new PageFormat();
                paper = new Paper();
                paper.setSize(594.936, 841.536);
                paper.setImageableArea(100, 100, 594.836, 841.436);
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
                pageFormat.setPaper(paper);
                if (null == s2ndParm || !s2ndParm.equalsIgnoreCase("np")) {
                    DocPrintJob pj = prserv.createPrintJob();
                    Doc doc = new SimpleDoc(new MyPrintableObject(image), flavor, null);
                    pj.print(doc, aset);
                }
            }
        } catch (PrintException pe) {
            System.err.println(pe);
        }
    }
}
```
*2. MyPrintableObject.java*

```
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;

public class MyPrintableObject extends java.applet.Applet implements Printable {
    public int iResMul = 4; // 1 = 72 dpi ; 4 = 288 dpi
    Image image;
    public MyPrintableObject(Image image) {
        this.image = image;
    }
    public int print(Graphics g, PageFormat pf, int iPage) throws PrinterException {
        if (0 != iPage) {
            return NO_SUCH_PAGE;
        }
        try {
            int iPosX = 1;
            int iPosY = 1;
            Graphics2D g2    = (Graphics2D)g;
            g2.translate( pf.getImageableX(), pf.getImageableY() );
            g2.scale( 1.0 / iResMul, 1.0 / iResMul );
            g2.drawImage(image, iPosX, iPosY, 3120, 2080, this);
            g2.setColor(Color.BLACK);
            g2.drawRect(iPosX, iPosY, 3120, 2080);
        } catch( Exception ex ) {
            throw new PrinterException( ex.getMessage() );
    }
    return PAGE_EXISTS;
    }
}
```
Übergabe : 
	
	
	
	





```
new PrintGraphics(Toolkit.getDefaultToolkit().getImage("Bild.jpg"));
```

Alles einbauen , fertisch!


----------



## SilentJ (15. Mai 2006)

Danke,

inzwischen ist mein Problem aber die Größe des Bildes. Ein Ausdruck ist nicht so ohne weiteres möglich...


----------



## thE_29 (15. Mai 2006)

@SilentJ: ich weiß net was in deinem Leben falsch gelaufen ist, aber anscheinend auch viel..

Mind. 2 von der in den FAQ von mir geposteten Bsp rufen den Windows druckdialog auf, aber das passt dir ja auch net (was wolltest du überhaupt?)

Es nervt einfach wenn Leute wie du, die zu faul sind die Boardsuche zu nutzen oder in den FAQs mal reinschaun, um einfach ein Bsp haben zu wollen, was schon zig mal implementiert und gefragt wurde!

Und wir Mods müssen das anscheinend jedem zuerst mal lernen, oder Ihr müsst das alle mal lernen, das man zuerst sucht bevor man fragt!

Und das man vielleicht bei gefunden Seite auch auf Seite 2 wechseln kann und net nur, wenn ich auf Seite 1 nix gscheites gefunden habe, dann geh ich fragen!

Stell dir vor jeder wäre zu faul zum Suchen und würe immer fragen!

Wie drucke ich aus, wie lese ich ein Zeichen, wie stelle ich ein Bild da, wie mache ich JButton 2 zeilig, etc.

Dann wäre zu Semesterzeiten das komplette Forum zugemüllt mit immer wieder den selben Fragen (da die meisten Fragen sowieso von Studenten kommen). 

Und das dann 
1. keiner mehr auf 100 mal beantwortete Fragen antwortet is klar
2. das die Übersicht total verloren geht
3. die Leute eben deswegen weggehen weil niemand antwortet..

Tjo, somit ist das Forum zutode niedergespamt worden!

Applaus für die faulen Leute die net fähig sind zu suchen!! 

Was glaubst du überhaupt warum du hier kaum (1er und mir) antwortet??

Weil deine Frage schon zu oft beantwortet ist.



Desweiteren zum skalieren von Bildern gibts auch schon genug hier!

Such halt danach, von mir brauchste keine Hilfe mehr erwarten!


----------



## SilentJ (15. Mai 2006)

@thE_29:

Man muss nicht auf jedes Posting antworten. Das spart Zeit, nur so als Tipp.  Ich höre jetzt auf in diesem Thread zu posten, sonst müsstest Du weiterhin darauf warten, bis ich mal wieder was schreibe, um daraufhin aktiv zu werden.


----------



## grayson (5. Jun 2006)

ok, das beispiel "PrintGraphics.java " find ich ja recht gut, aber mal verständnistechnisch hab ich da noch nen problemchen....

annahme: ich habe eine liste von Image objekten, die ich drucken will, also einmal BS-abhängigen druckdialog anzeigen und dann je nach dort eingestellter seitenzahl die entsprechenden bildobjekte aus der liste drucken.

so wie ich das beispiel verstanden hab, würde für jede einzelne seite der dialog aufgehen ??


----------



## Dominicana (5. Jun 2006)

In meiner PrintGraphics Klasse : ja. War auch nur für den Druck von einer Seite gedacht. Kann man aber so umbauen, das mehrere Seiten am Stück gedruckt werden . zb.: man übernimmt ein Image-Array , welches in "MyPrintableObject" wieder aufgelöst wird und auf mehreren Seiten ausgedruckt wird.

Dom.


----------



## grayson (5. Jun 2006)

du meinst also sowas wie : erste datei in den stream stecken und wenn datei durch, nächste datei in den stream rein usw?


----------



## grayson (5. Jun 2006)

well ok, ich habs erstmal hin bekommen.  problem nur... beim ausdruck hochformat, passt einfach garnichts das bild ist dann einfach querformat auf die seite grduckt und also in der mitte abgeschnitten .... also das pageformat hat sich geändert, das bild aber nicht....


----------



## grayson (5. Jun 2006)

hmm ok, das rumskalieren im quellcode ist natürlich irgendwie berg.....

und die qualität ist auch sagen wir.... unbefriedigend.....

na gut, wenn man das printableObject als klasse in der selben datei definiert wie die PrintGraphics, kann man zumindest auf die variablen zugreifen, und sicherstellen das die seite richtig skaliert wird für hoch / querformat..... aber desshalb sieht das ergebnis immernoch buckelig aus.... format und ausrichtung stimmen aber die druckqualität ..... wurgs.....

mal im ernst, das kann doch wohl nicht wahr sein, das man so viel sackstand hat, nur weil man ein paar grafiken bzw ein wenig text drucken will, ohne den ganzen schwachsinn jedes mal erst anzuzeigen ...... GRUMMEL!


----------



## Dominicana (6. Jun 2006)

Die Qualität des Ausdruckes hängt vom Drucker , vom Papier und vom Bild ab. Ich nehm Fotopapier , einen Fotodrucker und Fotos von einer 3-MioPix Cam und drucke.


----------



## Guest (7. Jun 2006)

falsch, die qualität hängt davon ab was du womit auf das graphics objekt zeichest.

mit graphics2d und afinetransform, sieht die ganze sache schon ganz anders aus.


----------



## Gast (8. Jun 2006)

ups, der "Gast" war ich


----------



## grayson (8. Jun 2006)

wargh, ich natürlich..... dieses quickreply..... tz tz tz


----------

