Añadir encabezado y pie de página en PDF con iTextSharp y IronPDF en C# con ejemplo
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
Cómo agregar encabezados y pies de página a documentos PDF en C
Añadir encabezados y pies de página a los documentos PDF es esencial para crear informes, facturas y documentos comerciales profesionales. Los desarrolladores que buscan soluciones de iTextSharp utilizando PdfPageEventHelper y el método OnEndPage encontrarán que las bibliotecas modernas de .NET ofrecen enfoques significativamente más simples para lograr los mismos resultados.
Esta guía demuestra cómo agregar encabezados y pies de página en archivos PDF usando C#, comparando el enfoque tradicional de iText 7 con la API concisa de IronPDF . Al final, comprenderás ambas implementaciones, desde crear un nuevo Document hasta generar el archivo PDF final, y podrás elegir el enfoque que mejor se adapte a los requerimientos de tu proyecto.

¿Por qué son importantes los encabezados y pies de página en documentos PDF?
Los encabezados y pies de página desempeñan funciones críticas en los documentos PDF profesionales. Las traducciones deben ser coherentes con la marca mediante logotipos de imágenes, permitir la navegación por páginas con números de página, mostrar metadatos importantes como fechas y títulos de documentos, y establecer la autenticidad del documento mediante marcas de tiempo e información sobre la versión.
En entornos empresariales, los encabezados y pies de página suelen tener importancia jurídica. Los informes financieros requieren marcas de tiempo para realizar auditorías. Los contratos necesitan una numeración de páginas para garantizar su integridad. Los documentos internos pueden requerir avisos de confidencialidad en cada página. Cumplir estos requisitos mediante programación requiere una biblioteca PDF que gestione de forma fiable la inyección de contenido a nivel de página.
Las razones principales para agregar encabezados y pies de página mediante programación incluyen:
- Cumplimiento de auditoría : las marcas de tiempo y los números de versión en cada página satisfacen los requisitos reglamentarios
- Coherencia de marca : los logotipos y el estilo de la empresa se aplican de manera uniforme en todos los documentos generados
- Navegación : los números de página y los títulos de las secciones ayudan a los lectores a localizar la información rápidamente.
- Autenticidad : el nombre del autor, la fecha de creación y la identificación del documento evitan disputas sobre la integridad del documento.

¿Cómo agregar un encabezado y pie de página de texto en C#?
IronPDF proporciona el enfoque más directo para agregar encabezados y pies de página a documentos PDF en aplicaciones .NET . Usando la clase ChromePdfRenderer combinada con TextHeaderFooter o HtmlHeaderFooter, se pueden generar encabezados y pies de página con código mínimo, sin necesidad de crear celdas separadas o gestionar manualmente un objeto contentbyte.
Antes de escribir cualquier código, agregue IronPDF a su proyecto usando NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
La biblioteca no requiere dependencias externas y funciona inmediatamente después de su instalación. Está dirigido a .NET 5, 6, 7, 8 y 10, y se ejecuta en Windows, Linux y macOS sin configuración específica de la plataforma.
En patrones más antiguos de iTextSharp, los desarrolladores creaban métodos auxiliares como private static void AddContent() para inyectar manualmente la lógica de encabezados y pies de página. IronPDF elimina por completo la necesidad de este tipo de repeticiones.
A continuación se muestra un ejemplo completo que agrega un encabezado de texto y un pie de página a un archivo 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 clase TextHeaderFooter proporciona propiedades para posicionar texto a la izquierda, centro o derecha del área de encabezado o pie de página. La propiedad DrawDividerLine añade una línea de separación profesional entre el encabezado o pie de página y el contenido principal del documento. Los campos fusionables como {page}, {total-pages} y {date} se completan automáticamente con valores dinámicos durante la generación del PDF.
IronPDF maneja los cálculos de márgenes automáticamente, garantizando que los encabezados y pies de página no se superpongan con el contenido del documento. La clase TextHeaderFooter admite tipos de fuente de IronSoftware.Drawing.FontTypes, brindando control sobre la tipografía sin dependencias externas.
Resultado

