Dodaj nagłówek i stopkę w PDF przy użyciu iTextSharp i IronPDF w C# z przykładem
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
Dodawanie nagłówków i stopek do dokumentów PDF w języku C
Dodawanie nagłówków i stopek do dokumentów PDF jest niezbędne do tworzenia profesjonalnych raportów, faktur i dokumentów biznesowych. Programiści poszukujący rozwiązań iTextSharp wykorzystujących PdfPageEventHelper i metodę OnEndPage przekonają się, że nowoczesne biblioteki .NET oferują znacznie prostsze sposoby osiągnięcia tych samych rezultatów.
W niniejszym przewodniku pokazano, jak dodawać nagłówki i stopki w plikach PDF przy użyciu języka C#, porównując tradycyjne podejście iText 7 z zwięzłym interfejsem API IronPDF. Na koniec zrozumiesz obie implementacje — od utworzenia nowego Document po wygenerowanie ostatecznego pliku PDF — i będziesz mógł wybrać podejście, które najlepiej odpowiada wymaganiom Twojego projektu.

Dlaczego nagłówki i stopki w plikach PDF mają znaczenie w profesjonalnych dokumentach?
Nagłówki i stopki pełnią kluczowe funkcje w profesjonalnych dokumentach PDF. Zapewniają spójny wizerunek marki dzięki logo, umożliwiają nawigację po stronach za pomocą numerów stron, wyświetlają ważne metadane, takie jak daty i tytuły dokumentów, oraz potwierdzają autentyczność dokumentów poprzez znaczniki czasu i informacje o wersji.
W środowiskach korporacyjnych nagłówki i stopki często mają znaczenie prawne. Raporty finansowe wymagają znaczników czasu na potrzeby ścieżek audytu. Umowy wymagają numeracji stron w celu zapewnienia kompletności. Dokumenty wewnętrzne mogą wymagać umieszczenia informacji o poufności na każdej stronie. Spełnienie tych wymagań programowo wymaga biblioteki PDF, która niezawodnie obsługuje wstawianie treści na poziomie strony.
Główne powody, dla których warto programowo dodawać nagłówki i stopki, to:
- Zgodność z audytem — znaczniki czasu i numery wersji na każdej stronie spełniają wymogi regulacyjne
- Spójność marki — logo firmy i stylistyka stosowane jednolicie we wszystkich generowanych dokumentach
- Nawigacja — numery stron i tytuły sekcji pomagają czytelnikom szybko znaleźć informacje
- Autentyczność — nazwisko autora, data utworzenia i identyfikator dokumentu zapobiegają sporom dotyczącym integralności dokumentu

Jak dodać nagłówek i stopkę tekstu w języku C#?
IronPDF zapewnia najbardziej bezpośrednie podejście do dodawania nagłówków i stopek do dokumentów PDF w aplikacjach .NET. Używając klasy ChromePdfRenderer w połączeniu z TextHeaderFooter lub HtmlHeaderFooter, można generować nagłówki i stopki przy użyciu minimalnej ilości kodu — nie ma potrzeby ręcznego tworzenia oddzielnych komórek ani zarządzania obiektem contentbyte.
Przed napisaniem jakiegokolwiek kodu dodaj IronPDF do swojego projektu za pomocą NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Biblioteka nie wymaga żadnych zewnętrznych zależności i działa natychmiast po instalacji. Jest przeznaczony dla platform .NET 5, 6, 7, 8 i 10 i działa na systemach Windows, Linux oraz macOS bez konieczności konfiguracji specyficznej dla danej platformy.
W starszych wzorcach iTextSharp programiści tworzyli metody pomocnicze, takie jak private static void AddContent(), aby ręcznie wstawiać logikę nagłówków i stopek. IronPDF całkowicie eliminuje potrzebę stosowania takich szablonowych rozwiązań.
Oto kompletny przykład, który dodaje zarówno nagłówek, jak i stopkę do pliku 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")
Klasa TextHeaderFooter udostępnia właściwości służące do pozycjonowania tekstu po lewej, w środku lub po prawej stronie obszaru nagłówka lub stopki. Właściwość DrawDividerLine dodaje profesjonalną linię oddzielającą nagłówek lub stopkę od głównej treści dokumentu. Pola scalane, takie jak {page}, {total-pages} i {date}, są automatycznie wypełniane wartościami dynamicznymi podczas generowania pliku PDF.
IronPDF automatycznie oblicza marginesy, zapewniając, że nagłówki i stopki nie nakładają się na treść dokumentu. Klasa TextHeaderFooter obsługuje typy czcionek z IronSoftware.Drawing.FontTypes, co daje Ci kontrolę nad typografią bez zewnętrznych zależności.
Wynik

