Java Language
Servicio de impresión de Java
Buscar..
Introducción
La API de Java Print Service proporciona funcionalidades para descubrir servicios de impresión y enviar solicitudes de impresión para ellos.
Incluye atributos de impresión extensibles basados en los atributos estándar especificados en el Protocolo de Impresión de Internet (IPP) 1.1 de la Especificación IETF, RFC 2911 .
Descubriendo los servicios de impresión disponibles.
Para descubrir todos los servicios de impresión disponibles, podemos usar la clase PrintServiceLookup
. Veamos cómo:
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());
}
}
}
Este programa, cuando se ejecuta en un entorno Windows, imprimirá algo como esto:
Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer
Descubriendo el servicio de impresión predeterminado
Para descubrir el servicio de impresión predeterminado, podemos usar la clase PrintServiceLookup
. Veamos cómo ::
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());
}
}
Creación de un trabajo de impresión desde un servicio de impresión
Un trabajo de impresión es una solicitud de imprimir algo en un servicio de impresión específico. Consiste, básicamente, en:
- los datos que se imprimirán (consulte Creación del documento que se imprimirá )
- un conjunto de atributos
Después de seleccionar la instancia de servicio de impresión correcta, podemos solicitar la creación de un trabajo de impresión:
DocPrintJob printJob = printService.createPrintJob();
La interfaz DocPrintJob
nos proporciona el método de print
:
printJob.print(doc, pras);
El argumento doc
es un Doc
: los datos que se imprimirán.
Y el argumento pras
es una interfaz PrintRequestAttributeSet
: un conjunto de PrintRequestAttribute
. Son ejemplos de atributos de solicitud de impresión:
- cantidad de copias (1, 2 etc),
- orientación (vertical u horizontal)
- cromacia (monocromo, color)
- Calidad (calado, normal, alta)
- lados (de una cara, de dos caras, etc.)
- y así...
El método de impresión puede lanzar una PrintException
.
Construyendo el Doc que será impreso.
Doc
es una interfaz y la API del servicio de impresión Java proporciona una implementación simple llamada SimpleDoc
.
Cada instancia de Doc
se compone básicamente de dos aspectos:
- el propio contenido de datos de impresión (un correo electrónico, una imagen, un documento, etc.)
- el formato de datos de impresión, denominado
DocFlavor
(tipo MIME + clase de representación).
Antes de crear el objeto Doc
, debemos cargar nuestro documento desde algún lugar. En el ejemplo, cargaremos un archivo específico del disco:
FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");
Entonces, ahora tenemos que elegir un DocFlavor
que coincida con nuestro contenido. La clase DocFlavor
tiene un montón de constantes para representar los tipos de datos más habituales. Vamos a elegir el INPUT_STREAM.PDF
uno:
DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;
Ahora, podemos crear una nueva instancia de SimpleDoc
:
Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);
El objeto doc
ahora se puede enviar a la solicitud de trabajo de impresión (consulte Creación de un trabajo de impresión desde un servicio de impresión ).
Definiendo atributos de solicitud de impresión
A veces necesitamos determinar algunos aspectos de la solicitud de impresión. Los llamaremos atributo .
Son ejemplos de atributos de solicitud de impresión:
- cantidad de copias (1, 2 etc),
- orientación (vertical u horizontal)
- cromacia (monocromo, color)
- Calidad (calado, normal, alta)
- lados (de una cara, de dos caras, etc.)
- y así...
Antes de elegir uno de ellos y qué valor tendrá cada uno, primero debemos crear un conjunto de atributos:
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
Ahora podemos añadirlos. Algunos ejemplos son:
pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);
El objeto pras
ahora se puede enviar a la solicitud de trabajo de impresión (consulte Creación de un trabajo de impresión desde un servicio de impresión ).
Escuchar cambio de estado de solicitud de trabajo de impresión
Para la mayoría de los clientes de impresión, es extremadamente útil saber si un trabajo de impresión ha finalizado o ha fallado.
La API del servicio de impresión de Java proporciona algunas funcionalidades para informarse sobre estos escenarios. Todo lo que tenemos que hacer es:
- proporcionar una implementación para la interfaz
PrintJobListener
y - Registre esta implementación en el trabajo de impresión.
Cuando cambie el estado del trabajo de impresión, se nos notificará. Podemos hacer lo que sea necesario, por ejemplo:
- actualizar una interfaz de usuario,
- iniciar otro proceso de negocio,
- grabar algo en la base de datos,
- o simplemente inicie sesión.
En el siguiente ejemplo, registraremos cada cambio de estado del trabajo de impresión:
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 ");
}
}
Finalmente, podemos agregar nuestra implementación de escucha de trabajo de impresión en el trabajo de impresión antes de la solicitud de impresión, de la siguiente manera:
DocPrintJob printJob = printService.createPrintJob();
printJob.addPrintJobListener(new LoggerPrintJobListener());
printJob.print(doc, pras);
El argumento PrintJobEvent pje
Observe que cada método tiene un argumento PrintJobEvent pje
. No lo usamos en este ejemplo por razones de simplicidad, pero puede usarlo para explorar el estado. Por ejemplo:
pje.getPrintJob().getAttributes();
PrintJobAttributeSet
una instancia de objeto PrintJobAttributeSet
y puede ejecutarlos de una manera para cada uno.
Otra forma de lograr el mismo objetivo.
Otra opción para lograr el mismo objetivo es extender la clase PrintJobAdapter
, como su nombre lo indica, es un adaptador para PrintJobListener
. Implementando la interfaz obligatoriamente tenemos que implementar todos ellos. La ventaja de esta manera es que debemos anular solo los métodos que queremos. Vamos a ver cómo funciona:
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 =( ");
}
}
Tenga en cuenta que solo anulamos algunos métodos específicos.
De la misma manera en el ejemplo que implementa la interfaz PrintJobListener
, agregamos el oyente al trabajo de impresión antes de enviarlo a imprimir:
printJob.addPrintJobListener(new LoggerPrintJobAdapter());
printJob.print(doc, pras);