跳過到頁腳內容
產品比較

PDF頁眉和頁腳:IronPDF與iTextSharp比較

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

IronPDF 透過基於屬性的配置和原生 HTML 支援簡化了 PDF 頁首和頁尾的創建,而 iTextSharp 需要透過手動座標計算來實現 PdfPageEventHelper 以進行精確定位。

在製作專業 PDF 文件(例如商業報告、發票、技術文件)時,一致的頁首和頁尾能夠體現品質並強化品牌形象。 使用過iTextSharp 的開發人員都知道其中的挑戰:新增頁首和頁尾意味著要編寫頁面事件處理程序、計算座標以及在底層管理字體。 IronPDF採用了一種截然不同的方法,它允許您描述您想要的內容,而不是指定每個像素。 本指南將對這兩個庫進行並排介紹,以便您在下一個專案中做出明智的選擇。

如何安裝 IronPDF?

在進行比較之前,這裡先介紹如何將 IronPDF 加入到 .NET 10 專案中。 在 Visual Studio 中使用 .NET CLI 或 NuGet 套件管理器控制台:

dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
SHELL

安裝完成後,在應用程式啟動時新增一次性許可證金鑰呼叫:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

IronPDF NuGet 套件是針對 .NET 8+,並隨附 Chromium 引擎,因此無需額外的執行時間相依性。 我們提供免費試用許可證,以便您在購買前在您的環境中評估 IronPDF。

iTextSharp 實現頁首和頁尾面臨哪些挑戰?

使用 iTextSharp 需要實作 PdfPageEventHelper 類別並重寫 OnEndPage 方法來新增頁首和頁尾。 這種方法涉及直接操作 PdfContentByte 物件和精確的座標計算。 與現代HTML 轉 PDF解決方案不同,iTextSharp 的事件驅動架構需要對 PDF 結構和座標系統有深入的了解。

座標系從頁面左下角開始,這與大多數開發者對佈局的思考方式相反。 這是PDF 規範對頁面座標空間定義方式的直接結果。 每次頁面尺寸改變時——例如,從 A4 切換到 Letter——每個座標值都需要重新計算。 在頁首下方新增底線、將文字置中或將頁尾與右邊距對齊都需要明確的數值偏移。

public class HeaderFooterEvent : PdfPageEventHelper
{
    private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
    private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfContentByte cb = writer.DirectContent;

        // Add header text -- requires precise Y coordinate calculation
        float headerY = document.PageSize.Height - 30;
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
            new Phrase("Company Report", headerFont),
            document.PageSize.Width / 2, headerY, 0);

        // Draw underline manually
        cb.MoveTo(40, headerY - 5);
        cb.LineTo(document.PageSize.Width - 40, headerY - 5);
        cb.Stroke();

        // Add footer with page number
        string footerText = $"Page {writer.PageNumber}";
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
            new Phrase(footerText, footerFont),
            document.PageSize.Width - 40, 30, 0);

        // Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
            new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
            40, 30, 0);
    }
}

// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
public class HeaderFooterEvent : PdfPageEventHelper
{
    private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
    private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfContentByte cb = writer.DirectContent;

        // Add header text -- requires precise Y coordinate calculation
        float headerY = document.PageSize.Height - 30;
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
            new Phrase("Company Report", headerFont),
            document.PageSize.Width / 2, headerY, 0);

        // Draw underline manually
        cb.MoveTo(40, headerY - 5);
        cb.LineTo(document.PageSize.Width - 40, headerY - 5);
        cb.Stroke();

        // Add footer with page number
        string footerText = $"Page {writer.PageNumber}";
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
            new Phrase(footerText, footerFont),
            document.PageSize.Width - 40, 30, 0);

        // Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
            new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
            40, 30, 0);
    }
}

// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class HeaderFooterEvent
    Inherits PdfPageEventHelper

    Private ReadOnly headerFont As Font = New Font(Font.FontFamily.HELVETICA, 12, Font.BOLD)
    Private ReadOnly footerFont As Font = New Font(Font.FontFamily.HELVETICA, 10)

    Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
        Dim cb As PdfContentByte = writer.DirectContent

        ' Add header text -- requires precise Y coordinate calculation
        Dim headerY As Single = document.PageSize.Height - 30
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, 
            New Phrase("Company Report", headerFont), 
            document.PageSize.Width / 2, headerY, 0)

        ' Draw underline manually
        cb.MoveTo(40, headerY - 5)
        cb.LineTo(document.PageSize.Width - 40, headerY - 5)
        cb.Stroke()

        ' Add footer with page number
        Dim footerText As String = $"Page {writer.PageNumber}"
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT, 
            New Phrase(footerText, footerFont), 
            document.PageSize.Width - 40, 30, 0)

        ' Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT, 
            New Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont), 
            40, 30, 0)
    End Sub
End Class

' Usage
Dim writer As PdfWriter = PdfWriter.GetInstance(document, stream)
writer.PageEvent = New HeaderFooterEvent()
$vbLabelText   $csharpLabel

當處理不同的頁面方向、自訂紙張尺寸或不同的邊距要求時,這種手動定位方法會變得更加複雜。 對於需要符合 PDF/A 標準數位簽章的生產系統,手動方法會增加大量的維護開銷。

帶有基本標頭的輸出是什麼樣的?

此PDF文件展示了一份公司報告,其頁眉包含標題文本,頁腳包含頁碼,示範了PDF生成中頁首和頁尾的基本實現方式。

上面的程式碼示範了所需的手動工作——您需要計算精確的座標,單獨管理字體,並透過 DirectContent 處理渲染。 每一次設計變更都意味著要編輯散佈在事件處理程序中的數值常數。

為什麼基於座標的佈局會造成維護問題?

當設計發生變更時——例如移動徽標、調整字體大小、將日期移到中心——開發人員必須透過像素偏移來了解需要更改的內容。 沒有視覺層; 程式碼本身就是佈局的唯一規範。 這使得開發人員之間的交接容易出錯,並增加了即使是細微的視覺修改也需要花費的時間。

IronPDF 如何簡化頁眉、頁尾的建立?

IronPDF 透過直覺的 API 改變了頁首和頁尾的創建過程。 無需實現事件處理程序,即可透過簡單的屬性設定來配置頁首和頁尾。 ChromePdfRenderer。 這種方法符合現代 .NET 開發實踐,並大大降低了學習難度。

using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Company Report",
    LeftText = "CONFIDENTIAL",
    RightText = DateTime.Now.ToString("MMMM yyyy"),
    DrawDividerLine = true,
    FontSize = 12,
    FontFamily = "Arial",
    Spacing = 5
};

// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "© 2024 Company Name",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    Spacing = 10
};

// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Company Report",
    LeftText = "CONFIDENTIAL",
    RightText = DateTime.Now.ToString("MMMM yyyy"),
    DrawDividerLine = true,
    FontSize = 12,
    FontFamily = "Arial",
    Spacing = 5
};

// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "© 2024 Company Name",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    Spacing = 10
};

// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
    .CenterText = "Company Report",
    .LeftText = "CONFIDENTIAL",
    .RightText = DateTime.Now.ToString("MMMM yyyy"),
    .DrawDividerLine = True,
    .FontSize = 12,
    .FontFamily = "Arial",
    .Spacing = 5
}

' Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .LeftText = "{date} {time}",
    .CenterText = "© 2024 Company Name",
    .RightText = "Page {page} of {total-pages}",
    .DrawDividerLine = True,
    .FontSize = 10,
    .Spacing = 10
}

' Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30
renderer.RenderingOptions.MarginBottom = 25

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

IronPDF 中的渲染選項可以對 PDF 產生進行精細控制,同時保持程式碼的可讀性。 這種基於屬性的方法使得維護和修改頁首和頁尾變得容易,而無需深入了解底層 PDF 操作。

IronPDF如何處理專業格式?

這份兩頁的PDF文件展示了IronPDF的頁首和頁尾功能,其中包含公司品牌標識、頁碼和時間戳,並且跨多個頁面格式一致。