Zwróć uwagę, jak cała implementacja mieści się w jednym bloku kodu z jasnymi, czytelnymi przypisaniami właściwości. Nie ma potrzeby tworzenia oddzielnego pliku klasy, obliczania pozycji pikseli ani zarządzania obiektami canvas. Biblioteka abstrahuje te złożoności, pozwalając skupić się na treści, a nie na mechanizmach generowania plików PDF.
Jak tworzyć nagłówki i stopki w stylu HTML?
W przypadku bardziej zaawansowanych projektów klasa HtmlHeaderFooter biblioteki IronPDF umożliwia pełne stosowanie stylów HTML i CSS. Takie podejście jest szczególnie cenne, gdy nagłówki muszą zawierać logo w postaci obrazu, złożone układy lub stylizację charakterystyczną dla marki — bez ręcznego tworzenia obiektów PdfPCell lub używania konstruktorów 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")
Ten przykładowy kod pokazuje, w jaki sposób nagłówki HTML mogą zawierać obrazy obok tekstu. Właściwość BaseUrl określa ścieżkę główną do rozpoznawania względnych adresów URL obrazów, co ułatwia umieszczanie logo firmy lub innych grafik. Właściwość MaxHeight gwarantuje, że nagłówek nie przekroczy określonych wymiarów, zachowując spójny układ dokumentu.
Pola, które można wstawiać ({page}, {total-pages}, {url}, {date}, {time}, {html-title}, {pdf-title}) działają identycznie w nagłówkach i stopkach HTML, umożliwiając dynamiczne wstawianie treści bez dodatkowego kodu. Wskazówki dotyczące stosowania różnych stylów nagłówków można znaleźć w poradniku "Nagłówki i stopki".
Podejście oparte na HTML sprawdza się doskonale podczas tworzenia dokumentów firmowych. Zespoły marketingowe mogą dostarczyć szablony HTML, które programiści mogą bezpośrednio zintegrować, zapewniając idealne odwzorowanie zatwierdzonych projektów. Właściwości CSS, takie jak font-family, color, background-color i border, działają zgodnie z oczekiwaniami, umożliwiając zaawansowaną obróbkę wizualną, która w innych bibliotekach wymagałaby rozbudowanego kodu niskopoziomowego.

Jak dodać nagłówki do istniejących dokumentów PDF?
Częstym wymaganiem jest dodawanie nagłówków i stopek do istniejących plików PDF — niezależnie od tego, czy są to dokumenty przesłane, połączone pliki, czy pliki PDF wygenerowane przez inne systemy. IronPDF obsługuje ten scenariusz za pomocą metod AddHtmlHeaders i 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")
Klasa PdfDocument reprezentuje załadowany lub wyrenderowany plik PDF i udostępnia metody do modyfikacji po wyrenderowaniu. To rozdzielenie renderowania od modyfikacji umożliwia realizację procesów, w których dokumenty PDF przechodzą przez wiele etapów przetwarzania. Metoda AddHtmlHeaders automatycznie stosuje nagłówek do każdej strony, choć można również wybrać konkretne strony, przekazując zbiór indeksów stron.
Dane wejściowe

Wynik

