Agregue encabezado y pie de página para PDF usando iTextsharp

¿Cómo puedo agregar encabezado y pie de página para cada página en el pdf?

Encabezado contendrá solo un texto El pie de página contendrá un texto y una paginación para el pdf (Página: 1 de 4)

Cómo es esto posible ? Traté de agregar la línea siguiente, pero el encabezado no aparece en pdf.

document.AddHeader("Header", "Header Text"); 

Este es el código que estoy usando para la generación de PDF:

  protected void GeneratePDF_Click(object sender, EventArgs e) { DataTable dt = getData(); Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=Locations.pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Document document = new Document(); PdfWriter.GetInstance(document, Response.OutputStream); document.Open(); iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.COURIER , 8); PdfPTable table = new PdfPTable(dt.Columns.Count); PdfPRow row = null; float[] widths = new float[] { 6f, 6f, 2f, 4f, 2f }; table.SetWidths(widths); table.WidthPercentage = 100; int iCol = 0; string colname = ""; PdfPCell cell = new PdfPCell(new Phrase("Locations")); cell.Colspan = dt.Columns.Count; foreach (DataColumn c in dt.Columns) { table.AddCell(new Phrase(c.ColumnName, font5)); } foreach (DataRow r in dt.Rows) { if (dt.Rows.Count > 0) { table.AddCell(new Phrase(r[0].ToString(), font5)); table.AddCell(new Phrase(r[1].ToString(), font5)); table.AddCell(new Phrase(r[2].ToString(), font5)); table.AddCell(new Phrase(r[3].ToString(), font5)); table.AddCell(new Phrase(r[4].ToString(), font5)); } } document.Add(table); document.Close(); Response.Write(document); Response.End(); } } 

Como ya respondió @Bruno, necesitas usar pageEvents.

