Динамическое создание PDF-файлов в Java-приложениях

Пошаговое руководство по библиотеке с открытым исходным iText, которая облегчает создание PDF-документов

Если приложение должно динамически создавать PDF-документы, вам понадобится библиотека iText. Библиотека с открытым исходным кодом iText значительно облегчает создание PDF. Эта статья знакомит читателя с библиотекой iText и содержит пошаговое руководство по ее использованию для создания PDF-документов в Java™-приложениях. Для наглядности мы создадим пример такого приложения.

Амит Тули, старший архитектор по интеграции, IBM

Амит Тули (Amit Tuli) — сертифицированный старший архитектор подразделения IBM Global Business Services. Активный автор статей и публикаций IBM Redbook, а также многих других полезных ресурсов. Выступает на технических конференциях. Почти все 12 лет своего трудового стажа работал в IBM, в подразделениях разработки, исследований, поддержки продуктов и взаимодействия с клиентами. Участвовал в создании интегрируемых архитектурных решений для крупнейших и известнейших клиентов в Индии и других странах в рамках сложнейших программ преобразований.



Зурбхи Агарвал, инженер-программист, IBM

Зурбхи Агарвал (Surbhi Agarwal) более семи лет работает в ИТ-индустрии. Имеет богатый опыт работы в группе AIX-продуктов, взаимодействия с клиентами IBM в рамках сложных интеграционных проектов и создания решений на базе продуктов IBM промежуточного уровня. Участвовала в сложных программах преобразований от начала и до конца. Имеет глубокий опыт в области бизнес-интеграции IBM и технологий баз данных, включая IBM DB2, Oracle, Solid Db, WebSphere MQ, WebSphere Message Broker, WebSphere Process Server, WebSphere Adapters, WebSphere Business Monitor и WebSphere Business Modeller. Сертифицированный специалист по IBM AIX.



28.01.2013

Во многих приложениях требуется динамически создавать PDF-документы. Это могут быть доставляемые по электронной почте отчеты для клиентов банка или отдельные главы книг, приобретаемые в формате PDF. Список можно продолжать бесконечно. В этой статье для создания PDF документов мы будем использовать Java-библиотеку iText. Мы приведем пример приложения, чтобы читатель смог лучше понять, как это делается, и повторить самостоятельно.

Знакомство с iText версии 5.3.0

iText ― это свободно доступная Java библиотека, размещенная на http://itextpdf.com/ (см. раздел Ресурсы). Кроме PDF, мощная библиотека iText поддерживает документы в форматах HTML, RTF и XML. Пользователь может выбирать различные шрифты. Кроме того, структура iText позволяет создавать любой из вышеупомянутых типов документов с помощью одного и того же кода.

Библиотека iText содержит классы для создания текста PDF с различными шрифтами, таблиц, страниц с водяными знаками и т.п. Существует много других возможностей, которые открывает iText. Продемонстрировать все это в одной статье не реально. Мы рассмотрим лишь основы, необходимые для создания PDF-документа. Более подробные сведения можно почерпнуть в документации производителя (см. раздел Ресурсы).

Для разработки примера приложения мы будем использовать Eclipse. Интегрированная среда разработки с открытым исходным кодом Eclipse ― свободно доступный и чрезвычайно мощный инструмент. Ее можно загрузить прямо сейчас (см. раздел Ресурсы).

API iText: более пристальный взгляд

Основным классом для создания PDF-документов является com.itextpdf.text.Document. Это первый класс, экземпляр которого нужно создать. Когда документ создан, потребуется редактор для его заполнения. Это класс com.itextpdf.text.pdf.PdfWriter. Ниже приводятся некоторые другие часто используемые классы:

  • com.itextpdf.text.Paragraph: создает абзац с отступом;
  • com.itextpdf.text.Chapter: создает главу PDF-документа с заголовком Paragraph и номером главы int;
  • com.itextpdf.text.Font: содержит все спецификации шрифтов, такие как начертание, размер, стиль и цвет. Различные шрифты объявляются как статические константы в этом классе;
  • com.itextpdf.text.List: создает список, который содержит ряд пунктов ListItems;
  • com.itextpdf.text.pdf.PDFPTable: таблица, которую можно расположить в абсолютной позиции или добавить в документ как класс Table;
  • com.itextpdf.text.Anchor: якорь может служить ссылкой или целью ссылки.