Observa cómo toda la implementación cabe en un único bloque de código con asignaciones de propiedades claras y legibles. No es necesario crear un archivo de clase separado, calcular posiciones de píxeles ni administrar objetos de lienzo. La biblioteca abstrae estas complejidades y le permite centrarse en el contenido en lugar de en la mecánica de la generación de PDF.
¿Cómo crear encabezados y pies de página con estilo HTML?
Para diseños más sofisticados, la clase HtmlHeaderFooter de IronPDF permite un estilo HTML y CSS completo. Este enfoque es particularmente valioso cuando los encabezados necesitan incluir un logotipo de imagen, diseños complejos o estilo específico de la marca, sin crear manualmente objetos PdfPCell ni utilizar constructores 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")
Este código de ejemplo muestra cómo las cabeceras HTML pueden incorporar imágenes junto con el texto. La propiedad BaseUrl establece la ruta raíz para resolver URLs de imágenes relativas, facilitando la inclusión de logotipos de la empresa u otros gráficos. La propiedad MaxHeight asegura que el encabezado no exceda las dimensiones especificadas, manteniendo diseños de documentos consistentes.
Los campos fusionables ({page}, {total-pages}, {url}, {date}, {time}, {html-title}, {pdf-title}) funcionan de manera idéntica en encabezados y pies de página HTML, proporcionando inserciones de contenido dinámico sin código adicional. Para obtener orientación sobre cómo implementar varios estilos de encabezado, consulte la Guía práctica de encabezados y pies de página .
El enfoque HTML brilla al crear documentos de marca. Los equipos de marketing pueden proporcionar plantillas HTML que los desarrolladores integran directamente, garantizando una reproducción perfecta de los diseños aprobados. Las propiedades CSS como font-family, color, background-color y border funcionan como se espera, permitiendo tratamientos visuales sofisticados que requerirían un extenso código de bajo nivel en otras bibliotecas.

¿Cómo se pueden añadir encabezados a documentos PDF existentes?
Un requisito común implica agregar encabezados y pies de página a archivos PDF que ya existen, ya sean documentos cargados, archivos fusionados o PDF generados por otros sistemas. IronPDF maneja este escenario con los métodos AddHtmlHeaders y 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 clase PdfDocument representa un PDF cargado o renderizado y proporciona métodos para modificaciones posteriores al renderizado. Esta separación entre renderización y modificación permite flujos de trabajo en los que los documentos PDF pasan por varias etapas de procesamiento. El método AddHtmlHeaders aplica automáticamente el encabezado a cada página, aunque también puedes dirigirte a páginas específicas pasando una colección de índices de página.
Entrada

Resultado

Esta capacidad resulta inestimable en sistemas de gestión de documentos que reciben archivos PDF de diversas fuentes, como documentos escaneados, cargas de usuarios o respuestas de API de terceros. IronPDF estandariza la marca o la numeración de las páginas antes de su distribución o archivo.
¿Cómo agregar diferentes encabezados en diferentes páginas?
Algunos documentos requieren que la primera página tenga un encabezado diferente (o ningún encabezado), mientras que las páginas posteriores utilizan un formato estándar. IronPDF permite esto a través de la aplicación de encabezados basada en índices de página, sin necesidad de verificar condiciones dentro de los manejadores void OnEndPage o gestionar contadores de bucles manualmente:
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")
El segundo parámetro en AddHtmlHeaders especifica el número de página inicial para el campo fusionable {page}, mientras que el tercer parámetro acepta una colección de índices de página para recibir el encabezado. Este control granular permite diseñar documentos complejos sin una lógica condicional enrevesada. El ejemplo de Encabezados y pies de página avanzados cubre escenarios adicionales, incluida la diferenciación de páginas pares e impares.
Resultado

