Генерация PDF в Java: обзор библиотек iText, Apache PDFBox, OpenPDF

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

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

Начать курс

Генерация PDF в Java: обзор популярных библиотек

Создание PDF-документов — одна из частых задач в корпоративной и образовательной разработке на Java. Отчёты, счета, сертификаты, учебные материалы — всё это удобно экспортировать в PDF. В Java существует несколько зрелых библиотек, позволяющих как создавать PDF с нуля, так и редактировать существующие файлы. В этой статье мы рассмотрим три наиболее популярных инструмента: iText, Apache PDFBox и OpenPDF.

1. iText — мощный, но с лицензионными ограничениями

iText — самая известная Java-библиотека для работы с PDF. Она существует с 2000 года и поддерживает практически все возможности формата: текст, таблицы, изображения, водяные знаки, аннотации, подписи и многое другое.

Однако у iText есть важный нюанс: с версии 5.5.x библиотека выпускается под двойной лицензией. Для коммерческого использования требуется покупка AGPL-лицензии, если вы не распространяете своё приложение с открытым кодом. Для образовательных проектов, размещённых в открытом доступе, версия iText 5.x под AGPL подходит.

Пример создания простого PDF с текстом и таблицей с помощью iText 5:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;

public class ITextExample {
    public static void main(String[] args) throws Exception {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("example_itext.pdf"));
        document.open();

        // Заголовок
        document.add(new Paragraph("Пример PDF с iText", FontFactory.getFont(FontFactory.HELVETICA_BOLD, 18)));

        // Таблица
        PdfPTable table = new PdfPTable(3);
        table.addCell("Столбец 1");
        table.addCell("Столбец 2");
        table.addCell("Столбец 3");
        table.addCell("Данные 1");
        table.addCell("Данные 2");
        table.addCell("Данные 3");
        document.add(table);

        document.close();
        System.out.println("PDF создан: example_itext.pdf");
    }
}

2. Apache PDFBox — бесплатно и с открытым кодом

Apache PDFBox — полностью бесплатная библиотека под лицензией Apache 2.0. Она не имеет ограничений на коммерческое использование и предоставляет низкоуровневый API для работы с PDF. PDFBox позволяет создавать документы, извлекать текст, заполнять формы, работать с изображениями и даже создавать сложные макеты.

Основное преимущество PDFBox — гибкость и отсутствие лицензионных сборов. Недостаток — API менее удобен для простых задач, чем iText, и требует больше кода для форматирования.

Пример создания PDF с текстом и таблицей с помощью PDFBox 2.x:

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 org.apache.pdfbox.pdmodel.common.PDRectangle;
import java.io.IOException;

public class PDFBoxExample {
    public static void main(String[] args) throws IOException {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage(PDRectangle.A4);
            document.addPage(page);

            try (PDPageContentStream cs = new PDPageContentStream(document, page)) {
                // Заголовок
                cs.setFont(PDType1Font.HELVETICA_BOLD, 18);
                cs.beginText();
                cs.newLineAtOffset(50, 750);
                cs.showText("Пример PDF с PDFBox");
                cs.endText();

                // Простая таблица (имитация)
                cs.setFont(PDType1Font.HELVETICA, 12);
                cs.setLineWidth(1f);
                // Рисуем линии таблицы вручную (упрощённо)
                for (int i = 0; i < 4; i++) {
                    cs.moveTo(50, 700 - i * 30);
                    cs.lineTo(500, 700 - i * 30);
                    cs.stroke();
                }
                cs.moveTo(50, 700);
                cs.lineTo(50, 610);
                cs.stroke();
                cs.moveTo(200, 700);
                cs.lineTo(200, 610);
                cs.stroke();
                cs.moveTo(350, 700);
                cs.lineTo(350, 610);
                cs.stroke();
                cs.moveTo(500, 700);
                cs.lineTo(500, 610);
                cs.stroke();

                // Текст в ячейках
                cs.beginText();
                cs.newLineAtOffset(60, 680);
                cs.showText("Столбец 1");
                cs.newLineAtOffset(150, 0);
                cs.showText("Столбец 2");
                cs.newLineAtOffset(150, 0);
                cs.showText("Столбец 3");
                cs.endText();
            }

            document.save("example_pdfbox.pdf");
            System.out.println("PDF создан: example_pdfbox.pdf");
        }
    }
}

3. OpenPDF — л

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