差異顯而易見——IronPDF 可以自動處理定位、邊距和渲染,同時為動態內容提供內建佔位符。 該程式庫的Chrome 渲染引擎可確保像素級完美的輸出,與您的 HTML 預覽完全一致。

生產系統中哪些特性最為重要?

功能對比:iTextSharp 與 IronPDF 在頁首和頁尾的比較
特點 iTextSharp IronPDF
實作方法 PdfPageEventHelper RenderingOptions屬性
程式碼複雜度 手動座標計算 簡單屬性賦值
頁碼 使用writer.PageNumber進行手動追蹤 內建{page}佔位符
HTML 支援 有限,需要 XMLWorker 原生 HTML 標頭支持
利潤管理 手動計算 自動調節
動態內容 需要客製化實現 預定義佔位符
第一頁不同 複雜條件邏輯 FirstPageNumber屬性
學習曲線 逐漸地

如何新增帶頁碼的頁首和頁尾?

頁碼是PDF文件的標準要求。 使用 iTextSharp 時,您必須手動追蹤當前頁碼和總頁數,通常需要兩次才能獲得準確的總頁數:

// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
    private readonly PdfTemplate totalPageCount;
    private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);

    public CompleteHeaderFooterEvent(PdfWriter writer)
    {
        // Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
    }

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable footerTable = new PdfPTable(3);
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
        footerTable.SetWidths(new float[] { 1, 1, 1 });

        PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
        leftCell.Border = Rectangle.NO_BORDER;
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT;

        PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
        centerCell.Border = Rectangle.NO_BORDER;
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER;

        PdfPCell rightCell = new PdfPCell();
        rightCell.Border = Rectangle.NO_BORDER;
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;

        Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
        rightCell.AddElement(pageNum);
        rightCell.AddElement(Image.GetInstance(totalPageCount));

        footerTable.AddCell(leftCell);
        footerTable.AddCell(centerCell);
        footerTable.AddCell(rightCell);

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
            document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
    }

    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
            new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
    }
}
// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
    private readonly PdfTemplate totalPageCount;
    private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);

    public CompleteHeaderFooterEvent(PdfWriter writer)
    {
        // Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
    }

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable footerTable = new PdfPTable(3);
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
        footerTable.SetWidths(new float[] { 1, 1, 1 });

        PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
        leftCell.Border = Rectangle.NO_BORDER;
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT;

        PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
        centerCell.Border = Rectangle.NO_BORDER;
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER;

        PdfPCell rightCell = new PdfPCell();
        rightCell.Border = Rectangle.NO_BORDER;
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;

        Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
        rightCell.AddElement(pageNum);
        rightCell.AddElement(Image.GetInstance(totalPageCount));

        footerTable.AddCell(leftCell);
        footerTable.AddCell(centerCell);
        footerTable.AddCell(rightCell);

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
            document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
    }

    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
            new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
    }
}
Imports System
Imports iTextSharp.text
Imports iTextSharp.text.pdf

' iTextSharp approach with complete page numbering
Public Class CompleteHeaderFooterEvent
    Inherits PdfPageEventHelper

    Private ReadOnly totalPageCount As PdfTemplate
    Private ReadOnly normalFont As Font = New Font(Font.FontFamily.HELVETICA, 10)

    Public Sub New(writer As PdfWriter)
        ' Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16)
    End Sub

    Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
        Dim footerTable As New PdfPTable(3)
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin
        footerTable.SetWidths(New Single() {1, 1, 1})

        Dim leftCell As New PdfPCell(New Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont))
        leftCell.Border = Rectangle.NO_BORDER
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT

        Dim centerCell As New PdfPCell(New Phrase("Confidential", normalFont))
        centerCell.Border = Rectangle.NO_BORDER
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER

        Dim rightCell As New PdfPCell()
        rightCell.Border = Rectangle.NO_BORDER
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT

        Dim pageNum As New Chunk($"Page {writer.PageNumber} of ", normalFont)
        rightCell.AddElement(pageNum)
        rightCell.AddElement(Image.GetInstance(totalPageCount))

        footerTable.AddCell(leftCell)
        footerTable.AddCell(centerCell)
        footerTable.AddCell(rightCell)

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent)
    End Sub

    Public Overrides Sub OnCloseDocument(writer As PdfWriter, document As Document)
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT, New Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0)
    End Sub
