PDF генерация в Kotlin: обзор библиотек и практические примеры
Kotlin, как современный язык для JVM, предоставляет разработчикам мощные инструменты для работы с PDF-документами. Благодаря полной совместимости с Java-экосистемой вы можете использовать проверенные временем библиотеки, такие как iText и Apache PDFBox, а также современные Kotlin-фреймворки. В этой статье мы рассмотрим основные подходы к генерации PDF на Kotlin, приведем примеры кода и сравним популярные решения.
Почему Kotlin для работы с PDF?
Kotlin предлагает ряд преимуществ перед Java при работе с PDF:
- Лаконичный синтаксис — меньше шаблонного кода для создания документов
- Null-безопасность — снижает риск ошибок при работе с nullable-полями
- Extension-функции — позволяют расширять функциональность библиотек
- DSL-построители — идеально подходят для описания структуры PDF
- Полная совместимость — все Java-библиотеки работают без изменений
Основные библиотеки для генерации PDF
1. iText (iText 7 / iText 8)
iText — самая популярная коммерческая библиотека для работы с PDF. Для Kotlin доступна через Java-интероп. Включает модули:
kernel— базовые операции с PDFlayout— высокоуровневое построение документаhtml2pdf— конвертация HTML в PDFpdfa— поддержка PDF/A
Пример создания простого PDF с iText 7 на Kotlin:
import com.itextpdf.kernel.pdf.PdfDocument
import com.itextpdf.kernel.pdf.PdfWriter
import com.itextpdf.layout.Document
import com.itextpdf.layout.element.Paragraph
import java.io.FileOutputStream
fun createSimplePdf() {
val writer = PdfWriter(FileOutputStream("hello_kotlin.pdf"))
val pdfDoc = PdfDocument(writer)
val document = Document(pdfDoc)
document.add(Paragraph("Привет, Kotlin!"))
document.add(Paragraph("Это PDF, созданный с помощью iText 7"))
document.close()
println("PDF успешно создан")
}
2. Apache PDFBox
Apache PDFBox — бесплатная библиотека с открытым исходным кодом. Отлично подходит для базовых задач: создание, редактирование, извлечение текста. В Kotlin используется через Java API.
Пример с PDFBox:
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.io.File
fun createPdfWithBox() {
val document = PDDocument()
val page = PDPage()
document.addPage(page)
val contentStream = PDPageContentStream(document, page)
contentStream.beginText()
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 14f)
contentStream.newLineAtOffset(50f, 700f)
contentStream.showText("PDFBox + Kotlin = ❤")
contentStream.endText()
contentStream.close()
document.save(File("pdfbox_example.pdf"))
document.close()
println("Документ сохранен")
}
3. Kotlin DSL для PDF (KPDF)
KPDF — нативная Kotlin-библиотека, использующая DSL-построители. Позволяет описывать документ в декларативном стиле:
// Пример с гипотетическим DSL (адаптация под реальные библиотеки)
fun generateInvoice() {
pdfDocument {
page {
paragraph("Счет №123") {
fontSize = 24
bold()
}
table {
row { cell("Товар"); cell("Цена") }
row { cell("Kotlin-консультация"); cell("5000 руб") }
}
}
}.save("invoice.pdf")
}
Сравнение библиотек
| Критерий | iText | PDFBox | KPDF (DSL) |
|---|---|---|---|
| Лицензия | AGPL (коммерческая) | Apache 2.0 | MIT |
| Простота Kotlin | Средняя | Средняя | Высокая |
| Поддержка HTML | Да (html2pdf) | Нет | Нет |
| Производительность | Высокая
Также в библиотекеРекомендаций |