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