viernes, 25 de marzo de 2011

IMPRIMIR TICKET EN IMPRESORA FISCAL - TIQUETERRA CON PHP - PASO A PASO - LADO DEL CLIENTE

-- imprimir impresora tickets php - comandos esc / pos - punto de venta  --

Vamos paso a paso amigos:



Y ahora vamos con el lado del cliente que recibe.

En nuestro caso el servidor realiza el proceso de registro a travez de AJAX lo cual el proceso de registro nos devuelve la respuesta:

mediante jquery registro un nombre:

digamos que el input del form se llama txt_nom < - input id="txt_nom" type="text" - />

entonces con jquery lo rescatamos asi:

var nom = $("#txt_nom").val();

ahora este valor lo vamos a pasar a la pagina que procesa el registro, que se llama guarda.php


1
2
3
4
5
<script>
var nom = $("#txt_nom").val();
    $.POST("guarda.php",{nom:nom},function(datos_retorno){
        //aqui resivo si es ok o error
    })
</script>

Ahora vemos el contenido de la pagina guarda



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** pagina guarda.php */

//recibo los parametros

$nom = $_POST["nom"];

$r = $objd->query("insert into tbl_reg (nombre) values ('$nom')");

    if($r)
        echo "ok";
        else
            echo "error";

?>


Ahora mas completo el script de aariba


1
2
3
4
5
6
7
8
9
10
<script>
    $.POST("guarda.php",{nom:nom},function(datos_retorno){
        //aqui resivo si es ok o error

        if(datos_retorno==true){
            $.post("http://localhost/tosch/reporte/prueba.php",{datos:"pasas algo"});
        }else
            alert("no se registro");
    })
</script>


Ahora vemos que nuestro servidor esta invocando a la pagina que esta en nuestra pc, por eso el HTTP://LOCALHOST

y la pagina prueba.php esta esto


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * @author ZEGARRA CORNE, Sergio
 * @copyright 2009
 */


if(($handle = @fopen("COM5", "w")) === FALSE){
        die('No se puedo Imprimir, Verifique su conexion con el Terminal');
    }

$dato = $_POST['datos'];  

fwrite($handle,chr(27). chr(64));//reinicio

//fwrite($handle, chr(27). chr(112). chr(48));//ABRIR EL CAJON
fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
fwrite($handle, chr(27). chr(33). chr(8));//negrita
fwrite($handle, chr(27). chr(97). chr(1));//centrado
fwrite($handle,"=================================");
fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
fwrite($handle, chr(27). chr(32). chr(3));//ESTACIO ENTRE LETRAS
fwrite($handle,"I. C. M. EL APOSENTO ALTO ");
fwrite($handle, chr(27). chr(32). chr(0));//ESTACIO ENTRE LETRAS
fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
fwrite($handle, chr(27). chr(33). chr(8));//negrita
fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
fwrite($handle,"Nacimos de Nuevo para ser grandes");
fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
fwrite($handle,"=================================");
fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
fwrite($handle,"PALABRA A IMPRIMIT: ".$dato);


fclose($handle); // cierra el fichero PRN
$salida = shell_exec('lpr COM5'); //lpr->puerto impresora, imprimir archivo PRN
?>


RECUERDEN QUE ESTA PAGINA prueba.php SE ESTA EJECUTANDO EN LA PC LOCAL, en mi caso en el DISTRITO DE ATE VITARTE, PUENTE PIEDRA, ETC.....

ESPERO QUE CON ESTO ESTE MAS CLARA LA SOLUCIÓN A SUS PROBLEMAS, y si no es así podemos ponernos en contacto, claro, siempre y cuando estén cerca, por el momento estoy  ocupado, ya que estoy en mi VI CICLO de la IDAT y tan dejando mucha tarea, pero si aun le quedan mas dudas tratare de ralizar un video paso a paso.

Su amigo para servirles Sergio Zegarra

Para los que impriman en Puerto Paralelo
http://sergiozegarracorne.blogspot.pe/2015/11/imprimir-ticket-en-puerto-paralelo.html


http://www.jsjconsultores.com/


