使用 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 文件——並可以選擇最適合您的專案要求的方法。
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(附圖 1 - IronPDF)
為什麼PDF文件的頁首和頁尾在專業文件中如此重要?
頁首和頁尾在專業PDF文件中發揮著至關重要的作用。 它們透過圖像標誌提供一致的品牌形象,透過頁碼實現頁面導航,顯示日期和文件標題等重要元資料,並透過時間戳記和版本資訊建立文件真實性。
在企業環境中,頁首和頁尾通常具有法律意義。 財務報告需要時間戳以作審計追蹤。 合約需要頁碼以確保完整性。 內部文件可能需要在每一頁上註明保密聲明。 要以程式設計方式滿足這些要求,需要一個能夠可靠地處理頁面層級內容注入的 PDF 庫。
透過程式設計方式新增頁首和頁尾的主要原因包括:
-審計合規性-每頁的時間戳記和版本號均符合監理要求 -品牌一致性-公司商標和樣式在所有產生的文件中統一應用。 導航-頁碼和章節標題有助於讀者快速找到資訊。 -真實性-作者姓名、建立日期和文件 ID 可防止對文件完整性的爭議
如何在 C# 中新增文字頁首和頁尾?
IronPDF為 .NET 應用程式中的 PDF 文件新增頁首和頁尾提供了最直接的方法。 使用 ChromePdfRenderer 類,並結合 TextHeaderFooter 或 HtmlHeaderFooter,您可以用最少的程式碼產生頁首和頁尾-無需建立單獨的儲存格或手動管理 @@--CODE-26829--@@ 物件。
在編寫任何程式碼之前,請使用 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 中的字型類型,讓您無需外部依賴即可控制排版。
輸出
如何使用 iTextSharp 和 IronPDF 在 C# 中新增 PDF 的頁首和頁尾(附圖 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 屬性可確保頁首不會超過指定尺寸,從而保持文件佈局的一致性。
可合併欄位(@@--CODE-26841--@@, @@--CODE-26842--@@, @@--CODE-26843--@@, @@--CODE-26844--@@, @@--CODE-26845--@@, @@--CODE-26846--@@, @@--CODE-26847--@@)在頁首和頁尾中運作方式相同,無需額外程式碼即可提供動態內容插入。 有關實現各種頁首樣式的指導,請參閱頁首和頁尾操作指南。
在建立品牌文件時,HTML 方法優勢顯著。 行銷團隊可以提供開發人員直接整合的 HTML 模板,從而確保對已批准的設計進行像素級完美還原。 CSS 屬性如 font-family、color、background-color 和 border 都能按預期工作,從而實現複雜的視覺效果,而這在其他庫中需要大量的底層代碼才能實現。
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(附圖 3) - 如何在 PDF 中新增頁首和頁尾 - IronPDF
如何為現有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 方法會自動將標頭套用到每個頁面,但您也可以透過傳遞頁面索引集合來定位特定頁面。
輸入
輸出
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(範例):圖 7 - 現有 PDF 頁首輸出
對於從各種來源(例如掃描文件、使用者上傳或第三方 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} 可合併欄位的起始頁碼,而第三個參數接受要接收標頭的頁索引集合。 這種精細的控制方式使得複雜的文件佈局無需複雜的條件邏輯即可實現。 進階頁首和頁尾範例涵蓋了其他場景,包括奇數/偶數頁區分。
輸出
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(範例):圖 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),使用浮點座標手動計算頁面位置,並管理 @@--CODE-26867--@@ 和 @@--CODE-26868--@@ 物件操作。 處理程序透過 END_PAGE 事件類型接收每個頁面的事件-這是一個容易讓許多開發人員犯錯的細節,他們錯誤地使用了 START_PAGE。
輸出
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(附圖 8)
iText 7 中的座標係以頁面左下角為起點,需要進行明確的定位計算。 取得最終頁數需要使用 PdfTemplate 模式,該模式在 OnCloseDocument 期間填充,這會為已經很複雜的工作流程增加更多樣板程式碼。
對於有 Web 開發背景的開發者來說,這種基於座標的方法與聲明式 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 也應該套用於頁首和頁尾區域時,這將特別有用。
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(附圖 5 - 跨平台相容性)
跨平台和容器部署
現代 .NET 應用程式通常部署到 Linux 容器、Azure 應用程式服務或 AWS Lambda 函數。 IronPDF 支援跨平台部署,可在 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
如何使用 iTextSharp 和 IronPDF 在 C# 中加入 PDF 頁首和頁尾(附圖 10 - 安裝)
接下來,以下資源將幫助您更進一步:
-入門文件-涵蓋 PDF 產生和操作功能的全部內容 -頁首和頁尾使用指南-所有頁首和頁尾場景的逐步說明
- HTML 頭部和底部範例-- 基於 HTML 的頭部的可直接執行程式碼範例 -進階頁首和頁尾範例-逐頁定位和奇偶頁區分
- TextHeaderFooter API 參考-- 基於文字的頁首和頁尾的完整屬性列表
- HtmlHeaderFooter API 參考-- 基於 HTML 的頁首和頁尾的完整 API Docker部署指南-Linux容器和雲端環境的配置 IronPDF 的授權選項-涵蓋從個人開發者到企業團隊的各種方案
立即開始免費試用,在您自己的專案中測試頁首和頁尾的實現效果。 試用版包含所有功能,且功能使用時間沒有限制,您可以根據實際 PDF 文件需求評估該程式庫,然後再決定是否購買授權。
如何使用 iTextSharp 和 IronPDF 在 C# 中為 PDF 新增頁首和頁尾(附圖 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 和其他基於 Web 的內容)轉換為 PDF。此功能對於從網頁或動態產生的內容建立 PDF 尤其有用。