Ta funkcja okazuje się nieoceniona w systemach zarządzania dokumentami, które otrzymują pliki PDF z różnych źródeł, takich jak zeskanowane dokumenty, pliki przesłane przez użytkowników lub odpowiedzi API stron trzecich. IronPDF standaryzuje branding lub numerację stron przed dystrybucją lub archiwizacją.
Jak dodać różne nagłówki na różnych stronach?
Niektóre dokumenty wymagają, aby pierwsza strona miała inny nagłówek (lub w ogóle nie miała nagłówka), podczas gdy kolejne strony mają standardowy format. IronPDF obsługuje to poprzez stosowanie nagłówków opartych na indeksie stron — nie ma potrzeby sprawdzania warunków wewnątrz procedur obsługi void OnEndPage ani ręcznego zarządzania licznikami pętli:
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")
Drugi parametr w AddHtmlHeaders określa numer strony początkowej dla pola scalalnego {page}, natomiast trzeci parametr przyjmuje zbiór indeksów stron, na których ma pojawić się nagłówek. Ta precyzyjna kontrola umożliwia tworzenie złożonych układów dokumentów bez skomplikowanej logiki warunkowej. Przykład "Zaawansowane nagłówki i stopki" obejmuje dodatkowe scenariusze, w tym rozróżnienie stron parzystych i nieparzystych.
Wynik

Jak wdrożyć dynamiczne treści wykraczające poza numery stron?
System pól scalanych obsługuje kilka wartości dynamicznych, które są automatycznie wypełniane podczas renderowania. W poniższej tabeli wymieniono wszystkie dostępne pola wraz z ich znaczeniami:
| Pole | Wartość dodana | Typowe zastosowanie |
|---|---|---|
{page} |
Numer bieżącej strony | Stopki z napisem "Strona 3" |
{total-pages} |
Łączna liczba stron | Stopki z napisem "Strona 3 z 10" |
{data} |
Aktualna data w formacie lokalnym | Znaczniki czasu audytu, daty raportów |
{time} |
Aktualny czas w formacie lokalnym | Stopki dotyczące zgodności z przepisami |
{html-title} |
Zawartość tagu HTML |
Nagłówki dokumentów zawierające tytuł strony |
{pdf-title} |
Tytuł metadanych dokumentu PDF | Stopki z nazwą dokumentu |
{url} |
Adres źródłowy podczas renderowania z adresu internetowego | Stopki archiwalne dla treści internetowych |
W przypadku prawdziwie dynamicznej zawartości — wartości określanych w czasie wykonywania — można skonstruować ciąg fragmentu HTML z wartościami interpolowanymi przed przypisaniem go do właściwości HtmlFragment. Takie podejście umożliwia tworzenie nagłówków zawierających wartości pobrane z bazy danych, informacje o użytkowniku lub dane obliczeniowe:
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")
Należy pamiętać, że tokeny {page} i {total-pages} pozostają zwykłymi ciągami znaków w ramach konkatenacji ciągów znaków w języku C# — nie znajdują się one w części interpolowanej. Podczas renderowania plików PDF IronPDF automatycznie zastępuje te tokeny. Ten wzorzec działa dla dowolnej wartości środowiska uruchomieniowego: nazw użytkowników z Active Directory, identyfikatorów dokumentów z bazy danych, ciągów znaków wersji z potoku kompilacji lub obliczonych sum z silnika raportowania.
Połączenie pól scalanych i interpolacji ciągów znaków umożliwia tworzenie zaawansowanych projektów stopek, powszechnie stosowanych w dokumentach biznesowych. Działy prawne często wymagają stopek zawierających tytuł dokumentu, datę i liczbę stron. Raporty finansowe mogą wymagać oznaczenia daty i godziny w celu zapewnienia zgodności z przepisami. Wymagania te są spełnione bez konieczności tworzenia niestandardowego kodu dla każdego typu dokumentu.
Jak wygląda podejście iText 7?
Programiści zaznajomieni z iText 7 (następcą iTextSharp) wiedzą, że dodanie nagłówków i stopek wymaga zaimplementowania procedur obsługi zdarzeń. Biblioteka wykorzystuje system zdarzeń strony, w którym tworzy się klasę reagującą na zdarzenia cyklu życia dokumentu, takie jak OnEndPage i OnCloseDocument.
Oto jak wygląda ta sama implementacja nagłówka i stopki w iText 7, przy użyciu wzorca 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()
To wdrożenie pokazuje podstawową różnicę architektoniczną między tymi dwiema bibliotekami. iText 7 wymaga utworzenia oddzielnej klasy obsługi, która implementuje IEventHandler (podobnie jak starsza wersja PdfPageEventHelper), ręczne obliczanie pozycji stron przy użyciu współrzędnych typu float oraz zarządzanie obiektami PdfCanvas i Canvas w celu wykonywania operacji rysowania. Obsługa odbiera zdarzenia dla każdej strony poprzez typ zdarzenia END_PAGE — jest to szczegół, który sprawia trudności wielu programistom, którzy błędnie używają START_PAGE.
Wynik

