跳過到頁腳內容
產品比較

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 需要透過手動座標計算來實現精確定位。

在製作專業 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";
$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();
$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");
$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);
    }
}
$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);
$vbLabelText   $csharpLabel

內建佔位符支援 {pdf-title}{html-title}DE-7760--@。 無需複雜的後製或兩遍渲染。 該函式庫會在內部計算總頁數,並自動將其註入到每個佔位符位置。

能否創建具有動態內容的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 & 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 & 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");
$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");
$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);
}
$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");
$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 小時在線上。
聊天
電子郵件
打電話給我