Java Language
Servizio di stampa Java
Ricerca…
introduzione
L' API del servizio di stampa Java offre funzionalità per scoprire servizi di stampa e inviare richieste di stampa per loro.
Include attributi di stampa estensibili basati sugli attributi standard specificati in Internet Printing Protocol (IPP) 1.1 dalla specifica IETF, RFC 2911 .
Alla scoperta dei servizi di stampa disponibili
Per scoprire tutti i servizi di stampa disponibili, possiamo usare la classe PrintServiceLookup
. Vediamo come:
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());
}
}
}
Questo programma, se eseguito su un ambiente Windows, stamperà qualcosa come questo:
Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer
Scoperta del servizio di stampa predefinito
Per scoprire il servizio di stampa predefinito, possiamo usare la classe PrintServiceLookup
. Vediamo come:
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());
}
}
Creazione di un lavoro di stampa da un servizio di stampa
Un lavoro di stampa è una richiesta di stampa di qualcosa in un servizio di stampa specifico. Consiste fondamentalmente in:
- i dati che verranno stampati (vedi Creazione del documento che verrà stampato )
- un insieme di attributi
Dopo aver raccolto l'istanza di servizio di stampa corretta, possiamo richiedere la creazione di un lavoro di stampa:
DocPrintJob printJob = printService.createPrintJob();
L'interfaccia di DocPrintJob
ci fornisce il metodo di print
:
printJob.print(doc, pras);
L'argomento doc
è un Doc
: i dati che verranno stampati.
E l'argomento pras
è un'interfaccia PrintRequestAttributeSet
: un insieme di PrintRequestAttribute
. Sono esempi di attributi di richiesta di stampa:
- quantità di copie (1, 2 ecc.),
- orientamento (verticale o orizzontale)
- cromaticità (monocromatico, a colori)
- qualità (bozza, normale, alta)
- lati (unilaterali, bilaterali ecc.)
- e così via...
Il metodo di stampa può generare una PrintException
.
Costruire il documento che verrà stampato
Doc
è un'interfaccia e l'API del servizio di stampa Java fornisce un'implementazione semplice denominata SimpleDoc
.
Ogni istanza di Doc
è composta essenzialmente da due aspetti:
- il contenuto dei dati di stampa (una e-mail, un'immagine, un documento, ecc.)
- il formato dei dati di stampa, chiamato
DocFlavor
(tipo MIME + classe di rappresentazione).
Prima di creare l'oggetto Doc
, dobbiamo caricare il nostro documento da qualche parte. Nell'esempio, verrà caricato un file specifico dal disco:
FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");
Quindi ora dobbiamo scegliere un DocFlavor
che corrisponda ai nostri contenuti. La classe DocFlavor
ha una serie di costanti per rappresentare i tipi di dati più comuni. Prendiamo quello di INPUT_STREAM.PDF
:
DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;
Ora possiamo creare una nuova istanza di SimpleDoc
:
Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);
L'oggetto doc
ora può essere inviato alla richiesta del lavoro di stampa (vedere Creazione di un lavoro di stampa da un servizio di stampa ).
Definizione degli attributi della richiesta di stampa
A volte abbiamo bisogno di determinare alcuni aspetti della richiesta di stampa. Li chiameremo attributo .
Sono esempi di attributi di richiesta di stampa:
- quantità di copie (1, 2 ecc.),
- orientamento (verticale o orizzontale)
- cromaticità (monocromatico, a colori)
- qualità (bozza, normale, alta)
- lati (unilaterali, bilaterali ecc.)
- e così via...
Prima di scegliere uno di essi e quale valore ognuno avrà, per prima cosa dobbiamo creare un insieme di attributi:
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
Ora possiamo aggiungerli. Alcuni esempi sono:
pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);
pras
oggetto pras
può essere inviato alla richiesta del lavoro di stampa (vedere Creazione di un lavoro di stampa da un servizio di stampa ).
Modifica dello stato della richiesta di lavoro di stampa in ascolto
Per la maggior parte dei client di stampa, è estremamente utile sapere se un processo di stampa ha avuto esito positivo o negativo.
L'API del servizio di stampa Java fornisce alcune funzionalità per essere informati su questi scenari. Tutto quello che dobbiamo fare è:
- fornire un'implementazione per l'interfaccia
PrintJobListener
e - registrare questa implementazione nel processo di stampa.
Quando lo stato del lavoro di stampa cambia, saremo avvisati. Possiamo fare tutto ciò che è necessario, ad esempio:
- aggiornare un'interfaccia utente,
- avviare un altro processo aziendale,
- registrare qualcosa nel database,
- o semplicemente registrarlo.
Nell'esempio seguente, registreremo ogni modifica dello stato dei lavori di stampa:
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 ");
}
}
Infine, possiamo aggiungere la nostra implementazione del listener del lavoro di stampa sul lavoro di stampa prima della richiesta di stampa stessa, come segue:
DocPrintJob printJob = printService.createPrintJob();
printJob.addPrintJobListener(new LoggerPrintJobListener());
printJob.print(doc, pras);
L'argomento pje PrintJobEvent
Si noti che ogni metodo ha un argomento PrintJobEvent pje
. Non lo usiamo in questo esempio per semplicità, ma puoi usarlo per esplorare lo stato. Per esempio:
pje.getPrintJob().getAttributes();
Restituirà un'istanza dell'oggetto PrintJobAttributeSet
ed è possibile eseguirli in modo for-each.
Un altro modo per raggiungere lo stesso obiettivo
Un'altra opzione per raggiungere lo stesso obiettivo è l'estensione della classe PrintJobAdapter
, come dice il nome, è un adattatore per PrintJobListener
. Implementando l'interfaccia dobbiamo obbligatoriamente implementarli tutti. Il vantaggio di questo modo è che abbiamo bisogno di sovrascrivere solo i metodi che vogliamo. Vediamo come funziona:
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 =( ");
}
}
Si noti che sostituiamo solo alcuni metodi specifici.
Allo stesso modo nell'esempio che implementa l'interfaccia PrintJobListener
, aggiungiamo il listener al lavoro di stampa prima di inviarlo alla stampa:
printJob.addPrintJobListener(new LoggerPrintJobAdapter());
printJob.print(doc, pras);