End Class
$vbLabelText   $csharpLabel

此模式需要建立一個 PDF 範本物件作為佔位符,然後在文件關閉後回填總頁數。 對於不熟悉 iTextSharp 內部機制的人來說,該操作的兩遍特性並不明顯,如果操作錯誤,最終生成的 PDF 文件中的頁數就會不正確。

IronPDF 的方法為何更容易維護?

IronPDF 使用內建佔位符和自動頁碼處理功能來處理頁碼:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "Confidential -- Internal Use Only",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    FontFamily = "Calibri",
    Spacing = 8
};

// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;

renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "Confidential -- Internal Use Only",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    FontFamily = "Calibri",
    Spacing = 8
};

// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;

renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .LeftText = "{date} {time}",
    .CenterText = "Confidential -- Internal Use Only",
    .RightText = "Page {page} of {total-pages}",
    .DrawDividerLine = True,
    .FontSize = 10,
    .FontFamily = "Calibri",
    .Spacing = 8
}

' Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0

renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginTop = 30

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
$vbLabelText   $csharpLabel

內建佔位符支援 {page}{total-pages}{date}{time}{html-title}、@@--15754--@@、{html-title}、@@--15754--@@、{html-title}、@@@"CODE-16-5-6。 無需複雜的後製或兩遍渲染。 該函式庫會在內部計算總頁數,並自動將其註入到每個佔位符位置。

您可以建立具有動態內容的 HTML 標頭嗎?

對於包含公司徽標、樣式化排版或結構化表格的佈局,HTML 標題比基於文字的標題提供了更大的靈活性。 IronPDF在這方面表現出色,它對原生HTML頁首和頁尾提供了支援

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    MaxHeight = 80,
    DrawDividerLine = true,
    BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    MaxHeight = 30,
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    MaxHeight = 80,
    DrawDividerLine = true,
    BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    MaxHeight = 30,
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    .MaxHeight = 80,
    .DrawDividerLine = True,
    .BaseUrl = New Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
}

renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    .MaxHeight = 30,
    .DrawDividerLine = True
}

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("annual-report.pdf")
$vbLabelText   $csharpLabel

複雜頭部在實踐中是如何渲染的?

此PDF文件採用專業的頁首設計,包含公司標誌和年度報告品牌標識,展示了IronPDF先進的HTML頁眉渲染功能,並實現了一致的多頁格式。

使用 iTextSharp 實作 HTML 標頭需要新增 XMLWorker 擴充功能並編寫複雜的解析程式碼。 該庫對 CSS 的支援有限,因此難以產生在不同紙張尺寸上都能可靠工作的現代佈局。 圖片、彈性佈局和網頁字體需要一些變通方法,這大大增加了程式碼的複雜性。

如何區別對待首頁標題?

許多專業文件需要在封面頁使用不同的頁首-封面頁使用較大的徽標,後續頁面使用簡潔的頁首。 IronPDF 透過條件 HTML 和 CSS 支援這種模式:

using IronPdf;

var renderer = new ChromePdfRenderer();

string firstPageHeader = @"
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>";

