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!!!!