Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

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.

View Full Comparison

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.

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 1 - IronPDF

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ę do PDF przy użyciu iText i IronPDF w C#: Przykład 2 - Funkcje

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")
$vbLabelText   $csharpLabel

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

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 4 - Wynik PDF

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")
$vbLabelText   $csharpLabel

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łówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 3 - Jak dodać nagłówek i stopkę do PDF - IronPDF

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")
$vbLabelText   $csharpLabel

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

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 6 - Przykładowe dane wejściowe

Wynik

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 7 - Obecny wyniki nagłówka PDF

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")
$vbLabelText   $csharpLabel

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 dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 9 - Różne nagłówki dla różnych stron - Wyniki

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:

Pola scałane obsługiwane w nagłówkach i stopkach IronPDF
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")
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 8 - Jak dodać nagłówek i stopkę do PDF przy użyciu iText w C# - przykład

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:

Porównanie funkcji nagłówków i stopek IronPDF i iText
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")
$vbLabelText   $csharpLabel

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.

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 5 - Kompatybilność międzyplatformowa

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

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 10 - Instalacja

Poniższe zasoby pomogą Ci poszerzyć wiedzę:

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.

Jak dodać nagłówek i stopkę do PDF przy użyciu iText i IronPDF w C#: Przykład 11 - Licencjonowanie

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.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie