iTextSharp Creando un pie de página Página # de #

Intento crear un pie de página en cada una de las páginas de un documento PDF utilizando iTextSharp en el formato Número de página # después del tutorial en las páginas iText y el libro. Aunque recibo una excepción en cb.SetFontAndSize (helv, 12); – referencia de objeto no establecida en un objeto. ¿Alguien puede ver el problema? El código está abajo.

Gracias, Rob

public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper { protected PdfTemplate total; protected BaseFont helv; private bool settingFont = false; public override void OnOpenDocument(PdfWriter writer, Document document) { total = writer.DirectContent.CreateTemplate(100, 100); total.BoundingBox = new Rectangle(-20, -20, 100, 100); helv = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED); } public override void OnEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.DirectContent; cb.SaveState(); string text = "Page " + writer.PageNumber + " of "; float textBase = document.Bottom - 20; float textSize = 12; //helv.GetWidthPoint(text, 12); cb.BeginText(); cb.SetFontAndSize(helv, 12); if ((writer.PageNumber % 2) == 1) { cb.SetTextMatrix(document.Left, textBase); cb.ShowText(text); cb.EndText(); cb.AddTemplate(total, document.Left + textSize, textBase); } else { float adjust = helv.GetWidthPoint("0", 12); cb.SetTextMatrix(document.Right - textSize - adjust, textBase); cb.ShowText(text); cb.EndText(); cb.AddTemplate(total, document.Right - adjust, textBase); } cb.RestoreState(); } public override void OnCloseDocument(PdfWriter writer, Document document) { total.BeginText(); total.SetFontAndSize(helv, 12); total.SetTextMatrix(0, 0); int pageNumber = writer.PageNumber - 1; total.ShowText(Convert.ToString(pageNumber)); total.EndText(); } } 

Este es un buen ejemplo para agregar el número total de páginas a cada página.

EDITAR : Aquí está el código de ese sitio en caso de que desaparezca:

 using System; using System.Collections.Generic; using System.Text; using iTextSharp.text.pdf; using iTextSharp.text; namespace PDF_Tests { public class TwoColumnHeaderFooter :PdfPageEventHelper { // This is the contentbyte object of the writer PdfContentByte cb; // we will put the final number of pages in a template PdfTemplate template; // 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 Properties private string _Title; public string Title { get { return _Title; } set { _Title = value; } } private string _HeaderLeft; public string HeaderLeft { get { return _HeaderLeft; } set { _HeaderLeft = value; } } private string _HeaderRight; public string HeaderRight { get { return _HeaderRight; } set { _HeaderRight = value; } } private Font _HeaderFont; public Font HeaderFont { get { return _HeaderFont; } set { _HeaderFont = value; } } private Font _FooterFont; public Font FooterFont { get { return _FooterFont; } set { _FooterFont = value; } } #endregion // we override the onOpenDocument method 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; template = cb.CreateTemplate(50, 50); } catch (DocumentException de) { } catch (System.IO.IOException ioe) { } } public override void OnStartPage(PdfWriter writer, Document document) { base.OnStartPage(writer, document); Rectangle pageSize = document.PageSize; if (Title != string.Empty) { cb.BeginText(); cb.SetFontAndSize(bf, 15); cb.SetRGBColorFill(50, 50, 200); cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetTop(40)); cb.ShowText(Title); cb.EndText(); } if (HeaderLeft + HeaderRight != string.Empty) { PdfPTable HeaderTable = new PdfPTable(2); HeaderTable.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE; HeaderTable.TotalWidth = pageSize.Width - 80; HeaderTable.SetWidthPercentage(new float[] { 45, 45 }, pageSize); PdfPCell HeaderLeftCell = new PdfPCell(new Phrase(8, HeaderLeft, HeaderFont)); HeaderLeftCell.Padding = 5; HeaderLeftCell.PaddingBottom = 8; HeaderLeftCell.BorderWidthRight = 0; HeaderTable.AddCell(HeaderLeftCell); PdfPCell HeaderRightCell = new PdfPCell(new Phrase(8, HeaderRight, HeaderFont)); HeaderRightCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT; HeaderRightCell.Padding = 5; HeaderRightCell.PaddingBottom = 8; HeaderRightCell.BorderWidthLeft = 0; HeaderTable.AddCell(HeaderRightCell); cb.SetRGBColorFill(0, 0, 0); HeaderTable.WriteSelectedRows(0, -1, pageSize.GetLeft(40), pageSize.GetTop(50), cb); } } public override void OnEndPage(PdfWriter writer, Document document) { base.OnEndPage(writer, document); int pageN = writer.PageNumber; String text = "Page " + pageN + " of "; float len = bf.GetWidthPoint(text, 8); Rectangle pageSize = document.PageSize; cb.SetRGBColorFill(100, 100, 100); cb.BeginText(); cb.SetFontAndSize(bf, 8); cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30)); cb.ShowText(text); cb.EndText(); cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30)); cb.BeginText(); cb.SetFontAndSize(bf, 8); cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "Printed On " + PrintTime.ToString(), pageSize.GetRight(40), pageSize.GetBottom(30), 0); cb.EndText(); } public override void OnCloseDocument(PdfWriter writer, Document document) { base.OnCloseDocument(writer, document); template.BeginText(); template.SetFontAndSize(bf, 8); template.SetTextMatrix(0, 0); template.ShowText("" + (writer.PageNumber - 1)); template.EndText(); } } } 

Y el código aplicable para adjuntarlo:

 // Our custom Header and Footer is done using Event Handler TwoColumnHeaderFooter PageEventHandler = new TwoColumnHeaderFooter(); PDFWriter.PageEvent = PageEventHandler; // Define the page header PageEventHandler.Title = Title; PageEventHandler.HeaderFont = FontFactory.GetFont(BaseFont.COURIER_BOLD, 10, Font.BOLD); PageEventHandler.HeaderLeft = "Group"; PageEventHandler.HeaderRight = "1"; 

El código anterior es correcto, el único problema es que no se está ejecutando. Para eso debes crear una instancia en el lugar donde has escrito un código para descargar PDf. Ejemplo:

 MyPdfPageEventHelpPageNo pageeventhandler = new MyPdfPageEventHelpPageNo(); writer.PageEvent = pageeventhandler; 

escritor significa escritor PDF (una instancia).

En cada método que anule, puede agregar una llamada a su método base:

 base.OnStartPage(writer, document); base.OnEndPage(writer, document); base.OnCloseDocument(writer, document);