[Métodos] Imprimir a través de una impresora en java


El objetivo es sencillo poder imprimir un String a través de una impresora.
Las dificultades que vamos a obviar son:
  • Que haya una impresora configurada para la maquina en curso.
  • Que este encendida.
  • Que tenga papel y tinta.

Suponiendo que lo anterior está resuelto procedemos a...
  • Crear un objeto de la clase java.awt.print.PrinterJob
    1
    PrinterJob job = PrinterJob.getPrinterJob();
    

  • Llamamos a su método setPrintable
    1
    job.setPrintable(new Imprimir());
    
    • public abstract void setPrintable(Printable painter)
      • Llama al impresor que renderiza las páginas. Las páginas en el documento que se imprimirá por este 'PrinterJob' se representan por el objeto de impresión, 'painter'. El 'PageFormat' para cada página es el formato de página predeterminado.
      • Recibe como paramétro un objeto de la interfaz Printable.

  • Nuestra pequña clase va a ser el objeto que le pasaremos por parámetro, por ende vamos a extender de la interfaz.
    1
    public class Imprimir implements Printable {
    

  • Esta interfaz va a necesitar que implementemos el método print
    • int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
      • Imprime la página en el índice especificado en el contexto Graphics especificado en el formato especificado.
      • Parámetros (estos se toman con los valores por defecto)
        • graphics - el contexto en el que se dibuja la página
        • PageFormat - el tamaño y la orientación de la página que se está dibujando
        • PageIndex - el índice basado en cero de la página a dibujar
  • Lo siguiente es llamar al mètodo que muestra el tipico cuadro de pre-impresión del sistema operativo:

    1
    boolean doPrint = job.printDialog();
    

    • Este devuevle un boolean, el cual será de utilidad para determinar si se prosigue con la impresión ya que es el ultimo paso antes de cancelar.
    • Tambíen en este paso se setean el número de páginas a imprimir.

  • Ya sólo nos queda por saber cual ha sido el estado de la impresión, y llamar al método overradeado print
    1
    2
    3
    4
    5
    6
    7
    if (doPrint) {
        try {
            job.print();
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
    

  • Dentro del método que sobreescribimos, devolvemos un int que puede ser 0 o 1 dependiendo de la existencia de la página. Y determinar el area imprimible y pasarle el string junto con la ubicacion cartesiana de donde comenzar:
    • Determinar existencia:
      1
      2
      3
      4
      5
      6
      if (page > 0) {
          return NO_SUCH_PAGE;
      }else{
      ...
          return  PAGE_EXISTS;
      }
      

      Ambas constantes son parte de java.awt.print.Printable, PAGE_EXISTS tiene un valor de '0' mientras que NO_SUCH_PAGE vale '1'

    • Determinar el area imprimible: Le pasamos la referencia del paramétro g casteada a un objeto Graphic2d y será este quien llame a su método translate que toma como parámetros los valores por defecto del eje X y eje Y de PageFormat pf, el otro parámetro de la firma print.
      1
      2
      Graphics2D g2d = (Graphics2D) g;
      g2d.translate(pf.getImageableX(), pf.getImageableY());
      

    • Y por ultimo, llamamos al método de Graphics g:dranstring
      1
      g.drawString("Papi ama a juli!", 100, 100);
      
      • El primer parámetro es el string a imprimir(aquí inclui el sentimiento por mi hija que me esta acompañando en esto)
      • Los siguientes corresponden a la posición (x,y) respectivamente.

El resultado será:

una hoja a4 con el string pasado por parametro, en la posicion (100,100) que imprimi y escanie para ilustrarlo. La clase completa es:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.dar10comyr.printer;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.*;

public class Imprimir implements Printable {

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintable(new Imprimir());
        boolean doPrint = job.printDialog();
        System.out.println(doPrint);
        if (doPrint) {
            try {
                job.print();
            } catch (PrinterException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        if (page > 0) {
             return NO_SUCH_PAGE;
        }

        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        g.drawString("Papi ama a Juli!", 100, 100);

        return PAGE_EXISTS;
    }
}

2 comentarios:

  1. Una pregunta: entiendo bien la estructura del codigo, solamente que el resultado de impresion es una "Cover Page" con las carateristicas de la impresora. He intentado modificar varios parametros pero el resultado siempre es el mismo. Alguien tiene una solucion o conoce el problema?

    ResponderEliminar
  2. Ah! olvidaba. Si imprimo en un archivo que salvo en el escritorio, ahí si veo que es lo que quiero imprimir y como..., con todos los parametros y mofificaciones que indico en el metodo print..

    ResponderEliminar