Geração de Relatórios PDF em Kotlin: visão geral das bibliotecas e exemplos práticos
Kotlin, sendo uma linguagem moderna para JVM, é excelente para criar aplicações servidoras, incluindo a geração de relatórios PDF complexos. Ao contrário do Python, onde são populares ReportLab ou FPDF, no ecossistema Kotlin/Java são usadas bibliotecas consolidadas: iText, Apache PDFBox e OpenPDF. Neste artigo, analisaremos cada uma delas, mostraremos exemplos de código em Kotlin e daremos recomendações de escolha.
1. iText (versões 7 e 8)
iText é o padrão de facto para geração de PDF na JVM. A biblioteca fornece uma API poderosa para criar documentos do zero, trabalhar com formulários, marcas d'água e assinaturas digitais. No entanto, a partir da versão 7, o iText mudou para a licença AGPL (ou comercial), o que é importante considerar no uso comercial.
Exemplo de criação de um PDF simples com tabela em Kotlin:
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraphimport com.itextpdf.layout.element.Tableimport com.itextpdf.layout.property.UnitValue
fun generateReportItext(outputPath: String) { val writer = PdfWriter(outputPath) val pdf = PdfDocument(writer) val document = Document(pdf)
// Título document.add(Paragraph("Relatório de Vendas").setFontSize(20))
// Tabela val table = Table(UnitValue.createPercentArray(3)).useAllAvailableWidth() table.addCell("Produto") table.addCell("Quantidade") table.addCell("Preço") table.addCell("Notebook") table.addCell("10") table.addCell("75000") table.addCell("Monitor") table.addCell("5") table.addCell("25000")
document.add(table) document.close() println("PDF criado: $outputPath")}2. Apache PDFBox
PDFBox é uma biblioteca gratuita (licença Apache 2.0) que permite não apenas criar PDF, mas também extrair texto, preencher formulários, renderizar páginas em imagens. A API é um pouco mais de baixo nível do que a do iText, mas oferece controle total sobre o conteúdo.
Exemplo com imagem e formatação de texto:
import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType0Fontimport org.apache.pdfbox.pdmodel.graphics.image.PDImageXObjectimport java.io.File
fun generateReportPdfBox(outputPath: String) { val document = PDDocument() val page = PDPage() document.addPage(page)
val contentStream = PDPageContentStream(document, page) // Carregar fonte (TrueType) val font = PDType0Font.load(document, File("fonts/DejaVuSans.ttf")) contentStream.setFont(font, 14f)
// Texto contentStream.beginText() contentStream.newLineAtOffset(50f, 750f) contentStream.showText("Relatório de Janeiro 2025") contentStream.endText()
// Imagem (logotipo) val image = PDImageXObject.createFromFile("logo.png", document) contentStream.drawImage(image, 50f, 650f, 100f, 50f)
contentStream.close() document.save(outputPath) document.close() println("Relatório PDFBox pronto: $outputPath")}3. OpenPDF
OpenPDF é um fork da versão antiga do iText (LGPL), que permanece totalmente livre. É ideal para relatórios simples: texto, tabelas, primitivas gráficas básicas. A API lembra o iText 2.x, mas no código Kotlin moderno isso não é um problema.
Exemplo de criação de PDF com parágrafos e lista:
import com.lowagie.text.Documentimport com.lowagie.text.Paragraphimport com.lowagie.text.pdf.PdfWriterimport java.io.FileOutputStream
fun generateReportOpenPdf(outputPath: String) { Também na biblioteca
Envio de email em Rust: bibliotecas lettre e mailparse para trabalhar com e-mail
Registro em Go (Golang): melhores bibliotecas e soluções para produção
Trabalhando com Apache Kafka em C++: bibliotecas e exemplos
Swashbuckle para C# (.NET): guia completo com exemplos práticos