Open Source im professionellen Einsatz

Java-Print-API

Sauberer Abdruck

Javas Druckfunktionen änderten sich im Lauf der Jahre mehrfach, nicht immer zum Besten. Der neue Java Print Service ist endlich so ausgereift, dass man ernsthaft mit ihm arbeiten kann. Mit einem Zusatzpaket findet er unter Linux auch Cups-Drucker.

Richtig toll konnte Java bisher nicht drucken. Viele verschiedene, auch plattformabhängige Komponenten mussten zusammenspielen, was nicht immer die besten Ergebnisse brachte. Treue Leser des Coffee-Shops wissen, dass solche Probleme und ihre Lösung schon einmal Thema waren[1], damals mit dem JDK 1.2. Manches ist heute noch aktuell, aber die Druckschnittstelle hat sich wesentlich verändert.

Version 1.3 enthielt neue Klassen, um Job- und Seitenattribute zu steuern, JDK 1.4 ein komplettes API, das weitere Aspekte des Druckens umfasst. Im Folgenden geht es um Details zur Architektur des Java Print Service (JPS).

Die drei Teile des API

Das Java-Print-Service-API besteht aus drei Teilen, verteilt auf vier Packages. Die wichtigsten Klassen und Methoden finden sich im Package »javax.print«. Mit den Klassen und Interfaces dieses Package kann man Drucker (vom JPS Print Service genannt) finden, das Datenformat des Druckinhalts beschreiben, Druckjobs erstellen und an einen verfügbaren Drucker schicken.

Der zweite Teil umfasst die beiden Packages »javax.print.attribute« und »javax.print.attribute.standard«. Die Attribute sind wichtig, weil damit alle Aspekte des Druckens steuerbar sind. Attribute beschreiben statische Eigenschaften der Druckdienste (Unterstützt der Drucker beidseitiges Drucken?) und Dokumente (Welches Format haben die Seiten?) und transiente Eigenschaften, etwa die Anzahl der Kopien oder den aktuellen Status eines Druckauftrags.

Der letzte Teil des API im Package »javax.print.event« kümmert sich zum Beispiel um die Verfügbarkeit von Druckern und den Status von Druckaufträgen. Das Event-Modell folgt dem bekannten AWT-Modell mit Listenern, die für die entsprechenden Events zu registrieren sind. Das ist nichts Neues, weshalb dieser Teil des JPS an dieser Stelle nicht weiter behandelt wird.

Wie so häufig bei Java gibt es noch weitere Packages und Klassen aus früheren Versionen, die sich zwar nicht in das aktuelle API einfügen, aber trotzdem noch nutzbar sind. Beim Drucken sind dies die Klassen im Package »java.awt.print«. Schon der Name des Package zeigt den eingeengten Blick der Schöpfer des alten API, obwohl schon die damalige Version als generelles Printing-API gedacht war. Auch wenn die Klassen dieses Package noch nicht deprecated (missbilligt) sind, sollten sie nicht mehr zum Einsatz kommen - die neuen Klassen sind viel konsistenter und mächtiger.

Vom Dokument zum Druck

Vor dem Druck steht die Druckaufbereitung, doch dieser Teil des Druckvorgangs ist nicht Teil des JPS. Der Printservice geht also davon aus, dass das Dokument schon in einem für den Drucker (genauer: für das ganze Drucksystem) verständlichen Format vorliegt. Unter Linux mit seinem leistungsfähigen Cups ist diese Annahme für viele Standardformate erfüllt.

Dann läuft das Drucken mit Java nach einem einfachen Schema ab. Zuerst ist ein Objekt der Klasse »DocFlavor« beziehungsweise einer Unterklasse, etwa »DocFlavor.READER« oder »DocFlavor .URL« zu erzeugen. Diese inneren Klassen von »DocFlavor« besitzen eine Reihe von Konstanten, die den Dokumenttyp angeben, zum Beispiel »DocFlavor. READER.TEXT_HTML«. Ein besonders nützliches »DocFlavor« ist »DocFlavor .INPUT_STREAM.AUTOSENSE«, denn es versucht, das Format selbstständig zu erkennen.

Im zweiten Schritt entsteht ein »AttributeSet«, das den Druckauftrag beschreibt. Mit diesen Informationen - »DocFlavor« und »AttributeSet« - beginnt die Suche nach einem passenden Print Service, also einem Drucker. Zuletzt erzeugt man einen Druckauftrag und ruft dessen »print«-Methode auf.

Aus API-Sicht ist »PrintService« ein Interface. Die Klasse »PrintServiceLookup« ist eine Factory für konkrete Implementationen von Print Services. »PrintService« wiederum ist eine Factory für Klassen, die das Interface »DocPrintJob« implementieren.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook