## Introducción a la Impresión en Java

El sistema controla totalmente el proceso de impresión, al igual que controla cómo y cuándo pueden dibujar los programas, Nuestras aplicaciones proporcionan información sobre el documento a imprimir, y el sistema de impresión determina cuando necesita renderizar cada página.

Este modelo de impresión permite soportar una amplio rango de impresoras y de sistemas. Incluso permite al usuario imprimir en una impresora de bitmaps desde un ordenador que no tiene suficiente memoria o espacio en disco para contener el mapa de bits de una página completa. En esta situación el sistema de impresión le pedirá a nuesta aplicación que renderize la página de forma repetida para que pueda ser imprimida como una serie de pequeñas imágenes.

Para soportar impresión, una apliación necesita realizar dos tareas:

- Job control--manejar el trabajo de impresión
- Imaging--renderizar las páginas a imprimir

### Job Control

> Aunque el sistema controla todo el proceso de impresión, nuestra aplicación tiene que obtener la oportunidad de configurar un PrinterJob. El PrinterJob , el punto clave del control del proceso de impresión, almacena las propiedades del trabajo de impresión, controla la visión de los diálogos de impresión y se usa para inicializar la impresión.

> Para dirigir el PrinterJob a través del proceso de impresión, nuestra aplicación necesita

> 1. Obtener un PrinterJob llamando a PrinterJob.getPrinterJob
> 2. Decirle al PrinterJob dónde está el código de dibujo llamando a setPrintable o setPageable
> 3. Si se desea, mostrar los diálogos de configuración de página e impresión llamando a pageDialog y printDialog
> 4. Iniciar la impresión llamando a print

> El dibujo de páginas está controlado por el sistema de impresión a través de llamadas al código de imágenes de la aplicación.

### Imaging

> Nuestra aplicación debe poder renderizar cualquier página cuando el sistema de impresión lo pida. Este código de renderizado está contenido en el método print de un page painter--una clase que implementa el interface Printable. Nosotros implementamos print para renderizar el contenido de la página usando un Graphics o un Graphics2D. Podemos usar un único 'page painter' para renderizar todas las páginas de un 'print job' o diferentes 'page painters' para los diferentes tipos de páginas. Cuando el sistema de impresión necesita renderizar una página, llama al método print del 'page painter' apropiado.

> Cuando se usa un único 'page painter', al 'print job' se le llama un printable job. Usar un 'printable job' es la forma más sencilla de soportar impresión. Las operaciones de impresión más complejas que usan múltiples 'page painteres' son conocidas como pageable jobs. En un 'pageable job' se usa un ejemplar de una clase que implemente el interface Pageable para manejar los 'page painters'.

> ### Printable Jobs

> > En un 'printable job' todas las páginas usan el mismo 'page painter' y PageFormat, que define el tamaño y orientación de la página a imprimir. Se le pide al 'page painter' que renderice cada página en orden indexado, empezando en la página con índice 0. Al'page painter' se le podría pedir que renderizará una página varias veces antes de pedir la siguiente página. Por ejemplo, si un usuario imprimir las páginas 2 y 3 de un documento, se le pide al 'page painter' que renderice las páginas con índices 0,1 y 2 incluso auqnue las dos primeras no sean impresas.

> > Si se presenta un diálogo de impresión, no se mostrará elnúmero de páginas, porque esa información no está disponible para el sistema de impresión, El 'page painter' informa al sistema de impresión cuando se alcanza el final del documento.

> ### Pageable Jobs

> > Los 'pageable jobs' són útiles so nuestra aplicación construye una representación explícita de un documento, página por página. En un 'pageable job' diferentes páginas pueden usar diferentes 'page paintes' y PageFormats. El sistema de impresión puede pedir a los 'page painters' que rendericen las páginas en cualquier orden, incluso puede saltarse algunas. Por ejemplo si un usuario imprimri las páginas 2 y 3 de un documento, sólo se le pedirá al 'page painter' que renderice las páginas con los índices 1 y 2.

> > Los distintos 'page painteres' de un 'pageable job' son coordinados por una clase que implementa el interface Pageable, como un Book. Un Book representa una colección de página que pueden usar diferenes 'page painter' y que pueden variar en tamaño y orientación, También podemos usar nuestra propia implementaciuón del interface Pageable si Book no cumple con las necesidades de nuestra aplicación.

Ozito