2009-06-23 42 views
20

Estoy tratando de 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 de # siguiendo el 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.iTextSharp Creación de un pie de página Número de página #

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(); 
    } 

} 
+0

Está onDocumentLoad consiguiendo realmente llama antes OnPageEnd? – Lazarus

+0

cuando revisa el código, ¿está helv definido correctamente? – Geoff

+0

Estaba mirando demasiado profundamente y pasé por alto lo obvio, ambos tienen razón, OnOpenDocument no se llama así que en OnEndPage helv no es nada. Lo remonté a un error tonto ya que estaba construyendo el evento de la página demasiado tarde en mi proceso principal. Gracias por su ayuda, chicos. –

Respuesta

31

He aquí una good example para añadir número total de páginas para cada página.

EDITAR: Aquí se presenta el código de ese sitio en caso de que alguna vez desaparece:

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"; 
+0

¿Puedes comentar por qué estás restando uno del número de página? Solía ​​hacer eso, pero últimamente está dando resultados incorrectos y eliminé la resta. ¿Hubo algún cambio en iTextSharp? –

8

El código anterior es correcta, 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 (un ejemplo).

1

En cada método se reemplaza, se puede añadir una llamada a su método de base:

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