miércoles, 29 de diciembre de 2021

Usando el dialogo de configuración de impresión

Tradicionalmente, los usuarios quieren ver la configuración de pagina y otras opciones importantes de impresión. Desde el dialogo de impresión tu puedes seleccionar una impresora, especificar las paginas a imprimir y configurar el número de copias.

Una aplicación muestra un dialogo de impresión cuando el usuario presiona el botón "Imprimir", o elige la opción "Imprimir" desde el menú de la aplicación. Para mostrar el dialogo, llamar al método printDialog de la clase PrinterJob.

Este método retorna true si el usuario presiona Aceptar en el dialogo, y false en caso contrario. Las opciones referentes al formato y numero de paginas están restringidas según lo que se estableció en la clase PrinterJob.

El método printDialog en la porción de código anterior abre un dialogo de impresión nativo.

Tu puedes cambiar la información de configuración de pagina que se encuentra en el objeto PageFormat mediante la configuración de pagina en el dialogo.
Para mostrar el dialogo de configuración de pagina, llamar al metodo pageDialog de la clase PrinterJob.

El dialogo de configuración de pagina es inicializado usando el parámetro que se le pasa al objeto pageDialog. Si el usuario hace click en el botón Aceptar del dialogo un objeto de la clase PageFormat se va a crear de acuerdo con las opciones seleccionadas por el usuario y luego este objeto será devuelto por el método. Si el usuario cancela el dialogo, el método pageDialog devuelve el objeto original PageFormat sin modificar.

Usualmente la API de impresión Java 2D requiere una aplicación para mostrar un dialogo de impresión, pero en ocasiones es posible imprimir sin mostrar ningún dialogo en absoluto. Este tipo de impresión es llamado impresión silenciosa. Esto puede ser practico en casos específicos, tales como cuando tu necesitas imprimir un reporte semanal particular de una base de datos. En otros casos siempre es recomendable informarle al usuario cuando un proceso de impresión está iniciando.

martes, 28 de diciembre de 2021

Un programa básico de impresión en Java

Esta sección explica como crear un programa básico de impresión que muestra un dialogo de impresión e imprime el texto "Hola Mundo" en la impresora seleccionada.

Imprimir un documento consiste en dos partes:

  • La clase Job para controlar la impresión - Crear una petición de impresión, asociar la petición con una impresora, especificar el número de copias, e interacción del usuario con el dialogo de impresión
  • Dibujando la página - Dibujar contenido en una página y administrar contenido que abarca páginas (paginación).

Primero crea una instancia de la clase Job. La clase que representa una petición de impresión y la mayoría de las otras clases relacionadas se encuentran en el paquete java.awt.print

A continuación proporciono el código que imprime en contenido en la pagina, esto se logra implementando la interfaz Printable.

Una aplicación por lo general mostrará un dialogo de impresión para que el usuario pueda ajustar varias opciones como son el numero de copias, la orientación de la pagina o seleccionar la impresora cuando tengo varias.

Este dialogo se muestra visible hasta que el usuario aprueba o cancela la impresión. La variable doPrint será true si el usuario confirmo que quiere continuar con la impresión.

Si la variable doPrint es falso, el usuario ha cancelado la impresión. Dado que mostrar el cuadro de dialogo es opcional, el valor devuelto es puramente informativo.

Si la variable doPrint es verdadero, entonces la aplicación solicitará que la impresión se realice, esto se concreta llamando al metodo print de clase PrinterJob.

La excepción PrinterException se lanzará si ocurre un problema al envíar nuestro trabajo a la impresora. Sin embargo, dado que el metodo PrinterJob.print retorna tan pronto como el trabajo ha sido enviado a la impresora, el usuario de la aplicación no puede identificar si no hay papel o si este se ha atascado. El control que proporciona la clase PrinterJob es suficiente para usos básicos de impresión.

La interfaz Printable tiene un solo metodo:

La clase PageFormat describe la orientación de la pagina (portrait o landscape), el tamaño del papel y el area donde se puede dibujar en unidades de 1/72 de una pulgada.

El área imprimible representa los límites de margen de la mayoría de las impresoras (margen del hardware). El area imprimible es el espacio dentro de estos margenes, y en la práctica, a menudo se limita aún más para dejar espacio para encabezados o pies de página.

El parámetro page en base zero representa el numero de pagina que será impreso.

El siguiente código representa una implementación completa de la clase Printable

Recuerda que la impresora tiene un margen definido y lo debes de considerar, por ello llamamos al método translate de la clase Graphics. Para conocer el tamaño del margen llamamos a los métodos getImageableX y getImageableY 

Enviar una instancia de la clase Graphics a la impresora es esencialmente lo mismo que renderizarla en la pantalla. En ambos casos, debe realizar los siguientes pasos:

  • Dibujar una cadena de texto de prueba es tan fácil como las otras operaciones que se describieron para dibujar usando la clase Graphics2D.
  • Los gráficos de la impresora tienen una resolución más alta, que debería ser transparente para la mayoría de los programas.
  • El método Printable.print() es llamado por el sistema de impresión al igual que se llama al método Component.paint() para pintar un componente en la pantalla. El sistema de impresión llamará al método Printable.print() para la pagina 0, 1, .. etc.
  • Hasta que el método print() devuelva NO_SUCH_PAGE.
  • Se puede llamar al método print() con el mismo índice de pagina varías veces hasta que se complete el documento. Esta función es aplicada cuando el usuario especifica atributos como múltiples copias con la opción collate.
  • El área imprimible de PageFormat determina el área del clip. El área imprimible también es importante para calcular la paginación o cómo distribuir el contenido en las páginas impresas, ya que los saltos de página están determinados por cuánto cabe en cada página.

Nota: Se puede omitir una llamada al método print () para ciertos índices de página si el usuario ha especificado un rango de página diferente que no involucra un índice de página en particular.