Генерация PDF отчётов на Kotlin: библиотеки и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генерация 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.                    

Рекомендаций