Generación de PDF en Kotlin: revisión de bibliotecas y ejemplos prácticos
La generación de documentos PDF es una de las tareas comunes en las aplicaciones modernas: desde la creación de informes y facturas hasta la exportación de datos. Kotlin, al ser un lenguaje moderno para la JVM, brinda a los desarrolladores acceso a potentes bibliotecas de Java para trabajar con PDF. En este artículo, revisaremos las principales herramientas para la generación de PDF en Kotlin, sus características y ejemplos de uso.
Bibliotecas populares para trabajar con PDF en Kotlin
Dado que Kotlin es completamente compatible con Java, puede usar cualquier biblioteca Java para PDF. Las opciones más populares son:
- iText (versión 7/8) — biblioteca comercial con código abierto (AGPL). Ofrece amplias capacidades: creación de documentos desde cero, trabajo con formularios, marcas de agua, cifrado. Para uso comercial se requiere la compra de una licencia.
- Apache PDFBox — biblioteca gratuita (Apache 2.0). Permite crear PDF, extraer texto, rellenar formularios. Funciona a un nivel más bajo que iText, pero brinda control total sobre el contenido.
- OpenPDF — bifurcación (fork) de iText 4 (LGPL/MPL). Biblioteca ligera para tareas básicas: creación de texto, tablas, imágenes. Adecuada para proyectos simples sin maquetación compleja.
- Jetpack Compose + PDF — enfoque moderno: describe la interfaz de usuario en Compose y luego la convierte a PDF usando bibliotecas de Android (por ejemplo,
android.graphics.pdf.PdfDocument). Adecuado para aplicaciones Android.
Configuración del proyecto y adición de dependencias
Para la demostración usaremos iText 7 y Apache PDFBox. Agregue las dependencias en build.gradle.kts:
// Para iText 7implementation("com.itextpdf:itext7-core:8.0.4")
// Para Apache PDFBoximplementation("org.apache.pdfbox:pdfbox:3.0.2")Ejemplo 1: Creación de PDF con texto (iText 7)
Crearemos un documento simple con un título y un párrafo:
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraph
fun createSimplePdf() { val writer = PdfWriter("output.pdf") val pdf = PdfDocument(writer) val document = Document(pdf)
document.add(Paragraph("¡Hola, mundo!")) document.add(Paragraph("Este es un PDF creado con iText en Kotlin."))
document.close()}Ejemplo 2: Trabajo con tablas y cirílico (iText 7)
Para la visualización correcta del cirílico es necesario cargar una fuente que admita Unicode. Usamos la fuente estándar FreeSans o cualquier fuente TTF:
import com.itextpdf.kernel.font.PdfFontFactoryimport com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Cellimport com.itextpdf.layout.element.Paragraphimport com.itextpdf.layout.element.Table
fun createTableWithCyrillic() { val writer = PdfWriter("table.pdf") val pdf = PdfDocument(writer) val document = Document(pdf)
// Carga de fuente con soporte para cirílico val font = PdfFontFactory.createFont("fonts/FreeSans.ttf", "Identity-H") document.setFont(font)
val table = Table(2) // dos columnas table.addCell(Cell().add(Paragraph("Nombre"))) table.addCell(Cell().add(Paragraph("Edad"))) table.addCell(Cell().add(Paragraph("Ana"))) table.addCell(Cell().add(Paragraph("25"))) table.addCell(Cell().add(Paragraph("Iván"))) table.addCell(Cell().add(Paragraph("30")))
document.add(table) document.close()}Ejemplo 3: Creación de PDF con imagen (Apache PDFBox)
PDFBox requiere un trabajo más detallado con coordenadas, pero ofrece flexibilidad:
También en la biblioteca
Pruebas en Go (Golang): frameworks y herramientas
Parseo de HTML en Go: revisión de bibliotecas y ejemplos de código
Contacts Swift: guía completa con ejemplos prácticos
Fastify para JavaScript (Node.js): guía completa con ejemplos
Aprendizaje Automático en Swift: Core ML, Create ML, TensorFlow Swift y Turi Create
Recommendations