Generación de informes PDF en Kotlin: revisión de bibliotecas y ejemplos prácticos
Kotlin, al ser un lenguaje moderno para la JVM, es ideal para crear aplicaciones de servidor, incluyendo la generación de informes PDF complejos. A diferencia de Python, donde son populares ReportLab o FPDF, en el ecosistema Kotlin/Java se utilizan bibliotecas probadas por el tiempo: iText, Apache PDFBox y OpenPDF. En este artículo analizaremos cada una de ellas, mostraremos ejemplos de código en Kotlin y daremos recomendaciones para su elección.
1. iText (versiones 7 y 8)
iText es el estándar de facto para la generación de PDF en la JVM. La biblioteca proporciona una potente API para crear documentos desde cero, trabajar con formularios, marcas de agua y firmas digitales. Sin embargo, a partir de la versión 7, iText cambió a la licencia AGPL (o comercial), lo cual es importante tener en cuenta para uso comercial.
Ejemplo de creación de un PDF simple con tabla en 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("Informe de ventas").setFontSize(20))
// Tabla val table = Table(UnitValue.createPercentArray(3)).useAllAvailableWidth() table.addCell("Producto") table.addCell("Cantidad") table.addCell("Precio") table.addCell("Portátil") table.addCell("10") table.addCell("75000") table.addCell("Monitor") table.addCell("5") table.addCell("25000")
document.add(table) document.close() println("PDF creado: $outputPath")}2. Apache PDFBox
PDFBox es una biblioteca gratuita (licencia Apache 2.0) que permite no solo crear PDF, sino también extraer texto, rellenar formularios y renderizar páginas en imágenes. La API es un poco más de bajo nivel que la de iText, pero brinda control total sobre el contenido.
Ejemplo con imagen y formato 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) // Carga de fuente (TrueType) val font = PDType0Font.load(document, File("fonts/DejaVuSans.ttf")) contentStream.setFont(font, 14f)
// Texto contentStream.beginText() contentStream.newLineAtOffset(50f, 750f) contentStream.showText("Informe de enero 2025") contentStream.endText()
// Imagen (logotipo) val image = PDImageXObject.createFromFile("logo.png", document) contentStream.drawImage(image, 50f, 650f, 100f, 50f)
contentStream.close() document.save(outputPath) document.close() println("Informe PDFBox listo: $outputPath")}3. OpenPDF
OpenPDF es un fork de una versión antigua de iText (LGPL) que sigue siendo completamente gratuito. Es ideal para informes simples: texto, tablas, primitivas gráficas básicas. La API recuerda a iText 2.x, pero en el código Kotlin moderno esto no es un problema.
Ejemplo de creación de PDF con párrafos y lista:
import com.lowagie.text.Documentimport com.lowagie.text.Paragraphimport com.lowagie.text.pdf.PdfWriterimport java.io.FileOutputStream
fun generateReportOpenPdf(outputPath: String) { También en la biblioteca
Proptest Rust: guía completa con ejemplos prácticos
TBB (Intel Threading Building Blocks) para C++: guía completa con ejemplos
Tokens JWT en PHP: biblioteca firebase/php-jwt y guía completa
ErrorOr para C# (.NET): guía completa con ejemplos prácticos