Загрузка и настройка iText в Eclipse

Как любая Java-библиотека, iText загружается в виде JAR-файла (см. раздел Ресурсы). Загрузив библиотеку (скажем, в каталог C:\temp), ее нужно настроить в среде Eclipse.

  1. Создайте в Eclipse новый проект Java с именем iText.
  2. Щелкните правой кнопкой мыши на проекте iText в окне Package Explorer и выберите пункт Properties.
  3. Выберите Java Build Path. На вкладке Libraries выберите Add External JARs (добавить внешние JAR-файлы).
  4. Перейдите в папку C:\temp и выберите itext-5.3.0.jar.
  5. Нажмите кнопку OK.

Теперь библиотека iText настроена, и Eclipse готов к созданию Java-приложений для динамического генерирования PDF-документов.


Пример приложения

Что может продемонстрировать любую технологию лучше, чем действующий образец, созданный своими руками? Теперь, когда у вас есть необходимые инструменты (Eclipse IDE) и библиотеки (iText), можно разработать образец действующей программы.

Создадим простой PDF-документ, содержащий некоторые базовые элементы, такие как обычный текст, цветной текст с нестандартным шрифтом, таблица, список, глава, раздел и т.д. Это приложение познакомит вас со способами использования библиотеки iText. Существует много классов, которые выполняют самую разнообразную работу по созданию PDF-документов. Мы не сможем охватить все эти классы. Документация Javadocs библиотеки iText ― хороший источник информации о том, как их использовать. Итак, приступим к программированию.

Первым шагом должно быть создание документа. Документ представляет собой контейнер для всех элементов PDF-документа.

Листинг 1. Создание экземпляра объекта документа
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

Первый аргумент ― это размер страницы. Следующие аргументы ― левое, правое, верхнее и нижнее поля. Тип документа пока не определен. Он зависит от типа редактора, который мы создадим. Выберем com.itextpdf.text.pdf.PdfWriter. Другие варианты редакторов: HtmlWriter, RtfWriter, XmlWriter и др. Имена этих редакторов указывают на их назначение.

Листинг 2. Создание объекта PdfWriter
PdfWriter writer = PdfWriter.getInstance(document, \

new FileOutputStream("C:\\ITextTest.pdf"));

document.open();

Первый аргумент ― это ссылка на объект документа, а второй ― абсолютное имя файла, в который будет записываться результат. Далее, открываем документ для записи.

Теперь добавим некоторый текст на первой странице документа. Любой текст добавляется с помощью com.itextpdf.text.Paragraph. Можно создать абзац по умолчанию с текстом и параметрами по умолчанию для шрифта, цвета, размера и т.д. Либо можно указать свой собственный шрифт. В этой статье мы также поговорим о якоре (ссылке) PDF-документа. В качестве ссылки используем backToTop. Нажатие на ссылку backToTop будет возвращать читателя к первой странице документа. На первой странице нужно задать текст в качестве цели якоря. Давайте посмотрим, как установить цель якоря и задать шрифт добавляемого абзаца.

Листинг 3. Создание объекта paragraph
Anchor anchorTarget = new Anchor("First page of the document.");
      anchorTarget.setName("BackToTop");
      Paragraph paragraph1 = new Paragraph();

      paragraph1.setSpacingBefore(50);

      paragraph1.add(anchorTarget);
      document.add(paragraph1);

document.add(new Paragraph("Some more text on the \

first page with different color and font type.", 

FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,	new CMYKColor(0, 255, 0, 0))));

