Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  2/2003
suche: 

ORDIX News Archiv

Das IT-Magazin der ORDIX AG mit Fachbeiträgen zu Datenbanken, Unix und Java/XML.

Java 1.4 Neuheiten, Teil II:
Java Print Service API
javax.print+++javax.print.attribute+++javax.print.attribute.standard+++javax.print.event

Java 1.4 bietet mit der neuen Java Print Service API (JPS) erweiterte Druckfunktionalitäten und neue Möglichkeiten für die Integration eines Drucksystems in Java-Anwendungen. Im Gegensatz zu der AWT Java Printing API, die aus vorherigen Java-Versionen bekannt ist, wurde das Druckmodell konzeptionell völlig neu entwickelt. JPS basiert auf Druckdiensten, Druckaufträgen, Druckformaten und Dokumenten sowie Attributen zum Ermitteln der Druckdienste und zur Konfiguration der Druckaufträge.

Basiskomponenten

Das Paket javax.print enthält Klassen und Interfaces, um Druckdienste (PrintService) anhand ihrer Fähigkeiten zu ermitteln, Druckformate (DocFlavor) zu definieren, Druckaufträge (DocPrintJob) zu erzeugen und Text, Bilder oder 2D-Grafiken in Form von Dokumenten (Doc) an den Drucker zu senden.

Ein PrintService repräsentiert praktisch einen Drucker als Ausgabegerät. Die Klasse DocFlavor spezifiziert das Format der zu druckenden Daten, z. B. Postscript, PDF oder reinen ASCII-Text. Mit Hilfe eines DocPrintJob werden die Daten schließlich an den Drucker geschickt.

Druckaufträge können mit Hilfe der Attribute aus den Paketen javax.print.attribute und javax.print.attribute.standard konfiguriert werden. Mit diesen Attributen lassen sich eine Vielzahl von Einstellungen vornehmen, z. B. welcher Papierschacht benutzt werden soll, die Anzahl der Kopien, Farb- oder Monochromdruck, Duplexdruck oder einseitiges Drucken, Druckqualität, etc.

Diese Attribute können auch dazu benutzt werden, einen passenden PrintService zu ermitteln, der die Angaben verarbeiten kann. So können z. B. aus allen verfügbaren Druckern diejenigen herausgesucht werden, die duplex und farbig drucken können.

Die Attribute, die laut API zur Verfügung stehen, entsprechen denen, die im Industriestandard durch das Internet Printing Protocol (IPP) spezifiziert sind.

Vorgehensweise

Die nachfolgenden sechs Arbeitsschritte zeigen, wie typischerweise ein Dokument mit JPS gedruckt wird:

  1. Definieren eines passenden Datenformats, also eine Instanz der Klasse DocFlavor.
  2. Erzeugen eines Dokuments (Doc-Objekt) mit den zu druckenden Daten.
  3. Erzeugen von Attributen (als AttributeSet), die angeben, wie später gedruckt werden soll (Schritt 6).
  4. Suchen eines PrintService, der das DocFlavor und die Attribute verarbeiten kann. Die Klasse PrintServiceLookup enthält entsprechende Methoden dazu.
  5. Erzeugen des Druckauftrags (DocPrintJob-Objekt) mit Hilfe eines ermittelten PrintService.
  6. Aufruf der print()-Methode auf dem DocPrintJob-Objekt mit Übergabe des Doc-Objekts und des AttributeSet.

Kompatibilität zum AWT Java Printing

Während Text- und Bilddokumente generell nur über einen Druckauftrag vom Typ DocPrintJob gedruckt werden können, gibt es für 2D-Grafiken noch eine Alternative: Hier kann auch weiterhin die aus dem AWT Java Printing bekannte Klasse java.awt.PrinterJob genutzt werden. Die Klasse PrinterJob wurde um entsprechende Methoden erweitert, damit die neuen Features des JPS (Ermitteln von Druckdiensten, Verarbeitung von Attributen, etc.) auch in der "alten" Klasse genutzt werden können.

Damit hat SUN die alte und neue Drucktechnologie so miteinander verbunden, dass der Entwickler beim Einsatz von JPS weiterhin auf die bereits bekannten und bewährten Möglichkeiten der AWT Java Printing API zurückgreifen kann.

Streaming

Die JPS API unterstützt auch das Streaming von Dokumenten, d. h. die Daten werden nicht ausgedruckt, sondern über einen Druckdienst vom Typ StreamPrintService in ein bestimmtes Format umgewandelt, z. B. GIF zu Postscript oder Text zu PDF. Das konvertierte Dokument wird dann über einen Output-Stream in eine Datei geschrieben.

Einen StreamPrintService erhält man dabei über eine StreamPrintServiceFactory, die man ebenfalls über einen Lookup-Mechanismus ermitteln kann. Hierbei sind zwei Informationen anzugeben: das zu verarbeitende Datenformat (z. B. DocFlavor.INPUT_STREAM.GIF) und das Zielformat als MIME-Typ, z. B. application/postscript.

//Datei als Datenquelle einlesen.
FileInputStream textStream ;
try  {
	textStream = new FileInputStream("bsp.txt") ;
} catch(FileNotFoundException ex)  {;}

//Datenformat erzeugen.
DocFlavor format = DocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCII ;

//Dokument erzeugen. 
Doc myDoc = new SimpleDoc(textStream, format, null) ;

//Attribute anlegen.
PrintRequestAttributSet aset = new HashPrintRequestAttributeSet() ;
aset.add(new Copies(5)) ;
aset.add(MediaSizeName.ISO_A4) ;
aset.add(Sides.DUPLEX) ;

//Drucker suchen, die das Datenformat und die Attribute
 verarbeiten können.
PrintService[] services =
PrintServiceLookup.lookupPrintServices(format, aset) ;

//Druckauftrag für einen Drucker erzeugen und Dokument drucken.
if(services.length > 0)  {
	DocPrintJob job = services[0].createPrintJob() ;
	try  {
		job.print(myDoc, aset) ;
	} catch(PrintException ex)  {;}
}
Abb. 1: Einfaches Beispiel mit den grundlegenden Schritten, um eine Textdatei mit JPS zu drucken.

Fazit

Die neue Java Print Service API ist eine echte Bereicherung - oder besser Erleichterung - bei der Umsetzung einer Drucklösung in Java.

JPS bietet zwar weiterhin keine Funktionalität, um Reports im eigentlichen Sinne zu erzeugen, aber insbesondere das Ermitteln von Druckern mit bestimmten Eigenschaften, die (erweiterbaren) Attributklassen basierend auf dem IPP-Standard und die Unabhängigkeit von Grafik- bzw. AWT-Objekten verhelfen dem Thema "Drucken in Java" langsam aus den Kinderschuhen.

Ingo Vogt (info@ordix.de).