Buscar en el Blog

viernes, 8 de marzo de 2013

Código Java para imprimir en una impresora nombrada

En ésta publicación comparto el código Java para imprimir en una impresora nombrada.

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

        //Archivo que se desea imprimir
        FileInputStream inputStream = new FileInputStream("c:/archivo.pdf");

        //Formato de Documento
        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        //Lectura de Documento
        Doc document = new SimpleDoc(inputStream, docFormat, null);

        //Nombre de la impresora
        String printerName = "HP3015";

        //Inclusion del nombre de impresora y sus atributos
        AttributeSet attributeSet = new HashAttributeSet();
        attributeSet.add(new PrinterName(printerName, null));
        attributeSet = new HashAttributeSet();
        //Soporte de color o no
        attributeSet.add(ColorSupported.NOT_SUPPORTED);

        //Busqueda de la impresora por el nombre asignado en attributeSet
        PrintService[] services = PrintServiceLookup.lookupPrintServices(docFormat, attributeSet);

        System.out.println("Imprimiendo en : " + services[0].getName());

        DocPrintJob printJob = services[0].createPrintJob();
        //Envio a la impresora
        printJob.print(document, new HashPrintRequestAttributeSet());

        inputStream.close();

    }


23 comentarios:

  1. Buenas como hago para mostrar opciones de impresion como que detecte todas me las muestre y elegir cual usar???me das alguna idea???

    ResponderEliminar
    Respuestas
    1. public static void listarImpresoras() {
      PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
      System.out.println("Lista de impresoras disponibles");

      for (PrintService printService: printServices) {
      System.out.println("\t" + printService.getName());
      }
      }

      Eliminar
  2. Muchas gracias por el codigo

    y ayudando al compañero que pregunta como elegir la impresora y opciones de impresión.. A ver si esto te ayuda un poco, yo obtengo asi el nombre de la impresora.

    PrinterJob job = PrinterJob.getPrinterJob();
    job.printDialog();
    String impresora=job.getPrintService().getName();

    ResponderEliminar
  3. Muchas gracias por la el código...

    Y tratando de ayudar a quien pregunta como elegir el nombre de la impresora... a ver si esto te ayuda un poco


    PrinterJob job = PrinterJob.getPrinterJob();
    job.printDialog();
    String impresora=job.getPrintService().getName();

    ResponderEliminar
  4. Muchas gracias por la el código...

    Y tratando de ayudar a quien pregunta como elegir el nombre de la impresora... a ver si esto te ayuda un poco


    PrinterJob job = PrinterJob.getPrinterJob();
    job.printDialog();
    String impresora=job.getPrintService().getName();

    ResponderEliminar
  5. Disculpa, pero tengo una pregunta... resulta que tu código funciona de maravilla pero yo necesito que si le doy X nombre vaya a esa impresora he imprima sobre ella... pero hago el ejercicio y sale en la impresora predeterminada o en la que imprimió por ultima vez, tienes alguna idea como pueda manejar ese problema.

    ResponderEliminar
  6. Para el amigo de arriba, puedes hacerlo de esta manera:
    //En caso de que tengamos varias impresoras configuradas
    PrintService myPrinter = null;
    for (int i = 0; i < services.length; i++){
    if (services[i].getName().equals(printerName)){
    myPrinter = services[i];
    System.out.println("Imprimiendo en : " + services[i].getName());
    break;
    }
    }

    DocPrintJob printJob = myPrinter.createPrintJob();
    //Envio a la impresora
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    printJob.print(document, aset);
    inputStream.close();

    ResponderEliminar
  7. Hola, de que manera puedo pasarle una cadena y que sea eso lo que me imprima ?

    ResponderEliminar
    Respuestas
    1. En la línea 4 reemplaza por InputStream inputstream = new ByteArrayInputStream("Cadena de texto".getBytes(StandardCharsets.UTF_8));

      Eliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. este còdigo me sirve para enviar a imprimir las boletas en un restaurante ?

    ResponderEliminar
  10. Necesito mandar a imprimir un archivo PDF pero lo que quiero es..... Al momento de dar clic en el botón imprimir se me abra una ventana para seleccionar la impresora, escoger el número de hoja que quiero imprimir (del total del documento) etc.

    ResponderEliminar
    Respuestas
    1. Prueba con lo que nos ayudó Julián:

      PrinterJob job = PrinterJob.getPrinterJob();
      job.printDialog();
      String impresora=job.getPrintService().getName();

      Saludos,

      Eliminar
  11. Buenas tardes, su codigo me funciona muy bien para imprimir, pero no me ejecuta la impresion en la impresora nombrada, siempre me la tira a la impresora por defecto, obtengo el nombre tal cual pusieron en los comentarios y lo seteo en el campo del nombre de su codigo, pero siempre me envia la impresion al impresor por defecto, en mi caso tengo 2 impresores, de ante mano gracias por su respuesta

    ResponderEliminar
  12. tengo este codigo public void imprimirnomina() {
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(this);
    //Si el usuario presiona imprimir en el dialogo de impresión,
    //entonces intenta imprimir todas las lineas de texto
    boolean ok = job.printDialog();
    if (ok) {
    try {
    job.print();
    } catch (PrinterException ex) {
    /* The job did not successfully complete */
    }
    }
    }


    como puedo hacer que mande a imprimir a una impresora que yo escoja pasando su nombre como una cadena por ejempleo String impresora="hp 200";

    ResponderEliminar
  13. un favor mi impresora no esta funcionando correctamente quedo imprimiendo el ultimo tema q descargue de internet como hago para restaurarla y que me permita imprimir otras cosas?


    ResponderEliminar
  14. Buenas, el codigo me funciono perfercto. Ahora si quiero enviar un pagina HTML que carga datos dinamicos, como deberia de hacer???
    Yo tengo un formulario que el cliente carga su informacion, luego al darle confirmar, algunos datos van a un HTML que no se mostraria y SI deberia de imprimirse, pero no logro hacerlo. Alguien que pueda ayudar?
    Muchas gracias

    ResponderEliminar
  15. Buenas, una consulta. Tengo un formulario al cual los clientes llenan sus datos, eso genera un HTML que no se muestra pero que se debe imprimir.
    El codigo de arriba me funciono perfecto, pero no puedo hacer que imprima el HTML, alguna ayuda???
    Gracias

    ResponderEliminar
  16. Ayuda, me dice que esta imprimiendo pero no me sale nada por la impresora ni en la cola de impresion

    ResponderEliminar
  17. Oye buenas tardes ,espero que todavía estes en este blog yo tengo un problema se me ocurrió mandar a imprimir desde una aplicación web en spring mvc pero cuando la tengo en eclipse y la pruebo imprime correctamente pero cuando subo el war a tomcat ya no manda a imprimir tengo que realizar alguna configuración el código es este y la versión
    que estoy utilizando es java 1.8

    public class Ticket {
    private String contentTicket = "PRODUCTMARKET\n"+
    "DOMICILIO CONOCIDO MEXICO,MEXICO\n"+
    "=============================\n"+
    "ATIZAPAN,\n"+
    "RFC: XXX-999999-XX9\n"+
    "Caja # {{box}} - Ticket # {{ticket}}\n"+
    "LE ATENDIO: {{cajero}}\n"+
    "{{dateTime}}\n"+
    "=============================\n"+
    "{{items}}\n"+
    "=============================\n"+
    //"SUBTOTAL: {{subTotal}}\n"+
    //"IVA: {{tax}}\n"+
    "TOTAL: {{total}}\n\n"+
    //"RECIBIDO: {{recibo}}\n"+
    //"CAMBIO: {{change}}\n\n"+
    "=============================\n"+
    "GRACIAS POR SU COMPRA...\n"+
    "ESPERAMOS SU VISITA NUEVAMENTE {{nameLocal}}\n"+
    "\n"+
    "\n";

    //El constructor que setea los valores a la instancia
    public Ticket(String box, String ticket, String caissier, String dateTime, String items, String total) {
    this.contentTicket = this.contentTicket.replace("{{box}}", box);
    this.contentTicket = this.contentTicket.replace("{{ticket}}", ticket);
    this.contentTicket = this.contentTicket.replace("{{cajero}}", caissier);
    this.contentTicket = this.contentTicket.replace("{{dateTime}}", dateTime);
    this.contentTicket = this.contentTicket.replace("{{items}}", items);
    this.contentTicket = this.contentTicket.replace("{{total}}", total);

    }

    public void print() {
    //Especificamos el tipo de dato a imprimir
    //Tipo: bytes; Subtipo: autodetectado
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;

    //Aca obtenemos el servicio de impresion por defatul
    //Si no quieres ver el dialogo de seleccionar impresora usa esto
    //PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();


    //Con esto mostramos el dialogo para seleccionar impresora
    //Si quieres ver el dialogo de seleccionar impresora usalo
    //Solo mostrara las impresoras que soporte arreglo de bits
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
    PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
    PrintService service = ServiceUI.printDialog(null, 700, 200, printService, defaultService, flavor, pras);

    //Creamos un arreglo de tipo byte
    byte[] bytes;

    //Aca convertimos el string(cuerpo del ticket) a bytes tal como
    //lo maneja la impresora(mas bien ticketera :p)
    bytes = this.contentTicket.getBytes();

    //Creamos un documento a imprimir, a el se le appendeara
    //el arreglo de bytes
    Doc doc = new SimpleDoc(bytes,flavor,null);

    //Creamos un trabajo de impresión
    DocPrintJob job = service.createPrintJob();

    //Imprimimos dentro de un try de a huevo
    try {
    //El metodo print imprime
    job.print(doc, null);
    } catch (Exception er) {
    JOptionPane.showMessageDialog(null,"Error al imprimir: " + er.getMessage());
    }
    }

    }

    ResponderEliminar
  18. muy buen aporte. me gustaria saber como puedo implementar la cantidad de impresiones que deseo!!


    espero me puedan ayudar.

    ResponderEliminar
  19. porque envia a impresion pero no imprime? prove con varios pdf y envia pero no imprime

    ResponderEliminar
  20. envia todo a impresion pero no imprime, probe con varios pdf y es lo mismo

    ResponderEliminar