# PageFormat - Das Problem mit dem Drucken



## sylo (27. Feb 2011)

Hi zusammen

habe folgendes Problem. Ich versuche ein Graphics-Objekt zu drucken. Dazu habe ich einen Drucken-Button der folgendes macht:


```
bt_print.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				PrinterJob pjob = PrinterJob.getPrinterJob(); 
				
				if ( pjob.printDialog() == false ) 
				  return; 
				
				pjob.setPrintable( new Print()); 
				try {	
					pjob.print();
				} catch (PrinterException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
```

Meine print-Methode der Printable sieht folgendermaßen aus:


```
public int print( Graphics g, PageFormat pageFormat, int pageIndex ) 
  { 
    if ( pageIndex >= 1 ) 
      return Printable.NO_SUCH_PAGE; 

    pageFormat.setOrientation(PageFormat.LANDSCAPE);
    
    g.setFont( font ); 
    g.drawLine(10, 10, 600, 10);
 
    return Printable.PAGE_EXISTS; 
  }
```

Das Einzige was ich will ist, dass die Orientierung des Papiers LANDSCAPE ist. Dies funktioniert aber leider nicht. Muss ich irgendwo anderster ansetzen?

Grüße
sylo


----------



## André Uhres (28. Feb 2011)

Hallo sylo,

versuch's mal mit dieser Methode:


```
static private PrintRequestAttributeSet attr;
...
    print(new Print(), false, new Insets(10, 10, 10, 10));
...
static public void print(final Printable printable, final boolean portrait, final Insets insets) {
    PrinterJob pjob = PrinterJob.getPrinterJob();
    pjob.setPrintable(printable);
    // create an attribute set to store attributes from the print dialog
    if (attr == null) {
        attr = new HashPrintRequestAttributeSet();
        float leftMargin = insets.left;
        float rightMargin = insets.right;
        float topMargin = insets.top;
        float bottomMargin = insets.bottom;
        if (portrait) {
            attr.add(OrientationRequested.PORTRAIT);
        } else {
            attr.add(OrientationRequested.LANDSCAPE);
            leftMargin = insets.top;
            rightMargin = insets.bottom;
            topMargin = insets.right;
            bottomMargin = insets.left;
        }
        attr.add(MediaSizeName.ISO_A4);
        MediaSize mediaSize = MediaSize.ISO.A4;
        float mediaWidth = mediaSize.getX(Size2DSyntax.MM);
        float mediaHeight = mediaSize.getY(Size2DSyntax.MM);
        attr.add(new MediaPrintableArea(
                leftMargin, topMargin,
                (mediaWidth - leftMargin - rightMargin),
                (mediaHeight - topMargin - bottomMargin), Size2DSyntax.MM));
    }
    if (pjob.printDialog(attr)) {
        try {
            pjob.print(attr);
        } catch (PrinterException ex) {
            System.out.println("PrinterException = " + ex.getMessage());
        }
    }
}
```

Gruß,
André


----------



## sylo (28. Feb 2011)

Hallo Andre

Hui. ich hätte jetzt einen Einzeiler erwartet. 

Leider funktioniert das aber noch nicht. Wenn ich die print-Methode benutze öffnet sich ein anderer Drucken-Dialog als der Standard-Dialog.
Unter den Einstellungen ist dann zwar Querformat eingetragen aber gedruckt wird trotzdem im Hochformat. 
Ich muss dazu sagen dass ich als Drucker den PDFCreator verwende.

Grüße
sylo


----------



## André Uhres (28. Feb 2011)

sylo hat gesagt.:


> Unter den Einstellungen ist dann zwar Querformat eingetragen aber gedruckt wird trotzdem im Hochformat.



Irgendwie kann ich das nicht glauben  .

Gruß,
André


----------



## sylo (5. Mrz 2011)

hi zusammen



> Irgendwie kann ich das nicht glauben  .



Du hattest natürlich recht. Das Problem lag daran dass der PDF Creator das Blatt zwar Hochformat angezeigt hat aber das Graphics Objekt Querformat. Also die Koordinate 0/0 ist unten links.

Ich habe aber mittlerweile ein anderes Problem. Wenn ich mit dem PDF Creator drucke, funktioniert alles wunderbar. Wenn ich aber mit meinem normalen Drucker drucke, wird das Graphics Objekt auf ein viertel verkleinert. 
Da ich anderes Seiten schon gedruckt habe, kann ich ausschliessen, dass es am Drucker liegt.
Ich habe bisher folgendes probiert:


```
PrinterJob pjob = PrinterJob.getPrinterJob();
	    PageFormat pageFormat = new PageFormat();
	    Paper paper = new Paper();
		paper.setSize(210.0,297.0);
		pageFormat.setPaper(paper);
	    pjob.setPrintable(printable, pageFormat);
```

Damit wird aber der Druckbereich ziemlich vergrößert. Wenn ich die Größe auf 


```
paper.setSize(21.0,29.7);
```

setze, wird der Druckbereich zu klein. Durch herumprobieren wollte ich einfach die gewünschte Größe einstellen. Dies hat aber nicht funktioniert da, entweder dieser kleine Bereich oder de große angenommen wird. Wirklich einstellen kann man Bereich damit nicht.

Ich will ein ganz normales DIN A4 Blatt. Die Maße müssten stimmen.

Grüße
sylo


----------



## André Uhres (5. Mrz 2011)

Was geschieht, wenn du meine Methode benutzt? Die Insets stellen dort den Rand in mm dar: 
[c]print(new Print(), false, new Insets(10, 10, 10, 10));[/c]
Oder: was geschieht, wenn du die vom PdfCreator erstellte Datei druckst?

Gruß,
André

EDIT: Wenn es dir möglich ist, kannst du auch mal versuchen, den Drucker in der Konfiguration des Betriebssystems zu löschen und neu anzulegen. Das hat bei mir schon einmal bei einem anderen Javaprint Problem geholfen.


----------

