Java 之 用iText读取和生成pdf文件

在本iText教程中,我正在编写各种代码示例,以读取pdf文件生成PDF文件。iText库有助于从Java应用程序动态生成pdf文件。

这些代码示例根据其所做的工作或实现的功能分为多个部分。对于每个java pdf示例,我都附加了PDF文件的快照,以便您可以直观地看到PDF文件中编写的代码。您可以扩展这些示例,以从数据库获取文本或JSON中的一些API响应,然后写入pdf。

在尝试使用Java进行pdf文件处理时,我尝试尝试添加尽可能多的示例,以帮助您。通过使用简单Java程序的给定示例,您可以在Web应用程序中重用此代码。

目录

1。 iText库概述
2.常用iText类
3。 iText hello世界示例
4.将文件属性设置为PDF 
5.将图像添加到PDF 
6.在PDF中创建表
7。 
在PDF中创建列表8.样式化和格式化PDF输出
9.创建受密码保护的PDF文件
10.创建具有有限权限的PDF 
11.读取和修改现有的PDF 
12.在HTTP响应中将PDF 写入 OutputStream 

让我们从介绍iText库开始本教程。

1。 iText库概述

从好的方面来说,iText是一个开源API。请注意,尽管iText是开源的,但是如果您想将其用于商业目的,则仍需要购买商业许可证。iText是可从http://itextpdf.com免费获得的Java库。iText库功能强大,除了生成PDF之外,还支持HTML,RTF和XML文档的生成。您可以从文档中使用的各种字体中进行选择。此外,iText的结构允许您使用相同的代码生成任何上述类型的文档。它不是很棒的功能,对吗?

iText库包含用于生成各种字体的PDF文本,在PDF文档中生成表格,向页面添加水印等的类。iText还有许多其他功能,我将留给您研究。

要将iText添加到您的应用程序中,请将以下maven存储库包含到pom.xml文件中。

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>

或者,您可以从maven存储库下载最新的jar文件。

2.常用的iText类

让我们列出并熟悉将在此应用程序中使用的重要类。

  • com.itextpdf.text.Document:这是iText库中最重要的类,代表PDF文档实例。如果需要从头开始生成PDF文档,则可以使用Document类。首先,您必须创建一个Document实例。然后,您必须打开它。之后,将内容添加到文档中。最后,关闭Document实例。
  • com.itextpdf.text.Paragraph:此类表示文本的缩进“段落”。在段落中,可以设置段落前后的段落对齐,缩进和间距。
  • com.itextpdf.text.Chapter:此类表示PDF文档中的一章。它以“段落”作为标题,而“整数”作为章号创建。
  • com.itextpdf.text.Font:此类包含字体的所有规范,例如字体系列,大小,样式和颜色。在此类中,各种字体都声明为静态常量。
  • com.itextpdf.text.List:此类表示一个列表,该列表又包含许多ListItems。
  • com.itextpdf.text.pdf.PDFPTable:这是一个表,可以放在绝对位置,但也可以作为表Table类添加到文档中。
  • com.itextpdf.text.Anchor:Anchor可以是引用或引用的目标。类似于HTML页面中的链接。
  • com.itextpdf.text.pdf.PdfWriter:当将此PdfWriter添加到某个PdfDocument时,添加到此Document的每个Element的PDF表示形式都将写入到附加到writer(文件或网络)的 OutputStream 中。
  • com.itextpdf.text.pdf.PdfReader:用于读取PDF文档。简单明了。

2。 iText Hello世界示例

让我们开始使用常规的Hello World应用程序编写示例代码。在此应用程序中,我将创建一个包含单个内容的PDF文件

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

public class JavaPdfHelloWorld
{
   public static void main(String[] args)
   {
      Document document = new Document();
      try
      {
         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
         document.open();
         document.add(new Paragraph("A Hello World PDF document."));
         document.close();
         writer.close();
      } catch (DocumentException e)
      {
         e.printStackTrace();
      } catch (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 here
	document.addAuthor("Saigon");
	document.addCreationDate();
	document.addCreator("how2codex.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 document = new Document();
try
{
	PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("AddImageExample.pdf"));
	document.open();
	document.add(new Paragraph("Image Example"));

	//Add Image
	Image image1 = Image.getInstance("temp.jpg");
	//Fixed Positioning
	image1.setAbsolutePosition(100f, 550f);
	//Scale to new height and new width of image
	image1.scaleAbsolute(200, 200);
	//Add to document
	document.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 table
		table.setSpacingAfter(10f); //Space after table

		//Set Column widths
		float[] 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文件中创建列表项

下面的示例将帮助您了解如何使用iText库在pdf文件中编写列表

Document document = new Document();
try
{
	PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("ListExample.pdf"));
	document.open();
	document.add(new Paragraph("List Example")); 

	//Add ordered list
	List 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 list
	List 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 list
	RomanList 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 list
	GreekList 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 Example
	ZapfDingbatsList 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 Examples
	List 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文件内容

我们来看一些样式化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 styles
	Paragraph paragraphOne = new Paragraph("Some colored paragraph text", redFont);
	document.add(paragraphOne);

	//Create chapter and sections
	Paragraph 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的密码。

我们需要添加为受密码保护的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_PRINTING
 PdfWriter.ALLOW_ASSEMBLY
 PdfWriter.ALLOW_COPY
 PdfWriter.ALLOW_DEGRADED_PRINTING
 PdfWriter.ALLOW_FILL_IN
 PdfWriter.ALLOW_MODIFY_ANNOTATIONS
 PdfWriter.ALLOW_MODIFY_CONTENTS
 PdfWriter.ALLOW_SCREENREADERS

您可以通过对不同的值进行“或”运算来提供多个权限。例如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文件

为了完成本教程,我们来看一个使用 iText库本身提供的PDFReader读取和修改PDF文件的示例。在此示例中,我将从PDF文件中读取内容,并在所有页面中添加一些随机内容。

public static void main(String[] args) {
  try
  {
	//Read file using PdfReader
	PdfReader pdfReader = new PdfReader("HelloWorld.pdf");

	//Modify file using PdfReader
	PdfStamper 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作为HTTP响应中的 OutputStream 写入

这是列表中的最后一个示例,在此示例中,我将创建的PDF文件的内容写入附加到HttpServletResponse对象的 OutputStream 中。当您要在客户端-服务器环境中 Stream 式传输PDF文件时,将需要此功能。

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

这就是大量的iText示例代码。如果您不清楚某些地方,或者您想在此列表中添加其他示例,请发表评论。

saigon has written 1445 articles

Leave a Reply