PIN-Abfrage in PrintJobAttributeSet setzen möglich ?

wimmerflo

Grünschnabel
Hallo community,

ich würde gerne die Möglichkeit des Druckers nutzen, einen Ausdruck so lange zurück zu halten, bis der Benutzer vor Ort eine PIN eingibt. Bei Lexmark heisst dies zB "Drucken und Zurückhalten".
Manuell klappt dies auch hervorragend - nur ist Anforderung dies aus einem JAVA-Tool heraus automatisiert zu bewerkstelligen.

Gibt es eine Möglichkeit herauszufinden welches Attribut ich hier setzen muss ?

Code:
drucker.getSupportedAttributeValues(Media.class, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);

-> bringt alle möglichen Einstellungen nur nicht die gewünschte :rolleyes:

Hat jemand schon Erfahrungen mit sowas gesammelt ?

Vielen Dank !
 
Hallo genodeftest,

das genau ist ja das Problem ;)

Derzeit ist die entsprechende Methode um die verfügbaren Parameter auszulesen - bzw um sie später einmal setzen zu können noch nicht über folgendes Stadium hinaus gewachsen:

Code:
		HashMap<PrintService, ArrayList<MediaTray>> map = new HashMap<PrintService, ArrayList<MediaTray>>();
		
		// Suchen nach den lokal installierten Druckern
		PrintService[] alleDrucker = PrintServiceLookup.lookupPrintServices(null, null);
		
		// Durchlauf aller Drucker
		for (int i = 0; i < alleDrucker.length; i++) {
			// gegenwärtiger Drucker 
			drucker = alleDrucker[i];

			ArrayList<MediaTray> trays = new ArrayList<MediaTray>();
			map.put(drucker, trays);
			
			// Array mit allen möglichen Parametern des Druckers
			Object attributes = drucker.getSupportedAttributeValues(Media.class, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);
					
			// Durchlaufen aller Attribute
			if (attributes != null && attributes.getClass().isArray()) {
				Media[] media = (Media[]) attributes;
				for (int iMedia = 0; iMedia < media.length; iMedia++) {
					System.out.println(media[iMedia]);
				}
			}
		}

Nun gibt es die Möglichkeit per PrintRequestAttributeSet zB die Ausrichtung auf landscape zu setzen:

Code:
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        attributes.add(OrientationRequested.LANDSCAPE);

... nur habe ich bis dato keine Option gefunden, die ja auch nicht zwangsläufig mit einem PrintRequestAttributeSet machbar sein muss (!), einem Drucker mitzuteilen, dass er erst drucken soll nachdem vor Ort eine PIN eingegeben wurde.

Ist mein Anliegen nur klarer ?

Danke
 
Das wird *wenn überhaupt* nur mit sehr großem Aufwand und einigen Work-Arounds funktionieren.
Was du willst ist ein Dierektzugriff auf ein Flag was zwar der Drucker und auch der für diesen Drucker geschriebene Treiber kennt , das bedeutet aber nicht das Java in der Lage ist den Treiber so auszulesen das dieses Flag sichtbar geschweige denn setzbar wird. Da du auch mit JNI nur mäßigen erfolg haben wirst würde ich dir hier JNA empfehlen. Ist zwar aus Sicht von Java noch etwas komplizierter als JNI aber dafür wesentlich dierekter. Frage doch mal beim Hersteller nach in wie weit sich dieses Flag von Dritt-Software aus dem Treiber lesen und steuern lässt. Wenn der Hersteller dann sagt : tut uns leid , aber diese Funktion stellen wir nur über die zum Drucker und Treiber gehörige Software bereit ... tja ... dann wird es ganz finster. Finster bedeutet aber nicht unschaffbar , nur extrem schwer. Hoffe also erstmal das beste das dir der Hersteller *im besten Fall* erklärt wie du da mit Java rankommst. Zur Not würde auch erstmal eine Variante in C reichen , die Leute im C-Forum würden dann den C-Teil übernehemn und hier bauen wir dir eine JNI-Brücke dazu. Beides zusammen ergibt dann das was du willst.
 
Achso, ich habe vorhin ungenau gelesen. Du willst das allgemein für alle Drucker machen, nicht nur für einen speziellen.
Ich bin mir ziemlich sicher, das das nicht funktionieren wird, denn:
• nicht jeder Drucker hat die Möglichkeit, eine PIN einzugeben
• du müsstest einen Weg finden, dem Druckertreiber des jeweiligen Betriebssystems mitzuteilen, dass er einen (wahrscheinlich hersteller- oder gar modellspezifischen) Befehl an den Drucker weiterleitet.
• deine Anwendung wird nicht auf jedem System die nötigen Rechte zu haben, dem Druckertreiber solche Befehle zu übergeben
• manche Drucker (Netzwerkdrucker für Firmeneinsatz) sind so programmiert, dass nicht jeder Nutzer solche Befehle geben kann/darf
• nicht jeder Drucker unterstützt dieses Feature (mein Brother MFC-5840CN z.B. nicht - zumindest nicht laut CUPS)
 
So ...

Ich hab jetzt eine Anfrage bei Lexmark laufen und werde die Resultate hier - sofern die Leute mir helden können - posten.
Falls nicht, müssen wir hier nochmal weiter diskutieren :-)

(ich werde das Thema deswegen vorläufig noch nicht schließen)

@genodeftest
Wir haben hier bei uns in der Firma solche Drucker (Lexmark T652) - wie gesagt es funktioniert über den Treiber ja seit "Jahren" :-) Die Anwendung wird ohnehin nur auf der Umgebung laufen, die es mir ermöglicht das Unterfangen zu realisieren; Linux / Windows / Unix - von mir aus aufm Großrechner
Deswegen sollte die Rechteproblematik eher vernachlässigbar sein.
 
Zuletzt bearbeitet:
Naja ... ohne dich entmutigen zu wollen ... aber hier im Java-Forum können wir dir lediglich bei der Umsetzung von JNI oder allerhöchstens noch JNA helfen. Wenn allerdings eine eigene Lib in C implementiert werden muss solltest du im C-Forum erstmal dort um Hilfe bei dieser implementierung fragen.
 
Würde ich auch sagen. Am einfachsten wäre es wohl noch, dem Windows-Treiber / CUPS über die Einstellungen mitzuteilen, dass er auf die PIN warten soll. Java ist da eigentlich nicht das richtige für (außer Lexmark hat zufällig ne frei verfügbare Bibliothek oder API mit guter Dokumentation – sehr unwahrscheinlich!!)
 
Zurück