Esempio n. 1
0
        public virtual void BoldTest()
        {
            FontProgram fp = FontProgramFactory.CreateFont(StandardFonts.HELVETICA);

            fp.SetBold(true);
            NUnit.Framework.Assert.IsTrue((fp.GetPdfFontFlags() & (1 << 18)) != 0, "Bold expected");
            fp.SetBold(false);
            NUnit.Framework.Assert.IsTrue((fp.GetPdfFontFlags() & (1 << 18)) == 0, "Not Bold expected");
        }
Esempio n. 2
0
        public void RegisterDirectoryType1Test()
        {
            FontProgramFactory.RegisterFontDirectory(iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext
                                                                                                   .CurrentContext.TestDirectory) + "/resources/itext/io/font/type1/");
            FontProgram computerModern = FontProgramFactory.CreateRegisteredFont("computer modern");
            FontProgram cmr10          = FontProgramFactory.CreateRegisteredFont("cmr10");

            NUnit.Framework.Assert.NotNull(computerModern);
            NUnit.Framework.Assert.NotNull(cmr10);
        }
Esempio n. 3
0
        internal static FontProgram SaveFont(FontProgram font, FontCacheKey key)
        {
            FontProgram fontFound = fontCache.Get(key);

            if (fontFound != null)
            {
                return(fontFound);
            }
            fontCache.Put(key, font);
            return(font);
        }
Esempio n. 4
0
        public static FontProgram GetFont(String fontName)
        {
            String      key  = GetFontCacheKey(fontName);
            FontProgram font = null;

            if (fontCache.ContainsKey(key))
            {
                font = fontCache.Get(key);
            }
            return(font);
        }
Esempio n. 5
0
        /// <exception cref="System.IO.IOException"/>
        protected internal virtual FontProgram GetFontProgram(String fontName, bool cached)
        {
            FontProgram fontProgram = null;

            fontName = fontNames.Get(fontName.ToLowerInvariant());
            if (fontName != null)
            {
                fontProgram = FontProgramFactory.CreateFont(fontName, cached);
            }
            return(fontProgram);
        }
Esempio n. 6
0
        /// <exception cref="System.IO.IOException"/>
        public OpenTypeParser(String name)
        {
            String nameBase = FontProgram.GetBaseName(name);
            String ttcName  = GetTTCName(nameBase);

            this.fileName = ttcName;
            if (ttcName.Length < nameBase.Length)
            {
                ttcIndex = System.Convert.ToInt32(nameBase.Substring(ttcName.Length + 1));
            }
            raf = new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateBestSource(fileName));
            Process();
        }
Esempio n. 7
0
        public static FontProgram SaveFont(FontProgram font, String fontName)
        {
            FontProgram fontFound = GetFont(fontName);

            if (fontFound != null)
            {
                return(fontFound);
            }
            String key = GetFontCacheKey(fontName);

            fontCache[key] = font;
            return(font);
        }
