B2019-174 Register the font folder with iTechSharp so that the symbol fonts can be found when generating the Auto Table Of Contents
		
			
				
	
	
		
			182 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| using iTextSharp.text.factories;
 | |
| using Microsoft.Win32;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.IO;
 | |
| using iTextSharp.text;
 | |
| 
 | |
| namespace Volian.Base.Library
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// B2019-116 Volian.Base.Library This is a generic class for dealing with iTextSharp Fonts
 | |
| 	/// Code moved and consolidated from Volian.Print.Library Volian PDF.Library and VG
 | |
| 	/// </summary>
 | |
| 	public static class VlnItextFont
 | |
| 	{
 | |
| 		private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | |
| 		private static string _PromsFontDir = null;//B2019-099 Consistent Font Retrieve
 | |
| 		/// <summary>
 | |
| 		/// Register fonts based upon PromsFonts command line parameter
 | |
| 		/// </summary>
 | |
| 		public static void RegisterPromsFonts()
 | |
| 		{
 | |
| 			_PromsFontDir = Volian.Base.Library.VlnSettings.GetCommand("PromsFonts", "");
 | |
| 			if (_PromsFontDir != "")
 | |
| 			{
 | |
| 				DirectoryInfo di = new DirectoryInfo(_PromsFontDir);
 | |
| 				if (di.Exists)
 | |
| 				{
 | |
| 					_MyLog.WarnFormat("PROMS Font Folder = {0}", _PromsFontDir); // C2019-028 Add info in the error log
 | |
| 					iTextSharp.text.FontFactory.RegisterDirectory(_PromsFontDir);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		// B2019-174 created RegisterFontFolder so that we call at start of print() in PromsPrinter.cs
 | |
| 		//           this allows symbol characters to appear on the Auto Table Of Contents page
 | |
| 		public static void RegisterFontFolder()
 | |
| 		{
 | |
| 			if (_PromsFontDir == null || _PromsFontDir =="")//B2019-099 Consistent Font Retrieve
 | |
| 			{
 | |
| 				_PromsFontDir = Volian.Base.Library.VlnSettings.GetCommand("PromsFonts", "");
 | |
| 				if (_PromsFontDir == "")
 | |
| 					_PromsFontDir = FontFind.FontDir;
 | |
| 				else
 | |
| 				{
 | |
| 					DirectoryInfo di = new DirectoryInfo(_PromsFontDir);
 | |
| 					if (!di.Exists)
 | |
| 						_PromsFontDir = FontFind.FontDir;
 | |
| 					else
 | |
| 						_MyLog.WarnFormat("PROMS Font Folder = {0}", _PromsFontDir); // C2019-028 Add info in the error log
 | |
| 				}
 | |
| 			}
 | |
| 			int profileDepth1 = ProfileTimer.Push(">>>> RegisterDirectory " + _PromsFontDir);
 | |
| 			//_MyLog.DebugFormat("Register this Font Folder = {0}", _PromsFontDir); // debug
 | |
| 			iTextSharp.text.FontFactory.RegisterDirectory(_PromsFontDir);
 | |
| 			ProfileTimer.Pop(profileDepth1);
 | |
| 		}
 | |
| 		public static void RegisterFontByFontFolders(string fontName)
 | |
| 		{
 | |
| 			int profileDepth = ProfileTimer.Push(string.Format(">>>> RegisterFont {0}", fontName));
 | |
| 			if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
 | |
| 			{
 | |
| 				RegisterFontFolder();
 | |
| 				if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
 | |
| 				{
 | |
| 					//B2019-099 Consistent Font Retrieve
 | |
| 					_MyLog.WarnFormat("Problem with Font {0} in {1}", fontName, _PromsFontDir);
 | |
| 					if (_PromsFontDir != FontFind.FontDir)
 | |
| 					{
 | |
| 						int profileDepth2 = ProfileTimer.Push(">>>> RegisterDirectory " + FontFind.FontDir);
 | |
| 						//_MyLog.DebugFormat("Register this Font Folder = {0}", FontFind.FontDir); // debug
 | |
| 						iTextSharp.text.FontFactory.RegisterDirectory(FontFind.FontDir);
 | |
| 						ProfileTimer.Pop(profileDepth2);
 | |
| 						if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
 | |
| 						{
 | |
| 							_MyLog.WarnFormat("Problem with Font {0} in {1}", fontName, FontFind.FontDir);
 | |
| 							int profileDepth3 = ProfileTimer.Push(">>>> RegisterDirectories");
 | |
| 							iTextSharp.text.FontFactory.RegisterDirectories();
 | |
| 							ProfileTimer.Pop(profileDepth3);
 | |
| 						}
 | |
| 						//else
 | |
| 						//{
 | |
| 						//	_MyLog.DebugFormat("Registered Font {0} in {1}", fontName, FontFind.FontDir); // debug
 | |
| 						//}
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						int profileDepth4 = ProfileTimer.Push(">>>> RegisterDirectories");
 | |
| 						//_MyLog.DebugFormat("RegistererDirectories {0}", FontFind.FontDir); // debug
 | |
| 						iTextSharp.text.FontFactory.RegisterDirectories();
 | |
| 						ProfileTimer.Pop(profileDepth4);
 | |
| 					}
 | |
| 				}
 | |
| 				if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
 | |
| 				{
 | |
| 					_MyLog.WarnFormat("Font {0} could not be found!", fontName);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					iTextSharp.text.Font fnt = iTextSharp.text.FontFactory.GetFont(fontName, 10);
 | |
| 					if (fnt.BaseFont == null)
 | |
| 					{
 | |
| 						_MyLog.WarnFormat("Font {0} is not installed properly!", fontName);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			ProfileTimer.Pop(profileDepth);
 | |
| 		}
 | |
| 		private static RegistryKey _FontKey = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows NT").OpenSubKey("CurrentVersion").OpenSubKey("Fonts");
 | |
| 		public static RegistryKey FontKey
 | |
| 		{ get { return _FontKey; } }
 | |
| 		/// <summary>
 | |
| 		/// Try to register a particular font, if it fails register the entire font folder
 | |
| 		/// </summary>
 | |
| 		/// <param name="fontName">FontName - Used to find a font file.</param>
 | |
| 		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);
 | |
| 						try // B2019-118 Add error handling for FontFacory.Register (Windows Registry contains a node that
 | |
| 								// points to a file that no longer exists
 | |
| 						{
 | |
| 							FontFactory.Register(fontFile.Contains("\\") ? fontFile : FontFind.FontDir + "\\" + fontFile);
 | |
| 						}
 | |
| 						catch (Exception ex) // catch any exception and add the error to the error log.
 | |
| 						{
 | |
| 							_MyLog.WarnFormat("Font Error {0} - {1}", name, ex.Message);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				if (!FontFactory.IsRegistered(fontName))
 | |
| 					RegisterFontByFontFolders(fontName);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	public static class FontFind
 | |
| 	{
 | |
| 		private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | |
| 		private static string _FontDir = null;
 | |
| 		public static string FontDir
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if (_FontDir == null)
 | |
| 				{
 | |
| 					// B2019-112 Error Log Font Dir
 | |
| 					// C2019-028, B2019-099 Add call to .Net 4.6.1 method to get the system's windows font folder
 | |
| 					_FontDir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Fonts);
 | |
| 					if (_FontDir != null) _MyLog.WarnFormat("Special Font Folder = {0}", _FontDir); // C2019-028 Add info in the error log
 | |
| 					if (_FontDir == null)
 | |
| 					{
 | |
| 						RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders");
 | |
| 						if (regKey != null)
 | |
| 						{
 | |
| 							object obj = regKey.GetValue("Fonts");
 | |
| 							// B2019-099 Add more debug
 | |
| 							if (obj != null) _MyLog.WarnFormat("Font regkey.fonts = {0}", obj); // C2019-028 Add info in the error log
 | |
| 							// C2019-028 Add Null check before attempt to convert to string
 | |
| 							if (obj != null)
 | |
| 								_FontDir = obj.ToString();
 | |
| 						}
 | |
| 						if (_FontDir == null) // Not allowed or cannot find the fonts folder value in the registry.
 | |
| 						{
 | |
| 							_FontDir = @"C:\Windows\Fonts"; // default to C:\Windows\Fonts
 | |
| 							_MyLog.WarnFormat("FontDir set to default = {0}", _FontDir); // C2019-028 Add info in the error log
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				return _FontDir;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |