Base64 para PDF e PDF para Base64 em Java (somente JDK + Pro)

2025-08-22 08:06:12 zaki zou

Instalar com Maven

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf</artifactId>
    <version>11.8.3</version>
</dependency>
    

Links Relacionados

Ilustração do fluxo de trabalho de conversão de Java Base64 para PDF e PDF para Base64 com edição avançada de PDF

Ao trabalhar com arquivos PDF em Java, muitas vezes é necessário converter entre dados binários e formatos baseados em texto. A codificação Base64 permite que o conteúdo do PDF seja representado como texto simples, o que é útil ao transmitir documentos em JSON, enviá-los por meio de formulários ou armazená-los em sistemas baseados em texto. A biblioteca padrão do Java fornece java.util.Base64, tornando simples a implementação de conversões de Base64 para PDF e PDF para Base64 sem dependências adicionais.

Neste tutorial, exploraremos como lidar com essas conversões usando apenas o JDK, bem como como trabalhar com imagens Base64 e incorporá-las em PDFs. Para operações mais avançadas, como editar um PDF recebido como Base64 e exportá-lo de volta, demonstraremos o uso do Free Spire.PDF for Java.

Índice

Converter Base64 para PDF em Java (apenas JDK)

A abordagem mais simples é ler uma string Base64 na memória, remover quaisquer prefixos opcionais (como data:application/pdf;base64,) e, em seguida, decodificá-la em um PDF. Isso funciona bem para arquivos de pequeno a médio porte.

import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Base64ToPdf {
    public static void main(String[] args) throws Exception {
        // Ler texto Base64 de um arquivo (ou qualquer outra fonte)
        String base64 = Files.readString(Paths.get("sample.pdf.b64"), StandardCharsets.UTF_8);

        // Remover prefixos de URI de dados comuns, se presentes
        base64 = stripDataPrefix(base64);

        // Decodificar Base64 em bytes de PDF brutos
        // O decodificador MIME tolera quebras de linha e texto quebrado
        byte[] pdfBytes = Base64.getMimeDecoder().decode(base64);

        // Escrever os bytes decodificados em um arquivo PDF
        Files.write(Paths.get("output.pdf"), pdfBytes);
    }

    /** Utilitário para remover o prefixo "data:application/pdf;base64,", se incluído */
    private static String stripDataPrefix(String src) {
        String s = src.trim();
        int comma = s.indexOf(',');
        if (comma > 0 && s.substring(0, comma).toLowerCase().contains("base64")) {
            return s.substring(comma + 1).trim();
        }
        return s;
    }
}

Explicação Este exemplo é direto e confiável para conteúdo Base64 que cabe confortavelmente na memória. O Base64.getMimeDecoder() é escolhido porque lida elegantemente com quebras de linha, que são comuns em texto Base64 exportado de sistemas de e-mail ou APIs. Se você sabe que sua string Base64 não contém novas linhas, também pode usar Base64.getDecoder().

Certifique-se de remover qualquer prefixo de URI de dados (data:application/pdf;base64,) antes de decodificar, pois não faz parte da carga útil do Base64. O método auxiliar stripDataPrefix() faz isso automaticamente.


Variante de streaming (sem a string completa na memória)

Para PDFs grandes, é melhor processar o Base64 de forma contínua. Isso evita carregar toda a string Base64 na memória de uma vez.

import java.io.*;
import java.nio.file.*;
import java.util.Base64;

public class Base64ToPdfStreamed {
    public static void main(String[] args) throws Exception {
        // Entrada: arquivo de texto contendo PDF codificado em Base64
        Path in = Paths.get("sample.pdf.b64");

        // Saída: arquivo PDF decodificado
        Path out = Paths.get("output.pdf");

        // Envolver o decodificador Base64 em torno do fluxo de entrada
        try (InputStream b64In = Base64.getMimeDecoder().wrap(Files.newInputStream(in));
             OutputStream pdfOut = Files.newOutputStream(out)) {

            // Transmitir os bytes decodificados diretamente para a saída do PDF
            b64In.transferTo(pdfOut);
        }
    }
}

Explicação Essa abordagem baseada em streaming é mais eficiente em termos de memória, pois decodifica os dados em tempo real, em vez de armazenar a string inteira em buffer. É o método recomendado para arquivos grandes ou fluxos contínuos (por exemplo, soquetes de rede).

  • Base64.getMimeDecoder() é usado para tolerar quebras de linha na entrada.
  • O método transferTo() copia eficientemente os bytes decodificados da entrada para a saída sem o manuseio manual do buffer.
  • No uso real, considere adicionar tratamento de exceções para gerenciar erros de acesso a arquivos ou gravações parciais.

Converter PDF para Base64 em Java (apenas JDK)

Codificar um PDF em Base64 é igualmente simples. Para arquivos menores, ler o PDF inteiro na memória é suficiente:

