Ajouter un en-tête et un pied de page dans un PDF en utilisant iTextSharp et IronPDF en C# avec exemple
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
Ajout d'en-têtes et de pieds de page aux documents PDF en C
L'ajout d'en-têtes et de pieds de page aux documents PDF est essentiel pour créer des rapports, des factures et des documents commerciaux professionnels. Les développeurs à la recherche de solutions iTextSharp utilisant PdfPageEventHelper et la méthode OnEndPage constateront que les bibliothèques .NET modernes offrent des approches beaucoup plus simples pour obtenir les mêmes résultats.
Ce guide explique comment ajouter des en-têtes et des pieds de page dans les fichiers PDF en utilisant C#, en comparant l'approche traditionnelle d'iText 7 avec l'API concise d' IronPDF . À la fin, vous comprendrez les deux implémentations -- de la création d'un nouveau Document à la génération du fichier PDF final -- et vous pourrez choisir l'approche qui correspond le mieux aux exigences de votre projet.

Pourquoi les en-têtes et pieds de page PDF sont-ils importants dans les documents Professional ?
Les en-têtes et les pieds de page remplissent des fonctions essentielles dans les documents PDF professionnels. Ils assurent une image de marque cohérente grâce aux logos, facilitent la navigation grâce aux numéros de page, affichent des métadonnées importantes telles que les dates et les titres de documents, et établissent l'authenticité des documents grâce aux horodatages et aux informations de version.
Dans les environnements d'entreprise, les en-têtes et les pieds de page ont souvent une signification juridique. Les rapports financiers nécessitent des horodatages pour les pistes d'audit. Les contrats doivent être numérotés pour garantir leur exhaustivité. Les documents internes peuvent nécessiter des avis de confidentialité sur chaque page. Pour répondre à ces exigences au niveau programmatique, il faut une bibliothèque PDF qui gère de manière fiable l'injection de contenu au niveau de la page.
Les principales raisons d'ajouter des en-têtes et des pieds de page par programmation sont les suivantes :
- Conformité aux audits : les horodatages et les numéros de version sur chaque page satisfont aux exigences réglementaires
- Cohérence de la marque : logos et style de l'entreprise appliqués uniformément à tous les documents générés
- Navigation : les numéros de page et les titres des sections aident les lecteurs à trouver rapidement l'information.
- Authenticité : le nom de l'auteur, la date de création et l'identifiant du document préviennent les litiges relatifs à son intégrité.

Comment ajouter un en-tête et un pied de page de texte en C# ?
IronPDF offre la méthode la plus directe pour ajouter des en-têtes et des pieds de page aux documents PDF dans les applications .NET . En utilisant la classe ChromePdfRenderer combinée avec TextHeaderFooter ou HtmlHeaderFooter, vous pouvez générer des en-têtes et des pieds de page avec un minimum de code - pas besoin de créer des cellules séparées ni de gérer manuellement un objet contentbyte.
Avant d'écrire le moindre code, ajoutez IronPDF à votre projet à l'aide de NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
La bibliothèque ne nécessite aucune dépendance externe et fonctionne immédiatement après son installation. Il cible .NET 5, 6, 7, 8 et 10 et fonctionne sous Windows, Linux et macOS sans configuration spécifique à la plateforme.
Dans les anciens modèles iTextSharp, les développeurs créaient des méthodes d'assistance telles que private static void AddContent() pour injecter manuellement la logique d'en-tête et de pied de page. IronPDF élimine totalement la nécessité d'utiliser ce type de texte passe-partout.
Voici un exemple complet qui ajoute un en-tête et un pied de page à un fichier 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")
La classe TextHeaderFooter fournit des propriétés pour positionner le texte à gauche, au centre ou à droite de la zone d'en-tête ou de pied de page. La propriété DrawDividerLine ajoute une ligne de séparation Professional entre l'en-tête ou le pied de page et le contenu principal du document. Les champs fusionnables comme {page}, {total-pages} et {date} se remplissent automatiquement avec des valeurs dynamiques lors de la génération du PDF.
IronPDF gère automatiquement les calculs de marges, garantissant ainsi que les en-têtes et les pieds de page ne chevauchent pas le contenu de votre document. La classe TextHeaderFooter prend en charge les types de polices de IronSoftware.Drawing.FontTypes, vous donnant le contrôle sur la typographie sans dépendances externes.
Sortie