string subsequentPageHeader = @"
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>";

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = $@"
        <style>
            .first-page {{ display: none; }}
            .other-pages {{ display: block; }}
            @page:first {{
                .first-page {{ display: block; }}
                .other-pages {{ display: none; }}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    MaxHeight = 100
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string firstPageHeader = @"
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>";

string subsequentPageHeader = @"
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>";

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = $@"
        <style>
            .first-page {{ display: none; }}
            .other-pages {{ display: block; }}
            @page:first {{
                .first-page {{ display: block; }}
                .other-pages {{ display: none; }}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    MaxHeight = 100
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim firstPageHeader As String = "
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>"

Dim subsequentPageHeader As String = "
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>"

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = $"
        <style>
            .first-page {{ display: none; }}
            .other-pages {{ display: block; }}
            @page:first {{
                .first-page {{ display: block; }}
                .other-pages {{ display: none; }}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    .MaxHeight = 100
}

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report-with-cover.pdf")
$vbLabelText   $csharpLabel

這種方法將頁首定義集中在一個地方,以便同時更新封面和內頁頁首。 您也可以探索非同步 PDF 渲染在高吞吐量場景下的應用。

哪種方法提供更好的效能和彈性?

產生大型文件或同時處理多個 PDF 文件時,效能至關重要。 IronPDF 的Chrome 渲染引擎為生產工作負載提供了幾個優勢:

1.渲染效能:IronPDF 會快取已渲染的頁首和頁尾,進而提升多頁文件的吞吐量。 2.記憶體效率:此程式庫自動處理記憶體管理,避免手動操作可能導致的記憶體洩漏。 3.並行處理:支援非同步操作,可使用Task.WhenAll模式高效產生批次任務

using IronPdf;

public async Task GenerateReportsAsync(List<ReportData> reports)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Monthly Report",
        DrawDividerLine = true
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        RightText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };

    // Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = false;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

    var tasks = reports.Select(async report =>
    {
        string html = await GenerateHtmlAsync(report);
        return await renderer.RenderHtmlAsPdfAsync(html);
    });

    PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
using IronPdf;

public async Task GenerateReportsAsync(List<ReportData> reports)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Monthly Report",
        DrawDividerLine = true
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        RightText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };

    // Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = false;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

    var tasks = reports.Select(async report =>
    {
        string html = await GenerateHtmlAsync(report);
        return await renderer.RenderHtmlAsPdfAsync(html);
    });

    PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
Imports IronPdf

Public Async Function GenerateReportsAsync(reports As List(Of ReportData)) As Task
    Dim renderer As New ChromePdfRenderer()

    renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
        .CenterText = "Monthly Report",
        .DrawDividerLine = True
    }

    renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
        .RightText = "Page {page} of {total-pages}",
        .DrawDividerLine = True
    }

    ' Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = False
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

    Dim tasks = reports.Select(Async Function(report)
                                   Dim html As String = Await GenerateHtmlAsync(report)
                                   Return Await renderer.RenderHtmlAsPdfAsync(html)
                               End Function)

    Dim pdfs As PdfDocument() = Await Task.WhenAll(tasks)
End Function
$vbLabelText   $csharpLabel

生產用途的許可方面需要考慮哪些因素?

與 iTextSharp 的 AGPL 許可相比,IronPDF 的許可模式提供了對商業用戶友好的條款,除非您購買單獨的商業 iText 許可,否則 AGPL 許可要求您開源您的應用程式程式碼。 對於生產系統,IronPDF 提供:

團隊的學習曲線有多陡峭?

對於熟悉 iTextSharp 頁面事件系統的開發人員來說,會有一個適應期,但 IronPDF 的文件和範例使其易於管理。 使用 CSS 進行樣式設定和 HTML 進行佈局的能力,為實作 iTextSharp 中需要編寫大量自訂程式碼才能實現的功能開闢了新的可能性。相關文件包括:

-快速入門指南,幫助您快速上手

邊距和間距的計算方式有何不同?

專業文件排版需要精確控制頁邊距。 IronPDF 使用毫米作為測量單位簡化了這個過程——毫米是印刷佈局的天然單位:

using IronPdf;

var renderer = new ChromePdfRenderer();

// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4;    // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05;  // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Internal Report",
    DrawDividerLine = true,
    Spacing = 5
};

// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4;    // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05;  // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Internal Report",
    DrawDividerLine = true,
    Spacing = 5
};

// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4 ' 1 inch
renderer.RenderingOptions.MarginBottom = 25.4
renderer.RenderingOptions.MarginLeft = 19.05 ' 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05

renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
    .CenterText = "Internal Report",
    .DrawDividerLine = True,
    .Spacing = 5
}

