Printer Modell oder Kommentar auslesen

vnc

Grünschnabel
Hallo community,

über eine Website, welche im Intranet läuft, würde ich gerne einen Barcode drucken. Da die Druckernamen an jedem Rechner allerdings anders ist, versuche ich den richtigen Drucker anhand der Kommentarzeile unter Druckereigenschaften oder anhand des Modell-Feldes unter Druckereigenschaften zu ermitteln.

Es ist leider das erste Mal, dass ich etwas in Java programmiere. Ich habe es schon wie folgt versucht:

Code:
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
for (PrintService service : services) {
    System.out.println(service);
    
    for (Attribute a : service.getAttributes().toArray()) {
        System.out.println("* "+a.getName()+": "+a);
    }
}


Als Ausgabe erhalte ich folgendes:

Code:
Win32 Printer : BCTest
* printer-name: BCTest
* queued-job-count: 6
* printer-is-accepting-jobs: accepting-jobs
* color-supported: not-supported

Leider finde ich keine Möglichkeit auf den Modell-Name oder auf die Kommentarzeile zuzugreifen.

Wisst ihr vielleicht, wie das funktioniert?

Hier noch ein Bild, damit ihr wisst, welche Felder ich meine:

w9oiw6mg.png
 

youza

Erfahrenes Mitglied

vnc

Grünschnabel
Hab gestern des mal probiert nachzuvollziehen und bin dabei auf folgendes gestoßen:
http://stackoverflow.com/questions/5567709/extended-printer-information-in-java

Danke für den Link. Der erste Code, der oben auf der Seite steht ist genauso wie meiner aus dem 1. Posting.

Habe aber mal den mittleren Code, der auf der Seite zu finden ist, genommen:
Code:
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null); //get printers

for (PrintService printService : printServices) {
    System.out.println("Found print service: " + printService);

    Set<Attribute> attribSet = new LinkedHashSet<Attribute>();

    Class<? extends Attribute>[] supportedAttributeCategories = (Class<? extends Attribute>[]) printService.getSupportedAttributeCategories();

    for (Class<? extends Attribute> category : supportedAttributeCategories) {
	DocFlavor[] flavors = printService.getSupportedDocFlavors();
	for (DocFlavor flavor : flavors) {
	    Object supportedAttributeValues = printService.getSupportedAttributeValues(category, flavor, printService.getAttributes());
	    if (supportedAttributeValues instanceof Attribute) {
		Attribute attr = (Attribute) supportedAttributeValues;
		attribSet.add(attr);
	    } else if (supportedAttributeValues != null) {
		Attribute[] attrs = (Attribute[]) supportedAttributeValues;
		for (Attribute attr : attrs) {
		    attribSet.add(attr);
		}
	    }
	}
    }

    for (Attribute attr : attribSet) {
	System.out.println(attr.getName());

	System.out.println(printService.getDefaultAttributeValue(attr.getCategory()));
    }
}

Habe den Code erst einmal so ausgeführt. Folgende Meldung erscheint in der Java-Konsole:
Code:
Found print service: Win32 Printer : BCTest
java.lang.NullPointerException
	at sun.print.SunAlternateMedia.hashCode(Unknown Source)
	at java.util.HashMap.hash(Unknown Source)
	at java.util.HashMap.put(Unknown Source)
	at java.util.HashSet.add(Unknown Source)
	at ZebraPrinter.start(ZebraPrinter.java:185)
	at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


Ich habe folgende Imports:
Code:
import java.text.SimpleDateFormat;
import javax.print.*;
import java.util.Date;
import java.applet.Applet;
import java.util.StringTokenizer;
import javax.print.attribute.Attribute;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.*;
import java.*;
import java.util.*;
import java.util.HashMap.*;
import java.util.HashSet.*;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.*;
import sun.print.SunAlternateMedia.*;
import java.lang.Thread.*;

Ich weiß, das sind sehr viele. Für meine etlichen Versuche habe ich verschiedene Imports benötigt und habe sie dann nicht wieder gelöscht. So haben sie sich angesammelt.

Info: in Netbeans wird mit beim obigen Code "LinkedHashSet<Attribute>" (Zeile 4) gelb unterstrichen. Wenn ich den Vorschlag von Netbeans annehme wird daraus "LinkedHashSet<>". Jedoch erhalte dieselbe Fehlermeldung.

Java Version 7 Update 7

Habe auch schon gegooglet, aber bekomme immer wieder dieselbe Fehlermeldung :(
 

vnc

Grünschnabel
So, ich habe nochmal drüber geschaut der Code sieht nun so aus:
Code:
for (PrintService printService : printServices) {
    System.out.println("Found print service: " + printService);
    sPrinterName = printService.getName();
    if (sPrinterName.contains("BCTest")) {
        Set<Attribute> attribSet = new LinkedHashSet<Attribute>();
        Class<? extends Attribute>[] supportedAttributeCategories = (Class<? extends Attribute>[]) printService.getSupportedAttributeCategories();
        for (Class<? extends Attribute> category : supportedAttributeCategories) {
            DocFlavor[] flavors = printService.getSupportedDocFlavors();

            for (DocFlavor flavor : flavors) {
                Object supportedAttributeValues = printService.getSupportedAttributeValues(category, flavor, printService.getAttributes());
                if (supportedAttributeValues instanceof Attribute) {
                    Attribute attr = (Attribute) supportedAttributeValues;
                    System.out.print(attr.getName());
                    System.out.println("-> "+printService.getDefaultAttributeValue(attr.getCategory()));
                } else if (supportedAttributeValues != null) {
                    Attribute[] attrs = (Attribute[]) supportedAttributeValues;
                    for (Attribute attr : attrs) {
                        System.out.print(attr.getName());
                        System.out.println("-> "+printService.getDefaultAttributeValue(attr.getCategory()));
                    }
                }
            }
        }
    }
}

Die Informationen werden jetzt sofort ausgegeben und nicht mehr in einer eigenen Schleife.

Folgende Informationen werden ausgegeben:
Code:
Found print service: Win32 Printer : BCTest
job-name-> Java Printing
requesting-user-name-> 
copies-supported-> null
spool-data-destination-> file:out.prn
orientation-requested-> portrait
page-ranges-> 1-2147483647
media-> null
ipp-attribute-fidelity-> false
sheet-collate-> uncollated
sun-alternate-media-> null
chromaticity-> monochrome
printer-resolution-> 20300x20300 dphi

Leider findet hier auch kein Zugriff auf das Modell oder Kommentarfeld statt :(

Gibt es noch andere Ideen?