Układ współrzędnych w iText 7 ma swój początek w lewym dolnym rogu strony, co wymaga wyraźnych obliczeń w celu ustalenia położenia. Uzyskanie ostatecznej liczby stron wymaga dodatkowego wysiłku ze względu na wzorce PdfTemplate, które są wypełniane podczas OnCloseDocument — wzorca, który dodaje więcej standardowego kodu do i tak już skomplikowanego przepływu pracy.
Dla programistów wywodzących się ze środowiska tworzenia stron internetowych to podejście oparte na współrzędnych wydaje się obce w porównaniu z deklaratywnym modelem HTML/CSS. Każda decyzja dotycząca pozycjonowania wymaga zrozumienia wymiarów strony, przesunięć marginesów i pomiarów tekstu — kwestii, które są pomijane w podejściach opartych na HTML.
iText 7 działa również na licencji AGPL, co oznacza, że aplikacje korzystające z iTextSharp lub iText 7 muszą być oprogramowaniem open source, chyba że zakupiono licencję komercyjną. Jest to ważny czynnik, który należy wziąć pod uwagę przy wyborze bibliotek do projektów komercyjnych.
Jak wypadają te dwa podejścia w porównaniu?
Różnice stają się bardziej widoczne, gdy porównamy konkretne możliwości obok siebie. Poniższa tabela podsumowuje kluczowe różnice:
| Funkcja | IronPDF | iText 7 / iTextSharp |
|---|---|---|
| Styl realizacji | Przypisanie właściwości w opcjach renderera | Klasa obsługi zdarzeń implementująca interfejs IEventHandler |
| Obsługa HTML/CSS | Pełny kod HTML i CSS za pośrednictwem HtmlHeaderFooter | Brak natywnej obsługi HTML; wymaga rysowania na płótnie na niskim poziomie |
| Łączna liczba stron | Automatycznie poprzez pole {total-pages} |
Wymaga wypełnienia szablonu PdfTemplate w metodzie OnCloseDocument |
| Zdjęcie w nagłówku | Standardowy tag HTML z atrybutem BaseUrl |
Wymaga obiektu Image i ręcznego pozycjonowania |
| Dodaj do istniejącego pliku PDF | Metody AddHtmlHeaders / AddHtmlFooters | Wymaga ponownego przetworzenia za pomocą stampera lub pętli zdarzeń |
| Kierowanie na poszczególne strony | Lista indeksów stron przekazanych do metody | Logika warunkowa wewnątrz procedury obsługi zdarzeń |
| Model licencji | Wersja komercyjna z bezpłatną wersją próbną | AGPL (open source) lub komercyjne |
| Wieloplatformowe | Windows, Linux, macOS; Obsługa Docker | Windows, Linux, macOS |
Doświadczenie programistyczne różni się również znacznie podczas rozwiązywania problemów. Podejście oparte na HTML stosowane przez IronPDF oznacza, że możesz wyświetlić podgląd projektu nagłówka w przeglądarce przed zintegrowaniem go z kodem generującym pliki PDF. Jeśli coś wygląda nieprawidłowo, możesz dostosować kod HTML i CSS za pomocą znanych narzędzi programistycznych przeglądarki. W przypadku iText 7 debugowanie problemów z pozycjonowaniem wymaga wielokrotnego generowania testowych plików PDF i ręcznego mierzenia współrzędnych.
Podejście oparte na HTML oznacza, że możesz bezpośrednio wykorzystać swoje dotychczasowe umiejętności w zakresie tworzenia stron internetowych. W nagłówkach i stopkach IronPDF można zastosować dowolny układ możliwy do uzyskania za pomocą HTML i CSS, od układów flexbox po siatki obrazów. Przykład nagłówków i stopek HTML pokazuje dodatkowe możliwości stylizacji.
Dostosowywanie wyglądu nagłówka i stopki
Dopracowanie nagłówków i stopek obejmuje kilka właściwości, które wpływają na pozycjonowanie i prezentację wizualną. Klasa TextHeaderFooter udostępnia następujące opcje dostosowywania:
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")
Właściwość Font akceptuje wartości z IronSoftware.Drawing.FontTypes, w tym Helvetica, Arial, Courier i Times New Roman. Właściwość DrawDividerLine dodaje profesjonalną poziomą linię między stopką a główną treścią. Możesz dostosować kolor linii za pomocą DrawDividerLineColor, aby dopasować go do kolorów marki lub motywu dokumentu.
W przypadku nagłówków i stopek opartych na HTML właściwość LoadStylesAndCSSFromMainHtmlDocument opcjonalnie dziedziczy style z renderowanego dokumentu głównego, zapewniając spójność wizualną między nagłówkami a treścią. Jest to szczególnie przydatne, gdy główny dokument wykorzystuje niestandardowy CSS, który powinien mieć również zastosowanie do obszarów nagłówka i stopki.