¿Cómo implementar contenido dinámico más allá de los números de página?
El sistema de campos fusionables admite varios valores dinámicos que se completan automáticamente durante la representación. La siguiente tabla enumera todos los campos disponibles y sus significados:
| Campo | Valor insertado | Uso típico |
|---|---|---|
| `{page}` | Número de página actual | Pies de página que muestran "Página 3" |
| `{total-pages}` | Número total de páginas | Pies de página que muestran "Página 3 de 10" |
| `{date}` | Fecha actual en formato local | Marcas de tiempo de auditoría, fechas de informes |
| `{time}` | Hora actual en formato local | Pies de página de cumplimiento normativo |
| `{html-title}` | Contenido de la etiqueta HTML ` |
Encabezados de documentos que muestran el título de la página |
| `{pdf-title}` | Título de metadatos del documento PDF | Pies de página de marca con el nombre del documento |
| `{url}` | URL de origen al renderizar desde una dirección web | Pies de página de archivo para contenido web |
Para contenido verdaderamente dinámico, valores determinados en tiempo de ejecución, puedes construir la cadena de fragmentos HTML con valores interpolados antes de asignarla a la propiedad HtmlFragment. Este enfoque permite incluir cabeceras con valores recuperados de bases de datos, información del usuario o datos calculados:
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")
Nota que los tokens {page} y {total-pages} se dejan como cadenas simples dentro de la concatenación de cadenas de C# -- no dentro de la parte interpolada. Durante la representación de PDF, IronPDF reemplaza esos tokens automáticamente. Este patrón funciona para cualquier valor de tiempo de ejecución: nombres de usuario de Active Directory, ID de documentos de una base de datos, cadenas de versión de su canal de compilación o totales calculados de su motor de informes.
La combinación de campos fusionables y la interpolación de cadenas permite diseños de pie de página sofisticados comunes en documentos comerciales. Los departamentos jurídicos suelen necesitar pies de página con el título del documento, la fecha y el número de páginas. Los informes financieros pueden necesitar marcas de tiempo para cumplir la normativa. Estos requisitos se cumplen sin código personalizado para cada tipo de documento.
¿Cómo es el enfoque de iText 7?
Los desarrolladores familiarizados con iText 7 (el sucesor de iTextSharp) saben que para añadir encabezados y pies de página es necesario implementar controladores de eventos. La biblioteca utiliza un sistema de eventos de página donde creas una clase que responde a eventos del ciclo de vida del documento como OnEndPage y OnCloseDocument.
Así es como se ve la misma implementación de encabezado y pie de página con iText 7, usando el patrón 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()
Esta implementación demuestra la diferencia arquitectónica fundamental entre las dos bibliotecas. iText 7 requiere crear una clase de manejador separada que implemente IEventHandler (similar al legado PdfPageEventHelper), calculando manualmente posiciones de página usando coordenadas flotantes y gestionando los objetos PdfCanvas y Canvas para operaciones de dibujo. El manejador recibe eventos para cada página a través del tipo de evento END_PAGE -- un detalle que confunde a muchos desarrolladores que usan incorrectamente START_PAGE.
Resultado

El sistema de coordenadas en iText 7 se origina en la esquina inferior izquierda de la página, lo que requiere cálculos explícitos para el posicionamiento. Obtener el número final de páginas requiere complejidad adicional con patrones PdfTemplate que se completan durante OnCloseDocument -- un patrón que añade más código de plantilla a un flujo de trabajo ya implicado.
Para los desarrolladores que proceden de entornos de desarrollo web, este enfoque basado en coordenadas resulta extraño en comparación con el modelo declarativo HTML/CSS. Cada decisión de posicionamiento requiere comprender las dimensiones de la página, los márgenes y la medición del texto: cuestiones que se abstraen en los enfoques basados en HTML.
iText 7 también funciona bajo licencia AGPL, lo que significa que las aplicaciones que utilizan iTextSharp o iText 7 deben ser de código abierto a menos que se compre una licencia comercial. Esta es una consideración importante a la hora de elegir entre bibliotecas para proyectos comerciales.
¿Cómo se comparan los dos enfoques?
Las diferencias se hacen más evidentes al analizar las capacidades específicas en paralelo. La siguiente tabla resume las distinciones clave:
| Función | IronPDF | iText 7 / iTextSharp |
|---|---|---|
| Estilo de implementación | Asignación de propiedades en las opciones del renderizador | Clase de controlador de eventos que implementa IEventHandler |
| Compatibilidad con HTML/CSS | HTML y CSS completos mediante HtmlHeaderFooter | No tiene soporte para HTML nativo; requiere dibujo de lienzo de bajo nivel |
| Total de números de página | Automático a través del campo `{total-pages}` | Requiere que PdfTemplate esté completo en OnCloseDocument |
| Imagen en el encabezado | Etiqueta HTML estándar ` |
Requiere objeto de imagen y posicionamiento manual |
| Agregar a PDF existente | Métodos AddHtmlHeaders / AddHtmlFooters | Requiere reprocesamiento a través de un estampador o bucle de eventos |
| Segmentación por página | Lista de índices de página pasados al método | Lógica condicional dentro del controlador de eventos |
| Modelo de licencia | Comercial con prueba gratuita | AGPL (código abierto) o comercial |
| Multiplataforma | Windows, Linux, macOS; compatible con Docker | Windows, Linux, macOS |
La experiencia de desarrollo también difiere significativamente a la hora de solucionar problemas. El enfoque basado en HTML de IronPDF permite previsualizar el diseño del encabezado en un navegador antes de integrarlo en el código de generación de PDF. Si algo parece incorrecto, puedes ajustar el HTML y el CSS utilizando las herramientas de desarrollo conocidas del navegador. Con iText 7, la depuración de problemas de posicionamiento requiere generar PDF de prueba repetidamente y medir manualmente las coordenadas.
El enfoque basado en HTML significa que puedes aplicar directamente las habilidades de desarrollo web existentes. Cualquier diseño que se pueda lograr con HTML y CSS funciona en encabezados y pies de página de IronPDF , desde arreglos de flexbox hasta cuadrículas de imágenes. El ejemplo de encabezados y pies de página HTML demuestra posibilidades de estilo adicionales.
Personalizar la apariencia del encabezado y pie de página
El ajuste de los encabezados y pies de página implica varias propiedades que afectan al posicionamiento y la presentación visual. La clase TextHeaderFooter proporciona estas opciones de personalización:
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 propiedad Font acepta valores de IronSoftware.Drawing.FontTypes, incluyendo Helvetica, Arial, Courier y Times New Roman. La propiedad DrawDividerLine añade una regla horizontal profesional entre el pie de página y el contenido principal. Puedes personalizar el color de la línea utilizando DrawDividerLineColor para que coincida con los colores de tu marca o tema del documento.
Para encabezados y pies de página basados en HTML, la propiedad LoadStylesAndCSSFromMainHtmlDocument opcionalmente hereda estilos del documento principal que se está renderizando, asegurando consistencia visual entre los encabezados y el contenido del cuerpo. Esto resulta especialmente útil cuando el documento principal utiliza CSS personalizado que también debe aplicarse a las regiones de encabezado y pie de página.

