Генерация 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 Также в библиотеке
Интернационализация (i18n) в Java: полное руководство с примерами
Dependency Injection контейнер для JavaScript (Node.js) — Awilix
Работа с CSV в PHP: библиотека SplFileObject и встроенные функции
JSON обработка в C# (.NET): Полное руководство по Newtonsoft.Json и System.Text.Json