Szukaj…


Wprowadzenie

Interfejs API Java Print Service zapewnia funkcje wykrywania usług drukowania i wysyłania żądań drukowania.

Zawiera rozszerzalne atrybuty wydruku oparte na standardowych atrybutach określonych w Internetowym protokole drukowania (IPP) 1.1 ze specyfikacji IETF, RFC 2911 .

Odkrywanie dostępnych usług drukowania

Aby odkryć wszystkie dostępne usługi drukowania, możemy użyć klasy PrintServiceLookup . Zobaczmy, jak:

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

}

Ten program, po uruchomieniu w środowisku Windows, wydrukuje coś takiego:

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

Odkrywanie domyślnej usługi drukowania

Aby odkryć domyślną usługę drukowania, możemy użyć klasy PrintServiceLookup . Zobaczmy, jak ::

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

}

Tworzenie zadania drukowania z usługi drukowania

Zadanie drukowania to żądanie drukowania czegoś w określonej usłudze drukowania. Składa się zasadniczo z:

Po wybraniu odpowiedniej instancji usługi drukowania możemy poprosić o utworzenie zadania drukowania:

DocPrintJob printJob = printService.createPrintJob();

Interfejs DocPrintJob zapewnia nam metodę print :

printJob.print(doc, pras);

Argument doc to Doc : dane, które zostaną wydrukowane.

A argument pras jest interfejsem PrintRequestAttributeSet : zestaw PrintRequestAttribute . Oto przykłady atrybutów żądania wydruku:

  • ilość kopii (1, 2 itd.),
  • orientacja (pionowa lub pozioma)
  • chromacity (monochromatyczny, kolor)
  • jakość (przeciąg, normalny, wysoki)
  • boki (jednostronne, dwustronne itp.)
  • i tak dalej...

Metoda drukowania może PrintException .

Budowanie dokumentu, który zostanie wydrukowany

Doc to interfejs, a interfejs API Java Print Service zapewnia prostą implementację o nazwie SimpleDoc .

Każda instancja Doc składa się zasadniczo z dwóch aspektów:

  • sama treść danych do drukowania (wiadomość e-mail, obraz, dokument itp.)
  • format danych drukowania, o nazwie DocFlavor (typ MIME + klasa reprezentacji).

Przed utworzeniem obiektu Doc musimy skądś załadować nasz dokument. W tym przykładzie załadujemy określony plik z dysku:

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

Teraz musimy wybrać DocFlavor który pasuje do naszej zawartości. Klasa DocFlavor ma kilka stałych reprezentujących najczęściej używane typy danych. Wybierzmy INPUT_STREAM.PDF :

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

Teraz możemy utworzyć nową instancję SimpleDoc :

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

Obiekt doc można teraz wysłać do żądania zadania drukowania (patrz Tworzenie zadania drukowania z usługi drukowania ).

Definiowanie atrybutów żądania wydruku

Czasami musimy określić niektóre aspekty żądania wydruku. Nazwiemy je atrybutem .

Oto przykłady atrybutów żądania wydruku:

  • ilość kopii (1, 2 itd.),
  • orientacja (pionowa lub pozioma)
  • chromacity (monochromatyczny, kolor)
  • jakość (przeciąg, normalny, wysoki)
  • boki (jednostronne, dwustronne itp.)
  • i tak dalej...

Przed wybraniem jednego z nich i jaką wartością będzie miał każdy, najpierw musimy zbudować zestaw atrybutów:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

Teraz możemy je dodać. Oto niektóre przykłady:

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

Obiekt pras można teraz wysłać do żądania zadania drukowania (patrz Tworzenie zadania drukowania z usługi drukowania ).

Zmiana statusu żądania zadania drukowania

W przypadku większości klientów drukowania niezwykle przydatne jest wiedzieć, czy zadanie drukowania zostało zakończone, czy nie.

Interfejs API Java Print Service zapewnia pewne funkcje umożliwiające uzyskanie informacji o tych scenariuszach. Wszystko, co musimy zrobić, to:

  • zapewnić implementację interfejsu PrintJobListener i
  • zarejestruj tę implementację w zadaniu drukowania.

Gdy stan zadania drukowania ulegnie zmianie, zostaniemy powiadomieni. Możemy zrobić wszystko, co jest potrzebne, na przykład:

  • zaktualizować interfejs użytkownika,
  • rozpocząć kolejny proces biznesowy,
  • zapisać coś w bazie danych,
  • lub po prostu zaloguj się.

W poniższym przykładzie zarejestrujemy każdą zmianę statusu zadania drukowania:

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

Wreszcie możemy dodać naszą implementację nasłuchiwania zadania drukowania do zadania drukowania przed samym żądaniem drukowania, w następujący sposób:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

Argument PrintJobEvent pje

Zauważ, że każda metoda ma argument PrintJobEvent pje . W tym przykładzie nie używamy go w celu uproszczenia, ale można go użyć do zbadania stanu. Na przykład:

pje.getPrintJob().getAttributes();

PrintJobAttributeSet instancję obiektu PrintJobAttributeSet i można je uruchomić dla każdego z nich.


Kolejny sposób na osiągnięcie tego samego celu

Inną opcją osiągnięcia tego samego celu jest rozszerzenie klasy PrintJobAdapter , jak sama nazwa wskazuje, jest adapterem do PrintJobListener . Wdrażając interfejs musimy obowiązkowo wdrożyć je wszystkie. Zaletą tego sposobu jest to, że musimy zastąpić tylko wybrane metody. Zobaczmy, jak to działa:

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

Zauważ, że zastępujemy tylko niektóre określone metody.

Podobnie jak w przykładzie implementującym interfejs PrintJobListener , dodajemy detektor do zadania drukowania przed wysłaniem go do drukowania:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow