Buscar en el Blog

martes, 12 de junio de 2012

Código Java para imprimir en la impresora predeterminada

En la siguiente publicación comparto el código Java para envíar a imprimir un archivo PDF a la impresora por defecto, éste código puede servir para programar la funcionalidad de impresión silenciosa.

Recomiendo además instalar Bullzip PDF Printer qué es una impresora PDF muy útil para realizar pruebas de impresión sin necesidad de gastar hojas de papel.

A continuación el código fuente:


 import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class PrintTest {

    public static void main(String args[]) throws IOException {

        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream("c:/archivo.pdf");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (inputStream == null) {
            return;
        }

        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc document = new SimpleDoc(inputStream, docFormat, null);

        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

        PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();


        if (defaultPrintService != null) {
            DocPrintJob printJob = defaultPrintService.createPrintJob();
            try {
                printJob.print(document, attributeSet);

            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.err.println("No existen impresoras instaladas");
        }

        inputStream.close();
    }
}

39 comentarios:

  1. Muy buen aporte, disculpa aprovechando de tu confianza como le puedo hacer que desde el código seleccionar la impresora?

    ResponderEliminar
  2. Buen aporte, disculpa aprovechando de tu confianza desde ahi en el codigo como le puede hacer para que seleccione la impresora, que no tome la que esta por defecto.

    ResponderEliminar
  3. buenos dias disculpe las molestias pero si fuera tan amable de poder brinder un ejemplo de este codigo o otro ejemplo para jcreator que eso es lo que estoy buscando.

    salu2

    ResponderEliminar
  4. Este código es genérico e independiente de cualquier IDE, sí estás haciendo una aplicación Swing en el IDE que estés trabajando la sección de código que está dentro del main deberías llevarla a una clase y un método, manejar el evento e invocarla desde ahi.

    ResponderEliminar
  5. Gracias!!! es una ayuda que perdurara en el tiempo.

    ResponderEliminar
  6. Muy Buenas,

    He comprendido bien este código para ver las impresoras.

    Lo que no entiendo es como podría hacer yo ahora para enviar un String a la impresora que yo seleccione.

    A ver si quitas esa duda!

    ResponderEliminar
  7. Muy buenas,

    ¿Cómo haríamos para mandar un string a una de las impresoras instaladas?

    Un saludo

    ResponderEliminar
  8. hola mauricio mi problema es que estoy creando mi propio punto de venta para una tienda pero solo me falta printiar recivos.

    mi printer es un epson tm-t88v
    pero nose como implentarlo a recivir los parametros ayudeme por favor estoy que se me pierden las esperanzas de tanto buscar como hacerlo

    ResponderEliminar
  9. Gracias por sus comentarios, en vista de las múltiples solicitudes, comparto el código Java para imprimir en una impresora nombrada y no en la que es por defecto.

    Ir al siguiente post para ver el código: http://ingmmurillo.blogspot.com/2013/03/codigo-java-para-imprimir-en-una.html

    ResponderEliminar
  10. Hola, buen aporte. Intente copiar tu ejemplo pero cuando mando a imprimir me salen caracteres raros... de que puede ser?

    ResponderEliminar
  11. Hola, buen aporte. Intente copiar tu ejemplo pero cuando mando a imprimir me salen caracteres raros... de que puede ser?

    ResponderEliminar
  12. hola exelente tu aporte a mi tambien me sale los caracteres raros y lo que me di cuenta esta que en las impresoras con resolucion 600 ppp me sale asi con las 1200 ppp imprime sin problema, lo que me interesaria saber es si hay alguna solucion para eso

    ResponderEliminar
  13. con las impresoras de 600 ppp no funcionan salen unos caracteres raros

    ResponderEliminar
  14. Gracias Angel por tus observaciones, espero revisar para encontrar una solución al tema

    ResponderEliminar
  15. Mauricio, llegue a estos posts y están buenos, como puede desde mi programa en al web, imprimir un voucher, pero que cuando el cliente, haga clic en el botón, salga de una por la impresora, sin que el usuario deba manipular la interfaz PDF, indican "Print" y luego cerrar esta ventana?, gracias, Juan

    ResponderEliminar
  16. Muy buen codigo solo que no logro aplicarlo a un applet ¿me podrias ayudar porfavor?. Gracias.

    ResponderEliminar
  17. Muy buen codigo pero no logro aplicarlo a un applet ¿me podrias ayudar?. Gracias.

    ResponderEliminar
  18. Para imprimir desde un Applet necesitarás que el Applet esté firmado y solicitará al usuario que autorice la impresión. Recuerda que un applet tiene el acceso limitado a los recursos del sistema. Revisa este link con un código de referencia: http://stackoverflow.com/questions/438397/can-a-java-applet-use-the-printer

    ResponderEliminar
    Respuestas
    1. Buenos días, yo quiero imprimir un JFrame pero todo el recuadro, por ejemplo hice una factura y quiero poder imprimirla entera, pero no logro hacerlo. Ahora me imprime en blanco, antes me imprimía solo el JTextField. Yo ya tengo el JFrame armado, solo quiero agregar un JButton que lo que haga sea imprimir el recuadro, el JFrame. He encontrado códigos que lo deberían hacer, pero cuando pego el código en el JFrame no obtengo resultados.

      Lo que me gustaría saber es que código tengo que poner en una nueva clase que sea el código fuente para poder imprimir y el código que tengo que poner en el boton del JFrame para que llame al código de la otra clase así imprime.

      Saludos.
      mi correo es nicolaskaco [at] gmail . com

      Eliminar
  19. Hola, realizo un control de impresión de tickets utilizando Java, el ticket se toma en formato HTML. Tickets promedio (menos de un metro de longitud) se imprimen correctamente, el problema es cuando la longitud del ticket es mayor a 2 metros, el ticket se corta, no imprime completo. Se realizaron cambios en en tamaño del Page y en el PageFormat pero nada. Lo curioso es que siempre se corta en el mismo punto cuando se corta. El mismo ticket se envía con un control VisualBasic y se imprime de forma correcta, esto elimina la posibilidad de una configuración de la impresora. ¿Alguna idea qué puede estar pasando?

    ResponderEliminar
  20. Hola. Muy buen aporte. Me he instalado el Bull PDF Printer, y me imprime el documento que le envío.
    Pero tengo un problema y es que el documento no me lo imprime en la impresora que yo quiero. Es una OCE, la de la oficina, la cual requiere de usuario y contraseña (los cuales tengo almacenados en la configuracion de la "cola de impresora" de mi equipo). El código me detecta la impresora, se envía el documento a imprimir, pero no imprime nada. Pienso que esos datos ya los debería coger por defecto no?. O debería indicarle en las propiedades algo más?.

    Gracias, un saludo

    ResponderEliminar
  21. Estupendo código, hace lo que yo quiero, pero tengo un problema. A mi, no me corta el ticket cuando cierro el InputStream. He visto por google que hay una serie de caracteres que indican el corte del papel, pero no sé cómo adaptarlo al DocPrintJob. Podrías ayudarme con esto?.

    Gracias. Susana

    ResponderEliminar
  22. Muy buena clase.
    En los dos codigos tengo lo siguiente si mando ainprimir al Bull PDF Printer realiza bien la impresión.Pero si tu cambias a la impresora HP Deskjet 5500 envía el archivo y se ve reflejado en la cola de impresión pero te manda Error impresión. Me puedes ayudar a solucionar este problema.
    Saludos.

    ResponderEliminar
  23. Bunas.
    Tengo una consulta alguien sabe como seleccionar o predeterminar la bandeja 2 de la impresora

    ResponderEliminar
  24. auxilio enviar a imprimir la letra Ñ con el objeto simpledoc...¿¿¿

    ResponderEliminar
  25. Necesito algún código para imprimir en una impresora térmica enviándole como parámetros datos de mi BD, es la primera vez que trabajo con estas impresoras y es mi trabajo final de programacion porfa ayudaaaaa :D dejo mi correo isc.daniel14@gmail.com

    ResponderEliminar
  26. Que tal amigos alguien me podria decir : si tengo archivos renombrados por numeracion y dos de ellos se tienen el mismo numero de numeracion solo que uno de ellos es la primer cara y el otro la segunda como hago yo para imprimirlos al mismo tiempo ? porfavor agradezco mucho sus ayudas

    ResponderEliminar
    Respuestas
    1. Recuerda que sí usas una única impresora, existe la cola de impresión, primer archivo en llegar primero en imprimirse. La impresión que mencionas al mismo tiempo podrías hacerla 1) enviando a otra impresora y 2) usando Threads

      Eliminar
  27. como hago yo para imprimir dos archivos file con la clase InputStream al mismo tiempo? porfavor tengo este codigo..

    public void imprimeManifiest() throws IOException {
    FileInputStream inputStream = null;
    String ruta = labelManifiesto.getText().trim();
    try {
    inputStream = new FileInputStream("//nas//Manifiestos/" + ruta + ".jpg");
    } catch (FileNotFoundException e) {
    JOptionPane.showMessageDialog(null, "No se encutra el archivo...\n" + e.getMessage());
    }
    if (inputStream == null) {
    return;
    }
    //DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
    DocFlavor docFormat = DocFlavor.INPUT_STREAM.JPEG;
    Doc document = new SimpleDoc(inputStream, docFormat, null);
    PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
    PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();

    if (defaultPrintService != null) {
    DocPrintJob printJob = defaultPrintService.createPrintJob();
    try {
    printJob.print(document, attributeSet);
    } catch (Exception e) {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "Error Imprimiendo el codumento\n" + e.getMessage(), "ERROR IMPRIMIENDO", JOptionPane.ERROR_MESSAGE);
    }
    } else {
    JOptionPane.showMessageDialog(null, "No existen Impresoras Instaladas...");
    }
    inputStream.close();
    }

    ResponderEliminar
  28. ME PUEDES AYUDAR CON ESO? por favor cualquier cosa a : reciboempresas@gmail.com

    ResponderEliminar
  29. con ese código salen caracteres raros por mi impresora :/

    ResponderEliminar
  30. Buenos días, yo quiero imprimir un JFrame pero todo el recuadro, por ejemplo hice una factura y quiero poder imprimirla entera, pero no logro hacerlo. Ahora me imprime en blanco, antes me imprimía solo el JTextField. Yo ya tengo el JFrame armado, solo quiero agregar un JButton que lo que haga sea imprimir el recuadro, el JFrame. He encontrado códigos que lo deberían hacer, pero cuando pego el código en el JFrame no obtengo resultados.

    Lo que me gustaría saber es que código tengo que poner en una nueva clase que sea el código fuente para poder imprimir y el código que tengo que poner en el boton del JFrame para que llame al código de la otra clase así imprime.

    Saludos.
    mi correo es nicolaskaco [at] gmail . com

    ResponderEliminar
  31. hermano me gusta tu codigo pero tengo un problema al ejecutarlo todo bien el problema es que no para de enviar solicitudes de impresion a la impresora varias

    ResponderEliminar
  32. y para agregar el corte? Alguien sabe como hacerlo amigos?

    ResponderEliminar
  33. hola buenos dias miren mi problema es que cuando la impresora no esta conectada me manda el archivo pdf a la cola de impresion pero cuando la impresora esta conectada y lista para imprimir no manda a imprimir el archivo

    ResponderEliminar
  34. Cómo hago para imprimir en una impresora de bouchers

    ResponderEliminar
  35. Hola he hecho algunas modificaciones al codigoque aportaste! de antemano agradezco mucho tu aporte ... por ahora tengo un problema al imprimir ya que me devuelve una serie de caracteres en varias hojas ... es decir el documento no esta siendo decodificado de manera correcta ... espero me pudieras orientar un poco acerca de este problema ... anexo el codigo!!

    public void imprimir() {
    String printerName = "";
    String sql ="";
    try{
    sql = "SELECT * FROM tbl_impresoras WHERE tipo = '1'";
    PreparedStatement pstm1 = cn.Conectar().prepareStatement(sql);
    ResultSet rs = pstm1.executeQuery();
    while(rs.next()){
    printerName = rs.getString("impresora");
    }
    }catch(SQLException e){
    JOptionPane.showMessageDialog(null,(e.getMessage()));
    }

    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);


    if(printerName.length() == 0){
    JOptionPane.showMessageDialog(null, "No ha seleccionado una impresora ... vaya a configuraciones y seleccione una", "ERROR DE IMPRESORA", JOptionPane.ERROR_MESSAGE);
    }else{

    int encontrada = 0;

    for(int i=0; i < services.length; i++){

    if(services[i].getName().equals(printerName)){

    try {
    JOptionPane.showMessageDialog(null, "Imprimiendo orden de servicio en " + services[i].getName(), "IMPRESIÓN", JOptionPane.INFORMATION_MESSAGE);
    FileInputStream fis = new FileInputStream("C:\\impresiones\\orden.pdf");
    Doc pdfDoc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    DocPrintJob printJob = services[i].createPrintJob();
    printJob.print(pdfDoc, new HashPrintRequestAttributeSet());

    } catch (PrintException e) {
    JOptionPane.showMessageDialog(null, e);
    }
    catch (FileNotFoundException e) {
    e.printStackTrace();
    }

    encontrada++;
    break;
    }
    }
    if(encontrada == 0){
    JOptionPane.showMessageDialog(null, "No se encontro impresora seleccionada " + printerName + " = ", "ERROR DE IMPRESORA", JOptionPane.ERROR_MESSAGE);
    }
    }
    }

    ResponderEliminar