Por favor revisa el siguiente código de muestra:

 private void CreatePDF() { string fileName = string.Empty; DateTime fileCreationDatetime = DateTime.Now; fileName = string.Format("{0}.pdf", fileCreationDatetime.ToString(@"yyyyMMdd") + "_" + fileCreationDatetime.ToString(@"HHmmss")); string pdfPath = Server.MapPath(@"~\PDFs\") + fileName; using (FileStream msReport = new FileStream(pdfPath, FileMode.Create)) { //step 1 using (Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 140f, 10f)) { try { // step 2 PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, msReport); pdfWriter.PageEvent = new Common.ITextEvents(); //open the stream pdfDoc.Open(); for (int i = 0; i < 10; i++) { Paragraph para = new Paragraph("Hello world. Checking Header Footer", new Font(Font.FontFamily.HELVETICA, 22)); para.Alignment = Element.ALIGN_CENTER; pdfDoc.Add(para); pdfDoc.NewPage(); } pdfDoc.Close(); } catch (Exception ex) { //handle exception } finally { } } } } 

Y cree un archivo de clase llamado ITextEvents.cs y agregue el siguiente código:

 public class ITextEvents : PdfPageEventHelper { // This is the contentbyte object of the writer PdfContentByte cb; // we will put the final number of pages in a template PdfTemplate headerTemplate, footerTemplate; // this is the BaseFont we are going to use for the header / footer BaseFont bf = null; // This keeps track of the creation time DateTime PrintTime = DateTime.Now; #region Fields private string _header; #endregion #region Properties public string Header { get { return _header; } set { _header = value; } } #endregion public override void OnOpenDocument(PdfWriter writer, Document document) { try { PrintTime = DateTime.Now; bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb = writer.DirectContent; headerTemplate = cb.CreateTemplate(100, 100); footerTemplate = cb.CreateTemplate(50, 50); } catch (DocumentException de) { } catch (System.IO.IOException ioe) { } } public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document) { base.OnEndPage(writer, document); iTextSharp.text.Font baseFontNormal = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLACK); iTextSharp.text.Font baseFontBig = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK); Phrase p1Header = new Phrase("Sample Header Here", baseFontNormal); //Create PdfTable object PdfPTable pdfTab = new PdfPTable(3); //We will have to create separate cells to include image logo and 2 separate strings //Row 1 PdfPCell pdfCell1 = new PdfPCell(); PdfPCell pdfCell2 = new PdfPCell(p1Header); PdfPCell pdfCell3 = new PdfPCell(); String text = "Page " + writer.PageNumber + " of "; //Add paging to header { cb.BeginText(); cb.SetFontAndSize(bf, 12); cb.SetTextMatrix(document.PageSize.GetRight(200), document.PageSize.GetTop(45)); cb.ShowText(text); cb.EndText(); float len = bf.GetWidthPoint(text, 12); //Adds "12" in Page 1 of 12 cb.AddTemplate(headerTemplate, document.PageSize.GetRight(200) + len, document.PageSize.GetTop(45)); } //Add paging to footer { cb.BeginText(); cb.SetFontAndSize(bf, 12); cb.SetTextMatrix(document.PageSize.GetRight(180), document.PageSize.GetBottom(30)); cb.ShowText(text); cb.EndText(); float len = bf.GetWidthPoint(text, 12); cb.AddTemplate(footerTemplate, document.PageSize.GetRight(180) + len, document.PageSize.GetBottom(30)); } //Row 2 PdfPCell pdfCell4 = new PdfPCell(new Phrase("Sub Header Description", baseFontNormal)); //Row 3 PdfPCell pdfCell5 = new PdfPCell(new Phrase("Date:" + PrintTime.ToShortDateString(), baseFontBig)); PdfPCell pdfCell6 = new PdfPCell(); PdfPCell pdfCell7 = new PdfPCell(new Phrase("TIME:" + string.Format("{0:t}", DateTime.Now), baseFontBig)); //set the alignment of all three cells and set border to 0 pdfCell1.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell2.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell3.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell4.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell5.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell6.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell7.HorizontalAlignment = Element.ALIGN_CENTER; pdfCell2.VerticalAlignment = Element.ALIGN_BOTTOM; pdfCell3.VerticalAlignment = Element.ALIGN_MIDDLE; pdfCell4.VerticalAlignment = Element.ALIGN_TOP; pdfCell5.VerticalAlignment = Element.ALIGN_MIDDLE; pdfCell6.VerticalAlignment = Element.ALIGN_MIDDLE; pdfCell7.VerticalAlignment = Element.ALIGN_MIDDLE; pdfCell4.Colspan = 3; pdfCell1.Border = 0; pdfCell2.Border = 0; pdfCell3.Border = 0; pdfCell4.Border = 0; pdfCell5.Border = 0; pdfCell6.Border = 0; pdfCell7.Border = 0; //add all three cells into PdfTable pdfTab.AddCell(pdfCell1); pdfTab.AddCell(pdfCell2); pdfTab.AddCell(pdfCell3); pdfTab.AddCell(pdfCell4); pdfTab.AddCell(pdfCell5); pdfTab.AddCell(pdfCell6); pdfTab.AddCell(pdfCell7); pdfTab.TotalWidth = document.PageSize.Width - 80f; pdfTab.WidthPercentage = 70; //pdfTab.HorizontalAlignment = Element.ALIGN_CENTER; //call WriteSelectedRows of PdfTable. This writes rows from PdfWriter in PdfTable //first param is start row. -1 indicates there is no end row and all the rows to be included to write //Third and fourth param is x and y position to start writing pdfTab.WriteSelectedRows(0, -1, 40, document.PageSize.Height - 30, writer.DirectContent); //set pdfContent value //Move the pointer and draw line to separate header section from rest of page cb.MoveTo(40, document.PageSize.Height - 100); cb.LineTo(document.PageSize.Width - 40, document.PageSize.Height - 100); cb.Stroke(); //Move the pointer and draw line to separate footer section from rest of page cb.MoveTo(40, document.PageSize.GetBottom(50) ); cb.LineTo(document.PageSize.Width - 40, document.PageSize.GetBottom(50)); cb.Stroke(); } public override void OnCloseDocument(PdfWriter writer, Document document) { base.OnCloseDocument(writer, document); headerTemplate.BeginText(); headerTemplate.SetFontAndSize(bf, 12); headerTemplate.SetTextMatrix(0, 0); headerTemplate.ShowText((writer.PageNumber - 1).ToString()); headerTemplate.EndText(); footerTemplate.BeginText(); footerTemplate.SetFontAndSize(bf, 12); footerTemplate.SetTextMatrix(0, 0); footerTemplate.ShowText((writer.PageNumber - 1).ToString()); footerTemplate.EndText(); } } 

¡Espero que ayude!

Ya no hablamos de iTextSharp. Está utilizando iText 5 para .NET. La versión actual es iText 7 para .NET.

Respuesta obsoleta:

AddHeader ha quedado obsoleto hace mucho tiempo y se ha eliminado de iTextSharp. Agregar encabezados y pies de página ahora se hace usando eventos de página . Los ejemplos están en Java, pero puede encontrar el puerto C # de los ejemplos aquí y aquí (desplácese hasta la parte inferior de la página para encontrar enlaces a los archivos .cs ).

Asegúrate de leer la documentación. Un error común que muchos desarrolladores han cometido antes que usted es agregar contenido en OnStartPage . Solo debe agregar contenido en OnEndPage . También es obvio que debe agregar el contenido en coordenadas absolutas (por ejemplo, usando ColumnText ) y que debe reservar suficiente espacio para el encabezado y pie de página definiendo los márgenes de su documento correctamente.

Respuesta actualizada:

Si es nuevo en iText, debe usar iText 7 y usar controladores de eventos para agregar encabezados y pies de página. Consulte el capítulo 3 del iText 7 Jump-Start Tutorial para .NET.

Cuando tiene un documento PdfDocument en iText 7, puede agregar un controlador de eventos:

 PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler()); 

Este es un ejemplo de la forma difícil de agregar texto en una posición absoluta (usando PdfCanvas ):

 protected internal class MyEventHandler : IEventHandler { public virtual void HandleEvent(Event @event) { PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; PdfDocument pdfDoc = docEvent.GetDocument(); PdfPage page = docEvent.GetPage(); int pageNumber = pdfDoc.GetPageNumber(page); Rectangle pageSize = page.GetPageSize(); PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); //Add header pdfCanvas.BeginText() .SetFontAndSize(C03E03_UFO.helvetica, 9) .MoveText(pageSize.GetWidth() / 2 - 60, pageSize.GetTop() - 20) .ShowText("THE TRUTH IS OUT THERE") .MoveText(60, -pageSize.GetTop() + 30) .ShowText(pageNumber.ToString()) .EndText(); pdfCanvas.release(); } } 

Esta es una forma ligeramente superior, utilizando Canvas :

 protected internal class MyEventHandler : IEventHandler { public virtual void HandleEvent(Event @event) { PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; PdfDocument pdfDoc = docEvent.GetDocument(); PdfPage page = docEvent.GetPage(); int pageNumber = pdfDoc.GetPageNumber(page); Rectangle pageSize = page.GetPageSize(); PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); //Add watermark Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize()); canvas.setFontColor(Color.WHITE); canvas.setProperty(Property.FONT_SIZE, 60); canvas.setProperty(Property.FONT, helveticaBold); canvas.showTextAligned(new Paragraph("CONFIDENTIAL"), 298, 421, pdfDoc.getPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); pdfCanvas.release(); } } 

Hay otras maneras de agregar contenido en posiciones absolutas. Se describen en los diferentes libros de iText .

Las respuestas a esta pregunta, si bien son correctas, son muy innecesariamente complicadas. No se necesita mucho código para que el texto aparezca en el encabezado / pie de página. Aquí hay un ejemplo simple de agregar texto al encabezado / pie de página.

La versión actual de iTextSharp funciona implementando una clase de callback que está definida por la interfaz IPdfPageEvent . Por lo que entiendo, no es una buena idea agregar cosas durante el método OnStartPage , así que en su lugar OnEndPage método de la página OnEndPage . Los eventos se desencadenan dependiendo de lo que esté sucediendo con el PdfWriter

Primero, crea una clase que implemente IPdfPageEvent . En el:

  public void OnEndPage(PdfWriter writer, Document document) 

función, obtenga el objeto PdfContentByte llamando

  PdfContentByte cb = writer.DirectContent; 

Ahora puede agregar texto muy fácilmente:

  ColumnText ct = new ColumnText(cb); cb.BeginText(); cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f); //Note, (0,0) in this case is at the bottom of the document cb.SetTextMatrix(document.LeftMargin, document.BottomMargin); cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this")); cb.EndText(); 

Entonces, la función completa de OnEndPage será:

  public void OnEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.DirectContent; ColumnText ct = new ColumnText(cb); cb.BeginText(); cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f); cb.SetTextMatrix(document.LeftMargin, document.BottomMargin); cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this")); cb.EndText(); } 

Esto aparecerá en la parte inferior de su documento. Una última cosa. No olvide asignar el IPdfPageEvent la IPdfPageEvent manera:

  writter.PageEvent = new PDFEvents(); 

Para el objeto PdfWriter PdfWriter

Para el encabezado , es muy similar. Simplemente voltee la coordenada y de SetTextMatrix :

  cb.SetTextMatrix(document.LeftMargin, document.PageSize.Height - document.TopMargin); 

Simplemente agregue esta línea antes de abrir el documento (debe ser anterior):

  document.Header = new HeaderFooter(new Phrase("Header Text"), false); document.Open(); 

Para iTextSharp 4.1.6, la última versión de iTextSharp que fue licenciada como LGPL , la solución proporcionada por Alvaro Patiño es simple y efectiva.

Debido a que la documentación es un poco escasa, me gustaría extender su respuesta con este fragmento de código que puede usarse para cambiar la apariencia del encabezado y el pie de página. Por defecto, tienen un tamaño de letra bastante grande y un borde grueso, que muchas personas querrán cambiar.

 // Parameters passed on to the function that creates the PDF String headerText = "Your header text"; String footerText = "Page"; // Define a font and font-size in points (plus f for float) and pick a color // This one is for both header and footer but you can also create seperate ones Font fontHeaderFooter = FontFactory.GetFont("arial", 8f); fontHeaderFooter.Color = Color.GRAY; // Apply the font to the headerText and create a Phrase with the result Chunk chkHeader = new Chunk(headerText, fontHeaderFooter); Phrase p1 = new Phrase(chkHeader); // create a HeaderFooter element for the header using the Phrase // The boolean turns numbering on or off HeaderFooter header = new HeaderFooter(p1, false); // Remove the border that is set by default header.Border = Rectangle.NO_BORDER; // Align the text: 0 is left, 1 center and 2 right. header.Alignment = 1; // add the header to the document document.Header = header; // The footer is created in an similar way // If you want to use numbering like in this example, add a whitespace to the // text because by default there's no space in between them if (footerText.Substring(footerText.Length - 1) != " ") footerText += " "; Chunk chkFooter = new Chunk(footerText, fontHeaderFooter); Phrase p2 = new Phrase(chkFooter); // Turn on numbering by setting the boolean to true HeaderFooter footer = new HeaderFooter(p2, true); footer.Border = Rectangle.NO_BORDER; footer.Alignment = 1; document.Footer = footer; // Open the Document for writing and continue creating its content document.Open(); 

Para obtener más información, consulte Crear archivos PDF con iTextSharp e iTextSharp – Agregar texto con fragmentos, frases y párrafos . El código fuente en GitHub también puede ser útil.

Códigos fáciles que funcionan con éxito:

 protected void Page_Load(object sender, EventArgs e) { . . using (MemoryStream ms = new MemoryStream()) { . . iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 36, 36, 54, 54); iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms); writer.PageEvent = new HeaderFooter(); doc.Open(); . . // make your document content.. . . doc.Close(); writer.Close(); // output Response.ContentType = "application/pdf;"; Response.AddHeader("Content-Disposition", "attachment; filename=clientfilename.pdf"); byte[] pdf = ms.ToArray(); Response.OutputStream.Write(pdf, 0, pdf.Length); } . . . } class HeaderFooter : PdfPageEventHelper { public override void OnEndPage(PdfWriter writer, Document document) { // Make your table header using PdfPTable and name that tblHeader . . tblHeader.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, page.Top, writer.DirectContent); . . // Make your table footer using PdfPTable and name that tblFooter . . tblFooter.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent); } } 
 using System; using System.Collections.Generic; using System.Linq; using System.Web; using iTextSharp; using iTextSharp.text; using iTextSharp.text.pdf; using DataLayer; namespace DataMngt.MyCode { public class HeaderFooter : PdfPageEventHelper { #region Startup_Stuff private string[] _headerLines; private string _footerLine; private DefineFont _boldFont; private DefineFont _normalFont; private iTextSharp.text.Font fontTxtBold; private iTextSharp.text.Font fontTxtRegular; private int _fontPointSize = 0; private bool hasFooter = false; private bool hasHeader = false; private int _headerWidth = 0; private int _headerHeight = 0; private int _footerWidth = 0; private int _footerHeight = 0; private int _leftMargin = 0; private int _rightMargin = 0; private int _topMargin = 0; private int _bottomMargin = 0; private PageNumbers NumberSettings; private DateTime runTime = DateTime.Now; public enum PageNumbers { None, HeaderPlacement, FooterPlacement } // This is the contentbyte object of the writer PdfContentByte cb; PdfTemplate headerTemplate; PdfTemplate footerTemplate; public string[] headerLines { get { return _headerLines; } set { _headerLines = value; hasHeader = true; } } public string footerLine { get { return _footerLine; } set { _footerLine = value; hasFooter = true; } } public DefineFont boldFont { get { return _boldFont; } set { _boldFont = value; } } public DefineFont normalFont { get { return _normalFont; } set { _normalFont = value; } } public int fontPointSize { get { return _fontPointSize; } set { _fontPointSize = value; } } public int leftMargin { get { return _leftMargin; } set { _leftMargin = value; } } public int rightMargin { get { return _rightMargin; } set { _rightMargin = value; } } public int topMargin { get { return _topMargin; } set { _topMargin = value; } } public int bottomMargin { get { return _bottomMargin; } set { _bottomMargin = value; } } public int headerheight { get { return _headerHeight; } } public int footerHeight { get { return _footerHeight; } } public PageNumbers PageNumberSettings { get { return NumberSettings; } set { NumberSettings = value; } } #endregion #region Write_Headers_Footers public override void OnEndPage(PdfWriter writer, Document document) { if (hasHeader) { // left side is the string array passed in // right side is a built in string array (0 = date, 1 = time, 2(optional) = page) float[] widths = new float[2] { 90f, 10f }; PdfPTable hdrTable = new PdfPTable(2); hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin); hdrTable.WidthPercentage = 95; hdrTable.SetWidths(widths); hdrTable.LockedWidth = true; for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx ++) { string leftLine = (hdrIdx < _headerLines.Length ? _headerLines[hdrIdx] : string.Empty); Paragraph leftPara = new Paragraph(5, leftLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); switch (hdrIdx) { case 0: { leftPara.Font.Size = _fontPointSize; PdfPCell leftCell = new PdfPCell(leftPara); leftCell.HorizontalAlignment = Element.ALIGN_LEFT; leftCell.Border = 0; string rightLine = string.Format(SalesPlanResources.datePara, runTime.ToString(SalesPlanResources.datePrintMask)); Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); rightPara.Font.Size = _fontPointSize; PdfPCell rightCell = new PdfPCell(rightPara); rightCell.HorizontalAlignment = Element.ALIGN_LEFT; rightCell.Border = 0; hdrTable.AddCell(leftCell); hdrTable.AddCell(rightCell); break; } case 1: { leftPara.Font.Size = _fontPointSize; PdfPCell leftCell = new PdfPCell(leftPara); leftCell.HorizontalAlignment = Element.ALIGN_LEFT; leftCell.Border = 0; string rightLine = string.Format(SalesPlanResources.timePara, runTime.ToString(SalesPlanResources.timePrintMask)); Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); rightPara.Font.Size = _fontPointSize; PdfPCell rightCell = new PdfPCell(rightPara); rightCell.HorizontalAlignment = Element.ALIGN_LEFT; rightCell.Border = 0; hdrTable.AddCell(leftCell); hdrTable.AddCell(rightCell); break; } case 2: { leftPara.Font.Size = _fontPointSize; PdfPCell leftCell = new PdfPCell(leftPara); leftCell.HorizontalAlignment = Element.ALIGN_LEFT; leftCell.Border = 0; string rightLine; if (NumberSettings == PageNumbers.HeaderPlacement) { rightLine = string.Concat(SalesPlanResources.pagePara, writer.PageNumber.ToString()); } else { rightLine = string.Empty; } Paragraph rightPara = new Paragraph(5, rightLine, fontTxtRegular); rightPara.Font.Size = _fontPointSize; PdfPCell rightCell = new PdfPCell(rightPara); rightCell.HorizontalAlignment = Element.ALIGN_LEFT; rightCell.Border = 0; hdrTable.AddCell(leftCell); hdrTable.AddCell(rightCell); break; } default: { leftPara.Font.Size = _fontPointSize; PdfPCell leftCell = new PdfPCell(leftPara); leftCell.HorizontalAlignment = Element.ALIGN_LEFT; leftCell.Border = 0; leftCell.Colspan = 2; hdrTable.AddCell(leftCell); break; } } } hdrTable.WriteSelectedRows(0, -1, _leftMargin, document.PageSize.Height - _topMargin, writer.DirectContent); //Move the pointer and draw line to separate header section from rest of page cb.MoveTo(_leftMargin, document.Top + 10); cb.LineTo(document.PageSize.Width - _leftMargin, document.Top + 10); cb.Stroke(); } if (hasFooter) { // footer line is the width of the page so it is centered horizontally PdfPTable ftrTable = new PdfPTable(1); float[] widths = new float[1] {100 }; ftrTable.TotalWidth = document.PageSize.Width - 10; ftrTable.WidthPercentage = 95; ftrTable.SetWidths(widths); string OneLine; if (NumberSettings == PageNumbers.FooterPlacement) { OneLine = string.Concat(_footerLine, writer.PageNumber.ToString()); } else { OneLine = _footerLine; } Paragraph onePara = new Paragraph(0, OneLine, fontTxtRegular); onePara.Font.Size = _fontPointSize; PdfPCell oneCell = new PdfPCell(onePara); oneCell.HorizontalAlignment = Element.ALIGN_CENTER; oneCell.Border = 0; ftrTable.AddCell(oneCell); ftrTable.WriteSelectedRows(0, -1, _leftMargin, (_footerHeight), writer.DirectContent); //Move the pointer and draw line to separate footer section from rest of page cb.MoveTo(_leftMargin, document.PageSize.GetBottom(_footerHeight + 2)); cb.LineTo(document.PageSize.Width - _leftMargin, document.PageSize.GetBottom(_footerHeight + 2)); cb.Stroke(); } } #endregion #region Setup_Headers_Footers_Happens_here public override void OnOpenDocument(PdfWriter writer, Document document) { // create the fonts that are to be used // first the hightlight or Bold font fontTxtBold = FontFactory.GetFont(_boldFont.fontFamily, _boldFont.fontSize, _boldFont.foreColor); if (_boldFont.isBold) { fontTxtBold.SetStyle(Font.BOLD); } if (_boldFont.isItalic) { fontTxtBold.SetStyle(Font.ITALIC); } if (_boldFont.isUnderlined) { fontTxtBold.SetStyle(Font.UNDERLINE); } // next the normal font fontTxtRegular = FontFactory.GetFont(_normalFont.fontFamily, _normalFont.fontSize, _normalFont.foreColor); if (_normalFont.isBold) { fontTxtRegular.SetStyle(Font.BOLD); } if (_normalFont.isItalic) { fontTxtRegular.SetStyle(Font.ITALIC); } if (_normalFont.isUnderlined) { fontTxtRegular.SetStyle(Font.UNDERLINE); } // now build the header and footer templates try { float pageHeight = document.PageSize.Height; float pageWidth = document.PageSize.Width; _headerWidth = (int)pageWidth - ((int)_rightMargin + (int)_leftMargin); _footerWidth = _headerWidth; if (hasHeader) { // i basically dummy build the headers so i can trial fit them and see how much space they take. float[] widths = new float[1] { 90f }; PdfPTable hdrTable = new PdfPTable(1); hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin); hdrTable.WidthPercentage = 95; hdrTable.SetWidths(widths); hdrTable.LockedWidth = true; _headerHeight = 0; for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx++) { Paragraph hdrPara = new Paragraph(5, hdrIdx > _headerLines.Length - 1 ? string.Empty : _headerLines[hdrIdx], (hdrIdx > 0 ? fontTxtRegular : fontTxtBold)); PdfPCell hdrCell = new PdfPCell(hdrPara); hdrCell.HorizontalAlignment = Element.ALIGN_LEFT; hdrCell.Border = 0; hdrTable.AddCell(hdrCell); _headerHeight = _headerHeight + (int)hdrTable.GetRowHeight(hdrIdx); } // iTextSharp underestimates the size of each line so fudge it a little // this gives me 3 extra lines to play with on the spacing _headerHeight = _headerHeight + (_fontPointSize * 3); } if (hasFooter) { _footerHeight = (_fontPointSize * 2); } document.SetMargins(_leftMargin, _rightMargin, (_topMargin + _headerHeight), _footerHeight); cb = writer.DirectContent; if (hasHeader) { headerTemplate = cb.CreateTemplate(_headerWidth, _headerHeight); } if (hasFooter) { footerTemplate = cb.CreateTemplate(_footerWidth, _footerHeight); } } catch (DocumentException de) { } catch (System.IO.IOException ioe) { } } #endregion #region Cleanup_Doc_Processing public override void OnCloseDocument(PdfWriter writer, Document document) { base.OnCloseDocument(writer, document); if (hasHeader) { headerTemplate.BeginText(); headerTemplate.SetTextMatrix(0, 0); if (NumberSettings == PageNumbers.HeaderPlacement) { } headerTemplate.EndText(); } if (hasFooter) { footerTemplate.BeginText(); footerTemplate.SetTextMatrix(0, 0); if (NumberSettings == PageNumbers.FooterPlacement) { } footerTemplate.EndText(); } } #endregion } } using System; using System.Collections.Generic; using System.Linq; using System.Web; using iTextSharp; using iTextSharp.text; using iTextSharp.text.pdf; namespace DataMngt.MyCode { // used to define the fonts passed into the header and footer class public struct DefineFont { public string fontFamily { get; set; } public int fontSize { get; set; } public bool isBold { get; set; } public bool isItalic { get; set; } public bool isUnderlined { get; set; } public BaseColor foreColor { get; set; } } } 

Usar:

  Document pdfDoc = new Document(PageSize.LEGAL.Rotate(), 10, 10, 25, 25); System.IO.MemoryStream mStream = new System.IO.MemoryStream(); PdfWriter writer = PdfWriter.GetInstance(pdfDoc, mStream); MyCode.HeaderFooter headers = new MyCode.HeaderFooter(); writer.PageEvent = headers; 

… Construye la matriz de cadenas para los encabezados …

 DefineFont passFont = new DefineFont(); // always set this to the largest font used headers.fontPointSize = 8; // set up the highlight or bold font passFont.fontFamily = "Helvetica"; passFont.fontSize = 8; passFont.isBold = true; passFont.isItalic = false; passFont.isUnderlined = false; passFont.foreColor = BaseColor.BLACK; headers.boldFont = passFont; // now setup the normal text font passFont.fontSize = 7; passFont.isBold = false; headers.normalFont = passFont; headers.leftMargin = 10; headers.bottomMargin = 25; headers.rightMargin = 10; headers.topMargin = 25; headers.PageNumberSettings = HeaderFooter.PageNumbers.FooterPlacement; headers.footerLine = "Page"; headers.headerLines = parmLines.ToArray(); pdfDoc.SetMargins(headers.leftMargin, headers.rightMargin, headers.topMargin + headers.headerheight, headers.bottomMargin + headers.footerHeight); pdfDoc.Open(); // the new page is necessary due to a bug in in the current version of itextsharp pdfDoc.NewPage(); 

… ahora sus encabezados y pie de página se manejarán automáticamente