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

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

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

Начать курс

PDF генерация в Java: обзор лучших библиотек

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

1. iText — мощный и коммерческий стандарт

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

Лицензирование: iText распространяется под двойной лицензией. Для открытых проектов (AGPL) — бесплатно, для коммерческого использования требуется покупка лицензии.

Пример: создание простого PDF с таблицей

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.property.UnitValue;

public class ItextExample {
    public static void main(String[] args) throws Exception {
        String dest = "example_itext.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document document = new Document(pdfDoc);

        // Добавляем заголовок
        document.add(new Paragraph("Отчёт о продажах"));

        // Создаём таблицу
        Table table = new Table(UnitValue.createPercentArray(3)).useAllAvailableWidth();
        table.addHeaderCell(new Cell().add(new Paragraph("Товар")));
        table.addHeaderCell(new Cell().add(new Paragraph("Количество")));
        table.addHeaderCell(new Cell().add(new Paragraph("Цена")));

        table.addCell(new Cell().add(new Paragraph("Ноутбук")));
        table.addCell(new Cell().add(new Paragraph("10")));
        table.addCell(new Cell().add(new Paragraph("1200 $")));

        table.addCell(new Cell().add(new Paragraph("Мышь")));
        table.addCell(new Cell().add(new Paragraph("50")));
        table.addCell(new Cell().add(new Paragraph("25 $")));

        document.add(table);
        document.close();

        System.out.println("PDF создан: " + dest);
    }
}

Плюсы iText: огромное сообщество, отличная документация, поддержка сложных сценариев (подписи, формы, PDF/UA). Минусы: высокая стоимость коммерческой лицензии.

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

Apache PDFBox — полностью бесплатная библиотека с лицензией Apache 2.0. Она позволяет не только создавать 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 org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.File;

public class PdfBoxExample {
    public static void main(String[] args) throws Exception {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);

        PDPageContentStream contentStream = new PDPageContentStream(document, page);

        // Загружаем шрифт (нужен файл шрифта)
        PDType0Font font = PDType0Font.load(document, new File("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"));
        contentStream.setFont(font, 14);
        contentStream.beginText();
        contentStream.newLineAtOffset(50, 700);
        contentStream.showText("Привет, мир PDFBox!");
        contentStream.endText();

        // Вставляем изображение
        PDImageXObject pdImage = PDImageXObject.createFromFile("logo.png", document);
        contentStream.drawImage(pdImage, 50, 600, 100, 100);

        contentStream.close();
        document.save("example_pdfbox.pdf");
        document.close();

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

Плюсы PDFBox: полная бесплатность, возможность редактирования существующих PDF, работа с формами. Минусы: API более низкоуровневый, чем у iText, требует больше кода для сложной вёрстки.

3. OpenPDF — лёгкий наследник iText

OpenPDF — это форк старой версии iText (до перехода на AGPL). Библиотека полностью бесплатна (LGPL) и очень проста в использовании. Она идеально подходит для базовых задач: создание простых отчётов, счетов, накладных.

Пример: создание документа с заголовком и списком

import com.lowagie.text.Document;                    

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