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(); }
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); } }