使用 C# 中的 iTextSharp 和 IronPDF 在 PDF 中添加页眉和页脚(附示例
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
在 C# 中向 PDF 文档添加页眉和页脚
在 PDF 文档中添加页眉和页脚对于创建专业报告、发票和商业文档至关重要。 使用 PdfPageEventHelper 和 OnEndPage 方法搜索 iTextSharp 解决方案的开发人员会发现,现代 .NET 库提供了更简单的方法来实现相同的结果。
本指南演示如何使用 C# 在 PDF 文件中添加页眉和页脚,并将传统的 iText 7 方法与IronPDF简洁的 API 进行比较。 到最后,您将了解两种实现方式——从创建新的 Document 到生成最终的 PDF 文件——并可以选择最适合您的项目要求的方法。
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-1.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图片 1 - IronPDF
为什么PDF页眉和页脚在专业文档中很重要?
页眉和页脚在专业 PDF 文档中起着至关重要的作用。 他们通过图像徽标提供一致的品牌形象,通过页码实现页面导航,显示日期和文档标题等重要元数据,并通过时间戳和版本信息确定文档的真实性。
在企业环境中,页眉和页脚通常具有法律意义。 财务报告需要时间戳,以便进行审计跟踪。 合同需要页码以确保完整性。 内部文件可能要求在每一页上都有保密声明。 要在程序上满足这些要求,需要一个能可靠处理页面级内容注入的 PDF 库。
通过编程方式添加页眉和页脚的主要原因包括:
-审计合规性——每页上的时间戳和版本号均符合监管要求 -品牌一致性——公司徽标和样式在所有生成的文档中统一应用。 导航——页码和章节标题有助于读者快速找到信息。 -真实性——作者姓名、创建日期和文档 ID 可防止对文档完整性的争议
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-2.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图片 2 - 功能
如何在 C# 中添加文本页眉和页脚?
IronPDF为 .NET 应用程序中的 PDF 文档添加页眉和页脚提供了最直接的方法。 使用 ChromePdfRenderer 类,并结合 TextHeaderFooter 或 HtmlHeaderFooter,您可以用最少的代码生成页眉和页脚——无需创建单独的单元格或手动管理 contentbyte 对象。
在编写任何代码之前,请使用 NuGet 将 IronPDF 添加到您的项目中:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
该库无需外部依赖性,安装后可立即运行。 它面向 .NET 5、6、7、8 和 10,可在 Windows、Linux 和 macOS 上运行,无需针对特定平台进行配置。
在较早的 iTextSharp 模式中,开发人员创建了诸如 private static void AddContent() 之类的辅助方法来手动注入页眉和页脚逻辑。 IronPDF 完全消除了这种模板化的需要。
以下是一个完整的示例,演示如何向 PDF 文件添加文本页眉和页脚:
using IronPdf;
// Initialize the PDF renderer
var renderer = new ChromePdfRenderer();
// Configure the text header
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Quarterly Sales Report",
DrawDividerLine = true,
FontSize = 14
};
// Configure the text footer with page number and date
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date}",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10
};
// Set margins to accommodate header and footer
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
// Generate PDF from HTML content
var pdf = renderer.RenderHtmlAsPdf("<h1>Sales Data</h1><p>Content goes here...</p>");
pdf.SaveAs("report-with-headers.pdf");
using IronPdf;
// Initialize the PDF renderer
var renderer = new ChromePdfRenderer();
// Configure the text header
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Quarterly Sales Report",
DrawDividerLine = true,
FontSize = 14
};
// Configure the text footer with page number and date
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date}",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10
};
// Set margins to accommodate header and footer
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
// Generate PDF from HTML content
var pdf = renderer.RenderHtmlAsPdf("<h1>Sales Data</h1><p>Content goes here...</p>");
pdf.SaveAs("report-with-headers.pdf");
Imports IronPdf
' Initialize the PDF renderer
Dim renderer = New ChromePdfRenderer()
' Configure the text header
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Quarterly Sales Report",
.DrawDividerLine = True,
.FontSize = 14
}
' Configure the text footer with page number and date
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.LeftText = "{date}",
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True,
.FontSize = 10
}
' Set margins to accommodate header and footer
renderer.RenderingOptions.MarginTop = 25
renderer.RenderingOptions.MarginBottom = 25
' Generate PDF from HTML content
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Sales Data</h1><p>Content goes here...</p>")
pdf.SaveAs("report-with-headers.pdf")
TextHeaderFooter 类提供了将文本定位在页眉或页脚区域的左侧、中心或右侧的属性。 DrawDividerLine 属性可在页眉或页脚与文档正文内容之间添加一条专业的分隔线。 类似 {page}、{total-pages} 和 {date} 这样的可合并字段在 PDF 生成期间会自动填充动态值。
IronPDF 会自动处理边距计算,确保页眉和页脚不会与文档内容重叠。 TextHeaderFooter 类支持 IronSoftware.Drawing.FontTypes 中的字体类型,让您无需外部依赖即可控制排版。
输出
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-4.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图像 4 - PDF 输出
请注意整个实现是如何在一个代码块中完成的,其中的属性分配清晰易读。 无需创建单独的类文件、计算像素位置或管理画布对象。 该库抽象化了这些复杂性,让您可以专注于内容而不是 PDF 生成的机制。
如何创建 HTML 样式的页眉和页脚?
对于更复杂的设计,IronPDF 的HtmlHeaderFooter 类支持完整的 HTML 和 CSS 样式。 当标题需要包含图像徽标、复杂布局或品牌特定的样式时,这种方法尤其有价值——无需手动创建 PdfPCell 对象或使用 new Phrase 构造函数。
using IronPdf;
using System;
var renderer = new ChromePdfRenderer();
// Create an HTML header with logo and styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; font-family: Arial, sans-serif;'>
<img src='logo.png' style='height: 30px; float: left;' />
<span style='float: right; font-size: 12px; color: #666;'>
Confidential Document
</span>
</div>",
MaxHeight = 25,
DrawDividerLine = true,
BaseUrl = new Uri(@"C:\assets\").AbsoluteUri
};
// Create an HTML footer with page numbering
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align: center; font-size: 10px; color: #999;'>
<span>Generated on {date} at {time}</span>
<br/>
<span>Page {page} of {total-pages}</span>
</div>",
MaxHeight = 20
};
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;
var pdf = renderer.RenderHtmlAsPdf("<h1>Project Proposal</h1><p>Document content...</p>");
pdf.SaveAs("styled-document.pdf");
using IronPdf;
using System;
var renderer = new ChromePdfRenderer();
// Create an HTML header with logo and styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; font-family: Arial, sans-serif;'>
<img src='logo.png' style='height: 30px; float: left;' />
<span style='float: right; font-size: 12px; color: #666;'>
Confidential Document
</span>
</div>",
MaxHeight = 25,
DrawDividerLine = true,
BaseUrl = new Uri(@"C:\assets\").AbsoluteUri
};
// Create an HTML footer with page numbering
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align: center; font-size: 10px; color: #999;'>
<span>Generated on {date} at {time}</span>
<br/>
<span>Page {page} of {total-pages}</span>
</div>",
MaxHeight = 20
};
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;
var pdf = renderer.RenderHtmlAsPdf("<h1>Project Proposal</h1><p>Document content...</p>");
pdf.SaveAs("styled-document.pdf");
Imports IronPdf
Imports System
Dim renderer As New ChromePdfRenderer()
' Create an HTML header with logo and styling
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; font-family: Arial, sans-serif;'>
<img src='logo.png' style='height: 30px; float: left;' />
<span style='float: right; font-size: 12px; color: #666;'>
Confidential Document
</span>
</div>",
.MaxHeight = 25,
.DrawDividerLine = True,
.BaseUrl = New Uri("C:\assets\").AbsoluteUri
}
' Create an HTML footer with page numbering
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align: center; font-size: 10px; color: #999;'>
<span>Generated on {date} at {time}</span>
<br/>
<span>Page {page} of {total-pages}</span>
</div>",
.MaxHeight = 20
}
renderer.RenderingOptions.MarginTop = 30
renderer.RenderingOptions.MarginBottom = 25
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Project Proposal</h1><p>Document content...</p>")
pdf.SaveAs("styled-document.pdf")
该示例代码展示了 HTML 标题如何将图片与文本结合在一起。 BaseUrl 属性用于建立解析相对图像 URL 的根路径,从而可以轻松包含公司徽标或其他图形。 MaxHeight 属性确保页眉不会超过指定尺寸,从而保持文档布局的一致性。
可合并字段({page}、{total-pages}、{url}、{date}、{time}、{html-title}、{pdf-title})在 HTML 页眉和页脚中工作方式相同,无需额外代码即可提供动态内容插入。 有关实现各种页眉样式的指导,请参阅页眉和页脚操作指南。
在创建品牌文档时,HTML 方法优势显著。 营销团队可以提供 HTML 模板,开发人员可以直接将其集成,确保像素完美地再现已获批准的设计。 CSS 属性如 font-family、color、background-color 和 border 可以按预期工作,从而实现复杂的视觉效果,而这在其他库中需要大量的底层代码。

