# Drucker Parameter übergeben



## MScalli (3. Dezember 2007)

Hi Leutz.
Ich hab nen Druckauftrag und der soll an nen bestimmten Schacht gehen.
folgendes habe ich schon gefunden


```
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
// Schacht auswählen
printRequestAttributeSet.add(MediaTray.BOTTOM);
```

da gibts jetzt schon noch möglichkeiten.. z.B. TOP, SIDE, MANUAL usw.
nur kann ich so nicht einen bestimmten schacht auswählen.(gibt ja drucker mit ner masse an schächten)
kann man nicht den Drucker fragen.... was für schächte hast du
und dann dort einen auswählen? oder nen bestimmten Schacht mit ner Nummer ansprechen(glaub in VB geht das).

auch finde ich nichts zu dem Thema Deckblatt beim Drucken..
also wenn z.B. die erste Seite sich aus einem Schacht die Blätter holt(evtl. mit nem grossen Firmenlogo oder so) und die zweite ganz normale DINA4 Blätter braucht.

kann mir da wer nen kleinen schubs geben oder nen Link
bisschen quellcode würd mich natürlich auch sehr freuen 

gruss
MScalli


----------



## MeinerEiner_80 (3. Dezember 2007)

Moin!
Schau dir mal das an, vielleicht hilft das weiter:
http://forum.java.sun.com/thread.jspa?forumID=28&threadID=666977 

*grüssle*
MeinerEiner


----------



## MScalli (3. Dezember 2007)

Ich glaube schon das das ist was ich suche.
Ich habs jetzt mal so probiert.. weiss aber nicht ob das auch so gemeint ist.. z.B. mit der Hash map.
auf jeden Fall gehts so nicht.. 
hier mal mein code..


```
import java.awt.*;
import java.awt.print.Pageable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.ColorSupported;
import javax.print.attribute.standard.Media;
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]);
		      }
		      
	    }
	  System.out.println("test 1");

      HashPrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
      System.out.println("test 2");
      attributeSet.add(map.get("\\\\Xpws_mg\\HP LaserJet 5").get(0));
      // (first tray for this printer, for example)

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

	}

}
```


----------



## MScalli (5. Dezember 2007)

weiss den niemand wie das funktioniert
ich bekomme da immer ne NullPointerException.

Schuld ist diese Zeile
attributeSet.add(map.get("\\\\Xpws_mg\\HP LaserJet 5").get(0));

denn wenn ich diese zeile auskommentiere und die map ausgeben lasse stehen da sie ganzen infos zu allen Druckern drin die angeschlossen sind.
sieht dann so  aus

      map.get(""); 
      System.out.println(map);



{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/m, Karton (164-220 g/m2), Rau, Hochgl. (106-120 g/m2), Hochgl., schwer (120-16, Hochgl., sehr schwer (1, ToughPaper, Briefumschlag], Win32 Printer : \\Xpws_mg\HP LaserJet 5=[Form-Source, Automatische Auswahl, top, manual, bottom, envelope, large-capacity], Win32 Printer : PDFCreator=[], Win32 Printer : Canon i6500=[Automatic-Feeder], Win32 Printer : HP LaserJet=[Form-Source, Automatische Auswahl, top, manual, bottom, envelope, large-capacity], Win32 Printer : FRITZfax Drucker=[Form-Source, top], Win32 Printer : FRITZfax Color Drucker=[Form-Source, top], Win32 Printer : Microsoft Office Live Meeting Document Writer=[top], Win32 Printer : \\W2003srv\Oki=[Form-Source, Tractor-Feeder, manual, CSF Schacht 1, CSF Schacht 2]}



Und diese Zeile bringt immer null(auch wenn ich andere Drucker eintrage)   

    System.out.println(map.get("\\\\Xpws_mg\\HP LaserJet 5"));


----------



## MScalli (6. Dezember 2007)

weiss den wirklich keiner ne lösung
kann auch ruhig ein komplett neuer ansatz sein!!


----------



## _jsd_ (6. Dezember 2007)

hi,

ich denke 
	
	
	



```
map.get("\\\\Xpws_mg\\HP LaserJet 5")
```
 wird null zurück liefern, da mal nachgeschaut?

hmf


----------



## MScalli (7. Dezember 2007)

joop.. tut sie auch 
aber weiss auch nicht wie ich das anderst machen soll.. habe jeden drucker ausprobiert.
Mittlerweile habe ich soviele sachen probiert. Aber irgendwie will das nicht.
aber muss doch irgendwie gehen, kann doch net sein das die ganze sache in dem link oben seit jahren falsch drin steht 

Evtl kommt ja noch wer der was genaueres weiss


----------



## _jsd_ (7. Dezember 2007)

Hi,

Ich glaube das liegt daran, dass in der Map das Entry >Win32 Printer : HP LaserJet<   heißt, halt einfach mal mit dem Debugger an und schau dir die Map an...

hmf


----------



## MScalli (7. Dezember 2007)

nicht wirklich.. das hab ich auch rausgefunden..aber auch so wills nicht.
ich hab mal nen ausführbaren quelltext draus gemacht.
so läufts sogar durch.. aber es geht immer noch nicht.


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

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

class MyPrinter
{
	public static void main( String[] args )
	{	
		setTray();
		System.exit( 0 );
	}

	public static void setTray(){
	    HashMap<PrintService, ArrayList<MediaTray>> map = new HashMap<PrintService, ArrayList<MediaTray>>();
	    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
	    PrintService service = null;
	    PrintService[] serv = null;
	    for (int i=0; i<services.length; i++) {
		      service = services[i];
		      System.out.println(i + ". -->" + service);
		      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){
		        		  System.out.println("   " + media[iMedia]);
		        		  trays.add((MediaTray) media[iMedia]);
		        	  }
		      }   
	    }
	    System.out.println("vor dem add");

	    HashPrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
      
	    for(int i = 0; i < services.length; i++){
	    	System.out.println(services[i]);
	    }
	    System.out.println(map.get(services[1]).get(1));
	    attributeSet.add(map.get(services[1]).get(1));
	    // (first tray for this printer, for example)
	    System.out.println("nach dem add");
	    PrinterJob printJob = PrinterJob.getPrinterJob();
	    
	    try {
	    	System.out.println("im try");
	    	printJob.defaultPage();
	    	printJob.print(attributeSet);
	    	printJob.print();
	    } catch (PrinterException e) {
	    	e.printStackTrace();
	    }
	}
}
```

so bekommst so gut wie alles angezeigt, und es läuft durch, aber ich komme immer noch nicht zu dem ergebniss das ich will.
auch wenn ich  nichts zum drucken angebe müsste doch das fenster aufgehen(einstellungen)...
wenn ich mal ehrlich bin weiss ich net mal wie ich da jetztr meinen druckauftrag rein packen sollte wenns läuft ..
egal.. jetzt muss das erst mal irgendwie klappen..

schon mal vielen dank für deine bisherige hilfe _isd_
das ding hier setzt mir ganz schön zu


----------

