Como imprimir en impresora fiscal o de puntos de venta con php y como no! con Kumbiaphp!!

6,695 views
Skip to first unread message

Iván Meléndez

unread,
Nov 24, 2011, 9:51:44 PM11/24/11
to kum...@googlegroups.com
Hola a todos!

El día de hoy les vengo a aportar mi "how to" para poder imprimir en las impresoras de puntos de venta o fiscales.  Después de día y medio de lucha y batalla en contra de utilizar soluciones de Microsoft (archivos vbs y demás), he podido realizar impresiones de manera normal y satisfactorias con php puro en una Epson MT-U220PD mediante cable usb bajo un ambiente Windows.

Caso:
Imprimir tiquetes de un aplicativo almacenado en un hosting X.

Problema:
La impresión se debe realizar el cliente (algo obvio cuando se trabaja bajo un ambiente Cliente/Servidor), pero en este caso el servidor no se encuentra en el equipo cliente.

Idea:
El servidor genera un archivo con extensión .php que al abrir se ejecute con "php" instalado previamente en el cliente, éste crea un archivo con los parámetros para la impresión que se ejecuta con ms-dos.

Solución: (Advertencia, algunas procedimientos se realizan para facilitar mi explicación)
1. Desinstalar todo antivirus. (al menos con el avast no me funcionaba)
2. Descargar e instalar php en en cliente. http://windows.php.net/download/ (descargar el instalador .msi.. testeado con php 5.3.8).
3. Al instalar la impresora ésta se debe compartir. Hay que tener en cuenta el nombre que se le asigna, ejemplo: 220
4. Instalar DOS-to-USB el cual nos permite hacer el puente entre USB y LPT http://www.dos2usb.com/download.htm (no recuerdo si esto me funcionó del todo pero de todas maneras lo hice)
5. Abrir una consola de MS-DOS y ejecutar la siguiente instrucción:

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

Ejemplo:

net use lpt1: \\127.0.0.1\220 /persistent:yes

6. Si nos aparece algún error debemos revisar el antivirus (a mí no me dejaba hasta que lo desinstalé) y/o firewall
7. Ya en el lado del servidor tenemos que generar una vista con kumbiaphp la cual nos creará un archivo en php descargable, con los parámetros correctos para que se ejecute en el cliente cuando se descargue:

Ejemplo:

<?php

//Ruta donde se almacena el archivo
$path = dirname(APP_PATH) . '/public/files/planillas/';
//Nombre del archivo
$name = 'Planilla-'.$planilla->id.'.php';
//Ruta y nombre completo
$file = $path.$name;
//En mi caso el archivo en ocasiones cambia de estado, por eso lo elimino
if(is_file($file)) {   
    exec("rm -rf $file");
}
//Abro un archivo nuevo
$new_file = @fopen($file, 'w+');
//Si falla
if($new_file == false){ 
  echo("No se ha podido generar el archivo."); 
  exit();
}  
//Insertamos los parámetros
fwrite($new_file,'<?php'.PHP_EOL);
fwrite($new_file,'$file="impress.prn";'.PHP_EOL);
fwrite($new_file,'if(($handle = fopen($file, "w")) === FALSE) { die("No se puedo Imprimir, Verifique su conexion con el Terminal"); }'.PHP_EOL);   
fwrite($new_file,'fwrite($handle, chr(27). chr(64));//->Reinicializa la impresion, esto hay que hacerlo siempre al inicio.'.PHP_EOL);
fwrite($new_file,'fwrite($handle, chr(27). chr(97). chr(1));//->Centro'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "Hola".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, chr(27). chr(97). chr(0)); //->Izquierda'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "ALINEADO A LA IZQUIERDA".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, chr(27). chr(97). chr(2)); //->Derecha'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "ALINEADO A LA DERECHA".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, chr(27). chr(97). chr(1));//->Centro'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "=================================".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fwrite($handle, "".PHP_EOL);'.PHP_EOL);
fwrite($new_file,'fclose($handle); // cierra el archivo'.PHP_EOL);
fwrite($new_file,'shell_exec("type $file>lpt1");'.PHP_EOL); //Esta línea se puede cambiar dependiendo del sistema operativo
fwrite($new_file,'?>'.PHP_EOL);
//Cerramos el archivo
fclose($new_file);
//Lo volvemos a abrir para calcular el tamaño y el contenido
$fp = fopen($file,"rb");
$size = filesize($file);
$file_content = fread($fp, $size);
fclose($fp);

//Cambiamos los header de tal manera que el archivo que se envía sea un ejecutable de php :-)
header("Content-Type: application/x-httdp-php");
header('Content-Length: '. $size);
header('Content-disposition: inline; filename= '.$name);
//Mandamos el contenido
print ($file_content);

8. Una vez que el usuario presiona el botón "imprimir" del aplicativo, éste genera un archivo que se descarga, el usuario le da la opción de "abrir" y selecciona que lo abre con php, es decir, le da examinar y va a C:\PHP\php.exe o al lugar donde se instaló php en el cliente.

9. Al abrir el archivo con php, este en el cliente genera otro archivo que contiene los parámetros de la impresión y lo ejecuta mediante ms-dos.

10. La impresión se realiza satisfactoriamente!!!


Adjunto la evidencia y espero que les sirva de ayuda!

