예제 #1
0
        internal PdfTrueTypeFont(PdfDirectObject baseObject)
            : base(baseObject)
        {
            TrueTypeFont ttfFont       = null;
            bool         fontIsDamaged = false;

            if (FontDescriptor != null)
            {
                var fd        = base.FontDescriptor;
                var ff2Stream = fd.FontFile2;
                if (ff2Stream != null)
                {
                    try
                    {
                        // embedded
                        TTFParser ttfParser = new TTFParser(true);
                        ttfFont = ttfParser.Parse(ff2Stream.BaseDataObject.ExtractBody(true));
                    }
                    catch (IOException e)
                    {
                        Debug.WriteLine($"warn: Could not read embedded TTF for font {BaseFont} {e}");
                        fontIsDamaged = true;
                    }
                }
            }
            isEmbedded = ttfFont != null;
            isDamaged  = fontIsDamaged;

            // substitute
            if (ttfFont == null)
            {
                FontMapping <TrueTypeFont> mapping = FontMappers.Instance.GetTrueTypeFont(BaseFont, FontDescriptor);
                ttfFont = mapping.Font;

                if (mapping.IsFallback)
                {
                    Debug.WriteLine($"warn: Using fallback font '{ttfFont}' for '{BaseFont}'");
                }
            }
            ttf = ttfFont;
            ReadEncoding();
        }
예제 #2
0
        public FontMapperImpl()
        {
            // substitutes for standard 14 fonts
            substitutes.Add("Courier", new List <string> {
                "CourierNew", "CourierNewPSMT", "LiberationMono", "NimbusMonL-Regu"
            });
            substitutes.Add("Courier-Bold", new List <string> {
                "CourierNewPS-BoldMT", "CourierNew-Bold", "LiberationMono-Bold", "NimbusMonL-Bold"
            });
            substitutes.Add("Courier-Oblique", new List <string> {
                "CourierNewPS-ItalicMT", "CourierNew-Italic", "LiberationMono-Italic", "NimbusMonL-ReguObli"
            });
            substitutes.Add("Courier-BoldOblique", new List <string> {
                "CourierNewPS-BoldItalicMT", "CourierNew-BoldItalic", "LiberationMono-BoldItalic", "NimbusMonL-BoldObli"
            });
            substitutes.Add("Helvetica", new List <string> {
                "ArialMT", "Arial", "LiberationSans", "NimbusSanL-Regu"
            });
            substitutes.Add("Helvetica-Bold", new List <string> {
                "Arial-BoldMT", "Arial-Bold", "LiberationSans-Bold", "NimbusSanL-Bold"
            });
            substitutes.Add("Helvetica-Oblique", new List <string> {
                "Arial-ItalicMT", "Arial-Italic", "Helvetica-Italic", "LiberationSans-Italic", "NimbusSanL-ReguItal"
            });
            substitutes.Add("Helvetica-BoldOblique", new List <string> {
                "Arial-BoldItalicMT", "Helvetica-BoldItalic", "LiberationSans-BoldItalic", "NimbusSanL-BoldItal"
            });
            substitutes.Add("Times-Roman", new List <string> {
                "TimesNewRomanPSMT", "TimesNewRoman", "TimesNewRomanPS", "LiberationSerif", "NimbusRomNo9L-Regu"
            });
            substitutes.Add("Times-Bold", new List <string> {
                "TimesNewRomanPS-BoldMT", "TimesNewRomanPS-Bold", "TimesNewRoman-Bold", "LiberationSerif-Bold", "NimbusRomNo9L-Medi"
            });
            substitutes.Add("Times-Italic", new List <string> {
                "TimesNewRomanPS-ItalicMT", "TimesNewRomanPS-Italic", "TimesNewRoman-Italic", "LiberationSerif-Italic", "NimbusRomNo9L-ReguItal"
            });
            substitutes.Add("Times-BoldItalic", new List <string> {
                "TimesNewRomanPS-BoldItalicMT", "TimesNewRomanPS-BoldItalic", "TimesNewRoman-BoldItalic", "LiberationSerif-BoldItalic", "NimbusRomNo9L-MediItal"
            });
            substitutes.Add("Symbol", new List <string> {
                "Symbol", "SymbolMT", "StandardSymL"
            });
            substitutes.Add("ZapfDingbats", new List <string> {
                "ZapfDingbatsITCbyBT-Regular", "ZapfDingbatsITC", "Dingbats", "MS-Gothic"
            });

            // Acrobat also uses alternative names for Standard 14 fonts, which we map to those above
            // these include names such as "Arial" and "TimesNewRoman"
            foreach (string baseName in Standard14Fonts.Names)
            {
                if (!substitutes.ContainsKey(baseName))
                {
                    string mappedName = Standard14Fonts.GetMappedFontName(baseName);
                    substitutes.Add(baseName, CopySubstitutes(mappedName));
                }
            }

            // -------------------------

            try
            {
                string ttfName   = "fonts.ttf.LiberationSans-Regular";
                var    ttfStream = typeof(IFontMapper).Assembly.GetManifestResourceStream(ttfName);
                if (ttfStream == null)
                {
                    throw new IOException("Error loading resource: " + ttfName);
                }
                TTFParser ttfParser = new TTFParser();
                lastResortFont = ttfParser.Parse(ttfStream);
            }
            catch (IOException e)
            {
                throw new Exception("Load LiberationSans", e);
            }
        }