Encuesta

¿Cuales opinión general acerca de la adquisición de Sun por parte de Oracle?

30-01-2010 - 278 votos

Destacados Agenda

Más eventos |

(1)

Imprimir desde código Java

01/07/2002 00:00 fank

Impresión desde Java mediante ejemplos

Más información en:
PrinterJob (http://www.javacommerce.com/articles/printing.html)
Printing in JDK 1.4 Part 1 (http://www-106.ibm.com/developerworks/library/j-mer0322/)
Printing in JDK 1.4 Part 2 (http://www-106.ibm.com/developerworks/library/j-mer0424.html)
PrintService (http://java.sun.com/j2se/1.4/docs/api/javax/print/PrintService.html)

Objeto PrinterJob

Para usar el objeto PrinterJob deberemos tener un objeto Printable que será el que contendrá lo que queremos imprimir. Este objeto debe contener la función print donde indicaremos la información que nos interesa imprimir. Esta información será dibujada sobre un objeto Graphics (que luego pasaremos a Graphics2D) o Graphics2D (la impresión en Java, al menos versones anteriores es un trabajo gráfico, de ahí su lentitud). Después crearemos el objeto PrinterJob, mediante setPrintable(objeto_a_imprimir) haremos que se dibuje la página a mandar a la impresora. Llamaremos o no, a la ventana de configuración de impresión, y por último imprimiremos.

Impresión mediante un objeto PrinterJob(JDK1.2+) para imprimir gráficos.

//Impresión en Java2 mediante PrinterJob
import java.awt.*;
import java.awt.print.*;
import java.awt.geom.*;

//La clase debe de implementar la impresión implements Printable
class ObjetoAImprimir implements Printable
{
   public int print (Graphics g, PageFormat f, int pageIndex)
   {
      //Creamos un objeto 2D para dibujar en el
      Graphics2D g2 = (Graphics2D) g;
      //Este código imprime 2 páginas una con un cuadrado o marco
      //y una segunda con un circulo en la esquina superior izquierda

      //Creamos el rectángulo
      //getImagebleX() coge la parte de la hoja donde podemos 
      //imprimir quitando los bordes. Si no hiciesemos 
      //esto así y tuviesemos bordes definidos en la impresión 
      //lo que dibujasemos fuera de los bordes no lo 
      //imprimiría aunque cupiese en la hoja físicamente.
      Rectangle2D rect = new Rectangle2D.Double(f.getImageableX(),
                                                f.getImageableY(),
                                                f.getImageableWidth(),
                                                f.getImageableHeight());

      //Creamos la circunferencia
      Ellipse2D circle = new Ellipse2D.Double(100,100,100,100);

      //pageIndex indica el número de la página que se imprime
      //cuando es 0 primera página a imprimir, es un rectángulo
      //cuando es 1 segunda página a imprimir, es una circunferencia
      //En otro caso se devulve que no hay más páginas a imprimir
      switch (pageIndex)
      {
         case 0 : //Página 1: Dibujamos sobre g y luego lo pasamos a g2
                  g.setColor(Color.black);
                  g.fillRect(110,120,30,5);
                  g.setColor(Color.pink);
                  g.drawLine(0,0,200,200);
                  g2 = (Graphics2D) g;
                  return PAGE_EXISTS; //La página 1 existe y se imprimirá
         case 1 : //Página 2: Circunferencia y rectángulo
                  g2.setColor(Color.red);
                  g2.draw(circle);
                  g2.draw(rect);
                  return PAGE_EXISTS;  //La página 2 existe y se imprimirá
         default: return NO_SUCH_PAGE;        //No se imprimirán más páginas
      }
   }
}

//clase pública que se ejecuta donde debe de estar el main que llama a la
//otra clase.
public class Imprime
{
   public static void main (String[] args)
   {
      // Creamos un objeto de impresión.
      PrinterJob job = PrinterJob.getPrinterJob();

      // Hacemos imprimible el objeto ObjetoAImprimir
      job.setPrintable(new ObjetoAImprimir());
      //Pondrá algo tipo Información job: sun.awt.windows.WPrinterJob@4a5ab2
      System.out.println("Información job: " + job.toString());

      //Abre el cuadro de diálogo de la impresora, si queremos que imprima
      //directamente sin cuadro de diálogo quitamos el if...
      if (job.printDialog())
      {
        //Imprime, llama a la función print del objeto a imprimir
        //en nuestro caso el Objeto ObjetoAImprimir
         try { job.print(); }
         catch (PrinterException e) { System.out.println("Error de impresión: " + e); }
      }
   }
}

Objeto FileOutputStream

Este objeto es usado habitualmente para crear ficheros. Como el Stream lo podemos redireccionar, en este caso lo enviamos a la impresora, ya sea indicando la ubicación en red, como el puerto en el que está, y a partir de aquí sólo hay que mandar el fujo de datos para que lo reciba la impresora. Se debe tener en cuenta que en este caso deberemos saber de antemano la ubicación de la impresora y que no será un código portable a otra estación de trabajo ya que puede no tener acceso a la impresora indicada.

Impresión mediante un objeto FileOutputStream para imprimir texto.

//Impresión en Java2 mediante FileOutputStream
import java.awt.print.*;
import java.util.*;
import java.io.*;

//La clase debe de implementar la impresión implements Printable

//clase pública que se ejecuta donde debe de estar el main que 
// llama a laotra clase.
public class ImprimeTexto
{
   public static void main (String[] args)
   {

    try {

      //Esto saldría en la consola de java o en la consola de sistema operatico
      System.out.println("Probando, probando la impresión.");

      //enviar a imprimir en pantalla.
      //FileDescriptor fd = FileDescriptor.out;
      //FileOutputStream os = new FileOutputStream(fd);

      //enviar a imprimir a la impresora en red, debemos conocer el nombre de la
      //impresora.
      //Desde windows se puede poner ...new FileOutputStream("//Au-4022/hp1100");

      //Formato UNIX
      //FileOutputStream os = new FileOutputStream("\\\\Au-4022\\hp1100");

      //Si tuviesemos la impresora en el puerto paralelo
      //FileOutputStream os = new FileOutputStream("LPT1:");
      //Si tuviesemos la impresora en el puerto serie
      //FileOutputStream os = new FileOutputStream("COM1:");

      //Enviar a un archivo de texto.
      FileOutputStream os = new FileOutputStream("nombre_archivo.txt");
      PrintStream ps = new PrintStream(os);
      ps.println("prueba de impresión realizada");
      ps.close();

    }
    catch(Exception e){
      System.out.println("Error: "+e.getMessage());
    }
   }
}

Objeto PrintService.

Es un objeto de la versión 1.4 del JDK. Si se soporta este objeto, es la mejor opción ya que es la más depurada.

Un servicio de impresión puede ser cualquier impresora instalada en la máquina tanto local como en red. Tras crear el objeto de servicio de impresión y asignar una en concreto, crearemos un objeto documento Doc. que contendrá lo que vamos a imprimir. Este documento puede contener texto, gráficos, etc... simplemente mediante el objeto DocFlavor indicaremos al objeto PrintService que tipo de datos contiene el documento. aunque deberemos comprobar que el servicio de impresión accepte ese tipo de datos (el DocFlavor). Una vez creado el documento, definido el tipo de datos y rellenados estos datos, se mandará a imprimir.

Impresión mediante un objeto PrintService(JDK1.4+) para imprimir texto.

//Cogemos el servicio de impresión por defecto (impresora por defecto)
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
//Le decimos el tipo de datos que vamos a enviar a la impresora
//Tipo: bytes Subtipo: autodetectado
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
//Creamos un trabajo de impresión
DocPrintJob pj = service.createPrintJob();
//Nuestro trabajo de impresión envía una cadena de texto
String ss=new String("Aquí lo que vamos a imprimir.");
byte[] bytes;
//Transformamos el texto a bytes que es lo que soporta la impresora
bytes=ss.getBytes();
//Creamos un documento (Como si fuese una hoja de Word para imprimir)
Doc doc=new SimpleDoc(bytes,flavor,null);

//Obligado coger la excepción PrintException
try {
  //Mandamos a impremir el documento
  pj.print(doc, null);
}
catch (PrintException e) {
  System.out.println("Error al imprimir: "+e.getMessage());
}

Impresión mediante un objeto PrintService(JDK1.4+) para imprimir un objeto printable como con PrinterJob.

Usaremos la clase ObjetoAImprimir como en el ejemplo con PrinterObject.
ObjetoAImprimir puede ser cualquier objeto que implemente Printable (Applets, Panels,Objetos propios,?)

PrintService service = PrintServiceLookup.lookupDefaultPrintService();
//Indicamos que lo que vamos a imprimir es un objeto imprimible
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
DocPrintJob pj = service.createPrintJob();
//Creamos el documento a imprimir que contendrá el objeto
Doc doc=new SimpleDoc(new ObjetoAImprimir(),flavor,null);

try {
  pj.print(doc, null);
}
catch (PrintException e) {
  System.out.println("Error al imprimir: "+e.getMessage());
}

Información del objeto PrintService.

//Coger impresora por defecto
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
System.out.println("Nombre impresora por defecto: "+service.getName());

//Coger todas las impresoras instaladas (tanto en local como en red)
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
//Tendremos un array con todas las impresoras instaladas 
//con length podemos saber el nº de impresoras
System.out.println("Número de impresoras configuradas en el sistema: " 
  + services.length);

if (services.length > 0) {
  //Recorre el array de impresoras (o servicios de impresión)
  for(int i=0;i 0) { 
  for(int i=0;i


  
FaNK.

Para cualquier duda o tirón de orejas, e-mail a: barf_ak_ARROBA_yahoo.es


Volver a actualidad

Etiquetas: j2se

Comentarios: 33

  • den_Avila 23/03/2004 00:00

    esta muy bueno, pero me gustaria saber como construir un jtable con los datos emitidos por un query y luego imprimirlos

  • lolis2911 16/04/2007 00:00

    Tengo una duda, necesito imprimir un reporte de una aplicacion que he generado, pero se construye de
    tablas y listas, en este caso como se imprime???

  • CAIFAN95 12/06/2007 00:00

    Esta muy interesante, tengo una duda ojala me puedan ayudar, con estas instrucciones puedo mandar a imprimir un pdf que genero, estoy trabajando con JSP

  • Anónimo 13/09/2007 03:14

    gracias

    pero no me imprime nada uso una impresora hp deserkjet f380

    cualquier ayuda lo agradeceria......

    Soy Marcos cama mi coreo es ivancama2@gmail.com

  • Anónimo 22/10/2007 19:50

    esta pagina es muy interesantate

    pero quiero má tutoriales de impresion en java

    marcial.mce@gmail.com

  • Anónimo 31/10/2007 17:30

    el programa es interesante quisiera saber como se impletaria mediante un boton para ejecusion del codigo de imprimir. atte rocke

  • Anónimo 31/10/2007 17:36

    el programa es interesante quisiera saber como se impletaria mediante un boton para ejecusion del codigo de imprimir. atte rocke

  • Anónimo 08/11/2007 03:29

    NO SON MUY BUENOS MAS QUE DOS..QUIERO UN CODIGO QUE ABRA UN ARCHIVO DE WORD Y LO MANDO A IMPRIMIR DESDE UN PROGRAMA HECHO EN JAVA

     

  • Anónimo 28/11/2007 17:31

    este recontra chevere esper cumple con todas las espectativas

  • Anónimo 14/12/2007 23:48

    Lo que yo desearia es un metodo para imprimir una imagen ya grabada en el computar como las *.jpg

  • Anónimo 01/02/2008 23:38

    -Agustín-

    En general, la información es buena, sirve para salir un poco de la ignorancia, pero tengo un problema cuando hago la impresión por PrintService, pues estoy utilizando una impresora de tickets con corte automatico, pero al terminar NO hace el corte. Si hago la impresión con PrinterJob para gráficos, eso si me hace el corte. ¿Será qué me hace falta finalizar impresión para que la impresora sea notificada que ha terminado la impresión y debe hacer el corte de papel?

  • Anónimo 06/02/2008 18:35

    No me imprime; usando el Printservice le arrojo una cadena de texto. No lanza excepción, mete los archivos en la cola de impresión pero no imprime; debería abrir algún tipo de cuadro de diálogo para elegir la impresora o funciona directamente?

  • Anónimo 06/03/2008 05:58

    la verdad si esta interesante esta pagina ya que se estan utilizando puros metodos y objetos en el programa . pero lo k a mi me interesa es como realizar (dibujar) un logotipo.

  • Anónimo 19/05/2008 21:33

    Probaremos con c/una de las formas aki expuestas y comentamos, a ver qal es la mejor va?.

    Gracias x la informacion, muy buena para salir de dudas e investigar.

    (-.-) 

  • Anónimo 08/08/2008 05:32

    EXCELENTE, EXCELENTE, ME HE GUIADO MUY BIEN CON ESTE ARTICULO.

    Solo tengo un problema....

    no me imprime en linux, cuando abre el cuadro de diálogo me dice que la impresora no está aceptando trabajos, (en un winXp si me funcionó), debo otorgar un permiso especial al programa en java para que acceda al servicio de impresión?????

  • Anónimo 10/09/2008 22:39

    Muy bueno este articulo

    Ya voy varios dias investigando el tema el detalle es que queiro imprimir desde un servidor linux a alguna impresora compartida en una red windows lo he intentado utilizando los diversos metodos que muestras pero no consigo imprimir nada , por ejemplo cuando utilizo el FileOutputStream os = new FileOutputStream("\\\\CAJADEMO\\impresora_roger"); solo me escribe un fichero en el mismo directorio del linux donde se encuentra mi clase, estare comtetiendo algun error en la url si alguien puede ayudare se lo agradecere muchisimo  mi correo es edwinpy@hotmail.com

    saludos. 

     

  • Anónimo 07/10/2008 20:44

    Como puedo capturar los atributos de impresion en java

  • Anónimo 30/10/2008 21:51

    buenas tardes, estoy haciendo una aplicacion en java, es un recibo de cobro de una institucion, mi duda es, que tipo de printServer tengo que utilizar para que mi imprima toda la Jframe, o sea toda mi información..de antemano muchas gracias ...

    att:yadylh_23@hotmail.com

  • Anónimo 04/12/2008 23:32

    Hola como haria para imprimir directo, tal como lo hacen los bancos cuando imprimen tu comprobante

  • Anónimo 09/07/2009 05:14

    Si tienes consultas para imprimir en tablas y todos eso es mejor un reporteador como IREPORT.

    Si tienes ya un pdf generado con data, lo puedes imprimir sin necesidad de usar Java (x que complicarse tanto, es como tener un documento word y querer un codigo para imprimirlo, cuando lo puedes hacer con tu CONTROL+P), bueno al menos que quieras todo codigo usarias librerias como ITEXT.

    Lo interesante de esto de PRINTABLE es que tu puedes imprimir en cualquier  posicion de la hoja. Seria util al querer imprimir facturas, boletas, solo seria cuestion de cuadrarlo ... aun asi, estoy buscando otras soluciones

    Gracias x su tiempo

    Atte. JuserNt

  • Anónimo 30/07/2009 17:23

    Eduardo

    Mi siguiente pregunta es como hago yo para imprimir cheques

    pulsando un boton y que tipo de impresora me recomindan  

  • Anónimo 31/08/2009 05:34

    Victor Vega

    Agradeceria su ayuda si me dijeran como imprimir tikets en un impresora Star Microtronics SP500

    xq he tratado de todo y no logro hacer q se imprima nada ayuda!!

     

  • Anónimo 07/09/2009 15:33

    Grande maestro!!!!!!!!

  • Anónimo 19/09/2009 06:35

    Hola Victor Vega,

    Yo tambien tengo problemas para imprimir en la misma  impresoras de tickets, por favor si ya tienes alguna solucion enviala a ricardo_maring@hotmail.com

  • Anónimo 21/09/2009 22:11

    Hola..!!..he creado una aplicacion java..es simplemente un formulario, para llevar el control de unos empleados, necesito saber como hacer para imprimir ese formulario...se los agradeceria de verdad..!!..ayudenme..!!...DIOS LES BENDIGA..!!!..este es mi correo levia_22@hotmail.com

  • Anónimo 22/09/2009 00:05

    que tal como puedo imprimir el contenido de un jTable y los demas componentes de un jFrame (Label,jTextFields) en una misma hoja. Ya que si lo puedo imprimir pero el contenido del jTable lo imprime en la siguiente hoja. Gracias por su ayuda

  • Anónimo 30/09/2009 19:03

    Excelente!! aporte, funciono con una impresora Oki 320 turbo usb

  • Anónimo 05/10/2009 15:24

    Muy buena ayuda!

    Pero lo que yo necesito es imprimir desde una pagina jsp, en realidad es un sistema de ventas y necesito imprimir facturas desde le servidor al cliente(vendedor) que solicitoo... el cliente(pc) en este caso es el que tiene conectado la impresora (a puntos / a cinta - epson fx890) con 3 papeles autocopiativos.

    Necesito mandar desde el servidor al cliente el texto o datos que quiero imprimir, como lo hago?!

    ¡¡ ayudenme por favor soy novato en impresoras !!

  • Anónimo 11/12/2009 07:41

    Ayuda porfavor necesito imprimir todo el form de forma que parezca un tiket o factura :)

    angelmosa@live.com.mx

  • Anónimo 19/12/2009 03:00

    necesito una solucion con PrinterJob ya que me imprime una sola vez  en segunda vez me muestra error de JOB

  • Anónimo 27/01/2010 08:54

    Necesito imprimir un texto con formato. Gracias

  • Anónimo 02/02/2010 23:46

    muy bueno la info. pero tengo una duda como puedo imprimir un archivo por medio de un puerto serial  ya que sale solo como enviar String . e googleado pero no encuentro nada de info :p  

  • Anónimo 06/02/2010 20:51

    hola quiero saber como podria imprimir un arreglo que ocupa mas de los renglones que estan disponibles en una hoja carta, mando a imprimir con printerjob pero solo me manda a imprimir la primera pagina y el resto del arreglo lo desecha como si no hubiera mas, agradeceria su ayuda, saludos 

    arjosena@hotmail.com

Escribe tu comentario

Sun Microsystem Logo NHT-Norwick Logo

© 2002-2007 Asociación javaHispano