Java – чтение и запись PDF с помощью iText

В этом уроке iText мы пишем различные примеры кода для чтения PDF-файла и записи PDF-файла. Библиотека iText помогает в динамической генерации .pdf-файлов из приложений Java.

Приведенные примеры кода разбиты на несколько разделов в зависимости от функциональности, которую они достигают. К каждому примеру я приложил скриншот сгенерированного файла PDF, чтобы наглядно представить, что именно код пишет в файле PDF. Вы можете расширить эти примеры в соответствии со своими потребностями.

1. Библиотека iText

С другой стороны, iText — это библиотека с открытым исходным кодом. Обратите внимание, что хотя iText — библиотека с открытым исходным кодом, вам все равно нужно будет приобрести коммерческую лицензию, если вы хотите использовать ее в коммерческих целях.

iText доступен бесплатно по адресу https://itextpdf.com/. Библиотека iText мощная и поддерживает создание документов HTML, RTF и XML, а также создание PDF-файлов.

Мы можем выбирать из различных шрифтов, которые будут использоваться в документе. Кроме того, структура iText позволяет нам генерировать любой из вышеупомянутых типов документов с тем же кодом. Разве это не замечательная функция, не так ли?

Библиотека iText содержит классы для генерации текста PDF с использованием различных шрифтов, создания таблиц в документах PDF, добавления водяных знаков на страницы и т. д. В iText доступно еще множество функций, изучение которых я оставлю вам.

Чтобы добавить iText в ваше приложение, включите следующий репозиторий maven в наш файл pom.xml.

 <зависимость><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><версия>5.5.13.2</версия></зависимость>

Или мы можем загрузить последние jar-файлы из репозитория maven.

2. Основные классы

Давайте перечислим и познакомимся с основными классами, которые мы будем использовать в этом приложении.

  • com.itextpdf.text.Document : Это самый важный класс в библиотеке iText, представляющий экземпляр документа PDF. Если вам нужно создать документ PDF с нуля, вы будете использовать класс Document. Сначала вы должны создать экземпляр Document. Затем вы должны открыть его. После этого вы добавляете содержимое в документ. Наконец, вы закрываете экземпляр Document.
  • com.itextpdf.text.Paragraph : Этот класс представляет отступ «абзаца» текста. В абзаце можно задать выравнивание абзаца, отступ и интервал до и после абзаца.
  • com.itextpdf.text.Chapter : Этот класс представляет главу в документе PDF. Он создается с использованием Paragraph в качестве заголовка и int в качестве номера главы.
  • com.itextpdf.text.Font : Этот класс содержит все спецификации шрифта, такие как семейство шрифтов, размер, стиль и цвет. Различные шрифты объявляются как статические константы в этом классе.
  • com.itextpdf.text.List : этот класс представляет список, который, в свою очередь, содержит несколько элементов ListItem.
  • com.itextpdf.text.pdf.PDFPTable : Это таблица, которая может быть размещена в абсолютной позиции, но также может быть добавлена в документ как класс Table.
  • com.itextpdf.text.Anchor : Якорь может быть ссылкой или местом назначения ссылки. Ссылка, как на HTML-страницах.
  • com.itextpdf.text.pdf.PdfWriter : Когда этот PdfWriter добавляется к определенному PdfDocument, PDF-представление каждого элемента, добавленного в этот документ, будет записано в выходной поток, подключенный к Writer(файл или сеть).
  • com.itextpdf.text.pdf.PdfReader : Используется для чтения PDF-документа. Просто и понятно.

3. Пример iText Hello World

Давайте начнем писать наши примеры кодов с типичного приложения Hello World. Я создам PDF-файл с одним оператором в содержании.

 импортировать java.io.FileNotFoundException;импорт java.io.FileOutputStream;импорт com.itextpdf.text.Document;импорт com.itextpdf.text.DocumentException;импорт com.itextpdf.text.Apagraph;импорт com.itextpdf.text.pdf.PdfWriter;публичный класс JavaPdfHelloWorld{public static void main(String[] args){Документ документ = новый Документ();пытаться{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));документ.открыть();document.add(new Paragraph("Документ PDF Hello World."));документ.закрыть();писатель.закрыть();} catch(DocumentException e){e.printStackTrace();} поймать(FileNotFoundException e){e.printStackTrace();}}} 
Вывод программы Hello World в формате PDF
Вывод программы Hello World в формате PDF

4. Установка атрибутов файла на PDF

В этом примере показано, как задать различные атрибуты, такие как имя автора, дата создания, имя создателя или просто название PDF-файла.

Document document = new Document();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("SetAttributeExample.pdf"));document.open();document.add(new Paragraph("Some content here"));//Set attributes heredocument.addAuthor("Lokesh Gupta");document.addCreationDate();document.addCreator("HowToDoInJava.com");document.addTitle("Set Attribute Example");document.addSubject("An example to show how attributes can be added to pdf files.");document.close();writer.close();} catch(Exception e){e.printStackTrace();}
Вывод SetAttributeExample в формате PDF
Вывод SetAttributeExample в формате PDF

5. Добавление изображений в PDF

