PDF генерация в Kotlin: лучшие библиотеки и примеры кода

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

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

Начать курс

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

Генерация PDF-документов — одна из частых задач в современных приложениях: от создания отчётов и счетов до формирования сертификатов и электронных книг. Kotlin, благодаря своей лаконичности и совместимости с Java, предоставляет разработчикам доступ к мощным Java-библиотекам для работы с PDF. В этой статье мы рассмотрим три основные библиотеки: iText, Apache PDFBox и OpenPDF, а также приведём примеры кода на Kotlin.

1. iText — мощная и гибкая библиотека

iText — одна из самых популярных библиотек для создания и манипуляции PDF-документами на JVM. Она поддерживает сложное форматирование, таблицы, изображения, водяные знаки, шифрование и многое другое. Для Kotlin доступна официальная обёртка iText7 с Kotlin-расширениями.

Подключение (Gradle)

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

Пример: создание простого 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 createSimplePdf(fileName: String) {
    val writer = PdfWriter(fileName)
    val pdf = PdfDocument(writer)
    val document = Document(pdf)

    document.add(Paragraph("Привет, мир PDF на Kotlin!"))
    document.add(Paragraph("Это пример использования iText7."))

    document.close()
    println("PDF создан: $fileName")
}

fun main() {
    createSimplePdf("example_itext.pdf")
}

Пример: таблица с данными

import com.itextpdf.layout.element.Table
import com.itextpdf.layout.element.Cell

fun createTablePdf(fileName: String) {
    val writer = PdfWriter(fileName)
    val pdf = PdfDocument(writer)
    val document = Document(pdf)

    val table = Table(3) // 3 колонки
    table.addHeaderCell("Имя")
    table.addHeaderCell("Возраст")
    table.addHeaderCell("Город")

    table.addCell("Анна")
    table.addCell("28")
    table.addCell("Москва")

    table.addCell("Иван")
    table.addCell("35")
    table.addCell("Санкт-Петербург")

    document.add(table)
    document.close()
    println("PDF с таблицей создан: $fileName")
}

2. Apache PDFBox — лёгкая и бесплатная альтернатива

Apache PDFBox — это open-source библиотека с открытым исходным кодом (лицензия Apache 2.0). Она идеально подходит для базовых задач: создание документов, извлечение текста, заполнение форм. В отличие от iText, PDFBox не требует лицензионных отчислений для коммерческого использования.

Подключение (Gradle)

dependencies {
    implementation("org.apache.pdfbox:pdfbox:2.0.27")
}

Пример: создание 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

fun createPdfWithPdfBox(fileName: String) {
    val document = PDDocument()
    val page = PDPage()
    document.addPage(page)

    val contentStream = PDPageContentStream(document, page)
    contentStream.beginText()
    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 14f)
    contentStream.newLineAtOffset(100f, 700f)
    contentStream.showText("PDFBox + Kotlin = отлично!")
    contentStream.endText()
    contentStream.close()

    document.save(fileName)
    document.close()
    println("PDF создан: $fileName")
}

Пример: добавление изображения

import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject

fun createPdfWithImage(fileName: String, imagePath: String) {
    val document = PDDocument()
    val page = PDPage()
    document.addPage(page)

    val image = PDImageXObject.createFromFile(imagePath, document)
    val contentStream = PDPageContentStream(document, page)
    contentStream.drawImage(image, 100f, 500f, 200f, 150f) // x, y, width, height
    contentStream.close()

    document.save(fileName)
    document.close()
    println("PDF с изображением создан: $fileName")
}

3. OpenPDF — простая и легковесная библиотека

OpenPDF — это форк iText 4, распространяемый под лицензией LGPL. Он идеально подходит для небольших проектов, где не нужны все возможности iText. Библиотека проста в использовании и не требует лицензирования.

Подключение (Gradle)

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