import java.nio.file.*;
import java.util.Base64;

public class PdfToBase64 {
    public static void main(String[] args) throws Exception {
        // Ler o arquivo PDF em um array de bytes
        byte[] pdfBytes = Files.readAllBytes(Paths.get("input.pdf"));

        // Codificar os bytes do PDF como uma string Base64
        String base64 = Base64.getEncoder().encodeToString(pdfBytes);

        // Escrever a string Base64 em um arquivo de texto
        Files.writeString(Paths.get("output.pdf.b64"), base64);
    }
}

Explicação Essa abordagem é simples e funciona bem para arquivos de pequeno a médio porte. O arquivo PDF inteiro é lido em um array de bytes e codificado como uma única string Base64. Essa string pode ser armazenada, transmitida em JSON ou incorporada em uma URI de dados.

Codificador de streaming (lida com arquivos grandes de forma eficiente)

Para PDFs grandes, você pode evitar a sobrecarga de memória codificando diretamente como um fluxo:

import java.io.*;
import java.nio.file.*;
import java.util.Base64;

public class PdfToBase64Streamed {
    public static void main(String[] args) throws Exception {
        // Entrada: arquivo PDF binário
        try (InputStream pdfIn = Files.newInputStream(Paths.get("input.pdf"));
             // Fluxo de saída bruto para arquivo de texto Base64
             OutputStream rawOut = Files.newOutputStream(Paths.get("output.pdf.b64"));
             // Envolver o fluxo de saída com o codificador Base64
             OutputStream b64Out = Base64.getEncoder().wrap(rawOut)) {

            // Transmitir bytes de PDF diretamente para a saída codificada em Base64
            pdfIn.transferTo(b64Out);
        }
    }
}

Explicação O codificador de streaming lida eficientemente com arquivos grandes, codificando os dados de forma incremental em vez de carregar tudo na memória. O método Base64.getEncoder().wrap() transforma um fluxo de saída regular em um que grava texto Base64 automaticamente.

Este design escala melhor para PDFs grandes, fluxos de rede ou serviços que devem lidar com muitos documentos simultaneamente sem sofrer pressão de memória.


Dicas de Validação e Segurança

  • Detectar URIs de Dados: os usuários podem enviar prefixos data:application/pdf;base64,. Remova-os antes de decodificar.
  • Quebras de linha: ao decodificar texto que pode conter linhas quebradas (e-mails, logs), use Base64.getMimeDecoder().
  • Verificação rápida de sanidade: após a decodificação, os primeiros bytes de um PDF válido geralmente começam com %PDF-. Você pode verificar isso para detecção precoce de falhas.
  • Codificação de caracteres: trate o texto Base64 como UTF-8 (ou US-ASCII) ao ler/escrever arquivos .b64.
  • Tratamento de erros: envolva a decodificação/codificação em blocos try/catch e exiba mensagens acionáveis (por exemplo, tamanho, incompatibilidade de cabeçalho).

Salvar Imagens Base64 como PDF em Java

Às vezes, você recebe imagens (por exemplo, PNG ou JPEG) como strings Base64 e precisa envolvê-las em um PDF. Embora a biblioteca padrão do Java não tenha APIs de PDF, o Free Spire.PDF for Java torna isso simples.

Você pode baixar o Free Spire.PDF for Java e adicioná-lo ao seu projeto ou instalar o Free Spire.PDF for Java a partir do repositório Maven.

Conceitos-chave do Spire.PDF

  • PdfDocument — o contêiner para uma ou mais páginas de PDF.
  • PdfPageBase — representa uma página na qual você pode desenhar.
  • PdfImage.fromImage() — carrega uma BufferedImage ou um fluxo em uma imagem PDF desenhável.
  • drawImage() — posiciona a imagem nas coordenadas e no tamanho especificados.
  • Sistema de Coordenadas — o Spire.PDF usa um sistema de coordenadas onde (0,0) é o canto superior esquerdo.

Exemplo: Converter imagem Base64 para PDF usando Java

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfImage;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.Base64;

public class Base64ImageToPdf {
    public static void main(String[] args) throws Exception {
        // 1) Ler arquivo Base64 e decodificar (remover prefixo de URI de dados, se existir)
        String base64Image = Files.readString(Paths.get("G:/Document/image.b64"), StandardCharsets.UTF_8).trim();
        int comma = base64Image.indexOf(',');
        if (comma > 0 && base64Image.substring(0, comma).toLowerCase().contains("base64")) {
            base64Image = base64Image.substring(comma + 1).trim();
        }
        byte[] imageBytes = Base64.getMimeDecoder().decode(base64Image);

        // 2) Criar PDF e inserir a imagem
        PdfDocument pdf = new PdfDocument();
        try (ByteArrayInputStream in = new ByteArrayInputStream(imageBytes)) {
            PdfImage img = PdfImage.fromStream(in);
            pdf.getPageSettings().setWidth(img.getWidth());
            pdf.getPageSettings().setHeight(img.getHeight());
            pdf.getPageSettings().setMargins(0, 0, 0, 0);
            PdfPageBase page = pdf.getPages().add();
            page.getCanvas().drawImage(img, 0, 0);
        }

        // 3) Salvar arquivo PDF
        pdf.saveToFile("output/image.pdf");
    }
}