Пример, показывающий, как можно добавлять изображения в файлы PDF. Пример содержит добавление изображений из файловой системы, а также URL-адресов. Также я добавил код для размещения изображений в документе.

Document document = new Document();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("AddImageExample.pdf"));document.open();document.add(new Paragraph("Image Example"));//Add ImageImage image1 = Image.getInstance("temp.jpg");//Fixed Positioningimage1.setAbsolutePosition(100f, 550f);//Scale to new height and new width of imageimage1.scaleAbsolute(200, 200);//Add to documentdocument.add(image1);String imageUrl = "http://www.eclipse.org/xtend/images/java8_logo.png";Image image2 = Image.getInstance(new URL(imageUrl));document.add(image2);document.close();writer.close();} catch(Exception e){e.printStackTrace();}
Вывод AddImageExample в формате PDF
Вывод AddImageExample в формате PDF

6. Создание таблицы в формате PDF

Ниже приведен пример добавления таблиц в PDF-документ.

public static void main(String[] args){Document document = new Document();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("AddTableExample.pdf"));document.open();PdfPTable table = new PdfPTable(3); // 3 columns.table.setWidthPercentage(100); //Width 100%table.setSpacingBefore(10f); //Space before tabletable.setSpacingAfter(10f); //Space after table//Set Column widthsfloat[] columnWidths = {1f, 1f, 1f};table.setWidths(columnWidths);PdfPCell cell1 = new PdfPCell(new Paragraph("Cell 1"));cell1.setBorderColor(BaseColor.BLUE);cell1.setPaddingLeft(10);cell1.setHorizontalAlignment(Element.ALIGN_CENTER);cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);PdfPCell cell2 = new PdfPCell(new Paragraph("Cell 2"));cell2.setBorderColor(BaseColor.GREEN);cell2.setPaddingLeft(10);cell2.setHorizontalAlignment(Element.ALIGN_CENTER);cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);PdfPCell cell3 = new PdfPCell(new Paragraph("Cell 3"));cell3.setBorderColor(BaseColor.RED);cell3.setPaddingLeft(10);cell3.setHorizontalAlignment(Element.ALIGN_CENTER);cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);//To avoid having the cell border and the content overlap, if you are having thick cell borders//cell1.setUserBorderPadding(true);//cell2.setUserBorderPadding(true);//cell3.setUserBorderPadding(true);table.addCell(cell1);table.addCell(cell2);table.addCell(cell3);document.add(table);document.close();writer.close();} catch(Exception e){e.printStackTrace();}}
Вывод AddTableExample в формате PDF
Вывод AddTableExample в формате PDF

7. Создание списка элементов в PDF

Приведенный ниже пример поможет вам понять, как писать списки в PDF-файлах с помощью библиотеки iText.

Document document = new Document();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("ListExample.pdf"));document.open();document.add(new Paragraph("List Example"));//Add ordered listList orderedList = new List(List.ORDERED);orderedList.add(new ListItem("Item 1"));orderedList.add(new ListItem("Item 2"));orderedList.add(new ListItem("Item 3"));document.add(orderedList);//Add un-ordered listList unorderedList = new List(List.UNORDERED);unorderedList.add(new ListItem("Item 1"));unorderedList.add(new ListItem("Item 2"));unorderedList.add(new ListItem("Item 3"));document.add(unorderedList);//Add roman listRomanList romanList = new RomanList();romanList.add(new ListItem("Item 1"));romanList.add(new ListItem("Item 2"));romanList.add(new ListItem("Item 3"));document.add(romanList);//Add Greek listGreekList greekList = new GreekList();greekList.add(new ListItem("Item 1"));greekList.add(new ListItem("Item 2"));greekList.add(new ListItem("Item 3"));document.add(greekList);//ZapfDingbatsList List ExampleZapfDingbatsList zapfDingbatsList = new ZapfDingbatsList(43, 30);zapfDingbatsList.add(new ListItem("Item 1"));zapfDingbatsList.add(new ListItem("Item 2"));zapfDingbatsList.add(new ListItem("Item 3"));document.add(zapfDingbatsList);//List and Sublist ExamplesList nestedList = new List(List.UNORDERED);nestedList.add(new ListItem("Item 1"));List sublist = new List(true, false, 30);sublist.setListSymbol(new Chunk("", FontFactory.getFont(FontFactory.HELVETICA, 6)));sublist.add("A");sublist.add("B");nestedList.add(sublist);nestedList.add(new ListItem("Item 2"));sublist = new List(true, false, 30);sublist.setListSymbol(new Chunk("", FontFactory.getFont(FontFactory.HELVETICA, 6)));sublist.add("C");sublist.add("D");nestedList.add(sublist);document.add(nestedList);document.close();writer.close();} catch(Exception e){e.printStackTrace();}
ListExample Пример PDF
ListExample Пример PDF

8. Оформление содержимого PDF-файла

Давайте рассмотрим несколько примеров стилизации содержимого PDF. Пример содержит использование шрифтов, глав и разделов.

