Zoeken…


Invoering

De Java Print Service API biedt functionaliteiten om printservices te ontdekken en printaanvragen hiervoor te verzenden.

Het bevat uitbreidbare afdrukkenmerken op basis van de standaardkenmerken die zijn gespecificeerd in het Internet Printing Protocol (IPP) 1.1 van de IETF Specification, RFC 2911 .

De beschikbare afdrukservices ontdekken

Om alle beschikbare afdrukservices te ontdekken, kunnen we de klasse PrintServiceLookup . Laten we eens kijken hoe:

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

}

Dit programma, wanneer uitgevoerd in een Windows-omgeving, zal zoiets als dit afdrukken:

Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer

De standaard afdrukservice ontdekken

Om de standaardafdrukservice te ontdekken, kunnen we de klasse PrintServiceLookup . Laten we eens kijken hoe:

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

}

Een afdruktaak maken van een afdrukservice

Een afdruktaak is een verzoek om iets in een specifieke afdrukservice af te drukken. Het bestaat in principe uit:

Nadat we het juiste exemplaar van de afdrukservice hebben opgehaald, kunnen we de aanmaak van een afdruktaak aanvragen:

DocPrintJob printJob = printService.createPrintJob();

De DocPrintJob interface biedt ons de print :

printJob.print(doc, pras);

Het doc argument is een Doc : de gegevens die worden afgedrukt.

En het argument pras is een PrintRequestAttributeSet interface: een set PrintRequestAttribute . Zijn voorbeelden van kenmerken voor afdrukaanvragen:

  • aantal exemplaren (1, 2 enz.),
  • oriëntatie (portret of landschap)
  • chromacity (monochroom, kleur)
  • kwaliteit (diepgang, normaal, hoog)
  • zijkanten (eenzijdig, tweezijdig enz.)
  • enzovoorts...

De afdrukmethode kan een PrintException .

Het document wordt gemaakt dat wordt afgedrukt

Doc is een interface en de Java Print Service API biedt een eenvoudige implementatie genaamd SimpleDoc .

Elke Doc instantie bestaat in feite uit twee aspecten:

  • de inhoud van de afdrukgegevens zelf (een e-mail, een afbeelding, een document, enz.)
  • het afdrukgegevensformaat, DocFlavor (MIME-type + representatieklasse).

Voordat we het Doc object maken, moeten we ons document ergens laden. In het voorbeeld laden we een specifiek bestand van de schijf:

FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");

Dus nu moeten we een DocFlavor kiezen dat overeenkomt met onze inhoud. De DocFlavor klasse heeft een aantal constanten die de meest gebruikelijke soorten gegevens vertegenwoordigen. Laten we de INPUT_STREAM.PDF kiezen:

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

Nu kunnen we een nieuw exemplaar van SimpleDoc :

Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);

Het doc object kan nu worden verzonden naar het verzoek om de afdruktaak (zie Een afdruktaak maken van een afdrukservice ).

Kenmerken van afdrukaanvragen definiëren

Soms moeten we enkele aspecten van het afdrukverzoek bepalen. We zullen ze attribuut noemen.

Zijn voorbeelden van kenmerken voor afdrukaanvragen:

  • aantal exemplaren (1, 2 enz.),
  • oriëntatie (portret of landschap)
  • chromacity (monochroom, kleur)
  • kwaliteit (diepgang, normaal, hoog)
  • zijkanten (eenzijdig, tweezijdig enz.)
  • enzovoorts...

Voordat we er een kiezen en welke waarde elke heeft, moeten we eerst een set attributen bouwen:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

Nu kunnen we ze toevoegen. Enkele voorbeelden zijn:

pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);

Het pras object kan nu worden verzonden naar het verzoek voor de afdruktaak (zie Een afdruktaak maken van een afdrukservice ).

Luisteren afdruktaak verzoek statusverandering

Voor de meeste afdrukklanten is het uitermate handig om te weten of een afdruktaak is voltooid of mislukt.

De Java Print Service API biedt een aantal functionaliteiten om op de hoogte te blijven van deze scenario's. Het enige wat we moeten doen is:

  • zorgen voor een implementatie voor de PrintJobListener interface en
  • registreer deze implementatie bij de afdruktaak.

Wanneer de status van de afdruktaak verandert, zullen we een melding ontvangen. We kunnen alles doen wat nodig is, bijvoorbeeld:

  • update een gebruikersinterface,
  • start een ander bedrijfsproces,
  • iets opnemen in de database,
  • of log het gewoon in.

In het onderstaande voorbeeld registreren we elke statuswijziging van de afdruktaak:

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

Tot slot kunnen we onze luisteropdrachtimplementatie voor de afdruktaak vóór de afdrukaanvraag zelf als volgt toevoegen:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

Het PrintJobEvent pje- argument

Merk op dat elke methode een PrintJobEvent pje argument heeft. We gebruiken het in dit voorbeeld niet voor eenvoud, maar u kunt het gebruiken om de status te verkennen. Bijvoorbeeld:

pje.getPrintJob().getAttributes();

Retourneert een instantie van het object PrintJobAttributeSet en u kunt ze op elke manier uitvoeren.


Een andere manier om hetzelfde doel te bereiken

Een andere optie om hetzelfde doel te bereiken is het uitbreiden van de klasse PrintJobAdapter , zoals de naam al zegt, is een adapter voor PrintJobListener . Implementatie van de interface moeten we allemaal verplicht implementeren. Het voordeel van deze manier is dat we alleen de methoden moeten overschrijven die we willen. Laten we eens kijken hoe het werkt:

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 =( ");
    }
}

Merk op dat we slechts enkele specifieke methoden overschrijven.

Net als in het voorbeeld dat de interface PrintJobListener implementeert, voegen we de luisteraar toe aan de afdruktaak voordat we deze naar de printer sturen:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow