Adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
Adicionando cabeçalhos e rodapés a documentos PDF em C
Adicionar cabeçalhos e rodapés a documentos PDF é essencial para criar relatórios, faturas e documentos comerciais profissionais. Desenvolvedores que procuram soluções iTextSharp usando PdfPageEventHelper e o método OnEndPage descobrirão que as bibliotecas modernas do .NET oferecem abordagens significativamente mais simples para alcançar os mesmos resultados.
Este guia demonstra como adicionar cabeçalhos e rodapés em arquivos PDF usando C#, comparando a abordagem tradicional do iText 7 com a API concisa do IronPDF . No final, você compreenderá ambas as implementações -- desde a criação de um novo Document até a geração do arquivo PDF final -- e poderá escolher a abordagem que melhor se adapta aos requisitos do seu projeto.
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 1 - IronPDF
Por que os cabeçalhos e rodapés de PDFs são importantes em documentos profissionais?
Cabeçalhos e rodapés desempenham funções essenciais em documentos PDF profissionais. Eles proporcionam uma identidade visual consistente por meio de logotipos com imagens, permitem a navegação entre páginas com números de página, exibem metadados importantes, como datas e títulos de documentos, e estabelecem a autenticidade do documento por meio de carimbos de data/hora e informações de versão.
Em ambientes corporativos, cabeçalhos e rodapés geralmente têm significado legal. Os relatórios financeiros exigem registros de data e hora para fins de auditoria. Os contratos precisam de numeração de páginas para garantir que estejam completos. Documentos internos podem exigir avisos de confidencialidade em todas as páginas. Para atender a esses requisitos programaticamente, é necessária uma biblioteca PDF que lide de forma confiável com a injeção de conteúdo em nível de página.
Os principais motivos para adicionar cabeçalhos e rodapés programaticamente incluem:
- Conformidade com auditorias -- os registros de data e hora e os números de versão em todas as páginas atendem aos requisitos regulamentares.
- Consistência da marca -- logotipos e estilo da empresa aplicados uniformemente em todos os documentos gerados.
- Navegação -- números de página e títulos de seção ajudam os leitores a localizar informações rapidamente
- Autenticidade -- o nome do autor, a data de criação e o ID do documento evitam disputas sobre a integridade do documento.
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 2 - Recursos
Como adicionar um cabeçalho e rodapé de texto em C#?
O IronPDF oferece a abordagem mais direta para adicionar cabeçalhos e rodapés a documentos PDF em aplicações .NET . Usando a classe ChromePdfRenderer combinada com TextHeaderFooter ou HtmlHeaderFooter, você pode gerar cabeçalhos e rodapés com um mínimo de código -- não há necessidade de criar células separadas ou gerenciar um objeto contentbyte manualmente.
Antes de escrever qualquer código, adicione o IronPDF ao seu projeto usando o NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
A biblioteca não requer dependências externas e funciona imediatamente após a instalação. É compatível com .NET 5, 6, 7, 8 e 10 e funciona em Windows, Linux e macOS sem necessidade de configuração específica da plataforma.
Em padrões mais antigos do iTextSharp, os desenvolvedores criavam métodos auxiliares como private static void AddContent() para injetar manualmente a lógica de cabeçalho e rodapé. O IronPDF elimina completamente a necessidade desse tipo de código repetitivo.
Aqui está um exemplo completo que adiciona um cabeçalho e um rodapé de texto a um arquivo 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")
A classe TextHeaderFooter fornece propriedades para posicionar texto à esquerda, centro ou direita da área de cabeçalho ou rodapé. A propriedade DrawDividerLine adiciona uma linha de separação profissional entre o cabeçalho ou rodapé e o conteúdo principal do documento. Campos mescláveis como {page}, {total-pages} e {date} são preenchidos automaticamente com valores dinâmicos durante a geração de PDF.
O IronPDF calcula as margens automaticamente, garantindo que cabeçalhos e rodapés não se sobreponham ao conteúdo do documento. A class TextHeaderFooter suporta tipos de fonte de IronSoftware.Drawing.FontTypes, dando a você controle sobre a tipografia sem dependências externas.
Saída
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 4 - Saída PDF
Observe como toda a implementação cabe em um único bloco de código com atribuições de propriedades claras e legíveis. Não há necessidade de criar um arquivo de classe separado, calcular posições de pixels ou gerenciar objetos de tela. A biblioteca abstrai essas complexidades, permitindo que você se concentre no conteúdo em vez da mecânica da geração de PDFs.
Como criar cabeçalhos e rodapés com estilo HTML?
Para designs mais sofisticados, a classe HtmlHeaderFooter do IronPDF permite estilização completa em HTML e CSS. Essa abordagem é particularmente valiosa quando os cabeçalhos precisam incluir um logotipo de imagem, layouts complexos ou estilo específico de marca -- sem criar objetos PdfPCell manualmente ou usar construtores 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 exemplo demonstra como os cabeçalhos HTML podem incorporar imagens juntamente com o texto. A propriedade BaseUrl estabelece o caminho raiz para resolver URLs de imagem relativos, facilitando a inclusão de logotipos de empresas ou outros gráficos. A propriedade MaxHeight garante que o cabeçalho não exceda as dimensões especificadas, mantendo layouts de documento consistentes.
Os campos mescláveis ({page}, {total-pages}, {url}, {date}, {time}, {html-title}, {pdf-title}) funcionam da mesma forma em cabeçalhos e rodapés HTML, fornecendo inserção de conteúdo dinâmico sem código adicional. Para obter orientações sobre como implementar vários estilos de cabeçalho, consulte o Guia Prático de Cabeçalhos e Rodapés .
A abordagem HTML se destaca na criação de documentos personalizados com a identidade visual da marca. As equipes de marketing podem fornecer modelos HTML que os desenvolvedores integram diretamente, garantindo a reprodução perfeita dos designs aprovados. Propriedades CSS como font-family, color, background-color e border funcionam conforme esperado, permitindo tratamentos visuais sofisticados que exigiriam código de baixo nível extensivo em outras bibliotecas.
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 3 - Como adicionar cabeçalho e rodapé em PDF - IronPDF
Como adicionar cabeçalhos a documentos PDF existentes?
Uma necessidade comum envolve adicionar cabeçalhos e rodapés a arquivos PDF já existentes — sejam documentos carregados, arquivos mesclados ou PDFs gerados por outros sistemas. O IronPDF lida com esse cenário com os métodos AddHtmlHeaders e 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")
A classe PdfDocument representa um PDF carregado ou renderizado e fornece métodos para modificações pós-renderização. Essa separação entre renderização e modificação possibilita fluxos de trabalho em que documentos PDF passam por múltiplas etapas de processamento. O método AddHtmlHeaders aplica automaticamente o cabeçalho a todas as páginas, embora você também possa direcionar páginas específicas passando uma coleção de índices de página.
Entrada
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 6 - Entrada de amostra
Saída
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 7 - Saída de Cabeçalho de PDF Existente
Essa funcionalidade se mostra extremamente valiosa em sistemas de gerenciamento de documentos que recebem arquivos PDF de diversas fontes, como documentos digitalizados, uploads de usuários ou respostas de APIs de terceiros. O IronPDF padroniza a identidade visual ou a numeração de páginas antes da distribuição ou do arquivamento.
Como adicionar cabeçalhos diferentes em páginas diferentes?
Alguns documentos exigem que a primeira página tenha um cabeçalho diferente (ou nenhum cabeçalho), enquanto as páginas subsequentes utilizam um formato padrão. O IronPDF oferece suporte a isso através da aplicação de cabeçalhos baseados em índice de página -- não há necessidade de verificar condições dentro de manipuladores void OnEndPage ou gerenciar contadores de loop 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")
O segundo parâmetro em AddHtmlHeaders especifica o número da página inicial para o campo mesclável {page}, enquanto o terceiro parâmetro aceita uma coleção de índices de página para receber o cabeçalho. Esse controle granular permite layouts de documentos complexos sem lógica condicional intrincada. O exemplo de Cabeçalhos e Rodapés Avançados abrange cenários adicionais, incluindo a diferenciação entre páginas pares e ímpares.
Saída
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 9 - Diferentes cabeçalhos para diferentes páginas Saída
Como implementar conteúdo dinâmico além da numeração de páginas?
O sistema de campos mescláveis suporta diversos valores dinâmicos que são preenchidos automaticamente durante a renderização. A tabela a seguir lista todos os campos disponíveis e seus significados:
| Campo | Valor inserido | Uso típico |
|---|---|---|
| `{page}` | Número da página atual | Rodapés exibindo "Página 3" |
| `{total-pages}` | Número total de páginas | Rodapés exibindo "Página 3 de 10" |
| `{date}` | Data atual no formato local | Registros de data e hora da auditoria, datas dos relatórios |
| `{time}` | Hora atual no formato local | Rodapés de conformidade regulamentar |
| `{html-title}` | Conteúdo da tag HTML ` |
Cabeçalhos de documento mostrando o título da página |
| `{pdf-title}` | título dos metadados do documento PDF | Rodapés personalizados com o nome do documento |
| `{url}` | URL de origem ao renderizar a partir de um endereço web | Rodapés de arquivo para conteúdo da web |
Para conteúdo verdadeiramente dinâmico -- valores determinados em tempo de execução -- você pode construir a string do fragmento HTML com valores interpolados antes de atribuí-la à propriedade HtmlFragment. Essa abordagem permite cabeçalhos que incluem valores recuperados do banco de dados, informações do usuário ou dados 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")
Observe que os tokens {page} e {total-pages} são deixados como strings simples dentro da concatenação de strings em C# -- não dentro da parte interpolada. Durante a renderização do PDF, o IronPDF substitui esses tokens automaticamente. Esse padrão funciona para qualquer valor em tempo de execução: nomes de usuário do Active Directory, IDs de documentos de um banco de dados, strings de versão do seu pipeline de compilação ou totais calculados do seu mecanismo de relatórios.
A combinação de campos mescláveis e interpolação de strings possibilita designs de rodapé sofisticados, comuns em documentos comerciais. Os departamentos jurídicos geralmente exigem rodapés que mostrem o título do documento, a data e o número de páginas. Os relatórios financeiros podem precisar de registros de data e hora para fins de conformidade regulatória. Esses requisitos são atendidos sem a necessidade de código personalizado para cada tipo de documento.
Como é a abordagem do iText 7?
Os desenvolvedores familiarizados com o iText 7 (o sucessor do iTextSharp) sabem que adicionar cabeçalhos e rodapés requer a implementação de manipuladores de eventos. A biblioteca usa um sistema de eventos de página onde você cria uma classe que responde a eventos do ciclo de vida do documento como OnEndPage e OnCloseDocument.
Aqui está como a mesma implementação de cabeçalho e rodapé parece com o iText 7, usando o padrão 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 implementação demonstra a diferença arquitetônica fundamental entre as duas bibliotecas. O iText 7 requer criar uma classe de manipulador separada que implementa IEventHandler (semelhante ao legado PdfPageEventHelper), calculando manualmente posições de página usando coordenadas flutuantes e gerenciando os objetos PdfCanvas e Canvas para operações de desenho. O manipulador recebe eventos para cada página através do tipo de evento END_PAGE -- um detalhe que confunde muitos desenvolvedores que usam erroneamente START_PAGE.
Saída
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 8 - Como adicionar cabeçalho e rodapé em PDF usando iTextSharp em C# com exemplo
O sistema de coordenadas no iText 7 tem origem no canto inferior esquerdo da página, exigindo cálculos explícitos para o posicionamento. Obter o número final de páginas exige complexidade adicional com padrões PdfTemplate que são preenchidos durante OnCloseDocument -- um padrão que adiciona mais código boilerplate a um fluxo de trabalho já envolvido.
Para desenvolvedores com experiência em desenvolvimento web, essa abordagem baseada em coordenadas parece estranha em comparação com o modelo declarativo HTML/CSS. Cada decisão de posicionamento exige a compreensão das dimensões da página, das margens e do tamanho do texto — aspectos que são abstraídos em abordagens baseadas em HTML.
O iText 7 também opera sob a licença AGPL, o que significa que os aplicativos que usam o iTextSharp ou o iText 7 devem ser de código aberto, a menos que uma licença comercial seja adquirida. Essa é uma consideração importante na hora de escolher entre bibliotecas para projetos comerciais.
Como se comparam as duas abordagens?
As diferenças ficam mais claras quando se comparam as funcionalidades específicas. A tabela a seguir resume as principais distinções:
| Recurso | IronPDF | iText 7 / iTextSharp |
|---|---|---|
| Estilo de implementação | Atribuição de propriedade nas opções de renderização | Classe de manipulador de eventos que implementa IEventHandler |
| Suporte a HTML/CSS | HTML e CSS completos via HtmlHeaderFooter | Sem suporte nativo a HTML; requer desenho em canvas de baixo nível. |
| Total de páginas | Automático através do campo `{total-pages}` | Requer que o PdfTemplate seja preenchido em OnCloseDocument. |
| Imagem no cabeçalho | Tag HTML padrão ` |
Requer objeto de imagem e posicionamento manual. |
| Adicionar a um PDF existente | Métodos AddHtmlHeaders / AddHtmlFooters | Requer reprocessamento por meio de carimbo ou loop de eventos |
| Segmentação por página | Lista de índices de páginas passada para o método | Lógica condicional dentro do manipulador de eventos |
| Modelo de licença | Comercial com período de teste gratuito | AGPL (código aberto) ou comercial |
| Multiplataforma | Windows, Linux, macOS; compatível com Docker | Windows, Linux, macOS |
A experiência de desenvolvimento também difere significativamente na resolução de problemas. A abordagem do IronPDF, baseada em HTML, permite que você visualize o design do cabeçalho em um navegador antes de integrá-lo ao código de geração de PDF. Se algo parecer errado, você pode ajustar o HTML e o CSS usando as ferramentas de desenvolvedor do navegador, que você já conhece. Com o iText 7, a depuração de problemas de posicionamento exige a geração repetida de PDFs de teste e a medição manual das coordenadas.
A abordagem baseada em HTML significa que você pode aplicar diretamente suas habilidades existentes em desenvolvimento web. Qualquer layout possível com HTML e CSS funciona nos cabeçalhos e rodapés do IronPDF , desde arranjos flexbox até grades de imagens. O exemplo de cabeçalhos e rodapés HTML demonstra possibilidades adicionais de estilização.
Personalizando a aparência do cabeçalho e rodapé
O ajuste fino de cabeçalhos e rodapés envolve diversas propriedades que afetam o posicionamento e a apresentação visual. A classe TextHeaderFooter fornece essas opções de personalização:
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")
A propriedade Font aceita valores de IronSoftware.Drawing.FontTypes, incluindo Helvetica, Arial, Courier e Times New Roman. A propriedade DrawDividerLine adiciona uma regra horizontal profissional entre o rodapé e o conteúdo principal. Você pode personalizar a cor da linha usando DrawDividerLineColor para corresponder às cores da sua marca ou ao tema do documento.
Para cabeçalhos e rodapés baseados em HTML, a propriedade LoadStylesAndCSSFromMainHtmlDocument opcionalmente herda estilos do documento principal que está sendo renderizado, garantindo consistência visual entre cabeçalhos e conteúdo do corpo. Isso é particularmente útil quando o documento principal usa CSS personalizado que também deve ser aplicado às regiões do cabeçalho e do rodapé.
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 5 - Compatibilidade entre plataformas
Implantações multiplataforma e em contêineres
Aplicações .NET modernas frequentemente são implantadas em contêineres Linux, no Azure App Services ou em funções AWS Lambda. O IronPDF suporta a implementação multiplataforma em Windows, Linux e macOS sem necessidade de configuração adicional. A biblioteca funciona imediatamente em contêineres Docker, tornando-a adequada para arquiteturas de microsserviços e aplicações nativas da nuvem.
Essa capacidade multiplataforma se estende à funcionalidade de cabeçalho e rodapé — o mesmo código que gera PDFs com cabeçalhos em uma máquina de desenvolvimento Windows produz resultados idênticos quando implantado em um servidor de produção Linux. Não é necessário instalar fontes adicionais, configurar mecanismos de renderização ou lidar com caminhos de código específicos da plataforma.
Para equipes executando cargas de trabalho conteinerizadas, a documentação de implementação do IronPDF no Docker fornece orientação de configuração para várias imagens base e plataformas de orquestração. O comportamento consistente da biblioteca em diferentes ambientes elimina uma fonte comum de erros nos fluxos de trabalho de geração de PDFs.
De acordo com a documentação do .NET da Microsoft , os aplicativos .NET em contêineres se beneficiam de um comportamento de tempo de execução consistente em diferentes ambientes — um princípio que o mecanismo de renderização do IronPDF reforça para tarefas de geração de PDF. Da mesma forma, a documentação oficial do Docker explica as melhores práticas para conteinerizar cargas de trabalho .NET , que se aplicam diretamente aos serviços de geração de PDF.
A documentação do iText 7 também confirma o suporte multiplataforma, mas a complexidade adicional do seu modelo orientado a eventos significa que a depuração de problemas de renderização multiplataforma pode ser mais trabalhosa do que com uma abordagem declarativa baseada em HTML.
Quais são os seus próximos passos?
Com o IronPDF, adicionar cabeçalhos e rodapés aos seus documentos PDF leva apenas alguns minutos. Instale a biblioteca através do Gerenciador de Pacotes NuGet :
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 10 - Instalação
A partir daqui, estes recursos irão ajudá-lo a ir mais longe:
- Documentação de Introdução -- abrange toda a gama de recursos de geração e manipulação de PDFs Guia prático de cabeçalhos e rodapés -- instruções passo a passo para todos os cenários de cabeçalho e rodapé
- Exemplo de cabeçalhos e rodapés HTML -- exemplos de código prontos para uso para cabeçalhos baseados em HTML Exemplo avançado de cabeçalhos e rodapés : segmentação por página e diferenciação entre páginas pares e ímpares.
- Referência da API TextHeaderFooter -- lista completa de propriedades para cabeçalhos e rodapés baseados em texto
- Referência da API HtmlHeaderFooter -- API completa para cabeçalhos e rodapés baseados em HTML
- Guia de implantação do Docker – configuração para contêineres Linux e ambientes em nuvem
- Opções de licenciamento do IronPDF -- planos para desenvolvedores individuais até equipes corporativas
Inicie seu teste gratuito para experimentar as implementações de cabeçalho e rodapé em seus próprios projetos. A versão de avaliação inclui todos os recursos, sem limite de tempo para uso, permitindo que você avalie a biblioteca em relação às suas necessidades reais de documentos PDF antes de adquirir uma licença.
Como adicionar cabeçalho e rodapé em PDF usando iTextSharp e IronPDF em C# com exemplo: Imagem 11 - Licenciamento
Adicionar cabeçalhos e rodapés a documentos PDF em C# varia de simples a complexo, dependendo da biblioteca escolhida. Enquanto o iText 7 oferece controle de baixo nível por meio de manipuladores de eventos e operações de canvas, o IronPDF fornece a mesma funcionalidade por meio de uma API que aplica conceitos familiares de HTML e CSS. Para desenvolvedores que priorizam implementação rápida e código de fácil manutenção, o IronPDF reduz a implementação de cabeçalhos e rodapés de dezenas de linhas de código — incluindo classes de manipuladores, configurações de células e estruturas de tabelas — para apenas algumas atribuições de propriedades.
Perguntas frequentes
Como posso adicionar cabeçalhos e rodapés a PDFs usando o iTextSharp?
Para adicionar cabeçalhos e rodapés a PDFs usando o iTextSharp, você pode definir um manipulador de eventos de página que personaliza as páginas do documento durante o processo de criação do PDF. Isso envolve sobrescrever o método OnEndPage para incluir o conteúdo de cabeçalho e rodapé desejado.
Quais são os benefícios de usar o IronPDF para adicionar cabeçalhos e rodapés?
O IronPDF simplifica o processo de adição de cabeçalhos e rodapés, fornecendo uma API intuitiva e suportando diversas opções de estilo. Ele se integra perfeitamente a projetos C# e oferece recursos adicionais, como a conversão de HTML para PDF, tornando-se uma ferramenta versátil para manipulação de PDFs.
O IronPDF e o iTextSharp podem ser usados em conjunto?
Sim, o IronPDF e o iTextSharp podem ser usados juntos em um projeto C#. Embora o iTextSharp seja ótimo para manipulação programática de PDFs, o IronPDF o complementa, fornecendo recursos adicionais, como a conversão de HTML para PDF, o que pode ser útil para gerar cabeçalhos e rodapés dinamicamente.
Existe alguma maneira de estilizar cabeçalhos e rodapés usando o IronPDF?
O IronPDF permite estilizar cabeçalhos e rodapés usando HTML e CSS. Isso oferece aos desenvolvedores a flexibilidade de criar designs e layouts visualmente atraentes para seus documentos PDF.
Como o IronPDF lida com a numeração de páginas em cabeçalhos e rodapés?
O IronPDF pode inserir automaticamente números de página em cabeçalhos e rodapés. Ele oferece opções para formatar os números de página de acordo com suas necessidades, como incluir a contagem total de páginas ou ajustar o número da página inicial.
Qual a vantagem de usar C# para manipulação de PDFs com o IronPDF?
Utilizar C# para manipulação de PDFs com o IronPDF oferece forte segurança de tipos, fácil integração com aplicações .NET e acesso a uma ampla gama de bibliotecas e ferramentas que aprimoram o processo de desenvolvimento. A API C# do IronPDF foi projetada para ser intuitiva e fácil de usar, tornando-a acessível a desenvolvedores de todos os níveis de habilidade.
Posso converter documentos existentes para PDF usando o IronPDF?
Sim, o IronPDF pode converter vários formatos de documentos, incluindo HTML, ASPX e outros conteúdos da web, em PDF. Esse recurso é particularmente útil para criar PDFs a partir de páginas da web ou conteúdo gerado dinamicamente.