Implementaciones multiplataforma y de contenedores
Las aplicaciones .NET modernas a menudo se despliegan en contenedores Linux, Azure App Services o funciones AWS Lambda. IronPDF admite la implementación multiplataforma en Windows, Linux y macOS sin necesidad de configuración adicional. La biblioteca funciona en contenedores Docker, por lo que es adecuada para arquitecturas de microservicios y aplicaciones nativas en la nube.
Esta capacidad multiplataforma se extiende a la funcionalidad de encabezado y pie de página: el mismo código que genera archivos PDF con encabezados en una máquina de desarrollo de Windows produce un resultado idéntico cuando se implementa en un servidor de producción Linux. No es necesario instalar fuentes adicionales, configurar motores de renderizado ni manejar rutas de código específicas de la plataforma.
Para equipos que ejecutan cargas de trabajo en contenedores, la documentación de implementación de Docker de IronPDF proporciona orientación de configuración para varias imágenes base y plataformas de orquestación. El comportamiento consistente de la biblioteca en todos los entornos elimina una fuente común de errores en los flujos de trabajo de generación de PDF.
Según la documentación .NET de Microsoft , las aplicaciones .NET en contenedores se benefician de un comportamiento de ejecución consistente en todos los entornos, un principio que el motor de renderizado de IronPDF refuerza para las tareas de generación de PDF. De manera similar, la documentación oficial de Docker explica las mejores prácticas para contenerizar cargas de trabajo .NET que se aplican directamente a los servicios de generación de PDF.
La documentación de iText 7 también confirma el soporte multiplataforma, pero la complejidad adicional de su modelo basado en eventos significa que depurar problemas de renderizado multiplataforma puede ser más complicado que con un enfoque declarativo basado en HTML.
¿Cuales son tus próximos pasos?
Implementar encabezados y pies de página en sus documentos PDF le llevará sólo unos minutos con IronPDF. Instale la biblioteca a través de NuGet Package Manager:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf

