Генерация PDF отчётов на Kotlin: библиотека iText 7

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

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

Начать курс

Генерация PDF отчётов на Kotlin с помощью iText 7

В современной разработке часто возникает необходимость создавать структурированные PDF-документы: отчёты, счета, договоры или аналитические выкладки. Язык Kotlin, благодаря своей лаконичности и совместимости с Java, отлично подходит для этой задачи. Одной из самых мощных и популярных библиотек для работы с PDF является iText 7 (ранее iTextSharp для .NET). В этой статье мы разберём, как с её помощью генерировать профессиональные PDF-отчёты на Kotlin.

Почему iText 7?

  • Полный контроль над содержимым: текст, таблицы, изображения, шрифты.
  • Производительность: библиотека оптимизирована для работы с большими документами.
  • Кроссплатформенность: работает на JVM, Android и в вебе.
  • Лицензирование: AGPL для открытых проектов или коммерческая лицензия.

Установка (Gradle)

Добавьте зависимость в build.gradle.kts:

dependencies {
    implementation("com.itextpdf:itext7-core:7.2.5")
}

Базовый пример: "Hello, PDF!"

Создадим простейший PDF-документ с текстом:

import com.itextpdf.kernel.pdf.PdfDocument
import com.itextpdf.kernel.pdf.PdfWriter
import com.itextpdf.layout.Document
import com.itextpdf.layout.element.Paragraph

fun main() {
    val writer = PdfWriter("hello.pdf")
    val pdf = PdfDocument(writer)
    val document = Document(pdf)

    document.add(Paragraph("Привет, мир PDF на Kotlin!"))
    document.close()
    println("PDF создан: hello.pdf")
}

Создание отчёта с таблицами и стилями

Для реального отчёта нужно больше, чем просто текст. Добавим таблицу, заголовки и стили:

import com.itextpdf.kernel.colors.ColorConstants
import com.itextpdf.kernel.pdf.PdfDocument
import com.itextpdf.kernel.pdf.PdfWriter
import com.itextpdf.layout.Document
import com.itextpdf.layout.element.Cell
import com.itextpdf.layout.element.Paragraph
import com.itextpdf.layout.element.Table
import com.itextpdf.layout.properties.UnitValue

fun generateReport() {
    val writer = PdfWriter("report.pdf")
    val pdf = PdfDocument(writer)
    val document = Document(pdf)

    // Заголовок
    val title = Paragraph("Ежемесячный отчёт по продажам")
        .setFontSize(20)
        .setBold()
        .setTextAlignment(com.itextpdf.layout.properties.TextAlignment.CENTER)
    document.add(title)

    // Таблица
    val table = Table(UnitValue.createPercentArray(floatArrayOf(1f, 2f, 1.5f, 1.5f)))
    table.setWidth(UnitValue.createPercentValue(100))

    // Заголовки таблицы
    val headers = listOf("ID", "Товар", "Количество", "Цена")
    headers.forEach { header ->
        val cell = Cell().add(Paragraph(header).setBold())
        cell.setBackgroundColor(ColorConstants.LIGHT_GRAY)
        table.addCell(cell)
    }

    // Данные
    val data = listOf(
        listOf("1", "Ноутбук", "3", "150000"),
        listOf("2", "Мышь", "10", "5000"),
        listOf("3", "Клавиатура", "5", "12500")
    )
    data.forEach { row ->
        row.forEach { value ->
            table.addCell(Cell().add(Paragraph(value)))
        }
    }

    document.add(table)
    document.close()
    println("Отчёт создан: report.pdf")
}

fun main() {
    generateReport()
}

Добавление изображений и стилей

Часто в отчёты нужно вставлять логотипы или графики. iText 7 поддерживает изображения:

import com.itextpdf.kernel.pdf.PdfDocument
import com.itextpdf.kernel.pdf.PdfWriter
import com.itextpdf.layout.Document
import com.itextpdf.layout.element.Image
import com.itextpdf.io.image.ImageDataFactory

fun addImageExample() {
    val writer = PdfWriter("report_with_image.pdf")
    val pdf = PdfDocument(writer)
    val document = Document(pdf)

    // Вставка изображения (логотип)
    val imagePath = "logo.png"
    val imageData = ImageDataFactory.create(imagePath)
    val image = Image(imageData)
    image.setWidth(100f) // ширина в пунктах
    document.add(image)

    document.add(Paragraph("Текст после изображения"))
    document.close()
}

Работа со шрифтами (кириллица)

Для корректного отображения русского текста необходимо зарегистрировать шрифт, поддерживающий кириллицу. Используйте PdfFontFactory:

import com.itextpdf.kernel.font.PdfFontFactory
import com.itextpdf.kernel                    

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