如何为现有 PDF 文档添加页眉?
常见的需求是向已有的 PDF 文件添加页眉和页脚——无论这些文件是上传的文档、合并的文件,还是其他系统生成的 PDF 文件。 IronPDF 使用 AddHtmlHeaders 和 AddHtmlFooters 方法处理这种情况。
using IronPdf;
// Load an existing PDF document
var pdf = PdfDocument.FromFile("customer-profile.pdf");
// Define the header to add
var header = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: center;'>REVISED COPY - {date}</div>",
MaxHeight = 20
};
// Define the footer to add
var footer = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: right;'>Page {page}</div>",
MaxHeight = 15
};
// Apply headers and footers to all pages
pdf.AddHtmlHeaders(header);
pdf.AddHtmlFooters(footer);
pdf.SaveAs("document-with-new-headers.pdf");
using IronPdf;
// Load an existing PDF document
var pdf = PdfDocument.FromFile("customer-profile.pdf");
// Define the header to add
var header = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: center;'>REVISED COPY - {date}</div>",
MaxHeight = 20
};
// Define the footer to add
var footer = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: right;'>Page {page}</div>",
MaxHeight = 15
};
// Apply headers and footers to all pages
pdf.AddHtmlHeaders(header);
pdf.AddHtmlFooters(footer);
pdf.SaveAs("document-with-new-headers.pdf");
Imports IronPdf
' Load an existing PDF document
Dim pdf = PdfDocument.FromFile("customer-profile.pdf")
' Define the header to add
Dim header As New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align: center;'>REVISED COPY - {date}</div>",
.MaxHeight = 20
}
' Define the footer to add
Dim footer As New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align: right;'>Page {page}</div>",
.MaxHeight = 15
}
' Apply headers and footers to all pages
pdf.AddHtmlHeaders(header)
pdf.AddHtmlFooters(footer)
pdf.SaveAs("document-with-new-headers.pdf")
PdfDocument 类表示已加载或已渲染的 PDF,并提供渲染后修改的方法。 渲染和修改之间的这种分离使 PDF 文档通过多个处理阶段的工作流程成为可能。 AddHtmlHeaders 方法会自动将标头应用于每个页面,但您也可以通过传递页面索引集合来定位特定页面。
输入
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-6.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图片 6 - 输入示例。
输出
。
这种能力在文档管理系统中证明是非常宝贵的,因为文档管理系统会从扫描文档、用户上传或第三方 API 响应等不同来源接收 PDF 文件。 IronPDF 在分发或存档前对品牌或页码进行标准化处理。
如何为不同的页面添加不同的页眉?
有些文档要求首页使用不同的页眉(或者完全不使用页眉),而后续页面使用标准格式。 IronPDF 通过基于页面索引的标头应用来支持此功能——无需检查 void OnEndPage 处理程序中的条件或手动管理循环计数器:
using IronPdf;
using System.Collections.Generic;
using System.Linq;
using System.Text;
var renderer = new ChromePdfRenderer();
// Build multi-page HTML with print page-breaks between pages
var pages = new List<string>
{
"<section><h1>Title Page</h1><p>Intro text on page 1.</p></section>",
"<section><h2>Report</h2><p>Detailed report content on page 2.</p></section>",
"<section><h2>Appendix</h2><p>Appendix content on page 3.</p></section>"
};
var sb = new StringBuilder();
sb.AppendLine("<!doctype html><html><head><meta charset='utf-8'>");
sb.AppendLine("<style>");
sb.AppendLine(" body { font-family: Arial, sans-serif; margin: 20px; }");
sb.AppendLine(" .page-break { page-break-after: always; }");
sb.AppendLine("</style>");
sb.AppendLine("</head><body>");
for (int i = 0; i < pages.Count; i++)
{
sb.AppendLine(pages[i]);
if (i < pages.Count - 1)
sb.AppendLine("<div class='page-break'></div>");
}
sb.AppendLine("</body></html>");
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());
// Create the standard header for pages 2 onwards
var standardHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: center;'>Standard Header - Page {page}</div>",
MaxHeight = 20
};
// Apply to all pages except the first (index 0)
var pageIndices = Enumerable.Range(1, pdf.PageCount - 1).ToList();
pdf.AddHtmlHeaders(standardHeader, 1, pageIndices);
pdf.SaveAs("document-skip-first-page-header.pdf");
using IronPdf;
using System.Collections.Generic;
using System.Linq;
using System.Text;
var renderer = new ChromePdfRenderer();
// Build multi-page HTML with print page-breaks between pages
var pages = new List<string>
{
"<section><h1>Title Page</h1><p>Intro text on page 1.</p></section>",
"<section><h2>Report</h2><p>Detailed report content on page 2.</p></section>",
"<section><h2>Appendix</h2><p>Appendix content on page 3.</p></section>"
};
var sb = new StringBuilder();
sb.AppendLine("<!doctype html><html><head><meta charset='utf-8'>");
sb.AppendLine("<style>");
sb.AppendLine(" body { font-family: Arial, sans-serif; margin: 20px; }");
sb.AppendLine(" .page-break { page-break-after: always; }");
sb.AppendLine("</style>");
sb.AppendLine("</head><body>");
for (int i = 0; i < pages.Count; i++)
{
sb.AppendLine(pages[i]);
if (i < pages.Count - 1)
sb.AppendLine("<div class='page-break'></div>");
}
sb.AppendLine("</body></html>");
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());
// Create the standard header for pages 2 onwards
var standardHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align: center;'>Standard Header - Page {page}</div>",
MaxHeight = 20
};
// Apply to all pages except the first (index 0)
var pageIndices = Enumerable.Range(1, pdf.PageCount - 1).ToList();
pdf.AddHtmlHeaders(standardHeader, 1, pageIndices);
pdf.SaveAs("document-skip-first-page-header.pdf");
Imports IronPdf
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Dim renderer As New ChromePdfRenderer()
' Build multi-page HTML with print page-breaks between pages
Dim pages As New List(Of String) From {
"<section><h1>Title Page</h1><p>Intro text on page 1.</p></section>",
"<section><h2>Report</h2><p>Detailed report content on page 2.</p></section>",
"<section><h2>Appendix</h2><p>Appendix content on page 3.</p></section>"
}
Dim sb As New StringBuilder()
sb.AppendLine("<!doctype html><html><head><meta charset='utf-8'>")
sb.AppendLine("<style>")
sb.AppendLine(" body { font-family: Arial, sans-serif; margin: 20px; }")
sb.AppendLine(" .page-break { page-break-after: always; }")
sb.AppendLine("</style>")
sb.AppendLine("</head><body>")
For i As Integer = 0 To pages.Count - 1
sb.AppendLine(pages(i))
If i < pages.Count - 1 Then
sb.AppendLine("<div class='page-break'></div>")
End If
Next
sb.AppendLine("</body></html>")
Dim pdf = renderer.RenderHtmlAsPdf(sb.ToString())
' Create the standard header for pages 2 onwards
Dim standardHeader As New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align: center;'>Standard Header - Page {page}</div>",
.MaxHeight = 20
}
' Apply to all pages except the first (index 0)
Dim pageIndices = Enumerable.Range(1, pdf.PageCount - 1).ToList()
pdf.AddHtmlHeaders(standardHeader, 1, pageIndices)
pdf.SaveAs("document-skip-first-page-header.pdf")
AddHtmlHeaders 中的第二个参数指定 {page} 可合并字段的起始页码,而第三个参数接受要接收标头的页索引集合。 这种细粒度控制可以实现复杂的文档布局,而无需复杂的条件逻辑。 高级页眉和页脚示例涵盖了其他场景,包括奇数/偶数页区分。
输出
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-9.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图片 9 - 不同页面输出不同页眉。
如何在页码之外实现动态内容?
可合并字段系统支持多个动态值,这些值会在渲染过程中自动填充。 下表列出了所有可用字段及其含义:
| 字段 | 插入值 | 典型用途 |
|---|---|---|
{page} |
当前页码 | 页脚显示"第 3 页" |
{total-pages} |
总页数 | 页脚显示"第 3 页,共 10 页" |
{date} |
当前日期(本地格式) | 审计时间戳、报告日期 |
{time} |
当前时间(本地格式) | 监管合规页脚 |
{html-title} |
HTML <title>标签的内容 |
文档页眉显示页面标题 |
{pdf-title} |
PDF文档元数据标题 | 带有文档名称的品牌页脚 |
{url} |
从网址渲染时的源 URL | 网页内容的存档页脚 |
对于真正的动态内容(在运行时确定的值),您可以在将其分配给 HtmlFragment 属性之前,使用插值构造 HTML 片段字符串。 这种方法可以使标题包含数据库检索值、用户信息或计算数据:
using IronPdf;
string userName = GetCurrentUserName();
string documentVersion = "v2.3.1";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = $"<div style='font-size:10px;'>Prepared by: {userName} " +
$"| Version: {documentVersion} " +
"| Page {page} of {total-pages}</div>",
MaxHeight = 20
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report</h1><p>Body content here.</p>");
pdf.SaveAs("dynamic-header-report.pdf");
using IronPdf;
string userName = GetCurrentUserName();
string documentVersion = "v2.3.1";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = $"<div style='font-size:10px;'>Prepared by: {userName} " +
$"| Version: {documentVersion} " +
"| Page {page} of {total-pages}</div>",
MaxHeight = 20
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report</h1><p>Body content here.</p>");
pdf.SaveAs("dynamic-header-report.pdf");
Imports IronPdf
Dim userName As String = GetCurrentUserName()
Dim documentVersion As String = "v2.3.1"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = $"<div style='font-size:10px;'>Prepared by: {userName} " &
$"| Version: {documentVersion} " &
"| Page {page} of {total-pages}</div>",
.MaxHeight = 20
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report</h1><p>Body content here.</p>")
pdf.SaveAs("dynamic-header-report.pdf")
请注意,{page} 和 {total-pages} 标记在 C# 字符串连接中保留为纯字符串,而不是在插值部分中。 在 PDF 渲染过程中,IronPDF 会自动替换这些标记。 此模式适用于任何运行时值:Active Directory 中的用户名、数据库中的文档 ID、构建管道中的版本字符串或报告引擎中的计算总数。
可合并字段和字符串插值的结合,使得在商业文档中常见的复杂页脚设计成为可能。 法律部门通常要求在页脚显示文件标题、日期和页数。 财务报告可能需要时间戳,以符合法规要求。 这些要求无需为每种文档类型编写自定义代码即可满足。
iText 7 方法是什么样的?
熟悉 iText 7(iTextSharp 的后续版本)的开发人员都知道,添加页眉和页脚需要执行事件处理程序。 该库使用页面事件系统,您可以在其中创建一个类来响应文档生命周期事件,例如 OnEndPage 和 OnCloseDocument。
以下是使用 iText 7 实现相同页眉和页脚的效果,采用 ITextEvents 模式:
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Kernel.Events;
using iText.Kernel.Geom;
using iText.Layout.Properties;
// Event handler class for headers and footers -- similar to PdfPageEventHelper
public class ITextEvents : IEventHandler
{
private string _header;
public string Header
{
get { return _header; }
set { _header = value; }
}
public void HandleEvent(Event currentEvent)
{
PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
PdfDocument pdfDoc = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
Rectangle pageSize = page.GetPageSize();
// Create a new PdfCanvas for the contentbyte object
PdfCanvas pdfCanvas = new PdfCanvas(
page.NewContentStreamBefore(),
page.GetResources(),
pdfDoc);
Canvas canvas = new Canvas(pdfCanvas, pageSize);
// Add header text at calculated position
canvas.ShowTextAligned(
new Paragraph("Quarterly Sales Report"),
pageSize.GetWidth() / 2,
pageSize.GetTop() - 20,
TextAlignment.CENTER);
// Add footer with page number
int pageNumber = pdfDoc.GetPageNumber(page);
canvas.ShowTextAligned(
new Paragraph($"Page {pageNumber}"),
pageSize.GetWidth() / 2,
pageSize.GetBottom() + 20,
TextAlignment.CENTER);
canvas.Close();
}
}
// Usage in main code
var writer = new PdfWriter("report.pdf");
var pdfDoc = new PdfDocument(writer);
var document = new Document(pdfDoc);
// Register the event handler for END_PAGE
pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new ITextEvents());
document.Add(new Paragraph("Sales Data"));
document.Add(new Paragraph("Content goes here..."));
document.Close();
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Kernel.Events;
using iText.Kernel.Geom;
using iText.Layout.Properties;
// Event handler class for headers and footers -- similar to PdfPageEventHelper
public class ITextEvents : IEventHandler
{
private string _header;
public string Header
{
get { return _header; }
set { _header = value; }
}
public void HandleEvent(Event currentEvent)
{
PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
PdfDocument pdfDoc = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
Rectangle pageSize = page.GetPageSize();
// Create a new PdfCanvas for the contentbyte object
PdfCanvas pdfCanvas = new PdfCanvas(
page.NewContentStreamBefore(),
page.GetResources(),
pdfDoc);
Canvas canvas = new Canvas(pdfCanvas, pageSize);
// Add header text at calculated position
canvas.ShowTextAligned(
new Paragraph("Quarterly Sales Report"),
pageSize.GetWidth() / 2,
pageSize.GetTop() - 20,
TextAlignment.CENTER);
// Add footer with page number
int pageNumber = pdfDoc.GetPageNumber(page);
canvas.ShowTextAligned(
new Paragraph($"Page {pageNumber}"),
pageSize.GetWidth() / 2,
pageSize.GetBottom() + 20,
TextAlignment.CENTER);
canvas.Close();
}
}
// Usage in main code
var writer = new PdfWriter("report.pdf");
var pdfDoc = new PdfDocument(writer);
var document = new Document(pdfDoc);
// Register the event handler for END_PAGE
pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new ITextEvents());
document.Add(new Paragraph("Sales Data"));
document.Add(new Paragraph("Content goes here..."));
document.Close();
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Kernel.Events
Imports iText.Kernel.Geom
Imports iText.Layout.Properties
' Event handler class for headers and footers -- similar to PdfPageEventHelper
Public Class ITextEvents
Implements IEventHandler
Private _header As String
Public Property Header As String
Get
Return _header
End Get
Set(value As String)
_header = value
End Set
End Property
Public Sub HandleEvent(currentEvent As [Event]) Implements IEventHandler.HandleEvent
Dim docEvent As PdfDocumentEvent = CType(currentEvent, PdfDocumentEvent)
Dim pdfDoc As PdfDocument = docEvent.GetDocument()
Dim page As PdfPage = docEvent.GetPage()
Dim pageSize As Rectangle = page.GetPageSize()
' Create a new PdfCanvas for the contentbyte object
Dim pdfCanvas As New PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc)
Dim canvas As New Canvas(pdfCanvas, pageSize)
' Add header text at calculated position
canvas.ShowTextAligned(New Paragraph("Quarterly Sales Report"), pageSize.GetWidth() / 2, pageSize.GetTop() - 20, TextAlignment.CENTER)
' Add footer with page number
Dim pageNumber As Integer = pdfDoc.GetPageNumber(page)
canvas.ShowTextAligned(New Paragraph($"Page {pageNumber}"), pageSize.GetWidth() / 2, pageSize.GetBottom() + 20, TextAlignment.CENTER)
canvas.Close()
End Sub
End Class
' Usage in main code
Dim writer As New PdfWriter("report.pdf")
Dim pdfDoc As New PdfDocument(writer)
Dim document As New Document(pdfDoc)
' Register the event handler for END_PAGE
pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, New ITextEvents())
document.Add(New Paragraph("Sales Data"))
document.Add(New Paragraph("Content goes here..."))
document.Close()
该实现方式展示了这两个库之间根本的架构差异。 iText 7 需要创建一个单独的处理程序类来实现 IEventHandler(类似于旧版 PdfPageEventHelper),使用浮点坐标手动计算页面位置,并管理 PdfCanvas 和 Canvas 对象以进行绘图操作。 处理程序通过 END_PAGE 事件类型接收每个页面的事件——这是一个容易让许多开发人员犯错的细节,他们错误地使用了 START_PAGE。
输出
。
iText 7 中的坐标系源自页面的左下角,需要进行明确的定位计算。 获取最终页数需要使用 PdfTemplate 模式,该模式在 OnCloseDocument 期间填充,这会给已经很复杂的工作流程增加更多样板代码。
对于具有网络开发背景的开发人员来说,与声明式 HTML/CSS 模型相比,这种基于坐标的方法让人感到陌生。 每个定位决策都需要了解页面尺寸、边距偏移和文本测量——这些问题在基于 HTML 的方法中都被抽象掉了。
iText 7 也采用 AGPL 许可,这意味着除非购买商业许可,否则使用 iTextSharp 或 iText 7 的应用程序必须是开源的。 在为商业项目选择不同的库时,这是一个重要的考虑因素。
这两种方法有何异同?
将具体功能进行并排比较,差异就更加明显了。下表总结了主要区别:
| 特征 | IronPDF | iText 7 / iTextSharp |
|---|---|---|
| 实施风格 | 渲染器选项的属性分配 | 实现了 IEventHandler 接口的事件处理程序类 |
| HTML/CSS 支持 | 通过 HtmlHeaderFooter 实现完整的 HTML 和 CSS | 不支持原生 HTML;需要底层画布绘制。 |
| 页数总计 | 通过{total-pages}字段自动计算 |
需要在 OnCloseDocument 中填写 PdfTemplate |
| 标题中的图片 | 标准 HTML <img>标签,带有 BaseUrl |
需要图像对象和手动定位 |
| 添加到现有PDF | AddHtmlHeaders / AddHtmlFooters 方法 | 需要通过印章或事件循环重新处理 |
| 按页面定向 | 传递给方法的页面索引列表 | 事件处理程序内部的条件逻辑 |
| 许可模式 | 提供免费试用的商业广告 | AGPL(开源)或商业 |
| 跨平台 | Windows、Linux、macOS;支持 Docker | Windows、Linux、macOS |
在排除故障时,开发经验也有很大不同。 IronPDF 基于 HTML 的方法意味着您可以先在浏览器中预览标题设计,然后再将其整合到 PDF 生成代码中。 如果有些地方看起来不对,您可以使用熟悉的浏览器开发工具调整 HTML 和 CSS。 使用 iText 7 调试定位问题需要反复生成测试 PDF 并手动测量坐标。
基于 HTML 的方法意味着您可以直接应用现有的 Web 开发技能。 IronPDF 的页眉和页脚支持使用 HTML 和 CSS 实现的任何布局,从 flexbox 布局到图像网格布局。 HTML 页眉和页脚示例展示了其他样式可能性。
自定义页眉和页脚外观
微调页眉和页脚涉及影响定位和视觉呈现的多个属性。 TextHeaderFooter 类提供以下自定义选项:
using IronPdf;
using IronSoftware.Drawing;
var renderer = new ChromePdfRenderer();
var footer = new TextHeaderFooter
{
LeftText = "Confidential",
CenterText = "{pdf-title}",
RightText = "Page {page} of {total-pages}",
Font = FontTypes.Arial,
FontSize = 9,
DrawDividerLine = true,
DrawDividerLineColor = Color.Gray
};
renderer.RenderingOptions.TextFooter = footer;
renderer.RenderingOptions.MarginBottom = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Board Report</h1><p>Executive summary content.</p>");
pdf.SaveAs("board-report.pdf");
using IronPdf;
using IronSoftware.Drawing;
var renderer = new ChromePdfRenderer();
var footer = new TextHeaderFooter
{
LeftText = "Confidential",
CenterText = "{pdf-title}",
RightText = "Page {page} of {total-pages}",
Font = FontTypes.Arial,
FontSize = 9,
DrawDividerLine = true,
DrawDividerLineColor = Color.Gray
};
renderer.RenderingOptions.TextFooter = footer;
renderer.RenderingOptions.MarginBottom = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Board Report</h1><p>Executive summary content.</p>");
pdf.SaveAs("board-report.pdf");
Imports IronPdf
Imports IronSoftware.Drawing
Dim renderer As New ChromePdfRenderer()
Dim footer As New TextHeaderFooter With {
.LeftText = "Confidential",
.CenterText = "{pdf-title}",
.RightText = "Page {page} of {total-pages}",
.Font = FontTypes.Arial,
.FontSize = 9,
.DrawDividerLine = True,
.DrawDividerLineColor = Color.Gray
}
renderer.RenderingOptions.TextFooter = footer
renderer.RenderingOptions.MarginBottom = 20
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Board Report</h1><p>Executive summary content.</p>")
pdf.SaveAs("board-report.pdf")
Font 属性接受来自 IronSoftware.Drawing.FontTypes 的值,包括 Helvetica、Arial、Courier 和 Times New Roman。 DrawDividerLine 属性在页脚和主要内容之间添加了一条专业的水平线。 您可以使用 DrawDividerLineColor 自定义线条颜色,以匹配您的品牌颜色或文档主题。
对于基于 HTML 的页眉和页脚,LoadStylesAndCSSFromMainHtmlDocument 属性可以选择继承正在渲染的主文档的样式,从而确保页眉和正文内容之间的视觉一致性。 当您的主文档使用自定义 CSS 时,这一点尤其有用,因为自定义 CSS 也应适用于页眉和页脚区域。

