diff --git a/PROMS/Volian.Base.Library/VlnItextSharpFont.cs b/PROMS/Volian.Base.Library/VlnItextSharpFont.cs
new file mode 100644
index 00000000..bf1772e8
--- /dev/null
+++ b/PROMS/Volian.Base.Library/VlnItextSharpFont.cs
@@ -0,0 +1,160 @@
+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
+{
+ ///
+ /// 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
+ ///
+ 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
+ ///
+ /// Register fonts based upon PromsFonts command line parameter
+ ///
+ 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);
+ }
+ }
+ }
+ public static void RegisterFontByFontFolders(string fontName)
+ {
+ int profileDepth = ProfileTimer.Push(string.Format(">>>> RegisterFont {0}", fontName));
+ if (!iTextSharp.text.FontFactory.IsRegistered(fontName))
+ {
+ if (_PromsFontDir == null)//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);
+ iTextSharp.text.FontFactory.RegisterDirectory(_PromsFontDir);
+ ProfileTimer.Pop(profileDepth1);
+ 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);
+ 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
+ {
+ int profileDepth4 = ProfileTimer.Push(">>>> RegisterDirectories");
+ 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; } }
+ ///
+ /// Try to register a particular font, if it fails register the entire font folder
+ ///
+ /// FontName - Used to find a font file.
+ 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 : FontFind.FontDir + "\\" + fontFile);
+ }
+ }
+ 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;
+ }
+ }
+ }
+}