Gerando PDFs com Java: o que funciona na prática
Java não tem uma solução única para gerar PDFs. Já vi gente passar semanas brigando com bibliotecas que parecem boas no papel mas falham quando você coloca um relatório real na frente. Vou explicar o que eu já testei e onde eu me ferrrei. A primeira coisa que todo mundo tenta é o iText. O iText 7 ainda é a biblioteca mais completa do mercado. Você instala o dependency, chama uma API relativamente simples, e tem um PDF pronto. Mas o iText tem uma licença AGPL que é traiçoira. Se você distribuir seu software como parte de um produto maior sem cuidado, pode acabar violando a licença sem perceber. Eu já vi isso acontecer com uma equipe que achava que estava usando a versão commercial e na verdade estava rodando com a engine community em produção.
java use a cabeça pdf
O problema é que muitos desenvolvedores brasileiros ainda confundem geração de PDF com exportação de dados. PDF é um formato de documento com layout fixo. Se você precisa de algo que possa ser reprocessado depois, talvez seja melhor usar HTML ou XML primeiro. A maioria dos relatórios que eu vejo sendo gerados com PDF puro na verdade seriam mais fáceis de manter como templates HTML que depois viram PDF via ou OpenPDF. Eu tive um caso específico há uns dois anos onde precisava gerar um certificado com QR code embedado. O QR code precisava apontar para uma URL com token único. Usei o iText junto com a ZXing library. O problema foi que o QR code ficava ilegível quando impresso em 300 DPI porque eu não estava pensando na densidade de pontos. A solução foi usar um scale factor de 4x no renderizador e depois reduzir na hora de posicionar no PDF. Isso costuma resolver o problema de legibilidade em impressão caseira.
Alternativas ao iText
Se o iText não serve pro seu caso por questões de licença ou complexidade, tem opções. OpenPDF é um fork do iText 4 licenciado sob MPL. É mais simples mas também mais limitado. Para coisas básicas como tabelas e texto, funciona bem. Para formatação avançada com recursos do PDF 1.7, você vai sentir falta de coisas. A Apache POI também consegue gerar PDFs via HSSF/XSSF combined com um renderizador. Não é o método mais eficiente do mundo, mas se você já está usando POI para Excel no mesmo projeto, faz sentido manter a consistência. O tempo de geração aumenta em cerca de 30-40% comparado com iText puro.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Tem também o caminho HTML-to-PDF. Você gera um HTML com CSS print-friendly e converte usando, WeasyPrint, ou até serviços cloud como API do PDFMonkey. Eu prefiro esse approach para relatórios que mudam muito de layout porque fica mais fácil de testar no browser antes de gerar o PDF final.
Problemas comuns que ninguém avisa
Fontes customizadas em PDF Java são uma dor de cabeça real. Se você embutir uma fonte TTF sem cuidado, o arquivo pode crescer 2MB ou mais. A solução é usar subsets de fontes ou fontes system que já estão disponíveis no servidor de impressão. Eu configurei um job de build que roda um script Python pra extrair só os glyphs necessários de uma fonte e gerar um subset otimizado. Isso reduziu o tamanho médio dos PDFs de 4MB para 600KB no meu projeto atual. Outro problema é a numeração de páginas quando você gera conteúdo dinâmico. O PDF é um formato estático. Você não consegue facilmente modificar o rodapé depois de gerar o conteúdo. A workaround que eu uso é gerar o PDF em duas passes: primeiro gera o corpo sem numeração, depois usa uma biblioteca de manipulação pra inserir os números nas páginas. O iText permite isso com o PdfPageIterator, mas requer cuidado com o fluxo de bytes.
Se você precisa de assinaturas digitais, esquece as bibliotecas mais simples. O processo de assinatura PDF requer certificados X.509, timestamping, e cuidado com a integridade do documento. Eu já perdi meia tarde tentando assinar um PDF com iText e descobrindo que o timestamp server que eu estaba usando não era confiável. A solução foi usar um trusted third party como o do Ser Sign para isso.
Conclusão sobre o que vale a pena
Para projetos pequenos e controles internos, OpenPDF resolve. Para produtos comerciais com necessidade de assinatura e conformidade, iText com licença adequada. Para relatórios com layout volátil, HTML-to-PDF. Não existe solução perfeita, cada uma tem trade-offs que aparecem só quando você coloca o sistema em produção.