2009-06-23 17 views
20

Próbuję utworzyć stopkę na każdej ze stron w dokumencie PDF, używając iTextSharp w formacie Strona # z # postępując zgodnie z samouczkiem na stronach iText i książce. Chociaż wciąż otrzymuję wyjątek na cb.SetFontAndSize (helv, 12); - odniesienie do obiektu nie jest ustawione na obiekt. Czy ktoś może zobaczyć problem? Kod znajduje się poniżej.iTextSharp Tworzenie stopki Strona # z #

Dzięki 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

Czy OnDocumentLoad faktycznie uzyskiwanie wywołana przed OnPageEnd? – Lazarus

+0

po przejściu przez kod, czy helv zdefiniowane poprawnie? – Geoff

+0

Szukałem zbyt głęboko w to i brakowało oczywiste, obaj jesteście w porządku, OnOpenDocument nie jest wywoływany, więc w OnEndPage helv jest niczym. Przypomniałem sobie o głupim błędzie, ponieważ zbyt późno konstruowałem wydarzenie na stronie w moim głównym procesie. Dzięki za twoją pomoc, chłopaki. –

Odpowiedz

31

Oto good example dodawania całkowitą liczbę stron na każdej stronie.

EDIT: Oto kod z tej witryny w przypadku kiedykolwiek odchodzi:

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

I dotyczy kodu, aby go dołączyć:

// 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

Czy możesz skomentować, dlaczego odejmujesz jedną z PageNumber? Kiedyś to robiłem, ale ostatnio daje niepoprawne wyniki i usunąłem odejmowanie. Czy nastąpiła zmiana w iTextSharp? –

8

Powyższy kod jest poprawny, jedynym problemem jest to, że nie jest on wykonywany. Do tego trzeba stworzyć instancję w miejscu, w którym napisałeś kod do pobierania PDf. przykład:

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

autor oznacza nagrywarki PDF (instancji).

1

W każdej metodzie można zastąpić, można dodać wywołanie jego metody bazowej:

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