2009-06-23 7 views
20

Ich versuche, eine Fußzeile auf jeder der Seiten in einem PDF-Dokument mit iTextSharp im Format Seite # von # nach dem Tutorial auf den iText-Seiten und dem Buch zu erstellen. Obwohl ich immer noch eine Ausnahme auf cb.SetFontAndSize bekomme (helv, 12); - Objektverweis nicht auf ein Objekt gesetzt. Kann jemand das Problem sehen? Code ist unten.iTextSharp Erstellen einer Fußzeilenseite # von #

Danke, 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

Ist OnDocumentLoad vor OnPageEnd genannt tatsächlich bekommen? – Lazarus

+0

Wenn Sie durch den Code gehen, ist helv richtig definiert? – Geoff

+0

Ich schaute zu tief hinein und vermisste das Offensichtliche, Sie haben beide Recht, OnOpenDocument wird nicht aufgerufen, also in OnEndPage helv ist nichts. Ich habe es auf einen dummen Fehler zurückverfolgt, da ich das Seitenereignis in meinem Hauptprozess zu spät erstellt habe. Danke für deine Hilfe. –

Antwort

31

Hier ist eine good example zu jeder Seite Gesamtseitenzahl hinzufügen.

EDIT: Hier ist der Code von dieser Seite, falls es geht immer weg:

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

Und der geltenden Code es anbringt:

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

Können Sie einen Kommentar dazu abgeben, warum Sie einen von der PageNumber subtrahieren? Ich habe das gemacht, aber in letzter Zeit gibt es falsche Ergebnisse und ich habe die Subtraktion entfernt. Gab es eine Änderung in iTextSharp? –

8

Der obige Code korrekt ist, Das einzige Problem ist, dass es nicht ausgeführt wird. Dafür müssen Sie eine Instanz an der Stelle erstellen, an der Sie einen Code zum Herunterladen von PDf geschrieben haben. Beispiel:

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

writer bedeutet PDF Writer (a-Instanz).

1

Sie in jeder Methode überschreiben, können Sie einen Anruf an seiner Basis Methode hinzufügen:

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