Генерация PDF отчётов на Java: обзор библиотек и инструментов
Создание PDF-документов — одна из самых частых задач в корпоративной Java-разработке. Отчёты, счета, накладные, аналитические дашборды — всё это требует гибкого и производительного инструментария. В этой статье мы разберём четыре ключевые библиотеки для генерации PDF на Java: Apache PDFBox, iText, JasperReports и OpenPDF. Рассмотрим их сильные стороны, примеры кода и сценарии использования.
1. Apache PDFBox — низкоуровневое создание и редактирование
Apache PDFBox — это библиотека с открытым исходным кодом (лицензия Apache 2.0), которая позволяет создавать PDF-документы с нуля, а также редактировать, извлекать текст и заполнять формы. Главное преимущество — полный контроль над содержимым: вы работаете с объектами документа напрямую.
Пример создания простого PDF:
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import java.io.IOException;
public class PdfBoxExample {
public static void main(String[] args) throws IOException {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 14);
contentStream.beginText();
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Привет, мир PDFBox!");
contentStream.endText();
}
document.save("output.pdf");
System.out.println("PDF создан!");
}
}
}
Когда использовать: если нужен тонкий контроль над каждым элементом (например, для генерации сложных графиков или заполнения форм). Не подходит для больших объёмов текста без предварительной вёрстки.
2. iText — коммерческая мощь для сложных отчётов
iText — де-факто стандарт в индустрии. Существует в двух версиях: iText 7 Community (AGPL) и iText 7 Commercial (коммерческая лицензия). Библиотека поддерживает HTML-to-PDF, создание интерактивных форм, цифровые подписи, шифрование и многое другое.
Пример генерации PDF с таблицей:
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.layout.*;
import com.itextpdf.layout.element.*;
public class ITextExample {
public static void main(String[] args) throws Exception {
PdfWriter writer = new PdfWriter("report.pdf");
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
document.add(new Paragraph("Ежемесячный отчёт"));
Table table = new Table(2);
table.addCell("Показатель");
table.addCell("Значение");
table.addCell("Доход");
table.addCell("1 250 000 руб.");
table.addCell("Расход");
table.addCell("890 000 руб.");
document.add(table);
document.close();
System.out.println("Отчёт готов!");
}
}
Когда использовать: для коммерческих проектов, где нужна высокая производительность, поддержка сложной вёрстки и юридически значимых документов (подписи, шифрование). Внимание: AGPL-версия требует открытия кода при распространении.
3. JasperReports — генерация на основе шаблонов JRXML
JasperReports — это не просто библиотека, а целая экосистема для создания отчётов. Вы описываете шаблон в XML-формате (или через визуальный редактор Jaspersoft Studio), а библиотека заполняет его данными из БД, коллекций или JSON. Результат можно экспортировать в PDF, Excel, HTML, CSV и другие форматы.
Пример программного заполнения шаблона:
import net.sf.jasperreports.engine.*;
import java.util.*;
public class JasperExample {
public static void main(String[] args) throws JRException {
// Загрузка шаблона (report.jrxml должен быть скомпилирован в .jasper)
JasperReport jasperReport = JasperCompileManager.compileReport("report.jrxml");
// Параметры и данные
Map params = new HashMap<>();
params.put("TITLE", "Годовой отчёт 2024");
List
Когда использовать: для enterprise-проектов, где отчёты разрабатываются дизайнерами и часто меняются. Отлично подходит для больших объёмов данных и сложных макетов.