2009-06-23 16 views
20

iTextSharp kullanarak Sayfaların # sayfalarında iText sayfalarında ve kitaptaki öğreticiyi takip ederek PDF belgesindeki sayfaların her birinde altbilgi oluşturmaya çalışıyorum. Yine de cb.SetFontAndSize (helv, 12) üzerinde bir istisna elde tutmak rağmen; - nesne başvurusu bir nesneye ayarlanmamış. Sorunu herkes görebilir mi? Kod aşağıda.iTextSharp Bir Altbilgi Sayfası Oluşturma # #

sayesinde

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

aslında OnPageEnd önce denilen alma OnDocumentLoad mı? – Lazarus

+0

koddan adım attığınızda, helv doğru tanımlanmış mı? – Geoff

+0

Çok derinlere baktım ve açık olanı kaçırdım, ikiniz de haklısınız, OnOpenDocument, OnEndPage'de hiçbir şekilde aranmıyor. Ana etkinliğimde çok geç bir sayfa olayı inşa ettiğimde, onu aptalca bir hataya geri götürdüm. Yardımlarınız için teşekkürler. –

cevap

31

Rob İşte her sayfaya toplam sayfa sayısını eklemek için bir good example bu.

DÜZENLEME:

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

Ve eklemek için geçerli kod: Burada şimdiye kadar uzağa gider durumda o siteden kodudur

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

PageNumber'den neden çıkardığınızı açıklayabilir misiniz? Bunu yapardım, ama son zamanlarda yanlış sonuçlar veriyor ve çıkarma işlemini kaldırdım. ITextSharp'ta bir değişiklik oldu mu? –

8

Yukarıdaki kod doğruysa, Tek sorun, idam edilmiyor. Bunun için, PDf İndirme için bir kod yazdığınız yerde bir örnek oluşturmanız gerekir. Örnek:

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

yazar PDF yazar (bir örneği) anlamına gelir.

geçersiz kılmak her yöntemde
1

, onun temel yöntemi çağrısı ekleyebilirsiniz:

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