Remarquez que l'ensemble de l'implémentation tient dans un seul bloc de code avec des affectations de propriétés claires et lisibles. Il n'est pas nécessaire de créer un fichier de classe séparé, de calculer les positions des pixels ou de gérer les objets canvas. La bibliothèque simplifie ces complexités, vous permettant de vous concentrer sur le contenu plutôt que sur les aspects techniques de la génération de PDF.
Comment créer des en-têtes et des pieds de page au format HTML ?
Pour des designs plus sophistiqués, la classe HtmlHeaderFooter d'IronPDF permet une mise en forme HTML et CSS complète. Cette approche est particulièrement précieuse lorsque les en-têtes doivent inclure un logo image, des mises en page complexes ou un style spécifique à la marque, sans créer manuellement des objets PdfPCell ou utiliser des constructeurs 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")
Cet exemple de code montre comment les en-têtes HTML peuvent incorporer des images à côté du texte. La propriété BaseUrl établit le chemin racine pour la résolution des URL d'images relatives, ce qui simplifie l'inclusion des logos d'entreprise ou d'autres graphiques. La propriété MaxHeight garantit que l'en-tête ne dépasse pas les dimensions spécifiées, maintenant ainsi des mises en page de document cohérentes.
Les champs fusionnables ({page}, {total-pages}, {url}, {date}, {time}, {html-title}, {pdf-title}) fonctionnent de manière identique dans les en-têtes et les pieds de page HTML, permettant l'insertion dynamique de contenu sans code supplémentaire. Pour obtenir des conseils sur la mise en œuvre de différents styles d'en-tête, consultez le guide pratique En-têtes et pieds de page .
L'approche HTML excelle dans la création de documents de marque. Les équipes marketing peuvent fournir des modèles HTML que les développeurs intègrent directement, garantissant ainsi une reproduction au pixel près des conceptions approuvées. Les propriétés CSS comme font-family, color, background-color et border fonctionnent comme prévu, permettant des traitements visuels sophistiqués qui nécessiteraient un code de bas niveau important dans d'autres bibliothèques.

Comment ajouter des en-têtes à des documents PDF existants ?
Une exigence courante consiste à ajouter des en-têtes et des pieds de page aux fichiers PDF existants, qu'il s'agisse de documents téléchargés, de fichiers fusionnés ou de PDF générés par d'autres systèmes. IronPDF gère ce scénario avec les méthodes AddHtmlHeaders et 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")
La classe PdfDocument représente un PDF chargé ou rendu et fournit des méthodes pour les modifications post-rendu. Cette séparation entre le rendu et la modification permet des flux de travail où les documents PDF passent par plusieurs étapes de traitement. La méthode AddHtmlHeaders applique automatiquement l'en-tête à chaque page, bien que vous puissiez également cibler des pages spécifiques en passant une collection d'index de page.
Entrée

Sortie

