PDFBox - 快速指南


PDFBox - 概述

可移植文档格式 (PDF) 是一种文件格式,有助于以独立于应用程序软件、硬件和操作系统的方式呈现数据。

每个 PDF 文件都包含固定布局平面文档的描述,包括文本、字体、图形以及显示该文档所需的其他信息。

有几个库可用于通过程序创建和操作 PDF 文档,例如 -

  • Adobe PDF 库- 该库提供 C++、.NET 和 Java 等语言的 API,使用它我们可以编辑、查看打印和从 PDF 文档中提取文本。

  • 格式化对象处理器- 由 XSL 格式化对象和输出独立格式化程序驱动的开源打印格式化程序。主要输出目标是 PDF。

  • iText - 该库提供 Java、C# 和其他 .NET 语言等语言的 API,使用该库我们可以创建和操作 PDF、RTF 和 HTML 文档。

  • JasperReports - 这是一个 Java 报告工具,可生成 PDF 文档报告,包括 Microsoft Excel、RTF、ODT、逗号分隔值和 XML 文件。

什么是 PDFBox

Apache PDFBox 是一个开源 Java 库,支持 PDF 文档的开发和转换。使用该库,您可以开发用于创建、转换和操作 PDF 文档的 Java 程序。

除此之外,PDFBox 还包括一个命令行实用程序,用于使用可用的 Jar 文件对 PDF 执行各种操作。

PDFBox的特点

以下是 PDFBox 的显着特点 -

  • 提取文本- 使用 PDFBox,您可以从 PDF 文件中提取 Unicode 文本。

  • 拆分和合并- 使用 PDFBox,您可以将单个 PDF 文件分成多个文件,然后将它们合并回单个文件。

  • 填写表单- 使用 PDFBox,您可以在文档中填写表单数据。

  • 打印- 使用 PDFBox,您可以使用标准 Java 打印 API 打印 PDF 文件。

  • 另存为图像- 使用 PDFBox,您可以将 PDF 保存为图像文件,例如 PNG 或 JPEG。

  • 创建 PDF - 使用 PDFBox,您可以通过创建 Java 程序来创建新的 PDF 文件,还可以包含图像和字体。

  • 签名- 使用 PDFBox,您可以向 PDF 文件添加数字签名。

PDFBox的应用

以下是 PDFBox 的应用 -

  • Apache Nutch - Apache Nutch 是一款开源网络搜索软件。它建立在 Apache Lucene 之上,添加了特定于 Web 的功能,例如爬虫、链接图数据库、HTML 和其他文档格式的解析器等。

  • Apache Tika - Apache Tika 是一个工具包,用于使用现有解析器库从各种文档中检测和提取元数据和结构化文本内容。

PDFBox的组件

以下是 PDFBox 的四个主要组件 -

  • PDFBox - 这是 PDFBox 的主要部分。其中包含与内容提取和操作相关的类和接口。

  • FontBox - 它包含与字体相关的类和接口,使用这些类我们可以修改PDF文档文本的字体。

  • XmpBox - 这包含处理 XMP 元数据的类和接口。

  • 预检- 该组件用于根据 PDF/A-1b 标准验证 PDF 文件。

PDFBox - 环境

安装PDFBox

以下是下载 Apache PDFBox 的步骤 -

步骤 1 -单击以下链接打开Apache PDFBox的主页- https://pdfbox.apache.org/

步骤 2 - 上面的链接将引导您进入主页,如下面的屏幕截图所示 -

PDFBox主页

步骤 3 - 现在,单击上面屏幕截图中突出显示的下载链接。单击后,您将进入 PDFBox 的下载页面,如下图所示。

PDFBox 下载.jpg

步骤 4 - 在下载页面中,您将获得 PDFBox 的链接。单击最新版本的相应链接。例如,我们选择PDFBox 2.0.1,单击此按钮后,您将被定向到所需的 jar 文件,如以下屏幕截图所示。

PDFBox Jarfiles.jpg

步骤 5 - 下载 jar 文件 pdfbox-2.0.1.jar、fontbox-2.0.1.jar、preflight-2.0.1.jar、xmpbox-2.0.1.jar 和 pdfbox-tools-2.0.1.jar。

Eclipse 安装

下载所需的 jar 文件后,您必须将这些 JAR 文件嵌入到 Eclipse 环境中。您可以通过设置这些 JAR 文件的构建路径并使用pom.xml来完成此操作。

设置构建路径

以下是在 Eclipse 中安装 PDFBox 的步骤 -

步骤 1 - 确保您已在系统中安装 Eclipse。如果没有,请在您的系统中下载并安装 Eclipse。

步骤 2 - 打开 Eclipse,单击“文件”、“新建”,然后打开一个新项目,如以下屏幕截图所示。

Eclipse 文件菜单

步骤 3 - 选择项目后,您将获得新建项目向导。在此向导中,选择 Java 项目并单击“下一步”按钮继续,如以下屏幕截图所示。

Eclipse 新建项目向导

步骤 4 - 继续操作时,您将被引导至“新建 Java 项目”向导。创建一个新项目,然后单击“下一步”,如以下屏幕截图所示。

创建项目向导

步骤5 - 创建新项目后,右键单击它;选择“构建路径”并单击“配置构建路径...”,如以下屏幕截图所示。

