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; Также в библиотеке
Логирование в Go (Golang): лучшие библиотеки и решения для продакшена
Сериализация объектов в JavaScript (Node.js): полное руководство
WebSocket библиотека Kotlin: ktor-client-websockets для реального времени
mapstructure для Go: полное руководство с примерами
PDF генерация в C# (.NET): лучшие библиотеки и примеры кода