На рисунке 1 приведен пример выполнения кода из листинга 3. Чтобы закрыть документ, добавьте в конце листинга 3 строку кода document.close();.

Рисунок 1. Результат исполнения кода в листинге 3
Пример результата исполнения кода в листинге 3

Итак, мы добавили текст в PDF-документ. Теперь нужно добавить некоторые сложные элементы. Начнем с создания новой главы. Глава ― это специальный раздел, который начинается с новой страницы и имеет номер (по умолчанию он отображается).

Листинг 4. Создание объект chapter
Paragraph title1 = new Paragraph("Chapter 1", 

   FontFactory.getFont(FontFactory.HELVETICA, 

   18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17)));

Chapter chapter1 = new Chapter(title1, 1);

chapter1.setNumberDepth(0);

Код, приведенный в листинге 4, создает новый объект chapter1 с заголовком This is Chapter 1 (Это глава 1). При установке глубины нумерации 0 номер главы отображаться не будет.

Раздел ― это вложенный элемент главы. Код, приведенный в листинге 5, создает новый объект section с заголовком This is Section 1 in Chapter 1 (Это раздел 1 главы 1). Чтобы добавить текст в этот раздел, создадим еще один объект paragraph, someSectionText и добавим его в объект section.

Листинг 5. Создание объекта section
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1", 

       FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 

       new CMYKColor(0, 255, 255,17)));

Section section1 = chapter1.addSection(title11);

Paragraph someSectionText = new Paragraph("This 

text comes as part of section 1 of chapter 1.");

section1.add(someSectionText);

someSectionText = new Paragraph("Following is a 3 X 2 table.");

section1.add(someSectionText);

Прежде чем добавлять таблицы, давайте посмотрим, как выглядит наш документ. Добавьте следующие две строки, чтобы закрыть документ, представленный на рисунке 2. Затем скомпилируйте и выполните программу создания PDF-документа: document.add(chapter1);document.close();.

Рисунок 2. Пример главы
Пример главы

Теперь создадим объект table. Таблица состоит из строк и столбцов. Ячейка строки может занимать несколько столбцов. Аналогично, в одном столбце ячейка может охватывать несколько строк.

Листинг 6. Создание объекта table
PdfPTable t = new PdfPTable(3);

      t.setSpacingBefore(25);

      t.setSpacingAfter(25);

      PdfPCell c1 = new PdfPCell(new Phrase("Header1"));  

      t.addCell(c1);

      PdfPCell c2 = new PdfPCell(new Phrase("Header2"));

      t.addCell(c2);

      PdfPCell c3 = new PdfPCell(new Phrase("Header3"));

      t.addCell(c3);

      t.addCell("1.1");

      t.addCell("1.2");

      t.addCell("1.3");

      section1.add(t);

Код из листинга 6 создает объект PDFPTable, t, с тремя столбцами и добавляет строки. Создадим три объекта PDFPcell с разным текстом, добавляя их в таблицу. Они добавляются к первой строке, начиная с первого столбца, с перемещением к следующему столбцу в той же строке. Когда строка завершена, следующая ячейка добавляется в первом столбце следующей строки. Ячейки можно добавлять в таблицу и просто заполняя их текстом, например, t.addCell("1.1");. В конце объект table добавляется в объект section.

Наконец, посмотрим, как добавить в PDF-документ список. Список содержит элементы ListItem. Он может быть нумерованным или ненумерованным. Передача первому аргументу значения true означает, что будет создан нумерованный список.

Листинг 7. Создание объекта list
List l = new List(true, false, 10);

l.add(new ListItem("First item of list"));

l.add(new ListItem("Second item of list"));

section1.add(l);

Мы добавили все в объект chapter1. Теперь добавим в java-проект изображение. Изображение можно масштабировать с помощью одного из следующих методов Image:

  • scaleAbsolute()
  • scaleAbsoluteWidth()
  • scaleAbsoluteHeight()
  • scalePercentage()
  • scaleToFit()

В листинге 8 используется метод scaleAbsolute. Затем объект image добавляется в объект Section.

Листинг 8. Добавление изображения в основной документ
Image image2 = Image.getInstance("IBMLogo.bmp");

      image2.scaleAbsolute(120f, 120f);

      section1.add(image2);

Класс com.itextpdf.text.Anchor в iText представляет собой ссылку на внешний Web-сайт или на внутренний элемент документа. На якорь (link) можно нажимать, как на ссылку на Web-странице. Чтобы добавить якорь, нужно создать новый элемент anchor и указать цель Anchor, созданную в листинге 3. Затем якорь добавляется в раздел, а раздел ― в документ.

Листинг 9. Добавление якоря в основной документ
Paragraph title2 = new Paragraph("Using Anchor", 

        FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 

        new CMYKColor(0, 255, 0, 0)));

