Java Language
Java-Druckdienst
Suche…
Einführung
Die Java- Druckdienst- API bietet Funktionen zum Erkennen von Druckdiensten und zum Senden von Druckanforderungen für diese Dienste.
Es enthält erweiterbare Druckattribute, die auf den im Internet Printing Protocol (IPP) 1.1 angegebenen Standardattributen der IETF-Spezifikation RFC 2911 basieren.
Entdecken Sie die verfügbaren Druckdienste
Um alle verfügbaren Druckdienste zu ermitteln, können wir die PrintServiceLookup
Klasse verwenden. Mal sehen wie:
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
public class DiscoveringAvailablePrintServices {
public static void main(String[] args) {
discoverPrintServices();
}
public static void discoverPrintServices() {
PrintService[] allPrintServices = PrintServiceLookup.lookupPrintServices(null, null);
for (Printservice printService : allPrintServices) {
System.out.println("Print service name: " + printService.getName());
}
}
}
Wenn dieses Programm in einer Windows-Umgebung ausgeführt wird, wird Folgendes gedruckt:
Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer
Ermitteln des Standarddruckdienstes
Um den Standarddruckdienst zu ermitteln, können wir die PrintServiceLookup
Klasse verwenden. Mal sehen wie:
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
public class DiscoveringDefaultPrintService {
public static void main(String[] args) {
discoverDefaultPrintService();
}
public static void discoverDefaultPrintService() {
PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
System.out.println("Default print service name: " + defaultPrintService.getName());
}
}
Erstellen eines Druckauftrags von einem Druckdienst aus
Ein Druckauftrag ist eine Aufforderung, etwas in einem bestimmten Druckdienst zu drucken. Es besteht im Wesentlichen aus:
- die Daten, die gedruckt werden sollen (siehe Erstellen des Dokuments, das gedruckt werden soll )
- eine Reihe von Attributen
Nach der Abholung der richtigen Druckdienstinstanz können wir die Erstellung eines Druckauftrags anfordern:
DocPrintJob printJob = printService.createPrintJob();
Die DocPrintJob
Schnittstelle uns das bieten print
printJob.print(doc, pras);
Das doc
- Argument ist ein Doc
: die Daten , die gedruckt werden.
Und das Argument pras
ist eine PrintRequestAttributeSet
Schnittstelle: eine Gruppe von PrintRequestAttribute
. Sind Beispiele für Druckanforderungsattribute:
- Anzahl der Exemplare (1, 2 usw.),
- Orientierung (Hochformat oder Landschaft)
- Farbstärke (Monochrom, Farbe)
- Qualität (Entwurf, normal, hoch)
- Seiten (einseitig, zweiseitig usw.)
- und so weiter...
Die PrintException
kann eine PrintException
.
Erstellen des Dokuments, das gedruckt werden soll
Doc
ist eine Schnittstelle und die Java Print Service API bietet eine einfache Implementierung namens SimpleDoc
.
Jede Doc
Instanz besteht im Wesentlichen aus zwei Aspekten:
- den Inhalt der Druckdaten selbst (eine E-Mail, ein Bild, ein Dokument usw.)
- das Druckdatenformat,
DocFlavor
(MIME-Typ + Repräsentationsklasse).
Bevor Sie das Doc
Objekt erstellen, müssen Sie unser Dokument von irgendwoher laden. Im Beispiel laden wir eine bestimmte Datei von der Festplatte:
FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");
Wir müssen also jetzt einen DocFlavor
auswählen, der zu unserem Inhalt passt. Die DocFlavor
Klasse verfügt über eine Reihe von Konstanten, um die häufigsten Datentypen darzustellen. Lass uns die INPUT_STREAM.PDF
:
DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;
Jetzt können wir eine neue Instanz von SimpleDoc
:
Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);
Das doc
kann jetzt an die Druckauftragsanfrage gesendet werden (siehe Erstellen eines Druckauftrags über einen Druckservice ).
Druckauftragsattribute definieren
Manchmal müssen wir einige Aspekte der Druckanforderung ermitteln. Wir nennen sie Attribut .
Sind Beispiele für Druckanforderungsattribute:
- Anzahl der Exemplare (1, 2 usw.),
- Orientierung (Hochformat oder Landschaft)
- Farbstärke (Monochrom, Farbe)
- Qualität (Entwurf, normal, hoch)
- Seiten (einseitig, zweiseitig usw.)
- und so weiter...
Bevor Sie einen von ihnen auswählen und welchen Wert jeder von ihnen haben wird, müssen wir zunächst eine Reihe von Attributen erstellen:
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
Jetzt können wir sie hinzufügen. Einige Beispiele sind:
pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);
Das pras
Objekt kann jetzt an die Druckauftragsanfrage gesendet werden (siehe Erstellen eines Druckauftrags über einen Druckdienst ).
Statusänderung des Druckauftrags abhören
Für die meisten Druck-Clients ist es äußerst nützlich zu wissen, ob ein Druckauftrag abgeschlossen wurde oder fehlgeschlagen ist.
Die Java-Druckdienst-API bietet einige Funktionen, um sich über diese Szenarien zu informieren. Alles was wir tun müssen ist:
- Bereitstellung einer Implementierung für die
PrintJobListener
Schnittstelle und - Registrieren Sie diese Implementierung beim Druckauftrag.
Wenn sich der Status des Druckauftrags ändert, werden wir benachrichtigt. Wir können alles tun, zum Beispiel:
- eine Benutzeroberfläche aktualisieren,
- einen anderen Geschäftsprozess starten,
- etwas in die Datenbank aufnehmen,
- oder einfach protokollieren.
Im folgenden Beispiel protokollieren wir jede Statusänderung des Druckauftrags:
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
public class LoggerPrintJobListener implements PrintJobListener {
// Your favorite Logger class goes here!
private static final Logger LOG = Logger.getLogger(LoggerPrintJobListener.class);
public void printDataTransferCompleted(PrintJobEvent pje) {
LOG.info("Print data transfer completed ;) ");
}
public void printJobCompleted(PrintJobEvent pje) {
LOG.info("Print job completed =) ");
}
public void printJobFailed(PrintJobEvent pje) {
LOG.info("Print job failed =( ");
}
public void printJobCanceled(PrintJobEvent pje) {
LOG.info("Print job canceled :| ");
}
public void printJobNoMoreEvents(PrintJobEvent pje) {
LOG.info("No more events to the job ");
}
public void printJobRequiresAttention(PrintJobEvent pje) {
LOG.info("Print job requires attention :O ");
}
}
Schließlich können wir unsere Druckauftragslistenerimplementierung vor der Druckanforderung selbst in den Druckauftrag einfügen:
DocPrintJob printJob = printService.createPrintJob();
printJob.addPrintJobListener(new LoggerPrintJobListener());
printJob.print(doc, pras);
Das Argument " PrintJobEvent pje"
Beachten Sie, dass jede Methode ein PrintJobEvent pje
Argument PrintJobEvent pje
. Wir verwenden es in diesem Beispiel nicht der Einfachheit halber, aber Sie können es verwenden, um den Status zu untersuchen. Zum Beispiel:
pje.getPrintJob().getAttributes();
PrintJobAttributeSet
eine PrintJobAttributeSet
Objektinstanz zurück, und Sie können sie for-each ausführen.
Ein anderer Weg, um das gleiche Ziel zu erreichen
Eine weitere Option, um dasselbe Ziel zu erreichen, ist die Erweiterung der PrintJobAdapter
Klasse, wie der Name sagt, ein Adapter für PrintJobListener
. Durch die Implementierung der Schnittstelle müssen wir alle zwingend implementieren. Der Vorteil ist, dass wir nur die Methoden überschreiben müssen, die wir wollen. Mal sehen, wie es funktioniert:
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobAdapter;
public class LoggerPrintJobAdapter extends PrintJobAdapter {
// Your favorite Logger class goes here!
private static final Logger LOG = Logger.getLogger(LoggerPrintJobAdapter.class);
public void printJobCompleted(PrintJobEvent pje) {
LOG.info("Print job completed =) ");
}
public void printJobFailed(PrintJobEvent pje) {
LOG.info("Print job failed =( ");
}
}
Beachten Sie, dass wir nur einige bestimmte Methoden überschreiben.
In dem Beispiel, in dem die Schnittstelle PrintJobListener
implementiert ist, fügen Sie dem Druckauftrag den Listener hinzu, bevor Sie ihn zum Drucken senden:
printJob.addPrintJobListener(new LoggerPrintJobAdapter());
printJob.print(doc, pras);