Font blueFont = FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL, new CMYKColor(255, 0, 0, 0));Font redFont = FontFactory.getFont(FontFactory.COURIER, 12, Font.BOLD, new CMYKColor(0, 255, 0, 0));Font yellowFont = FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new CMYKColor(0, 0, 255, 0));Document document = new Document();try{PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("StylingExample.pdf"));document.open();//document.add(new Paragraph("Styling Example"));//Paragraph with color and font stylesParagraph paragraphOne = new Paragraph("Some colored paragraph text", redFont);document.add(paragraphOne);//Create chapter and sectionsParagraph chapterTitle = new Paragraph("Chapter Title", yellowFont);Chapter chapter1 = new Chapter(chapterTitle, 1);chapter1.setNumberDepth(0);Paragraph sectionTitle = new Paragraph("Section Title", redFont);Section section1 = chapter1.addSection(sectionTitle);Paragraph sectionContent = new Paragraph("Section Text content", blueFont);section1.add(sectionContent);document.add(chapter1);document.close();writer.close();} catch(Exception e){e.printStackTrace();}
StylingExample Пример PDF
StylingExample Пример PDF

9. PDF-файл, защищенный паролем

Давайте рассмотрим пример создания защищенного паролем файла PDF. Здесь writer.setEncryption() используется для установки пароля на сгенерированный PDF.

Нам нужно добавить генерацию jar-файлов Bouncy Castle для защищенных паролем PDF-файлов. Я добавил эти jar-файлы в исходный код примеров для этого поста.

private static String USER_PASSWORD = "password";private static String OWNER_PASSWORD = "lokesh";public static void main(String[] args) {try{OutputStream file = new FileOutputStream(new File("PasswordProtected.pdf"));Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, file);writer.setEncryption(USER_PASSWORD.getBytes(),OWNER_PASSWORD.getBytes(), PdfWriter.ALLOW_PRINTING,PdfWriter.ENCRYPTION_AES_128);document.open();document.add(new Paragraph("Password Protected pdf example !!"));document.close();file.close();} catch(Exception e){e.printStackTrace();}}
Защищенный паролем PDF-файл
Защищенный паролем PDF-файл

10. Создание PDF-файлов с ограниченными правами доступа

В этом примере я устанавливаю несколько разрешений для файла pdf, чтобы ограничить доступ для других пользователей. Ниже приведены несколько значений разрешений:

 PdfWriter.ALLOW_PRINTINGPdfWriter.ALLOW_ASSEMBLYPdfWriter.ALLOW_COPYPdfWriter.ALLOW_DEGRADED_PRINTINGPdfWriter.ALLOW_FILL_INPdfWriter.ALLOW_MODIFY_ANNOTATIONSPdfWriter.ALLOW_MODIFY_CONTENTSPdfWriter.ALLOW_SCREENREADERS

Вы можете предоставить несколько разрешений, используя ORing для разных значений. Например, PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY.

public static void main(String[] args) {try {OutputStream file = new FileOutputStream(new File("LimitedAccess.pdf"));Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, file);writer.setEncryption("".getBytes(), "".getBytes(),PdfWriter.ALLOW_PRINTING , //Only printing allowed; Try to copy text !!PdfWriter.ENCRYPTION_AES_128);document.open();document.add(new Paragraph("Limited Access File !!"));document.close();file.close();} catch(Exception e) {e.printStackTrace();}}

11. Чтение и изменение существующего PDF-файла

Чтобы завершить этот урок, давайте рассмотрим пример чтения и изменения файла PDF с использованием класса PDFReader, предоставленного самой библиотекой iText. В этом примере я прочитаю содержимое из PDF и добавлю некоторый случайный контент на все его страницы.

public static void main(String[] args) {try{//Read file using PdfReaderPdfReader pdfReader = new PdfReader("HelloWorld.pdf");//Modify file using PdfReaderPdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("HelloWorld-modified.pdf"));Image image = Image.getInstance("temp.jpg");image.scaleAbsolute(100, 50);image.setAbsolutePosition(100f, 700f);for(int i=1; i<= pdfReader.getNumberOfPages(); i++){PdfContentByte content = pdfStamper.getUnderContent(i);content.addImage(image);}pdfStamper.close();} catch(IOException e) {e.printStackTrace();} catch(DocumentException e) {e.printStackTrace();}}
Пример измененного PDF-файла
Пример измененного PDF-файла

12. Запись PDF в HttpOutputStream

Это последний пример в списке, и в этом примере я записываю содержимое созданного PDF-файла в выходной поток, прикрепленный к объекту HttpServletResponse. Это понадобится при потоковой передаче PDF-файла в клиент-серверной среде.

Document document = new Document();try{response.setContentType("application/pdf");PdfWriter.getInstance(document, response.getOutputStream());document.open();document.add(new Paragraph("howtodoinjava.com"));document.add(new Paragraph(new Date().toString()));//Add more content here}catch(Exception e){e.printStackTrace();}document.close();}

Это все для примеров кодов iText. Оставьте комментарий, если вам что-то непонятно, ИЛИ вы хотели бы добавить любой другой пример в этот список.

Загрузить исходный код примеров iText

Прокрутить вверх