# Dirktdruck auf bestimmten Schacht



## MScalli (2. Dezember 2009)

Hi leutz.
Ich hab vor langer Zeit hier und in anderen Foren mal die selbe Frage gestellt und habe nicht wirklich eine Lösung bekommen. Habe es damals mehr recht als schlecht gelöst, leider mit vielen einschränkungen.

OK. jetzt zu meinem Problem.
Ich erstelle mittels JasperReports ein Dokument..
Jetzt will ich dieses auf einem bestimmten drucker und auf einem
*bestimmten Schacht* drucken.

Bis jetzt mache ich es so(leider nur feste Schächte möglich.. aber ich will irgendeinen Schacht des Druckers *direkt* ansprechen.


```
...
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
...
printRequestAttributeSet.add((Attribute) getChoosenTray());
...
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
...
```

Hier die Methode getChoosenTray

```
/*
	 * Setzt den Ausgewählten Einzugs-Schacht für den Drucker
	 * @return choosen_tray Object
	 */
	private Object getChoosenTray() {
		MyDebug.printHeadline("ReportPrinter.getChoosenTray()");
		MediaTray choosen_tray = null;
		
		if(tray.toUpperCase().equals("MANUAL"))
			choosen_tray = MediaTray.MANUAL; // Manueller Vorschub(Seite muss per Hand eingelegt werden)
		if(tray.toUpperCase().equals("BOTTOM"))
			choosen_tray = MediaTray.BOTTOM; 
		if(tray.toUpperCase().equals("TOP"))
			choosen_tray = MediaTray.TOP; 
		if(tray.toUpperCase().equals("ENVELOPE"))
			choosen_tray = MediaTray.ENVELOPE; 
		if(tray.toUpperCase().equals("MIDDLE"))
			choosen_tray = MediaTray.MIDDLE;
		if(tray.toUpperCase().equals("MAIN"))
			choosen_tray = MediaTray.MAIN;
		if(tray.toUpperCase().equals("SIDE"))
			choosen_tray = MediaTray.SIDE; 
		if(tray.toUpperCase().equals("LARGE_CAPACITY"))
			choosen_tray = MediaTray.LARGE_CAPACITY; 

		return choosen_tray;	
	}
```

Frage 1.
WIe kann ich alle möglichen Schächte zur auswahl bereit stellen

Frage 2.
WIe kann ich andere Schächte verwenden

Mal ein kleiner Lösungsansatz(ausführbar) bei dem ich denke das es so irgendwie gehen könnte.. aber wie


```
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.Attribute;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.MediaTray;

class MyPrinter
{
	public static void main( String[] args ){
		
	    HashMap<PrintService, ArrayList<MediaTray>> map = new HashMap<PrintService, ArrayList<MediaTray>>();
	    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
	    PrintService service;
	    for (int i=0; i<services.length; i++) {
		      service = services[i];
		      ArrayList<MediaTray> trays = new ArrayList<MediaTray>();
		      map.put(service, trays);
		      Object attributes;
		      attributes = service.getSupportedAttributeValues(Media.class, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);
		      if (attributes != null && attributes.getClass().isArray()) {
		        Media[] media = (Media[]) attributes;
		        for (int iMedia=0; iMedia<media.length; iMedia++)
		          if (media[iMedia] instanceof MediaTray)
		            trays.add((MediaTray) media[iMedia]);
		      }
		      
	    }

      HashPrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

      System.out.println("TEST");
      // so in der Richtung sollte es doch gehen! verwende den 1 Schacht vom Drucker HP LaserJet5
      // attributeSet.add(map.get("HP LaserJet 5").get(0));
      
      System.out.println(map);

      PrinterJob printJob = PrinterJob.getPrinterJob();
      try {
    	  printJob.print(attributeSet);
      } catch (PrinterException e) {
    	  e.printStackTrace();
      }
	    
      System.exit( 0 );

	}
}
```

und hier die ausgabe dieses Programms(da sind eigentlich slle sachen drin die ich brauche.

```
{Win32 Printer : FRITZfax Color Drucker=[Form-Source, top], Win32 Printer : Microsoft Office Live Meeting Document Writer=[top], Win32 Printer : FRITZfax Color Drucker (Kopie 1)=[Form-Source, top], Win32 Printer : HP LaserJet 5=[Form-Source, Automatische Auswahl, top, manual, bottom, envelope, large-capacity], Win32 Printer : SmileTiger WebPresentation Printer=[top], Win32 Printer : HP LaserJet=[Form-Source, Automatische Auswahl, top, manual, bottom, envelope, large-capacity], Win32 Printer : PDFCreator=[], Win32 Printer : FRITZfax Drucker (Kopie 1)=[Form-Source, top], Win32 Printer : FRITZfax Drucker=[Form-Source, top], Win32 Printer : ETISYS EP-726=[Internal Spool], Win32 Printer : Microsoft XPS Document Writer=[Form-Source], Win32 Printer : HP CLJ 3800=[Form-Source,  Drucker autom. Auswahl,  Man. Zufuhr in Fach 1,  Fach 1,  Fach 2, Nicht bestimmt, Normal, Vorgedruckt, Briefkopf, Transparentfolie, Vorgelocht, Etiketten, Briefpapier, Recyclingpapier, Farbpapier, Leicht 60-75 g/m2, Mittelschwer 90-104 g/m, Schwer (105-120 g/m2), Sehr schwer 120-163 g/mgKarton (164-220 g/m2), Karton (164-220 g/m2), Rau, Hochgl. (106-120 g/m2), Hochgl., schwer (120-16, Hochgl., sehr schwer (1, ToughPaper, Briefumschlag]}
```

Bitte helft mir. Ich habe es damals nicht hinbekommen und dann ein bisschen getrickst. Aber diesmal komme ich da nicht vorbei 

gruss
MScalli


Nachtrag: ich kann über die Klasse MediaTray ja einen Schacht auswählen(wie oben beschrieben) und ich denke hier könnte die lösung sein.. nur habe ich ehrlich gesagt keinen blassen Schimmer wie!? Ich müsste hier irgendwie mehr Schächte hinzufügen können.. 

```
printRequestAttributeSet.add((Attribute) MediaTray.BOTTOM);
```


----------

