Como gerar PDFs de qualidade com Java
Gerar PDFs em Java parece simples na primeira vista. A realidade é bem diferente quando você precisa de algo que realmente funcione em produção. A maioria dos desenvolvedores tenta resolver isso da forma mais óbvia: escrever texto em uma página branca usando coordenadas absolutas. Isso funciona para um relatório de cinco linhas. Não funciona para absolutamente nada além disso. A biblioteca que eu recomendo e uso nos meus projetos é o OpenPDF. Ela é um fork mantido do iText 2.1.7, que na verdade é a versão mais antiga liberada sob licença livre antes que a iText mudasse para AGPL. Isso significa que você pode usar gratuitamente sem se preocupar com licenciamento, o que já resolve metade dos problemas que as pessoas enfrentam. O ciclo de vida básico de geração funciona assim: você cria um documento, abre ele, adiciona conteúdo, e fecha. Dentro desse documento, trabalha com parágrafos, tabelas, imagens e seções que se quebram automaticamente entre páginas. O OpenPDF se preocupa com quebras de página, numeração e margens sem você precisar calcular nada manualmente.O que procurar em um java language pdf
Quando você vai procurar material de estudo ou documentação sobre geração de PDF com Java, vai encontrar muito conteúdo desatualizado. A maioria dos tutoriais na internet ainda ensinam com a iText 5 ou até a versão 2. O problema é que APIs mudaram bastante entre essas versões. Coisas como a criação de fontes, manipulação de tables e formatação de PDFs complexos tiveram mudanças significativas. Se o seu objetivo é aprendizado, recomenda-se buscar um recurso chamado java language pdf que seja específico para OpenPDF ou iText 7. Conteúdo antigo vai te levar por caminhos mortos. Eu vi isso acontecer pessoalmente com desenvolvedores juniores que passaram dias tentando fazer funcionar com código que foi escrito para uma versão completamente diferente. Um detalhe que poucos mencionam: o OpenPDF usa como motor de renderização o PDFBox e o font box. Isso significa que suporte a fontes complexas, como caracteres CJK (chinês, japonês, coreano) e muitos scripts de idiomas europeus, depende basicamente de você baixar os arquivos de fonte corretos e registrá-los no documento. Não adianta tentar usar Times New Roman ou Arial padrão se o servidor onde o PDF está sendo gerado não tiver essas fontes instaladas no sistema operacional. Em ambientes Docker, isso é especialmente problemático porque a imagem base muitas vezes não vem com pacotes de font do Windows ou do LibreOffice. Aqui vai um exemplo concreto do que eu levei horas pra resolver. Estava gerando um relatório em um container Linux com OpenPDF, e todas as páginas vinham com caracteres corrompidos em negrito. O código parecia perfeito. A fonte estava sendo carregada, o tipo estava definido como bold. O problema era que o arquivo TTF que eu estava usando, de um pacote chamado Liberation Sans, tinha o subset de negrito com um nome de cara divergente do que o OpenPDF esperava. A solução foi simples mas demorou pra achar: exportar o mesmo arquivo de fonte usando uma ferramenta chamada fonttools e forçar a renomeação do face name para exatamente "LiberationSans Bold". Sem isso, o OpenPDF cai em fallback para a versão regular e ignora a instrução de bold. Uma implementação prática:import com.lowagie.text.Document; import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter; import java.io.FileOutputStream;
👉 Clique no botão abaixo para saber mais sobre o assunto!
Document doc = new Document(); PdfWriter.getInstance(doc, new FileOutputStream("saida.pdf"));
doc.open(); doc.add(new Paragraph("Conteúdo do relatório"));
doc.close();
Isso gera um PDF de uma página com um parágrafo simples. A partir daí, você escala adicionando tabelas com Cell, imagens com Image, e cabeçalhos com HeaderFooter. Tudo-documento-oriented, ou seja, você pensa no fluxo do documento e o motor cuida do resto. Tabelas são onde a coisa fica mais interessante. O OpenPDF tem uma classe Table que suporta rowspan e colspan, o que é essencial para relatórios empresariais. Mas há uma armadilha comum: se você definir larguras fixas nas colunas e o conteúdo ultrapassar esse espaço, o texto não quebra automaticamente como você esperaria. Você precisa chamar setBreakParagraph(true) na tabela ou configurar WordWrap nas células individualmente. Sem isso, tabelas com texto longo vão estourar as margens e o PDF final vai parecer amador. Outro ponto que vale a pena mencionar é a questão da segurança. PDFs podem ter senha, restrição de cópia, impressão e edição. O OpenPDF suporta proteção com usuário e proprietário, mas com limitações interessantes. A proteção com senha de usuário funciona bem. A proteção com senha de proprietário, que permite ao dono abrir o PDF mas restringir ações para outros usuários, é basicamente inefetiva. Ferramentas gratuitas como o qpdf conseguem remover essa restrição em segundos. Se você precisa de restrição real de distribuição, precisa pensar em watermarking ou em criptografia adicional fora do padrão do PDF. Para quem vai gerar PDFs em larga escala, existem alternativas. O Apache PDFBox é mais pesado mas muito mais flexível para manipulação de PDFs existentes. O Flying Saucer converte HTML/CSS para PDF, o que é útil quando você já tem layouts prontos e quer transformar rapidamente. Cada um tem suas fraquezas: PDFBox exige mais código boilerplate, Flying Saucer tem suporte limitado a CSS moderno e problemas conhecidos com floats e position absolute em tabelas. A questão do tamanho do arquivo também é relevante. PDFs gerados pelo OpenPDF podem ficar pesados rapidamente se você inserir imagens sem compressão. O padrão é usar JPEG com qualidade configurável. Eu recomendo Quality 0.7 para fotos em relatórios e 0.5 para diagramas, o que costuma reduzir o tamanho em cerca de 60% sem perda visual perceptível na maioria dos casos. Se o seu projeto exige páginas dinâmicas com layout complexo, como notas fiscais eletrônicas ou contratos, considere usar um template PDF existente e preencher campos com o Acrobat Form Fields ou com camadas de sobreposição via OpenPDF. Isso evita totalmente o trabalho de reposicionar cada elemento manualmente e garante que o resultado final seja fiel ao design original. Funciona especialmente bem quando o template já vem de um designer ou de um software de geração de documentos corporativos. O importante é começar com algo simples, validar o output em diferentes visualizadores e só então escalar para recursos mais avançados. Gerar um PDF que funcione no Acrobat Reader não significa que vai funcionar bem no navegador ou em leitores móveis. Sempre faça testes de rendering cruzado antes de colocar em produção.