Estoy tratando de crear un pie de página en cada una de las páginas en un documento PDF utilizando iTextSharp en el formato de Página # de # siguiendo el tutorial de la iText páginas y el libro. Aunque sigo recibiendo una excepción en cb.SetFontAndSize(helv, 12); – referencia a objeto no establecida a un objeto. ¿Puede alguien ver el problema? El código es el siguiente.

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();
}
}
  • Es OnDocumentLoad consiguiendo realmente llama antes de OnPageEnd?
  • cuando el paso a través del código, es helv definido correctamente?
  • Yo estaba mirando demasiado profundo en él y se perdió la obvia, que los dos están a la derecha, OnOpenDocument no es llegar llamado así en OnEndPage helv no es nada. Volvamos de nuevo a un tonto error que yo estaba construyendo la página de sucesos demasiado tarde en mi proceso principal. Gracias por su ayuda muchachos.
InformationsquelleAutor | 2009-06-23

3 Comentarios

  1. 35

    Aquí un buen ejemplo para agregar el total de número de página para cada página.

    EDITAR: Aquí está el código del sitio en caso de que nunca 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 a adjuntar:

    //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";
    • Puede usted comentar sobre por qué estás restando una de las PageNumber? Yo solía hacer eso, pero últimamente se está dando resultados incorrectos y me he quitado la resta. Ha habido un cambio en iTextSharp?
  2. 8

    El código anterior es correcto, el único problema es que no está siendo ejecutado. Para que u tiene que crear una instancia en el lugar donde usted ha escrito un código para la Descarga de PDf.
    Ejemplo:

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

    medios del escritor PDF writer(un ejemplo).

  3. 1

    En cada método se reemplaza, puede agregar una llamada a su método base:

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

Dejar respuesta

Please enter your comment!
Please enter your name here