使用 iText 库在 Java 中创建和阅读 PDF

Mohd Mohtashim Nawaz 2023年1月30日 2022年4月22日
  1. PDF 和处理 PDF 文件的库
  2. iText 库的特点
  3. 在 Eclipse 中安装 iText 库的步骤
  4. 使用 Java 中的 iText 库创建 PDF 文件的步骤
  5. 使用 Java 中的 iText 库读取 PDF 文件的步骤
使用 iText 库在 Java 中创建和阅读 PDF

iText 库是一个开源库,用于在 Java 中创建、操作和读取 PDF 文件。本文讨论了 iText 库,它在 Eclipse 中的安装,以及使用 iText 库在 Java 中创建和读取 PDF 文件。

PDF 和处理 PDF 文件的库

可移植文档格式 (PDF) 是一种广泛使用的使用文件的数据交换格式。PDF 独立于硬件、操作系统和软件。

因此,它非常流行,经常用于文本、图像和其他数据类型。

许多库可用于创建、阅读和使用 PDF 文件。下面给出了其中一些库。

  1. iText - iText 的社区版本是一个开源库。它使用 Java 读取、创建和操作 PDF 文件。

    它具有层次结构,可以执行任意复杂的 PDF 文件以生成所需的结果。iText 库在 Java 和 .NET 中可用。

  2. Adobe PDF 库 - Adobe 开发了这个库来创建、操作和阅读 PDF 文件。我们也可以使用这个库来打印 pdf。

    该库适用于不同的语言,例如 C++、Java 和 .NET。

  3. PDFBox - 这是另一个开源库。Apache 开发了这个库来创建、编辑和查看 PDF 文件,它可以与 Java 一起使用。

  4. Jasper Reports - 这个报告工具可以生成 PDF 文件的报告。

iText 库的特点

让我们看看一些 iText 库功能。

  1. 创建 PDF 文件 - 我们可以使用 iText 库创建任意复杂的交互式 PDF 文件。我们还可以将图像插入 PDF 文件。
  2. 我们可以使用 iText 库为 PDF 文件创建书签、添加页码和添加水印。
  3. 我们可以对 PDF 文件进行拆分和合并操作。
  4. iText 库提供了使用 PDF 文件中的交互式表单的工具。
  5. 我们可以将 PDF 文件保存为不同格式的图像,如 JPG、PNG 等。

在 Eclipse 中安装 iText 库的步骤

iText 库是第三方开源软件,在使用之前需要单独安装到你的 Java 项目中。本文将指导你完成在 Eclipse 中安装 iText 的步骤。

Eclipse 是用于 Java 应用程序开发的最流行的 IDE 之一。本文假设你已经安装了 Java 和 Eclipse。

即使你在任何其他 IDE 上工作,安装过程也是类似的。

让我们看看将 iText 库添加到 Eclipse 项目的步骤。

  • 在 Eclipse 中创建一个项目(File -> New -> Java Project)。
  • 右击项目,出现下拉菜单。
  • 导航到配置
  • 点击 Convert to Maven Project
  • 你会发现一个名为 pom.xml 的新文件出现在你的项目文件夹中。
  • 打开 pom.xml 并在 <project> 标签内和 <build> 标签之后添加以下依赖项。
    <dependencies>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>barcodes</artifactId>
    	<version>7.2.1</version>
    	<!-- barcodes depends on kernel -->
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>font-asian</artifactId>
    	<version>7.2.1</version>
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>forms</artifactId>
    	<version>7.2.1</version>
    	<!-- forms depends on kernel and layout -->
      </dependency>
    
      <dependency>
    	  <groupId>com.itextpdf</groupId>
    	  <artifactId>hyph</artifactId>
    	  <version>7.2.1</version>
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>io</artifactId>
    	<version>7.2.1</version>
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>kernel</artifactId>
    	<version>7.2.1</version>
    	<!-- kernel depends on io -->
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>layout</artifactId>
    	<version>7.2.1</version>
    	<!-- layout depends on kernel -->
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>pdfa</artifactId>
    	<version>7.2.1</version>
    	<!-- pdfa depends on kernel -->
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>sign</artifactId>
    	<version>7.2.1</version>
    	<!-- sign depends on kernel, layout and forms -->
      </dependency>
    
    	<dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>commons</artifactId>
    	<version>7.2.1</version>
    	<!-- sign depends on kernel, layout and forms -->
      </dependency>
    
      <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>styled-xml-parser</artifactId>
    	<version>7.2.1</version>
    	<!-- sign depends on kernel, layout and forms -->
      </dependency>
    
    <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>svg</artifactId>
    	<version>7.2.1</version>
    	<!-- sign depends on kernel, layout and forms -->
      </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-api</artifactId>
    	<version>2.13.3</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-core</artifactId>
    	<version>2.13.3</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-slf4j-impl</artifactId>
    	<version>2.13.3</version>
    </dependency>
    
    </dependencies>
    

    请注意,该项目在编写时使用最新版本(7.2.1)的 iText 库。如果可用,你可以升级到较新的版本。

  • 导航到菜单栏中的文件,然后单击刷新

