188 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<string, PageCount>
 | |
| 	{
 | |
| 		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.<XYZ>
 | |
| 		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<PageCountTemplate>
 | |
| 	{
 | |
| 	}
 | |
| }
 |