Plugin PDF

Imprimir PDF a partir de base64

En este post voy a enseñarte cómo imprimir un PDF a partir de su representación como base64 en cualquier impresora y desde cualquier lenguaje de programación.

Vas a poder usar tu lenguaje de programación favorito para enviar un PDF (representado en base64) a cualquier impresora en el sistema de Windows.

Usaremos varias herramientas gratuitas que en conjunto permitirán la impresión de un PDF según una cadena en base 64.

Descargando herramientas

Para este tutorial vas a necesitar contar con:

  1. plugin_pdf_prod_32.exe o plugin_pdf_prod_64.exe el cual se descarga en: https://github.com/parzibyte/plugin-silent-pdf-print-examples/releases/latest
  2. PDFtoPrinter.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/base64.html

Elige tu impresora de la lista y haz clic en Imprimir, se debería imprimir un PDF a partir del base64 que hay en el campo de texto. Por defecto el campo ya está lleno y siempre puedes cambiarlo por el contenido que tú quieras imprimir.

Imprimir PDF a partir de su representación en base64

 

Imprimir PDF a partir de base64

Si la prueba anterior fue exitosa entonces vas a poder imprimir un PDF a partir de su representación en base64 enviando una petición HTTP POST a localhost:8080/base64 con un JSON que tiene las siguientes propiedades:

  • contenido: el PDF codificado como base64
  • nombreImpresora: el nombre de la impresora donde quieres imprimir ese PDF
  • serial: una cadena opcional en caso de que tengas una. No es obligatoria y el programa funcionará perfectamente sin ella, solo envíala vacía.

Veamos un ejemplo con JavaScript que tiene el mismo código que el ejemplo que puedes probar en la demostración. He encerrado todo en la función imprimir, misma que puedes invocar cuando quieras para hacer la impresión del PDF.

const imprimir = async () => {
    const respuestaHttp = await fetch("http://localhost:8080/base64", {
        method: "POST",
        body: JSON.stringify({
            nombreImpresora: "Nombre de tu impresora",
            contenido: "El pdf en base64",
            serial: "",
        })
    });
    if (respuestaHttp.status === 200) {
        alert("Impreso correctamente")
    } else {
        const mensajeDeError = await respuestaHttp.text();
        alert("Error: " + mensajeDeError)
    }
}

Obviamente este código es un ejemplo. En tu caso vas a obtener los valores desde otro lugar como una base de datos o a partir de un PDF generado con tu librería favorita.

El código completo del ejemplo lo encuentras en el repositorio de GitHub: https://github.com/parzibyte/plugin-silent-pdf-print-examples/

¿Se puede invocar desde otros lenguajes de programación?

Puedes imprimir un PDF a partir de una cadena base64 desde cualquier lenguaje de programación que permita hacer peticiones HTTP. 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 POST a la ruta http://localhost:8080/base64 enviando el JSON con las 3 propiedades descritas previamente.

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.

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/

Más adelante traeré un ejemplo para generar e imprimir un PDF a partir de HTML, teniendo el control sobre el tamaño de papel del PDF generado y obviamente la opción para imprimirlo silenciosamente desde cualquier lenguaje de programación.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.