这会将必要的库导入到项目中。由于库是从 maven 存储库下载的,因此你应该有稳定的 Internet 连接。

使用 Java 中的 iText 库创建 PDF 文件的步骤

安装这些库后,你可以使用 iText 库使用 Java 程序创建 pdf 文件。

iText 库有一个名为 PdfWriter 的类,它创建一个新的 pdf 文件以写入其中。打开文件后,你可以添加文本、图像等。

让我们了解创建 pdf 文件并向其添加文本和图像的步骤。

  1. 通过将文件名作为参数传递给构造函数来创建 PdfWriter 类的实例。
  2. 通过将 PdfWriter 类传递给构造函数,继续创建 PdfDocument 类的实例。此类负责写入 pdf 文件。
  3. 最后,你将创建一个 Document 类实例。它附加到 PdfDocument 类实例。

此类用于将单个元素附加到 pdf 文件。

  1. 此时,你已准备好将文本和图像写入 pdf 文件。

在 Java 中使用 iText 库将文本写入 PDF 文件的步骤

让我们看看将文本写入文件的步骤。

  1. Paragraph 类用于将文本写入 pdf。因此,你需要创建 Paragraph 类的实例。
  2. 你可以通过调用 add() 方法添加文本。
  3. 你可以通过调用不同的方法来改变文本的外观,如 setTextAlignment()setFont() 等。
  4. 最后,通过调用 add() 方法将 paragraph 实例添加到 Document 实例。

最后,当你将所有实例添加到文档中后,你需要通过调用 Document 类的 close() 方法来关闭它。

在 Java 中使用 iText 库创建 PDF 的代码示例

import java.io.IOException;

import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;

public class pdfExample {

	public static void main(String[] args)
	{
		String  file = "sample_pdf.pdf";
		try
		{
			createPdf(file);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}


private static void createPdf(String file) throws IOException
	{

		PdfWriter writer = new PdfWriter(file);
		PdfDocument pdfDoc = new PdfDocument(writer);
		Document doc = new Document(pdfDoc);

		PdfFont myFont = PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN);

		Paragraph p1 = new Paragraph();
		p1.add("Hello, This is Delftstack!");
		p1.setTextAlignment(TextAlignment.CENTER);
		p1.setFont(myFont);
		p1.setFontSize(28);
		doc.add(p1);

		Paragraph p2 = new Paragraph();
		p2.add("We help you understand the concepts.");
		p2.setFontSize(18);
		doc.add(p2);

		doc.close();
	}

}

使用上述代码创建的 pdf 文件如下所示。

创建的 PDF 文件

使用 Java 中的 iText 库读取 PDF 文件的步骤

iText 库提供 PdfReader 类来读取 pdf 文件。可以按照以下给出的步骤阅读 pdf 文件。

  1. 首先,你需要通过将文件的路径传递给构造函数来创建 PdfReader 类的实例。
  2. 通过将 PdfReader 的实例传递给构造函数来创建 PdfDocument 类实例。
  3. 如果你的 pdf 文件包含多页,则需要循环浏览每一页。要获取页数,你可以使用 PdfDocument 类的实例调用 getNumberOfPages() 方法。
  4. 循环浏览每一页。
    1. 通过传递文档的当前页面调用 PdfTextExtractor 类的 getTextFromPage() 方法。
    2. 要获取当前页面,需要调用 Document 类的 getPage() 方法并传递当前页码。
    3. getTextFromPage() 方法是静态的,因此你不需要类实例。
    4. 该方法返回当前页面的所有文本。你可以将其存储到 String 变量中。
  5. 处理文本(例如,在控制台上显示)。

在 Java 中使用 iText 库读取 PDF 的代码示例

import java.io.IOException;

import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;

public class pdfExample {

	public static void main(String[] args)
	{
		String  file = "sample_pdf.pdf";
		try
		{
			readpdf(file);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

private static void readpdf(String file) throws IOException
	{

		PdfReader pr = new PdfReader(file);
		PdfDocument doc = new PdfDocument(pr);
		int num = doc.getNumberOfPages();

		for(int i=1;i<=num;i++)
		{
			String str = PdfTextExtractor.getTextFromPage(doc.getPage(i));
			System.out.println(str);
		}
	}
}

输出:

Hello, This is Delftstack!
We help you understand the concepts.

结论

本文讨论了使用 iText 库读取和写入 pdf 文件的基础知识。但是,iText 库可以对 pdf 文件执行复杂的操作。

要阅读有关 iText 库及其功能的更多信息,请访问文档