impresora

Cómo imprimir en una impresora térmica

Este post es una recopilación de artículos que te muestran cómo mandar datos a una impresora térmica.

Como sabemos, las impresoras térmicas sirven para muchas cosas; por ejemplo, imprimir tickets, facturas, detalles de turnos, comprobantes de pago, etcétera.

La impresión de tickets puede hacerse desde el lado del cliente o del servidor; cuando subimos nuestra app web a internet se necesita imprimir forzosamente del lado del cliente.

Aquí hay algunos posts que demuestran cómo imprimir a una impresora térmica:

  • Imprimir ticket con PHP: la ventaja es que se puede cortar el papel y la impresión se personaliza sin que el usuario interactúe demasiado.
  • Imprimir ticket con JavaScript: imprimir con estilos personalizados, pero perder posibilidad de controlar la impresora a bajo nivel, además, el usuario debe confirmar la impresión.
  • Imprimir ticket con plugin (recomendado): es como combinar las dos anteriores, la única diferencia es que hay que descargar un plugin.

Recuerda, si quieres un desarrollo personalizado también puedo hacerlo.

Obtener lista de impresoras compartidas en Windows usando Golang

Introducción

Trabajando en un proyecto con Go, tuve que obtener la lista de impresoras compartidas en Windows. Básicamente hacer lo mismo que ya hice aquí con PHP.

Ahora le tocó el turno a Go, y aunque al principio no fue fácil, lo conseguí.

Hace falta mencionar que utilicé un método distinto, que por el momento sólo he probado en Windows 10 pero bueno, ¿quién usa un Windows atrasado en pleno 2018? aunque creo que funciona hasta en Windows 7.

Nota: si no quieres leer todo el proceso, simplemente ve hasta abajo en donde está la función final.

Comando

Lo que tenemos que hacer es ejecutar el siguiente comando en Windows:

cmd /C wmic printer get name

Que nos da una salida como esta:

Esto es muy, muy fácil. Lo complicado es:

  1. Ejecutar el comando en Go
  2. Obtener la salida
  3. Limpiar la salida

Veamos cómo hacerlo 🙂

Código fuente en Go

Simplemente ejecutamos el comando, aquí vino la primer cosa difícil, pues hay que pasar todos los argumentos separados, no juntos.

Es decir, no hay que hacer esto:

  salida, err := exec.Command("cmd", "/C wmic printer get name").Output()

Sino esto:

  salida, err := exec.Command("cmd", "/C", "wmic", "printer", "get", "name").Output()

Esperamos la salida y la convertimos a cadena. Hora de convertirla a un array de tipo string.

El primer problema fue que Windows trata los saltos de línea como \r en lugar de \n. Al principio tuve que hacer un split con \n pero no funcionaba, entonces imprimí la cadena con fmt.Printf y el formateador %q, en donde me di cuenta de que utilizaba \r\r\n.

Así que quedó así:

salidaCadena := string(salida)
listaDeImpresoras := strings.Split(salidaCadena, "\r\r\n")

Pero incluso después de eso tenía que remover los espacios. Así que en un ciclo for recorrí el ciclo, limpié el nombre (con TrimRight para remover los espacios en blanco) y omití los vacíos o aquellos que dijeran “Name”, pues “Name” es el encabezado del comando.

var listaDeImpresorasLimpias []string
  for _, impresora := range listaDeImpresoras {
    nombreLimpio := strings.TrimRight(impresora, " ")
    if len(nombreLimpio) > 0 && nombreLimpio != "Name" {
      listaDeImpresorasLimpias = append(listaDeImpresorasLimpias, nombreLimpio)
    }
  }

Listo. Al final encerré todo en una función y se ve así:

