En este post te mostraré cómo imprimir en red local usando mi plugin para impresión en impresoras térmicas desde JavaScript.
Te enseñaré a saltarte las limitaciones de seguridad del navegador para poder invocar http desde https en cualquier lenguaje de programación y plataforma.
Explicando el problema
Lo que se quiere lograr es imprimir desde un dispositivo a una impresora que está conectada a otra computadora, y esa computadora está ejecutando el plugin además de encontrarse en la misma red local que el primero.
Vamos a suponer (para todo el tutorial) que la IP de la computadora que tiene la impresora y el plugin es la 192.168.1.55
El problema es que con las recientes actualizaciones de los navegadores no se puede invocar a una IP desde un sitio seguro, al menos que la IP tenga https.
Si esto no existiera, entonces podríamos cambiar la URL del plugin a 192.168.1.55:8000
y podríamos mandar la impresión ahí. Pero como no es posible debemos buscar alternativas.
Solución
Lo que podemos hacer es usar al mismo plugin como proxy. De este modo no vamos a invocar a una IP, sino a localhost y le vamos a indicar al plugin que envíe la solicitud a otro plugin indicado por la IP.
De este modo el sitio web del primer dispositivo va a invocar a localhost y no a una IP desconocida; la parte “insegura” la hará el plugin, pues el mismo reenviará la información a la red local y no le va a importar si tiene o no tiene https.
Apartado técnico
Ahora que ya expliqué la solución, veamos cómo aplicarlo. El plugin ya lleva incorporado el reenvío en la ruta reenviar
que reenvía la información a otro sitio (indicado en la variable GET host).
Con esto puedes obtener las impresoras térmicas en red y también imprimir en red.
El conector ya tiene los métodos:
obtenerImpresorasRemotas
: recibe la URL del plugin local y la URL del plugin al que se envía. Por ejemplo, el primer argumento sería http://localhost:8000
y el segundo sería http://192.168.1.55/impresoras
imprimirEnImpresoraRemota
: recibe el nombre de la impresora y la URL del plugin al que se enviará esa impresión. Por ejemplo, el primer argumento sería ZJ-58
y el segundo sería http://192.168.1.55/imprimir
Veamos un ejemplo que ya está en el repositorio. Si queremos imprimir:
Y si queremos obtener las impresoras remotas:
Nota: recuerda que en el caso de imprimirEnImpresoraRemota
no se indica la URL del plugin local porque ese debe ser enviado al momento de crear la instancia de ConectorPluginV3.
Especificación HTTP
Puedes usar lo visto aquí en cualquier plataforma y lenguaje de programación. Por ejemplo, enviar una impresión desde Windows a Raspberry Pi.
Y puedes hacerlo con JavaScript, Java, Python, C#, etcétera. Al final el plugin es un servidor HTTP.
Para reenviar la información haz una petición POST o GET a la URL del plugin /reenviar pasándole la variable host.
Por ejemplo, para obtener las impresoras en red, internamente el conector de JavaScript invocará a:
GET http://localhost:8000/reenviar?host=http://192.168.1.55:8000/impresoras
Y para imprimir:
POST http://localhost:8000/reenviar?host=http://192.168.1.55:8000/imprimir
Conclusión
Resumiendo, el plugin tal y como está ya sirve como proxy y como ayudante de impresión en impresoras térmicas. Funciona igual ya sea gratuito o con licencia.
Por si no sabes de qué hablé en todo este post te recomiendo ver los detalles del plugin.
Me funciono, solo que me imprimeparzibyte.me/blog no logro quitarselo, se que el credito es tuyo, pero como puedo omitirlo para mi proyecto?
Si quiere remover el pie de página mire aquí: https://parzibyte.me/blog/2022/10/02/contratar-licencia-para-plugin-impresora-termica-v3/
Te deje un mail, quiero solicitarte una asistencia pero no recibi una repuesta. Dime cómo puedo contactarte directamente así realizó el pago correspondiente a la consultoría . Gracias
Hola. Gracias por sus comentarios. Si tiene alguna consulta con gusto lo atiendo en https://parzibyte.me/#contacto
Saludos!
Hola, tengo un error de ‘Failed to fech’ al Imprimir_y_reenviar. Tengo los plugin funcionando en cada PC y con sus impresoras compartidas y funcionando. El código es el mismo que el del ejemplo, probe el otro ejemplo de mandar con nombre de impresora y si funciona. Sera que debo generar un certificado para que no me de el error a la petición fetch? Podrías ayudarme por favor
Hola. Gracias por sus comentarios. Si tiene alguna consulta con gusto lo atiendo en https://parzibyte.me/#contacto
Saludos!