Generación de informes PDF en Kotlin con iText 7
En el desarrollo moderno, a menudo surge la necesidad de crear documentos PDF estructurados: informes, facturas, contratos o análisis. El lenguaje Kotlin, gracias a su concisión y compatibilidad con Java, es ideal para esta tarea. Una de las bibliotecas más potentes y populares para trabajar con PDF es iText 7 (anteriormente iTextSharp para .NET). En este artículo, veremos cómo generar informes PDF profesionales en Kotlin con su ayuda.
¿Por qué iText 7?
- Control total sobre el contenido: texto, tablas, imágenes, fuentes.
- Rendimiento: la biblioteca está optimizada para trabajar con documentos grandes.
- Multiplataforma: funciona en JVM, Android y en la web.
- Licencias: AGPL para proyectos de código abierto o licencia comercial.
Instalación (Gradle)
Añada la dependencia en build.gradle.kts:
dependencies { implementation("com.itextpdf:itext7-core:7.2.5")}Ejemplo básico: "¡Hola, PDF!"
Creemos un documento PDF simple con texto:
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraph
fun main() { val writer = PdfWriter("hello.pdf") val pdf = PdfDocument(writer) val document = Document(pdf)
document.add(Paragraph("¡Hola, mundo PDF en Kotlin!")) document.close() println("PDF creado: hello.pdf")}Creación de un informe con tablas y estilos
Para un informe real, se necesita más que solo texto. Añadamos una tabla, encabezados y estilos:
import com.itextpdf.kernel.colors.ColorConstantsimport 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.Tableimport com.itextpdf.layout.properties.UnitValue
fun generateReport() { val writer = PdfWriter("report.pdf") val pdf = PdfDocument(writer) val document = Document(pdf)
// Título val title = Paragraph("Informe mensual de ventas") .setFontSize(20) .setBold() .setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER) document.add(title)
// Tabla val table = Table(UnitValue.createPercentArray(floatArrayOf(1f, 2f, 1.5f, 1.5f))) table.setWidth(UnitValue.createPercentValue(100))
// Encabezados de la tabla val headers = listOf("ID", "Producto", "Cantidad", "Precio") headers.forEach { header -> val cell = Cell().add(Paragraph(header).setBold()) cell.setBackgroundColor(ColorConstants.LIGHT_GRAY) table.addCell(cell) }
// Datos val data = listOf( listOf("1", "Portátil", "3", "150000"), listOf("2", "Ratón", "10", "5000"), listOf("3", "Teclado", "5", "12500") ) data.forEach { row -> row.forEach { value -> table.addCell(Cell().add(Paragraph(value))) } }
document.add(table) document.close() println("Informe creado: report.pdf")}
fun main() { generateReport()}Añadir imágenes y estilos
A menudo es necesario insertar logotipos o gráficos en los informes. iText 7 admite imágenes:
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Imageimport com.itextpdf.io.image.ImageDataFactory
fun addImageExample() { val writer = PdfWriter("report_with_image.pdf") val pdf = PdfDocument(writer) val document = Documen También en la biblioteca
Event Bus y el patrón Observer en C++: implementación y ejemplos
Frameworks CLI para Rust: revisión de las mejores herramientas para crear utilidades de línea de comandos
Programación reactiva en Rust: bibliotecas, frameworks y ejemplos prácticos
Trabajo con imágenes en Rust: revisión de las bibliotecas image, fast_image_resize y otras
Limitación de Tasa en TypeScript: bibliotecas, estrategias y ejemplos