Генерация PDF отчётов на Java: обзор библиотек и инструментов

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

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

Начать курс

Генерация 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> data = new ArrayList<>();
        data.add(Map.of("product", "Ноутбуки", "amount", 340));
        data.add(Map.of("product", "Мониторы", "amount", 120));

        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(data);

        // Заполнение
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);

        // Экспорт в PDF
        JasperExportManager.exportReportToPdfFile(jasperPrint, "annual_report.pdf");
        System.out.println("Отчёт сгенерирован!");
    }
}

Когда использовать: для enterprise-проектов, где отчёты разрабатываются дизайнерами и часто меняются. Отлично подходит для больших объёмов данных и сложных макетов.

4. OpenPDF — лё

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