func obtenerListaDeImpresorasCompartidasWindows() []string {
  salida, err := exec.Command("cmd", "/C", "wmic", "printer", "get", "name").Output()
  if err != nil {
    log.Fatal(err)
  }
  salidaCadena := string(salida)
  listaDeImpresoras := strings.Split(salidaCadena, "\r\r\n")
  var listaDeImpresorasLimpias []string
  for _, impresora := range listaDeImpresoras {
    nombreLimpio := strings.TrimRight(impresora, " ")
    if len(nombreLimpio) > 0 && nombreLimpio != "Name" {
      listaDeImpresorasLimpias = append(listaDeImpresorasLimpias, nombreLimpio)
    }
  }
  return listaDeImpresorasLimpias
}

Fabuloso. No olvides importar log, os/exec y strings.

Obtener impresoras compartidas en Windows usando PHP

Introducción

Acabo de publicar una entrada sobre cómo obtener impresoras en Windows. Pues podemos modificar dicho comando para que diga si son o no compartidas, y dependiendo de eso incluirlas en un arreglo

Comando

El comando queda modificado así:

get-WmiObject -class Win32_printer |ft shared, name

Como vemos, en la otra entrada sólo obtenemos el nombre con name. En este caso también queremos ver si está compartida usando shared. Así es la salida:

Una vez que tenemos esto vamos a ir a PHP y parsear todo. Vamos a incluir sólo las que estén compartidas:

Con eso tenemos para obtener la lista de impresoras compartidas. Esto es útil por ejemplo cuando queremos imprimir un ticket en una impresora térmica, ya que la librería dice que dicha impresora debe estar compartida.

Obtener lista de impresoras en Windows usando PHP

Introducción

Puede que en algún momento necesitemos obtener qué impresoras se encuentran disponibles para, obviamente, imprimir.

En esta ocasión veremos cómo obtener dicha lista usando el maravilloso lenguaje PHP y el powershell de Windows. Tranquilo, que no es nada complicado.

Nota: obviamente esto sólo funciona en Windows, y sólo si es 7, 8 o 10. (por cierto, ¿Quién usa XP o Vista en pleno 2017?)

Comando

Primero tenemos que saber en dónde se encuentra el powershell. Normalmente está en c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe. Vamos a abrirlo entonces y ejecutar el siguiente comando:

get-WmiObject -class Win32_printer |ft name

La verdad, no sé cómo funciona internamente. Pero sí que lista las impresoras:

Hasta aquí todo bien, el problema es que con PHP no podemos hacer lo mismo que hacemos con nuestras manos. Así que necesitamos un comando de una sola línea que ejecute todo.

Para ello, powershell acepta un comando como argumento con la opción -c. Por lo que podemos llamarlo desde el cmd así:

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "get-WmiObject -class Win32_printer |ft name"

No hay que confundirnos, simplemente indicamos la ruta de powershell, y le pasamos como argumento y entre comillas el comando que ejecutamos anteriormente. La salida es esta:

Es la misma de hace un momento, con la novedad de que la obtuvimos en un solo comando. Ahora sí estamos listos.

Llamando desde PHP

En PHP existe la función exec, que ejecuta un comando en la terminal del sistema. Así que básicamente tenemos que llamar a exec con el comando de arriba, parsear la salida, omitir “name” y los guiones que salen así como las líneas vacías, y finalmente mostrar el nombre de la impresora “limpio”.

Para ello he preparado un pequeño script:

Probando

¿Y funciona? claro que sí, tarda un poco, pero vale la pena. No puedo poner resultados en línea, pero aquí adjunto una captura de lo que aparece en mi sistema:

Y si voy al panel de control, son las mismas:

Si tú deseas probarlo, simplemente copia el código, pégalo, guárdalo en htdocs (si no sabes instalar PHP ya he escrito un tutorial aquí) y finalmente visita http://localhost/listar-todas-las-impresoras.php

Hasta aquí llegamos por hoy

Instalar impresora térmica como genérica

Introducción

A veces no podemos conseguir los drivers o controladores originales de nuestras impresoras térmicas. O tal vez sea por nuestro gusto instalarlas como genéricas. Así que en este tutorial veremos cómo instalarlas sin necesidad de drivers.

