Imprimir ticket en impresora térmica desde PHP

Introducción

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:

Si quieres descargar un ejemplo rápido y funcional, mira el repositorio de GitHub. Solo tienes que descargar el código, cambiar el nombre de tu impresora y probar.

Requisitos

Paso 1: Descargar librería

Actualización 2020: varios usuarios me dicen que no encuentran el autoload. Es cuestión de usar composer, pero si no quieres, puedes descargar el autoload y la carpeta src desde mi perfil de GitHub.

Vamos a ir al repositorio de GitHub y hacer clic en Download ZIP (también podemos clonar el repositorio si es que sabemos usar git).

Después, vamos a extraer ese archivo en una carpeta de nuestra elección.

Esta carpeta debe ser una carpeta que sea accesible desde nuestro entorno de desarrollo web. Si usamos XAMPP, la carpeta está en C:\xampp\htdocs.

Nos tiene que quedar algo así:

Paso 2: Eliminar archivos innecesarios

Entraremos a la carpeta y sólo dejaremos la carpeta src y el archivo autoload.php. Lo demás podemos eliminarlo:

Vamos a renombrar la carpeta a un nombre más fácil de recordar. En mi caso la llamaré “ticket

Hasta el momento nuestro proyecto debe lucir así:

Paso 3: Hola mundo

Vamos a crear un archivo llamado index.php en  donde está la carpeta que acabamos de renombrar, de manera que quede así:

Dentro del archivo vamos a escribir lo siguiente:

<?php
 
 
require __DIR__ . '/ticket/autoload.php'; //Nota: si renombraste la carpeta a algo diferente de "ticket" cambia el nombre en esta línea
use Mike42\Escpos\Printer;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
 
/*
	Este ejemplo imprime un hola mundo en una impresora de tickets
	en Windows.
	La impresora debe estar instalada como genérica y debe estar
	compartida
*/
 
/*
	Conectamos con la impresora
*/
 
 
/*
	Aquí, en lugar de "POS-58" (que es el nombre de mi impresora)
	escribe el nombre de la tuya. Recuerda que debes compartirla
	desde el panel de control
*/
 
$nombre_impresora = "POS-58"; 
 
 
$connector = new WindowsPrintConnector($nombre_impresora);
$printer = new Printer($connector);
 
/*
	Imprimimos un mensaje. Podemos usar
	el salto de línea o llamar muchas
	veces a $printer->text()
*/
$printer->text("Hola mundo\nParzibyte.me");
 
/*
	Hacemos que el papel salga. Es como 
	dejar muchos saltos de línea sin escribir nada
*/
$printer->feed();
 
/*
	Cortamos el papel. Si nuestra impresora
	no tiene soporte para ello, no generará
	ningún error
*/
$printer->cut();
 
/*
	Por medio de la impresora mandamos un pulso.
	Esto es útil cuando la tenemos conectada
	por ejemplo a un cajón
*/
$printer->pulse();
 
/*
	Para imprimir realmente, tenemos que "cerrar"
	la conexión con la impresora. Recuerda incluir esto al final de todos los archivos
*/
$printer->close();
?>

Y al llamarla desde localhost/probarticket/ticket.php el resultado es el siguiente:

Pero no sólo podemos hacer eso, podemos hacer muchísimas cosas más.

En el repositorio oficial podemos encontrar miles de ejemplos, pero en este caso haré uno para imprimir un ticket de venta.

Ejemplo: Ticket de venta

<?php
require __DIR__ . '/ticket/autoload.php'; //Nota: si renombraste la carpeta a algo diferente de "ticket" cambia el nombre en esta línea
use Mike42\Escpos\Printer;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
 
/*
	Este ejemplo imprime un
	ticket de venta desde una impresora térmica
*/
 
 
/*
	Una pequeña clase para
	trabajar mejor con
	los productos
	Nota: esta clase no es requerida, puedes
	imprimir usando puro texto de la forma
	que tú quieras
*/
class Producto{
 
	public function __construct($nombre, $precio, $cantidad){
		$this->nombre = $nombre;
		$this->precio = $precio;
		$this->cantidad = $cantidad;
	}
}
 
/*
	Vamos a simular algunos productos. Estos
	podemos recuperarlos desde $_POST o desde
	cualquier entrada de datos. Yo los declararé
	aquí­ mismo
*/
 
$productos = array(
		new Producto("Papas fritas", 10, 1),
		new Producto("Pringles", 22, 2),
		/*
			El nombre del siguiente producto es largo
			para comprobar que la librería
			bajará el texto por nosotros en caso de
			que sea muy largo
		*/
		new Producto("Galletas saladas con un sabor muy salado y un precio excelente", 10, 1.5),
	);
 
/*
	Aquí­, en lugar de "POS-58" (que es el nombre de mi impresora)
	escribe el nombre de la tuya. Recuerda que debes compartirla
	desde el panel de control
*/
 
$nombre_impresora = "POS-58"; 
 
 
$connector = new WindowsPrintConnector($nombre_impresora);
$printer = new Printer($connector);
 
 
/*
	Vamos a imprimir un logotipo
	opcional. Recuerda que esto
	no funcionará en todas las
	impresoras
 
	Pequeña nota: Es recomendable que la imagen no sea
	transparente (aunque sea png hay que quitar el canal alfa)
	y que tenga una resolución baja. En mi caso
	la imagen que uso es de 250 x 250
*/
 
# Vamos a alinear al centro lo próximo que imprimamos
$printer->setJustification(Printer::JUSTIFY_CENTER);
 
/*
	Intentaremos cargar e imprimir
	el logo
*/
try{
	$logo = EscposImage::load("logo.png", false);
    $printer->bitImage($logo);
}catch(Exception $e){/*No hacemos nada si hay error*/}
 
/*
	Ahora vamos a imprimir un encabezado
*/
 
$printer->text("Yo voy en el encabezado" . "\n");
$printer->text("Otra linea" . "\n");
#La fecha también
$printer->text(date("Y-m-d H:i:s") . "\n");
 
 
/*
	Ahora vamos a imprimir los
	productos
*/
 
# Para mostrar el total
$total = 0;
foreach ($productos as $producto) {
	$total += $producto->cantidad * $producto->precio;
 
	/*Alinear a la izquierda para la cantidad y el nombre*/
	$printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text($producto->cantidad . "x" . $producto->nombre . "\n");
 
    /*Y a la derecha para el importe*/
    $printer->setJustification(Printer::JUSTIFY_RIGHT);
    $printer->text(' $' . $producto->precio . "\n");
}
 
/*
	Terminamos de imprimir
	los productos, ahora va el total
*/
$printer->text("--------\n");
$printer->text("TOTAL: $". $total ."\n");
 
 
/*
	Podemos poner también un pie de página
*/
$printer->text("Muchas gracias por su compra\nparzibyte.me");
 
 
 
/*Alimentamos el papel 3 veces*/
$printer->feed(3);
 
/*
	Cortamos el papel. Si nuestra impresora
	no tiene soporte para ello, no generará
	ningún error
*/
$printer->cut();
 
/*
	Por medio de la impresora mandamos un pulso.
	Esto es útil cuando la tenemos conectada
	por ejemplo a un cajón
*/
$printer->pulse();
 
/*
	Para imprimir realmente, tenemos que "cerrar"
	la conexión con la impresora. Recuerda incluir esto al final de todos los archivos
*/
$printer->close();
?>

 

 

Ya después podemos hacer uso de number_format, poner el cambio, un mensaje dependiendo de la hora, etcétera.

Conclusión

En el repositorio oficial hay ejemplos para imprimir códigos qr, códigos de barras, y otras cosas más.

Recuerda, si quieres imprimir nativamente a la impresora de tickets, sin depender de PHP mira este post.

Si usas Laravel mira cómo integrar la librería en Laravel.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

