Генерация PDF отчётов на Java: обзор библиотек и примеры кода
Создание PDF-документов — одна из частых задач в корпоративных Java-приложениях: от формирования счетов и актов до построения сложных аналитических отчётов с графиками. В этой статье мы рассмотрим три основные библиотеки для генерации PDF на Java — iText, Apache PDFBox и JasperReports — сравним их возможности и приведём рабочие примеры кода.
1. iText — мощная и гибкая библиотека
iText (сейчас iText 8.x) — одна из самых популярных библиотек для работы с PDF на Java. Поддерживает создание документов с нуля, редактирование существующих, добавление изображений, таблиц, закладок, водяных знаков, а также работу с формами и цифровыми подписями.
Лицензирование: iText распространяется под двойной лицензией — AGPL (бесплатно для open-source проектов) и коммерческая (для проприетарного ПО).
Пример: создание простого 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 com.itextpdf.layout.element.Cell;
public class ItextPdfExample {
public static void main(String[] args) throws Exception {
String dest = "report.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// Заголовок
document.add(new Paragraph("Отчёт о продажах").setBold().setFontSize(18));
// Таблица
Table table = new Table(3);
table.addCell(new Cell().add(new Paragraph("Товар")));
table.addCell(new Cell().add(new Paragraph("Количество")));
table.addCell(new Cell().add(new Paragraph("Сумма")));
table.addCell("Ноутбук");
table.addCell("5");
table.addCell("450 000 ₽");
table.addCell("Мышь");
table.addCell("12");
table.addCell("6 000 ₽");
document.add(table);
document.close();
System.out.println("PDF создан!");
}
}
Этот код создаёт PDF с заголовком «Отчёт о продажах» и таблицей из трёх колонок. iText автоматически обрабатывает переносы строк и разбивку на страницы.
2. Apache PDFBox — лёгкая и бесплатная альтернатива
Apache PDFBox — библиотека с открытым исходным кодом (лицензия Apache 2.0), которая позволяет создавать, редактировать и извлекать текст из PDF-файлов. PDFBox не требует сторонних зависимостей и отлично подходит для простых задач: генерация текстовых документов, заполнение форм, извлечение данных.
Недостаток: работа с таблицами и сложной вёрсткой требует больше ручного кода, чем в iText.
Пример: создание 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.PDType0Font;
import java.io.File;
public class PdfBoxExample {
public static void main(String[] args) throws Exception {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
// Загрузка шрифта (обязательно!)
PDType0Font font = PDType0Font.load(document, new File("LiberationSans-Regular.ttf"));
contentStream.setFont(font, 14);
contentStream.beginText();
contentStream.newLineAtOffset(50, 700);
contentStream.showText("Привет, мир PDFBox!");
contentStream.endText();
contentStream.close();
document.save("pdfbox_example.pdf");
}
System.out.println("PDFBox PDF создан!");
}
}
Обратите внимание: в PDFBox необходимо явно загружать TrueType-шрифты для поддержки кириллицы (например, Liberation Sans).
3. JasperReports — профессиональное решение для отчётов
JasperReports — это не просто библиотека, а целая экосистема для генерации отчётов. Отчёты описываются в XML-шаблонах (.jrxml), которые можно визуально редактировать в Jaspersoft Studio (бесплатный дизайнер). Библиотека поддерживает группировку данных, подотчёты, диаграммы, кросс-таблицы и экспорт в PDF, Excel, HTML и другие форматы.
Когда использовать: для сложных корпоративных отчётов с большим объёмом данных, динамическими графиками и строгим форматированием.
Пример: простой отчёт из данных в памяти
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBean