Пример #1
0
 public CidFontFactory(IPdfTokenScanner pdfScanner, FontDescriptorFactory descriptorFactory,
                       IFilterProvider filterProvider)
 {
     this.pdfScanner        = pdfScanner;
     this.descriptorFactory = descriptorFactory;
     this.filterProvider    = filterProvider;
 }
Пример #2
0
        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);
        }