En este artículo se presenta una guía para imprimir un PDF a partir de una URL pública. Mientras se pueda acceder al PDF desde cualquier lugar, vas a poder imprimirlo en cualquier impresora usando tu lenguaje de programación y framework favorito.
No se va a mostrar ningún cuadro de confirmación ni de selección de impresora, todo será automático, directo y totalmente configurable.
Vamos a usar algunas herramientas gratuitas que nos permitirán imprimir un PDF alojado en internet, tu página web, una ip en la red local o incluso en localhost.
El ejemplo presentado en el post utiliza JavaScript, pero puedes imprimirlo desde Java, C#, Python, PHP y cualquier lenguaje que permita hacer peticiones HTTP.
Descargando herramientas
Para este tutorial vas a necesitar contar con:
plugin_pdf_prod_32.exe
oplugin_pdf_prod_64.exe
el cual se descarga en: https://github.com/parzibyte/plugin-silent-pdf-print-examples/releases/latestPDFtoPrinter.exe
el cual se descarga en: https://mendelson.org/pdftoprinter.html o en https://github.com/emendelson/pdftoprinter/blob/main/PDFtoPrinter.exe?raw=true
Nota: ninguna de las herramientas contiene malware, aunque los antivirus o sistemas lo detecten como tal. Es tu responsabilidad obligar al sistema a confiar en los programas y de ser necesario agregarlos a las excepciones.
También he notado que en ocasiones el navegador bloquea la descarga; de nuevo, es tu responsabilidad forzarla.
Una vez descargados, ejecuta plugin_pdf_prod_32.exe
o plugin_pdf_prod_64.exe
y deja a PDFtoPrinter.exe
en el mismo directorio donde se encuentra el archivo que has ejecutado.
Prueba rápida
Para hacer una prueba rápida, abre tu navegador en http://localhost:8080/version y debe aparecer:
{"version":"0.3","plataforma":"Desktop PDF","sistemaOperativo":"windows"}
Si no te aparece ese mensaje exacto, asegúrate de haber ejecutado el plugin. Te recomiendo revisar todo de nuevo, ya que si no aparece ese mensaje no podrás imprimir el documento.
También fíjate que en plataforma debe decir Desktop PDF, ya que tengo otros plugins y si bien funcionan, no tienen que ver con este tutorial específico.
Demostración
Si ya estás ejecutando el plugin y has descargado ambas herramientas, entonces puedes probar la demostración sin salir de tu navegador.
Ingresa al siguiente ejemplo: https://parzibyte.github.io/plugin-silent-pdf-print-examples/pdf_internet.html
Elige tu impresora de la lista y haz clic en Imprimir, se debería imprimir un PDF a partir de la URL que hay en el campo de texto.
Por defecto el campo ya está lleno con una URL a un PDF que yo he creado y que está expuesto públicamente, pero siempre puedes cambiar ese valor.
Cuando pruebes el ejemplo vas a notar que el PDF de internet se imprime correctamente en la impresora que hayas seleccionado. Así de fácil es imprimir un PDF a partir de una URL pública.
El código completo lo puedes encontrar en: https://github.com/parzibyte/plugin-silent-pdf-print-examples/blob/main/pdf_internet.html
Imprimir PDF de internet
Ya has probado el ejemplo y revisado el código, ahora déjame explicarte lo más importante para imprimir un PDF alojado en tu hosting o en la red local.
Tienes que hacer una petición HTTP de tipo GET a la URL http://localhost:8080/url
enviando los siguientes parámetros:
urlPdf
: cadena que indica la URL completa y absoluta de la ubicación del PDFimpresora
: cadena que indica el nombre de la impresora donde se va a imprimir el PDF descargado de internet
La petición puede ser hecha con cualquier lenguaje de programación. Yo lo he ilustrado con JavaScript y el código queda así:
const imprimir = async () => {
$estado.textContent = "Imprimiendo...";
// Estos parámetros podrían venir de cualquier lugar
const urlPDF = "http://url.del.pdf";
const nombreImpresora = "nombre de tu impresora";
const url = `http://localhost:8080/url?urlPdf=${urlPDF}&impresora=${nombreImpresora}`;
// Hacer petición...
try {
const respuesta = await fetch(url);
// Si la respuesta es OK, entonces todo fue bien
if (respuesta.status === 200) {
$estado.textContent = "Impreso correctamente (salvo que se haya indicado un error por parte de PDFtoPrinter)";
console.log("Impresión OK");
} else {
// Si no, decodificamos el mensaje para ver el error
const mensaje = await respuesta.json();
$estado.textContent = "Error imprimiendo: " + mensaje;
console.log("Error: " + mensaje);
}
} catch (error) {
$estado.textContent = "Error haciendo petición. Asegúrese de que el plugin se está ejecutando: " + error;
console.log("Error: " + error);
}
}
¿Se puede invocar desde otros lenguajes de programación?
Puedes imprimir un PDF a partir de una URL desde cualquier lenguaje de programación que permita hacer peticiones HTTP (sin importar la herramienta usada para generar el PDF).
Cualquier lenguaje moderno puede hacerlo, por ahora se me ocurre JavaScript, PHP, Golang, C#, Java, Python e incluso C con libcurl.
Lo único que tienes que hacer es una petición de tipo GET a la ruta http://localhost:8080/url
enviando las 2 propiedades directamente en la URL.
Nota: si tienes una aplicación en un servidor que no es local y accedes a ella a través del navegador web, será necesario usar la versión JavaScript del lado del cliente. No puedes acceder a archivos del cliente desde un servidor.
Solución de errores
Si hay algún error, el plugin te lo hará saber. Te dejo con una lista de posibles errores y su solución (aunque la misma ya está en el mismo mensaje).
Recuerda que los mensajes de error podrían variar ligeramente.
- “fork/exec PDFtoPrinter.exe: The system cannot find the file specified.”: El ejecutable PDFtoPrinter no está en la misma ubicación que el plugin
- “error decodificando base64: illegal base64 data at input byte 2120”: El contenido en base64 no es una cadena base64 correctamente formada. Revisa que sea válida
- Printer name “Impresora” not found or argument “Impresora” is invalid: la impresora en la que intentas imprimir no existe.
- “Read: xRefTable failed: pdfcpu: can’t find last xref section”: el PDF que intentas imprimir no es compatible con el plugin, ya sea porque estás enviado una base64 de algo que no es un PDF o de una versión de un PDF que no es compatible con el plugin. Asegúrate de que el PDF está codificado como base64 y su codificación es correcta.
- La lista de impresoras no carga o está vacía: no estás ejecutando el plugin, debes ejecutarlo para que se pueda cargar la lista. Asegúrate de ejecutar el plugin y después refresca la página.
Más ejemplos
En mi blog he escrito sobre cómo imprimir PDF usando este plugin. Puedes revisar los ejemplos en la siguiente categoría: Plugin PDF.
También tengo algunos ejemplos para imprimir un PDF según su ubicación local y también cómo imprimir un PDF de internet: https://parzibyte.me/blog/2020/12/07/plugin-imprimir-pdf-manera-silenciosa-javascript/