Como converter Base64 para PDF
- Cole a string em Base64 ou data URI. Um URI
data:application/pdf;base64,…completo funciona, assim como quebras de linha, aspas em volta, Base64 URL-safe (-e_) e preenchimento=ausente. Para uma string longa salva em arquivo, use Abrir arquivo .txt ou arraste o arquivo para a caixa; acima de 4 MB, o conteúdo é decodificado sem ser exibido na área de texto. - A prévia abre abaixo dos botões. A decodificação começa assim que você cola; desmarque Ao vivo se preferir clicar em Decodificar você mesmo.
- Confira Nome do arquivo. Ele começa como
decoded, mas assume o nome de um parâmetroname=no data URI ou do arquivo de texto que você abriu:invoice.pdf.b64.txtvirainvoice.pdf. - Clique em Baixar arquivo. O link abra em uma nova aba, abaixo da prévia, mostra o mesmo PDF em tamanho cheio.
Um PDF de exemplo é carregado quando a página abre, para você ver como fica um resultado correto antes de colar o seu.
De onde vêm os PDFs em Base64
O JSON não tem como transportar bytes brutos, então serviços que devolvem documentos por uma API JSON os enviam como string Base64, muitas vezes em um campo chamado content, document, file ou label.
- APIs de etiquetas e logística devolvem a etiqueta de envio para impressão como PDF em Base64. A mesma requisição muitas vezes gera ZPL ou PNG, dependendo de um parâmetro de formato, então um campo “PDF” nem sempre contém um PDF (veja a tabela mais abaixo).
- Serviços de assinatura eletrônica devolvem o documento assinado, e com frequência um certificado de auditoria separado, em Base64 na resposta de conclusão ou no webhook.
- Faturas eletrônicas no formato XML UBL embutem uma cópia legível em PDF em um elemento como
<cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="INV-1001.pdf">. Copie o texto entre as tags; o atributofilenameindica o que digitar em Nome do arquivo. - No código-fonte bruto de um e-mail, um anexo PDF é uma parte MIME com
Content-Transfer-Encoding: base64e linhas de 76 caracteres. Cole só o bloco codificado ou abra a mensagem inteira no decodificador de EML, que lista todos os anexos. Base64 no e-mail explica a estrutura. - Documentos guardados em colunas BLOB de banco de dados costumam ser exportados como texto. O
encode(data, 'base64')do PostgreSQL e oTO_BASE64()do MySQL ou do MariaDB inserem uma quebra de linha a cada 76 caracteres; o decodificador as ignora.
Para uma resposta JSON com vários campos codificados, decodificar Base64 dentro de JSON encontra e decodifica todos de uma vez. Para fazer o caminho inverso, de um arquivo PDF para uma string, use PDF para Base64.
O que a prévia mostra
| Campo | De onde vem |
|---|---|
| Versão do PDF | A linha de cabeçalho, por exemplo %PDF-1.7 |
| Páginas | Contadas a partir dos objetos de página do arquivo (veja abaixo) |
| Título | O título das informações do documento, quando está gravado como texto simples |
| Criptografado | Aparece quando o arquivo tem um dicionário de criptografia: senha para abrir ou apenas restrições de permissão |
| SHA-256 | Hash dos bytes decodificados. Compare com sha256sum invoice.pdf do lado do remetente para provar que o arquivo chegou íntegro |
A prévia em si é o visualizador de PDF do seu navegador, exibindo os bytes decodificados a partir de uma URL blob: local. Chrome, Edge, Firefox e o Safari para desktop mostram o PDF na própria página. A prévia fica em branco quando o navegador está configurado para baixar PDFs em vez de abri-los (Chrome: Configurações, Privacidade e segurança, Configurações do site, Configurações de conteúdo adicionais, Documentos PDF; Firefox: Configurações, Geral, Aplicativos, Portable Document Format), e muitos navegadores de celular simplesmente não conseguem renderizar um PDF dentro de uma página. Nesses casos, abra em uma nova aba e Baixar arquivo continuam funcionando, e a lista de informações acima da prévia é preenchida de qualquer forma.
Como funciona a contagem de páginas
A ferramenta não renderiza o PDF para contar as páginas. Ela conta os objetos de página (/Type /Page) nos primeiros 32 MB do arquivo. Se nenhum estiver visível, lê a entrada /Count da árvore de páginas e, se ela também estiver oculta, mostra desconhecido. Duas situações fazem o número diferir do que o visualizador mostra:
- Páginas a mais. Um PDF editado, anotado ou assinado depois de criado costuma ser salvo de forma incremental: as páginas alteradas são acrescentadas como objetos novos e as versões antigas continuam no arquivo. Em um arquivo de teste com 2 páginas e uma página reescrita, a contagem dá 3.
- Desconhecido. Desde o PDF 1.5, os objetos podem ser empacotados em object streams compactados, e aí nem os objetos de página nem a árvore de páginas podem ser lidos sem descompactá-los.
Quando os dois números não batem, o certo é o do visualizador.
Quando o resultado não é um PDF
Se os bytes decodificados forem outra coisa, um aviso acima dos campos diz o que foi encontrado, por exemplo “Isto parece ser HTML, não PDF.”, com um botão Baixar como .html. O início do Base64 muitas vezes explica o que aconteceu:
| O Base64 começa com | O que você tem |
|---|---|
JVBERi0 | Um PDF (%PDF-) |
SlZCRVJpMH | Um PDF codificado duas vezes: o Base64 de JVBERi0… |
H4sI | Dados compactados com gzip |
PCFET0NUWVBF, PCFkb2N0eXBl, PGh0bWw | Uma página HTML, geralmente de erro ou de login |
eyJ | JSON, muitas vezes uma mensagem de erro como {"error":… |
XlhB | Uma etiqueta ZPL (^XA) para impressoras térmicas |
iVBORw0KGgo | Uma imagem PNG |
Para uma string codificada duas vezes ou dados gzip, a ferramenta mostra um segundo aviso com Decodificar de novo, que substitui a entrada pela camada interna; Voltar restaura o que você colou. Para um arquivo danificado ou não reconhecido, o aviso diz “Isto não parece ser PDF” e informa o tipo detectado, e a extensão continua .pdf, para você baixar os bytes mesmo assim e tentar outro leitor.
Erros antes da decodificação têm causas próprias:
- Escapes de JSON bruto, como
\/(ojson_encodedo PHP escreve barras assim) ou um\nliteral entre as linhas, são removidos automaticamente. Se outro escape com\ainda gerar Caractere inválido\, use Reparar Base64 ou faça o parse do JSON antes e copie o valor. - Caractere inválido
%significa que a string passou por codificação de URL. Os escapes de+,/e=(%2B,%2F,%3D) são corrigidos automaticamente; para qualquer outro, passe a string antes pelo decodificador de URL. - Um PDF detectado que não mostra nada quase sempre está truncado. O cabeçalho sobrevive, então a detecção funciona, mas o final do arquivo, onde fica a tabela de referências cruzadas, está faltando. Veja erros de Base64 para os outros suspeitos de sempre.
Decodificar Base64 para PDF no código
Python, a partir de uma resposta 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)
O b64decode descarta em silêncio os caracteres fora do alfabeto padrão, então uma string URL-safe com - e _ vira lixo sem nenhum erro. Para essas, use base64.urlsafe_b64decode. O Node.js aceita os dois alfabetos na mesma chamada:
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);
No shell, o jq -r faz diferença: sem -r, o valor mantém as aspas e o base64 -d para com “invalid input”.
jq -r '.document' response.json | base64 -d > document.pdf
A chave document é só um exemplo; troque pelo nome que a sua API dá ao campo. Mais padrões em Base64 em Python, Base64 em Node.js e Base64 em Bash.
Perguntas frequentes
Como converter uma string Base64 em arquivo PDF?
Cole a string na caixa acima, confira a prévia e clique em Baixar arquivo. Se ela vier de um JSON, copie só o valor entre as aspas; o prefixo data:application/pdf;base64, e as quebras de linha podem ficar.
Por que o PDF decodificado abre corrompido ou em branco?
Quase sempre a string foi cortada por um limite de linha de log, por uma coluna do banco de dados ou pelo limite do copiar e colar, e o final do arquivo se perdeu. Um PDF completo termina com %%EOF; compare o tamanho decodificado com o que o remetente informa.
Dá para ver um PDF protegido por senha?
Sim. A lista de informações mostra Criptografado: sim, e os visualizadores nativos do Chrome e do Firefox pedem a senha dentro da prévia. O arquivo baixado não é alterado e abre com a mesma senha.
Por que a ferramenta diz que meu Base64 não é um PDF?
Os bytes decodificados não começam com %PDF-. Na maioria das vezes a API mandou uma página de erro ou uma mensagem JSON no lugar do documento; o aviso diz o que foi encontrado e oferece salvar com essa extensão para você ler o conteúdo.
É seguro decodificar um PDF confidencial aqui?
O PDF é decodificado e exibido dentro do seu navegador, e a Content Security Policy da página a impede de fazer requisições de rede, exceto as do contador de visitas da Cloudflare. Você pode até ficar offline depois que a página carregar e continuar usando.