Cómo decodificar Base64 a PDF
- Pega la cadena en Base64 o data URI. Funciona una URI completa
data:application/pdf;base64,…, y también los saltos de línea, las comillas alrededor, el Base64 URL-safe (-y_) y el relleno=ausente. Para una cadena larga guardada en un archivo, usa Abrir archivo .txt o suelta el archivo en el cuadro; todo lo que pase de 4 MB se decodifica sin mostrarse en el área de texto. - La vista previa se abre bajo los botones. La decodificación empieza al pegar; desmarca En vivo si prefieres pulsar tú Decodificar.
- Revisa el Nombre de archivo. Empieza como
decoded, pero toma el nombre de un parámetroname=de la data URI o del archivo de texto que abriste:invoice.pdf.b64.txtse convierte eninvoice.pdf. - Pulsa Descargar archivo. El enlace ábrelo en una pestaña nueva bajo la vista previa muestra el mismo PDF a tamaño completo.
Al abrir la página se carga un PDF de ejemplo, para que veas cómo es un resultado correcto antes de pegar el tuyo.
De dónde salen los PDF en Base64
JSON no puede transportar bytes en bruto, así que los servicios que devuelven documentos mediante una API JSON los envían como una cadena Base64, a menudo en un campo llamado content, document, file o label.
- Las API de etiquetas y logística devuelven la etiqueta de envío imprimible como un PDF en Base64. La misma petición a menudo puede producir ZPL o PNG según un parámetro de formato, así que un campo «PDF» no siempre es un PDF (consulta la tabla más abajo).
- Los servicios de firma electrónica devuelven el documento firmado, y con frecuencia un certificado de auditoría aparte, como Base64 en la respuesta de finalización o en el webhook.
- Las facturas electrónicas en formato UBL XML incrustan una copia en PDF legible en un elemento como
<cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="INV-1001.pdf">. Copia el texto entre las etiquetas; el atributofilenamete dice qué escribir en Nombre de archivo. - En el código fuente de un correo, un PDF adjunto es una parte MIME con
Content-Transfer-Encoding: base64y líneas de 76 caracteres. Pega solo el bloque codificado, o abre el mensaje entero en el decodificador EML, que lista todos los adjuntos. Base64 en el correo explica la estructura. - Los documentos guardados en columnas BLOB de bases de datos suelen exportarse como texto.
encode(data, 'base64')de PostgreSQL yTO_BASE64()de MySQL o MariaDB insertan un salto de línea cada 76 caracteres; el decodificador los ignora.
Para una respuesta JSON con varios campos codificados, decodificar Base64 dentro de JSON los encuentra y decodifica todos de una vez. Para el sentido contrario, de un archivo PDF a una cadena, usa PDF a Base64.
Qué muestra la vista previa
| Campo | De dónde sale |
|---|---|
| Versión de PDF | La línea de encabezado, por ejemplo %PDF-1.7 |
| Páginas | Se cuentan los objetos de página del archivo (ver más abajo) |
| Título | El título de la información del documento, cuando está guardado como texto plano |
| Cifrado | Aparece cuando el archivo tiene un diccionario de cifrado: una contraseña para abrirlo o solo restricciones de permisos |
| SHA-256 | Hash de los bytes decodificados. Compáralo con sha256sum invoice.pdf en el lado del remitente para demostrar que el archivo llegó intacto |
La vista previa es el propio visor de PDF de tu navegador, que muestra los bytes decodificados desde una URL blob: local. Chrome, Edge, Firefox y Safari de escritorio lo muestran incrustado. Se queda en blanco si el navegador está configurado para descargar los PDF en lugar de abrirlos (Chrome: Configuración, Privacidad y seguridad, Configuración de sitios, Configuración de contenido adicional, Documentos PDF; Firefox: Ajustes, General, Aplicaciones, Portable Document Format), y muchos navegadores móviles no pueden mostrar un PDF dentro de una página. En esos casos ábrelo en una pestaña nueva o Descargar archivo siguen funcionando, y la lista de información sobre la vista previa se rellena igualmente.
Cómo se cuentan las páginas
La herramienta no renderiza el PDF para contar las páginas. Cuenta los objetos de página (/Type /Page) en los primeros 32 MB del archivo. Si no se ve ninguno, lee la entrada /Count del árbol de páginas, y si también está oculta, muestra desconocido. Hay dos situaciones en las que el número difiere del que da el visor:
- Demasiadas páginas. Un PDF editado, anotado o firmado después de crearse suele guardarse de forma incremental: las páginas modificadas se añaden como objetos nuevos y las versiones antiguas siguen en el archivo. En un archivo de prueba con 2 páginas y una página reescrita, el recuento es 3.
- Desconocido. Desde PDF 1.5, los objetos pueden empaquetarse en flujos de objetos comprimidos, y entonces ni los objetos de página ni el árbol de páginas se pueden leer sin descomprimirlos.
Cuando no coinciden, el número de páginas correcto es el del visor.
Cuando el resultado no es un PDF
Si los bytes decodificados son otra cosa, una nota sobre los campos dice qué se encontró, por ejemplo «Esto parece HTML, no PDF.», con un botón Descargar como .html. El principio del Base64 suele explicar qué pasó:
| El Base64 empieza por | Qué tienes |
|---|---|
JVBERi0 | Un PDF (%PDF-) |
SlZCRVJpMH | Un PDF codificado dos veces: el Base64 de JVBERi0… |
H4sI | Datos comprimidos con gzip |
PCFET0NUWVBF, PCFkb2N0eXBl, PGh0bWw | Una página HTML, normalmente de error o de inicio de sesión |
eyJ | JSON, a menudo un mensaje de error como {"error":… |
XlhB | Una etiqueta ZPL (^XA) para impresoras térmicas |
iVBORw0KGgo | Una imagen PNG |
Con una cadena codificada dos veces o con datos gzip, la herramienta muestra una segunda nota con Decodificar de nuevo, que sustituye la entrada por la capa interior; Atrás vuelve a lo que pegaste. Con un archivo dañado o no reconocido, la nota dice «Esto no parece PDF» e indica el tipo detectado, y la extensión se queda en .pdf para que puedas descargar los bytes de todos modos y probar con otro lector.
Los errores previos a la decodificación tienen sus propias causas:
- Los escapes de un JSON en bruto, como
\/(así escribe las barrasjson_encodede PHP) o un\nliteral entre líneas, se eliminan automáticamente. Si otro escape\sigue provocando Carácter no válido\, usa Reparar Base64, o analiza primero el JSON y copia el valor. - Carácter no válido
%significa que la cadena se codificó para URL. Los escapes de+,/y=(%2B,%2F,%3D) se corrigen automáticamente; para cualquier otro, pasa antes la cadena por el decodificador de URL. - Un PDF que se detecta pero no muestra nada suele estar truncado. El encabezado sobrevive, así que la detección funciona, pero falta el final del archivo, donde está la tabla de referencias cruzadas. Consulta errores de Base64 para los demás sospechosos habituales.
Decodificar Base64 a PDF en código
Python, a partir de una respuesta JSON:
import base64, json
with open("response.json") as f:
b64 = json.load(f)["document"]
if b64.startswith("data:"):
b64 = b64.split(",", 1)[1]
pdf = base64.b64decode(b64)
if not pdf.startswith(b"%PDF-"):
raise ValueError(f"not a PDF, starts with {pdf[:16]!r}")
with open("document.pdf", "wb") as f:
f.write(pdf)
b64decode descarta sin avisar los caracteres fuera del alfabeto estándar, así que una cadena URL-safe con - y _ se decodifica en basura sin dar error. Usa base64.urlsafe_b64decode para esas. Node.js acepta ambos alfabetos en una sola llamada:
import { readFile, writeFile } from "node:fs/promises";
const { document } = JSON.parse(await readFile("response.json", "utf8"));
const pdf = Buffer.from(document.replace(/^data:[^,]*,/, ""), "base64");
if (pdf.toString("latin1", 0, 5) !== "%PDF-") throw new Error("not a PDF");
await writeFile("document.pdf", pdf);
En una shell, jq -r es importante: sin -r el valor conserva sus comillas y base64 -d se detiene con «invalid input».
jq -r '.document' response.json | base64 -d > document.pdf
La clave document es un marcador de posición para el nombre que tu API dé al campo. Hay más patrones en Base64 en Python, Base64 en Node.js y Base64 en Bash.
Preguntas frecuentes
¿Cómo convierto una cadena Base64 en un archivo PDF?
Pega la cadena en el cuadro de arriba, revisa la vista previa y pulsa Descargar archivo. Si viene de un JSON, copia solo el valor entre las comillas; un prefijo data:application/pdf;base64, y los saltos de línea pueden quedarse.
¿Por qué el PDF decodificado se abre dañado o en blanco?
Casi siempre la cadena se cortó por el límite de línea de un log, una columna de base de datos o un límite al copiar y pegar, así que falta el final del archivo. Un PDF completo termina en %%EOF; compara el tamaño decodificado con el que indica el remitente.
¿Puedo ver un PDF protegido con contraseña?
Sí. La lista de información muestra Cifrado: sí, y los visores integrados de Chrome y Firefox piden la contraseña dentro de la vista previa. El archivo descargado no cambia y se abre con la misma contraseña.
¿Por qué la herramienta dice que mi Base64 no es un PDF?
Los bytes decodificados no empiezan por %PDF-. Lo más frecuente es que la API enviara una página de error o un mensaje JSON en lugar del documento; el aviso dice qué encontró y ofrece guardarlo con esa extensión para que puedas leerlo.
¿Es seguro decodificar aquí un PDF confidencial?
El PDF se decodifica y se muestra dentro de tu navegador, y la Content Security Policy de la página le impide hacer peticiones de red, salvo las del contador de visitas de Cloudflare. Incluso puedes desconectarte de internet una vez cargada la página y seguir usándola.