section1.add(title2);

title2.setSpacingBefore(5000);

Anchor anchor2 = new Anchor("Back To Top");

anchor2.setReference("#BackToTop");

section1.add(anchor2);

Теперь пришло время добавить главу chapter1 в основной документ document. Здесь же мы закроем объект document, так как пример приложения завершен.

Листинг 10. Добавление главы в основной документ
document.add(chapter1);

document.close();

Выполнение примера приложения

  1. Загрузите пример приложения j-itextsample.jar (см. раздел Загрузка).
  2. Распакуйте j-itextsample.jar в каталог. Если извлечь его, например, в C:\temp, то файлы исходного кода и классов окажутся в каталоге C:\temp\com\itext\test.
  3. Откройте командную строку и измените каталог на C:\temp.
  4. Настройте переменную classpath системы на эту командную строку. Включите в classpath системы C:\temp\itext-5.3.0.jar. В Windows® выполните команду set classpath=C:\temp\itext-5.3.0.jar;%classpath%.
  5. Запустите приложение командой java com.itext.test.ITextTest.

Программа сгенерирует документ ITextTest.pdf в C:\. Рисунок 3 представляет собой снимок с экрана первой страницы PDF-документа.

Рисунок 3. Снимок с экрана PDF-документа
Снимок с экрана PDF-документа

Рисунок 4 содержит снимок с экрана главы 1 PDF-документа и раздела, текста, таблицы, списка и изображения в ней.

Рисунок 4. Снимок с экрана PDF-документа
Снимок с экрана PDF-документа

Рисунок 5 представляет собой снимок с экрана ссылки Anchor PDF-документа.

Рисунок 5. Снимок с экрана PDF-документа
Снимок с экрана PDF-документа

Заключение

Мы показали некоторые базовые элементы PDF-документа. Прелесть iText состоит в том, что один и тот же элемент синтаксиса можно использовать в редакторах разного типа. Кроме того, результат работы редактора можно перенаправить на консоль (в случае XML- и HTML-редакторов), в выходной поток сервлетов (в случае ответов на Web-запросы PDF-документов) или в OutputStream любого другого типа. Библиотека iText удобна и в тех ситуациях, когда ответ одинаков, но типом ответа может быть PDF, RTF, HTML или XML. iText позволяет создавать водяные знаки, шифровать документы и производить другие операции над результатом.


Загрузка

ОписаниеИмяРазмер
Пример кода, отредактированныйos-javapdf-itextsample.jar14 КБ

Ресурсы

Научиться

Получить продукты и технологии

  • Те, кто интересуется разработкой с помощью Eclipse, могут попробовать IBM Rational Application Developer Standard Edition, коммерческий инструмент разработки, построенный на базе технологии Eclipse.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы в первый раз заходите в developerWorks. Выберите данные в своем профиле (имя, страна/регион, компания) которые будут общедоступными и будут отображаться, когда вы публикуете какую-либо информацию. Вы можете изменить данные вашего ИБМ аккаунта в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=856514
ArticleTitle=Динамическое создание PDF-файлов в Java-приложениях
publish-date=01282013