Генерация PDF отчётов на Kotlin: обзор библиотек и практические примеры
Kotlin, будучи современным языком для JVM, предоставляет разработчикам мощные инструменты для создания PDF-документов. Независимо от того, создаёте ли вы финансовые отчёты, счета-фактуры, аналитические дашборды или просто экспортируете данные, в Kotlin есть несколько зрелых библиотек, которые позволяют решить эту задачу. В этой статье мы рассмотрим основные библиотеки для генерации PDF на Kotlin, сравним их возможности и приведём практические примеры кода.
1. iText 7 — мощный и гибкий инструмент
iText — одна из самых популярных библиотек для работы с PDF в мире Java и Kotlin. Она предоставляет полный контроль над содержимым документа: текст, таблицы, изображения, аннотации, закладки и многое другое. iText 7 — это переработанная версия с улучшенной архитектурой.
Установка (Gradle)
implementation("com.itextpdf:itext7-core:8.0.2")
Пример: создание простого PDF отчёта
import com.itextpdf.kernel.pdf.PdfDocument
import com.itextpdf.kernel.pdf.PdfWriter
import com.itextpdf.layout.Document
import com.itextpdf.layout.element.Paragraph
import com.itextpdf.layout.element.Table
import java.io.FileOutputStream
fun generateReport(fileName: String, data: List<Pair<String, Int>>) {
val writer = PdfWriter(FileOutputStream(fileName))
val pdf = PdfDocument(writer)
val document = Document(pdf)
// Заголовок
document.add(Paragraph("Отчёт о продажах").setFontSize(20).setBold())
// Таблица
val table = Table(2)
table.addCell("Товар")
table.addCell("Количество")
data.forEach { (product, quantity) ->
table.addCell(product)
table.addCell(quantity.toString())
}
document.add(table)
document.close()
println("PDF создан: $fileName")
}
// Использование
fun main() {
val salesData = listOf(
"Ноутбуки" to 150,
"Мониторы" to 230,
"Клавиатуры" to 340
)
generateReport("report_itext.pdf", salesData)
}
iText предоставляет богатый API для форматирования: можно задавать шрифты, цвета, отступы, выравнивание, добавлять изображения и даже внедрять шрифты (например, кириллические). Однако у iText есть лицензионные ограничения: коммерческое использование требует покупки лицензии (AGPL для открытых проектов).
2. Apache PDFBox — бесплатная альтернатива
Apache PDFBox — это библиотека с открытым исходным кодом (лицензия Apache 2.0), которая не имеет ограничений на коммерческое использование. PDFBox позволяет создавать PDF с нуля, заполнять формы, извлекать текст и даже работать с цифровыми подписями.
Установка (Gradle)
implementation("org.apache.pdfbox:pdfbox:3.0.1")
Пример: создание PDF с таблицей
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.pdmodel.PDPage
import org.apache.pdfbox.pdmodel.PDPageContentStream
import org.apache.pdfbox.pdmodel.font.PDType1Font
import java.awt.Color
fun createPdfBoxReport(fileName: String, data: List<Pair<String, Int>>) {
val document = PDDocument()
val page = PDPage()
document.addPage(page)
val contentStream = PDPageContentStream(document, page)
contentStream.beginText()
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18f)
contentStream.newLineAtOffset(50f, 750f)
contentStream.showText("Отчёт о продажах (PDFBox)")
contentStream.endText()
// Рисуем таблицу вручную
var y = 700f
contentStream.setFont(PDType1Font.HELVETICA, 12f)
contentStream.setNonStrokingColor(Color.BLACK)
data.forEach { (product, quantity) ->
contentStream.beginText()
contentStream.newLineAtOffset(50f, y)
contentStream.showText("$product — $quantity шт.")
contentStream.endText()
y -= 20f
}
contentStream.close()
document.save(fileName)
document.close()
println("PDF создан: $fileName")
}
PDFBox требует ручного позиционирования элементов, что делает его менее удобным для сложных макетов, но идеально подходит для простых отчётов и когда важна лицензионная чистота.
3. OpenPDF — лёгкая и быстрая библиотека
OpenPDF — это форк iText 4, который распространяется по лицензии LGPL/MPL. Он менее функционален, чем iText 7, но очень прост в использовании и не требует лицензионных отчислений.
Установка (Gradle)
implementation("com.github.librepdf:openpdf:1. Также в библиотеке
WebSocket библиотеки Rust: Tokio-tungstenite и async-tungstenite для реального времени
Kysely для TypeScript: полное руководство с примерами
Геолокация и карты в PHP: библиотеки, API и примеры кода
Сериализация объектов в TypeScript: Полное руководство