using System; using System.Collections.Generic; using System.Text; using iTextSharp.text; using iTextSharp.text.pdf; using Volian.Svg.Library; namespace Volian.Print.Library { public class PageCount { private bool _CanIncrement = true; public bool CanIncrement { get { return _CanIncrement; } set { _CanIncrement = value; } } private int Increment() { if (CanIncrement) Total++; CanIncrement = false; return Total; } private int _Total; public int Total { get { return _Total; } set { _Total = value; } } private string _FinalPageMessage; public string FinalPageMessage { get { return _FinalPageMessage; } set { _FinalPageMessage = value; } } private PageCountTemplates _MyTemplates; // (for each page that has this key) internal PageCountTemplates MyTemplates { get { if (_MyTemplates == null) _MyTemplates = new PageCountTemplates(); return _MyTemplates; } set { _MyTemplates = value; } } public void DrawTemplates() { int cnt = 0; foreach (PageCountTemplate pct in MyTemplates) { cnt++; string fstr = pct.Text.Replace("{OF}", _Total.ToString()); if (pct.Text.Contains("{TOCPAGE}")) { fstr = pct.Text.Replace("{TOCPAGE}", _Total.ToString()); } if (fstr.Contains("{FINALPAGE}")) { fstr = fstr.Replace("{FINALPAGE}", (cnt == MyTemplates.Count) ? FinalPageMessage : ""); } // use font from pct string fontFace = pct.MyFont.Name; int fontStyle = (pct.MyFont.Bold ? iTextSharp.text.Font.BOLD : 0) + (pct.MyFont.Italic ? iTextSharp.text.Font.ITALIC : 0); Font itextFont = Volian.Svg.Library.Svg.GetFont(fontFace, pct.MyFont.Size, fontStyle, pct.MyColor); ColumnText columnText = new ColumnText(pct.MyTemplate); float textSize = itextFont.BaseFont.GetWidthPoint(fstr, pct.MyFont.Size); float flly = itextFont.BaseFont.GetDescentPoint("g", pct.MyFont.Size); float lead = columnText.Leading; columnText.Alignment = pct.Alignment; Chunk chk = new Chunk(fstr, itextFont); float width = chk.GetWidthPoint(); // justification: float left = 0; float right = width * 1.01F; switch (pct.Alignment) { case Element.ALIGN_CENTER: left = -.5F * width; right = .51F * width; break; case Element.ALIGN_RIGHT: left = -1.01F * width; right = 0; break; } pct.MyTemplate.BoundingBox = new Rectangle(left, 2 * flly, right, columnText.Leading); //2*flly account for descenders columnText.SetSimpleColumn(left, 0, right, columnText.Leading); columnText.SetText(new Phrase(chk)); columnText.Go(); } } public PdfTemplate AddToTemplateList(PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color) { Increment(); PageCountTemplate retTemplate = new PageCountTemplate(pdfWriter, text.Replace("{PAGE}",Total.ToString()), myFont, alignment, color); MyTemplates.Add(retTemplate); return retTemplate.MyTemplate; } } public class PageCounts : Dictionary { public bool CanIncrement { set { foreach (PageCount pc in this.Values) { pc.CanIncrement = value; } } } public PdfTemplate AddToTemplateList(string key, PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color) { if (!this.ContainsKey(key)) { this.Add(key, new PageCount()); if (key.StartsWith("TOC")) this[key].CanIncrement = false; } return (this[key].AddToTemplateList(pdfWriter, text, myFont, alignment,color)); } public PdfTemplate AddToTemplateList(string key, PdfWriter pdfWriter, string text, string finalPageMessage, System.Drawing.Font myFont, int alignment, System.Drawing.Color color) { if (!this.ContainsKey(key)) this.Add(key, new PageCount()); this[key].FinalPageMessage = finalPageMessage; return (this[key].AddToTemplateList(pdfWriter, text, myFont, alignment, color)); } public void DrawTemplates() { foreach (PageCount pc in this.Values) { pc.DrawTemplates(); } } } public class PageCountTemplate { private string _Text; public string Text // "Page 1 of {OF}" { get { return _Text; } set { _Text = value; } } private System.Drawing.Font _MyFont; public System.Drawing.Font MyFont { get { return _MyFont; } set { _MyFont = value; } } private int _Alignment; // iTextSharp Element. public int Alignment { get { return _Alignment; } set { _Alignment = value; } } private System.Drawing.Color _MyColor; public System.Drawing.Color MyColor { get { return _MyColor; } set { _MyColor = value; } } private PdfTemplate _MyTemplate; public PdfTemplate MyTemplate { get { return _MyTemplate; } set { _MyTemplate = value; } } public PageCountTemplate(PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color) { // Create Template can be called with a small, i.e. 1, width/height because when // it is actually drawn, the bounding box overrides the CreateTemplate values. _MyTemplate = pdfWriter.DirectContent.CreateTemplate(1, 1); _Text = text; _MyFont = myFont; _MyColor = color; _Alignment = alignment; } } public class PageCountTemplates : List { } }