Instalar impresora genérica

Lo primero que tenemos que hacer es conectar nuestra impresora y encenderla.

Ahora vamos al panel de control y luego a Dispositivos e impresoras. Ahí seleccionamos Agregar una impresora. Inmediatamente aparecerá una ventana como la de abajo, en donde vamos a seleccionar La impresora deseada no está en la lista

En la siguiente ventana seleccionamos Agregar una impresora local o de red con configuración manual y hacemos click en Siguiente

Ahora en el puerto elegimos el USB00X en donde la X es un número. Si tenemos más dispositivos tendremos que ir probando uno por uno, pero si no, seleccionamos el único que exista. En mi caso sólo hay uno, por lo que tomaré ese.

Una vez que seleccionemos el puerto hacemos click en Siguiente.

En la siguiente pantalla nos da una lista de controladores. Buscamos el que diga Generic y a la derecha seleccionamos Generic Text Only. Finalmente hacemos click en siguiente:

Ahora nos pregunta el nombre. Recomiendo no usar espacios ni caracteres extraños para asignarlo. En mi caso le puse ImpresoraTermica.

Una vez asignado el nombre hacemos click en Siguiente

Ahora aquí esperamos un momento a que se instale…

Cuando termine, mostrará esto. Hacemos click en Imprimir una página de prueba para ver si la instalación ha ido bien…

Aquí nos avisa que ya se ha mandado:

Hacemos click en Cerrar y en la otra ventana hacemos click en Finalizar. Si todo ha ido bien, se debió haber impreso algo así:

En esa imagen se puede apreciar el nombre, el puerto, etcétera. Si no ha ido bien, probemos con otro puerto siempre y cuando comience con USB00X

Compartir impresora

Si vienes aquí por el tutorial de imprimir ticket en impresora térmica desde PHP, te enseñaré a compartirla.

Una vez instalada vamos a Panel de control y después a Dispositivos e impresoras. Ahí, a la impresora que instalamos le hacemos click derecho y seleccionamos Propiedades de impresora:

Vamos a la pestaña de Uso compartido y hacemos click en el botón que dice Cambiar opciones de uso compartido si es que está deshabilitada la opción de “Compartir esta impresora”

Cuando hagamos click se habilitará la opción. Hacemos click en ella y luego en  la entrada de texto ponemos el nombre del a impresora.

En mi caso dejaré el mismo nombre.

Finalmente hacemos click en Aceptar y con eso hemos terminado.

Imprimir ticket en impresora térmica usando Javascript

Introducción

Actualización agosto 2019

¿Quieres imprimir con JavaScript sin usar el diálogo de impresión, con la posibilidad de cortar el papel y abrir el cajón de dinero? mira este post.

Recientemente escribí un tutorial sobre cómo imprimir un ticket en una impresora térmica usando PHP. Veamos entonces cómo podemos imprimir ticket en impresora térmica usando JavaScript.

Las complicaciones que tenemos al imprimir con PHP son:

  • Confusión de cómo usar la librería
  • Forzar a que el lenguaje del servidor sea PHP

Así que ahora decidí hacer una entrada para saber cómo imprimir un ticket en una impresora térmica sin usar PHP, sólo Javascript. El resultado será el siguiente:

Continue reading…

Imprimir ticket en impresora térmica desde PHP

Introducción

Actualización agosto 2019

¿Quieres imprimir nativamente a la impresora de tickets, sin depender de PHP? mira este post.

Nota: te invito a leer cómo imprimir en impresora térmica usando Javascript, es un poco más fácil aunque tiene desventajas como no poder cortar el papel al gusto. Pero funciona sin tener que instalar librerías.

Las impresoras de tickets son muy populares y útiles en los establecimientos donde se necesita entregar un comprobante.

Puede que en alguna ocasión nos toque desarrollar un pequeño sistema en PHP y que tengamos que imprimir tickets.

Para ello es que escribo este tutorial; que al final nos dará un resultado parecido al siguiente:

Continue reading…