1168 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1168 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections;
 | 
						|
using System.Text;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Xml.Serialization;
 | 
						|
using iTextSharp.text;
 | 
						|
using iTextSharp.text.pdf;
 | 
						|
using iTextSharp.text.factories;
 | 
						|
using Itenso.Rtf;
 | 
						|
using Itenso.Rtf.Parser;
 | 
						|
using Itenso.Rtf.Interpreter;
 | 
						|
using Itenso.Rtf.Support;
 | 
						|
using Microsoft.Win32;
 | 
						|
using System.Text.RegularExpressions;
 | 
						|
using System.Xml;
 | 
						|
using System.IO;
 | 
						|
 | 
						|
namespace Volian.Svg.Library
 | 
						|
{
 | 
						|
	public static class VolianPdf
 | 
						|
	{
 | 
						|
		public static int PageCount(string fileName)
 | 
						|
		{
 | 
						|
			PdfReader pdfr = new PdfReader(fileName);
 | 
						|
			int retval = pdfr.NumberOfPages;
 | 
						|
			pdfr.Close();
 | 
						|
			return retval;
 | 
						|
		}
 | 
						|
		public static void RegisterFont(string fontName)
 | 
						|
		{
 | 
						|
			if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
 | 
						|
			{
 | 
						|
				//foreach (string name in FontKey.GetValueNames())
 | 
						|
				//{
 | 
						|
				//    if (name.StartsWith(fontName))
 | 
						|
				//    {
 | 
						|
				//        string fontFile = (string)FontKey.GetValue(name);
 | 
						|
				//        iTextSharp.text.FontFactory.Register(fontFile.Contains("\\") ? fontFile : FontFolder + "\\" + fontFile);
 | 
						|
				//    }
 | 
						|
				//}
 | 
						|
				iTextSharp.text.FontFactory.RegisterDirectories();
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private static RegistryKey _FontKey = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows NT").OpenSubKey("CurrentVersion").OpenSubKey("Fonts");
 | 
						|
		public static RegistryKey FontKey
 | 
						|
		{ get { return _FontKey; } }
 | 
						|
		private static string _FontFolder = (String)Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows").OpenSubKey("CurrentVersion").OpenSubKey("Explorer").OpenSubKey("Shell Folders").GetValue("Fonts");
 | 
						|
		public static string FontFolder
 | 
						|
		{ get { return _FontFolder; } }
 | 
						|
		public static iTextSharp.text.Font GetFont(string fontName, int size, int style)
 | 
						|
		{
 | 
						|
			RegisterFont(fontName);
 | 
						|
			return iTextSharp.text.FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size / 2, style);
 | 
						|
		}
 | 
						|
		public static iTextSharp.text.Font GetFont(System.Drawing.Font font) // fontName, int size, int style)
 | 
						|
		{
 | 
						|
			RegisterFont(font.Name);
 | 
						|
			int style = (font.Bold ? iTextSharp.text.Font.BOLD : 0) + (font.Italic ? iTextSharp.text.Font.ITALIC : 0);
 | 
						|
			return iTextSharp.text.FontFactory.GetFont(font.Name, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, font.Size, style);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	internal static class SvgITextLibrary
 | 
						|
	{
 | 
						|
		public static void StrokeAndFill(PdfContentByte cb, bool stroke, bool fill)
 | 
						|
		{
 | 
						|
			switch ((stroke ? 1 : 0) + (fill ? 2 : 0))
 | 
						|
			{
 | 
						|
				case 0: // No Stroke or Fill
 | 
						|
					break;
 | 
						|
				case 1: // Stroke
 | 
						|
					cb.Stroke();
 | 
						|
					break;
 | 
						|
				case 2: // Fill
 | 
						|
					cb.Fill();
 | 
						|
					break;
 | 
						|
				case 3: // Stroke and Fill
 | 
						|
					cb.FillStroke();
 | 
						|
					break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public abstract partial class SvgPart
 | 
						|
	{
 | 
						|
		public abstract void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent);
 | 
						|
		public abstract void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent);
 | 
						|
	}
 | 
						|
	public partial class SvgPartInheritance : SvgPart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
		}
 | 
						|
	}
 | 
						|
	// TODO: Pages
 | 
						|
	// TODO: Page Background 
 | 
						|
	public delegate string SvgProcessTextEvent(object sender, SvgProcessTextArgs args);
 | 
						|
	public class SvgProcessTextArgs
 | 
						|
	{
 | 
						|
		private string _MyText;
 | 
						|
		public string MyText
 | 
						|
		{
 | 
						|
			get { return _MyText; }
 | 
						|
		}
 | 
						|
		private SvgText _MySvgText;
 | 
						|
		public SvgText MySvgText
 | 
						|
		{
 | 
						|
			get { return _MySvgText; }
 | 
						|
			set { _MySvgText = value; }
 | 
						|
		}
 | 
						|
		private SvgScale _MySvgScale;
 | 
						|
		public SvgScale MySvgScale
 | 
						|
		{
 | 
						|
			get { return _MySvgScale; }
 | 
						|
			set { _MySvgScale = value; }
 | 
						|
		}
 | 
						|
		public SvgProcessTextArgs(string myText, SvgText mySvgText, SvgScale mySvgScale)
 | 
						|
		{
 | 
						|
			_MyText = myText;
 | 
						|
			_MySvgText = mySvgText;
 | 
						|
			_MySvgScale = mySvgScale;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class Svg : SvgGroup
 | 
						|
	{
 | 
						|
		public void DrawMacro(string macroDef, float x, float y, PdfContentByte cb)
 | 
						|
		{
 | 
						|
			_MyContentByte = cb;
 | 
						|
			SvgMeasurement X = new SvgMeasurement(x, E_MeasurementUnits.PT);
 | 
						|
			SvgMeasurement Y = new SvgMeasurement(Height.GetSizeInPoints(72) - y, E_MeasurementUnits.PT);
 | 
						|
			if (!this.LookUp.ContainsKey(macroDef)) return;   // AEP - DU1 (missing C22 macro for AEP)
 | 
						|
			SvgGroup macro = this[macroDef] as SvgGroup;
 | 
						|
			macro.SvgParts.Draw(cb, MyScale.AdjustOrigin(X, Y), this,this);
 | 
						|
		}
 | 
						|
		public event SvgProcessTextEvent ProcessText;
 | 
						|
		internal string OnProcessText(string myText, SvgText mySvgText, SvgScale scale)
 | 
						|
		{
 | 
						|
			if (ProcessText != null)
 | 
						|
				return ProcessText(this, new SvgProcessTextArgs(myText, mySvgText, scale));
 | 
						|
			return myText;
 | 
						|
		}
 | 
						|
		private Dictionary<string, PdfTemplate> _Templates;
 | 
						|
		public PdfTemplate GetTemplate(string name, PdfContentByte cb)
 | 
						|
		{
 | 
						|
			if (!_Templates.ContainsKey(name))
 | 
						|
			{
 | 
						|
				PdfTemplate tmp = cb.CreateTemplate(100, 100);
 | 
						|
				_Templates.Add(name, tmp);
 | 
						|
			}
 | 
						|
			return _Templates[name];
 | 
						|
		}
 | 
						|
		public static void FixBoundingBox(PdfTemplate tmp, float xll, float yll, float xul, float yul)
 | 
						|
		{
 | 
						|
			float left = tmp.BoundingBox.Left;
 | 
						|
			float bottom = tmp.BoundingBox.Bottom;
 | 
						|
			float right = tmp.BoundingBox.Right;
 | 
						|
			float top = tmp.BoundingBox.Top;
 | 
						|
			left = (xll < xul ? (xll < left ? xll : left) : (xul < left ? xul : left));
 | 
						|
			right = (xll > xul ? (xll > right ? xll : right) : (xul > right ? xul : right));
 | 
						|
			bottom = (yll < yul ? (yll < bottom ? yll : bottom) : (yul < bottom ? yul : bottom));
 | 
						|
			top = (yll > yul ? (yll > top ? yll : top) : (yul > top ? yul : top));
 | 
						|
			tmp.BoundingBox = new iTextSharp.text.Rectangle(xll, yll, xul, yul);
 | 
						|
		}
 | 
						|
		private PdfContentByte _MyContentByte;
 | 
						|
		[XmlIgnore]
 | 
						|
		public PdfContentByte MyContentByte
 | 
						|
		{
 | 
						|
			get { return _MyContentByte; }
 | 
						|
			set { _MyContentByte = value; }
 | 
						|
		}
 | 
						|
		private float _LeftMargin = 0;
 | 
						|
		public float LeftMargin
 | 
						|
		{
 | 
						|
			get { return _LeftMargin; }
 | 
						|
			set { _LeftMargin = value; }
 | 
						|
		}
 | 
						|
		private float _TopMargin = 0;
 | 
						|
		public float TopMargin
 | 
						|
		{
 | 
						|
			get { return _TopMargin; }
 | 
						|
			set { _TopMargin = value; }
 | 
						|
		}
 | 
						|
		private SvgScale _MyScale;
 | 
						|
		public SvgScale MyScale
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				if (_MyScale == null)
 | 
						|
				{
 | 
						|
					_MyScale = new SvgScale(72, new System.Drawing.RectangleF(0, 0, _MyContentByte.PdfWriter.PageSize.Width, _MyContentByte.PdfWriter.PageSize.Height), _Width, _Height, _ViewBox);
 | 
						|
					_MyScale.XLowerLimit -= _LeftMargin;
 | 
						|
					_MyScale.YLowerLimit -= _TopMargin;
 | 
						|
				}
 | 
						|
				return _MyScale;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		public void Draw(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			//myPdf.Clear();
 | 
						|
			_MyContentByte = cb;
 | 
						|
			_Templates = new Dictionary<string, PdfTemplate>();
 | 
						|
			//RegisterFonts();
 | 
						|
			SvgParts.Draw(cb, MyScale, this, this); //72 - Points
 | 
						|
		}
 | 
						|
		public static iTextSharp.text.Font GetFont(string fontName)
 | 
						|
		{
 | 
						|
			RegisterFont(fontName);
 | 
						|
			return FontFactory.GetFont(fontName);
 | 
						|
		}
 | 
						|
		public static iTextSharp.text.Font GetFont(string fontName, float size, int style, System.Drawing.Color color)
 | 
						|
		{
 | 
						|
			RegisterFont(fontName);
 | 
						|
			return FontFactory.GetFont(fontName, size, style, new iTextSharp.text.Color(color));
 | 
						|
		}
 | 
						|
		public static void RegisterFont(string fontName)
 | 
						|
		{
 | 
						|
			if (!FontFactory.IsRegistered(fontName))
 | 
						|
			{
 | 
						|
				foreach (string name in FontKey.GetValueNames())
 | 
						|
				{
 | 
						|
					if (name.StartsWith(fontName))
 | 
						|
					{
 | 
						|
						string fontFile = (string) FontKey.GetValue(name);
 | 
						|
						FontFactory.Register(fontFile.Contains("\\") ? fontFile : FontFolder + "\\" + fontFile);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private static RegistryKey _FontKey = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows NT").OpenSubKey("CurrentVersion").OpenSubKey("Fonts");
 | 
						|
		public static RegistryKey FontKey
 | 
						|
		{ get { return _FontKey; } }
 | 
						|
		private static string _FontFolder = (String)Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows").OpenSubKey("CurrentVersion").OpenSubKey("Explorer").OpenSubKey("Shell Folders").GetValue("Fonts");
 | 
						|
		public static string FontFolder
 | 
						|
		{ get { return _FontFolder; } }
 | 
						|
		private static int _StackTraceSkip = 1;
 | 
						|
		private static DateTime _LastTime = DateTime.Now;
 | 
						|
		private static DateTime _StartTime = DateTime.Now;
 | 
						|
		public static void ResetWhen()
 | 
						|
		{
 | 
						|
			_StartTime = _LastTime = DateTime.Now;
 | 
						|
		}
 | 
						|
		public static void WhenAndWhere()
 | 
						|
		{
 | 
						|
			DateTime thisTime = DateTime.Now;
 | 
						|
			System.Diagnostics.StackFrame sf = new System.Diagnostics.StackFrame(_StackTraceSkip, true);
 | 
						|
			Console.WriteLine("{0:000000},{1:000000},'{2}',{3},'{4}'", TimeSpan.FromTicks(thisTime.Ticks - _StartTime.Ticks).TotalMilliseconds, 
 | 
						|
				TimeSpan.FromTicks(thisTime.Ticks - _LastTime.Ticks).TotalMilliseconds, sf.GetMethod().Name, sf.GetFileLineNumber()
 | 
						|
				,sf.GetFileName());
 | 
						|
			_LastTime = thisTime;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgArc : SvgShapePart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			cb.SaveState();
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			if (FillColor != System.Drawing.Color.Transparent)
 | 
						|
				cb.SetColorFill(new Color(FillColor));
 | 
						|
			if (OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty)
 | 
						|
			{
 | 
						|
				cb.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				cb.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			cb.Ellipse(scale.X(CX - Radius), scale.Y(cb, CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
 | 
						|
			SvgITextLibrary.StrokeAndFill(cb, (OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty), (FillColor != System.Drawing.Color.Transparent));
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			tmp.SaveState();
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			if (FillColor != System.Drawing.Color.Transparent)
 | 
						|
				tmp.SetColorFill(new Color(FillColor));
 | 
						|
			if (OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			tmp.Ellipse(scale.X(CX - Radius), scale.Y(CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
 | 
						|
			SvgITextLibrary.StrokeAndFill(tmp, (OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty), (FillColor != System.Drawing.Color.Transparent));
 | 
						|
			tmp.RestoreState();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgCircle : SvgShapePart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			cb.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				cb.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				cb.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				cb.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			float x1 = scale.X(CX - Radius);
 | 
						|
			float y1 = scale.Y(cb, CY - Radius);
 | 
						|
			float x2 = scale.X(CX + Radius);
 | 
						|
			float y2 = scale.Y(cb, CY + Radius);
 | 
						|
			cb.Ellipse(x1, y1, x2, y2);
 | 
						|
			SvgITextLibrary.StrokeAndFill(cb, stroke, fill);
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			tmp.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				tmp.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			tmp.Ellipse(scale.X(CX - Radius), scale.Y(CY - Radius), scale.X(CX + Radius), scale.Y(CY + Radius));
 | 
						|
			SvgITextLibrary.StrokeAndFill(tmp, stroke, fill);
 | 
						|
			tmp.RestoreState();
 | 
						|
			Svg.FixBoundingBox(tmp, scale.X(CX - Radius), scale.Y(CY - Radius), scale.X(CX + Radius), scale.Y(CY + Radius));
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgDefine : SvgGroup
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			// TODO: Could I try creating a template
 | 
						|
			// Don't draw
 | 
						|
			//	SvgParts.Draw(cb, myScale, mySvg, myParent);
 | 
						|
			PdfTemplate tmp = null;
 | 
						|
			if (ID != "") tmp = mySvg.GetTemplate(ID, cb); // the size will be adjusted as items are added.
 | 
						|
			SvgParts.Draw(tmp, myScale, mySvg, myParent);
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			// TODO: Could I try creating a template
 | 
						|
			// Don't draw
 | 
						|
			//	SvgParts.Draw(cb, myScale, mySvg, myParent);
 | 
						|
			//PdfTemplate tmp2 = mySvg.GetTemplate(ID); // the size will be adjusted as items are added.
 | 
						|
			//SvgParts.Draw(tmp2, myScale, mySvg, myParent);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgUse : SvgPartInheritance
 | 
						|
	{
 | 
						|
		private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			// TODO: Could I use the template
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			if (mySvg.LookUp.ContainsKey(_UseID))
 | 
						|
				mySvg[_UseID].Draw(cb, scale.AdjustOrigin(X, Y), mySvg, this);
 | 
						|
			else
 | 
						|
			{
 | 
						|
				_MyLog.WarnFormat("Missing Macro '{0}'", _UseID);
 | 
						|
			}
 | 
						|
			//cb.AddTemplate(mySvg.GetTemplate(_UseID.Substring(1),cb), scale.X(X), scale.Y(cb, Y));
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			// TODO: Could I use the template
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			//mySvg[_UseID.Substring(1)].Draw(tmp, scale.AdjustOrigin(X, Y), mySvg, this);
 | 
						|
			mySvg[_UseID].Draw(tmp, scale.AdjustOrigin(X, Y), mySvg, this);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgEllipse : SvgShapePart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			cb.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				cb.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				cb.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				cb.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			cb.Ellipse(scale.X(CX - RX), scale.Y(cb, CY - RY), scale.X(CX + RX), scale.Y(cb, CY + RY));
 | 
						|
			SvgITextLibrary.StrokeAndFill(cb, stroke, fill);
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			tmp.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				tmp.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			tmp.Ellipse(scale.X(CX - RX), scale.Y(CY - RY), scale.X(CX + RX), scale.Y(CY + RY));
 | 
						|
			SvgITextLibrary.StrokeAndFill(tmp, stroke, fill);
 | 
						|
			tmp.RestoreState();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgGroup : SvgPartInheritance
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			_SvgParts.Draw(cb, myScale, mySvg, this);
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			if (ID != "") tmp = mySvg.GetTemplate(ID, mySvg.MyContentByte); // the size will be adjusted as items are added.
 | 
						|
			SvgParts.Draw(tmp, myScale, mySvg, this);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgImage : SvgPart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			cb.SaveState();
 | 
						|
			iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(ImagePath);
 | 
						|
			if (Height.Value != 0)
 | 
						|
				img.ScaleAbsoluteHeight(scale.M(Height));
 | 
						|
			if (Width.Value != 0)
 | 
						|
				img.ScaleAbsoluteWidth(scale.M(Width));
 | 
						|
			img.SetAbsolutePosition(scale.X(X), scale.Y(cb, Y) - scale.M(img.ScaledHeight));
 | 
						|
			// The next three lines set the image opacity for testing
 | 
						|
			//PdfGState gState = new PdfGState();
 | 
						|
			//gState.FillOpacity = .2f;
 | 
						|
			//cb.SetGState(gState);
 | 
						|
			cb.AddImage(img);
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			tmp.SaveState();
 | 
						|
			iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(ImagePath);
 | 
						|
			img.ScaleAbsolute(scale.M(Width), scale.M(Height));
 | 
						|
			img.SetAbsolutePosition(scale.X(X), scale.Y(Y) - scale.M(img.ScaledHeight));
 | 
						|
			tmp.AddImage(img);
 | 
						|
			tmp.RestoreState();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgLine : SvgLinePart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			cb.SaveState();
 | 
						|
			bool stroke = LineColor != System.Drawing.Color.Empty;
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				cb.SetLineWidth(LineWidth.Value);
 | 
						|
				cb.SetColorStroke(new Color(LineColor));
 | 
						|
			}
 | 
						|
			cb.SetLineCap(PdfContentByte.LINE_CAP_ROUND);
 | 
						|
			if (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE")
 | 
						|
			{
 | 
						|
				cb.MoveTo(scale.AbsX(X1), scale.AbsY(cb, Y1));
 | 
						|
				cb.LineTo(scale.AbsX(X2), scale.AbsY(cb, Y2));
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				cb.MoveTo(scale.X(X1), scale.Y(cb, Y1));
 | 
						|
				cb.LineTo(scale.X(X2), scale.Y(cb, Y2));
 | 
						|
			}
 | 
						|
			cb.Stroke();
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			tmp.SaveState();
 | 
						|
			bool stroke = LineColor != System.Drawing.Color.Empty;
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(LineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(LineColor));
 | 
						|
			}
 | 
						|
			tmp.MoveTo(scale.X(X1), scale.Y(Y1));
 | 
						|
			tmp.LineTo(scale.X(X2), scale.Y(Y2));
 | 
						|
			tmp.Stroke();
 | 
						|
			tmp.RestoreState();
 | 
						|
			Svg.FixBoundingBox(tmp, scale.X(X1), scale.Y(Y1), scale.X(X2), scale.Y(Y2));
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgParts : CollectionBase
 | 
						|
	{
 | 
						|
		public void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			foreach (SvgPart svgPart in List)
 | 
						|
				svgPart.Draw(cb, scale, mySvg, myParent);
 | 
						|
		}
 | 
						|
		public void Draw(PdfTemplate tmp, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			foreach (SvgPart svgPart in List)
 | 
						|
				svgPart.Draw(tmp, myScale, mySvg, myParent);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgRectangle : SvgShapePart
 | 
						|
	{
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			cb.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				cb.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				cb.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				cb.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			if (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE")
 | 
						|
				cb.RoundRectangle(scale.AbsX(X), scale.AbsY(cb, Y), scale.M(Width), -scale.M(Height), .005F);
 | 
						|
			else
 | 
						|
				cb.RoundRectangle(scale.X(X), scale.Y(cb, Y), scale.M(Width), -scale.M(Height), .005F);
 | 
						|
			SvgITextLibrary.StrokeAndFill(cb, stroke, fill);
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			if (ID != "") tmp = mySvg.GetTemplate(ID, mySvg.MyContentByte); // the size will be adjusted as items are added.
 | 
						|
			tmp.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			if (fill)
 | 
						|
				tmp.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			tmp.Rectangle(scale.X(X), scale.Y(Y), scale.M(Width), -scale.M(Height));
 | 
						|
			SvgITextLibrary.StrokeAndFill(tmp, stroke, fill);
 | 
						|
			Svg.FixBoundingBox(tmp, scale.X(X), scale.Y(Y), scale.X(X) + scale.M(Width), scale.Y(Y) - scale.M(Height));
 | 
						|
			tmp.RestoreState();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public partial class SvgText : SvgShapePart
 | 
						|
	{
 | 
						|
		private static string ReplaceSpecialCharacter(Match m)
 | 
						|
		{
 | 
						|
			int i = int.Parse(m.ToString().Substring(2, m.ToString().Length - 3));
 | 
						|
			char c = (char)i;
 | 
						|
			return c.ToString();
 | 
						|
		}
 | 
						|
		private static string ReplaceHexCharacter(Match m)
 | 
						|
		{
 | 
						|
			int i = int.Parse(m.ToString().Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
 | 
						|
			char c = (char)i;
 | 
						|
			return c.ToString();
 | 
						|
		}
 | 
						|
		public int Align
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				switch (Justify)
 | 
						|
				{
 | 
						|
					case SvgJustify.Left:
 | 
						|
						return Element.ALIGN_LEFT;
 | 
						|
						break;
 | 
						|
					case SvgJustify.Center:
 | 
						|
						return Element.ALIGN_CENTER;
 | 
						|
						break;
 | 
						|
					case SvgJustify.Right:
 | 
						|
						return Element.ALIGN_RIGHT;
 | 
						|
						break;
 | 
						|
				}
 | 
						|
				return Element.ALIGN_LEFT;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		// Draw's using PdfContentByte are for drawing PageList items.
 | 
						|
		public override void Draw(PdfContentByte cb, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			string text = mySvg.OnProcessText(Text, this, scale);
 | 
						|
			if (text == string.Empty) return;
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			float yScale = (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE") ? scale.AbsY(cb, Y): scale.Y(cb, Y);
 | 
						|
			cb.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			
 | 
						|
			// Strip out inline commands that are overridden by the fontStyle
 | 
						|
			if (Font.Bold) text = StripCommands(text, @"\\b0", @"\\b");
 | 
						|
			if (Font.Italic) text = StripCommands(text, @"\\i0", @"\\i");
 | 
						|
			if (Font.Underline) text = StripCommands(text, @"\\ulnone", @"\\ul0", @"\\ul");
 | 
						|
 | 
						|
			float fontSize = scale.M(new SvgMeasurement(Font.SizeInPoints, E_MeasurementUnits.PT));
 | 
						|
			int fontStyle = (Font.Bold ? iTextSharp.text.Font.BOLD : 0) + (Font.Italic ? iTextSharp.text.Font.ITALIC : 0);
 | 
						|
			VolianPdf.RegisterFont(Font.Name);
 | 
						|
			//if (iTextSharp.text.FontFactory.IsRegistered(Font.Name) == false)
 | 
						|
			//{
 | 
						|
			//    //iTextSharp.text.FontFactory.RegisterDirectories();
 | 
						|
			//}
 | 
						|
			iTextSharp.text.Font font = FontFactory.GetFont(Font.Name, BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor));
 | 
						|
 | 
						|
			Phrase ph = BuildPhrase(text, fontSize, fontStyle, font);
 | 
						|
			ColumnText ct = new ColumnText(cb);
 | 
						|
			float x = (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE") ? scale.AbsX(X): scale.X(X);
 | 
						|
			float w = 0; // chk.GetWidthPoint();
 | 
						|
			foreach (Chunk chk in ph.Chunks)
 | 
						|
				w += chk.GetWidthPoint();
 | 
						|
			switch (Justify)
 | 
						|
			{
 | 
						|
				//case SvgJustify.Left:
 | 
						|
				//    x = x;
 | 
						|
				//    break;
 | 
						|
				case SvgJustify.Center:
 | 
						|
					x-=w/2;
 | 
						|
					break;
 | 
						|
				case SvgJustify.Right:
 | 
						|
					x-=w;
 | 
						|
					break;
 | 
						|
			}
 | 
						|
			float y = yScale;
 | 
						|
			float xRight = x + w;
 | 
						|
			float Offset = 0;
 | 
						|
			if (Font.Underline)
 | 
						|
			{
 | 
						|
				foreach (Chunk chk in ph.Chunks)
 | 
						|
					chk.SetUnderline(new Color(FillColor), 0, 0.047F, 0, -.1373F, PdfContentByte.LINE_CAP_ROUND);
 | 
						|
			}
 | 
						|
			// The following line was changed so that a 6.5 size font would print, i.e. the 2 was changed to a 3 to make the
 | 
						|
			// 6.5 size work.
 | 
						|
			ct.SetSimpleColumn(x, y + ph.Leading + Offset, xRight + 1F, y + ph.Leading + Offset - 3 * font.Size);//2 * font.Size);
 | 
						|
			ct.AddElement(ph);
 | 
						|
			cb.SaveState();
 | 
						|
			cb.SetColorFill(new Color(FillColor));
 | 
						|
			ct.Go();
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
 | 
						|
		private Phrase BuildPhrase(string text, float fontSize, int fontStyle, iTextSharp.text.Font font)
 | 
						|
		{
 | 
						|
			//if (text == "Caution")
 | 
						|
			//{
 | 
						|
			//    if (iTextSharp.text.FontFactory.IsRegistered("VolianScript"))
 | 
						|
			//        Console.WriteLine("Is Registered");
 | 
						|
			//    Console.WriteLine("stop");
 | 
						|
			//}
 | 
						|
			bool fontUnderline = false;
 | 
						|
			float fontTextRise = 0;
 | 
						|
 | 
						|
			text = Regex.Replace(text, @"\\u[0-9]+[?]", new MatchEvaluator(ReplaceSpecialCharacter));
 | 
						|
			text = Regex.Replace(text, @"\\'[0-9a-fA-F][0-9a-fA-F]", new MatchEvaluator(ReplaceHexCharacter));
 | 
						|
			text += " ";
 | 
						|
			Phrase ph = new Phrase();
 | 
						|
			while (text.Length > 0)
 | 
						|
			{
 | 
						|
				string next = "";
 | 
						|
				Match m = Regex.Match(text, @"\\[^ ]*?[ $]");
 | 
						|
				if (m.Success)
 | 
						|
				{
 | 
						|
					// text is portion of text and next is remaining portion to process next
 | 
						|
					next = text.Substring(m.Index + m.Length);
 | 
						|
					text = text.Substring(0, m.Index);
 | 
						|
				}
 | 
						|
				else
 | 
						|
					if (text[text.Length - 1] == ' ') text = text.Substring(0, text.Length - 1);
 | 
						|
 | 
						|
				foreach (Chunk chk in BuildPartialPhrase(text, fontSize, fontStyle, font).Chunks)
 | 
						|
				{
 | 
						|
					if (fontUnderline) chk.SetUnderline(font.Color, 0, 0.05F, 0, -.131F, PdfContentByte.LINE_CAP_ROUND);
 | 
						|
					if (fontTextRise != 0) chk.SetTextRise(fontTextRise * chk.Font.Size);
 | 
						|
					ph.Add(chk);
 | 
						|
				}
 | 
						|
				if (m.Success)
 | 
						|
				{
 | 
						|
					// bold, underline, italics, subscript, superscript
 | 
						|
					if (m.Value.Contains(@"\ulnone") || m.Value.Contains(@"\ul0"))   // off
 | 
						|
						fontUnderline = false;
 | 
						|
					else if (m.Value.Contains(@"\ul"))
 | 
						|
						fontUnderline = true;
 | 
						|
					if (m.Value.Contains(@"\up0") || m.Value.Contains(@"\dn0")) fontTextRise = 0;
 | 
						|
					else if (m.Value.Contains(@"\up")) fontTextRise = .25F;
 | 
						|
					else if (m.Value.Contains(@"\dn")) fontTextRise = -.25F;
 | 
						|
					if (m.Value.Contains(@"\b0"))
 | 
						|
					{
 | 
						|
						fontStyle ^= iTextSharp.text.Font.BOLD;
 | 
						|
						font = FontFactory.GetFont(font.Familyname, BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor));
 | 
						|
					}
 | 
						|
					else if (m.Value.Contains(@"\b"))
 | 
						|
					{
 | 
						|
						fontStyle |= iTextSharp.text.Font.BOLD;
 | 
						|
						font = FontFactory.GetFont(font.Familyname, BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor));
 | 
						|
					}
 | 
						|
					if (m.Value.Contains(@"\i0"))
 | 
						|
					{
 | 
						|
						fontStyle ^= iTextSharp.text.Font.ITALIC;
 | 
						|
						font = FontFactory.GetFont(font.Familyname, BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor));
 | 
						|
					}
 | 
						|
					else if (m.Value.Contains(@"\i"))
 | 
						|
					{
 | 
						|
						fontStyle |= iTextSharp.text.Font.ITALIC;
 | 
						|
						font = FontFactory.GetFont(font.Familyname, BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor));
 | 
						|
					}
 | 
						|
				}
 | 
						|
				text = next;
 | 
						|
			}
 | 
						|
			return ph;
 | 
						|
		}
 | 
						|
 | 
						|
		private Phrase BuildPartialPhrase(string text, float fontSize, int fontStyle, iTextSharp.text.Font font)
 | 
						|
		{
 | 
						|
			iTextSharp.text.pdf.FontSelector fs = new FontSelector();
 | 
						|
			fs.AddFont(font);
 | 
						|
			if (font.BaseFont != null && font.BaseFont.GetWidthPoint("m", 12) == font.BaseFont.GetWidthPoint(".", 12))
 | 
						|
			{
 | 
						|
				VolianPdf.RegisterFont("VESymbFix");
 | 
						|
				fs.AddFont(FontFactory.GetFont("VESymbFix", BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor)));
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				VolianPdf.RegisterFont("Arial Unicode MS");
 | 
						|
				fs.AddFont(FontFactory.GetFont("Arial Unicode MS", BaseFont.IDENTITY_H, true, fontSize, fontStyle, new Color(FillColor)));
 | 
						|
			}
 | 
						|
			
 | 
						|
			Phrase ph = fs.Process(text);
 | 
						|
			return ph;
 | 
						|
		}
 | 
						|
 | 
						|
		private string StripCommands(string text, params string [] rtfCommands)
 | 
						|
		{
 | 
						|
			foreach (string rtfCommand in rtfCommands)
 | 
						|
			{
 | 
						|
				// remove rtf command preceeded by another rtf command with previous
 | 
						|
				// rtf ending with a space, i.e. "\ulnone\b0 " removing the "b0", leaves " "
 | 
						|
				// * - as many as there are, ? - minimum number that results in a match
 | 
						|
				text = Regex.Replace(text, @"(\\[^ ]*?)" + rtfCommand + " ", "$1 ");
 | 
						|
				// remove rtf command follwed by a space
 | 
						|
				text = Regex.Replace(text, rtfCommand + " ", "");
 | 
						|
				// remove just the rtf command
 | 
						|
				text = Regex.Replace(text, rtfCommand, "");
 | 
						|
			}
 | 
						|
			return text;
 | 
						|
		}
 | 
						|
		// Draw's using PdfTemplate are for drawing SVG (16-bit genmac).
 | 
						|
		public override void Draw(PdfTemplate tmp, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
 | 
						|
		{
 | 
						|
			string text = mySvg.OnProcessText(Text, this, scale);
 | 
						|
			if (text == string.Empty) return;
 | 
						|
			SetupInheritance(myParent.MyInheritedSettings);
 | 
						|
			float yScale = -scale.Y(Y);
 | 
						|
			tmp.SaveState();
 | 
						|
			bool fill = FillColor != System.Drawing.Color.Transparent;
 | 
						|
			bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty;
 | 
						|
			tmp.BeginText();
 | 
						|
			if (fill)
 | 
						|
				tmp.SetColorFill(new Color(FillColor));
 | 
						|
			if (stroke)
 | 
						|
			{
 | 
						|
				tmp.SetLineWidth(scale.M(OutlineWidth));
 | 
						|
				tmp.SetColorStroke(new Color(OutlineColor));
 | 
						|
			}
 | 
						|
			iTextSharp.text.Font font = Svg.GetFont(Font.Name);
 | 
						|
			BaseFont baseFont = font.BaseFont;
 | 
						|
			tmp.MoveText(scale.X(X), yScale);
 | 
						|
			tmp.SetFontAndSize(baseFont, scale.M(new SvgMeasurement(Font.SizeInPoints, E_MeasurementUnits.PT)));
 | 
						|
			switch ((stroke ? 1 : 0) + (fill ? 2 : 0))
 | 
						|
			{
 | 
						|
				case 0: // No Stroke or Fill
 | 
						|
					tmp.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_INVISIBLE);
 | 
						|
					break;
 | 
						|
				case 1: // Stroke
 | 
						|
					tmp.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_STROKE);
 | 
						|
					break;
 | 
						|
				case 2: // Fill
 | 
						|
					tmp.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL);
 | 
						|
					break;
 | 
						|
				case 3: // Stroke and Fill
 | 
						|
					tmp.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
 | 
						|
					break;
 | 
						|
			}
 | 
						|
			tmp.ShowTextKerned(text);
 | 
						|
			tmp.EndText();
 | 
						|
			tmp.RestoreState();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public class SvgPageTotal
 | 
						|
	{
 | 
						|
		public SvgPageTotal(System.Drawing.Font myFont, PdfContentByte cb)
 | 
						|
		{
 | 
						|
			_MyFont = myFont;
 | 
						|
			_MyTemplate = cb.CreateTemplate(100, 100);
 | 
						|
			_MyTemplate.BoundingBox= new Rectangle(-20, -20, 100, 100);
 | 
						|
		}
 | 
						|
		private int _PageCount=1;
 | 
						|
		private System.Drawing.Font _MyFont;
 | 
						|
		private PdfTemplate _MyTemplate;
 | 
						|
		public PdfTemplate MyTemplate
 | 
						|
		{
 | 
						|
			get { return _MyTemplate; }
 | 
						|
		}
 | 
						|
		public void Draw()
 | 
						|
		{
 | 
						|
			// Output Page Count
 | 
						|
			_MyTemplate.BeginText();
 | 
						|
			iTextSharp.text.Font font = Svg.GetFont(_MyFont.Name);
 | 
						|
			BaseFont baseFont = font.BaseFont;
 | 
						|
			_MyTemplate.SetFontAndSize(baseFont,_MyFont.Size);
 | 
						|
			_MyTemplate.SetTextMatrix(0, 0);
 | 
						|
			_MyTemplate.ShowText(_PageCount.ToString());
 | 
						|
			_MyTemplate.EndText();
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public class SvgPageHelper : PdfPageEventHelper
 | 
						|
	{
 | 
						|
		private List<string> _AllowedWatermarks = new List<string>();
 | 
						|
		public List<string> AllowedWatermarks
 | 
						|
		{
 | 
						|
			get { return _AllowedWatermarks; }
 | 
						|
			set { _AllowedWatermarks = value; }
 | 
						|
		}
 | 
						|
		private Svg _MySvg;
 | 
						|
		public Svg MySvg
 | 
						|
		{
 | 
						|
			get { return _MySvg; }
 | 
						|
			set { _MySvg = value; }
 | 
						|
		}
 | 
						|
		private PdfLayer _PageListLayer;
 | 
						|
		public PdfLayer PageListLayer
 | 
						|
		{
 | 
						|
			get { return _PageListLayer; }
 | 
						|
			set { _PageListLayer = value; }
 | 
						|
		}
 | 
						|
		private PdfLayer _WatermarkLayer;
 | 
						|
		public PdfLayer WatermarkLayer
 | 
						|
		{
 | 
						|
			get { return _WatermarkLayer; }
 | 
						|
			set { _WatermarkLayer = value; }
 | 
						|
		}
 | 
						|
		private string _Watermark=string.Empty;
 | 
						|
		public string Watermark
 | 
						|
		{
 | 
						|
			get { return _Watermark; }
 | 
						|
			set { _Watermark = value; }
 | 
						|
		}
 | 
						|
		private bool _DoZoomOMatic = false;
 | 
						|
		public bool DoZoomOMatic
 | 
						|
		{
 | 
						|
			get { return _DoZoomOMatic; }
 | 
						|
			set { _DoZoomOMatic = value; }
 | 
						|
		}
 | 
						|
		private int _CurrentPageNumber = 0;
 | 
						|
		public int CurrentPageNumber
 | 
						|
		{
 | 
						|
			get { return _CurrentPageNumber; }
 | 
						|
			set { _CurrentPageNumber = value; }
 | 
						|
		}
 | 
						|
		private bool _OnFoldoutPage = false;
 | 
						|
		public bool OnFoldoutPage
 | 
						|
		{
 | 
						|
			get { return _OnFoldoutPage; }
 | 
						|
			set { _OnFoldoutPage = value; }
 | 
						|
		}
 | 
						|
		private bool _CreatingFoldoutPage = false;
 | 
						|
		public bool CreatingFoldoutPage
 | 
						|
		{
 | 
						|
			get { return _CreatingFoldoutPage; }
 | 
						|
			set { _CreatingFoldoutPage = value; }
 | 
						|
		}
 | 
						|
		public SvgPageHelper(Svg mySvg)
 | 
						|
		{
 | 
						|
			_MySvg = mySvg;
 | 
						|
		}
 | 
						|
		public SvgPageHelper()
 | 
						|
		{
 | 
						|
		}
 | 
						|
		private int _BGPageOffset = 0;
 | 
						|
		public int BackgroundPageOffset
 | 
						|
		{
 | 
						|
			get { return _BGPageOffset; }
 | 
						|
			set { _BGPageOffset = value; }
 | 
						|
		}
 | 
						|
		protected virtual string ReplacePageListToken(Match match)
 | 
						|
		{
 | 
						|
			return string.Empty;
 | 
						|
		}
 | 
						|
 | 
						|
		public override void OnOpenDocument(PdfWriter writer, Document document)
 | 
						|
		{
 | 
						|
			//base.OnOpenDocument(writer, document);
 | 
						|
			//tmpTotal = writer.DirectContent.CreateTemplate(100, 100);
 | 
						|
			//tmpTotal.BoundingBox = new Rectangle(-20, -20, 100, 100);
 | 
						|
			//PdfContentByte cb = writer.DirectContent;
 | 
						|
		}
 | 
						|
		public override void OnEndPage(PdfWriter writer, Document document)
 | 
						|
		{
 | 
						|
			if (!OnFoldoutPage)
 | 
						|
			{
 | 
						|
				base.OnEndPage(writer, document);
 | 
						|
				if (!CreatingFoldoutPage)
 | 
						|
				{
 | 
						|
					DrawBackground(writer.DirectContentUnder);
 | 
						|
					DrawPageList(writer.DirectContent);
 | 
						|
					DrawWatermark(writer.DirectContentUnder);
 | 
						|
					if (DoZoomOMatic) DrawZoomOMatic(writer.DirectContent);
 | 
						|
				}
 | 
						|
				CurrentPageNumber++;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if (!CreatingFoldoutPage)
 | 
						|
				{
 | 
						|
					DrawBackground(writer.DirectContentUnder);
 | 
						|
					DrawPageList(writer.DirectContent);
 | 
						|
					DrawWatermark(writer.DirectContentUnder);
 | 
						|
					if (DoZoomOMatic) DrawZoomOMatic(writer.DirectContent);
 | 
						|
					CurrentPageNumber++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private PdfReader _BackgroundReader = null;
 | 
						|
		public PdfReader BackgroundReader
 | 
						|
		{
 | 
						|
			get 
 | 
						|
			{
 | 
						|
				if (_BackgroundReader == null && _BackgroundFile != null && File.Exists(_BackgroundFile))
 | 
						|
					_BackgroundReader = new PdfReader(_BackgroundFile);
 | 
						|
				return _BackgroundReader; 
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private string _BackgroundFile = null;
 | 
						|
		public string BackgroundFile
 | 
						|
		{
 | 
						|
			get { return _BackgroundFile; }
 | 
						|
			set { _BackgroundFile = value; }
 | 
						|
		}
 | 
						|
		private PdfLayer _BackgroundLayer = null;
 | 
						|
		public PdfLayer BackgroundLayer
 | 
						|
		{
 | 
						|
			get { return _BackgroundLayer; }
 | 
						|
			set { _BackgroundLayer = value; }
 | 
						|
		}
 | 
						|
		private System.Drawing.PointF _BackgroundOffset = new System.Drawing.PointF(0, 0);
 | 
						|
		public System.Drawing.PointF BackgroundOffset
 | 
						|
		{
 | 
						|
			get { return _BackgroundOffset; }
 | 
						|
			set { _BackgroundOffset = value; }
 | 
						|
		}
 | 
						|
		public int BackgroundPageCount
 | 
						|
		{
 | 
						|
			get { return BackgroundReader == null ? 0 : BackgroundReader.NumberOfPages; }
 | 
						|
		}
 | 
						|
		private PdfImportedPage GetBackgroundPage(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			if (BackgroundReader == null) return null;
 | 
						|
			int page = cb.PdfWriter.CurrentPageNumber + BackgroundPageOffset;
 | 
						|
			if (page < 1 || page > BackgroundPageCount) return null;
 | 
						|
			return cb.PdfWriter.GetImportedPage(BackgroundReader, page);
 | 
						|
		}
 | 
						|
		private void DrawBackground(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			PdfImportedPage backgroundPage = GetBackgroundPage(cb);
 | 
						|
			if (backgroundPage == null) return;
 | 
						|
			if(BackgroundLayer != null) cb.BeginLayer(BackgroundLayer);
 | 
						|
			iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(backgroundPage);
 | 
						|
			image.SetAbsolutePosition(BackgroundOffset.X,BackgroundOffset.Y);
 | 
						|
			cb.AddImage(image);
 | 
						|
			if (BackgroundLayer != null) cb.EndLayer();
 | 
						|
		}
 | 
						|
		private void DrawZoomOMatic(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			cb.SaveState();
 | 
						|
			ZoomOMatic(cb, 36);
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		private bool _AllowAllWatermarks = false;
 | 
						|
		public bool AllowAllWatermarks
 | 
						|
		{
 | 
						|
			get { return _AllowAllWatermarks; }
 | 
						|
			set { _AllowAllWatermarks = value; }
 | 
						|
		}
 | 
						|
		private void DrawWatermark(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			if (Watermark == null || Watermark.ToLower().Contains("none") || Watermark == "") return;
 | 
						|
			if (!AllowAllWatermarks && !AllowedWatermarks.Contains(Watermark)) return;
 | 
						|
			cb.SaveState();
 | 
						|
			if (_WatermarkLayer != null) cb.BeginLayer(_WatermarkLayer);
 | 
						|
			SvgWatermark myWatermark = new SvgWatermark(cb, Watermark, System.Drawing.Color.Blue, .15F);
 | 
						|
			myWatermark.SetSquareDotPattern(.7F);
 | 
						|
			myWatermark.Draw();
 | 
						|
			if (_WatermarkLayer != null) cb.EndLayer();
 | 
						|
			cb.RestoreState();
 | 
						|
		}
 | 
						|
		private void DrawPageList(PdfContentByte cb)
 | 
						|
		{
 | 
						|
			if (_MySvg != null)
 | 
						|
			{
 | 
						|
				cb.SaveState();
 | 
						|
				if (_PageListLayer != null) cb.BeginLayer(_PageListLayer);
 | 
						|
				// Do anything needed to finish off the page
 | 
						|
				_MySvg.Draw(cb);
 | 
						|
				if (_PageListLayer != null) cb.EndLayer();
 | 
						|
				cb.RestoreState();
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private void ZoomOMatic(PdfContentByte cb, float size)
 | 
						|
		{
 | 
						|
			for (float xx = 0; xx < cb.PdfDocument.PageSize.Width; xx += size)
 | 
						|
			{
 | 
						|
				for (float yy = 0; yy < cb.PdfDocument.PageSize.Height; yy += size)
 | 
						|
				{
 | 
						|
					PdfDestination dest = new PdfDestination(PdfDestination.FITR, xx - 1.5F * size, yy - 1.5F * size, xx + 1.5F * size, yy + 1.5F * size);
 | 
						|
					cb.SetAction(PdfAction.GotoLocalPage(cb.PdfWriter.CurrentPageNumber, dest, cb.PdfWriter), xx - size, yy - size, xx + size, yy + size);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		public override void OnStartPage(PdfWriter writer, Document document)
 | 
						|
		{
 | 
						|
			//base.OnStartPage(writer, document);
 | 
						|
		}
 | 
						|
		public override void OnCloseDocument(PdfWriter writer, Document document)
 | 
						|
		{
 | 
						|
			// Build Templates for Page Count
 | 
						|
		}
 | 
						|
	}
 | 
						|
	public class SvgWatermark
 | 
						|
	{
 | 
						|
		private PdfContentByte _ContentByte;
 | 
						|
		private string _Text;
 | 
						|
		private Color _Color;
 | 
						|
		private PdfPatternPainter _PatternPainter;
 | 
						|
		private BaseFont _Basefont;
 | 
						|
		private float _Fontsize;
 | 
						|
		private float _XOffset;
 | 
						|
		private float _YOffset;
 | 
						|
		private float _TextAngle;
 | 
						|
		private float _Opacity;
 | 
						|
		public SvgWatermark(PdfContentByte contentByte, string text, System.Drawing.Color color, float opacity)
 | 
						|
		{
 | 
						|
			_ContentByte = contentByte;
 | 
						|
			_Text = text;
 | 
						|
			float radius = .5F;
 | 
						|
			float space = 3;
 | 
						|
			_Color = new Color(color);
 | 
						|
			_Opacity = opacity;
 | 
						|
			SetDotPattern(radius, space);
 | 
						|
			SetTextLayout();
 | 
						|
		}
 | 
						|
		private void SetTextLayout()
 | 
						|
		{
 | 
						|
			Rectangle pageSize = _ContentByte.PdfWriter.PageSize; // Get page size
 | 
						|
			_Basefont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, Encoding.ASCII.EncodingName, false);
 | 
						|
			float hgtA = _Basefont.GetAscentPoint(_Text, 12);
 | 
						|
			//float hgtD = basefont.GetDescentPoint(text,20);
 | 
						|
			float wid = _Basefont.GetWidthPointKerned(_Text, 12);
 | 
						|
			//Console.WriteLine("{0} {1} {2}",hgtA,hgtD,wid);
 | 
						|
			float rho = wid / hgtA;
 | 
						|
			float x2 = (rho * pageSize.Height - pageSize.Width) / (rho * rho - 1);
 | 
						|
			float y1 = x2 * rho;
 | 
						|
			float y2 = pageSize.Height - y1;
 | 
						|
			float x1 = pageSize.Width - x2;
 | 
						|
			_XOffset = x2 + x1 / 2;
 | 
						|
			_YOffset = y1 / 2;
 | 
						|
			_TextAngle = CalcAngle(y1, x1);
 | 
						|
			_Fontsize = (float)(10 * Math.Sqrt(x2 * x2 + y2 * y2) / hgtA);
 | 
						|
		}
 | 
						|
		public void SetDotPattern(float radius, float space)
 | 
						|
		{
 | 
						|
			_PatternPainter = _ContentByte.CreatePattern(radius * 2, radius * 2, radius * 2 + space, radius * 2 + space);
 | 
						|
			PdfGState gState = new PdfGState();
 | 
						|
			gState.FillOpacity = _Opacity;
 | 
						|
			_PatternPainter.SetGState(gState);
 | 
						|
			_PatternPainter.SetColorFill(_Color);
 | 
						|
			_PatternPainter.Circle(radius, radius, radius);
 | 
						|
			_PatternPainter.Fill();
 | 
						|
		}
 | 
						|
		public void SetSquareDotPattern(float radius)
 | 
						|
		{
 | 
						|
			_PatternPainter = _ContentByte.CreatePattern(radius * 4, radius * 2, radius * 4, radius * 2);
 | 
						|
			PdfGState gState = new PdfGState();
 | 
						|
			gState.FillOpacity = .5f * _Opacity;
 | 
						|
			_PatternPainter.SetGState(gState);
 | 
						|
			_PatternPainter.SetColorFill(_Color);
 | 
						|
			_PatternPainter.Rectangle(0, 0, radius, radius);
 | 
						|
			_PatternPainter.Rectangle(radius * 2, radius, radius, radius);
 | 
						|
			_PatternPainter.Fill();
 | 
						|
		}
 | 
						|
		public void SetHashPattern(float thickness, float size)
 | 
						|
		{
 | 
						|
			_PatternPainter = _ContentByte.CreatePattern(size, size, size, size);
 | 
						|
			PdfGState gState = new PdfGState();
 | 
						|
			gState.FillOpacity = _Opacity;
 | 
						|
			gState.StrokeOpacity = _Opacity;
 | 
						|
			_PatternPainter.SetGState(gState);
 | 
						|
			_PatternPainter.SetLineWidth(.01F);
 | 
						|
			_PatternPainter.SetColorStroke(_Color); // Set color
 | 
						|
			_PatternPainter.MoveTo(0, 0);
 | 
						|
			_PatternPainter.LineTo(size, size);
 | 
						|
			_PatternPainter.MoveTo(size, 0);
 | 
						|
			_PatternPainter.LineTo(0, size);
 | 
						|
			_PatternPainter.Stroke();
 | 
						|
		}
 | 
						|
		public void SetTextPattern(float fontSize, float space)
 | 
						|
		{
 | 
						|
			float hgtA = _Basefont.GetAscentPoint(_Text, fontSize) + _Basefont.GetDescentPoint(_Text, fontSize);
 | 
						|
			float wid = _Basefont.GetWidthPointKerned(_Text, fontSize);
 | 
						|
			_PatternPainter = _ContentByte.CreatePattern(wid, hgtA, wid + space, hgtA + space);
 | 
						|
			_PatternPainter.SetFontAndSize(_Basefont, fontSize);
 | 
						|
			_PatternPainter.BoundingBox = new Rectangle(-20, -20, 100, 100);
 | 
						|
			_PatternPainter.BeginText();
 | 
						|
			PdfGState gs1 = new PdfGState();
 | 
						|
			gs1.FillOpacity = _Opacity;
 | 
						|
			_PatternPainter.SetGState(gs1);
 | 
						|
			_PatternPainter.SetColorFill(_Color); // Set color
 | 
						|
			_PatternPainter.ShowText(_Text);
 | 
						|
			_PatternPainter.EndText();
 | 
						|
		}
 | 
						|
		public void SetTextPattern2(float fontSize)
 | 
						|
		{
 | 
						|
			BaseFont _Basefont2 = BaseFont.CreateFont(BaseFont.HELVETICA, Encoding.ASCII.EncodingName, false);
 | 
						|
			float hgtA = _Basefont2.GetAscentPoint(_Text, fontSize);
 | 
						|
			float wid = _Basefont2.GetWidthPointKerned(_Text, fontSize);
 | 
						|
			_PatternPainter = _ContentByte.CreatePattern(wid * 2, hgtA * 2, wid * 2, hgtA * 2);
 | 
						|
			_PatternPainter.SetFontAndSize(_Basefont2, fontSize);
 | 
						|
			_PatternPainter.BoundingBox = new Rectangle(-20, -20, 100, 100);
 | 
						|
			_PatternPainter.BeginText();
 | 
						|
			PdfGState gs1 = new PdfGState();
 | 
						|
			gs1.FillOpacity = _Opacity;
 | 
						|
			_PatternPainter.SetGState(gs1);
 | 
						|
			_PatternPainter.SetColorFill(_Color); // Set color
 | 
						|
			_PatternPainter.ShowText(_Text);
 | 
						|
			_PatternPainter.ShowTextAligned(PdfContentByte.ALIGN_LEFT, _Text, wid, hgtA, 0);
 | 
						|
			_PatternPainter.EndText();
 | 
						|
		}
 | 
						|
		public void Draw()
 | 
						|
		{
 | 
						|
			_ContentByte.SaveState();
 | 
						|
			_ContentByte.BeginText();
 | 
						|
			_ContentByte.SetPatternFill(_PatternPainter);
 | 
						|
			_ContentByte.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
 | 
						|
			_ContentByte.SetLineWidth(.5F);
 | 
						|
			_ContentByte.SetFontAndSize(_Basefont, _Fontsize);// Set font and size
 | 
						|
			_ContentByte.SetColorStroke(_Color);
 | 
						|
			PdfGState gs2 = new PdfGState();
 | 
						|
			gs2.StrokeOpacity = _Opacity;
 | 
						|
			_ContentByte.SetGState(gs2);
 | 
						|
			_ContentByte.ShowTextAlignedKerned(PdfContentByte.ALIGN_CENTER, _Text, _XOffset, _YOffset, _TextAngle);// Draw the text
 | 
						|
			_ContentByte.EndText();
 | 
						|
			_ContentByte.FillStroke(); // Controlled by TextRenderMode above
 | 
						|
			_ContentByte.RestoreState();
 | 
						|
		}
 | 
						|
		private float CalcAngle(float opposite, float adjacent)
 | 
						|
		{
 | 
						|
			return (float)(Math.Atan2(opposite, adjacent) * (180 / Math.PI));
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
	public enum SvgWatermarkFill
 | 
						|
	{
 | 
						|
		Dots = 1,
 | 
						|
		Text1 = 2,
 | 
						|
		Text2 = 3,
 | 
						|
		Hash = 4
 | 
						|
	}
 | 
						|
} |