Eclipse 构建路径

步骤 6 - 单击“构建路径”选项后,您将进入“Java 构建路径”向导。选择添加外部 JAR,如以下屏幕截图所示。

Eclipse 外部 jar

步骤 7 - 选择 jar 文件fontbox-2.0.1.jar、pdfbox-2.0.1.jar、pdfbox-tools-2.0.1.jar、preflight-2.0.1.jar、xmpbox-2.0.1.jar,如图所示在下面的屏幕截图中。

Jar 文件位置

步骤 8 - 单击上面屏幕截图中的“打开”按钮后,这些文件将添加到您的库中,如以下屏幕截图所示。

添加了 Jar 文件

步骤 9 - 单击“确定”后,您将成功将所需的 JAR 文件添加到当前项目,并且您可以通过展开引用的库来验证这些添加的库,如以下屏幕截图所示。

Eclipse Jar 文件

使用 pom.xml

将项目转换为maven项目,并在其pom.xml中添加以下内容

<project xmlns="https://maven.apache.org/POM/4.0.0"
   xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="https://maven.apache.org/POM/4.0.0
   https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>my_project</groupId>
   <artifactId>my_project</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <build>
      <sourceDirectory>src</sourceDirectory>
      <plugins>
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
               <source>1.8</source>
               <target>1.8</target>
            </configuration> 
         </plugin>
      </plugins> 
   </build> 
   
   <dependencies>  
      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>pdfbox</artifactId> 
         <version>2.0.1</version> 
      </dependency>   
   
      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>fontbox</artifactId> 
         <version>2.0.0</version> 
      </dependency>
      
      <dependency>  
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>jempbox</artifactId> 
         <version>1.8.11</version> 
      </dependency> 
        
      <dependency>
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>xmpbox</artifactId> 
         <version>2.0.0</version> 
      </dependency> 
     
      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>preflight</artifactId> 
         <version>2.0.0</version> 
      </dependency> 
     
      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>pdfbox-tools</artifactId> 
         <version>2.0.0</version> 
      </dependency>

   </dependencies>
   
</project>

PDFBox - 创建 PDF 文档

现在让我们了解如何使用 PDFBox 库创建 PDF 文档。

创建空 PDF 文档

您可以通过实例化PDDocument类来创建空 PDF 文档。您可以使用Save()方法将文档保存在您想要的位置。

以下是创建空 PDF 文档的步骤。

第 1 步:创建一个空文档

PDDocument类属于org.apache.pdfbox.pdmodel包,是 PDFDocument的内存中表示形式。因此,通过实例化此类,您可以创建一个空的 PDFDocument,如以下代码块所示。

PDDocument document = new PDDocument();

第 2 步:保存文档

创建文档后,您需要将该文档保存在所需的路径中,可以使用PDDocument类的Save()方法来完成此操作。此方法接受一个字符串值作为参数,表示要存储文档的路径。以下是PDDocument类的 save() 方法的原型。

document.save("Path");

第 3 步:关闭文档

当您的任务完成后,最后您需要使用close()方法关闭PDDocument对象。以下是PDDocument类的 close() 方法的原型。

document.close();

例子

此示例演示了 PDF 文档的创建。在这里,我们将创建一个 Java 程序来生成名为my_doc.pdf的 PDF 文档,并将其保存在路径C:/PdfBox_Examples/中。将此代码保存在名为 Document_Creation.java 的文件中

import java.io.IOException; 
import org.apache.pdfbox.pdmodel.PDDocument;
  
public class Document_Creation {
    
   public static void main (String args[]) throws IOException {
       
      //Creating PDF document object 
      PDDocument document = new PDDocument();    
       
      //Saving the document
      document.save("C:/PdfBox_Examples/my_doc.pdf");
         
      System.out.println("PDF created");  
    
      //Closing the document  
      document.close();

   }  
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac Document_Creation.java 
java Document_Creation

执行后,上述程序将创建一个 PDF 文档,显示以下消息。

PDF created

如果您验证指定的路径,您可以找到创建的PDF文档,如下所示。

我的文档已保存

由于这是一个空文档,因此如果您尝试打开该文档,则会提示您显示错误消息,如以下屏幕截图所示。

空 PDF

PDFBox - 添加页面

在上一章中,我们已经了解了如何创建 PDF 文档。创建 PDF 文档后,您需要向其中添加页面。现在让我们了解如何在 PDF 文档中添加页面。

添加页面到 PDF 文档

您可以通过实例化PDPage类来创建一个空页面,并使用PDDocument类的addPage()方法将其添加到 PDF 文档中。

以下是创建空文档并向其中添加页面的步骤。

第 1 步:创建一个空文档

通过实例化PDDocument类来创建一个空 PDF 文档,如下所示。

PDDocument document = new PDDocument();

第 2 步:创建空白页

PDPage类代表PDF文档中的页面,因此,您可以通过实例化此类来创建空页面如以下代码块所示。

PDPage my_page = new PDPage();

步骤 3:将页面添加到文档

您可以使用PDDocument类的addPage()方法向 PDF 文档添加页面。对于此方法,您需要将 PDPage 对象作为参数传递。

因此,将上一步中创建的空白页添加到 PDDocument 对象中,如以下代码块所示。

document.addPage(my_page);

通过这种方式,您可以向 PDF 文档添加任意数量的页面。

第 4 步:保存文档

添加所有页面后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

document.save("Path");

第 5 步:关闭文档

最后使用PDDocument类的close()方法关闭文档,如下所示。

document.close();

例子

此示例演示如何创建 PDF 文档并向其中添加页面。这里我们将创建一个名为my_doc.pdf的 PDF 文档,并为其添加 10 个空白页,并将其保存在路径C:/PdfBox_Examples/中。将此代码保存在名为Adding_pages.java 的文件中

package document;
 
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

public class Adding_Pages {

