使用 iText5 在 Java 中导出 PDF 生成页眉与页脚

在日常的开发需求中,PDF 文档的生成与处理是一个重要的功能。当我们使用 Java 中的 iText 库来生成 PDF 时,可能会需要添加页眉和页脚来增强文档的可读性和专业性。本文将介绍如何使用 iText5 来实现这一功能,并提供相关的代码示例。

iText5 简介

iText 是一个强大的 Java 库,专门用于创建和操作 PDF 文档。iText5 是其经典版,尽管之后有了更新版本,但仍然广泛使用。通过这个库,开发者可以轻松生成 PDF 文档,添加文本、图像以及各种元素。

添加页眉和页脚

在 PDF 文档中,页眉通常用于显示文档的标题或章节名称,而页脚则用于显示页码或版权信息。在 iText5 中,我们可以通过 PdfPageEventHelper 来实现页眉和页脚的添加。

代码示例

下面是一个简单的 Java 程序示例,展示了如何使用 iText5 创建 PDF,并在其中添加页眉和页脚。

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import java.io.FileOutputStream;
import java.io.IOException;

public class PdfWithHeaderFooter {
    
    public static void main(String[] args) {
        Document document = new Document();
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("example.pdf"));
            // 添加事件监听器
            writer.setPageEvent(new HeaderFooter());
            document.open();
            // 添加内容
            for (int i = 1; i <= 5; i++) {
                document.add(new Paragraph("这是第 " + i + " 页的内容。"));
                document.newPage();
            }
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        } finally {
            document.close();
        }
    }

    static class HeaderFooter extends PdfPageEventHelper {
        private BaseFont bf;

        public HeaderFooter() {
            try {
                // 设置字体
                bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            } catch (DocumentException | IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContent();
            // 绘制页眉
            cb.beginText();
            cb.setFontAndSize(bf, 12);
            cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "这是页眉", document.rightMargin() + 50, document.top() + 10, 0);
            cb.endText();
            // 绘制页脚
            cb.beginText();
            cb.setFontAndSize(bf, 12);
            cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "第 " + writer.getPageNumber() + " 页", document.rightMargin() + 50, document.bottom() - 10, 0);
            cb.endText();
        }
    }
}

代码解析

  1. 类定义和 PDF 文档创建:创建一个 Document 对象,并使用 PdfWriter 将其与输出文件关联。
  2. 事件监听器:使用 HeaderFooter 类扩展 PdfPageEventHelper,重写 onEndPage 方法在每页的末尾绘制页眉和页脚。
  3. 绘制文本:使用 BaseFont 设置字体,利用 PdfContentByte 对象的 showTextAligned 方法绘制页眉与页脚。

系统结构设计

为了更好地理解整个过程,下面是一个简单的系统结构图。

classDiagram
    class PdfWithHeaderFooter {
        +main(String[] args)
    }
    class HeaderFooter {
        +HeaderFooter()
        +onEndPage(PdfWriter writer, Document document)
    }
    
    PdfWithHeaderFooter --> HeaderFooter

序列图

在生成 PDF 的过程中,主要的操作步骤如图所示:

sequenceDiagram
    participant User
    participant PdfWithHeaderFooter
    participant Document
    participant PdfWriter
    participant HeaderFooter

    User->>PdfWithHeaderFooter: 启动PDF生成
    PdfWithHeaderFooter->>Document: 创建文档
    PdfWithHeaderFooter->>PdfWriter: 创建PDF写入器
    PdfWriter->>HeaderFooter: 设置事件监听器
    PdfWithHeaderFooter->>Document: 打开文档
    Note right of PdfWithHeaderFooter: 添加内容
    PdfWithHeaderFooter->>Document: 添加内容
    PdfWriter->>HeaderFooter: 调用onEndPage方法
    HeaderFooter->>Document: 添加页眉和页脚
    PdfWithHeaderFooter->>Document: 关闭文档

结论

通过以上方法,我们可以轻松地在 PDF 文档中添加页眉和页脚,使文档更加专业与完整。使用 iText5,开发者可以灵活地定制 PDF 的内容及样式,满足各种业务需求。如果你对 iText5 感兴趣,可以深入学习更多关于该库的功能与使用技巧,实现更复杂的 PDF 文档处理方案。