2009-06-23 13 views
20

का एक पाद लेख बनाना # i34ext पृष्ठों और पुस्तक पर ट्यूटोरियल के बाद I # टेक्स्ट प्रारूप में iTextSharp का उपयोग करके पीडीएफ दस्तावेज में प्रत्येक पृष्ठ पर एक पाद लेख बनाने की कोशिश कर रहा हूं। हालांकि मैं cb.SetFontAndSize (हेल्व, 12) पर अपवाद प्राप्त करता रहता हूं; ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट पर सेट नहीं है। क्या कोई इस मुद्दे को देख सकता है? कोड नीचे है।iTextSharp #

धन्यवाद, रोब

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

वास्तव में OnPageEnd से पहले कहा जाता हो रही OnDocumentLoad है? – Lazarus

+0

जब आप कोड के माध्यम से कदम उठाते हैं, तो हेल्व ठीक से परिभाषित किया जाता है? – Geoff

+0

मैं इसमें बहुत गहराई से देख रहा था और स्पष्ट से चूक गया, आप दोनों सही हैं, OnOpenDocument को कॉल नहीं किया जा रहा है इसलिए OnEndPage Helv में कुछ भी नहीं है। मैंने इसे एक मूर्ख गलती पर वापस खोज लिया क्योंकि मैं अपनी मुख्य प्रक्रिया में बहुत देर से पेज इवेंट का निर्माण कर रहा था। आपकी मदद चाप के लिए धन्यवाद। –

उत्तर

31

यहाँ हर पृष्ठ पर कुल पृष्ठ संख्या जोड़ने के लिए एक good example है।

संपादित:

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

और यह संलग्न करने के लिए लागू कोड:: यहाँ है कि साइट से कोड के मामले में यह कभी दूर चला जाता है

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

क्या आप टिप्पणी कर सकते हैं कि आप पेज नंबर से क्यों घटा रहे हैं? मैं ऐसा करता था, लेकिन हाल ही में यह गलत परिणाम दे रहा है और मैंने घटाव हटा दिया है। ITextSharp में कोई बदलाव आया था? –

8

ऊपर कोड सही है, एकमात्र समस्या यह है कि इसे निष्पादित नहीं किया जा रहा है। इसके लिए आपको उस स्थान पर एक उदाहरण बनाना है जहां आपने पीडीएफ डाउनलोड करने के लिए एक कोड लिखा है। उदाहरण:

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

लेखक पीडीएफ लेखक (एक उदाहरण) का अर्थ है।

1

हर विधि आप ओवरराइड में, आप इसके आधार विधि के लिए एक कॉल जोड़ सकते हैं:

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