Desde aquí, estos recursos te ayudarán a llegar más lejos:
- Documentación de introducción : cubre la gama completa de capacidades de generación y manipulación de PDF
- Guía práctica de encabezados y pies de página : instrucciones paso a paso para todos los escenarios de encabezados y pies de página
- Ejemplo de encabezados y pies de página HTML : ejemplos de código listos para ejecutar para encabezados basados en HTML
- Ejemplo de encabezados y pies de página avanzados : segmentación por página y diferenciación de páginas pares e impares
- Referencia de API de TextHeaderFooter : lista completa de propiedades para encabezados y pies de página basados en texto
- Referencia de API HtmlHeaderFooter : API completa para encabezados y pies de página basados en HTML
- Guía de implementación de Docker -- configuración para contenedores de Linux y entornos en la nube
- Opciones de licencia de IronPDF : planes para desarrolladores individuales y equipos empresariales
Comience su prueba gratuita para probar las implementaciones de encabezado y pie de página en sus propios proyectos. La prueba incluye todas las funciones sin límite de tiempo de funcionalidad, lo que le permite evaluar la biblioteca comparándola con los requisitos de sus documentos PDF del mundo real antes de comprometerse con una licencia.

Añadir encabezados y pies de página a documentos PDF en C# puede ser desde sencillo hasta complejo, según la biblioteca elegida. Mientras que iText 7 ofrece control de bajo nivel mediante controladores de eventos y operaciones de lienzo, IronPDF ofrece la misma funcionalidad mediante una API que aplica conceptos familiares de HTML y CSS. Para los desarrolladores que priorizan una implementación rápida y un código fácil de mantener, IronPDF reduce la implementación de encabezados y pies de página de docenas de líneas (incluyendo clases de controladores, configuraciones de celdas y estructuras de tablas) a solo unas pocas asignaciones de propiedades.
Preguntas Frecuentes
¿Cómo puedo añadir encabezados y pies de página a los PDF con iTextSharp?
Para añadir encabezados y pies de página a los PDF con iTextSharp, puede definir un controlador de eventos de página que personalice las páginas del documento durante el proceso de creación del PDF. Esto implica anular el método OnEndPage para incluir el contenido deseado de encabezado y pie de página.
¿Cuáles son las ventajas de utilizar IronPDF para añadir encabezados y pies de página?
IronPDF simplifica el proceso de añadir encabezados y pies de página, ya que proporciona una API sencilla y admite varias opciones de estilo. Se integra a la perfección con proyectos en C# y ofrece funciones adicionales como la conversión de HTML a PDF, lo que la convierte en una herramienta versátil para la manipulación de PDF.
¿Se pueden utilizar IronPDF e iTextSharp juntos?
Sí, IronPDF e iTextSharp pueden utilizarse juntos en un proyecto C#. Mientras que iTextSharp es excelente para la manipulación programática de PDF, IronPDF lo complementa proporcionando funciones adicionales como la conversión de HTML a PDF, que puede ser útil para generar dinámicamente encabezados y pies de página.
¿Existe alguna forma de dar estilo a los encabezados y pies de página con IronPDF?
IronPDF permite dar estilo a los encabezados y pies de página mediante HTML y CSS. Esto proporciona a los desarrolladores la flexibilidad necesaria para crear diseños y maquetaciones visualmente atractivos para sus documentos PDF.
¿Cómo maneja IronPDF los números de página en encabezados y pies de página?
IronPDF puede insertar automáticamente números de página en encabezados y pies de página. Ofrece opciones para dar formato a los números de página según sus necesidades, como incluir el recuento total de páginas o ajustar el número de página inicial.
¿Cuál es la ventaja de utilizar C# para la manipulación de PDF con IronPDF?
El uso de C# para la manipulación de PDF con IronPDF ofrece una gran seguridad tipográfica, fácil integración con aplicaciones .NET y acceso a una amplia gama de bibliotecas y herramientas que mejoran el proceso de desarrollo. La API de C# de IronPDF está diseñada para ser intuitiva y fácil de usar, lo que la hace accesible a desarrolladores de todos los niveles.
¿Puedo convertir documentos existentes a PDF con IronPDF?
Sí, IronPDF puede convertir en PDF varios formatos de documentos, incluidos HTML, ASPX y otros contenidos basados en web. Esta función es especialmente útil para crear PDF a partir de páginas web o contenidos generados dinámicamente.


