如何在 Java 中使用 iText 新增頁首和頁尾到 PDF
一、簡介
在 PDF 文件中新增頁首和頁尾可增強其可讀性和專業性。這在許多 PDF 文件中非常有用,例如報告、發票或簡報。例如,每個頁面上的頁首可能包含發布日期,而頁腳可能包含頁碼或公司名稱。
在本教程中,我們將探討如何使用 Java 中的 iText 將頁首和頁尾新增至 PDF。
2. 問題陳述
在建立 PDF 文件時,通常需要透過包含一致的頁首和頁尾來增強其可讀性和專業性。然而,添加這些元素可能具有挑戰性,尤其是根據頁碼或其他文件特定資訊動態呈現內容時。
iText 是一個開源 PDF 函式庫,廣泛用於 Java 產生和操作 PDF 文件。此外,它還提供了一個強大的解決方案,透過提供事件處理機制來為 PDF 添加內容,該機制允許開發人員在生成過程中自訂 PDF 文件的外觀。
3. 實作頁首和頁尾處理程序
為了在 PDF 文件中有效地實作頁首和頁腳,我們將建立一個名為HeaderFooterEventHandler
類別的處理ss
類,它將實作IEventHandler
介面。
具體來說,該介面對於定義如何為每個頁面建立事件呈現頁首和頁尾至關重要,其核心功能在handleEvent()
方法中實作。
3.1.配置
我們首先設定HeaderFooterEventHandler
類別並實作handleEvent()
方法來存取必要的 PDF 文件和頁面資訊:
public class HeaderFooterEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
if (event instanceof PdfDocumentEvent docEvent) {
PdfDocument pdfDoc = docEvent.getDocument();
PdfPage page = docEvent.getPage();
int pageNumber = pdfDoc.getPageNumber(page);
//Additional implementation
}
}
}
在此程式碼片段中,我們使用instanceof
檢查來驗證事件的類型是否為PdfDocumentEvent
。這確保我們只處理與 PDF 頁面產生相關的事件。然後,我們投射事件並從文件中檢索當前頁面,以使用該資料呈現頁首和頁尾。
3.2.繪製標題
接下來,我們建立一個PdfCanvas
對象,用於在 PDF 頁面上繪製文字:
PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);
PdfCanvas
允許我們自訂渲染。現在,讓我們繼續繪製標題。我們首先啟動一個新的文字區塊並設定字體樣式:
canvas.beginText();
try {
canvas.setFontAndSize(PdfFontFactory.createFont(StandardFonts.HELVETICA), 12);
} catch (Exception e) {
e.printStackTrace();
}
在這裡,我們使用beginText()
開始文字區塊,然後將字體設定為Helvetica
,大小為12
磅。如果字體建立出現問題(例如,字體可能無法使用或無法正確載入),我們會捕獲異常並列印堆疊追蹤。在這種情況下, iText
通常會回退到系統的預設字型和大小。
設定字體後,我們正確定位標題文字並渲染它:
canvas.moveText(36, page.getPageSize().getTop() - 20);
canvas.showText("Header text - Page " + pageNumber);
canvas.endText();
在這裡,我們將標題放置在距離左邊緣 36 像素、距離頁面頂部 20 像素的位置。此外, showText()
方法將標題列印到頁面,其中包括當前頁碼。
3.3.繪製頁尾
現在,我們繼續使用類似的方法繪製頁尾:
canvas.beginText();
canvas.moveText(36, 20);
canvas.showText("Footer text - Page " + pageNumber);
canvas.endText();
canvas.release();
在本例中,我們將頁尾文字放置在距頁面左側 36 像素、距頁面底部 20 像素的位置。與明確使用頁面頂部邊界getTop()
頁首不同,我們將頁腳的位置錨定在頁面底部附近。
iText
使用預設座標系,其中原點 (0, 0) 位於頁面的左下角。因此,定位是從底部向上開始的,這樣我們就可以將頁腳放置在每個頁面的底部。最後,我們釋放與畫布相關的資源。
4. 在 PDF 中新增頁首和頁尾
現在,我們將整合HeaderFooterEventHandler
來建立具有自訂頁首和頁尾的 PDF。我們還將使用 PDFBox 透過提取和驗證生成的 PDF 中的文字來驗證最終輸出。
4.1.使用事件處理程序修改 PDF
若要為 PDF 新增頁首和頁尾,我們建立新的 PDF 文件並註冊事件處理程序,以確保頁首和頁尾在產生時新增至每個頁面:
@Test
void givenHeaderAndFooter_whenCreatingPDF_thenHeaderFooterAreOnEachPage() throws IOException {
String dest = "documentWithHeaderFooter.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
HeaderFooterEventHandler handler = new HeaderFooterEventHandler();
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, handler);
document.add(new Paragraph("This document contains a header and footer on every page."));
document.close();
}
我們透過初始化PdfWriter
和PdfDocument
來建立一個名為「 documentWithHeaderFooter.pdf
」的新 PDF 檔案。然後,我們實例化HeaderFooterEventHandler
並使用addEventHandler()
方法註冊它,將其附加到PdfDocumentEvent.END_PAGE
事件。這確保了處理程序在頁面完成時執行,在適當的點繪製頁首和頁尾。
最後,我們為文件添加一些內容並關閉它以完成 PDF。
4.2.使用PDFBox
測試 PDF
產生 PDF 後,我們需要驗證每個頁面上是否存在頁首和頁尾內容。為此,我們將使用 PDFBox,它允許我們從生成的 PDF 中提取和檢查文字:
@Test
void givenHeaderAndFooter_whenTestingPDF_thenHeaderFooterAreVerified() throws IOException {
String dest = "documentWithHeaderFooter.pdf";
PDDocument pdDocument = PDDocument.load(new File(dest));
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(pdDocument);
pdDocument.close();
assertTrue(text.contains("Header text"));
assertTrue(text.contains("Footer text"));
}
在這裡,我們使用 PDFBox 的PDDocument
類別載入先前產生的 PDF,並使用PDFTextStripper
來提取其文字。此方法使我們能夠檢索文件中的所有文本,從而使我們能夠驗證頁首和頁尾是否存在於每個頁面上。
測試斷言檢查特定的頁首和頁尾內容,確保 PDF 生成過程成功添加這些元素。
5. 結論
我們示範如何使用 iText 的IEventHandler
為 PDF 新增頁首和頁尾。這種事件驅動的方法確保每個頁面上的動態自訂。
我們還引入了PDFBox
來驗證產生的 PDF,提取並檢查頁首和頁尾內容。透過結合用於建立的 iText 和用於驗證的 PDFBox,我們確保了 PDF 文件的準確性和專業性。
與往常一樣,本文的完整程式碼範例可以在 GitHub 上找到。