Cette capacité s'avère inestimable dans les systèmes de gestion de documents qui reçoivent des fichiers PDF de diverses sources, telles que des documents numérisés, des téléchargements d'utilisateurs ou des réponses d'API tierces. IronPDF normalise l'image de marque ou la numérotation des pages avant la distribution ou l'archivage.
Comment ajouter des en-têtes différents sur des pages différentes ?
Certains documents exigent que la première page comporte un en-tête différent (ou pas d'en-tête du tout), tandis que les pages suivantes utilisent un format standard. IronPDF prend en charge cette fonctionnalité grâce à l'application d'en-têtes basée sur l'index de page ; il n'est pas nécessaire de vérifier les conditions à l'intérieur des gestionnaires void OnEndPage ni de gérer manuellement les compteurs de boucle :
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")
Le deuxième paramètre dans AddHtmlHeaders spécifie le numéro de page de départ pour le champ fusionnable {page}, tandis que le troisième paramètre accepte une collection d'indices de page pour recevoir l'en-tête. Ce contrôle granulaire permet des mises en page de documents complexes sans logique conditionnelle alambiquée. L' exemple des en-têtes et pieds de page avancés couvre des scénarios supplémentaires, notamment la différenciation des pages paires/impaires.
Sortie

Comment mettre en œuvre un contenu dynamique au-delà des numéros de page ?
Le système de champs fusionnables prend en charge plusieurs valeurs dynamiques qui se remplissent automatiquement lors du rendu. Le tableau suivant répertorie tous les champs disponibles et leur signification :
| Champ | Valeur insérée | Utilisation typique |
|---|---|---|
| `{page}` | numéro de page actuel | Pieds de page affichant " Page 3 " |
| `{total-pages}` | Nombre total de pages | Pieds de page affichant " Page 3 sur 10 " |
| `{date}` | Date actuelle au format local | Horodatage des audits, dates des rapports |
| `{time}` | Heure actuelle au format local | Pieds de page de conformité réglementaire |
| `{html-title}` | Contenu de la balise HTML ` |
En-têtes de document affichant le titre de la page |
| `{pdf-title}` | titre des métadonnées du document PDF | Pieds de page de marque avec nom du document |
| `{url}` | URL source lors du rendu à partir d'une adresse web | Pieds de page d'archives pour le contenu Web |
Pour un contenu véritablement dynamique -- valeurs déterminées au moment de l'exécution -- vous pouvez construire la chaîne de fragment HTML avec des valeurs interpolées avant de l'affecter à la propriété HtmlFragment. Cette approche permet d'inclure dans les en-têtes des valeurs extraites de la base de données, des informations sur l'utilisateur ou des données calculées :
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")
Notez que les jetons {page} et {total-pages} sont laissés sous forme de chaînes simples dans la concaténation de chaînes C# -- et non à l'intérieur de la partie interpolée. Lors du rendu PDF, IronPDF remplace automatiquement ces jetons. Ce modèle fonctionne pour toute valeur d'exécution : noms d'utilisateurs d'Active Directory, identifiants de documents d'une base de données, chaînes de version de votre pipeline de génération ou totaux calculés par votre moteur de reporting.
La combinaison de champs fusionnables et d'interpolation de chaînes de caractères permet de réaliser des modèles de pieds de page sophistiqués, courants dans les documents commerciaux. Les services juridiques ont souvent besoin de pieds de page indiquant le titre du document, la date et le nombre de pages. Les rapports financiers peuvent nécessiter des horodatages pour des raisons de conformité réglementaire. Ces exigences sont satisfaites sans code personnalisé pour chaque type de document.
À quoi ressemble l'approche d'iText 7?
Les développeurs qui connaissent iText 7 (le successeur d'iTextSharp) savent que l'ajout d'en-têtes et de pieds de page nécessite la mise en œuvre de gestionnaires d'événements. La bibliothèque utilise un système d'événements de page dans lequel vous créez une classe qui répond aux événements du cycle de vie du document comme OnEndPage et OnCloseDocument.
Voici à quoi ressemble la même implémentation d'en-tête et de pied de page avec iText 7, en utilisant le modèle 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()
Cette implémentation illustre la différence architecturale fondamentale entre les deux bibliothèques. iText 7 nécessite la création d'une classe de gestionnaire séparée qui implémente IEventHandler (similaire à l'ancienne PdfPageEventHelper), calculant manuellement les positions de page à l'aide de coordonnées flottantes et gérant les objets PdfCanvas et Canvas pour les opérations de dessin. Le gestionnaire reçoit des événements pour chaque page via le type d'événement END_PAGE -- un détail qui piège de nombreux développeurs qui utilisent par erreur START_PAGE.
Sortie

Le système de coordonnées dans iText 7 est basé sur le coin inférieur gauche de la page, ce qui nécessite des calculs explicites pour le positionnement. L'obtention du nombre final de pages nécessite une complexité supplémentaire avec les modèles PdfTemplate qui sont remplis pendant OnCloseDocument -- un modèle qui ajoute plus de code répétitif à un flux de travail déjà complexe.
Pour les développeurs issus du développement web, cette approche basée sur les coordonnées semble étrangère par rapport au modèle déclaratif HTML/CSS. Chaque décision de positionnement nécessite de comprendre les dimensions de la page, les décalages de marge et la mesure du texte – des aspects qui sont abstraits dans les approches basées sur HTML.
iText 7 fonctionne également sous licence AGPL, ce qui signifie que les applications utilisant iTextSharp ou iText 7 doivent être open-source, sauf si une licence commerciale est achetée. Il s'agit d'un élément important à prendre en compte lors du choix d'une bibliothèque pour un projet commercial.
Comment les deux approches se comparent-elles ?
Les différences apparaissent plus clairement lorsqu'on compare les fonctionnalités spécifiques. Le tableau suivant résume les principales distinctions :
| Caractéristique | IronPDF | iText 7 / iTextSharp |
|---|---|---|
| Style de mise en œuvre | Affectation de propriété sur les options de rendu | Classe de gestionnaire d'événements implémentant IEventHandler |
| Prise en charge HTML/CSS | HTML et CSS complets via HtmlHeaderFooter | Aucune prise en charge native du HTML ; nécessite un dessin de canevas de bas niveau. |
| Total des numéros de page | Automatique via le champ `{total-pages}` | Nécessite que le modèle PDF soit rempli dans OnCloseDocument |
| Image dans l'en-tête | Balise HTML standard ` |
Nécessite un objet image et un positionnement manuel |
| Ajouter au PDF existant | Méthodes AddHtmlHeaders / AddHtmlFooters | Nécessite un retraitement via un tampon ou une boucle d'événements |
| Ciblage par page | Liste des indices de page transmis à la méthode | Logique conditionnelle à l'intérieur du gestionnaire d'événements |
| Modèle de licence | Commercial avec essai gratuit | AGPL (logiciel libre) ou commercial |
| Multiplateforme | Windows, Linux, macOS ; compatible Docker | Windows, Linux, macOS |
L'expérience de développement diffère également de manière significative lors de la résolution de problèmes. L'approche d'IronPDF basée sur le HTML signifie que vous pouvez prévisualiser la conception de votre en-tête dans un navigateur avant de l'intégrer dans votre code de génération de PDF. Si quelque chose ne semble pas correct, vous pouvez ajuster le HTML et le CSS en utilisant les outils de développement du navigateur qui vous sont familiers. Avec iText 7, le débogage des problèmes de positionnement nécessite la génération répétée de PDF de test et la mesure manuelle des coordonnées.
L'approche basée sur HTML vous permet d'appliquer directement vos compétences existantes en développement web. Toute mise en page réalisable avec HTML et CSS fonctionne dans les en-têtes et pieds de page IronPDF , des agencements flexbox aux grilles d'images. L' exemple des en-têtes et pieds de page HTML illustre des possibilités de style supplémentaires.
Personnalisation de l'apparence de l'en-tête et du pied de page
L'ajustement des en-têtes et des pieds de page implique plusieurs propriétés qui affectent le positionnement et la présentation visuelle. La classe TextHeaderFooter offre les options de personnalisation suivantes :
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")
La propriété Font accepte les valeurs de IronSoftware.Drawing.FontTypes, y compris Helvetica, Arial, Courier et Times New Roman. La propriété DrawDividerLine ajoute une ligne horizontale Professional entre le pied de page et le contenu principal. Vous pouvez personnaliser la couleur de la ligne en utilisant DrawDividerLineColor pour correspondre aux couleurs de votre marque ou au thème de votre document.
Pour les en-têtes et pieds de page basés sur HTML, la propriété LoadStylesAndCSSFromMainHtmlDocument hérite éventuellement des styles du document principal rendu, assurant ainsi une cohérence visuelle entre les en-têtes et le contenu du corps. Ceci est particulièrement utile lorsque votre document principal utilise des feuilles de style CSS personnalisées qui doivent également s'appliquer aux régions de l'en-tête et du pied de page.

Déploiements multiplateformes et conteneurisés
Les applications .NET modernes sont souvent déployées dans des conteneurs Linux, Azure App Services ou des fonctions AWS Lambda. IronPDF prend en charge le déploiement multiplateforme sur Windows, Linux et macOS sans nécessiter de configuration supplémentaire. La bibliothèque fonctionne dans des conteneurs Docker dès sa sortie de l'emballage, ce qui la rend adaptée aux architectures microservices et aux applications cloud-natives.
Cette capacité multiplateforme s'étend aux fonctionnalités d'en-tête et de pied de page : le même code qui génère des PDF avec en-têtes sur une machine de développement Windows produit un résultat identique lorsqu'il est déployé sur un serveur de production Linux. Il n'est pas nécessaire d'installer des polices supplémentaires, de configurer des moteurs de rendu ou de gérer des chemins de code spécifiques à la plateforme.
Pour les équipes exécutant des charges de travail conteneurisées, la documentation de déploiement Docker IronPDF fournit des conseils de configuration pour diverses images de base et plateformes d'orchestration. Le comportement cohérent de la bibliothèque dans tous les environnements élimine une source courante de bogues dans les flux de travail de génération de PDF.
Selon la documentation .NET de Microsoft , les applications .NET conteneurisées bénéficient d'un comportement d'exécution cohérent dans tous les environnements – un principe que le moteur de rendu d'IronPDF renforce pour les tâches de génération de PDF. De même, la documentation officielle de Docker explique les bonnes pratiques de conteneurisation des charges de travail .NET qui s'appliquent directement aux services de génération de PDF.
La documentation d'iText 7 confirme également la prise en charge multiplateforme, mais la complexité supplémentaire de son modèle événementiel signifie que le débogage des problèmes de rendu multiplateforme peut être plus complexe qu'avec une approche déclarative basée sur HTML.
Quelles sont vos prochaines étapes ?
La mise en œuvre d'en-têtes et de pieds de page dans vos documents PDF ne prend que quelques minutes avec IronPDF. Installez la bibliothèque via NuGet Package Manager :
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf

À partir de là, ces ressources vous aideront à aller plus loin :
- Documentation de prise en main : couvre l'ensemble des fonctionnalités de génération et de manipulation de fichiers PDF
- Guide pratique des en-têtes et pieds de page : instructions étape par étape pour tous les cas de figure
- Exemple d'en-têtes et de pieds de page HTML -- exemples de code prêts à l'emploi pour les en-têtes basés sur HTML
- Exemple d'en-têtes et de pieds de page avancés : ciblage par page et différenciation des pages paires/impaires
- Référence de l'API TextHeaderFooter -- liste complète des propriétés pour les en-têtes et pieds de page textuels
- Référence de l'API HtmlHeaderFooter -- API complète pour les en-têtes et pieds de page HTML
- Guide de déploiement Docker : configuration pour les conteneurs Linux et les environnements cloud
- Options de licence IronPDF : des forfaits pour les développeurs individuels et les équipes Enterprise
Démarrez votre essai gratuit pour tester les implémentations d'en-tête et de pied de page dans vos propres projets. L'essai comprend toutes les fonctionnalités sans limite de temps, vous permettant d'évaluer la bibliothèque par rapport à vos besoins réels en matière de documents PDF avant de vous engager sur une licence.

L'ajout d'en-têtes et de pieds de page aux documents PDF en C# peut être simple ou complexe, selon la bibliothèque choisie. Si iText 7 offre un contrôle de bas niveau via des gestionnaires d'événements et des opérations sur le canevas, IronPDF propose les mêmes fonctionnalités grâce à une API qui exploite des concepts HTML et CSS familiers. Pour les développeurs privilégiant une implémentation rapide et un code maintenable, IronPDF réduit l'implémentation des en-têtes et pieds de page de plusieurs dizaines de lignes (incluant les classes de gestion, la configuration des cellules et la structure des tableaux) à quelques affectations de propriétés seulement.
Questions Fréquemment Posées
Comment puis-je ajouter des en-têtes et des pieds de page aux PDF en utilisant iTextSharp ?
Pour ajouter des en-têtes et des pieds de page aux PDF à l'aide d'iTextSharp, vous pouvez définir un gestionnaire d'événement de page qui personnalise les pages du document pendant le processus de création du PDF. Il s'agit de remplacer la méthode OnEndPage pour inclure le contenu de l'en-tête et du pied de page souhaité.
Quels sont les avantages de l'utilisation d'IronPDF pour l'ajout d'en-têtes et de pieds de page ?
IronPDF simplifie le processus d'ajout d'en-têtes et de pieds de page en fournissant une API directe et prend en charge diverses options de style. Il s'intègre parfaitement aux projets C# et offre des fonctionnalités supplémentaires telles que la conversion de HTML en PDF, ce qui en fait un outil polyvalent pour la manipulation des PDF.
IronPDF et iTextSharp peuvent-ils être utilisés ensemble ?
Oui, IronPDF et iTextSharp peuvent être utilisés ensemble dans un projet C#. Si iTextSharp est excellent pour la manipulation programmatique des PDF, IronPDF le complète en offrant des fonctionnalités supplémentaires telles que la conversion de HTML en PDF, ce qui peut être utile pour générer dynamiquement des en-têtes et des pieds de page.
Existe-t-il un moyen de styliser les en-têtes et les pieds de page à l'aide d'IronPDF ?
IronPDF vous permet de styliser les en-têtes et les pieds de page à l'aide de HTML et de CSS. Les développeurs ont ainsi la possibilité de créer des conceptions et des mises en page visuellement attrayantes pour leurs documents PDF.
Comment IronPDF gère-t-il les numéros de page dans les en-têtes et les pieds de page ?
IronPDF peut insérer automatiquement des numéros de page dans les en-têtes et les pieds de page. Il propose des options pour formater les numéros de page en fonction de vos besoins, comme l'inclusion du nombre total de pages ou l'ajustement du numéro de la page de départ.
Quel est l'avantage d'utiliser C# pour la manipulation de PDF avec IronPDF ?
L'utilisation de C# pour la manipulation de PDF avec IronPDF offre une grande sécurité de type, une intégration facile avec les applications .NET et l'accès à une large gamme de bibliothèques et d'outils qui améliorent le processus de développement. L'API C# d'IronPDF est conçue pour être intuitive et conviviale, ce qui la rend accessible aux développeurs de tous niveaux.
Puis-je convertir des documents existants en PDF à l'aide d'IronPDF ?
Oui, IronPDF peut convertir en PDF divers formats de documents, notamment HTML, ASPX et d'autres contenus basés sur le web. Cette fonctionnalité est particulièrement utile pour créer des PDF à partir de pages web ou de contenu généré dynamiquement.