   public static void main(String args[]) throws IOException {
       
      //Creating PDF document object 
      PDDocument document = new PDDocument();

      for (int i=0; i<10; i++) {
         //Creating a blank page 
         PDPage blankPage = new PDPage();

         //Adding the blank page to the document
         document.addPage( blankPage );
      } 
     
      //Saving the document
      document.save("C:/PdfBox_Examples/my_doc.pdf");
      System.out.println("PDF created");
      
      //Closing the document
      document.close();

   }  
} 

使用以下命令从命令提示符编译并执行保存的 Java 文件 -

javac Adding_pages.java 
java Adding_pages 

执行后,上述程序会创建一个 PDF 文档,其中空白页显示以下消息 -

PDF created 

如果您验证指定的路径,您可以找到创建的PDF文档,如下图所示。

创建文档

PDFBox - 加载文档

在前面的示例中,您已经了解了如何创建新文档并向其中添加页面。本章将教您如何加载系统中已存在的 PDF 文档,并对其执行一些操作。

加载现有 PDF 文档

PDDocument类的load ()方法用于加载现有的 PDF 文档。按照下面给出的步骤加载现有的 PDF 文档。

第 1 步:加载现有 PDF 文档

使用PDDocument类的静态方法load()加载现有 PDF 文档。此方法接受文件对象作为参数,因为这是一个静态方法,您可以使用类名调用它,如下所示。

File file = new File("path of the document") 
PDDocument.load(file);

步骤 2:执行所需操作

执行所需的操作,例如添加页面、添加文本、向加载的文档添加图像。

第 3 步:保存文档

添加所有页面后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

document.save("Path");

第 4 步:关闭文档

最后使用PDDocument类的close()方法关闭文档,如下所示。

document.close();

例子

假设我们有一个包含单个页面的 PDF 文档,路径为C:/PdfBox_Examples/,如下面的屏幕截图所示。

加载文件

此示例演示如何加载现有 PDF 文档。在这里,我们将加载上面所示的PDF文档sample.pdf,向其中添加一个页面,并将其以相同的名称保存在同一路径中。

步骤 1 - 将此代码保存在名为 LoadingExistingDocument.java 的文件中

import java.io.File;
import java.io.IOException;
 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage;
public class LoadingExistingDocument {

   public static void main(String args[]) throws IOException {
   
      //Loading an existing document 
      File file = new File("C:/PdfBox_Examples/sample.pdf"); 
      PDDocument document = PDDocument.load(file); 
        
      System.out.println("PDF loaded"); 
        
      //Adding a blank page to the document 
      document.addPage(new PDPage());  

      //Saving the document 
      document.save("C:/PdfBox_Examples/sample.pdf");

      //Closing the document  
      document.close(); 
        
   }  
}

使用以下命令从命令提示符编译并执行保存的 Java 文件

javac LoadingExistingDocument.java  
java LoadingExistingDocument 

执行后,上述程序会加载指定的 PDF 文档,并向其中添加一个空白页,显示以下消息。

PDF loaded

如果验证指定的路径,您可以发现指定的 PDF 文档中添加了一个附加页面,如下所示。

文档中的附加页面

PDFBox - 删除页面

现在让我们学习如何从 PDF 文档中删除页面。

从现有文档中删除页面

您可以使用PDDocument类的removePage()方法从现有 PDF 文档中删除页面。

第 1 步:加载现有 PDF 文档

使用PDDocument类的静态方法load()加载现有 PDF 文档。此方法接受文件对象作为参数,因为这是一个静态方法,您可以使用类名调用它,如下所示。

File file = new File("path of the document") 
PDDocument.load(file);

第 2 步:列出页数

您可以使用getNumberOfPages()方法列出 PDF 文档中存在的页数,如下所示。

int noOfPages= document.getNumberOfPages();
System.out.print(noOfPages);

第 3 步:删除页面

您可以使用PDDocument类的removePage()方法从PDF 文档中删除页面。对于此方法,您需要传递要删除的页面的索引。

在指定 PDF 文档中页面的索引时,请记住这些页面的索引从零开始,即,如果要删除第一页,则索引需要为 0。

document.removePage(2);

第 4 步:保存文档

删除页面后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

document.save("Path");

第 5 步:关闭文档

最后,使用PDDocument类的close()方法关闭文档,如下所示。

document.close();

例子

假设我们有一个名为sample.pdf的PDF文档,它包含三个空白页面,如下所示。

删除之前的页面

此示例演示如何从现有 PDF 文档中删除页面。在这里,我们将加载上面指定的名为example.pdf的 PDF 文档,从中删除页面,并将其保存在路径C:/PdfBox_Examples/中。将此代码保存在名为Removing_pages.java的文件中。

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;

public class RemovingPages {