Wdrożenia wieloplatformowe i w kontenerach
Nowoczesne aplikacje .NET są często wdrażane w kontenerach Linux, usługach Azure App Services lub funkcjach AWS Lambda. IronPDF obsługuje wdrażanie na wielu platformach, w tym Windows, Linux i macOS, bez konieczności dodatkowej konfiguracji. Biblioteka działa w kontenerach Docker od razu po uruchomieniu, dzięki czemu nadaje się do architektur mikrousług i aplikacji natywnych dla chmury.
Ta wieloplatformowość obejmuje również funkcje nagłówków i stopek — ten sam kod, który generuje pliki PDF z nagłówkami na komputerze deweloperskim z systemem Windows, tworzy identyczne wyniki po wdrożeniu na serwerze produkcyjnym z systemem Linux. Nie ma potrzeby instalowania dodatkowych czcionek, konfigurowania silników renderujących ani obsługi ścieżek kodu specyficznych dla platformy.
Dla zespołów korzystających z kontenerowych środowisk pracy dokumentacja wdrożenia IronPDF Docker zawiera wskazówki dotyczące konfiguracji różnych obrazów bazowych i platform orkiestracji. Spójne działanie biblioteki w różnych środowiskach eliminuje częste źródło błędów w procesach generowania plików PDF.
Zgodnie z dokumentacją platformy .NET firmy Microsoft, aplikacje .NET w kontenerach korzystają ze spójnego zachowania w czasie wykonywania w różnych środowiskach — jest to zasada, którą silnik renderujący IronPDF wzmacnia w zadaniach generowania plików PDF. Podobnie oficjalna dokumentacja Docker wyjaśnia najlepsze praktyki dotyczące konteneryzacji obciążeń .NET, które mają bezpośrednie zastosowanie do usług generowania plików PDF.
Dokumentacja iText 7 potwierdza również obsługę wielu platform, ale dodatkowa złożoność modelu sterowanego zdarzeniami oznacza, że debugowanie problemów z renderowaniem na wielu platformach może być bardziej skomplikowane niż w przypadku deklaratywnego podejścia opartego na HTML.
Jakie są Twoje kolejne kroki?
Wprowadzenie nagłówków i stopek do dokumentów PDF zajmuje zaledwie kilka minut dzięki IronPDF. Zainstaluj bibliotekę za pomocą menedżera pakietów NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf

Poniższe zasoby pomogą Ci poszerzyć wiedzę:
- Dokumentacja "Pierwsze kroki" — obejmuje pełen zakres możliwości generowania i edycji plików PDF
- Przewodnik dotyczący nagłówków i stopek — instrukcje krok po kroku dla wszystkich scenariuszy związanych z nagłówkami i stopkami
- Przykłady nagłówków i stopek HTML — gotowe do użycia fragmenty kodu dla nagłówków opartych na HTML
- Przykład zaawansowanych nagłówków i stopek — kierowanie na poszczególne strony oraz rozróżnienie stron parzystych i nieparzystych
- Dokumentacja API TextHeaderFooter — pełna lista właściwości dla nagłówków i stopek tekstowych
- Dokumentacja API HtmlHeaderFooter — pełne API dla nagłówków i stopek opartych na HTML
- Przewodnik wdrażania Docker — konfiguracja dla kontenerów Linux i środowisk chmurowych
- Opcje licencyjne IronPDF — plany dla indywidualnych programistów aż po zespoły korporacyjne
Rozpocznij bezpłatny okres próbny, aby przetestować implementacje nagłówków i stopek we własnych projektach. Wersja próbna zawiera wszystkie funkcje bez ograniczeń czasowych, co pozwala na ocenę biblioteki pod kątem rzeczywistych wymagań dotyczących dokumentów PDF przed podjęciem decyzji o zakupie licencji.