' Use print CSS media type for accurate page layout
' See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("margin-report.pdf")
$vbLabelText   $csharpLabel

相較之下,iTextSharp 的基於座標的方法需要計算相對於頁面邊界的位置,並手動驗證內容是否與頁首或頁尾重疊。

下一步計劃是什麼?

在 PDF 文件中加入頁首和頁尾並不一定需要複雜的事件處理和座標計算。 雖然 iTextSharp 的方法透過頁面事件和直接內容操作提供精細的控制,但 IronPDF 提供了更直觀的解決方案,它基於屬性的配置和原生 HTML 支援。

考慮到開發速度、可維護性和產生專業外觀文件的便利性,選擇就變得顯而易見了。 IronPDF 對頁首和頁尾的處理方式體現了現代 PDF 生成的特點——功能強大且易於使用。 對於重視架構清晰且程式碼可維護性的團隊而言,IronPDF 的 API 與 .NET 開發實務非常契合。

生產系統的主要優點包括:

-縮短開發時間:基於屬性的配置與複雜的事件處理程序相比 -更易於維護:使用 HTML/CSS 進行佈局,而不是座標計算 -增強靈活性:原生支援響應式設計網頁字體 -卓越效能:優化渲染,支援快取和並行處理 -專業效果:像素級完美輸出,符合現代網路標準

首先透過 NuGet 安裝 IronPDF,然後按照快速入門指南操作,即可在幾分鐘內建立您的第一個頁首和頁尾。 準備投入生產時,請查看授權選項,找到符合您部署要求的方案。 如果在整合過程中遇到任何問題,支援團隊隨時為您提供協助。

請注意iTextSharp 是其各自所有者的註冊商標。 本網站與 iTextSharp 無任何關聯、背書或贊助。所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映了撰寫時的公開信息。

常見問題解答

IronPDF 和 iTextSharp 在添加頁眉和頁脚方面的主要区别是什么?

IronPDF 使用具有原生 HTML 支援的基於屬性的 API,而 iTextSharp 需要通過手動坐標計算實現 PdfPageEventHelper。IronPDF 還提供了頁碼、日期和 URL 的內建佔位符。

IronPDF 如何簡化頁面標頭的添加?

IronPDF 允許您通過 ChromePdfRenderer.RenderingOptions 上的 TextHeaderFooter 或 HtmlHeaderFooter 屬性配置頁眉,消除了需要處理頁面事件或計算像素位置的必要性。

是否可以在 IronPDF 中使用 HTML 自訂標頭?

是的,IronPDF 支援通過 HtmlHeaderFooter 類進行基於 HTML 的頁眉和頁腳,從而實現完整的 CSS 樣式、圖片和動態佔位符,如 {page} 和 {total-pages}。

使用 IronPDF 製作商業報表有什麼好處?

IronPDF 通過基於屬性配置減少實施時間,支援頁碼和日期的動態佔位符,並使用 Chromium 引擎以像素級精度渲染頁眉。

IronPDF 可以處理頁首和頁尾的頁碼嗎?

是的,IronPDF 通過內建的佔位符如 {page} 和 {total-pages} 自動處理頁碼,無需兩遍渲染。

IronPDF 和 iTextSharp 在易用性方面相比如何?

IronPDF 一般更容易使用,因為它用聲明性屬性 API 取代了基於坐標的低級事件處理器,並支援 HTML/CSS 進行佈局。

IronPDF 是否支持標頭中的動態內容?

是的,IronPDF 支援內建佔位符({page}、{total-pages}、{date}、{time}、{html-title}、{url})的動態內容,適用於文本和 HTML 頁眉。

是什麼讓 IronPDF 更適合文件專案?

IronPDF 的 HTML 頁眉支援使其適合需要一致樣式、公司品牌和易於更新的文檔。修改需要編輯 HTML,而不是數字坐標常數。

我可以使用 IronPDF 自訂標頭的發票嗎?

是的,IronPDF 支援帶有標誌、樣式文本和動態字段的自定義 HTML 頁眉,使其非常適合發票生成。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我