PD: Esta solución se encuentra realizada en windows xp... bajo Ubuntu no he podido hacer funcionar la impresora :( ...

Saludos desde Colombia! y larga vida a PHP y KumbiaPHP!!!!


Iván Meléndez

unread,
Nov 24, 2011, 9:59:38 PM11/24/11
to kum...@googlegroups.com
Se me olvidó adjuntar la evidencia! XD
2011-11-24-214903.jpg

Cristhian Lombana

unread,
Nov 24, 2011, 11:06:46 PM11/24/11
to kum...@googlegroups.com
excelente..

El 24 de noviembre de 2011 21:59, Iván Meléndez <argo...@gmail.com> escribió:
Se me olvidó adjuntar la evidencia! XD

--
Viva KumbiaPHP Framework!
http://www.kumbiaphp.com/
Ha recibido este mensaje porque está suscrito a Grupo "KumbiaPHP Framework" de Grupos de Google.
Para obtener más opciones, visita este grupo en http://groups.google.com/group/kumbia?hl=es.



--
Ing. Cristhian Lombana
Especialista en Ingeniería de Software
Docente Universidad Mariana
clom...@umariana.edu.co
crif...@gmail.com
Tel. 3002979691

fastandfurious

unread,
Nov 25, 2011, 9:29:32 AM11/25/11
to KumbiaPHP Framework
Gracias por compartir la solución Ivan.

Pero no queda la seguridad vulnerable de esa forma?.

On 25 nov, 00:06, Cristhian Lombana <crife...@gmail.com> wrote:
> excelente..
>

> El 24 de noviembre de 2011 21:59, Iván Meléndez <argord...@gmail.com>escribió:
>
> > Se me olvidó adjuntar la evidencia! XD
>
> >  --
> > Viva KumbiaPHP Framework!
> >http://www.kumbiaphp.com/
> > Ha recibido este mensaje porque está suscrito a Grupo "KumbiaPHP
> > Framework" de Grupos de Google.
> > Para obtener más opciones, visita este grupo en
> >http://groups.google.com/group/kumbia?hl=es.
>
> --
> Ing. Cristhian Lombana
> Especialista en Ingeniería de Software
> Docente Universidad Mariana

> clomb...@umariana.edu.co
> crife...@gmail.com
> Tel. 3002979691

Iván Meléndez

unread,
Nov 25, 2011, 2:49:45 PM11/25/11
to kum...@googlegroups.com
Gracias!... La seguridad no la veo comprometida debido a que el servidor genera un archivo con los parámetros de la impresión nada mas... el cliente lo que hace es ejecutarlo con CLI de php...  Este tipo de soluciones es para clientes de aplicativos, pues he visto que muchos generan es un .vbs, pero de todas maneras queda la inquietud... espero que alguien tenga otros conceptos diferentes a los mios para poder buscar otra solución real con php...

Iván Meléndez

unread,
Nov 25, 2011, 3:01:35 PM11/25/11
to kum...@googlegroups.com
Otra cosa que me acabo de dar cuenta... es necesario que el archivo que genere el servidor ejecute la siguiente instrucción en el cliente:

net use ltp1: \\127.0.0.1\nombre_impresora

Henry Stivens

unread,
Nov 25, 2011, 4:48:07 PM11/25/11
to kum...@googlegroups.com
Hola,

Me pregunto ¿Cual es la difirencia entre abrir una ventana y darle Ctrl + P para que aparezca el cuadro de dialgo e imprima? ¿Hay algo especial con este tipo de impresoras?

Gracias.

2011/11/25 Iván Meléndez <argo...@gmail.com>
Gracias!... La seguridad no la veo comprometida debido a que el servidor genera un archivo con los parámetros de la impresión nada mas... el cliente lo que hace es ejecutarlo con CLI de php...  Este tipo de soluciones es para clientes de aplicativos, pues he visto que muchos generan es un .vbs, pero de todas maneras queda la inquietud... espero que alguien tenga otros conceptos diferentes a los mios para poder buscar otra solución real con php...

--
Viva KumbiaPHP Framework!
http://www.kumbiaphp.com/
Ha recibido este mensaje porque está suscrito a Grupo "KumbiaPHP Framework" de Grupos de Google.
Para obtener más opciones, visita este grupo en http://groups.google.com/group/kumbia?hl=es.



--
Henry Stivens Adarme Muñoz


Iván Meléndez

unread,
Nov 25, 2011, 8:31:29 PM11/25/11
to kum...@googlegroups.com
La primera prueba que se realizó fue la de imprimir como tu dices Henry, el problema es que ni dándole el tamaño de la hoja al <body> o al <div> contenedor se imprime correctamente... debido a esa falla no se pudo imprimir satisfactoriamente en dichas impresoras...

Henry Stivens

unread,
Nov 25, 2011, 8:58:51 PM11/25/11
to kum...@googlegroups.com
Bueno yo tambien hago impresiones en una EPSOM MTU220p (creo que ese el modelo) y lo que hice fue configurar las propiedades de impresion, disminuyendo la margen al mínimo y que no imprima el numero de página, ni el titulo, ni la URL.

Pero es bueno el dato, y gracias por compartirlo :)

2011/11/25 Iván Meléndez <argo...@gmail.com>
La primera prueba que se realizó fue la de imprimir como tu dices Henry, el problema es que ni dándole el tamaño de la hoja al <body> o al <div> contenedor se imprime correctamente... debido a esa falla no se pudo imprimir satisfactoriamente en dichas impresoras...

--
Viva KumbiaPHP Framework!
http://www.kumbiaphp.com/
Ha recibido este mensaje porque está suscrito a Grupo "KumbiaPHP Framework" de Grupos de Google.
Para obtener más opciones, visita este grupo en http://groups.google.com/group/kumbia?hl=es.
Reply all
Reply to author
Forward
0 new messages