Dodawanie nagłówków i stopek do dokumentów PDF w języku C# może być zadaniem prostym lub skomplikowanym, w zależności od wybranej biblioteki. Podczas gdy iText 7 zapewnia kontrolę niskiego poziomu poprzez procedury obsługi zdarzeń i operacje na obszarze roboczym, IronPDF oferuje tę samą funkcjonalność poprzez API, które wykorzystuje znane koncepcje HTML i CSS. Dla programistów, dla których priorytetem jest szybkie wdrożenie i łatwy w utrzymaniu kod, IronPDF redukuje implementację nagłówków i stopek z kilkudziesięciu linii — w tym klas obsługi, konfiguracji komórek i struktur tabel — do zaledwie kilku przypisów właściwości.
Często Zadawane Pytania
Jak mogę dodać nagłówki i stopki do plików PDF za pomocą iTextSharp?
Aby dodać nagłówki i stopki do plików PDF za pomocą iTextSharp, można zdefiniować procedurę obsługi zdarzeń strony, która dostosowuje strony dokumentu podczas procesu tworzenia pliku PDF. Wymaga to nadpisania metody OnEndPage w celu dodania żądanej treści nagłówka i stopki.
Jakie są zalety korzystania z IronPDF do dodawania nagłówków i stopek?
IronPDF upraszcza proces dodawania nagłówków i stopek, zapewniając proste API i obsługując różne opcje stylizacji. Integruje się płynnie z projektami C# i oferuje dodatkowe funkcje, takie jak konwersja HTML do PDF, co czyni go wszechstronnym narzędziem do obróbki plików PDF.
Czy IronPDF i iTextSharp mogą być używane razem?
Tak, IronPDF i iTextSharp mogą być używane razem w projekcie C#. Podczas gdy iTextSharp świetnie nadaje się do programowej manipulacji plikami PDF, IronPDF uzupełnia go, zapewniając dodatkowe funkcje, takie jak konwersja HTML do PDF, co może być przydatne do dynamicznego generowania nagłówków i stopek.
Czy istnieje sposób na formatowanie nagłówków i stopek za pomocą IronPDF?
IronPDF pozwala stylizować nagłówki i stopki przy użyciu HTML i CSS. Daje to programistom elastyczność w tworzeniu atrakcyjnych wizualnie projektów i układów dokumentów PDF.
W jaki sposób IronPDF obsługuje numery stron w nagłówkach i stopkach?
IronPDF może automatycznie wstawiać numery stron do nagłówków i stopek. Oferuje opcje formatowania numerów stron zgodnie z potrzebami, takie jak uwzględnienie całkowitej liczby stron lub dostosowanie numeru strony początkowej.
Jaka jest zaleta używania języka C# do manipulacji plikami PDF za pomocą IronPDF?
Wykorzystanie języka C# do manipulacji plikami PDF za pomocą IronPDF zapewnia wysokie bezpieczeństwo typów, łatwą integrację z aplikacjami .NET oraz dostęp do szerokiej gamy bibliotek i narzędzi usprawniających proces tworzenia oprogramowania. Interfejs API IronPDF dla języka C# został zaprojektowany tak, aby był intuicyjny i przyjazny dla użytkownika, dzięki czemu jest dostępny dla programistów o każdym poziomie umiejętności.
Czy mogę konwertować istniejące dokumenty do formatu PDF za pomocą IronPDF?
Tak, IronPDF może konwertować różne formaty dokumentów, w tym HTML, ASPX i inne treści internetowe, do formatu PDF. Ta funkcja jest szczególnie przydatna do tworzenia plików PDF ze stron internetowych lub treści generowanych dynamicznie.