Esempio n. 8
0
        /// <summary>
        /// Creates a new True Type font from ttc file,
        /// <p/>
        /// The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
        /// </summary>
        /// <remarks>
        /// Creates a new True Type font from ttc file,
        /// <p/>
        /// The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
        /// If the <CODE>byte</CODE> arrays are present the font will be
        /// read from them instead of the name. A name is still required to identify
        /// the font type.
        /// <p/>
        /// Besides the common encodings described by name, custom encodings
        /// can also be made. These encodings will only work for the single byte fonts
        /// Type1 and TrueType. The encoding string starts with a '#'
        /// followed by "simple" or "full". If "simple" there is a decimal for the first character position and then a list
        /// of hex values representing the Unicode codes that compose that encoding.<br />
        /// The "simple" encoding is recommended for TrueType fonts
        /// as the "full" encoding risks not matching the character with the right glyph
        /// if not done with care.<br />
        /// The "full" encoding is specially aimed at Type1 fonts where the glyphs have to be
        /// described by non standard names like the Tex math fonts. Each group of three elements
        /// compose a code position: the one byte code order in decimal or as 'x' (x cannot be the space), the name and the Unicode character
        /// used to access the glyph. The space must be assigned to character position 32 otherwise
        /// text justification will not work.
        /// <p/>
        /// Example for a "simple" encoding that includes the Unicode
        /// character space, A, B and ecyrillic:
        /// <PRE>
        /// "# simple 32 0020 0041 0042 0454"
        /// </PRE>
        /// <p/>
        /// Example for a "full" encoding for a Type1 Tex font:
        /// <PRE>
        /// "# full 'A' nottriangeqlleft 0041 'B' dividemultiply 0042 32 space 0020"
        /// </PRE>
        /// </remarks>
        /// <param name="ttcPath">location  of true type collection file (*.ttc)</param>
        /// <param name="ttcIndex">the encoding to be applied to this font</param>
        /// <param name="cached">
        /// true if the font comes from the cache or is added to
        /// the cache if new, false if the font is always created new
        /// </param>
        /// <returns>
        /// returns a new font. This font may come from the cache but only if cached
        /// is true, otherwise it will always be created new
        /// </returns>
        /// <exception cref="System.IO.IOException"/>
        public static FontProgram CreateFont(String ttcPath, int ttcIndex, bool cached)
        {
            if (cached)
            {
                FontProgram fontFound = FontCache.GetFont(ttcPath + ttcIndex);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            FontProgram fontBuilt = new TrueTypeFont(ttcPath, ttcIndex);

            return(cached ? FontCache.SaveFont(fontBuilt, ttcPath + ttcIndex) : fontBuilt);
        }
        /// <summary>Creates a new TrueType font program from ttc (TrueType Collection) file bytes.</summary>
        /// <param name="ttc">the content of a TrueType Collection file (*.ttc)</param>
        /// <param name="ttcIndex">the index of the font file from the collection to be read</param>
        /// <param name="cached">
        /// true if the font comes from the cache or is added to
        /// the cache if new, false if the font is always created new
        /// </param>
        /// <returns>
        /// returns a new
        /// <see cref="FontProgram"/>
        /// instance. This font may come from the cache but only if cached
        /// is true, otherwise it will always be created new
        /// </returns>
        public static FontProgram CreateFont(byte[] ttc, int ttcIndex, bool cached)
        {
            FontCacheKey fontKey = FontCacheKey.Create(ttc, ttcIndex);

            if (cached)
            {
                FontProgram fontFound = FontCache.GetFont(fontKey);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            FontProgram fontBuilt = new TrueTypeFont(ttc, ttcIndex);

            return(cached ? FontCache.SaveFont(fontBuilt, fontKey) : fontBuilt);
        }
Esempio n. 10
0
        /// <exception cref="System.IO.IOException"/>
        public static FontProgram CreateFont(byte[] ttc, int ttcIndex, bool cached)
        {
            if (cached)
            {
                String      ttcNameKey = String.Format("{0}{1}", ArrayUtil.HashCode(ttc), ttcIndex);
                FontProgram fontFound  = FontCache.GetFont(ttcNameKey);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            FontProgram fontBuilt    = new TrueTypeFont(ttc, ttcIndex);
            String      ttcNameKey_1 = String.Format("{0}{1}", ArrayUtil.HashCode(ttc), ttcIndex);

            return(cached ? FontCache.SaveFont(fontBuilt, ttcNameKey_1) : fontBuilt);
        }
Esempio n. 11
0
        /// <exception cref="System.IO.IOException"/>
        public static FontProgram CreateFont(byte[] ttc, int ttcIndex, bool cached)
        {
            String fontKey = null;

            if (cached)
            {
                fontKey = iText.IO.Util.JavaUtil.IntegerToString(ArrayUtil.HashCode(ttc)) + iText.IO.Util.JavaUtil.IntegerToString
                              (ttcIndex);
                FontProgram fontFound = FontCache.GetFont(fontKey);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            FontProgram fontBuilt = new TrueTypeFont(ttc, ttcIndex);

            return(cached ? FontCache.SaveFont(fontBuilt, fontKey) : fontBuilt);
        }
Esempio n. 12
0
        /// <exception cref="System.IO.IOException"/>
        protected internal virtual FontProgram GetFontProgram(String fontName, bool cached)
        {
            FontProgram fontProgram = null;

            fontName = fontNames.Get(fontName.ToLower(System.Globalization.CultureInfo.InvariantCulture));
            // the font is not registered as truetype font
            if (fontName != null)
            {
                fontProgram = FontProgramFactory.CreateFont(fontName, cached);
            }
            if (fontProgram == null)
            {
                try {
                    // the font is a type 1 font or CJK font
                    fontProgram = FontProgramFactory.CreateFont(fontName, cached);
                }
                catch (iText.IO.IOException) {
                }
            }
            return(fontProgram);
        }
Esempio n. 13
0
 public static FontProgram SaveFont(FontProgram font, String fontName)
 {
     return(SaveFont(font, FontCacheKey.Create(fontName)));
 }
        public static FontProgramDescriptor FetchDescriptor(String fontName)
        {
            if (fontName == null || fontName.Length == 0)
            {
                return(null);
            }
            String baseName = FontProgram.TrimFontStyle(fontName);
            //yes, we trying to find built-in standard font with original name, not baseName.
            bool isBuiltinFonts14 = StandardFonts.IsStandardFont(fontName);
            bool isCidFont        = !isBuiltinFonts14 && FontCache.IsPredefinedCidFont(baseName);
            FontProgramDescriptor fontDescriptor = null;

            if (FETCH_CACHED_FIRST)
            {
                fontDescriptor = FetchCachedDescriptor(fontName, null);
                if (fontDescriptor != null)
                {
                    return(fontDescriptor);
                }
            }
            try {
                String fontNameLowerCase = baseName.ToLowerInvariant();
                if (isBuiltinFonts14 || fontNameLowerCase.EndsWith(".afm") || fontNameLowerCase.EndsWith(".pfm"))
                {
                    fontDescriptor = FetchType1FontDescriptor(fontName, null);
                }
                else
                {
                    if (isCidFont)
                    {
                        fontDescriptor = FetchCidFontDescriptor(fontName);
                    }
                    else
                    {
                        if (fontNameLowerCase.EndsWith(".ttf") || fontNameLowerCase.EndsWith(".otf"))
                        {
                            fontDescriptor = FetchTrueTypeFontDescriptor(fontName);
                        }
                        else
                        {
                            if (fontNameLowerCase.EndsWith(".woff") || fontNameLowerCase.EndsWith(".woff2"))
                            {
                                byte[] fontProgram;
                                if (fontNameLowerCase.EndsWith(".woff"))
                                {
                                    fontProgram = WoffConverter.Convert(FontProgramFactory.ReadFontBytesFromPath(baseName));
                                }
                                else
                                {
                                    fontProgram = Woff2Converter.Convert(FontProgramFactory.ReadFontBytesFromPath(baseName));
                                }
                                fontDescriptor = FetchTrueTypeFontDescriptor(fontProgram);
                            }
                            else
                            {
                                fontDescriptor = FetchTTCDescriptor(baseName);
                            }
                        }
                    }
                }
            }
            catch (Exception) {
                fontDescriptor = null;
            }
            return(fontDescriptor);
        }
 private static FontProgramDescriptor FetchDescriptorFromFontProgram(FontProgram fontProgram)
 {
     return(new FontProgramDescriptor(fontProgram.GetFontNames(), fontProgram.GetFontMetrics()));
 }
 public static FontProgramDescriptor FetchDescriptor(FontProgram fontProgram)
 {
     return(FetchDescriptorFromFontProgram(fontProgram));
 }
        private static FontProgram CreateFont(String name, byte[] fontProgram, bool cached)
        {
            String baseName = FontProgram.TrimFontStyle(name);
            //yes, we trying to find built-in standard font with original name, not baseName.
            bool         isBuiltinFonts14 = StandardFonts.IsStandardFont(name);
            bool         isCidFont        = !isBuiltinFonts14 && FontCache.IsPredefinedCidFont(baseName);
            FontProgram  fontFound;
            FontCacheKey fontKey = null;

            if (cached)
            {
                fontKey   = CreateFontCacheKey(name, fontProgram);
                fontFound = FontCache.GetFont(fontKey);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            FontProgram fontBuilt = null;

            if (name == null)
            {
                if (fontProgram != null)
                {
                    try {
                        if (WoffConverter.IsWoffFont(fontProgram))
                        {
                            fontProgram = WoffConverter.Convert(fontProgram);
                        }
                        else
                        {
                            if (Woff2Converter.IsWoff2Font(fontProgram))
                            {
                                fontProgram = Woff2Converter.Convert(fontProgram);
                            }
                        }
                        fontBuilt = new TrueTypeFont(fontProgram);
                    }
                    catch (Exception) {
                    }
                    if (fontBuilt == null)
                    {
                        try {
                            fontBuilt = new Type1Font(null, null, fontProgram, null);
                        }
                        catch (Exception) {
                        }
                    }
                }
            }
            else
            {
                String fontFileExtension   = null;
                int    extensionBeginIndex = baseName.LastIndexOf('.');
                if (extensionBeginIndex > 0)
                {
                    fontFileExtension = baseName.Substring(extensionBeginIndex).ToLowerInvariant();
                }
                if (isBuiltinFonts14 || ".afm".Equals(fontFileExtension) || ".pfm".Equals(fontFileExtension))
                {
                    fontBuilt = new Type1Font(name, null, null, null);
                }
                else
                {
                    if (isCidFont)
                    {
                        fontBuilt = new CidFont(name, FontCache.GetCompatibleCmaps(baseName));
                    }
                    else
                    {
                        if (".ttf".Equals(fontFileExtension) || ".otf".Equals(fontFileExtension))
                        {
                            if (fontProgram != null)
                            {
                                fontBuilt = new TrueTypeFont(fontProgram);
                            }
                            else
                            {
                                fontBuilt = new TrueTypeFont(name);
                            }
                        }
                        else
                        {
                            if (".woff".Equals(fontFileExtension) || ".woff2".Equals(fontFileExtension))
                            {
                                if (fontProgram == null)
                                {
                                    fontProgram = ReadFontBytesFromPath(baseName);
                                }
                                if (".woff".Equals(fontFileExtension))
                                {
                                    try {
                                        fontProgram = WoffConverter.Convert(fontProgram);
                                    }
                                    catch (ArgumentException woffException) {
                                        throw new iText.IO.IOException(iText.IO.IOException.InvalidWoffFile, woffException);
                                    }
                                }
                                else
                                {
                                    // ".woff2".equals(fontFileExtension)
                                    try {
                                        fontProgram = Woff2Converter.Convert(fontProgram);
                                    }
                                    catch (FontCompressionException woff2Exception) {
                                        throw new iText.IO.IOException(iText.IO.IOException.InvalidWoff2File, woff2Exception);
                                    }
                                }
                                fontBuilt = new TrueTypeFont(fontProgram);
                            }
                            else
                            {
                                int ttcSplit = baseName.ToLowerInvariant().IndexOf(".ttc,", StringComparison.Ordinal);
                                if (ttcSplit > 0)
                                {
                                    try {
                                        // count(.ttc) = 4
                                        String ttcName = baseName.JSubstring(0, ttcSplit + 4);
                                        // count(.ttc,) = 5)
                                        int ttcIndex = Convert.ToInt32(baseName.Substring(ttcSplit + 5));
                                        fontBuilt = new TrueTypeFont(ttcName, ttcIndex);
                                    }
                                    catch (FormatException nfe) {
                                        throw new iText.IO.IOException(nfe.Message, nfe);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (fontBuilt == null)
            {
                if (name != null)
                {
                    throw new iText.IO.IOException(iText.IO.IOException.TypeOfFont1IsNotRecognized).SetMessageParams(name);
                }
                else
                {
                    throw new iText.IO.IOException(iText.IO.IOException.TypeOfFontIsNotRecognized);
                }
            }
            return(cached ? FontCache.SaveFont(fontBuilt, fontKey) : fontBuilt);
        }
Esempio n. 18
0
 /// <summary>Register a font file and use an alias for the font contained in it.</summary>
 /// <param name="path">the path to a font file</param>
 /// <param name="alias">the alias you want to use for the font</param>
 internal virtual void RegisterFont(String path, String alias)
 {
     try {
         if (path.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || path.ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                                              ).EndsWith(".otf") || path.ToLower(System.Globalization.CultureInfo.InvariantCulture).IndexOf(".ttc,")
             > 0)
         {
             FontProgram fontProgram = FontProgramFactory.CreateFont(path);
             Object[]    allNames    = new Object[] { fontProgram.GetFontNames().GetFontName(), fontProgram.GetFontNames().GetFamilyName
                                                          (), fontProgram.GetFontNames().GetFullName() };
             fontNames[((String)allNames[0]).ToLower(System.Globalization.CultureInfo.InvariantCulture)] = path;
             if (alias != null)
             {
                 String lcAlias = alias.ToLower(System.Globalization.CultureInfo.InvariantCulture);
                 fontNames[lcAlias] = path;
                 if (lcAlias.EndsWith("regular"))
                 {
                     //do this job to give higher priority to regular fonts in comparison with light, narrow, etc
                     SaveCopyOfRegularFont(lcAlias, path);
                 }
             }
             // register all the font names with all the locales
             String[][] names = (String[][])allNames[2];
             //full name
             foreach (String[] name in names)
             {
                 String lcName = name[3].ToLower(System.Globalization.CultureInfo.InvariantCulture);
                 fontNames[lcName] = path;
                 if (lcName.EndsWith("regular"))
                 {
                     //do this job to give higher priority to regular fonts in comparison with light, narrow, etc
                     SaveCopyOfRegularFont(lcName, path);
                 }
             }
             String fullName;
             String familyName = null;
             names = (String[][])allNames[1];
             //family name
             for (int k = 0; k < TTFamilyOrder.Length; k += 3)
             {
                 foreach (String[] name_1 in names)
                 {
                     if (TTFamilyOrder[k].Equals(name_1[0]) && TTFamilyOrder[k + 1].Equals(name_1[1]) && TTFamilyOrder[k + 2].Equals
                             (name_1[2]))
                     {
                         familyName = name_1[3].ToLower(System.Globalization.CultureInfo.InvariantCulture);
                         k          = TTFamilyOrder.Length;
                         break;
                     }
                 }
             }
             if (familyName != null)
             {
                 String lastName = "";
                 names = (String[][])allNames[2];
                 //full name
                 foreach (String[] name_1 in names)
                 {
                     for (int k_1 = 0; k_1 < TTFamilyOrder.Length; k_1 += 3)
                     {
                         if (TTFamilyOrder[k_1].Equals(name_1[0]) && TTFamilyOrder[k_1 + 1].Equals(name_1[1]) && TTFamilyOrder[k_1
                                                                                                                               + 2].Equals(name_1[2]))
                         {
                             fullName = name_1[3];
                             if (fullName.Equals(lastName))
                             {
                                 continue;
                             }
                             lastName = fullName;
                             RegisterFontFamily(familyName, fullName, null);
                             break;
                         }
                     }
                 }
             }
         }
         else
         {
             if (path.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttc"))
             {
                 TrueTypeCollection ttc = new TrueTypeCollection(path);
                 for (int i = 0; i < ttc.GetTTCSize(); i++)
                 {
                     String fullPath = path + "," + i;
                     if (alias != null)
                     {
                         RegisterFont(fullPath, alias + "," + i);
                     }
                     else
                     {
                         RegisterFont(fullPath);
                     }
                 }
             }
             else
             {
                 if (path.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".afm") || path.ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                                                      ).EndsWith(".pfm"))
                 {
                     FontProgram fontProgram = FontProgramFactory.CreateFont(path);
                     String      fullName    = fontProgram.GetFontNames().GetFullName()[0][3].ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                                      );
                     String familyName = fontProgram.GetFontNames().GetFamilyName()[0][3].ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                                  );
                     String psName = fontProgram.GetFontNames().GetFontName().ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                      );
                     RegisterFontFamily(familyName, fullName, null);
                     fontNames[psName]   = path;
                     fontNames[fullName] = path;
                 }
             }
         }
         LOGGER.Trace(String.Format("Registered {0}", path));
     }
     catch (System.IO.IOException e) {
         throw new iText.IO.IOException(e);
     }
 }
Esempio n. 19
0
        /// <summary>Creates a new font.</summary>
        /// <remarks>
        /// Creates a new font. This font can be one of the 14 built in types,
        /// a Type1 font referred to by an AFM or PFM file, a TrueType font (simple or collection) or a CJK font from the
        /// Adobe Asian Font Pack. TrueType fonts and CJK fonts can have an optional style modifier
        /// appended to the name. These modifiers are: Bold, Italic and BoldItalic. An
        /// example would be "STSong-Light,Bold". Note that this modifiers do not work if
        /// the font is embedded. Fonts in TrueType collections are addressed by index such as "msgothic.ttc,1".
        /// This would get the second font (indexes start at 0), in this case "MS PGothic".
        /// <p/>
        /// The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
        /// If the <CODE>byte</CODE> arrays are present the font will be
        /// read from them instead of the name. A name is still required to identify
        /// the font type.
        /// <p/>
        /// Besides the common encodings described by name, custom encodings
        /// can also be made. These encodings will only work for the single byte fonts
        /// Type1 and TrueType. The encoding string starts with a '#'
        /// followed by "simple" or "full". If "simple" there is a decimal for the first character position and then a list
        /// of hex values representing the Unicode codes that compose that encoding.<br />
        /// The "simple" encoding is recommended for TrueType fonts
        /// as the "full" encoding risks not matching the character with the right glyph
        /// if not done with care.<br />
        /// The "full" encoding is specially aimed at Type1 fonts where the glyphs have to be
        /// described by non standard names like the Tex math fonts. Each group of three elements
        /// compose a code position: the one byte code order in decimal or as 'x' (x cannot be the space), the name and the Unicode character
        /// used to access the glyph. The space must be assigned to character position 32 otherwise
        /// text justification will not work.
        /// <p/>
        /// Example for a "simple" encoding that includes the Unicode
        /// character space, A, B and ecyrillic:
        /// <PRE>
        /// "# simple 32 0020 0041 0042 0454"
        /// </PRE>
        /// <p/>
        /// Example for a "full" encoding for a Type1 Tex font:
        /// <PRE>
        /// "# full 'A' nottriangeqlleft 0041 'B' dividemultiply 0042 32 space 0020"
        /// </PRE>
        /// </remarks>
        /// <param name="name">the name of the font or its location on file</param>
        /// <param name="font">the true type font or the afm in a byte array</param>
        /// <param name="cached">
        /// true if the font comes from the cache or is added to
        /// the cache if new, false if the font is always created new
        /// </param>
        /// <returns>
        /// returns a new font. This font may come from the cache but only if cached
        /// is true, otherwise it will always be created new
        /// </returns>
        /// <exception cref="System.IO.IOException"/>
        public static FontProgram CreateFont(String name, byte[] font, bool cached)
        {
            String baseName = FontProgram.GetBaseName(name);
            //yes, we trying to find built-in standard font with original name, not baseName.
            bool        isBuiltinFonts14 = FontConstants.BUILTIN_FONTS_14.Contains(name);
            bool        isCidFont        = !isBuiltinFonts14 && FontCache.IsPredefinedCidFont(baseName);
            FontProgram fontFound;

            if (cached && name != null)
            {
                fontFound = FontCache.GetFont(name);
                if (fontFound != null)
                {
                    return(fontFound);
                }
            }
            if (name == null)
            {
                if (font != null)
                {
                    try {
                        return(new TrueTypeFont(font));
                    }
                    catch (Exception) {
                    }
                    try {
                        return(new Type1Font(null, null, font, null));
                    }
                    catch (Exception) {
                    }
                }
                throw new iText.IO.IOException(iText.IO.IOException.FontIsNotRecognized);
            }
            FontProgram fontBuilt;

            if (isBuiltinFonts14 || name.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".afm") ||
                name.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".pfm"))
            {
                fontBuilt = new Type1Font(name, null, font, null);
            }
            else
            {
                if (baseName.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || baseName.ToLower
                        (System.Globalization.CultureInfo.InvariantCulture).EndsWith(".otf") || baseName.ToLower(System.Globalization.CultureInfo.InvariantCulture
                                                                                                                 ).IndexOf(".ttc,") > 0)
                {
                    if (font != null)
                    {
                        fontBuilt = new TrueTypeFont(font);
                    }
                    else
                    {
                        fontBuilt = new TrueTypeFont(name);
                    }
                }
                else
                {
                    if (isCidFont)
                    {
                        fontBuilt = new CidFont(name, FontCache.GetCompatibleCmaps(baseName));
                    }
                    else
                    {
                        throw new iText.IO.IOException(iText.IO.IOException.Font1IsNotRecognized).SetMessageParams(name);
                    }
                }
            }
            return(cached ? FontCache.SaveFont(fontBuilt, name) : fontBuilt);
        }