Java Language
Java Print Service
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:
- dane, które zostaną wydrukowane (patrz Budowanie dokumentu, który zostanie wydrukowany )
- zestaw atrybutów
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);