iTextSharp Crear un Pie de Página # de #

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 Kommentare

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea