예제 #1
0
        public static int[] GetWidthArray(StandardFonts font)
        {
            switch (font)
            {
            case StandardFonts.Courier:
            case StandardFonts.CourierOblique:
            case StandardFonts.CourierBold:
            case StandardFonts.CourierBoldOblique:
                return(Courier);

            case StandardFonts.Helvetica:
            case StandardFonts.HelveticaOblique:
                return(Helvetica);

            case StandardFonts.HelveticaBold:
            case StandardFonts.HelveticaBoldOblique:
                return(HelveticaBold);

            case StandardFonts.Symbol:
                return(Symbol);

            case StandardFonts.Times:
                return(Times);

            case StandardFonts.TimesBold:
                return(TimesBold);

            case StandardFonts.TimesBoldItalic:
                return(TimesBoldItalic);

            case StandardFonts.TimesItalic:
                return(TimesItalic);

            case StandardFonts.ZapfDingbats:
                return(ZapfDingbats);
            }
            return(null);
        }
        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);
        }
예제 #3
0
 /// <exception cref="System.IO.IOException"/>
 public virtual RandomAccessFileOrArray GetMetricsFile()
 {
     isBuiltInFont = false;
     if (StandardFonts.IsStandardFont(afmPath))
     {
         isBuiltInFont = true;
         byte[] buf      = new byte[1024];
         Stream resource = null;
         try {
             String resourcePath = FontResources.AFMS + afmPath + ".afm";
             resource = ResourceUtil.GetResourceStream(resourcePath);
             if (resource == null)
             {
                 throw new iText.IO.IOException("{0} was not found as resource.").SetMessageParams(resourcePath);
             }
             MemoryStream stream = new MemoryStream();
             int          read;
             while ((read = resource.Read(buf)) >= 0)
             {
                 stream.Write(buf, 0, read);
             }
             buf = stream.ToArray();
         }
         finally {
             if (resource != null)
             {
                 try {
                     resource.Dispose();
                 }
                 catch (Exception) {
                 }
             }
         }
         return(new RandomAccessFileOrArray(sourceFactory.CreateSource(buf)));
     }
     else
     {
         if (afmPath != null)
         {
             if (afmPath.ToLowerInvariant().EndsWith(".afm"))
             {
                 return(new RandomAccessFileOrArray(sourceFactory.CreateBestSource(afmPath)));
             }
             else
             {
                 if (afmPath.ToLowerInvariant().EndsWith(".pfm"))
                 {
                     MemoryStream            ba = new MemoryStream();
                     RandomAccessFileOrArray rf = new RandomAccessFileOrArray(sourceFactory.CreateBestSource(afmPath));
                     Pfm2afm.Convert(rf, ba);
                     rf.Close();
                     return(new RandomAccessFileOrArray(sourceFactory.CreateSource(ba.ToArray())));
                 }
                 else
                 {
                     throw new iText.IO.IOException(iText.IO.IOException._1IsNotAnAfmOrPfmFontFile).SetMessageParams(afmPath);
                 }
             }
         }
         else
         {
             if (afmData != null)
             {
                 RandomAccessFileOrArray rf = new RandomAccessFileOrArray(sourceFactory.CreateSource(afmData));
                 if (IsAfmFile(rf))
                 {
                     return(rf);
                 }
                 else
                 {
                     MemoryStream ba = new MemoryStream();
                     try {
                         Pfm2afm.Convert(rf, ba);
                     }
                     catch (Exception) {
                         throw new iText.IO.IOException("Invalid afm or pfm font file.");
                     }
                     finally {
                         rf.Close();
                     }
                     return(new RandomAccessFileOrArray(sourceFactory.CreateSource(ba.ToArray())));
                 }
             }
             else
             {
                 throw new iText.IO.IOException("Invalid afm or pfm font file.");
             }
         }
     }
 }
예제 #4
0
        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);
        }
예제 #5
0
        private bool isStandardFont(out StandardFonts fontType)
        {
            string name = Name.ToLower();

            if (name.Contains("symbol"))
            {
                fontType = StandardFonts.Symbol;
                return(true);
            }
            else if (name.Contains("zapfdingbats"))
            {
                fontType = StandardFonts.ZapfDingbats;
                return(true);
            }

            bool bold   = name.Contains("bold");
            bool italic = false;

            if (name.Contains("oblique") || name.Contains("italic"))
            {
                italic = true;
            }

            if (name.Contains("courier"))
            {
                if (bold && italic)
                {
                    fontType = StandardFonts.CourierBoldOblique;
                    return(true);
                }
                if (bold)
                {
                    fontType = StandardFonts.CourierBold;
                    return(true);
                }
                if (italic)
                {
                    fontType = StandardFonts.CourierOblique;
                    return(true);
                }
                fontType = StandardFonts.Courier;
                return(true);
            }
            else if (name.Contains("helvetica"))
            {
                if (bold && italic)
                {
                    fontType = StandardFonts.HelveticaBoldOblique;
                    return(true);
                }
                if (bold)
                {
                    fontType = StandardFonts.HelveticaBold;
                    return(true);
                }
                if (italic)
                {
                    fontType = StandardFonts.HelveticaOblique;
                    return(true);
                }
                fontType = StandardFonts.Helvetica;
                return(true);
            }
            else if (name.Contains("times"))
            {
                if (bold && italic)
                {
                    fontType = StandardFonts.TimesBoldItalic;
                    return(true);
                }
                if (bold)
                {
                    fontType = StandardFonts.TimesBold;
                    return(true);
                }
                if (italic)
                {
                    fontType = StandardFonts.TimesItalic;
                    return(true);
                }
                fontType = StandardFonts.Times;
                return(true);
            }
            fontType = StandardFonts.Helvetica;
            return(false);
        }
예제 #6
0
 /// <summary>
 /// Initializes a new instance of the standard font with specified properties.
 /// </summary>
 /// <param name="standardFont">The Bytescout.PDF.StandardFonts value that specifies the standard font.</param>
 /// <param name="emSize" href="http://msdn.microsoft.com/en-us/library/system.single.aspx">The em-size, in points, of the font.</param>
 public Font(StandardFonts standardFont, float emSize)
     : this(standardFont, emSize, false, false)
 {
 }
예제 #7
0
 public static int GetWidth(byte ch, StandardFonts font)
 {
     int[] widths = GetWidthArray(font);
     return(widths[ch - 32]);
 }