254 comentarios en “Imprimir ticket en impresora térmica desde PHP”

  1. buenas me podria ayudar quiero imprimir en el ticket de venta el codigo qr para aceder a mi pagina o app
    ya tengo el codigo puedo imprimir sin problema pero quiero que salga el qr

    1. El error 500 puede deberse a varias cosas, pero en este caso específico supongo que es porque no se encuentra la impresora. Recuerde que PHP se ejecuta del lado del servidor, así que va a intentar imprimir en una impresora físicamente conectada al servidor. Como el servidor no tiene la impresora, se genera el error. En esos casos hay que imprimir del lado del cliente: https://parzibyte.me/blog/2022/09/30/comunicar-javascript-impresora-termica-usando-plugin-v3/

  2. Hola! tras unas pruebas todo funciona perfecto. Solo una duda… ¿como podria imprimier el simbolo del Euro? €
    He probado con varios codigos \128 \0128 € pero no logro que lo saque

  3. BUenos dias Parzibyte, tengo el siguiente problema cuando llamo a index.php, podrias por favor darme una mano con este error.
    Warning: copy(\\DESKTOP-ROM9TOI\POS-58): failed to open stream: No such file or directory in C:\xampp\htdocs\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372

    Fatal error: Uncaught Exception: Failed to copy file to printer in C:\xampp\htdocs\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php:291 Stack trace: #0 C:\xampp\htdocs\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php(173): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalizeWin(‘\e@\ea\x01\x1Dv0\x00 \x00\xFA\x00\x00\x00…’) #1 C:\xampp\htdocs\ticket\src\Mike42\Escpos\Printer.php(503): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalize() #2 C:\xampp\htdocs\ticket\index.php(69): Mike42\Escpos\Printer->close() #3 {main} thrown in C:\xampp\htdocs\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 291

    GRACIAS POR TU TIEMPO!!!!!

  4. Excelente me funciono correctamente, después de batallar por mucho tiempo solo tuve que habilitar esta extensión en el php.ini del xampp (extension=intl) y agregar la libreria de (extension=php_printer dll), muchas gracias por tu aporte.

  5. hola buen día, implementa la librería en mi aplicación funciona la impresión del ticket a nivel local (localhost), pero cuando lo desplegué en cpanel (SERVIDOR PUBLICO) ya no imprime…podrías recomendarme como hacerlo.
    $nombre_impresora = “smb://HP-MIPC/POS-80C”;

  6. Buenas tardes amigo. disculpa pero como hago para que me imprima el ticket doble. es decir que salgan dos tickets iguales. ya probe por config de impresora y no lo hace. Gracias

  7. Buenas tardes. recibe un cordial saludo. Instale todo tal cual lo explicas en mi pc, en el cual tengo el servidor (xampp), instale la impresora usb y funciona bien. El problema surge cuando cambio la impresora a otra pc me da error. No se como llamarla desde php. Gracias.

  8. Hola que tal, me imprime la factura sin problema pero no me imprime el logo, ya le quite la transparencia y lo redimensioné y no imprime el logo, te agradezco si me ayudas.
    muchas gracias

  9. Are you able to print barcode to printer? i was unable to print image until i came across your bitImage() code instead of graphics() which prints garbage. The same error happens when i use barcode() to print barcodes. Any solution?

  10. Hola, excelente blog, muchas gracias. Tengo el siguiente problema, tengo versión de PHP 5.6.40, primero me saca error con la línea declare(strict_types=1); al revisar veo q es soportado a partir de la versión 7 entonces lo comentarie, pero ahora me saca el siguiente error: “Fatal error: Default value for parameters with a class type hint can only be NULL in /home/contabsystem/public_html/operativo/ticket/src/Mike42/Escpos/Printer.php on line 512”. Muchas gracias

  11. Hola me podrían ayudar con algo porfavor, es que ya tengo todo listo pero no se como imprimir los detalles de la compra desde la consulta SQL en esta librería 😔

  12. Francisco Javier

    Buenas tardes yo tengo subido mi proyecto a un servidor en internet como puedo imprimir en la impresora que este conectada a mi ordenador?

  13. Hola me podrias ayudar tengo una impresora zebra gc420t la cual ya la tengo instalada y sigo al pie de la letra los pasos que aparecen pero al enviar la impresion en la cola de impresion si aparece que envio algo pero inmediatamente se quita y no imprime nada podras arientarme por que

  14. Una pregunta bueno ya lo probé con php puro y todo ok
    pero lo intenté con Laravel y me tira un error Class ‘IntlBreakIterator’ not found Cómo se puede hacer para usarlo en dicho framework? tiene soporte? gracias

    1. Extension intl habilitada. la librería es perfectamente funcional en localhost/ticket/imprimir.php pero en laravel no hay forma me recomiendas usar escpos-tools?

    2. Lesmes Leitón Fuentes

      Hola Parzibyte encontré la solución a este problema con Laravel tardé 3 dias en solucionarlo pero ya lo logré. Después de instalar con el composer con el siguiente comando “composer require mike42/escpos-php” se debe reemplazar la carpeta src original por la que tienes en tu ejemplo funcional en la url “https://github.com/parzibyte/imprimir_ticket_php” y eso es todo.
      Hay algo incompatible con Laravel en los archivos de la carpeta src original.

  15. Hola nuevamente,

    Una pregunta, puedo omitir o comentar la siguiente línea para no usar Composer?
    require __DIR__ . ‘/ticket/autoload.php’;

    o una forma diferente para no usar Composer, ya leí la,documentación y entiendo para qué sirve, pero en mi caso no voy a requerir actualizaciones y aparte que se me complica esto de Composer.

    Gracias, quedo pendiente de tu respuesta por favor

    1. Si no usas el autoload, no se van a cargar las clases necesarias para la impresión de tickets, ni el conector, ni la clase Printer, así de simple

      Puedes usar Composer para generar la carpeta vendor y el autoload.php, después de tener ambos elementos ya puedes simplemente copiarlos en todos tus proyectos y no depender de Composer.

  16. Hola!
    Gracias por compartir el código y la información, pero me gustaría saber si me pueden apoyar, ya que el archivo autoload.php ya no está en el repositorio, al principio del archivo principal solicita este archivo pero no está, quedo atenta sus comentarios.

    Gracias!

  17. caballero buenas tardes, le pregunto ¿El código se podría usar en WordPress/WooCommerce una vez el cliente ha realizado el pedido? Estoy buscando un plugin que permita, en la impresora térmica, imprimir automáticamente la factura usando Google Print

    1. Hola amigo buen día. Esto permite imprimir a impresoras térmicas, no impresoras (no sé cómo llamarlas pero son aquellas que utilizan tinta o tóner) convencionales, pero del lado del servidor.
      Si usted quiere puede ver un plugin que imprime del lado del cliente (igual a una impresora térmica) y se puede adaptar a WordPress, WooComerce y cualquier otro software pues se programa con JavaScript del lado del cliente. Documentación aquí: https://parzibyte.github.io/plugin-ticket-js/

  18. Me sale el siguiente error:

    Warning: require(C:\wamp64\www\probarticket\ticket/ticket/autoload.php): failed to open stream: No such file or directory in C:\wamp64\www\probarticket\ticket\index.php on line 4

    alguna idea o tienes el proyecto de prueba en algun lugar para ver que tengo mal?

    1. Hola, no existe el archivo en la ubicación. Verifica que el autoload existe en la ruta que se indica. El ejemplo lo tienes en el post, ahí se muestra la estructura de ejemplo
      Saludos

  19. Mauro echavarria sera que puedas compartir tu codigo, o detalles una poco mas donde se realiza el funtion getRealIP y donde se coloca la el codigo de impresiona de hola por favor una ayuda

    1. Se supone que soporta todos los modelos de impresora, ya que todos entienden comandos ESC POS. Puedes probar con la tuya y decirnos, o ver el repositorio de GitHub, ahí hay una lista de impresoras compatibles
      Saludos

  20. Me gustaria imprimir en una impresora Zebra ZT220 que está instalada en otro equipo (\\192.168.1.213\etiquetas).
    Estoy probando este código llega a la impresora, pero da error

    1. Hola. El modelo que menciona es una impresora de etiquetas, pero no es una impresora de tickets; y la librería solo funciona para tickets y comandos ESC POS
      Para imprimir en esa impresora necesita un software que la mayor parte del tiempo viene junto con la impresora; es decir, se lo debieron haber dado al obtener la impresora

    1. si la impresora esta conectada a la estacion y compartida desde alli es cosa de poner el nombre en el archivo php y listo. Lo probe con una maquina virtual, aunque en realidad yo tengo la impresora conectada por cable de red al router y desde alli puedo imprimir desde varios pc.

  21. Hola, al igual que se puede imprimir en una impresora, se puede enviar a que la caja registradora se abra automáticamente al dar imprimir?, si es posible que marcas y modelos de caja registradora lo soportan?

    1. Solamente he probado con cajones de dinero que tienen un conector (no recuerdo su nombre pero es como el RJ45 en pequeño) que se conecta a la parte trasera de la impresora; la misma manda un pulso por ahí y el cajón se abre

    2. Ok, es decir que al usar este codigo php, abrirá la caja registradora que este conectada a la impresora por medio de este cable RJ45 o similar de manera automática? o debo implementar o ejecutar algún comando especifico?

    3. Manda el pulso con $printer->pulse(), ya es cuestión de la impresora si interpreta ese código. La mayoría de veces funciona, y en otras ocasiones puedes configurar la impresora en el sistema para que mande el pulso cuando termine de imprimir

    4. El conector pequeño es un RJ11 creo, hay cables RJ11 y en el otro extremo usb.
      Pero tambien estan los cables de impresora donde un lado es usb y el otro extremo es un conector cuadrado delgado. ese cable tambien sirve y permite abrir la caja de dinero al momento de imprimir.

  22. Consulta, creo que tengo la misma impresora que tu, pero no puedo imprimir codigos de barra ni codigos QR.. sera que la impresora no los soporta? gracias!!!!

  23. Hola amigo, me podrías apoyar?

    Me marca este error.. Warning: copy(\\GERENCIA\EPSON TM-T20II VENTAS2): failed to open stream: No such file or directory in C:\wamp64\www\ticket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372

    Estoy imprimiendo en una EPSON TM20II que si es compatible, pero la tengo conectada en RED y me marca este error, esta compartida… pero es necesario que este instalada físicamente en mi equipo para que funcione ?

    Gracias.

    1. Cambia el nombre de la impresora a uno sin espacios y más corto, asegúrate de compartirla y primero imprime una página de prueba para comprobar que esté instalada de manera correcta

    1. Hola, tienes que llamar al archivo PHP de la manera que tú quieras. Por ejemplo, podrías simplemente poner un enlace como localhost/imprimir.php y redirigir al usuario ahí, también podrías hacer una petición ajax y llamar al archivo, o ejecutarlo desde la terminal. Todo depende de tus necesidades y de lo que estés desarrollando. Saludos

    2. Lo que quería hacer es poner un botón de imprimir y especificar que imprima en una impresora secundaria, no la del predeterminada de Windows , he probado con método get post accion “archivo” pero en este caso no me funciona. Se puede llamar desde href al archivo? O hay otra manera? Gracias

    3. El nombre de la impresora se especifica al instanciar la clase; ahí puedes poner la impresora que quieras incluso si no es la predeterminada. Sobre el href, claro que sí, podrías poner algo como <a href="archivo.php" rel="nofollow">Imprimir<a> en el caso más simple; lo que abriría una pestaña que el usuario tendría que cerrar. Otra opción es con JavaScript y window.open, de este modo podrías cerrar la pestaña automáticamente (llamando a window.close).

      Como te dije antes, todo depende de cómo lo quieras hacer tú, lo único que hay que hacer es ejecutar el archivo PHP de cualquier forma.

    4. Buenas, perdone de tantas preguntas, he probado en localhost pero me sale Notice:Print connector was not finalizaded. Did you forget to close to close the print?

    5. Hola. No estás cerrando la impresora al final con $printer->close(); (bueno, en este caso $printer es el nombre de la variable que tiene la impresora). Saludos, te invito a seguirme en mis redes sociales 🙂

  24. Hola estoy implementando ésta librería, hice todos los pasos y no me sale ningún error, simplemente no me imprime nada. Hice la impresión de prueba y si me arroja la impresión de prueba. También compartí la impresora. El problema es solo que cuando llamo localhost/probarTicket/ticket.php. Solo se queda en blanco la pagina y no imprime nada.

    1. text(“Hola mundo\nParzibyte.me”);
      $printer->feed();
      $printer->cut();
      $printer->pulse();
      $printer->close();
      ?>
      El problema es que no me envía nada a la cola de impresión, cambie del puerto USB02 A LT1 y recién me envió algo a la cola de impresión, pero me sale Error-Imprimiendo.

  25. Hola! tengo una duda en cuanto a la conexión de la impresora. Yo tengo una pagina web de ventas que esta alojada en mi servidor. En cada sucursal (en distintas ubicaciones) tengo una pc con una impresora termina conectada, el proceso de venta es que los cajeros se conectan a pagina web y desde hacen su venta pero al momento de imprimir esta no sale. Hay alguna forma de poder hacer que imprima en la maquina que esta enviando el pedido y no en el servidor?

    Gracias por su tiempo

  26. amigo excelente el trabajo, realice todo los pasos y me funciono bien, pero tengo una consulta sobre el TICKET DE VENTA, como evito ese salto de linea del precio, quite el “\n” y despues coloque la aliniacion a la derecha, y me sale todo junto no se alinea como puedo solucionar eso? espero tu ayuda y de antemano gracias!!!

    1. Hola. Ese es un problema de diseño, en mi caso lo hago así porque nunca se sabe cuán largo será el nombre del producto. En caso de poner el precio hasta el final (alineado a la derecha sin salto de línea) se corre el riesgo de que se encime el texto o de que el ticket se forme de mala manera.
      En resumen, sugiero dejarlo así como está para no tener errores con nombres largos.
      Otra opción que se me ocurre sería medir cuántas letras caben horizontalmente en el ticket y a partir de ello crear una cadena propia que tenga el precio alineado… sería cosa de probar según la necesidad de cada persona.

    2. GRACIAS POR LA AYUDA AMIGO, AHORA CON ESO ACLARASTE MIS DUDAS, AHORA LO MALO ES PEDIR OTRA VEZ AYUDA.. TENGO MI IMPRESORA EPSON TM-m30 que imprime normal mediante cable USB, pero ahora quisiera saber como puedo hacer para que pueda imprimir mediante bluetooh, reconoce la impresora e imprime la prueba, en el codigo cambie el nombre de impresora y tmb coloque su mac, pero aun asi me sale error y es el de compartir la impresora pero al ir a dispositivos e impresoras, en sus propiedas no me sale compartir, como puedo solucionar… espero tu respuesta y de antemano MUCHAS GRACIAS

    3. Hola, debes buscar la forma de compartir la impresora. Lo que hace este conector es imprimir pero utilizando una impresora compartida. Tal vez investigando en el repositorio oficial puedas encontrar otro conector.

    1. Hola, la impresora debe estar conectada físicamente al servidor. Si su servidor está en la nube, la misma debería estar conectada a él. Recomiendo usar la versión para JavaScript y así evita esos problemas

  27. Buenas noches, ante todo Gracias por todos los mensajes que respondes y tratas de ayudar a todos! un genio!
    Tengo el siguiente error…
    Uncaught Error: Class ‘Escpos’ not found
    in C:\xampp\htdocs\admin\gen_com.php:97
    Stack trace:
    #0 {main}
    thrown in C:\xampp\htdocs\admin\gen_com.php on line 97

    Alguna idea del por que no encuentra la clase Escpos si en toería esta compartida la impresora y el directorio esta en esta ruta?
    C:\xampp\htdocs\admin\ticket\autoload.php y dentro del autoload le quite src al basedir

    1. Hola. No estás incluyendo el archivo autoload o el mismo está modificado. En tu comentario dices que lo modificaste, no te recomiendo eso, pon el archivo autoload original y ve paso por paso; ya que este archivo se encarga de cargar la clase que falta

  28. Hola que tal, estoy tratando de usar el código y todo funcionaba muy bien solo que de la nada comenzó con un mensaje de error y ahora no imprime, sin embargo si cambio de impresora todo bien, lo raro es que empece utilizando la impresora que ahora causa problemas
    Warning: copy(\\DESKTOP-3V8QNQL\imptick): failed to open stream: No such file or directory in C:\Users\USUARIO HP\Dropbox\kelles\php\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372

  29. Buenas. Tengo una impresora Bixolon 270 que funciona perfecto con la librería. Tengo una web app que manda a imprimir a un servidor local utilizando la IP pública de la PC del cliente. Hasta ahí todo funciona excelente, el problema está en que la web app funciona utilizándose desde unas Tablet corriendo el sistema y enviando a imprimir a la PC del cliente, me sucede que cada ciertas impresiones el diálogo de impresión me dice “Imprimiendo” pero no pasa absolutamente nada así que debo cancelar la impresión ry reiniciar la impresora para poder volver a imprimir.

    Ya verifique si era problema de impresión por la IP pública y efectivamente no es eso ya que el documento como tal si llega al XAMPP del cliente. Si me pudieras ayudar estaría increíblemente agradecido.

    Algo estuve leyendo en Internet que puede ser que la impresora no pueda compartirse en red porque da problemas, ¿haz oído de algo similar?. Igualmente quiero probar la opción de JavaScript pero no estoy seguro que pueda funcionar imprimiendo desde las tablets ya que la impresora esta instalada en la PC del cliente (a pesar de que todo esta conectado en una red local con un router)

    Estoy desesperado, gracias ante todo

    1. Hola, tienes razón con el problema de JavaScript y es que no se podrá si no la tienes instalada en tus tabletas, cosa que supongo no es posible. El problema que mencionas parece más a un problema con el sistema operativo o con la impresora, prueba con otra impresora en la misma PC,o prueba con otra PC conectando la impresora; así verás cuál es el problema.
      Saludos, espero que se solucione pronto 🙂

    2. Probare con otra impresora y a su vez tambien lo intentare con todo offline a ver si funciona. Gracias por todo

  30. Hola, primeramente excelente aportación.
    Tengo un problema, mi impresora es BIXOLON 350 Plus, ya seguí todos los pasos pero me genera este error:
    “Warning: copy(\\DESKTOP-22O3UCG\ImpresoraTermicaC): failed to open stream: No such file or directory in C:\wamp64\www\SistemaBeijingBisquets\php\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372”.
    Te comento que ya INSTALE la impresora siguiendo el tutorial que compartes, ya COMPARTÍ la misma y tengo el CODIGO igual al que pones como HOLA MUNDO, pero no encuentro cual sea la causa del error.

    Te agradecezco de antemano tu atención y espero que puedas ayudarme. Saludos cordiales

    1. Hola. Yo sé que me acabas de decir que ya instalaste y compartiste la impresora, pero, ¿estás seguro?
      El error que arroja es porque en tu computadora no está compartida la impresora llamada “ImpresoraTermicaC”, recuerda ponerle ese nombre.
      Prueba y avísame por cualquier cosa, si el error continúa prueba poniendo otro nombre más corto a la impresora.

  31. hola, primero que todo gracias por tu post, es genial, 2°, estoy usando tu post par aimprimir desde linux, pero aun no puedo hacerlo, ahora me da un error consulta: se puede usar con cups?, que nombre debiera tener la impresora? se ocupa otro conector? , si es asi , viene el la librería ??

    desde ya gracias por todo

    1. Te recomiendo que primero pruebes imprimiendo cualquier cosa a través del sistema, y más tarde pruebes con PHP. De esta forma eliminas errores y malas suposiciones 🙂

    2. si ya lo he echo, si envío el comando “lp” la impresora imprime, ( lo envio a travez de un exec por php ), lo que no me queda claro es la primera parte donde dice que hay qe utilizar el modulo usblp , atraves del comando exec imprimo , pero no puedo cortar el papel, de nuevo gracias por tus comentarios

  32. Buenas tardes tengo el mismo problema. Podrían ayudarme?? todo imprime bien hasta que intento colocar el logo. Saludos

    Fatal error: Uncaught Error: Cannot instantiate abstract class Mike42\Escpos\EscposImage in C:\Program Files\NetMake\v922\wwwroot\sc

    Codigo utilizado:

    require_once($this->Ini->path_third. ‘/Mike42/autoload.php’);
    $connector = null;
    $var = “EPSONTMT20II”; // nombre impresora

    $connector = new Mike42\Escpos\PrintConnectors\WindowsPrintConnector($var);
    $printer = new Mike42\Escpos\Printer($connector);

    $conectorimagen=new Mike42\Escpos\EscposImage;
    $logo = EscposImage::load(Mike42\src\Mike42\Escpos\resources. “/logo.png”, false);
    $printer -> setJustification(Printer::JUSTIFY_CENTER);
    $printer -> bitImage($logo);

    /* Cortar Papel */
    $printer -> cut();
    /* Close printer */
    $printer -> close();

    1. El error que tienes se debe a que estás instanciando una clase abstracta. Recuerda que una clase abstracta tiene su nombre debido a que sus métodos deben ser sobrescritos por otra.
      Tu error está en donde dice
      $conectorimagen = new Mike42\Escpos\EscposImage. No debes hacer esto, de hecho en ningún momento lo estás usando. La imagen debería cargarse bien con
      EscposImage::load()

      Sólo que debes escribir bien la ruta de la imagen, entre comillas. Si estás en Windows puedes usar algo como C:\ruta\completa\a\la\imagen.png

      O también puedes usar __DIR__

      Esto es más que nada un error de programación, no tiene nada que ver con la librería o la imagen.

  33. RICARDO SALAZAR ESTRELLA

    Muchas gracias por tu ejemplo de verdad que me sirvió bastante aunque tuve que seguir exactamente lo que tú hiciste ya que de otra manera no lo lograba… Te felicito por compartir tus conocimientos.

  34. Hola parzibyte, gracias por el tutorial, hasta ahora no entendía la libreria de Mike42. Mi duda es si este tutorial puede funcionar con una impresora HP convencional de tinta? No tengo una impresora de ticket con que probar. Gracias de antemano.

    1. Hola, en algún tiempo también estuve buscando un emulador o simulador pero no encontré nada. Me parece que tendrás que conseguir una impresora térmica. A mi parecer no son tan caras y por otro lado si consigues una te servirá para futuras pruebas, al menos en mi país las más baratas cuestan aproximadamente 35 dólares americanos y son de la marca Xprinter

    1. Hola, no entiendo bien tu pregunta pero mientras la impresora esté físicamente conectada a una computadora, dicha computadora sea alcanzable en la red y las demás computadoras clientes se conecten a ella no debería haber problemas

  35. Pingback: Imprimir ticket en impresora térmica usando Javascript - Parzibyte's blog

  36. Mauro Echeverría

    Hola gente, voy a contribuir con algo que veo que preguntan mucho referente a poder imprimir desde la impresora conectada al Cliente y cuyo procesamiento esta del lado del servidor como es lo lógico, utilizando el driver mike42/escpos-php.
    Primero deben entender que la solicitud la hace el cliente al servidor y el driver como tal esta del lado del servidor y ahí saldría la impresión, pero lo que hago es retornarle al servidor la IP del cliente utilizando esta función en PHP:

    function getRealIP() {
    if( $_SERVER[‘HTTP_X_FORWARDED_FOR’] != ” ) {
    $client_ip =
    (!empty($_SERVER[‘REMOTE_ADDR’])) ?
    $_SERVER[‘REMOTE_ADDR’]
    :
    ((!empty($_ENV[‘REMOTE_ADDR’])) ?
    $_ENV[‘REMOTE_ADDR’]
    :
    “unknown”);
    $entries = preg_split(‘/[, ]/’, $_SERVER[‘HTTP_X_FORWARDED_FOR’]);
    reset($entries);
    while (list(, $entry) = each($entries)) {
    $entry = trim($entry);
    if ( preg_match(“/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/”, $entry, $ip_list) ) {
    $private_ip = array(
    ‘/^0\./’,
    ‘/^127\.0\.0\.1/’,
    ‘/^192\.168\..*/’,
    ‘/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/’,
    ‘/^10\..*/’);
    $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);
    if ($client_ip != $found_ip) {
    $client_ip = $found_ip;
    break;
    }
    }
    }
    }
    else {
    $client_ip =
    (!empty($_SERVER[‘REMOTE_ADDR’])) ?
    $_SERVER[‘REMOTE_ADDR’]
    :
    ((!empty($_ENV[‘REMOTE_ADDR’])) ?
    $_ENV[‘REMOTE_ADDR’]
    :
    “unknown”);
    }
    return $client_ip;
    }

    Y luego mando a imprimir, pero direccionado al cliente, y en ese momento la impresión sale del lado del cliente, el código a continuación:

    text(“Hola Mundo”);
    $printer -> cut();
    $printer -> close();
    } catch (Exception $e) {
    echo $e;
    }
    ?>

    Adicionalmente deben hacer estos dos pasos del lado del cliente, en mi caso todas con Windows, ahora debes ir a:

    Punto 1:
    Panel de control
    Todos los elementos de Panel de control
    Centro de redes y recursos compartidos
    Configuración de uso compartido avanzado
    Todas las Redes
    Uso compartido con protección por contraseña
    Desactiva esa opción

    Punto 2:
    Configuración de Impresoras
    Ir a la impresora en mi caso EPSON y colocarla como predeterminada
    Compartirla solo con el nombre EPSON, si te fijas yo la invoco así //168.0.0.1/EPSON

    Y listo ya esta. Miren mi server esta en centos 7 ahi esta montado mi codigo fuente y
    mis clientes son todos windows. Y al momento me funciona sin inconvenientes. Tambien puedo hacer que una maquina en windows se convierta en un PrintServer y enviar desde muchos sitios las imprisiones
    a una sola maquia o a las que yo quiera.

    Si tienen dudas me avisan. Por cierto en lo que si tengo problemas y quiero hallar una solucion
    es que el driver no detecta cuando se acabo el papel o la tapa esta abierta, y no hay modo de controlar
    esos eventos. Si quiza me pueden ayudar en eso les estaria agradecido

    1. Hola!! tu crees que me puedas apoyar con la impresión de modo cliente servidor ? , ya que logro imprimir de manera local pero al momento de subirlo a un servidor y imprimirlo desde mi equipo no imprime , me podrías compartir tu código ? te lo agradecería mucho

    2. Hola. Si el servidor está en internet, no puedes conectarle una impresora. La misma debe estar conectada físicamente al servidor, si no, no funcionará. En ese caso mejor usa la impresión por JavaScript

    3. Hola, quiero hacer lo mismo que tú. pero la función que se llama: “getRealIP” ¿dónde la debo de poner, quién la invoca y donde envío el valor retornado por la función?

    4. Giancarlo Bautista

      Hola
      Mauro Echeverría , podrias compartir tu codigo mas completo para poder entenderlo , ayudarías mucho con ese aporte, espero tu respuesta , gracias

    1. Hola. La librería (hasta el día de hoy, según lo que he leído) no provee manera alguna de leer algún mensaje de la impresora. Tendrías que buscar la manera; se me ocurre que tal vez leyendo del puerto serial o algo así, pero PHP no es muy bueno haciendo eso.
      Espero que encuentres solución a tu problema. Te invito a que te suscribas a mi blog ingresando tu correo en la barra lateral de la derecha.

  37. HOLA QUE TAL, VEO TU ERES EL UNICO QUE TIENE BUENOS POST ACERCA DE ESTA LIBRERIA DE MIKE 42, ME FUNCIONO MUY BIEN, PERO AL MOMENTO DE INTEGRARLA EN CODEIGNITER NO TENGO RESULTADOS, CREE UN HELPER Y DENTRO DE EL COLOQUE LAS LINEAS
    require __DIR__ . ‘\..\..\autoload.php’;
    use Mike42\Escpos\Printer;
    use Mike42\Escpos\EscposImage;
    use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;

    Y EN MI CONTROLADOR CARGUE MI HELPER Y LAS LINEA PARA EL HOLA MUNDO
    PERO ME SALE ESTE ERROR

    Fatal error: Class ‘WindowsPrintConnector’ not found in C:\xampp\htdocs\Valentine\application\controllers\inicio.php on line 58

    LOS ARCHIVOS SRC Y AUTOLOAD.PHP LOS COPIE EN LA RAIZ DE MI PROYECTO
    GRACIAS ANTE MANO

    1. Hola. No estás incluyendo bien el archivo que se encarga de cargar las clases, es por ello que no se encuentra la clase que se necesita. Verifica tus rutas, te recomiendo leer acerca de dirname y __FILE__. Saludos y si siguen habiendo problemas no dudes en comentar.

  38. Christian Felipe Castrillon

    siempre me sale un error al llamar el archivo require __DIR__ . ‘/ticket/autoload.php’;

    Al implementarlo con laravel , cambia la configuracion inicial ?

    1. Cuando se trabaja con un framework, debes adaptarte a su paradigma. Me parece que en Laravel puedes instalar la librería de una manera más fácil con:
      composer require mike42/escpos-php

      Luego simplemente usa las clases, no olvides los namespaces y cosas por el estilo. Saludos.

  39. Caro amigo, ya nos hablamos sobre sobre la funcionabilidad de esta libreria, mi pregunta es si tienes alguna lietratura en tu blog en como transformar la computadora como un servidor local y si tendré sucesso en utilizar esta liberia para la impressión del ticket.
    Abrazos.

    1. Hola. Puedes convertir cualquier computadora en un servidor web. Si usas Windows puedes ver este post para instalar Apache, PHP y MySQL: https://parzibyte.me/blog/2017/12/11/configurar-instalar-php-7-apache-server-mysql-windows/

      Si usas Linux simplemente sigue un tutorial de cómo instalar LAMP. Lo único que tiene que estar instalado es lo que menciono arriba.

      Una vez instalado todo eso sólo tienes que conectar la impresora y compartirla, para después utilizarla con la librería. Saludos.

  40. Buenas noches, Muy buenos tus aportes.
    Tengo el siguiente error
    Parse error: syntax error, unexpected ‘[‘ in C:\wamp\www\prueba\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 158

    ya antes había realizado el mismo procedimiento y funcionó correctamente.
    Espero me puedas ayudar.
    *La impresora esta compartida.

    Gracias

    1. Hola, funciona con la mayoría de impresoras, pero no con cualquiera. Puedes ver la lista aquí: https://github.com/mike42/escpos-php

      Si la tuya no está en la lista, no te preocupes, tal vez funcione de igual manera. Para ello, te recomiendo imprimir una página de prueba desde el panel de control (si estás en Windows) y en caso de que la prueba sea exitosa se debería poder usar con la librería.

      Saludos.

  41. Hola!, muy buen post! me ha sido de mucha ayuda.
    ¿Se puede crear algunta tabla para que los articulos y el precio siempre queden la misma posición sin importar el largo?
    Tengo que imprimir 4 columnas: Fecha, detalle, cuota y saldo.
    Si los imprimo poniendo los espacios se ve feo, porque no siempre tienen el mismo largo.
    En la carpeta de los ejemplos salen algunas tablas pero no las entendí
    ¿Alguna idea?
    Gracias!

    1. Me parece que no hay forma de poner alguna tabla, sólo que la dibujes manualmente con símbolos como | o -, cosa que sería muy larga y tediosa. Te recomiendo alinear las cosas a la izquierda y derecha, o separar por saltos de línea y tal vez poner algunas líneas como separadores. Algo así:
      https://i.imgur.com/Li1znFH.png

      Las líneas podrías hacerlas imprimiendo muchas veces alguno de los siguientes símbolos: =, _ o –

  42. Hola, exelente post!!! Ahora una consulta, como hago para compartir la impresora a mi servidor donde esta alojado mi pagina web, no es un servidor local por eso.
    Gracias Nicolas Stagno

  43. Hola estoy intentado utilizar tus codigos… y me sale:

    Fatal error: Class ‘Mike42\Escpos\PrintConnectors\WindowsPrintConnector’ not found

    que puedo estar penando y equivocado en mi archivo?

    el inicio esta asi:
    require ‘escpos/autoload.php’;
    use Mike42\Escpos\Printer;
    use Mike42\Escpos\EscposImage;
    use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;

    1. Hola, no estás incluyendo correctamente los archivos. El error te dice que no encuentra la clase, asegúrate de hacer el include con la ruta correcta. Y si usas Composer recuerda configurar bien el autoload

    2. hice el cambio… mire como esta.:

      require __DIR__ . “/escpos/autoload.php”;
      use Mike42\Escpos\Printer;
      use Mike42\Escpos\EscposImage;
      use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;

      todavia me sigue el mismo error

    3. Si te sigue dando el mismo error es porque sigue estando mal la ruta en donde incluyes el archivo. Comparte una imagen de la estructura del directorio completo en donde están los archivos del ticket, así como el archivo en donde llamas a la impresión; sólo de esa manera puedo ayudarte.

    4. Bueno link de imagen
      http://www.jsinfoweb.com.br/tela001.jpg
      vale a pena decirte que lo estoy haciento todo online
      mi directório principal www
      la carpeta donde esta el PHP que estoy trabajando es “reformaleitura”
      adentro esta el PHP “relprint.php” en el esta el codigo. Adentro de esta carpeta “reformaleitura” esta :

      “escpos” e sigue como tus instruciones, e copiado adentro el “src” y todo su contenido y “autoload.php”

    5. Ok. La forma en la que lo estás incluyendo supone que en la carpeta reformaleitura está el directorio así:
      escpos/autoload.php

      Sin embargo, veo que es:
      escpos/src/autoload.php

      Prueba poniendo require __DIR__ . “/escpos/src/autoload.php”;

    6. Sigue imagen como pediste:
      http://www.jsinfoweb.com.br/tela003.jpg

      Informaciones adicionales que talves te sea importante, e verificado en mi servidor hosting sobre la función “php_printer.dll” en que algunos comentários veo que hay que estar activa, y el servidor hosting no puede activarla por ser compartido.
      Ye comentários a parte e visto tus explicaciones de JAVASCRIPT tambien lo voy a intentar utilizar.

    7. Sí, mejor utiliza JavaScript. Y ahora que lo pienso, no ibas a poder imprimir desde php porque la impresora debería estar conectada físicamente al servidor, pero el servidor estaría online, por lo tanto no funcionaría.

  44. Buenas noches.
    Tengo dos preguntas,

    1. si imprimo desdes mac o desde windows tengo que cambiar la linea $connector = new WindowsPrintConnector($nombre_impresora);
    Si si por cual la cambiaria. Y si esto es cierto entoces me tocaria detectar cada sistema operacional de usurio para poder configurar esa linea de manera automatica ?
    2. estoy en un mac colocando tu ejemplo uno y no me funciona, me sale un error de pagina, solo me deja de salir el error si le quito la ultima linea $printer->close(); pero entonces no me imprime nada.

    Mil y mil gracias

    1. Sí, varía dependiendo del sistema operativo. En Linux, por ejemplo, tienes que usar FilePrintConnector; o algún otro conector si la impresora está en red. En Mac me parece que al menos la interfaz USB no está soportada, así que te recomiendo que mejor veas la manera de imprimirlo desde javascript: https://parzibyte.me/blog/2017/10/17/imprimir-ticket-en-impresora-termica-usando-javascript/

      También dejo aquí el repositorio de GitHub para que leas la documentación completa: https://github.com/mike42/escpos-php

  45. Que tal, para poder realizar la impresión del logotipo, es necesario tener instalado imagik.dll ?

    Todo me ha funcionado de maravilla, solo tengo problemas para imprimir logotipo

    Saludos! y gracias por tan buen aporte!

    1. ya he instalado la extension Imagick en la pc, imprimo el mensaje de error y me sale: File “logo.png” does not exits or is not readable.

      ya he intentado diferentes rutas y colocandolo en diferentes carpetas y me arroja lo mismo.

    2. Te está indicando que no encuentra tu imagen. Pega aquí el fragmento de tu código en donde te imprimes el logo para poder ayudarte

    3. setJustification(Printer::JUSTIFY_CENTER);

      try{
      $logo = EscposImage::load(“logo.png”, false);
      $printer->bitImage($logo);
      }catch(Exception $e){/*No hacemos nada si hay error*/
      $printer -> text($e -> getMessage().”\n”);
      }

      $printer->text($encabezado);
      $printer->setJustification(Printer::JUSTIFY_LEFT);
      $printer->text($auto);
      $printer->setJustification(Printer::JUSTIFY_CENTER);
      $printer->text($pie);

      $printer->feed(3);

      $printer->cut();

      $printer->pulse();

      $printer->close();

      Esto es todo lo que tengo en mi archivo php,

    4. Ok. Supongo que tu imagen está en la misma carpeta en donde está el archivo que contiene el código que me muestras. ¿Estoy en lo correcto? Y si no es así, ¿podrías subir una captura de la estructura del directorio a imgur y pegar aquí el enlace?

    5. Si claro la imagen la tengo en la misma carpeta que mi archivo php.

      aunque he intentado colocarla en alguna otra ruta sin exito alguno.

    6. Adjunta aquí una captura de la estructura de tu directrio en donde se vea el logo y el archivo que imprime, para tener una mejor idea.

    7. No, si el ticket sale pero la imagen no, el problema es la ruta de la imagen.
      Finalmente intenta poner la ruta completa en lugar de “logo.png”, es decir, algo como “C:\la\ruta\completa\de\la\imagen.png”

    8. Por fin ha hecho la impresion del logo!!

      Creo que no me quedara mas que agregar la ruta completa.

      Te agradezco mucho tu apoyo!!

      Ahora aplico completo la impresion con php y con javascript, el otro post que haz agregado que tambien me ha sido de gran ayuda!

      Saludos y Éxito!!

    9. Si, desarrollo en codeigniter, normalmente utilizo base_url(), pero de igual modo no me ha funcionado.

      al final esta fue la solución:
      load(_DIR_.”/logo.png”, false);

      de hecho ese error me salia incluso antes de instalar la extensión imagick, por eso mi primer pregunta fue si era necesaria esa extensión

      Excelente espíritu de colaboración de tu parte, creo que nos haz salvado la existencia a muchos!

    1. Hola, en el repositorio de GitHub está la lista, pero aquí la pongo igualmente:
      3nStrat POS-08
      AURES ODP-333
      AURES ODP-500
      Bematech-4200-TH
      Bixolon SRP-350III
      Black Copper BC-85AC
      Citizen CBM1000-II
      Citizen CT-S310II
      Dapper-Geyi Q583P
      Daruma DR800
      EPOS TEP 220M
      Epson EU-T332C
      Epson FX-890 (requires feedForm() to release paper).
      Epson TM-T20
      Epson TM-T20II
      Epson TM-T70
      Epson TM-T70II
      Epson TM-T81
      Epson TM-T82II
      Epson TM-T88II
      Epson TM-T88III
      Epson TM-T88IV
      Epson TM-T88V
      Epson TM-U220
      Epson TM-U295 (requires release() to release slip).
      Epson TM-U590 and TM-U590P
      Equal (EQ-IT-001) POS-58
      Excelvan HOP-E200
      Excelvan HOP-E58
      Excelvan HOP-E801
      Excelvan ZJ-8220
      Gainscha GP-5890x (Also marketed as EC Line 5890x)
      Gainscha GP-U80300I (Also marketed as gprinter GP-U80300I)
      gprinter GP-U80160I
      Hasar HTP 250
      Metapace T-1
      Metapace T-25
      Nexa PX700
      Nyear NP100
      Okipos 80 Plus III
      Orient BTP-R580
      P-822D
      P85A-401 (make unknown)
      Rongta RP326US
      Rongta RP58-U
      Senor TP-100
      SEYPOS PRP-300 (Also marketed as TYSSO PRP-300)
      Sicar POS-80
      Silicon SP-201 / RP80USE
      SPRT SP-POS88V
      Star BSC10
      Star TSP100 ECO
      Star TSP100III FuturePRNT
      Star TSP-650
      Star TUP-592
      Venus V248T
      Xprinter F-900
      Xprinter XP-58 Series
      Xprinter XP-80C
      Xprinter XP-90
      XPrinter XP-Q20011
      Xprinter XP-Q800
      Zjiang NT-58H
      Zjiang ZJ-5870
      Zjiang ZJ-5890K
      Zjiang ZJ-5890T (Marketed as POS 5890T)

  46. Hola una pregunta y si kisiera que me escribiera la cantidad con letras segun sea el monto que vaya a pagar se podrá realizar con alguna funcion??? te agradeceria mucho tu respuesta gracias…

  47. Hola buen día, me podría ayudar a solucionar este error por favor o una alternativa que pueda tomar?

    Warning: copy(\\HotelAlameda-PC\EPSON XP-410 Series): failed to open stream: No such file or directory in C:\xampp\htdocs\AlamedaTicket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372

    Fatal error: Uncaught Exception: Failed to copy file to printer in C:\xampp\htdocs\AlamedaTicket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php:291 Stack trace: #0 C:\xampp\htdocs\AlamedaTicket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php(173): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalizeWin(‘\e@Hotel Alameda…’) #1 C:\xampp\htdocs\AlamedaTicket\ticket\src\Mike42\Escpos\Printer.php(503): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalize() #2 C:\xampp\htdocs\AlamedaTicket\index.php(41): Mike42\Escpos\Printer->close() #3 {main} thrown in C:\xampp\htdocs\AlamedaTicket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 291

    1. Renombra tu impresora, no tiene que llevar espacios ni caracteres raros. También recuerda compartirla, y primero manda una página de prueba, si la imprime, entonces el programa de PHP funcionará correctamente

  48. Ola otra vez molestandote mira lo que pasa es que kiero imprimir un codigo de barras hasta abajo de mi ticket pero realmente no se como poner el codigo. al momento de mandar a imprimir en la impresora termica

    este es mi html pero como lo puedo imprimir con la sentencia:
    $printer->text(“\n”);

    ya que si hago esto me lo imprime cono texto
    $printer->text(“img src=”Generar_CB\barcode.phptext=0123456789&size=40&codetype=Code39.\n”);

    me ayudarias bastate mil gracias

    1. La impresora no entiende HTML, sino comandos. Supongo que estás generando el código de barras con una librería de terceros, la cual devuelve una imagen.
      Esto no es necesario, ya que la misma librería puede imprimir códigos de barras, como se ve en el siguiente ejemplo: https://github.com/mike42/escpos-php/blob/development/example/barcode.php
      Si tu impresora no soporta la impresión de código de barras, pero sí puede imprimir imágenes, entonces recomiendo guardar la imagen en el directorio y luego imprimirla (como si fuera un logo) como se ve en este ejemplo: https://github.com/mike42/escpos-php/blob/development/example/graphics.php

  49. Ola una pregunta ami no me imprime el logo, como puedo hacer que se imprima un logo claro diferente al del ejemplo??? agradeceria mucho tu respues

    1. Hola. Trata de que sea una imagen que no sea tan compleja, de preferencia en blanco y negro. Y que sea cuadrada. Prueba y comenta los resultados. Un saludo.

    2. mil gracias ya me salio oye y una pregunta lo que pasa que no mando a imprimir los datos en el ticket y mando a llamar mis variables desde mi base de datos pero me los manda a traer juntos y kiero que me los separe es decir como pongo espacios entre variables

    3. Muchas gracias si de hecho ya lo intente asi mira: este es mi codigo.

      $printer->text( “%”.$dato[‘descuento’].””.”$”.$dato[‘valor’].””.”$”.$dato[‘importe’].”\n”);

      no se que esta mal. xq no me salen los espacios

    1. Si puedes imprimir desde el panel de control, claro que se puede. Es decir, si desde el panel de control imprimes una página de prueba y sale, con PHP funcionará correctamente.

      No conozco ningún emulador, supongo que es para que imprimas a algo así como un pdf sin imprimir físicamente, pero no he encontrado ninguno, lo que queda es probar directamente con la impresora.

      Busca e instala sus drivers, con eso será suficiente. Un saludo.

    2. Buenismo, si lo voy a tener que probar directamente con la impresora del cliente.
      Te agradezco entonces y te felicito por la web y que estes atento a los comentarios.
      saludos!

  50. Hola parzibyte,me que tal tu post me funciono muy bien solo tenia alguna duda en cuanto al tamano de la letra como la puedo cambiar a uno mas grande :O saludos amigo

  51. Hola, quiero imprimir cantidad, precio y descripción en una sola línea, el problema es que quiero que la cantidad se justifique a la izquierda, la descripción al centro y el precio a la derecha, el problema es que quiero que todo salga en la misma línea, como lo resuelvo?

    Gracias de antemano

    1. Podrías hacerlo concatenando las cadenas y separándolas, pero no siempre te quedarían centradas. Igual y podrías implementar un algoritmo que mida las palabras, y dependiendo a ello agregue o quite espacios entre ellas para alinearlas como lo deseas

    1. Hola, no tengo ningún ejemplo por el momento. Pero lo que quieres hacer es muy simple, llama al controlador encargado para que te dé lo que necesitas, luego simplemente incluyes al archivo que imprime y le pasas (por ejemplo) el arreglo que contendrá los productos.
      Un saludo.

  52. Hola… si deseo realizar la impresión desde una pc cliente(la impresora conectada a la pc cliente) , siendo que la impresora cliente y el servidor estan en la misma red, que configuración necesito realizar?

    1. Hola, la impresora debe estar físicamente conectada al servidor en donde
      esté corriendo PHP. Y para imprimir desde la pc cliente llamarías a la IP de la computadora que tiene conectada la impresora.
      Suponiendo que el archivo se llama imprimir.php y la ip es 192.168.1.2 entonces sería algo como 192.168.1.2/imprimir.php

      También puedes ver el otro tutorial en donde se imprime con Javascript. Un saludo.

    2. Gracias por la respuesta.

      Si realizo la impresión con javascript, como hago el corte de papel? para que no me salga un tamaño grande de papel en blanco?.

    3. Esa es la gran desventaja de imprimir con Javascript, que no corta el papel automáticamente. Pero me parece que desde Windows, en el Panel de control > Impresoras hay una opción que permite ajustar márgenes, corte de papel, etcétera. Todo mientras tengas bien los drivers.

  53. Hola Parzibyte,

    En primer lugar agraecer el tiempo que dedicas a la labor de enseñar y por otro lado tengo una pregunta que hacerte.
    Resulta que los pedidos llegan por email al cliente y a mi me gustaría que conforme reciba el pedido se imprima en una impresora de tiquets.
    El primer problema es que lo que se recibe es html y estas impresoras no imprimen tal cosa.
    Siempre el pedido se recibe por email, por lo que debería recibir un texto plano para que saliese por la impresora a través de outlook (es la única forma que encontré de que se imprimiera automáticamente y sin intervención)
    Hay alguna forma de que se pudiera recibir el pedido que no fuese por email y usando el código que muestras? o es más fácil cambiar el código del php que tengo para que se envíe un email plano y entonces que lo imprima la impresora POS?
    o…¿cómo lo harías tú?

    Gracias y un saludo

    1. Qué tal, saludos.
      Hay que partir el problema en trozos pequeños para solucionarlos por separado. Comencemos por el correo que se recibe en HTML, podemos usar strip_tags para obtener el texto puro.
      Veamos ahora el segundo problema, que es cómo hacerle saber a PHP que un correo fue recibido. Para esto, podemos ver este post (que escucha cuando un correo es recibido) https://evolt.org/incoming_mail_and_php aunque se me hace un poco complicado.
      Pero si yo estuviera en su lugar, en el correo pondría un link. Es decir, el cuerpo del correo sería algo así:
      Hola, usted ha recibido un nuevo pedido de bla bla bla bla
      Haga click aquí para imprimirlo

      Y en el link, poner algo como localhost/ticket.php?texto=todo_el_texto_del_pedido_que_desees_imprimir

      De esta manera no será tan automático pero no le cuesta nada al usuario hacer click en un link. Prueba y comenta aquí si pasa algo.

  54. hola, como se hace para poder imprimir desde el servidor Web. local me funciona bien pero al subir el proyecto e intentar imprimir, sale este error;
    No se pudo imprimir en esta impresora: Error al imprimir. Mando “smbclient ‘//sip.llamandoando.com/SAT’ -c ‘print -‘ -N” falló con el código de salida 127: sh: smbclient: command not found

    1. No se puede imprimir desde un servidor web porque se imprime del lado del servidor, no del cliente. Si quieres aprender a hacerlo desde la web usa javascript, ya hice otro post explicando el proceso

    2. lewis valenzuela

      cual es ese post en elc ual enseñas a imprimir desde javascript en una ticktera o impresora termica. Muchas gracias por el aporte

    3. Hola, hay una efectiva para imprimir sin que te salga cuadro de diálogo de impresión; lo probé con una función JS diseñada en un proyecto para imprimir recibos de venta y funciona en FireFox
      Debería funcionar con PHP también, ya que igualmente el documento de impresión generado es .HTML.

    4. Hola, qué tal. Claro, funciona, pero tienes que activar algunas funciones especiales del navegador. Y si de eso se trata, podemos embeber la app en Electron o en algo similar en donde tengamos más control nativo.
      Lo que esto busca es ser compatible con la mayoría de navegadores sin modificar nada de ellos, tanto por la seguridad como por la comodidad del usuario.
      Un saludo.

  55. Reciba un cordial saludo, estoy siguiendo los pasos tal y como están en este manual y me sale el siguiente error:

    Parse error: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING or ‘(‘ in C:\AppServ\www\probarticket\index.php on line 3
    estas son las primeras lineas, la linea 3 seria el primer use
    <?PHP
    require __DIR__ . '/ticket/autoload.php'; //Nota: si renombraste la carpeta a algo diferente de "ticket" cambia el nombre en esta línea
    use Mike42\Escpos\Printer;
    use Mike42\Escpos\EscposImage;
    use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;

    1. Ya lo solucione, era la versión del PHP no me había fijado y estaba trabajando con una versión vieja, la actualice y listo funciono bien. Muchas gracias por el aporte.

    2. Ahora mi problema es ponerlo a funcionar en un servidor dedicado, me funciono localmente pero en la web no me funciono? necesito algo adicional para que funcione en la web, en el navegador del cliente

    3. Hola, qué tal. Me da gusto que te haya funcionado. Respondiendo a tu duda: no se puede imprimir desde un servidor web, porque la impresora debe estar físicamente conectada a la computadora. Si es en localhost, perfecto. Pero si es un servidor web que, supongamos está en NY, no puedes ir hasta allá y conectar la impresora. Y aunque pudieras, la impresión saldría allá.
      Por eso este tutorial explica cómo hacerlo desde PHP. En cambio si lo quieres hacer desde el lado del cliente puedes hacerlo con Javascript: https://parzibyte.me/blog/2017/10/17/imprimir-ticket-en-impresora-termica-usando-javascript/

    1. Hola, qué tal.
      A veces pasa porque la imagen es transparente. Prueba quitándole la transparencia si es que es una PNG. Por otro lado, asegúrate de que la imagen mida 400 px de ancho y de alto.
      Tuve el mismo problema que tú y redimensionando la imagen funciona. Prueba y cuéntanos. Un saludo.

  56. Hola tengo un problema, me sale este error,
    Fatal error: Uncaught exception ‘Exception’ with message ‘Failed to print. Command “smbclient ‘//ayala.digital/POS-58’ -c ‘print -‘ -N” failed with exit code 127: sh: 1: smbclient: not found’ in /websitesData/tlalisoft/httpdocs2/_assets/ticket/src/Mike42/Escpos/PrintConnectors/WindowsPrintConnector.php:230 Stack trace: #0 /websitesData/tlalisoft/httpdocs2/_assets/ticket/src/Mike42/Escpos/PrintConnectors/WindowsPrintConnector.php(175): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalizeLinux(‘\e@\ea\x01CasaMia\nAy…’) #1 /websitesData/tlalisoft/httpdocs2/_assets/ticket/src/Mike42/Escpos/Printer.php(503): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalize() #2 /websitesData/tlalisoft/httpdocs2/sales.php(22): Mike42\Escpos\Printer->close() #3 {main} thrown in /websitesData/tlalisoft/httpdocs2/_assets/ticket/src/Mike42/Escpos/PrintConnectors/WindowsPrintConnector.php on line 230

    En un servidor local si me imprime, pero cuando quiero hacerlo desde un servidor web me tira ese error, sabres que podria ser?

    1. Hola. La impresora debe estar conectada físicamente al servidor. Si es un servidor web dudo que la puedas conectar físicamente

  57. Puedes ayudarme, a mi me sale lo siguiente:

    Warning: copy(\\DESKTOP-LAB59OB\POS-58): failed to open stream: No such file or directory in C:\xampp\htdocs\probarticket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 372

    Fatal error: Uncaught exception ‘Exception’ with message ‘Failed to copy file to printer’ in C:\xampp\htdocs\probarticket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php:291 Stack trace: #0 C:\xampp\htdocs\probarticket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php(173): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalizeWin(‘\e@Hola mundo\n\x1DV…’) #1 C:\xampp\htdocs\probarticket\ticket\src\Mike42\Escpos\Printer.php(503): Mike42\Escpos\PrintConnectors\WindowsPrintConnector->finalize() #2 C:\xampp\htdocs\probarticket\ticket.php(64): Mike42\Escpos\Printer->close() #3 {main} thrown in C:\xampp\htdocs\probarticket\ticket\src\Mike42\Escpos\PrintConnectors\WindowsPrintConnector.php on line 291

    1. Hola. Mi impresora es del mismo modelo que la tuya, e imprime de maravilla. Seguramente no la has compartido desde el panel de control de Windows. Prueba y me dices qué tal.
      Un saludo.

  58. Hola, estoy usando este proceso con una impresora Dymo 450 por USB(He probado diferentes impresoras que sean por medio de WIFI y funcionan bien), pero leyendo bien la documentacion me dio por probar con los comandos, y en la cola de impresion se queda imprimiendo y no aparece nada mas (Documento local de bajo nivel):
    * net use “\\mi-pc\DYMO450Turbo”
    * copy testfile “\\mi-pc\DYMO450Turbo”
    * del testfile

    1. Está compartida
    2. Usb no funciona
    3. Cambié el puerto a COM1 y LPT1 y al menos manda algo a la cola de impresion

    Sabes a que se puede deber esto?

    1. Si no imprime desde Panel de control > Impresoras > Imprimir página de prueba entonces el problema es entre la impresora y Windows

    2. Si, es verdad, de hecho mi sistema funciona con el metodo window.print(); pero el problema radica en que no tengo control de si se imprimio o no el documento, y requiero saberlo para tener un mayor control de ello. Si puedes ayudarme ahi, gracias!

    3. Hola. Me parece que no existe (o no lo he descubierto) un método para saber a ciencia cierta si la impresión se hizo correctamente o no, y tampoco se puede saber con la librería ni el método que mencionas.

    4. Es que lo que trato de implementar es que al momento de que realice el registro se imprima, entonces no tener opcion de cancelar la impresion. Por eso he llegado hasta acá, tratar imprimir desde PHP

    5. Ya veo. Pero las impresiones siempre pasarán por la cola de impresiones de Windows. Podrías buscar una forma de deshabilitar la cola (para que el usuario no la abra), pero aunque la encuentres, el usuario podría apagar la impresora o quitar el suministro de energía. Por eso te digo que no hay una manera 100 % confiable de saberlo.
      Otra cosa que se me ocurre es guardar un registro en una base de datos de cada vez que se imprima, y al final compararla con las impresiones que se hicieron al día; o algo así. Desconozco de qué se trata tu software, pero podrías pensar en varias maneras de comprobarlo en lugar de verificar la impresión.

    6. Si, de hecho eso es lo que debo de realizar, una comparacion entre el registro y la impresion, pero no tengo la forma de saber la segunda.

    7. Mi software, registra los datos de una persona y lo que hace es arrojar una etiqueta desde la impresora con los datos de la persona, pero, mi sistema debe de estar ligado si o si al registro, no puede cancelar la impresion, o si se cancela debo de tener un registro de ello, pero hay una gran barrera con esta impresora.

    8. Agrega un botón o algo que le pregunte al usuario si su etiqueta salió correctamente, jaja. Si pone que no, entonces la imprimes de nuevo, de lo contrario, no haces nada. Eso es lo único que se me ocurre, aunque supone que el usuario no es malicioso.

    1. Hola! Ya esta solucionado!! Solo era compartir la impresora y listo se soluciono !!Gracias por el tuto !!! Eres lo maximoooo!!! SALUDOS DESDE PERÚ!!

    2. Hola, me da gusto que haya servido.
      Resaltaré la parte en donde dice que hay que compartir la impresora jaja. Un saludo.

  59. Hola,

    La impresion se realiza automaticamente o desde un boton, necesito un ejemplo asi pero que imprima automaticamente al registrar la venta en la base de datos.

    1. La impresión se realiza cuando invocas el archivo php. Es decir, cuando te diriges a localhost/imprimir.php (o en donde sea que reside tu archivo). Puedes llamarlo con un botón usando AJAX, abrir una nueva ventana con esa ruta, o lo que tú creas más conveniente.

    1. Hola, buenos días. Si estás usando Windows deberías probar desde el panel de control > Impresoras y luego imprimir una página de prueba. Si se imprime, entonces también funcionará en php. Si no, tienes que verificar los drivers e instalación de la impresora. Normalmente se deben instalar como genéricas.

    2. Ya pude solucionar el error, habia un problema con el nombre de la impresora, y por ende no la reconocía. Pero, me ocurre lo mismo que a usted…

    1. Claro que sí. Se puede crear una función llamada imprimir_ticket o algo así, que encierre todo el proceso que se hace. Y la puedes mandar a llamar en un ciclo for, en un foreach, o como tú gustes.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *