Генерация 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");
}
}
}