使用 iText 庫在 Java 中建立和閱讀 PDF

Mohd Mohtashim Nawaz 2024年2月16日
  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 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;
import java.io.IOException;

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 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;
import java.io.IOException;

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 庫及其功能的更多資訊,請訪問文件