136 comentarios:

  1. Hola, tengo varias dudas, estoy haciendo un prog para un punto de venta y debo imprimir el ticket para el cliente, el ticket tal cual lo tengo en pantalla es una consulta que llena una tabla, no es un archivo, que tengo que hacer para que la consulta (tabla) salga impresa en la ticketera fiscal

    ResponderEliminar
    Respuestas
    1. EL codigo de Sergio funciona si tu PHP corre en la PC cliente. En cambio, si tu PHP lo publicas en un proveedor de hosting y el cliente solo accede al mismo desde su PC mediante un browser, entonces vas a necesitar otro codigo como el mostrado aqui How to print raw ESC/POS commands from PHP directly to the client printer (esta en Ingles pero se entiende)

      Eliminar
  2. Trate de explicarte mejor para entenderte, y asi poder ayudarte

    Sergio Z.

    ResponderEliminar
  3. Muchas Gracias por compartir esta solucion, llevo dias buscandolo
    solamente tengo una pregunta , este script sirve para imprimir en cualquier impresora fiscal sin importar el modelo o la marca , o si es laser o matricial?
    saludos y muchas gracias nuevamente

    ResponderEliminar
  4. Que tal Sergio, jamas he tenido que imprimir con algo diferente a una epson a tinta en hoja A4 PERO en esta oportunidad necesito que el programa imprima el recibo en una tiketera y no entiendo el proceso de impresion, veo que hay que enviar codigos manualmente para producir saltos de pagina, indicar negrita etc, etc. Mi prog funciona con Php + Mysql y algo de Java, todo mi problema esta en la impresion del ticket, no se como "pasar" el resultado de mi consulta a la ticketera, osea, cuando el mozo presione "Imprimir Ticket" que debo haber hecho para que esto suceda?

    ResponderEliminar
  5. Amigo Dario, yo lo he probado en las impresoras BIXOLON que "emulan" el funcionamiento de las epson, start y otra que ahora no me acuerdo, tambien te menciono que los comandos que yo he usado son los ESP/POS de Epson, porque no he encontrado otras guias, es decir el programa diseñado con las instrucciones de EPSON los corrido en las BIXOLON (r270 y 350 plus)...

    ResponderEliminar
  6. Buenas noches, trabajo en Php + Mysql y tengo problemas para imprimir las columnas del consumo en el ticket ya que aparece todo junto, osea:
    1 Menestrone 30.00
    2 Shiraz - Malbec Copa 11.00
    1 Vegetales Oleo 0.00
    y no:
    1 Menestrone 30.00
    2 Shiraz - Malbec Copa 11.00
    1 Vegetales Oleo 0.00

    que necesito hacer para que salga asi? como en los tickets de metro o plaza vea? mi codigo es el siguiente:

    $texto = "txt.txt";
    $txt = fopen($texto, 'w') or die("can't open file");
    while {...
    $inserto = "$detalle4 \t $nombrecarta[carta] \t $detalle3 \n";
    fwrite($txt, $inserto);
    }
    fclose($txt);

    ...

    $CUENTA="txt.txt";
    $fh = fopen($CUENTA, 'r');
    $Data = fread($fh, filesize($CUENTA));
    ...
    fwrite($handle,$Data);

    ResponderEliminar
  7. Ok amigo, eso lo puedes solucionar con el mismo php, tambien tube ese problema y lo soluciones con esta funcion de php

    str_pad($producto,9,'*',STR_PAD_LEFT)

    Te explico:
    $producto: nombre
    9: es la cantidad de espacio o la anchura
    *: es el caracter con lo que se va a completar si es que el $producto sea menor
    STR_PAD_LEFT: es para completar hacia la derecha

    A tambien tienes que crear una funcion para cortar el nombre del $producto ya que en ocaciones el nombres es mas grande de lo establecido y descuadra el diseño del papel

    AL amigo de SoportePeru.Biz, disculpa por no responderte, ya que es un poco mas detallosa la explicacion, detallame algo mas...

    http://tareasyclases.com ::: (beta)
    -----------------------------------------------

    Sergio Zegarra

    ResponderEliminar
  8. Hola Sergio.

    Antes que nada, felicitarte por tu aportación. Es útil y viene muy bien explicada. Sin embargo, tengo un problema a la hora de imprimir. Es el uso del puerto USB001 para la impresion, y $salida = shell_exec('lpr USB001'). No me hace nada de nada. Tienes alguna idea de porqué puede ser?

    Un saludo y muchas gracias.

    ResponderEliminar
  9. A la verdad amigo Pablo Calvo, ese tambien era un problema que yo tenia, ya que las impresoras que yo uso tambien tienen conectores USB aunque tambien hay versiones con SERIAL y ETHERNET, con SERIAL no hay problema ninguno ya que los comandos viajan directo al puerto, pero ya que en las laptop modernas no viene dicho puerto, escogi las de USB pero tuve la gran ayuda en que las impresoras fiscales de BIXOLON tienen un emulador de USB a SERIAL(com "#") trata de bajarte este emulados ya que si es que usas impresoras EPSON debe reconocerlo, a el modelo que uso es el R270.
    Otra solucion similar es buscar un programa que te emule serial apartir del usb, ya que estos comandos son creados por PHP pero se ejecutan en el MS-DOS y este no soporta USB.

    Informame tus avanzes y asi tambien poder resolver problemas de otros amigos

    Sergio Z.

    ResponderEliminar
  10. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  11. Hola de nuevo Segio. He adquirido el DOS2USB, que consigue emular para que todo lo que se envíe a lpt1 se redirija a USB001.


    La impresora que estoy utilizando es una Star DP8340S, y uso un conversor paralelo usb. Voy a seguir investigando, pues con las órdenes de shell_exec aún no me hace nada...

    También tengo que decir que estoy trabajando con appserv (apache, mysql y php ). He leido que las impresiones no se pueden controlar si enfocas a un cliente. pero en mi caso, estoy en el servidor no?

    Un saludo Sergio.

    ResponderEliminar
  12. Gracias amigo Pablo por tus visita, bueno no he trabajado con las impresoras STAR pero voy a buscar algo de info ya que en algun momento me tocara y deseo estar preparado.

    Y no te entiendo cuando me dices < las impresoras no se pueden controlar >, amigo escribe tus dudas asi sean las mas simples o las mas dificiles de explicar, yo tratare de ayudarte con lo que he llegado a entender, ya que me gustaria implementar muchas mas cosas, pero me ponen un nuevo REPORTE cada dia y no puedo dedicarme al 100% a unas cosas que me gustaria profundicar.

    Bueno un saludo de tu amigo Sergio...

    -------------------------------------------------
    Un concejo para todos mis amigos:

    Mateo 16:26 "Porque ¿qué aprovechará al hombre, si ganare todo el mundo, y perdiere su alma? ¿O que recompensa dará el hombre por su alma?"

    Meditenlo............Gracias

    ResponderEliminar
  13. Hola de nuevo Sergio. Al final he optado por escribir todo el contenido en un txt, e imprimirlo. Pues he tenido problemas con los drivers de la Star DP8340s y Windows7.

    He solucionado el problema de las impresoras paralelo conectadas mediante cable conversor a notebooks.
    Con esta sencilla sentencia en la terminal podemos simular una conexión directa a lpt1:

    @NET USE LPT1: \\127.0.0.1\%Nombre_impresora% /PERSISTENT:YES

    Previamente, he tenido que compartir la impresora en red.

    Ahora, desde CMD puedo hacer un "type documento.txt > lpt1", y la impresion me la hace de maravilla.

    Sin embargo, te voy a pedir ayuda una vez mas.
    La orden en php: shell_exec("type midoc.txt > lpt1") no me hace absolutamente nada... he mirado en distintos foros y no he sacado nada en claro. tengo el safe mode desactivado...

    Si escribo esa sentencia en CMD se imprime...
    Si lo hago desde PHP no hace nada de nada...

    ¿Qué crees que puede ser?

    ResponderEliminar
  14. Segio! Lo he conseguido! Al fín imprimí desde php! Voy a aprovechar este comentario para explicarlo, seguro que alguien le saca provecho!

    Objetivo: Imprimir una factura/albaran/ticket mediante php a una impresora antigua con entrada paralelo. Haciendo uso de APPSERV(APACHE + PHP + MYSQL) y Windows 7.


    Filosofía : Frente a los problemas que he tenido para enviar caracteres de control a mi impresora STAR DP8340S, he optado a crear un txt con el contenido de un albaran y enviarlo directamente a imprimir mediante php respetando las dimensiones de la hoja. Además, he usado el controlador GENERIC/TEXT ONLY por defecto de windows para poder imprimir.

    Problemática: Las impresoras antiguas STAR,EPSON y otras marcas tienen la problemática de que funcionan con interfaces serial y paralelo. Yo trabajo con notebooks de 11" ( solo disponen de puertos USB). Las ordenes que usa php para la impresion son mediante CMD( símbolo de sistema), y digamos que MSDOS no se lleva bien con los puertos usb...así que tendremos que simular un puerto lpt1 virtualmente.

    Para resolver el problema :

    1º He adquirido un cable conversor paralelo-usb (10 euros mas o menos).
    2º He conectado la impresora, y he seleccionado los drivers GENERIC/TEXT ONLY para la impresión.
    3º He compartido en red la impresora con el nombre 'GEN'. ( Aunque trabajemos en 1 solo equipo, es necesario compartirla para poder hacer uso de ella mediante php)
    4º He simulado el puerto lpt1 mediante una sentencia en MSDOS :

    @NET USE LPT1: \\127.0.0.1\GEN /PERSISTENT:YES

    5ºHe modificado el ficher php.ini de manera que:
    -Safe_mode = off
    -Safe_mode_include_dir = on
    6º En services.msc (mediante regedit podeis acceder) he dado permisos de interacción a apache

    7ºHe creado un archivo (Imprime.bat) que hace la siguiente llamada :
    @type mi_archivo_a_imprimir.txt > lpt1

    9ºDesde mi página php, hago la siguiente llamada para la impresion:

    exec('c:\WINDOWS\system32\cmd.exe /c START c:/Appserv/www/autoventa/impresion/Imprime.bat');

    La impresion se realiza con éxito.


    Incluyo mi email por si alguien tiene problemas. Gracias a post como el de Sergio he conseguido resolver esta cuestión

    c a l v o c a b e z a s @ g m a i l . c o m

    Un saludo a todos

    ResponderEliminar
  15. Grande amigo Pablo, me dejaste sin palabras, veo que intentaste y conseguiste, ademas te agradesco el comentario.

    Sin mas que hablar ahora yo estoy con el siguiente problema, lo mismo, que no puedo imprimir en una impresora fiscal con puerto USB pero ahora es el S.O. LINUX (UBUNTU/CENTOS).

    Esplico un poco amigos lo que e conseguido (en especial a ti amigo Pablo, quisas entre los dos logremos tener exito):

    Primeramente he visto o he provado la buena calidad que tienen la plataforma Linux, (claro aparte del costo, y ademas esta libre de "'virus'")...lo que digo es que yo gasto una licencia de WINDOWS en varias PC que solo van a trabajar un Dia a la semana ( :[ ), por eso estoy migrando, pero eso no es todo, sino que ve probado que con una simple linea de comando puedo imprimir en la impresora fiscal desde puerto USB, si es verdad directamamente sin que tener que configurar nada ni instalar nada en el cliente (bueno siempre tengo que instalar apache para que corra PHP pero eso lo selecciono a la hora de instalar Linux).

    y digo que tengo el mismo problema porque yo envio el comando para imprimiir (tal y como lo hago en la consolo/terminal), pero en los LOG de APACHE me figura como ACCESO DENEGADO al puerto... y ese es mi problema ahora estoy tratando de solucionarlo, tengo unas ideas pero tengo que esperar el dia lunes para recien hacer las prubas ya que en mi hogar no cuento con esta dichosa impresora.

    Uno de los foros me decia que tenia que poder a apache en el grupo de los admin/root para que tenga privilegios de admin, aunque la teoria diga que eso es un peligro para la informacion (pero como no tengo nada valioso en los cliente....).

    Pero aun no he encontrado la solucion... amigos quisas alguno de ustedes ahiga observado algun tema/foro relacionado con esto..

    Bueno voy a seguir buscando y publicare mis avances.... Su amigo Sergio Z.

    P.D. Suscribance al correo que figura para que esten informados de mis avances...Gracias

    ----------------------------------------------------
    Si confesamos nuestros pecados, él es fiel y justo para perdonar nuestros pecados, y limpiarnos de toda maldad. (1ra JUAN 1:9)... en cualquir lugar esta EL para ayudarte solo levanta tu mirada al cielo y el te ayudara, es en serio.... :]
    -----------------------------------------------------

    ResponderEliminar
  16. Hola Sergio, muchísimas gracias por tus aportes! son muy buenos y los necesito. Algo te puedo ayudar con respecto a tu problema con Linux + apache + imprimir. Nunca asignes al usuario www-data o apache al grupo root/admin. Es un peligro que puede correr tu sistema. El unico usuario que puede ser root es el mismo root. Con respecto a la impresion, no se como tienes configurada la impresora. Pero si usas CUPS puedes asignar al usuario www-data o apache al grupo CUPS que es el autorizado de imprimir en la impresora. Cual seria el problema de hacer esto? pues cualquiera va a poder imprimir desde tu sitio a la impresora que este conectada. Pues el usuario de apache va a poder hacer esto. Voy a probar de ver otra forma, pero necesito conectar una impresora a mi servidor... y lo mejor seria buscar una que sea fiscal.

    Saludos Cordiales!

    ResponderEliminar
  17. tengo una duda esto solo se puede si la impresora esta conectada al servidor o se puede desde elcliente, como se abriria el puerto donde esta la impresora....

    ResponderEliminar
  18. Hola, tengo un programa de punto de venta web que funciona muy bien pero ahora el cliente ha comprado una impresora fiscal star tsp650 y no entiendo que debo hacer para imprimir alli, lo peor es que yo estoy en Colombia y mi cliente en Panamá, alguien podria ayudarme por favor?

    El software esta hecho en php con bd mysql

    ResponderEliminar
  19. Ok SANDRA, pero explicame algo de tu sistema como funciona......, ademas tu dices que el cliente a comprado una impresora fiscal, entonces en que impresora imprimia........... Ahh y la distancia creo que no importa.... puedes instalarte algunos programas de control remoto........ Espero tus explicaciones para poder ayudate......

    -----------------------------------------------
    El que no ha amado nunca a conocido a Dios, porque Dios es amor........

    ResponderEliminar
  20. Hola, gracias por responder, mi sistema es web y está desarrollado en php y mysql, el cliente imprimia en una impresora comun de punto de venta pero en Panamá es obligatorio ahora imprimir en impresoras fiscales. Yo utilizo la funcion de imprimir del internet explorer del equipo del cliente, tengo claro que ya no puedo hacer esto y debo programar cada comando de impresion desde php pero entre mas investigo mas me pierdo... me puedes ayudar? mi correo es smrro@yahoo.com

    ResponderEliminar
  21. Ok amiga SANDRA

    Mencioname que sistema usas (WIN o LINUX) y ademas que tipo de interface vaz a usar (USB / LPT / COM -SERIAL).

    Para asi poder horientarte, tambien si puedes copiar parte del codigo que usas para imprimir, quisas podamos agregar un modulo mas y con eso resvamos el inconveniente.


    ---------------------------------------------------------
    No puede el hombre recibir nada, si no le fuere dado del cielo

    ResponderEliminar
  22. Hola hermano mi nombre es Andres y mi correo es happyandres115@hotmail.com, quisiera poder imprimir en windows con una impresora que esta conectada por USB002 a traves de un sistema en php de ticket de factura; ya copie los codigos pero no me manda la impresion, agradeceria mucho tu ayuda, Dios te bendiga , espero tu respuesta.

    ResponderEliminar
  23. Amigo Andres dime que impresora es (USB / LPT / COM -SERIAL).

    Y si entendiste todo el proceso y no te imprime nada trata de cambiar esta parte


    $.post("http://localhost/tosch/reporte/prueba.php",{datos:"pasas algo"});

    por

    $.get("http://localhost/tosch/reporte/prueba.php",{datos:"pasas algo"});

    ya que algunos navegadores no lo soporte, por eso te recomiendo que uses FIREFOX ya que en los ultimos sistemas que estoy desarrollando me va de maravillas.

    Su amigo

    Sergio Z.

    ResponderEliminar
  24. Hola Sergio
    me funciona perfectamente el codigo, solamente tengo un problema con ie 8 y ie9
    estube buscando por ahi y me encontre con que ajax(con jquery) no puede hacer peticiones fuera de su propio dominio entonces me recomendaron que use ajax cross domain , de acuerdo a tu experiencia , tuviste algun problema parecido , y si es asi , como lo solucionaste , (con chrome y ff funciona bien)
    Saludos y muchas gracias por compartir tus conocimientos

    ResponderEliminar
  25. Perdon no me funciona estube haciendo pruebas en una impresora Hasar y el puerto llego a abrirlo pero despues no hace absolutamente nada.
    lo estoy probando asi pongo el codigo a ver si un alma generosa se apiada de mi y me da una mano.
    en el servidor tengo asi:
    function mandar(form)
    {
    $.ajax({
    type:'POST',
    url:'http://192.168.1.120:80/cliente.php',
    data:{hola:form.txt_nom.value,ip:form.ip.value},
    success:function(retorno)
    {
    alert(retorno)
    return false;
    }
    })
    }
    y en el cliente donde tengo la impresora lo tengo asi(en esa pc tengo instalado apache y php)
    if(($handle = @fopen("COM5", "w")) === FALSE)
    {
    die('No se pudo Imprimir, Verifique su conexion con el Terminal');
    }

    $dato = $_POST['hola'];

    fwrite($handle,chr(27). chr(64));//reinicio

    //fwrite($handle, chr(27). chr(112). chr(48));//ABRIR EL CAJON
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(33). chr(8));//negrita
    fwrite($handle, chr(27). chr(97). chr(1));//centrado
    fwrite($handle,"=================================");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle, chr(27). chr(32). chr(3));//ESTACIO ENTRE LETRAS
    fwrite($handle,"PRUEBA 1 ");
    fwrite($handle, chr(27). chr(32). chr(0));//ESTACIO ENTRE LETRAS
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(33). chr(8));//negrita
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle,"prueba 2");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle,"=================================");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle,"PALABRA A IMPRIMIR: ".$dato);


    fclose($handle); // cierra el fichero PRN
    $salida = shell_exec('lpr COM5'); //lpr->puerto impresora, imprimir archivo PRN
    estoy haciendo algo mal pero no doy con la tecla
    Saludos y Muchas gracias!!!

    ResponderEliminar
  26. Dime. DARIO ESTAS USANDO GET O POST; ademas si imprimes con localhost en una pc en tu LAN o en WAN (INTERNET)

    ResponderEliminar
  27. hola Sergio los datos los estoy enviando por POST y dentro de la misma LAN (en un post anterior puse todo el codigo que estoy usando)
    y los estoy enviando por POST ya que por GET tengo entendido que apache te limita el envio de valores.
    explico como lo estoy haciendo tengo 2 pc llamemosle servidor y cliente y en las dos tengo instalado apache y php, la impresora fiscal esta instalada en la pc cliente y desde esa misma pc llamo al archivo $.ajax({
    type:'POST',
    url:'http://192.168.1.120:80/cliente.php',
    data:{datos:form.txt_nom.value,ip:form.ip.value},
    success:function(retorno)
    {
    alert(retorno)
    return false;
    }
    })
    me llega a abrir el puerto pero nunca imprime , estoy usando exactamente el codigo que pusiste mas arriba (prueba.php)
    Saludos y Muchas gracias

    ResponderEliminar
  28. amigos no logro alinear los textos en el txt...
    de que forma puedo alinear por columna los precios uno debajo de otro sin perder la alineacion...

    a pesar de usar la funcion str_pad() como lo comentan lineas arriba... no me salen!!!
    ayudaaaaa

    ResponderEliminar
  29. Amigo Peter Developer me podrias indicar por favor en simples pasos como lograste aunque sea llegar hasta ahi ya que estoy siguiendo los pasos que dicen mas arriba y no logro hacer funcionar la impresora fiscal
    Te lo voy a agradecer un monton
    saludos!!!

    ResponderEliminar
  30. Dario este es el codigo que utilizo para imprimir la cabecera de la factura!!!!
    pero no logro cuadrarlos, que se ubiquen en la misma columna sin perder la alineacion vertical.

    ResponderEliminar
    Respuestas
    1. $nombre_archivo = 'reporteFactura.txt';
      fopen($nombre_archivo, 'a+');
      if (is_writable($nombre_archivo)) {
      if (!$handle = fopen($nombre_archivo, 'a')) {
      echo "No se puede abrir el archivo ($nombre_archivo)";
      exit;
      }
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,chr(13).chr(10));

      fwrite($handle," ".$fecha_emision);
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,str_pad(" ".$razon_soc,100,' ',STR_PAD_RIGHT));
      fwrite($handle,$serie."-".$numero);
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,str_pad(" ".$direccion,100,' ',STR_PAD_RIGHT));
      fwrite($handle,$condicion);
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,str_pad($ruc,100,' ',STR_PAD_LEFT));
      fwrite($handle,chr(13).chr(10));
      fwrite($handle,str_pad($oc,100,' ',STR_PAD_LEFT));

      Eliminar
    2. Muchas gracias amigo Peter Developer voy a probar con el codigo que me facilitaste
      Saludos!!!

      Eliminar
  31. Si tienes la aplicacion en el servidor Web, como lo solucionas amigo, ya que el server no ve la impresora, y no puedes instalar mil impresoras en el server.

    Mi problema surge con fpdf y la bixolon, ya que cuando mandas el pdf, sale , pero no se lee
    gracias por la ayuda

    ResponderEliminar
  32. Amigos, despues de tanto batallar he logrado, crear el archivo TXT desde php y ademas enviarlo automaticamente a la impresora matricial, en mi caso EPSON LX-300+ para imprimir en una factura preimpresa con el formato de cualquier otra factura.
    si desean que los ayude envienme un correo a peterccp85@gmail.com
    tratare en lo posible de ayudarlos.

    slds,

    ResponderEliminar
  33. Amigo anonimo... la Bixolon es una impresora de punto y no lograras mejorar la impresion si lo envias desde un PDF... te recomiendo busques otra solucion enviarlo desde un TXT. slds,

    ResponderEliminar
    Respuestas
    1. tambien necesito imprimir a una ticketera bixolon con php... e probado y efectivamente desde pdf sale pesimo... me podrias ayudar como mandarlo desde un txt... :S porfavor...

      Eliminar
  34. Tengo un problema parecido y he pensado en crear un .txt en el lado del cliente,este al dar click generaria una consulta y guardaria dichos resultados en un txt (ando viendo si se puede guardar del lado del cliente un .txt) y en el mismo evento al dar clik, al teminar la consulta y guarde , este llame a este archivo creado para imprimirlo en una Generic /Text Only , impresora usb, lo normal como siempre .no se si me puedan ayudar mi correo es fharid120@gmail.com. Saludos Cordiales

    ResponderEliminar
  35. Amigo Fharid que sistema operativo vaz a usar para el cliente, ademas deseo saber si va ahaber otro tipo de impresoras

    ResponderEliminar
  36. Sistema Operativo Windows, esa impresora habra en cada sucursal. hasta ahora ya hago que guarde la consulta en un .txt con el formato del ticket , pero aun no logro que imprima la ruta determinada donde se encuentra guardado el .txt

    ResponderEliminar
  37. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  38. Hola estaba usando windows 7 y usava este codigo para imprimir mis sticker
    NET USE LPR: \\COMA1\ZebraS4M /user:administrador+dominio pasword
    PRINT archivo.PRN
    NET USE LPR: /delete
    esto en un archivo.bat que con php ejecutava super facil ahora el detalle es que me pace3 a linux suse 12.1y no logro por ningun motivo hacer que mis sticker lleguen a la impresora alguien sabe como hacerlo se los agradeceria
    Gracias

    ResponderEliminar
  39. He intentado con link rel="alternate" media="print" href="version-imprimir.doc" /> pero no funciona lo he visto en http://norfipc.com/inf/javascript-imprimir-area-parte-pagina-web.html

    ResponderEliminar
  40. hola como estan, me interesa mucho este tema, debido que me lo estan pidiendo en la compañia en la que trabajo, hice lo que pablo calvo dijo y salió todo perfecto, el problema es que lo que necesito imprimir es de indole fiscal (es para facturar) y con solo mandar a imprimir las ráfagas no me es suficiente, no se si esto es posible a través de la programación Web (php y co.) o si hay una manera de realizarlo, con los comandos de la impresora, que por cierto uso bixolon y epson, si pudieran ayudarme se los agradeceria

    ResponderEliminar
  41. Hola, muy bueno lo tuyo. Todavia no lo probe con una impresora de Ticket, pero si con una epson chorro de tita.
    Les cuento como logre imprimir directamente:
    Deshabilite el puerto LPT1 en el administrador de programas.
    lo redireccione con NET USE LPT1: \\localhost\NOMBRE_de_la_impresora_compartida
    A tu codigo le cambie: COM% por LPT1 ylogre imprimir directamente en la impresora. Espero que le sirva a alguien

    ResponderEliminar
  42. Hola Sergio, espero aun estes pndt de esta página. Te comento soy estudiante de ingenieria de sistemas y tengo un proyecto para controlar la facturación hotelera con diferentes puntos de venta, pero no he logrado imprimir mis facturas en la bixolon spr 280, y en verdad solo me se manjear en PHP, me podrias explicar con un ejemplo muy sencillo la forma de imprimir desde mis POS(clientes). Cabe decir que toda la información que voy a imprimir ya la tengo en mi base de datos, solo necesito imprimirla en mi BIXOLON.
    Te agradezco de antemano.

    ResponderEliminar
  43. Hola, mi pregunta es si este codigo puede funcionar con TIKEADORAS FISCALES HASSAR, es la mas usada aqui en Argentina
    Saludos.

    ResponderEliminar
  44. AMIGOS JJ y ANONIMO

    Sobre el ejemplo sencillo es el de arriba... pero explicame mas sobre tu duda para poder ayudarte, yo tambien me demore en encontrar la forma correcta de imprimir en estas impresoras ya que si se usas como las otras impresoras que instalas sus driver y luego haces un WINDOW.PRINT()... si imprime pero muy lento (dibuja las letras y/o graficos)
    Y lo que nosotros buscamos en que imprima el texto directo y rapido... amigo JJ dime que puerto tiene tus impresoras... ya que las que yo uso son USB pero la misma BIXOLON 270 tiene un programa para emular el PUERTO COM desde USB... por eso mi programacion abre el puerto COM y ahi le envio todo los datos...

    Con respeto a alas TIKEADORAS HASSAR... tendria que ver sus comandos ESP/POS para ver si son iguales a las de las BIXOLON ya que son las unicas que tengo corriendo unos sistemas (he usado BIXOLON 270, BIXOLON 350 [papel termico], LX 300 [muy poco pero bien])... y biendo los codigos son muy similares .... dime si tu impresora emula la configuracion de otra... un ejemplo la IMPRESORA BIXOLON emula ser una EPSON... y las IMPRESORAS START tambien tienen esa opcion ... creo

    Bueno amigos les ayudare... pero quisas un poco lento ya que estoy con dos sistemas en proceso....
    Espero compartir mis conocimientos y tambien aprender de ustedes ya que en un par de meses voy a ser mi tesis para mi titulo TECNICO .... si recien tecnico (6 ciclos instituto) ... y de ahi a nivelarme con alguna UNIVERSIDAD ....

    BUENA SUERTE... AHI NOS VEMOS

    ResponderEliminar
    Respuestas
    1. No encuentro ese emulador... :( me puedes ayudar... tambien tengo una ticketera bixolon 270 ... es dificil de configurar?? :/ ojala puedas ayudarme!

      Eliminar
  45. Hola tengo una impresora EPSON T22 Series por USB, local y estoy tratando de realizar una impresion sencilla con este codigo

    if(($handle = @fopen("ARCH", "w")) === FALSE){
    die('No se puedo Imprimir, Verifique su conexion con el Terminal');
    }
    fwrite($handle,chr(27). chr(64));//reinicio
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(33). chr(8));//negrita
    fwrite($handle, chr(27). chr(97). chr(1));//centrado
    fwrite($handle,"=================================");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle, chr(27). chr(32). chr(3));//ESTACIO ENTRE LETRAS
    fwrite($handle,"Prueba");
    // cierro el archivo a imprimir
    fclose($handle);
    //imprimir
    $salida = shell_exec('USB001 ARCH');

    pero no hace nada que podria ser?
    Gracias

    ResponderEliminar
  46. Muchas gracias Sergio, ya pude imprimir, lo que me pasaba era por el "net use" aun no lo tenia redireccioando el puerto USB al lpt1, pero ya funciona perfecto. De nuevo muchas gracias y hasta la proxima.

    ResponderEliminar
    Respuestas
    1. Gracias a ti por publicar tus resultados,... pero ahora te toca ayudar a otros... asi es que publica tu solucion ... (quisas aqui :) )... Un abrazo

      Eliminar
  47. Hola soy rrigo queria saber si tienes algun codigo para imprimir con php para este modelo de impresora fiscal CR68AF

    ResponderEliminar
  48. Hola rrigo
    La verdad que desconozco ese modelo, busca en el manual, quizás existe unos códigos de ejemplo... pero dime con que programa esta funcionando el la actualidad... pégate un poco del código para ver...

    ResponderEliminar
  49. Amigo también he intentado hacer lo mismo que piensas (spooler)... pero no he tenido el tiempo para aprender un nuevo lenguaje.. digamos vb... ya que estoy ocupado en estos momentos.... otra razon es porque estoy migrando a trabajar netamente con LINUX (ya sabes por licencia y por los virus)... y ahi no se si funciones los OCX... Si sabes algo sobre los spooles, me gustaria saber... Gracias

    ResponderEliminar
  50. Amigo, tengo algunas dudas al respecto
    la primera, mi servidor esta alojado en linux y el cliente en windows existiria algun problema?.
    la segunda yo tengo que imprimir varios cupones, por lo que no se si seria mas factible primero en el servidor crear el archivo y desde el cliente simplemente enviar a imprimir con exec_shell(), bueno nose si se pueda realizar este tema.
    la tercera es que tengo que imprimir un logo de la empresa, que tendria que hacer en este caso (este logo depende de si quiere el cliente o no)

    Gracias

    ResponderEliminar
    Respuestas
    1. 1º no hay problemas... yo tambien lo uso asi

      2º Bueno yo le paso los datos del servidor por JSON al cliente... y el cliente al recibir estos datos ya genera la factura... ya que ya esta programado el modelo.

      3º Eso si es un verdadero problema... bueno x mi parte... ya que yo solo he logrado enviar texto plano... aunque se puede crear caracteres con un poco de programacion... si el logotipo no es muy complejo creo que lo puedes crear con programacion... pero se hace pixel por pixel... suerte...

      Eliminar
    2. como puedo imprimir en una impresora epson desde pho zxeveroxz. Tengo un hosting privado en internet esta en linux ayuda por favor.

      Gracias.

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

    ResponderEliminar
  52. buen aporte zxeveroxz me fue muy util. pero tengo una pregunta
    como hacen para imprimir ñ o letras acentuadas(caracteres especiales) ?

    ResponderEliminar
  53. Buenas noches, necesito que me den una orientación para imprimir ticket desde php con mysql en una impresora tickera epson.

    Mi pagina esta alojada en un servidor linux.

    Gracias por su ayuda

    ResponderEliminar
  54. Resien vuelvo de pues de tiempo, escriban sus dudas para poderles ayudar... ya sean las mismas... pero esccribanlas, ya que algunas de arriba ya tienen solucion por ustedes mismos...

    ResponderEliminar
    Respuestas
    1. Buenas noches, necesito de tus conocimientos tengo una pagina web que necesito imprimir desde el puerto LPT1. La pagina esta alojada en un servidor remoto en linux. Y las maquinas locales usan windows xp.

      Eliminar
    2. Hola! necesito imprimir en una tiketera bixolon en win xp o win 7 e probado desde una pagina web y luego desde un pdf y sale fatal(los textos)... sin embargo desde un txt si sal bien! me podrías ayudar a imprimir desde un txt o quisa debo elegir un tipo de fuente... ah y no encuentro ese emulador q mencionas para q imprima por el puerto del usb... :S ojala me ayudes... DESDE YA GRACIAS!

      Eliminar
  55. Hola!, me alegro mucho de que hayas vuelto.

    Mi pregunta mas de alguno la planteado aquí pero sigue sin respuesta aun.

    ¿La impresora necesariamente debe ir en el servidor?, ya que en mi caso contrate para mi aplicación un hosting que geográficamente podría estar en cualquier parte del mundo. La impresora necesariamente debe ir en el cliente, y en ese caso como se hace para que imprima, ¿que comando se utilizaría?

    Saludos
    y gracias por este blog que es unico en internet!

    ResponderEliminar
  56. UN SALUDO A TODO.
    tengo una bixolon 270 (TICKETERA con corte automatico)(CONECTADO A UN PUERTO USB).
    con el siguiente codigo me imprime normal (en PHP)


    pero antes en el PHP.ini
    active el ";extension=php_printer.dll"
    quitando ";" osea "extension=php_printer.dll"


    PROBLEMA:
    EL DETALLE ES QUE NO ME CORTA EL PAPEL AL TERMINAR LA IMPRESION (DEBERIA HACERLO)

    YA LLEVO 2 DIAS Y NAHA

    AYUDA...!

    ResponderEliminar
  57. BUENO EL CODIGO NO APARECIO AKI TA:

    $handle = printer_open("BIXOLON SRP-270");
    printer_write($handle, "IMPRIME TEXTO");
    printer_close($handle);

    ResponderEliminar
  58. Hola, esto es de gran ayuda, tengo una pregunta. Con esta solucion, yo tengo el server en godaddy y la impresora en varios restaurants, eso implica que en cada impresora que tengan instaladas sus impresoras tengo que agregar el archivo prueba.php y corriendo php + apache en esas computadoras. Es correcto lo que digo ?

    Y desde ya muy bueno tu aporte

    ResponderEliminar
    Respuestas
    1. En el caso de Gaguito yo hago lo siguiente: en el servidor genero un archivo de texto y le pongo una extensión especial, por ejemplo, qqq. Luego hago que la página descargue ese archivo, hasta ahi nada nuevo. En la pc cliente se debe configurar para que al descargar o abrir archivos del tipo qqq se utilice un comando como PRINT.EXE o un batch hecho a la medida. El trabajo estará en configurar las estaciones clientes pues en algunos casos las impresoras fiscales estarán conectadas a puertos lpt, en otras a COM y en otras a USB.

      Eliminar
  59. Hola Amigos!!!
    alguien seria tan amable de indicar PASO POR PASO como hacer para imprimir en una fiscal desde php y ajax
    (hay que instalar algun driver?
    de donde se consigue dicho driver?)
    estube haciendo pruebas con el codigo que dejo el amigo Sergio Zegarra pero sin resultados positivos
    Saludos Y muchas gracias

    ResponderEliminar
  60. buenas tardes trabajo con un programa basado en dos y tengo el problema que las impresoras epson lx300 que tenemos son puerto usb nada mas al igual que la pc de escritorio biene solo con puertos usb bueno la impresion lla logre con exito el problema que tengo es que en el punto de venta donde hay que ingresar datos de clientes con Ñ no muestra la Ñ en la factura fisica sino que imprime con codigo ascii pero solo para con impresoras matriciales y no con impresoras laser ya que el dos2usb permite redireccionar el puerto de impresion sin problema al usb pero como debo de configurar mi dos2usb para que me imprima la Ñ en matricial

    ResponderEliminar
  61. Tengo una impresora epson, en la cual necesito imprimir un archivo .txt generado con php a partir de los registros de una tabla en mysql, todo norma:

    la generacion del archivo .txt a partid de pahp y msql normal.
    la impresion del archivo de texto desde php normal

    el problema radica que auqnque es el archivo de texto este bien escrito al momento d eimprimir la ñ no la reconoce y piunta caracteres extraños, alguna idea como solucionar el presente impase, estoy tratando d eimprimir con php_printer, aqui la porcion de codigo:


    $fh = fopen($nombre_archivo, "rb");

    //$content = fread($fh, getRemoteFileSize($nombre_archivo));
    $content = fread($fh, filesize($nombre_archivo)); //filesize
    fclose($fh);




    printer_set_option($ph, PRINTER_MODE, "RAW");

    printer_start_doc($ph, "My Document");
    printer_start_page($ph);

    printer_write($ph, $content);

    printer_end_page($ph);
    printer_end_doc($ph);
    printer_close($ph);

    ResponderEliminar
  62. Estimado, Gracias por tu aporte!!
    if(($handle = @fopen("COM1", "w")) === FALSE){
    die('No se puedo Imprimir, Verifique su conexion con el Terminal');
    }
    Esta sentencia funciona perfectamente si tengo conectada la TMU220 al puerto local COM1.

    Como hago para imprimir a una impresora de red ( Una TMU220 conectada en otra PC ) y compartida. Por EJ: \\PC\TMU220 o \\192.168.1.100\TMU220
    Si desde la pc que esta funcionando el Apache haces DIR > \\PC\TMU220 funcionan perfectamente.

    Javier Martinez de Treviño, javiergmt@gmail.com

    Gracias Amigo!!

    ResponderEliminar
  63. Javier, te explico resumido:
    1.- Comparte la impresora en red con un nombre sin espacios ejm NOMIMP.
    2.- en el servidor donde esta el instalado el sistema hay que emular el puerto de la impresora, abres la consola de comandos(CMD) con permisos de administrador y digitas lo siguiente: NET USE LPT1 \\IP_DE_PC\NOMIMP
    presionas enter.
    3.- abres nuevamente la consola y digita lo sgte: DIR > LPT1
    esto deberia imprimirte.

    Espero esto te pueda ayudar.

    Sdlds

    PeterDeveloper
    peterccp85@gmail.com

    ResponderEliminar
  64. Me parece excelente los comentarios, pero to estoy intentadandolo con un puerto paralelo que debo cambiar en el primer código ejemplo muchas gracias

    ResponderEliminar
  65. Hola he intentado usar lo siguente:

    exec('c:\WINDOWS\System32\cmd.exe /c START c:/Appserv/www/imprime.bat');

    y no imprime nada el bat lo tengo en ese directorio y el contenido del bat es el siguiente:

    @TYPE passw.txt > LPT1

    el archivo passw.txt se encuentra en el mismo directorio que el bat.

    Por lo que veo es en la ejecución del bat, PHP no deja que se ejecute correctamente. ¿Alguien puede ayudarme?

    ResponderEliminar
  66. Hola compañero

    Espero que me puedas ayudar, tengo que hacer una impresion directa, sin que me abra el windows.open normal, el objetivo es que el cliente no seleccione la impresora ni que seleccione el numero de copias, algo asi como cuando quieres imprimir un tiket

    El ambiente es web, hecho en php.

    ResponderEliminar
  67. Hola a todos, simplemente felicitaros por vuestra aportación y a Sergio por el Blog.

    ResponderEliminar
  68. a final de cuentas y despues de tanto show, como es el codigo para la impresion desde php a una impresora alojada en el cliente?
    gracias

    ResponderEliminar
  69. Hola, soy nuevo y tambien quisiera saber como mandar a imprimir desde PHP a punto de venta, algun ejemplo sencillo que podrias aportar, gracias!!

    ResponderEliminar
  70. hola soy nuevo al igual que felix y me gustaria saber como crear e imprimir un ticket, estoy realizando un punto de venta y necesito extender un ticket al cliente, estoy utilizando una impresora EPSON TM-T20 de interfaz usb. les agradecieria mucho que pudiera apoyarme con un ejemplo sencillo de como realizarlo con php Gracias.

    ResponderEliminar
  71. Hola, pude imprimir desde php utilizando otra táctica aun así funciono jeje aunque no es lo ideal por el momento sirve, mi problema es la ejecución de la función shell_exec(); de php ya que por los permisos que tiene apache en windows bloquea la correcta ejecución

    ResponderEliminar
  72. PD: en la semana siguiente estaré haciendo la impresión con la TM-T20, espero tener el tiempo para arreglar mis problemas de ejecutar los el .bat desde PHP, cualquier cosa dejo mi correo ivan_gba@hotmail.com para compartir ideas

    ResponderEliminar
  73. Hola, tengo un problema el sistema que utilizo esta desarrollado en LAMP, y e utilizado Cups para imprimir las transacciones en las imp. matriciales de las cajas, pero ahora necesito migrar a las impresoras TMU EPSON 990- que imprimen libretas y recibos, CUPS no tiene driver para ello, que puedo hacer..

    ResponderEliminar
  74. La impresora es una Bixolon Epson TM-U950 impresora de tickets y slip matricial y necesito que pueda imprimir directamente en la matricial.

    ResponderEliminar
  75. Hola buenas tardes a todos, estoy imprimiendo en punto de venta pero no me alinea nada de lo que quiero imprimir, gracias!

    ResponderEliminar
  76. Hola estimados!

    Me gustaría saber (como comentan arriba) hacer que el server genere un .txt y al descargarlo lo abra con un PRINT.EXE o un .bat.

    Me interesa saber como hacer el PRINT.EXE o el .bat pues no tengo mucho conocimiento sobre eso. Gracias

    ResponderEliminar
  77. hola gracias por el aporte me funciona todo bn en local pero en el servidor no hace nada

    ResponderEliminar
  78. Buenas tardes a todos, les comento: las soluciones que indican las he aplicado todas a la impresora EPSON LX-350 que tiene conexion USB:

    1º He adquirido un cable conversor paralelo-usb.
    2º He conectado la impresora, y la dejo con el driver por defecto EPSON lx-350 ESC/P, porque colocándole en Generic, no funciona.
    3º He compartido en red la impresora con el nombre 'EPSON'.
    4º He simulado el puerto lpt1 mediante una sentencia en MSDOS:

    @NET USE LPT1: \\USER-PC\EPSON /PERSISTENT:YES

    5ºHe modificado el ficher php.ini de manera que:
    -Safe_mode = off
    -Safe_mode_include_dir = on
    6º En services.msc, he dado permisos de interacción a apache

    7ºMediante PHP he creado un archivo (pru.TXT) que tiene todo el doc a imprimir:

    9ºDesde mi página php, hago la siguiente llamada para la impresion:

    exec("print /D:LPT1 d:\\wamp\\www\\venta\\pru.txt");

    PERO NO IMPRIME: sale el error "No se puede inicializar el dispositivo LPT1"
    Debido a este problema decidí prestar un impresora LX-300 y con las mismas configuraciones y adaptador paralelo-usb, si imprimió.
    Pero cuando vuelvo nuevamente a la LX-350 NO IMPRIME NADA, no sé si será por la impresora, pero es nueva, así que no sé que más podría ser.
    Por favor es urgente que lo haga imprimir en la Impresora LX-350, si alguien me puede brindar alguna sugerencia.
    De antemano, muchas gracias.

    ResponderEliminar
  79. hermano disculpe pero no entiendo, necesito imprimir un archivo txt con cualquier impresora cuales son los requisitos???

    ResponderEliminar
  80. hola a todos, tengo en internet un servidor linux redhat, con un sistema de facturacion web en php y mysql , desde la estacion del cliente en windows xp y windows 7 nesecito imprimir la factura sobre un formato de factura, en una impresora matricial epson lx-300 II, con cable usb pero me imprime desfasado, letras grandes , asi le cambie el tamaÑo, pero igual , no imprime bien... en cambio en una laser si imprime bien...
    como hago para cuadrar la factura, genere un archivo pdf pero no imprime bien, genere una pagina en html y lo mando a la matricial pero igual tampoco imprime bien y se descuadra del formato.... como hago para que la impresion sea buena y no se descuadre....___??? gracias por sus respuesta.

    ResponderEliminar
  81. Buenas Tardes, estoy trabajando con una ticketera-facturadora marca BIXOLON, y de pronto ha comenzado a imprimir las letras muy pequeñitas, Por Favor como puedo hacer para agrandarlas. Gracias.

    ResponderEliminar
  82. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  83. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  84. Estimados, para impresoras USB, basta con compartirlas en red y en el script que Sergio publico en pruebas.php, basta cambiar COM5 por el recurso compartido, en mi caso es:

    if(($handle = fopen("\\\\localhost\\TMT81", "w")) === FALSE){ ...etc

    Donde TMT81 es el nombre que le di a la impresora compartida.

    Funciona de maravilla ;)

    Saludos!

    ResponderEliminar
  85. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  86. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  87. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  88. Buenas mi problema es el siguiente, primero a la hora de correr este codigo

    my_ip = $_SERVER['REMOTE_ADDR']; // Solo aplica para servidores Apache, de lo contrario tiene que establecercela
    $this->my_port = getservbyname('www', 'tcp'); //Puerto 80 por default
    }
    //Funcion que envia un comando por protococolo TCP/IP y retorna un arreglo de palabras de repuestas
    public function sendCmdTcp($cmd)
    {
    $this->array_rep = null;

    error_reporting(E_ALL);

    /* Obtener el puerto para el servicio WWW. */
    $service_port = $this->my_port;

    /* Obtener la dirección IP para el host objetivo. */
    $address = gethostbyname($this->my_ip);

    /* Crear un socket TCP/IP. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
    return "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "
    ";
    }

    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
    return "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "
    ";
    }
    $out = '';
    /*Enviamos el comando o peticion al Fiscal printer por via TCP*/
    socket_write($socket, $cmd, strlen($cmd));
    $ite = 0;
    while ($out = socket_read($socket, 2048)) {
    $this->array_rep[$ite] = $out;
    ++$ite;
    }

    socket_close($socket);

    return $this->array_rep;

    }
    }
    ?>

    pero me dice q tengo un error en el socket y no entiendo porq.

    ResponderEliminar
  89. Hola, como andan!, la verdad esta muy interesante....
    Les comento.:
    tengo una impresora fiscal Epson TM-U220AF II.... la cuestión que conecte por un cable USB, estoy utilizando windows XP... a su vez, estoy armando un sistema en PHP, la cuestión que no puedo hacer imprimir, mire muchos tutoriales, y demas no se como hacer, si alguien me puede dar una mano! el tema de configuración de la impresora con la pc por USB les agradecería!

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Si se puede amigo, yo también estuve con dolores de cabeza con este tipo de impresoras, hasta que este post me ayudo muchisimo, gracias a Sergio Zegarra por haberlo publicado y seguir ayudando a los que necesitamos orientación.

      Debes primero compartir tu impresora (te recomiendo ponerle un nombre corto al recurso de red) y luego ejecutar el comando ms-dos:

      net use lpt1: \\nombre_de_equipo\nombre_impresora_compartida /persistent:yes

      Luego ejecuta el codigo, yo hice pruebas directamente ejecutando el archivo prueba.php con este codigo en servidor local con xampp (nota cambiar COM5 por LPT1) y funciona perfectamente, espero te ayude:

      /**
      * @author ZEGARRA CORNE, Sergio
      * @copyright 2009
      */


      if(($handle = @fopen("LPT1", "w")) === FALSE){
      die('No se puedo Imprimir, Verifique su conexion con el Terminal');
      }

      $dato = $_POST['datos'];

      fwrite($handle,chr(27). chr(64));//reinicio

      //fwrite($handle, chr(27). chr(112). chr(48));//ABRIR EL CAJON
      fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
      fwrite($handle, chr(27). chr(33). chr(8));//negrita
      fwrite($handle, chr(27). chr(97). chr(1));//centrado
      fwrite($handle,"=================================");
      fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
      fwrite($handle, chr(27). chr(32). chr(3));//ESTACIO ENTRE LETRAS
      fwrite($handle," ORDEN No 1005 ");
      fwrite($handle, chr(27). chr(32). chr(0));//ESTACIO ENTRE LETRAS
      fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
      fwrite($handle, chr(27). chr(33). chr(8));//negrita
      fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
      fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
      fwrite($handle,"RESTAURANT LEGENDS SPORTS");
      fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
      fwrite($handle,"=================================");
      fwrite($handle, chr(27). chr(100). chr(3));//salto de linea
      fwrite($handle,"PALABRA A IMPRIMIT: ".$dato);
      fwrite($handle, chr(27). chr(100). chr(6));//salto de linea
      fwrite($handle, chr(29). chr(86). chr(1));//corta hoja automaticamente


      fclose($handle); // cierra el fichero PRN
      $salida = shell_exec('lpr LPT1'); //lpr->puerto impresora, imprimir archivo PRN


      Y nuevamente GRACIAS SERGIO por tu valioso aporte!

      Eliminar
  90. Hola a todos, veo que ha sido un tema bastante candente, porque los posts siguen.
    Tengo el siguiente inconveniente:
    Tengo un reporte en el servidor en Crystal Report, y quisiera poder enviarlo a imprimir a una impresora de un cliente. La impresora es una EPSON LX-300+. Normalmente cuando los reportes los envío a una impresora láser he trabajado el siguiente código que me permite exportar el Crystal a PDF y luego desde el browser envío la impresión, pero ahora al tratarse de una matricial, la impresión se ve espantosa.
    Trabajo en PHP con un COM para poder usar el objeto de Crystal.

    //objeto cristalreport
    $crapp = new COM("CrystalRuntime.Application") or die ("Error on load");
    $creport = $crapp->OpenReport("C:\\wamp\\www\\OPERACIONES\\facturas\\report\\rpFacturaNuevo03.rpt", 1);
    $oDB = $creport->Database();
    $ocDBT = $oDB->Tables();
    $oDBT = $ocDBT->Item(1);
    $creport->EnableParameterPrompting = 0;
    $creport->DiscardSavedData();
    $creport->ReadRecords();
    $creport->ParameterFields(1)->AddCurrentValue ("$vgcUsuario");
    $my_pdf = "C:\\wamp\\www\\OPERACIONES\\facturas\\report\\rpFacturaNuevo.pdf";
    $creport->ExportOptions->DiskFileName=$my_pdf;
    $creport->ExportOptions->FormatType=31;
    $creport->ExportOptions->DestinationType=1;
    $creport->Export(false);
    print "";

    He estado cambiando el código, y en vez de exportar lo imprimo, pero no funciona:

    $creport->SelectPrinter ("usbprint", "\\192.168.1.2\EPSON LX-300+", "Ne01:");
    $creport->PaperOrientation = 0;
    $creport->PrintOut(false);

    ¿Qué puede estar fallando?
    Gracias por sus aportes,

    ResponderEliminar
  91. Buenas tardes, pongamos las bases:
    - los pcs cuentan con puerto lpt1 o en su defecto usb(se utiliza un convertidor)
    - el servidor apache (el que sea appserv, xampp, etc) esta corriendo
    - el archivo a imprimir.php ya tiene el listado o texto volcado con comandos php
    - se han tomado en cuenta las medidas de seguridad (deshabilitadas para este efecto de impresion)
    siguiendo estos pasos aún no logro imprimir. alguien me pueda dar una mano??
    desde ya gracias por su atención

    Atentamente
    jef

    ResponderEliminar
    Respuestas
    1. si estas en con SO Linux tienes que dar permisos al puerto USB en este caso seria asi

      #sudo chmod -R 777 /dev/usb/lp0 ... lp0 es el uno de los puertos USB activos.. puede ser mas de 0

      En algunas versiones puede que el puerto se muestre asi: /dev/usblp0/... lo cual se usaría el mismo comando anterior para darle permiso de escritura y ejecución...

      Eliminar
  92. Buenas noches. Primero felicitar al autor (Sergio Zegarra) y a algún otro por ahi por su magnífico trabajo que me ha resultado muy útil.
    Mi problema es el siguiente:
    Imprimo bien, literales, variables, saltos de linea, negritas, tamaño de letra, etc. pero al intentar imprimir una simple ñ, á, é, í, ó, ú aparecen símbolos extraños y no hay forma de que la impresora los reconozca. He leído el manual (la parte correspondiente a las tablas de caracteres) y no consigo que se impriman correctamente... ¿Alguien tiene la solución?
    ¡Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Buenas noches y felices fiestas

      Me respondo a mí mismo:

      Hacen falta 2 instrucciones.

      1 - fwrite($handle, chr(27). chr(116). chr(16));
      2.- $variable = iconv('UTF-8','ISO-8859-1//TRANSLIT',$variable_a_convertir);

      Espero que le sirva a alguien de ayuda. :)

      Eliminar
    2. como haces para cambiar el tamaño de letra?... me seria muy util el comando para esa acción

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

    ResponderEliminar
  94. Alguien sabe los comandos de impresión en PHP para una impresora HASSAR?

    ResponderEliminar
  95. Buenas tardes, me gustaría saber como poder utilizar una impresora bixolon srp350 que tiene interfaz serie db25, con una cable db25/rj45. Saludos, Moisés.

    ResponderEliminar
  96. Ya que ejecuto el driver de la web oficial de la marca, pero me marca a elegir puerto serie(com1..4), y mi ultrabook no posee esos puertos. Las personas que me lo facilitaron tenían una instalación pc+rj45+rj45+router+rj45+db25+bixolon.

    ResponderEliminar
  97. Puedes usar un emulador de COM a USB o viceversa... las impresoras Bixolon vienen con una utilidad que emula puertos COM, es decir todo lo que envíes al puerto USB esta utilidad lo reenvia al puerto COM virtual...

    ResponderEliminar
  98. sALUDOS E ESTADO CONECTANDO UNA IMPRESORA NCR TICKET, pero no atino a impirmir. por defecto es usb, segun tu codigo genero un archivo pero alm momento de jectar el shell_exec(lpr USB)
    no me funca, podrias ayudarme

    ResponderEliminar
    Respuestas
    1. Estas en entorno linux o windows...???

      Si fuese linux seria muy facil: cat archivo_a_imprimir.txt > /dev/usb/lp0
      Claro que al /dev/usb/lp0 tienes que darle todos los persmisos para que el apache lo pueda ejecutar
      sudo chmod -R 777 /dev/usb/*

      Si es en windows puedes probar net use lpt1: \\nombre_de_equipo\nombre_impresora_compartida /persistent:yes

      Espero a verte ayudado, para mas consulta sigue escribiendo....

      Eliminar
  99. Que tal Sergio?

    Te pregunto, estos comandos que se le envian a la impresora son comandos universales?

    Cualquier impresora fiscal puede funcionar con estos comandos?

    O depende de la marca?

    Saludos

    ResponderEliminar
    Respuestas
    1. La mayoria de impresoras emulan los comandos esc de las Epson... yo he tenido problemas con los comandos de las Impresoras Star... Los comandos mas basicos y donde hay mayor informacion son los de Epson... Puedes buscar en google como comandos de esc/pos de impresoras fiscales o tiqueteras

      Eliminar
  100. Hola Sergio, gracias por compartir tus conocimientos. Tengo una consulta: Es posible mandar a imprimir una imagen específica en este tipo de impresoras? No me refiero a un logotipo que se graba en la memoria de la impresora para todas las impresiones, sino en mandar una imagen diferente en cada impresión. Tendrás idea de como hacerlo? Muchas gracias de antemano por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Aquí te dejo la clase que te puede ayudar

      /**
      * Classe per creazione di stringhe formattate
      * per essere stamapate su pos.
      *
      * @version 1.0.0
      * @author Alessandro Sarzina - Francesco Falanga
      *
      *
      * USAGE EXAMPLE:
      * $esc=new EscPos("it",858,"àèìòù€","\x7B\x7D\x7E\x7C\x60\xD5"); // initialize and select country, codepage and extra char trasformer string
      * $esc->align("c"); // central align
      * $esc->font(false,true,false,true,true); // select bold, tall and large font
      * $esc->text("TITLE TEST");
      * $esc->font();
      * $esc->align(); // left align
      * $esc->text("Text test");
      * $esc->cut(30); // 30 spaces and paper cut
      * $to_printer=$esc->out(); // get the generated string
      *
      */


      /**
      * Print a image from a file
      *
      * @param $filename string to the filename
      * @return false if an error occured
      */
      public function imageFromFile($filename){
      $img=false;
      $info = @getimagesize($filename);
      if(!$info) return false;
      switch($info[2]){
      case IMAGETYPE_GIF : $img=imagecreatefromgif($filename); break;
      case IMAGETYPE_JPEG : $img=imagecreatefromjpeg($filename); break;
      case IMAGETYPE_PNG : $img=imagecreatefrompng($filename); break;
      case IMAGETYPE_WBMP : $img=imagecreatefromwbmp($filename); break;
      case IMAGETYPE_XBM : $img=imagecreatefromwxbm($filename); break;
      }
      return image($img);
      }

      /**
      * Print a image stored in NV memory
      *
      * @param $id int image address in NV
      */
      public function imageNV($id){
      if(!is_int($id) || $id<1 || $id>255) return false;
      $this->out.="\x1C\x70".chr($id)."\x0";
      }

      /**
      * Print a image from a resource
      *
      * @param $img resource of an image (GD)
      * @return false if an error occured
      */
      public function image($img){
      if($img===false || !is_resource($img)) return false;
      $xH=floor(ceil(imagesx($img)/8)/256);
      $xL=floor(ceil(imagesx($img)/8)-$xH*256);
      $yH=floor(imagesy($img)/256);
      $yL=floor(imagesy($img)-$yH*256);
      $img_string="";
      $count=0;
      for($y=0;$y=$img_width){
      $color=0;
      }else{
      $rgb = imagecolorat($image, $x, $y);
      $r = ($rgb >> 16) & 0xFF;
      $g = ($rgb >> 8) & 0xFF;
      $b = $rgb & 0xFF;
      $gs = (($r*0.299)+($g*0.587)+($b*0.114));
      if($gs>150) $color=0;
      else $color=1;
      }
      $str=$str.$color;
      if($x%8==7) $img_string.=chr((int)bindec($str));
      $count++;
      }
      }
      $this->out.="\x1D\x76\x30\x0".chr($xL).chr($xH).chr($yL).chr($yH);
      $this->out.=$img_string;
      }


      Cuando la termine probar completamente voy a publicarlo con el uso de esta libreria para poder imprimir en impresoras termicas y/o matriciales desde php

      https://code.google.com/p/comm-alpha/source/browse/trunk/commander_alpha/php_print/test/EscPos.php?r=202

      Eliminar
  101. Hola Sergio, estoy intentando imprimir en una Epson TM U220, se conecta al puerto LPT1 de mi maquina, y con el codigo que colocas solo se puede si se conectara a COM1... Como puedo resolver ese problema de impresion? He buscado en google y según dicen es dificil xq php no es compatible con ese puerto.

    ResponderEliminar
  102. Para los que aun tengan problemas con la impresion:

    El problema que tienes es @fopen("USB001", "w")), si estas trabajando con windows no te va reconocer el puerto USB***, para dar solucion a esto hay varias formas:

    Una de ellas es tener un programa que virtualize el puerto COM5, es decir todo lo que le envies al puerto virtual COM* lo pasara al puerto USB*, el cual este puerto USB debe haber sido instalado con sus driver con el que viene la impresora...

    Otra es instalar la impresora con el driver generico TEXT/Generic, despues compartirla impresora instalada, por ejemplo "termica1", entonces el codigo quedaria asi : -- @fopen("\\localhost\\termica1", "w")) --, claro que esto solo funciona de la misma pc donde esta instalada la impresora, si desearias imprimir de otra pc seria asi: -- @fopen("\\192.168.1.123\\termica1", "w")) -- ::192.168.1.123 esto es la ip donde esta la impresora instalada::ademas para esto hay que darle algunos permisos en el firewall...

    Otra opcion que ahora yo estoy usando y es mucho mejor, estoy comprando ya las impresoras que vienen con puerto ETHERNET - RED, con esto se puede hacer que se imprima desde cualquier lugar...

    ----------------
    Ahora si usas LINUX es mucho mas rapido---

    Primero tines que dar permiso a la impresora fiscal - factura - ticket - termica:

    sergio#: sudo chmod -R 777 /dev/usb/lp0

    ya con esto tiene permiso para ser usado por cualquier usuario

    despues cambiamos el codido de la impresora a:

    -- @fopen("PRINT", "w")) -- y al final para imprimir

    shell_exec('cat PRINT > /dev/usb/lp0');

    Espero pueda ser de ayuda esta informacion para imprimir desde php en impresora de ticket desde el cliente o desde el servidor

    ResponderEliminar
  103. Buena tarde sergio,

    Estoy imprimiendo en una EPSON TMU220D, estoy tratando de imprimir una serie de logotipos pero me arroja una cantidad de caracteres, he probado con varias librerías pero no ha sido posible, habrá alguna función que codifique la imagen o la convierta en pixeles que la impresora los pueda leer y si pueda imprimir? Gracias por la atención y la ayuda

    ResponderEliminar
  104. Tengo un servidor web en Centos, y los clientes normalmente están en Windows.
    Asumo que las configuraciones solo se harán para esas PCs Windows.

    ResponderEliminar
  105. Hola a todos tengo el siguiente escenario.
    Un servidor - Centos
    1 Maquina Windows que comparte la impresora - IP:192.168.0.19 (PC1)
    1 Maquina Windows que accede a la impresora - IP:192.168.0.77 (PC2)

    A.Primero, cuando se comparte la impresora de PC1 se le nombre EPSONLX300II, pero con el puerto USB001.

    B. Luego de compartir supongo que tengo que ejecutar este código en la misma PC1. El problema que cuando lo hago me salen problemas, después de ejecutar dicho código: Error de sistema 66 o Error de sistema 5.

    NET USE LPT1: \\%COMPUTERNAME%\EPSONLX300II /persistent:yes

    C. Ya compartir la Impresora, y puedo verla desde mi PC2. Pero no puedo ejecutar el codigo y mandar a imprimir nada.

    puerto impresora, imprimir archivo PRN

    ?>

    Si alguien tiene la como solucionar esto.. favor de hacerlo llegar. En especial la parte en que ejecuto:
    NET USE LPT1: \\%COMPUTERNAME%\EPSONLX300II /persistent:yes

    Nose si esto debería ejecutar en la PC1, ya que es la que comparte la Impresora.

    Luego, en la parte de: $salida = shell_exec('lpr USB001');
    Que debería ir ya que el servidor esta en Linux..

    x)

    ResponderEliminar
  106. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  107. Aquí el código, q raro que no salio.

    if(($handle = @fopen("\\192.168.0.19\EPSONLX300II", "w")) === FALSE){
    die('No se puedo Imprimir, Verifique su conexion con el Terminal');
    }

    //$dato = $_POST['datos'];
    $datos = "(x',').l.";

    fwrite($handle,chr(27). chr(64));//reinicio

    //fwrite($handle, chr(27). chr(112). chr(48));//ABRIR EL CAJON
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(33). chr(8));//negrita
    fwrite($handle, chr(27). chr(97). chr(1));//centrado
    fwrite($handle,"=================================");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle, chr(27). chr(32). chr(3));//ESTACIO ENTRE LETRAS
    fwrite($handle," ORDEN No 1005 ");
    fwrite($handle, chr(27). chr(32). chr(0));//ESTACIO ENTRE LETRAS
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(33). chr(8));//negrita
    fwrite($handle, chr(27). chr(100). chr(0));//salto de linea VACIO
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle,"RESTAURANT LEGENDS SPORTS");
    fwrite($handle, chr(27). chr(100). chr(1));//salto de linea
    fwrite($handle,"=================================");
    fwrite($handle, chr(27). chr(100). chr(3));//salto de linea
    fwrite($handle,"PALABRA A IMPRIMIT: ".$dato);
    fwrite($handle, chr(27). chr(100). chr(6));//salto de linea
    fwrite($handle, chr(29). chr(86). chr(1));//corta hoja automaticamente


    fclose($handle); // cierra el fichero PRN
    $salida = shell_exec('lpr USB001');

    ResponderEliminar
  108. Hola he estado tratando de ajustar el contenido al imprimir un formato tipo factura o guia de despacho (Tamaño Carta) a una impresora Epson LX 300+II y no he podido ajustar. me podrían ayudar con un pequeño ejemplo de como hacerlo

    ResponderEliminar
  109. Para los que tienen problemas configurando las impresora, ingresen a esta nueva entrada que acabo de publicar, espero les ayude:

    http://sergiozegarracorne.blogspot.pe/2016/05/imprimir-factura-php-desde-windows.html

    ResponderEliminar
  110. Hola amigo, a ver si me puedes ayudar. Mis sistema genera la factura, al imprimir con una impresora de tinta (lo hace normal, respeta el tamaño deseado) pero al imprimir la misma factura en la epson LX-350 (matricial) se desconfigura hasta la orientación de la hoja pasa a horizontal.

    El pdf que se genera con la libreria tcpdf y se visualiza con el del navegador Chrome. OJO que cuando guardo la factura como un archivo *.pdf desde el visualizador del chrome y lo abro con el adobe reader e imprimo, ahi si imprime tal y como debe ser, pero cuando lo mando a imprimir directamente del chrome se deconfigura la página.

    ¿qué estoy haciendo mal?¿falta alguna libreria? o se usa otro método? espero tu ayuda y gracias

    ResponderEliminar
  111. EXCELENTE TRABAJO NO HAY NADA MAS QUE DECIR

    ResponderEliminar
  112. ¿Como mandas a la impresora de ticket USB desde PHP?
    http://informaticavidareal.blogspot.com/2017/09/impresora-ticket-pos-php-linux.html

    ResponderEliminar