Hoy vengo a presentarte un plugin que recién he creado. Se trata de un plugin para imprimir un archivo PDF de manera silenciosa, es decir, sin pedir confirmación al usuario.
Este plugin expone una API REST para que se pueda imprimir un PDF sin confirmación usando JavaScript. Basta con hacer una petición HTTP GET a la ruta del plugin enviando el nombre del PDF y el nombre de la impresora.
Lo mejor de esto es que puedes usar las impresoras virtuales que ofrece Windows, de este modo puedes hacer tus pruebas de manera ecológica.
A lo largo de este post te mostraré la documentación del plugin y todos los detalles del mismo.
Uso del plugin
El plugin debe estar ejecutándose en segundo plano siempre que quieras imprimir. Puedes ejecutarlo manualmente o colocarlo en la carpeta startup de Windows para que inicie automáticamente.
Por cierto, este plugin para imprimir un PDF de manera silenciosa no se ejecuta en una ventana, estará oculto. Para detenerlo, ve al administrador de tareas.
Sin embargo, es probable que en ocasiones se abra una ventana emergente o temporal dependiendo de las acciones (por ejemplo, si el PDF indicado no existe).
Sobre PDFToPrinter
En la misma ubicación del plugin, debe existir el archivo llamado PDFtoPrinter.exe, para esto no hay alternativa.
Este archivo no es mío, así que no puedo distribuirlo. Pero me parece que lo puedes descargar totalmente gratis, como lo indico en mi post de Impresión de PDF desde la línea de comandos.
Las impresoras
Cualquier impresora que aparezca en el panel de control de Windows es capaz de ser usada por este plugin, solo asegúrate de escribir el nombre de ellas correctamente.
De hecho este plugin puede imprimir tanto a impresoras de tinta, de tóner, térmicas (POS) o incluso impresoras virtuales.
El nombre del archivo
Para los ejemplos que voy a colocar, supondré que el archivo PDF se llama ticket.pdf. Veamos el primer caso.
Si el PDF está en la misma ubicación que el plugin
En caso de que el plugin ejecutable y el PDF estén en el mismo directorio (carpeta), debes enviar a la API el nombre del documento sin más. Por ejemplo, para este caso sería ticket.pdf
.
En caso de que el PDF esté en otra ubicación
Si el plugin está en otro directorio distinto al plugin o si te gustan las rutas absolutas, puedes indicar la ruta sin problemas. Por ejemplo, yo tengo ticket.pdf
en mi escritorio así que la ruta completa es:
C:\Users\Luis Cabrera Benito\Desktop\ticket.pdf
De este modo puedes imprimir el PDF sin importar la ubicación del mismo, siempre y cuando el plugin pueda acceder a él. Con esto me refiero a que el PDF debe estar en la misma computadora que el plugin.
Documentación de la API
Este plugin crea un servidor web en localhost:8080 y expone dos rutas; una para imprimir un PDF local y otra para imprimir un PDF remoto.
En la ruta raíz es en donde se solicita la impresión de un documento PDF indicando los siguientes parámetros en la URL:
- impresora: el nombre de la impresora, tal y como aparece en el panel de control
- nombrePdf: la ruta absoluta o el nombre del documento PDF. Si el mismo no existe, se va a mostrar una ventana emergente.
Por ejemplo, para imprimir un PDF llamado ticket.pdf
en la impresora ZJ58
, haría una petición GET a la siguiente URL:
http://localhost:8080/?nombrePdf=ticket.pdf&impresora=ZJ58
Y lo que indicaba anteriormente, si quisiera imprimir un PDF que está en otra ubicación, lo haría con una petición GET así:
http://localhost:8080/?nombrePdf=C:\Users\Luis%20Cabrera%20Benito\Desktop\ticket.pdf&impresora=ZJ58
Fíjate en que la ubicación del PDF lleva espacios pero los he remplazado por la entidad %20
. Eso se puede hacer con JavaScript en la siguiente función:
También toma en cuenta que la ruta debe llevar la antidiagonal \
por lo que si quieres indicar la ruta en el lenguaje, debes escaparla con ella misma, es decir, así: \\
. Vas a entenderlo mejor en los ejemplos.
Por cierto, la API va a regresar un código de respuesta 200 en caso de que todo vaya bien. Y un código 500 en caso de que haya un error (si hay un error, el mismo estará en el cuerpo de respuesta).
Quiero aclarar que aunque la API regrese una respuesta 200, si la impresora no existe o hay algún error interno, esto no se va a reportar. El caso más común es cuando la impresora no existe; los demás casos están controlados.
Imprimiendo PDF remoto de internet por URL
Como te has dado cuenta, hasta este momento te enseñé cómo imprimir un PDF local. Pero puedes imprimir un PDF que esté en tu hosting o en un sitio de internet.
Por ejemplo, para imprimir un PDF de internet que está en https://parzibyte.github.io/cv/assets/cv_LuisCabreraBenito.pdf en la impresora Microsoft Print to PDF
, haría una petición GET a la siguiente URL:
http://localhost:8080/url?impresora=Microsoft%20Print%20to%20PDF&urlPdf=https://parzibyte.github.io/cv/assets/cv_LuisCabreraBenito.pdf
Fíjate en que ahora la petición se hace a localhost:8080/url ya que cuando se hace a localhost:8080/ es para imprimir un PDF local. Los parámetros son impresora
indicando el nombre de la impresora y urlPdf
que indica la URL del PDF que se imprime.
Por poner otro ejemplo, si quisiera imprimir un PDF que está en localhost/archivos/mi_pdf.pdf en la impresora POS58 haría una petición a la siguiente URL:
http://localhost:8080/url?impresora=POS58&urlPdf=localhost/archivos/mi_pdf.pdf
Nota importante: no importa el sitio o dominio en donde esté el PDF que se va a imprimir de manera silenciosa desde la nube.
Lo único que es importante es que el mismo esté disponible de manera pública (que cualquiera que visite esa URL tenga acceso al mismo) ya que internamente el plugin va a descargarlo y luego imprimirlo; todo esto de manera silenciosa.
Plugin gratuito para demostración
He creado una versión para que puedas probar el plugin, ya sea en los ejemplos o con tu propio código. Esta versión sirve para probar la impresión local o la impresión a través de una URL. Puedes descargarla de: https://github.com/parzibyte/plugin-silent-pdf-print-examples/releases/tag/v1
Tiene ciertas limitaciones, ya que en modo local solo va a imprimir el archivo llamado ticket.pdf que yo proporciono, mismo que debe estar en el mismo lugar que el plugin (puedes descargarlo desde aquí).
Por otro lado también puedes probar la impresión a través de la URL, pero solo va a imprimir el PDF de la siguiente URL: https://parzibyte.github.io/plugin-silent-pdf-print-examples/ticket.pdf
Obviamente cuando obtengas la versión completa de pago podrás imprimir cualquier PDF de cualquier URL o en cualquier ubicación.
Obtención del plugin full – Descarga
El plugin no es open source ni gratuito; tiene un costo de 25 USD. Si quieres obtenerlo primero prueba la versión de demostración, luego realiza el pago de 25 USD en los métodos listados aquí y envíame un mensaje.
Por el momento solo es compatible con Windows. Obviamente los ejemplos no funcionarán si no cuentas con el plugin (puedes usar el de demostración, listado arriba), pero una vez que lo tengas y esté ejecutándose, puedes probarlos.
Ejemplos
Voy a comenzar a explicar los ejemplos. Recuerda que puedes probarlos desde este enlace, y ver el código fuente del repositorio en este enlace.
Ejemplo 1
Veamos el primer ejemplo. En este caso suponemos que el archivo PDF (ticketx.pdf
) está en el mismo directorio que el plugin. El código queda así:
Estamos haciendo la petición en la línea 50, y manejando la respuesta en la línea 51.
Ejemplo 2: valores proporcionados por el usuario
Si quieres que el usuario pueda indicar los valores como la impresora y el nombre o ruta del PDF puedes hacerlo, aquí un ejemplo:
Ejemplo 3: ruta absoluta de PDF
Si quieres indicar el nombre del PDF como ruta absoluta (en caso de que no se encuentre en el mismo directorio que el plugin) entonces recuerda escapar las backslash. Aquí el ejemplo:
El escape de la secuencia que menciono está en la línea 47, fíjate bien en que, debido a que las rutas de Windows se indican con \
, debo escapar este carácter con \\
. Además, también estoy usando la función que reemplaza los espacios, pues mi ruta tiene espacios.
Ejemplo 4: PDF de URL
Aquí te muestro un ejemplo para imprimir un PDF a través de su URL:
Errores comunes
A continuación presento una lista de errores comunes que pueden aparecer al usar el plugin.
- open archivo.pdf: Access is denied – Es porque el plugin no puede leer el archivo o porque el plugin no puede crear un archivo (seguramente es por falta de permisos, intente mover el plugin de ubicación y/o ejecutarlo como administrador)
- PDFtoPrinter.exe: executable file not found in %PATH% – No ha copiado el archivo PDFtoPrinter.exe junto al plugin. Ambos deben estar en la misma carpeta.
Conclusión
En resumen, simplemente descarga el archivo de PDFtoPrinter.exe, contáctame para obtener el plugin, coloca ambos archivos en el mismo directorio y ejecuta el plugin, ya sea al iniciar Windows o manualmente.
Con los ejemplos y la API es más que suficiente para comprender el funcionamiento, pero igualmente te dejo un vídeo en YouTube:
Por cierto, también tengo otro plugin para imprimir a impresoras térmicas POS.
6 Comentarios
rafael · diciembre 13, 2021 a las 4:07 pm
Hola , quiero comprar el plugin, cuál es el procedimiento?
parzibyte · diciembre 13, 2021 a las 6:00 pm
Vuelva a leer el post, hay un apartado sobre la obtención del mismo
FIDEL · diciembre 10, 2021 a las 11:39 am
necesito imprimir el ticket desde php, tu plugin se le puede pasar como parametro el nombre del archivo desde php y este lo busque en servidor de cpanel, porque ahi quedan los ticket como archivo. espero tu respuesta…gracias
parzibyte · diciembre 10, 2021 a las 12:20 pm
Si el PDF está en una URL pública y accesible desde internet, sí
FIDEL · diciembre 11, 2021 a las 10:29 pm
la idea es que no sea manual que al terminar que realizar la venta se imprima el voucher en la impresora, o tu crees que me puedes ayudar ahi hablamos la parte economica.
parzibyte · diciembre 12, 2021 a las 8:18 pm
Sí, puede imprimir automáticamente invocando al plugin con JavaScript una vez que haya terminado la venta