   public static void main(String args[]) throws IOException {

      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/sample.pdf");
      PDDocument document = PDDocument.load(file);
       
      //Listing the number of existing pages
      int noOfPages= document.getNumberOfPages();
      System.out.print(noOfPages);
       
      //Removing the pages
      document.removePage(2);
      
      System.out.println("page removed");

      //Saving the document
      document.save("C:/PdfBox_Examples/sample.pdf");

      //Closing the document
      document.close();

   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac RemovingPages.java 
java RemovingPages 

执行后,上述程序将创建一个 PDF 文档,其中空白页显示以下消息。

3
page removed

如果验证指定的路径,可以发现所需的页面被删除,文档中只剩下两页,如下所示。

之后删除页面

PDFBox - 文档属性

与其他文件一样,PDF 文档也具有文档属性。这些属性是键值对。每个属性都提供有关文档的特定信息。

以下是 PDF 文档的属性 -

编号 属性及描述
1

文件

该属性保存文件的名称。

2

标题

使用此属性,您可以设置文档的标题。

3

作者

使用此属性,您可以设置文档作者的姓名。

4

主题

使用此属性,您可以指定 PDF 文档的主题。

5

关键词

使用此属性,您可以列出我们可以用来搜索文档的关键字。

6

已创建

使用此属性,您可以设置文档的创建日期。

7

修改的

使用此属性,您可以设置文档的修改日期。

8

应用

使用此属性,您可以设置文档的应用程序。

以下是 PDF 文档的文档属性表的屏幕截图。

PDF 属性

设置文档属性

PDFBox 为您提供了一个名为PDDocumentInformation的类。该类有一组 setter 和 getter 方法。

此类的 setter 方法用于将值设置为文档的各种属性,而 getter 方法则用于检索这些值。

以下是PDDocumentInformation类的 setter 方法。

编号 方法及说明
1

setAuthor(字符串作者)

此方法用于设置名为Author的 PDF 文档的属性值。

2

setTitle(字符串标题)

此方法用于设置名为Title的 PDF 文档的属性值。

3

setCreator(字符串创建者)

此方法用于设置名为Creator的 PDF 文档的属性值。

4

setSubject(字符串主题)

此方法用于设置名为“Subject”的 PDF 文档的属性值。

5

setCreationDate(日历日期)

此方法用于设置名为CreationDate的 PDF 文档的属性值。

6

setModificationDate(日历日期)

此方法用于设置名为ModificationDate的 PDF 文档的属性值。

7

setKeywords(字符串关键字列表)

此方法用于设置名为keywords的 PDF 文档属性的值。

例子

PDFBox 提供了一个名为PDDocumentInformation 的类,该类提供了各种方法。这些方法可以为文档设置各种属性并检索它们。

此示例演示如何向 PDF 文档添加作者、标题、日期和主题等属性。在这里,我们将创建一个名为doc_attributes.pdf的 PDF 文档,为其添加各种属性,并将其保存在路径C:/PdfBox_Examples/中。将此代码保存在名为AddingAttributes.java的文件中。

import java.io.IOException; 
import java.util.Calendar; 
import java.util.GregorianCalendar;
  
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.PDPage;

public class AddingDocumentAttributes {
   public static void main(String args[]) throws IOException {

      //Creating PDF document object
      PDDocument document = new PDDocument();

      //Creating a blank page
      PDPage blankPage = new PDPage();
       
      //Adding the blank page to the document
      document.addPage( blankPage );

      //Creating the PDDocumentInformation object 
      PDDocumentInformation pdd = document.getDocumentInformation();

      //Setting the author of the document
      pdd.setAuthor("Tutorialspoint");
       
      // Setting the title of the document
      pdd.setTitle("Sample document"); 
       
      //Setting the creator of the document 
      pdd.setCreator("PDF Examples"); 
       
      //Setting the subject of the document 
      pdd.setSubject("Example document"); 
       
      //Setting the created date of the document 
      Calendar date = new GregorianCalendar();
      date.set(2015, 11, 5); 
      pdd.setCreationDate(date);
      //Setting the modified date of the document 
      date.set(2016, 6, 5); 
      pdd.setModificationDate(date); 
       
      //Setting keywords for the document 
      pdd.setKeywords("sample, first example, my pdf"); 
 
      //Saving the document 
      document.save("C:/PdfBox_Examples/doc_attributes.pdf");

      System.out.println("Properties added successfully ");
       
      //Closing the document
      document.close();

   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac AddingAttributes.java 
java AddingAttributes 

执行后,上述程序将所有指定的属性添加到显示以下消息的文档中。

Properties added successfully

现在,如果您访问给定路径,您可以找到在其中创建的 PDF。右键单击文档并选择文档属性选项,如下所示。

文档属性

这将为您提供文档属性窗口,在这里您可以观察到文档的所有属性都设置为指定值。

属性菜单

检索文档属性

您可以使用PDDocumentInformation类提供的getter方法检索文档的属性。

以下是PDDocumentInformation类的 getter 方法。

编号 方法及说明
1

获取作者()

此方法用于检索名为Author的 PDF 文档的属性值。

2

获取标题()

此方法用于检索名为Title的 PDF 文档的属性值。

3

获取创建者()

此方法用于检索名为Creator的 PDF 文档的属性值。

4

获取主题()

此方法用于检索名为“Subject”的 PDF 文档的属性值。

5

获取创建日期()

此方法用于检索名为CreationDate的 PDF 文档的属性值。

6

获取修改日期()

此方法用于检索名为ModificationDate的 PDF 文档的属性值。

7

获取关键字()

此方法用于检索名为keywords的 PDF 文档的属性值。

例子

此示例演示如何检索现有 PDF 文档的属性。在这里,我们将创建一个 Java 程序并加载名为doc_attributes.pdf的 PDF 文档(保存在路径C:/PdfBox_Examples/中),并检索其属性。将此代码保存在名为RetrivingDocumentAttributes.java的文件中。

import java.io.File; 
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDDocumentInformation;

public class RetrivingDocumentAttributes {
   public static void main(String args[]) throws IOException {
      
      //Loading an existing document 
      File file = new File("C:/PdfBox_Examples/doc_attributes.pdf")
      PDDocument document = PDDocument.load(file);
      //Getting the PDDocumentInformation object
      PDDocumentInformation pdd = document.getDocumentInformation();

      //Retrieving the info of a PDF document
      System.out.println("Author of the document is :"+ pdd.getAuthor());
      System.out.println("Title of the document is :"+ pdd.getTitle());
      System.out.println("Subject of the document is :"+ pdd.getSubject());

      System.out.println("Creator of the document is :"+ pdd.getCreator());
      System.out.println("Creation date of the document is :"+ pdd.getCreationDate());
      System.out.println("Modification date of the document is :"+ 
         pdd.getModificationDate()); 
      System.out.println("Keywords of the document are :"+ pdd.getKeywords()); 
       
      //Closing the document 
      document.close();        
   }  
}      

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac RetrivingDocumentAttributes.java 
java RetrivingDocumentAttributes

执行后,上述程序将检索文档的所有属性并显示它们,如下所示。

Author of the document is :Tutorialspoint 
Title of the document is :Sample document 
Subject of the document is :Example document 
Creator of the document is :PDF Examples 
Creation date of the document is :11/5/2015
Modification date of the document is :6/5/2016
Keywords of the document are :sample, first example, my pdf

PDFBox - 添加文本

在上一章中,我们讨论了如何向 PDF 文档添加页面。在本章中,我们将讨论如何向现有 PDF 文档添加文本。

将文本添加到现有 PDF 文档

您可以使用 PDFBox 库向文档添加内容,它为您提供了一个名为 PDPageContentStream 的类,其中包含在 PDFDocument 页面中插入文本、图像和其他类型内容所需的方法。

以下是创建空文档并向其中的页面添加内容的步骤。

第 1 步:加载现有文档

您可以使用PDDocument 类的load()方法加载现有文档。因此,实例化此类并加载所需的文档,如下所示。

File file = new File("Path of the document"); 
PDDocument doc = document.load(file);

第2步:获取所需页面

您可以使用getPage()方法获取文档中所需的页面。通过将其索引传递给此方法来检索所需页面的对象,如下所示。

PDPage page = doc.getPage(1);

第 3 步:准备内容流

您可以使用PDPageContentStream类的对象插入各种类型的数据元素。您需要将文档对象和页面对象传递给此类的构造函数,因此,通过传递在前面的步骤中创建的这两个对象来实例化此类,如下所示。

PDPageContentStream contentStream = new PDPageContentStream(doc, page);

第四步:开始正文

在 PDF 文档中插入文本时,您可以使用 PDPageContentStream 类的 beginText() 和 endText() 方法指定文本的起点和终点,如下所示。

contentStream.beginText(); 
……………………….. 
code to add text content 
……………………….. 
contentStream.endText();

因此,请使用beginText()方法开始文本,如下所示。

contentStream.beginText();

第5步:设置文本的位置

使用newLineAtOffset()方法,您可以设置页面中内容流上的位置。

//Setting the position for the line 
contentStream.newLineAtOffset(25, 700);

第6步:设置字体

您可以使用PDPageContentStream类的setFont()方法将文本的字体设置为所需的样式,如下所示。对于此方法,您需要传递字体的类型和大小。

contentStream.setFont( font_type, font_size );

第 7 步:插入文本

您可以使用PDPageContentStream类的ShowText()方法将文本插入页面,如下所示。该方法接受字符串形式的所需文本。

contentStream.showText(text);

第 8 步:结束文本

插入文本后,需要使用PDPageContentStream类的endText()方法结束文本,如下所示。

contentStream.endText();

步骤 9:关闭 PDPageContentStream

使用close()方法关闭PDPageContentStream对象,如下所示。

contentstream.close();

第10步:保存文档

添加所需内容后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

doc.save("Path");

第 11 步:关闭文档

最后,使用PDDocument类的close()方法关闭文档,如下所示。

doc.close();

例子

此示例演示如何向文档中的页面添加内容。在这里,我们将创建一个 Java 程序来加载名为my_doc.pdf的 PDF 文档(保存在路径C:/PdfBox_Examples/中),并向其中添加一些文本。将此代码保存在名为AddingContent.java 的文件中。

import java.io.File; 
import java.io.IOException;
  
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;
  
public class AddingContent {
   public static void main (String args[]) throws IOException {

      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/my_doc.pdf");
      PDDocument document = PDDocument.load(file);
       
      //Retrieving the pages of the document 
      PDPage page = document.getPage(1);
      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      
      //Begin the Content stream 
      contentStream.beginText(); 
       
      //Setting the font to the Content stream  
      contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);

      //Setting the position for the line 
      contentStream.newLineAtOffset(25, 500);

      String text = "This is the sample document and we are adding content to it.";

      //Adding text in the form of string 
      contentStream.showText(text);      

      //Ending the content stream
      contentStream.endText();

      System.out.println("Content added");

      //Closing the content stream
      contentStream.close();

      //Saving the document
      document.save(new File("C:/PdfBox_Examples/new.pdf"));

      //Closing the document
      document.close();
   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac AddingContent.java 
java AddingContent 

执行后,上述程序将给定文本添加到文档中并显示以下消息。

Content added

如果您验证指定路径中的PDF文档new.pdf ,您可以观察到给定的内容已添加到文档中,如下所示。

添加文字

PDFBox - 添加多行

在上一章提供的示例中,我们讨论了如何向 PDF 页面添加文本,但通过此程序,您只能添加适合单行的文本。如果您尝试添加更多内容,则所有超出行距的文本都将不会显示。

例如,如果您通过传递以下字符串来执行上一章中的上述程序,则只会显示其中的一部分。

String text = "This is an example of adding text to a page in the pdf document. we can
   add as many lines as we want like this using the showText() method of the 
   ContentStream class";

将上一章示例中的字符串文本替换为上述字符串并执行。执行后,您将收到以下输出。

单线扩展

如果仔细观察输出,您会发现只显示了字符串的一部分。

为了向 PDF 添加多行,您需要使用setLeading()方法设置行距,并在完成每行后使用newline()方法转移到新行。

脚步

以下是创建空文档并向其中的页面添加内容的步骤。

第 1 步:加载现有文档

您可以使用PDDocument 类的load()方法加载现有文档。因此,实例化此类并加载所需的文档,如下所示。

File file = new File("Path of the document"); 
PDDocument doc = PDDocument.load(file);

第2步:获取所需页面

您可以使用getPage()方法获取文档中所需的页面。通过将其索引传递给此方法来检索所需页面的对象,如下所示。

PDPage page = doc.getPage(1);

第 3 步:准备内容流

您可以使用名为PDPageContentStream的类的对象插入各种类型的数据元素。您需要将文档对象和页面对象传递给此类的构造函数,因此,通过传递在前面的步骤中创建的这两个对象来实例化此类,如下所示。

PDPageContentStream contentStream = new PDPageContentStream(doc, page);

第四步:开始正文

在 PDF 文档中插入文本时,您可以使用PDPageContentStream类的beginText()endText()方法指定文本的起点和终点,如下所示。

contentStream.beginText(); 
……………………….. 
code to add text content 
……………………….. 
contentStream.endText(); 

因此,请使用beginText()方法开始文本,如下所示。

contentStream.beginText();

第5步:设置文本的位置

使用newLineAtOffset()方法,您可以设置页面中内容流上的位置。

//Setting the position for the line 
contentStream.newLineAtOffset(25, 700);

第6步:设置字体

您可以使用PDPageContentStream类的setFont()方法将文本的字体设置为所需的样式,如下所示,您需要向此方法传递字体的类型和大小。

contentStream.setFont( font_type, font_size );

第7步:设置文本行距

您可以使用setLeading()方法设置文本行距,如下所示。

contentStream.setLeading(14.5f);

步骤 8:使用 newline() 插入多个字符串

您可以使用PDPageContentStream类的ShowText()方法插入多个字符串,并使用newline()方法分隔每个字符串,如下所示。

contentStream. ShowText(text1); 
contentStream.newLine(); 
contentStream. ShowText(text2);

第9步:结束文本

插入文本后,需要使用PDPageContentStream类的endText()方法结束文本,如下所示。

contentStream.endText();

第10步:关闭PDPageContentStream

使用close()方法关闭PDPageContentStream对象,如下所示。

contentstream.close();

第11步:保存文档

添加所需内容后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

doc.save("Path");

第 12 步:关闭文档

最后,使用PDDocument类的close()方法关闭文档,如下所示。

doc.close();

例子

此示例演示如何使用 PDFBox 在 PDF 中添加多行。将此程序保存在名为 AddMultipleLines.java 的文件中

import java.io.File;
import java.io.IOException;

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;

public class AddMultipleLines {
   public static void main(String args[]) throws IOException {

      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/my_pdf.pdf");
      PDDocument doc = document.load(file);
       
      //Creating a PDF Document
      PDPage page = doc.getPage(1);  
       
      PDPageContentStream contentStream = new PDPageContentStream(doc, page); 
       
      //Begin the Content stream 
      contentStream.beginText(); 
       
      //Setting the font to the Content stream
      contentStream.setFont( PDType1Font.TIMES_ROMAN, 16 );
       
      //Setting the leading
      contentStream.setLeading(14.5f);

      //Setting the position for the line
      contentStream.newLineAtOffset(25, 725);

      String text1 = "This is an example of adding text to a page in the pdf document.
         we can add as many lines";
      String text2 = "as we want like this using the ShowText()  method of the
         ContentStream class";

      //Adding text in the form of string
      contentStream. ShowText(text1);
      contentStream.newLine();
      contentStream. ShowText(text2);
      //Ending the content stream
      contentStream.endText();

      System.out.println("Content added");

      //Closing the content stream
      contentStream.close();

      //Saving the document
      doc.save(new File("C:/PdfBox_Examples/new.pdf"));
            
      //Closing the document
      doc.close();
   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac AddMultipleLines.java 
java AddMultipleLines

执行后,上述程序将给定文本添加到文档中并显示以下消息。

Content added

如果您验证指定路径中的PDF 文档new.pdf ,您可以观察到给定的内容以多行形式添加到文档中,如下所示。

添加多行

PDFBox - 阅读文本

在上一章中,我们了解了如何向现有 PDF 文档添加文本。在本章中,我们将讨论如何从现有 PDF 文档中读取文本。

从现有 PDF 文档中提取文本

提取文本是PDF框库的主要功能之一。您可以使用PDFTextStripper类的getText()方法提取文本。此类从给定的 PDF 文档中提取所有文本。

以下是从现有 PDF 文档中提取文本的步骤。

第 1 步:加载现有 PDF 文档

使用PDDocument类的静态方法load()加载现有 PDF 文档。此方法接受文件对象作为参数,因为这是一个静态方法,您可以使用类名调用它,如下所示。

File file = new File("path of the document") 
PDDocument document = PDDocument.load(file);

第 2 步:实例化 PDFTextStripper 类

PDFTextStripper类提供了从 PDF 文档中检索文本方法,因此,实例化此类,如下所示。

PDFTextStripper pdfStripper = new PDFTextStripper();

第 3 步:检索文本

您可以使用PDFTextStripper类的getText()方法从 PDF 文档中读取/检索页面内容。对于此方法,您需要将文档对象作为参数传递。此方法检索给定文档中的文本并以 String 对象的形式返回它。

String text = pdfStripper.getText(document);

第 4 步:关闭文档

最后,使用 PDDocument 类的close()方法关闭文档,如下所示。

document.close();

例子

假设我们有一个 PDF 文档,其中包含一些文本,如下所示。

PDF 示例

此示例演示如何从上述 PDF 文档中读取文本。在这里,我们将创建一个 Java 程序并加载一个名为new.pdf的 PDF 文档,该文档保存在路径C:/PdfBox_Examples/中。将此代码保存在名为ReadingText.java 的文件中。

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class ReadingText {

   public static void main(String args[]) throws IOException {

      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/new.pdf");
      PDDocument document = PDDocument.load(file);

      //Instantiate PDFTextStripper class
      PDFTextStripper pdfStripper = new PDFTextStripper();

      //Retrieving text from PDF document
      String text = pdfStripper.getText(document);
      System.out.println(text);

      //Closing the document
      document.close();

   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac ReadingText.java 
java ReadingText

执行后,上述程序从给定的 PDF 文档中检索文本并显示它,如下所示。

This is an example of adding text to a page in the pdf document. we can add as many lines
as we want like this using the ShowText() method of the ContentStream class.

PDFBox - 插入图像

在上一章中,我们了解了如何从现有 PDF 文档中提取文本。在本章中,我们将讨论如何将图像插入到 PDF 文档中。

将图像插入 PDF 文档

您可以分别使用PDImageXObjectPDPageContentStream类的createFromFile()drawImage()方法将图像插入到PDF 文档中。

以下是从现有 PDF 文档中提取文本的步骤。

第 1 步:加载现有 PDF 文档

使用PDDocument类的静态方法load()加载现有 PDF 文档。此方法接受文件对象作为参数,因为这是一个静态方法,您可以使用类名调用它,如下所示。

File file = new File("path of the document")
PDDocument doc = PDDocument.load(file);

第 2 步:检索页面

选择 PDF 文档中的一个页面并使用getPage()方法检索其页面对象,如下所示。

PDPage page = doc.getPage(0);

第3步:创建PDImageXObject对象

PDFBox 库中的PDImageXObject类代表图像。它提供了执行与图像相关的操作所需的所有方法,例如插入图像、设置其高度、设置其宽度等。

我们可以使用createFromFile()方法创建此类的对象。对于该方法,我们需要以字符串的形式传递要添加的图像的路径以及需要添加图像的文档对象。

PDImageXObject pdImage = PDImageXObject.createFromFile("C:/logo.png", doc);

第 4 步:准备内容流

您可以使用名为PDPageContentStream的类的对象插入各种类型的数据元素。您需要将文档对象和页面对象传递给此类的构造函数,因此,通过传递在前面的步骤中创建的这两个对象来实例化此类,如下所示。

PDPageContentStream contentStream = new PDPageContentStream(doc, page);

第5步:在PDF文档中绘制图像

您可以使用drawImage()方法在PDF文档中插入图像。对于此方法,您需要添加在上述步骤中创建的图像对象以及所需的图像尺寸(宽度和高度),如下所示。

contentstream.drawImage(pdImage, 70, 250);

第 6 步:关闭 PDPageContentStream

使用close()方法关闭PDPageContentStream对象,如下所示。

contentstream.close();

第7步:保存文档

添加所需内容后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

doc.save("Path");

第 8 步:关闭文档

最后,使用PDDocument类的close()方法关闭文档,如下所示。

doc.close();

例子

假设我们有一个名为example.pdf的 PDF 文档,位于路径C:/PdfBox_Examples/中,其中有空白页面,如下所示。

样本文件

此示例演示如何将图像添加到上述 PDF 文档的空白页。在这里,我们将加载名为sample.pdf的PDF文档并向其中添加图像。将此代码保存在名为 InsertingImage.java 的文件中

import java.io.File;
  
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class InsertingImage {

   public static void main(String args[]) throws Exception {
      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/sample.pdf");
      PDDocument doc = PDDocument.load(file);
        
      //Retrieving the page
      PDPage page = doc.getPage(0);
       
      //Creating PDImageXObject object
      PDImageXObject pdImage = PDImageXObject.createFromFile("C:/PdfBox_Examples/logo.png",doc);
       
      //creating the PDPageContentStream object
      PDPageContentStream contents = new PDPageContentStream(doc, page);

      //Drawing the image in the PDF document
      contents.drawImage(pdImage, 70, 250);

      System.out.println("Image inserted");

      //Closing the PDPageContentStream object
      contents.close();
		
      //Saving the document
      doc.save("C:/PdfBox_Examples/sample.pdf");
            
      //Closing the document
      doc.close();
     
   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac InsertingImage.java 
java InsertingImage

执行后,上述程序会将图像插入到给定 PDF 文档的指定页面中,并显示以下消息。

Image inserted

如果您验证文档sample.pdf,您可以观察到图像已插入其中,如下所示。

插入图像

PDFBox - 加密 PDF 文档

在上一章中,我们了解了如何在 PDF 文档中插入图像。在本章中,我们将讨论如何加密 PDF 文档。

加密 PDF 文档

您可以使用StandardProtectionPolicyAccessPermission 类提供的方法来加密 PDF 文档。

AccessPermission类用于通过为其分配访问权限来保护 PDF 文档使用此类,您可以限制用户执行以下操作。

  • 打印文档
  • 修改文档内容
  • 复制或提取文档内容
  • 添加或修改注释
  • 填写交互式表单字段
  • 提取文本和图形以供视障人士使用
  • 组装文档
  • 打印质量下降

StandardProtectionPolicy类用于向文档添加基于密码的保护

以下是加密现有 PDF 文档的步骤。

第 1 步:加载现有 PDF 文档

使用PDDocument类的静态方法load()加载现有 PDF 文档。此方法接受文件对象作为参数,因为这是一个静态方法,您可以使用类名调用它,如下所示。

File file = new File("path of the document") 
PDDocument document = PDDocument.load(file);

步骤2:创建访问权限对象

实例化AccessPermission类,如下所示。

AccessPermission accessPermission = new AccessPermission();

第3步:创建StandardProtectionPolicy对象

通过传递所有者密码、用户密码和AccessPermission对象来实例化StandardProtectionPolicy类,如下所示。

StandardProtectionPolicy spp = new StandardProtectionPolicy("1234","1234",accessPermission);

步骤 4:设置加密密钥的长度

使用setEncryptionKeyLength()方法设置加密密钥长度,如下所示。

spp.setEncryptionKeyLength(128);

第5步:设置权限

使用StandardProtectionPolicy 类的setPermissions()方法设置权限。此方法接受AccessPermission对象作为参数。

spp.setPermissions(accessPermission);

第 6 步:保护文档

您可以使用PDDocument类的protected()方法来保护您的文档,如下所示。将StandardProtectionPolicy对象作为参数传递给此方法。

document.protect(spp);

第7步:保存文档

添加所需内容后,使用PDDocument类的save()方法保存 PDF 文档,如以下代码块所示。

document.save("Path");

第 8 步:关闭文档

最后,使用PDDocument类的close()方法关闭文档,如下所示。

document.close();

例子

假设我们有一个名为example.pdf的 PDF 文档,位于路径C:/PdfBox_Examples/中,其中有空白页面,如下所示。

样本文件

本例演示如何对上述PDF文档进行加密。在这里,我们将加载名为sample.pdf的PDF文档并对其进行加密。将此代码保存在名为 EncriptingPDF.java 的文件中

import java.io.File;
 
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
public class EncriptingPDF {
  
   public static void main(String args[]) throws Exception {
      //Loading an existing document
      File file = new File("C:/PdfBox_Examples/sample.pdf");
      PDDocument document = PDDocument.load(file);
   
      //Creating access permission object
      AccessPermission ap = new AccessPermission();         

      //Creating StandardProtectionPolicy object
      StandardProtectionPolicy spp = new StandardProtectionPolicy("1234", "1234", ap);

      //Setting the length of the encryption key
      spp.setEncryptionKeyLength(128);

      //Setting the access permissions
      spp.setPermissions(ap);

      //Protecting the document
      document.protect(spp);

      System.out.println("Document encrypted");

      //Saving the document
      document.save("C:/PdfBox_Examples/sample.pdf");
      //Closing the document
      document.close();

   }
}

使用以下命令从命令提示符编译并执行保存的 Java 文件。

javac EncriptingPDF.java
java EncriptingPDF

执行后,上述程序会对给定的 PDF 文档进行加密,并显示以下消息。

Document encrypted