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:

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);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow