Генерация PDF в Java: обзор библиотек iText, Apache PDFBox и OpenPDF
Создание PDF-документов — одна из частых задач в корпоративных и веб-приложениях на Java: от формирования отчётов и счетов до экспорта данных и создания электронных книг. В Java существует несколько成熟 библиотек, каждая со своими сильными сторонами. В этой статье мы рассмотрим три основные: iText, Apache PDFBox и OpenPDF, приведём примеры кода и поможем выбрать подходящий инструмент.
1. iText — мощный, но с коммерческой лицензией
iText — самая популярная библиотека для работы с PDF. Она предоставляет полный контроль над содержимым: текст, изображения, таблицы, формы, водяные знаки, подписи. Начиная с версии 5.5.x, iText распространяется под двойной лицензией AGPL (бесплатно для open-source проектов) и коммерческой (для проприетарного ПО). Версия 7.x (iText 7) — более современная, модульная и высокопроизводительная.
Пример: создание простого PDF с текстом (iText 7)
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
public class CreatePdfWithIText {
public static void main(String[] args) throws Exception {
String dest = "output_itext.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
document.add(new Paragraph("Привет, мир PDF!"));
document.add(new Paragraph("Это создано с помощью iText 7."));
document.close();
System.out.println("PDF успешно создан: " + dest);
}
}
Плюсы iText:
- Максимальная гибкость: поддержка таблиц, списков, стилей, шрифтов, изображений.
- Работа с PDF/A, шифрованием, цифровыми подписями.
- Высокая производительность и качество рендеринга.
Минусы:
- Сложная лицензия (AGPL) — для коммерческого использования требуется покупка.
- Довольно объёмный API, требующий изучения.
2. Apache PDFBox — бесплатный и открытый
Apache PDFBox — библиотека с открытым исходным кодом (лицензия Apache 2.0), которая позволяет создавать, редактировать и извлекать содержимое PDF. В отличие от iText, PDFBox не требует коммерческой лицензии для проприетарных проектов. Она также поддерживает работу с формами, шифрованием, встраиванием шрифтов.
Пример: создание 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 java.io.IOException;
public class CreatePdfWithPdfBox {
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.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 14);
contentStream.newLineAtOffset(50, 700);
contentStream.showText("Привет, мир PDF!");
contentStream.newLineAtOffset(0, -20);
contentStream.showText("Это создано с помощью Apache PDFBox.");
contentStream.endText();
}
document.save("output_pdfbox.pdf");
System.out.println("PDF успешно создан: output_pdfbox.pdf");
}
}
}
Плюсы Apache PDFBox:
- Полностью бесплатно (лицензия Apache 2.0) — подходит для любых проектов.
- Поддержка извлечения текста, изображений, метаданных.
- Простой API для базовых операций.
Минусы:
- Меньше возможностей для сложного форматирования (таблицы, стили) — часто приходится позиционировать элементы вручную.
- Производительность может быть ниже, чем у iText при работе с большими документами.
3. OpenPDF — форк iText с открытой лицензией
OpenPDF — это форк старой версии iText (5.x), который был выпущен под лицензией LGPL. Он сохранил привычный API iText, но при этом является полностью открытым и бесплатным. Подходит для проектов, где важна совместимость с legacy-кодом, написанным под iText 5.
Пример: создание PDF с таблицей (OpenPDF)
import com.lowagie Также в библиотеке
OAuth клиент для PHP: аутентификация через социальные сети и API
Supertest для JavaScript (Node.js): полное руководство с примерами
Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов
JWT токены в Swift: полное руководство по работе с JSON Web Tokens
HTTP-клиент для Go (Golang): топ библиотек для работы с HTTP