跨平台和容器部署
现代 .NET 应用程序经常部署到 Linux 容器、Azure 应用服务或 AWS Lambda 函数中。 IronPdf.Linux 支持 Windows、Linux 和 macOS 跨平台部署,无需额外配置。 该库开箱即可在 Docker 容器中运行,因此适用于微服务架构和云原生应用程序。
这种跨平台功能也延伸到了页眉和页脚功能——在 Windows 开发机器上生成带有页眉的 PDF 的相同代码,在部署到 Linux 生产服务器时会产生相同的输出。 无需安装额外的字体、配置渲染引擎或处理特定于平台的代码路径。
对于运行容器化工作负载的团队, IronPDF Docker 部署文档提供了各种基础镜像和编排平台的配置指南。 该库在不同环境下的一致性行为消除了 PDF 生成工作流程中常见的错误来源。
根据微软的 .NET 文档,容器化的 .NET 应用程序受益于跨环境一致的运行时行为——IronPDF 的渲染引擎在 PDF 生成任务中强化了这一原则。 同样, Docker 的官方文档解释了容器化 .NET 工作负载的最佳实践,这些实践直接适用于 PDF 生成服务。
iText 7 的文档也证实了其跨平台支持,但其事件驱动模型的额外复杂性意味着,调试跨平台渲染问题可能比使用声明式 HTML 方法更加复杂。
下一步计划是什么?
使用 IronPDF 只需几分钟即可在 PDF 文档中实现页眉和页脚。 通过 NuGet 包管理器安装库:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-10.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图片 10 - 安装
接下来,以下资源将帮助您更进一步:
-入门文档——涵盖 PDF 生成和操作功能的全部内容 -页眉和页脚使用指南——所有页眉和页脚场景的分步说明
- HTML 头部和底部示例-- 基于 HTML 的头部的可直接运行代码示例 -高级页眉和页脚示例——逐页定位和奇偶页区分
- TextHeaderFooter API 参考-- 基于文本的页眉和页脚的完整属性列表
- HtmlHeaderFooter API 参考-- 基于 HTML 的页眉和页脚的完整 API Docker部署指南——Linux容器和云环境的配置 IronPDF 的许可选项——涵盖从个人开发者到企业团队的各种方案
立即开始免费试用,在您自己的项目中测试页眉和页脚的实现效果。 试用版包含所有功能,且功能使用时间没有限制,您可以根据实际 PDF 文档需求评估该库,然后再决定是否购买许可证。
!a href="/static-assets/pdf/blog/read-header-footer-itextsharp/read-header-footer-itextsharp-11.webp">How to Add Header and Footer in PDF Using iTextSharp and IronPDF in C# with Example:图像 11 - 许可
在 C# 中为 PDF 文档添加页眉和页脚的难易程度取决于您选择的库。iText 7 通过事件处理程序和画布操作提供底层控制,而 IronPDF 则通过应用熟悉的 HTML 和 CSS 概念的 API 提供相同的功能。对于优先考虑快速实现和代码可维护性的开发人员来说,IronPDF 将页眉和页脚的实现从数十行代码(包括处理程序类、单元格配置和表格结构)简化为仅需几个属性赋值即可完成。
常见问题解答
如何使用 iTextSharp 为 PDF 添加页眉和页脚?
要使用 iTextSharp 为 PDF 添加页眉和页脚,可以定义一个页面事件处理程序,在 PDF 创建过程中自定义文档的页面。这包括覆盖 OnEndPage 方法,以包含所需的页眉和页脚内容。
使用 IronPDF 添加页眉和页脚有什么好处?
IronPDF 通过提供简单明了的 API 简化了添加页眉和页脚的过程,并支持各种样式选项。它能与 C# 项目无缝集成,并提供 HTML 到 PDF 转换等附加功能,是一款适用于 PDF 操作的多功能工具。
IronPDF 和 iTextSharp 可以一起使用吗?
是的,IronPDF 和 iTextSharp 可以在 C# 项目中一起使用。iTextSharp 非常适合对 PDF 进行编程操作,而 IronPDF 则是对它的补充,它提供了额外的功能,如将 HTML 转换为 PDF,这对于动态生成页眉和页脚非常有用。
是否有办法使用 IronPDF 对页眉和页脚进行样式调整?
IronPDF 允许您使用 HTML 和 CSS 对页眉和页脚进行样式设置。这让开发人员可以灵活地为 PDF 文档创建具有视觉吸引力的设计和布局。
IronPDF 如何处理页眉和页脚中的页码?
IronPDF 可在页眉和页脚中自动插入页码。它可根据您的需要提供格式化页码的选项,如包含总页数或调整起始页码。
使用 IronPDF 的 C# 进行 PDF 操作有什么优势?
使用 IronPDF 的 C# 进行 PDF 操作具有很强的类型安全性,易于与 .NET 应用程序集成,并可访问各种库和工具,从而增强开发过程。IronPDF 的 C# API 设计直观、用户友好,使各种技能水平的开发人员都能使用。
我能否使用 IronPDF 将现有文档转换为 PDF?
是的,IronPDF 可以将各种文档格式(包括 HTML、ASPX 和其他基于网络的内容)转换为 PDF。这项功能对于从网页或动态生成的内容创建 PDF 尤其有用。



