Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage
 <<    <     >    >>   API  Kapitel 35 - Drucken

35.3 Drucken mit dem Java Print Service API



35.3.1 Überblick

Im Folgenden geben wir einen kurzen Einblick in das Java Print Service API, so dass wir am Ende dieses Abschnitts eine einfache Textdatei ausdrucken können. Das Java Print Service API basiert auf dem im vorigen Abschnitt vorgestellten Java 2D Printing API und stellt unter anderem High-Level-Schnittstellen zum Drucken von bekannten Formaten wie Text, Postscript und PDF bereit.

Die zugehörigen Klassen und Interfaces befinden sich in den Paketen javax.print, javax.print.attribute, javax.print.attribute.standard und javax.print.event.

Die Klasse DocFlavor

Die Klasse DocFlavor repräsentiert ein Dateiformat, etwa ein GIF-Image oder eine PDF-Datei. Im JDK gibt es bereits eine ganze Reihe vordefinierter DocFlavor-Objekte für die wichtigsten Formate, zum Beispiel:

Falls das Dateiformat nicht bekannt ist, kann seine Bestimmung an das darunter liegende Drucksystem delegiert werden. Zu diesem Zweck werden wir in Listing 35.3 das DocFlavor.INPUT_STREAM.AUTOSENSE einsetzen.

Die Interfaces Attribute und AttributeSet

Die Interfaces Attribute und AttributeSet liegen im Paket javax.print.attribute und beschreiben druckspezifische Eigenschaften. Die implementierende Klasse Copies aus dem Paket javax.print.attribute.standard repräsentiert beispielsweise die Anzahl der anzufertigenden Kopien, die Klasse JobName aus dem gleichen Paket den Namen des Druckjobs.

Weitere wichtige Klassen, die Attribute implementieren, sind:

Wie der Name vermuten lässt, stellt ein AttributeSet eine Menge von Attributen dar. Konkrete Implementierungen sind beispielsweise HashAttributeSet, HashPrintRequestAttributeSet oder HashDocAttributeSet.

Das Interface Doc

Das Interface Doc im Paket javax.print repräsentiert das zu druckende Dokument. Eine Implementierung ist beispielsweise die Klasse SimpleDoc, die für einfache Druckjobs verwendet werden kann und alle oben beschriebenen vordefinierten Dateitypen ausdruckt:

public SimpleDoc(
  Object printData,
  DocFlavor flavor, 
  DocAttributeSet attributes
)
javax.print.Doc

Mit den Parametern Flavor und attributes lässt sich der Ausdruck wie zuvor beschrieben konfigurieren. Mit dem Parameter printData wird der zum DocFlavor passende Datenstrom übergeben. Bei DocFlavor.READER.TEXT_PLAIN wird beispielsweise ein Objekt vom Typ Reader erwartet.

Das Interface PrintService und die Klasse PrintServiceLookup

Objekte vom Typ PrintService stellen die Schnittstelle zum Drucker dar. Die im System verfügbaren PrintService-Objekte erhält man mit Hilfe von Factory-Methoden des PrintServiceLookup-Dienstes. Mit lookupDefaultPrintService bekommt man Zugriff auf den Standarddrucker des Systems; mit lookupPrintServices erhält man eine Liste aller Druckgeräte, die den als Parameter angegebenen Eigenschaften genügen.

public static PrintService lookupDefaultPrintService()

static PrintService[] lookupPrintServices(
  DocFlavor flavor, 
  AttributeSet attributes
)
javax.print.PrintServiceLookup

Das Interface PrintService stellt folgende Methoden zur Verfügung:

public DocPrintJob createPrintJob()

public String getName() 

public boolean isAttributeValueSupported(
  Attribute attrval, 
  DocFlavor flavor, 
  AttributeSet attributes
) 

public boolean isDocFlavorSupported(
  DocFlavor flavor
) 
javax.print.PrintService

Mit createPrintJob erzeugen wir einen Druckauftrag vom Typ DocPrintJob, mit dem wir ein Doc-Objekt an den Drucker senden können:

void print(Doc doc, PrintRequestAttributeSet attributes)
  throws PrintException
javax.print.DocPrintJob

35.3.2 Ausdrucken einer Textdatei

Nach den Ausführungen in den bisherigen Abschnitten wollen wir nun eine Textdatei mit dem Java Print Service API ausdrucken. Im Gegensatz zum Java 2D Printing API haben wir nur wenig Einfluss auf die Gestaltung des Ausdrucks, dafür ist der Programmcode zum Ausdrucken der Textdatei relativ einfach. Wir verzichten in dem folgenden Programm darauf, den Ausdruck von außen zu konfigurieren, den Namen der zu druckenden Datei wollen wir über die Kommandozeile übergeben:

001 /* Listing3503.java */
002 
003 import java.io.*;
004 
005 import javax.print.*;
006 import javax.print.attribute.*;
007 import javax.print.attribute.standard.*;
008 
009 public class Listing3503
010 {
011   final static DocFlavor FLAVOR = DocFlavor.INPUT_STREAM.AUTOSENSE;
012   
013   public static void main(String[] args) throws IOException, PrintException
014   {
015     System.out.println("Gedruckt wird: " + args[0]);
016 
017     File file = new File(args[0]);
018     if (!file.exists()) {
019       throw new IllegalArgumentException(args[0] + " existiert nicht"); 
020     }
021     InputStream stream = new FileInputStream(file);
022     Doc document = new SimpleDoc(stream, FLAVOR, null);
023     
024     PrintService service = PrintServiceLookup.lookupDefaultPrintService();
025     System.out.println("Standarddrucker ist: " + service.getName());
026     
027     if (!service.isDocFlavorSupported(FLAVOR)) {
028       throw new IllegalStateException(
029         service.getName() + 
030         " unterstützt " + FLAVOR + " nicht"
031       );
032     }
033     System.out.println(service.getName() + " unterstützt " + FLAVOR);
034     DocPrintJob job = service.createPrintJob();
035     
036     PrintRequestAttributeSet params = new HashPrintRequestAttributeSet();
037     params.add(new Copies(1)); 
038     
039     job.print(document, params);
040     stream.close();
041   }
042 }
Listing3503.java
Listing 35.3: Drucken einer Textdatei mit dem Java Print Service API

Die Tatsache, dass das obige Programm unter Linux gar nicht funktionierte und unter Windows Vista mehrere Minuten benötigte, um eine einzeilige Textdatei auszudrucken, mag ein Hinweis darauf sein, dass das Drucken unter Java auch im aktuellen JDK noch seine Tücken hat.

 Hinweis 


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de