Jak przekonwertować PDF na JPG w VB.NET
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 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 szukający rozwiązań iText przy użyciu PdfPageEventHelper i metody OnEndPage odkryją, że nowoczesne biblioteki .NET oferują znacznie prostsze podejścia do osiągnięcia tych samych rezultatów.
Ten przewodnik pokazuje, jak dodawać nagłówki i stopki do plików PDF za pomocą C#, porównując tradycyjne podejście iText z zwięzłym API IronPDF. Na końcu będziesz rozumieć oba wdrożenia - od stworzenia nowego Document po wygenerowanie końcowego 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ć tekstowy nagłówek i stopkę w C#?
IronPDF zapewnia najbardziej bezpośrednie podejście do dodawania nagłówków i stopek do dokumentów PDF w aplikacjach .NET. Korzystając z klasy ChromePdfRenderer w połączeniu z TextHeaderFooter lub HtmlHeaderFooter, możesz wygenerować nagłówki i stopki przy minimalnym użyciu kodu - nie ma potrzeby tworzenia oddzielnych komórek ani ręcznego zarządzania obiektem contentbyte.
Przed napisaniem jakiegokolwiek kodu dodaj IronPDF do swojego projektu za pomocą NuGet:
Install-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 iText, programiści tworzyli metody pomocnicze, takie jak private static void AddContent(), aby ręcznie wstawiać logikę nagłówka i stopki. 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 zapewnia właściwości do rozmieszczania tekstu po lewej, na środku lub po prawej stronie obszaru nagłówka lub stopki. Właściwość DrawDividerLine dodaje profesjonalną linię separatora pomiędzy nagłówkiem lub stopką a główną treścią dokumentu. Scalone pola, takie jak {page}, {total-pages} i {date}, automatycznie wypełniają się dynamicznymi wartościami podczas generowania 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, dając ci kontrolę nad typografią bez zależności zewnętrznych.
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. To podejście jest szczególnie wartościowe, gdy nagłówki muszą zawierać logo w postaci obrazu, złożone układy lub stylizację specyficzną 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 ustala podstawową ścieżkę do rozwiązywania relatywnych URL-i obrazów, co ułatwia włączanie logo firmy lub innych grafik. Właściwość MaxHeight zapewnia, że nagłówek nie przekracza określonych wymiarów, utrzymując spójne układy dokumentu.
Scalone pola ({page}, {total-pages}, {url}, {date}, {time}, {html-title}, {pdf-title}) działają identycznie w HTML-owych nagłówkach i stopkach, 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 zaawansowane zabiegi wizualne, które w innych bibliotekach wymagałyby obszernego 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 przetworzony PDF i zapewnia metody do modyfikacji po renderowaniu. 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, chociaż można również celować w konkretne strony poprzez przekazanie kolekcji 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 zastosowanie nagłówka na podstawie indeksów stron - nie ma potrzeby sprawdzania warunków w obsługiwaczach 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 scalonego pola {page}, podczas gdy trzeci parametr akceptuje kolekcję indeksów stron, na które ma być zastosowany 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 scałanych 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 <title> |
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 |
Dla naprawdę dynamicznej zawartości - wartości określanych podczas działania - można skonstruować ciąg fragmentu HTML z interpolowanymi wartościami 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 zauważyć, że tokeny {page} i {total-pages} są pozostawione jako zwykłe ciągi w ramach konkatenacji ciągów C# - nie wewnątrz interpolowanej części. 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 scałanych 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?
Deweloperzy zaznajomieni z iText (następcą iText) wiedzą, że dodawanie nagłówków i stopek wymaga implementowania handlerów zdarzeń. Biblioteka korzysta z systemu zdarzeń strony, gdzie tworzysz klasę, która reaguje na zdarzenia cyklu życia dokumentu, takie jak OnEndPage i OnCloseDocument.
Oto jak wygląda ta sama implementacja nagłówka i stopki przy użyciu iText za pomocą 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 wymaga utworzenia oddzielnej klasy obsługującej, która implementuje IEventHandler (podobnie jak starszy PdfPageEventHelper), ręczne obliczanie pozycji strony przy użyciu współrzędnych typu float oraz zarządzanie obiektami PdfCanvas i Canvas dla operacji rysowania. Obiekt obsługiwacza odbiera zdarzenia dla każdej strony poprzez typ zdarzenia END_PAGE - szczegół, który potyka wielu programistów, którzy błędnie używają START_PAGE.
Wynik

System współrzędnych w iText pochodzi od dolnego-lewego rogu strony, wymagając wyraźnych obliczeń do pozycjonowania. Uzyskanie ostatecznej liczby stron wymaga dodatkowej złożoności z wzorcami PdfTemplate, które są wypełniane podczas OnCloseDocument - wzorzec, który dodaje więcej wzorca do już zaangażowanego 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 działa także pod licencją AGPL, co oznacza, że aplikacje korzystające z iText lub iText muszą być open-source, chyba że zakupiona zostanie komercyjna licencja. 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 / iText |
|---|---|---|
| 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 <img> 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 |
| Wielopłatformowe | 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, debugowanie problemów z pozycjonowaniem wymaga wielokrotnego generowania testowych 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 zapewnia te opcje personalizacji:
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ą linię poziomą pomiędzy stopką a główną treścią. Możesz dostosować kolor linii, używając DrawDividerLineColor, aby dopasować do kolorów Twojej marki lub motywu dokumentu.
Dla nagłówków i stopek bazujących na HTML, właściwość LoadStylesAndCSSFromMainHtmlDocument opcjonalnie dziedziczy style z głównego dokumentu renderowanego, zapewniając spójność wizualną pomiędzy nagłówkami a treścią główną. 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 wielopłatformowe 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 wielopłatformowość 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 również potwierdza wsparcie wieloplatformowe, ale dodatkowa złożoność modelu zdarzeń oznacza, że debugowanie problemów z renderowaniem na różnych platformach może być bardziej skomplikowane niż w podejściu opartym 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

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
Bezpłatna próba, 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.

Dodanie nagłówków i stopek do dokumentów PDF w C# waha się od prostego do skomplikowanego, w zależności od wyboru biblioteki. Podczas gdy iText zapewnia niskopoziomową kontrolę przez obsługę zdarzeń i operacje na płótnie, IronPDF dostarcza te same funkcjonalności przez API, które stosuje znane koncepcje HTML i CSS. Dla programistów preferujących szybkie wdrożenie i łatwe w utrzymaniu kodu, IronPDF redukuje implementację nagłówków i stopek od dziesiątek linii -- w tym klas obsługujących, konfiguracji komórek i struktur tabel -- do kilku przypisań 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.