O exemplo a seguir decodifica uma imagem Base64 e a incorpora em uma página de PDF. A saída se parece com isto:

Saída de exemplo mostrando uma imagem Base64 renderizada dentro de uma página de PDF em Java

Este fluxo de trabalho é ideal para incorporar documentos digitalizados ou assinaturas que chegam como Base64.

Para gráficos vetoriais, você também pode consultar nosso guia sobre Converter SVG para PDF em Java.


Carregar PDF Base64, Modificar e Salvar de Volta como Base64

Em muitas APIs, um PDF chega como Base64. Com o Spire.PDF, você pode carregá-lo, desenhar nas páginas (texto/marcas d'água) e retornar Base64 novamente — ideal para funções sem servidor ou microsserviços.

Conceitos-chave do Spire.PDF usados aqui

  • PdfDocument.loadFromBytes(byte[]) — constrói um documento diretamente a partir de bytes decodificados.
  • PdfPageBase#getCanvas() — obtém uma superfície de desenho para colocar texto, formas ou imagens.
  • Fontes e pincéis — por exemplo, PdfTrueTypeFont ou fontes integradas via PdfFont, com PdfSolidBrush para colorir.
  • Salvar na memóriapdf.saveToStream(ByteArrayOutputStream) produz bytes brutos, que você pode recodificar com Base64.

Exemplo: Carregar, modificar e salvar PDF Base64 em Java

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.*;
import java.io.*;
import java.util.Base64;

public class EditBase64Pdf {
    public static void main(String[] args) throws Exception {
        String base64Pdf = "..."; // string de PDF Base64 recebida

        // Decodificar para bytes
        byte[] pdfBytes = Base64.getDecoder().decode(base64Pdf);

        // Carregar PDF
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromBytes(pdfBytes);

        // Adicionar carimbo em cada página
        for (PdfPageBase page : (Iterable) pdf.getPages()) {
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", Font.BOLD, 36));
            PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
            page.getCanvas().drawString("Processed", font, brush, 100, 100);
        }

        // Salvar na memória e codificar de volta para Base64
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        pdf.saveToStream(output);
        pdf.close();

        String resultBase64 = Base64.getEncoder().encodeToString(output.toByteArray());
        System.out.println(resultBase64);
    }
}

Neste exemplo, uma marca d'água azul "Processado" é adicionada a cada página do PDF antes de recodificá-lo de volta para Base64. O resultado se parece com isto:

Documento PDF com uma marca d'água azul 'Processado' adicionada antes de codificar de volta para Base64 em Java

Esta viagem de ida e volta (Base64 → PDF → Base64) é útil para pipelines de documentos, como carimbar faturas ou adicionar assinaturas dinâmicas em um serviço de nuvem.

Tutoriais relacionados:
Extrair Texto de PDF em Java | Criar Documentos PDF em Java


Considerações de Desempenho e Memória

  • Streaming vs. E/S de arquivos — ao lidar com Base64, prefira ByteArrayInputStream e ByteArrayOutputStream para evitar arquivos temporários desnecessários.
  • PDFs com muitas imagens — a decodificação de imagens Base64 pode aumentar o uso da memória; considere redimensionar ou comprimir antes de incorporar.
  • PDFs grandes — o Spire.PDF lida com PDFs de vários MB, mas para documentos muito grandes, considere o processamento página por página.
  • Funções sem servidor — os fluxos de trabalho Base64 se encaixam bem porque você evita a dependência do sistema de arquivos e retorna os resultados diretamente por meio de respostas de API.

FAQ

P: Posso converter Base64 para PDF usando apenas o JDK?

Sim. O Java SE fornece utilitários de Base64 e E/S de arquivos, para que você possa lidar com a conversão sem bibliotecas extras.

P: Posso editar um PDF com a biblioteca padrão do Java?

Não. O Java SE não suporta a análise da estrutura ou a renderização de PDF. Para edição, use uma biblioteca dedicada como Spire.PDF for Java.

P: O Free Spire.PDF for Java é suficiente?

Sim. O Free Spire.PDF for Java é limitado no tamanho do documento, mas suficiente para testes ou projetos de pequena escala.

P: Preciso salvar os PDFs no disco?

Nem sempre. A conversão também pode ser executada na memória usando fluxos, o que é frequentemente preferido para APIs e aplicativos em nuvem.

Veja Também