Sök…


Introduktion

Java Print Service API tillhandahåller funktioner för att upptäcka utskriftstjänster och skicka utskriftsbegäranden för dem.

Det innehåller utdragbara utskriftsattribut baserat på standardattributen som anges i Internet Printing Protocol (IPP) 1.1 från IETF-specifikationen, RFC 2911 .

Upptäck tillgängliga utskriftstjänster

För att upptäcka alla tillgängliga utskriftstjänster kan vi använda klassen PrintServiceLookup . Låt oss se hur:

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

}

Detta program, när det körs i en Windows-miljö, kommer att skriva ut något liknande:

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

Upptäck standardutskriftstjänsten

För att upptäcka standardutskriftstjänsten kan vi använda klassen PrintServiceLookup . Låt oss se hur ::

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

}

Skapa ett utskriftsjobb från en utskriftstjänst

Ett utskriftsjobb är en begäran om att skriva ut något i en specifik utskriftstjänst. Det består i princip av:

Efter att ha hämtat rätt instans för utskriftsservice kan vi begära att ett utskriftsjobb skapas:

DocPrintJob printJob = printService.createPrintJob();

DocPrintJob gränssnittet ger oss print :

printJob.print(doc, pras);

doc är ett Doc : data som kommer att skrivas ut.

Och pras argumentet är ett PrintRequestAttributeSet gränssnitt: en uppsättning PrintRequestAttribute . Är exempel på utskriftsattribut:

  • mängd kopior (1, 2 etc),
  • orientering (stående eller liggande)
  • kromacitet (monokrom, färg)
  • kvalitet (utkast, normal, hög)
  • sidor (ensidig, dubbelsidig osv)
  • och så vidare...

Utskriftsmetoden kan kasta en PrintException .

Bygg dokumentet som kommer att skrivas ut

Doc är ett gränssnitt och Java Print Service API ger en enkel implementering som kallas SimpleDoc .

Varje Doc instans består i princip av två aspekter:

  • själva utskriftsdatainnehållet (ett e-postmeddelande, en bild, ett dokument etc)
  • utskriftsdataformatet, kallat DocFlavor (MIME-typ + representationsklass).

Innan vi skapar Doc objektet måste vi ladda vårt dokument någonstans. I exemplet laddar vi en specifik fil från disken:

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

Så nu måste vi välja en DocFlavor som matchar vårt innehåll. DocFlavor klassen har ett gäng konstanter för att representera de vanligaste datatyperna. Låt oss välja INPUT_STREAM.PDF :

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

Nu kan vi skapa en ny instans av SimpleDoc :

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

doc nu skickas till begäran om utskriftsjobb (se Skapa ett utskriftsjobb från en utskriftstjänst ).

Definiera attribut för utskriftsbegäran

Ibland måste vi bestämma vissa aspekter av utskriftsbegäran. Vi kommer att kalla dem attribut .

Är exempel på utskriftsattribut:

  • mängd kopior (1, 2 etc),
  • orientering (stående eller liggande)
  • kromacitet (monokrom, färg)
  • kvalitet (utkast, normal, hög)
  • sidor (ensidig, dubbelsidig osv)
  • och så vidare...

Innan vi väljer en av dem och vilket värde varje har, måste vi först bygga en uppsättning attribut:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

Nu kan vi lägga till dem. Några exempel är:

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

pras objektet kan nu skickas till utskriften för utskriftsjobb (se Skapa ett utskriftsjobb från en utskriftstjänst ).

Lyssna på status för förändring av utskriftsjobb

För de flesta utskriftskunder är det extremt användbart att veta om ett utskriftsjobb har avslutats eller misslyckats.

Java Print Service API erbjuder vissa funktioner för att få information om dessa scenarier. Allt vi behöver göra är:

  • tillhandahålla en implementering för PrintJobListener gränssnittet och
  • registrera denna implementering vid utskriftsjobbet.

När statusen för utskriftsjobbet ändras kommer vi att meddelas. Vi kan göra allt som behövs, till exempel:

  • uppdatera ett användargränssnitt,
  • starta en annan affärsprocess,
  • spela in något i databasen,
  • eller helt enkelt logga in det.

I exemplet nedan loggar vi varje ändring av utskriftsjobbets status:

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

Slutligen kan vi lägga till vår implementering av utskriftsjobb-lyssnaren på utskriftsjobbet innan själva utskriftsbegäran, enligt följande:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

PrintJobEvent-pje- argumentet

Lägg märke till att varje metod har ett PrintJobEvent pje argument. Vi använder det inte i det här exemplet för enkelhetsskäl, men du kan använda det för att utforska statusen. Till exempel:

pje.getPrintJob().getAttributes();

Kommer att returnera en PrintJobAttributeSet och du kan köra dem på ett för varje sätt.


Ett annat sätt att uppnå samma mål

Ett annat alternativ för att uppnå samma mål är att utöka PrintJobAdapter klassen, som namnet säger, är en adapter för PrintJobListener . Implementera gränssnittet som vi obligatoriskt måste implementera dem alla. Fördelen med detta sätt är att vi bara behöver åsidosätta de metoder vi vill ha. Låt oss se hur det fungerar:

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

Observera att vi endast åsidosätter vissa specifika metoder.

På samma sätt i exemplet som implementerar gränssnittet PrintJobListener lägger vi lyssnaren till utskriftsjobbet innan vi skickar det till utskrift:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow