public CidFontFactory(IPdfTokenScanner pdfScanner, FontDescriptorFactory descriptorFactory, IFilterProvider filterProvider) { this.pdfScanner = pdfScanner; this.descriptorFactory = descriptorFactory; this.filterProvider = filterProvider; }
public ICidFont Generate(DictionaryToken dictionary) { var type = dictionary.GetNameOrDefault(NameToken.Type); if (!NameToken.Font.Equals(type)) { throw new InvalidFontFormatException($"Expected \'Font\' dictionary but found \'{type}\'"); } var widths = ReadWidths(dictionary); var defaultWidth = default(double?); if (dictionary.TryGet(NameToken.Dw, pdfScanner, out NumericToken defaultWidthToken)) { defaultWidth = defaultWidthToken.Double; } var verticalWritingMetrics = ReadVerticalDisplacements(dictionary); FontDescriptor descriptor = null; if (TryGetFontDescriptor(dictionary, out var descriptorDictionary)) { descriptor = FontDescriptorFactory.Generate(descriptorDictionary, pdfScanner); } var fontProgram = ReadDescriptorFile(descriptor); var baseFont = dictionary.GetNameOrDefault(NameToken.BaseFont); var systemInfo = GetSystemInfo(dictionary); var subType = dictionary.GetNameOrDefault(NameToken.Subtype); if (NameToken.CidFontType0.Equals(subType)) { return(new Type0CidFont(fontProgram, type, subType, baseFont, systemInfo, descriptor, verticalWritingMetrics, widths, defaultWidth)); } if (NameToken.CidFontType2.Equals(subType)) { var cidToGid = GetCharacterIdentifierToGlyphIndexMap(dictionary); return(new Type2CidFont(type, subType, baseFont, systemInfo, descriptor, fontProgram, verticalWritingMetrics, widths, defaultWidth, cidToGid)); } return(null); }