예제 #1
0
        public void ColorspaceParserError()
        {
            var parser         = new CodespaceRangeParser();
            var byteArrayInput = new ByteArrayInputBytes(OtherEncodings.StringAsLatin1Bytes("1 begincodespacerange\nendcodespacerange"));
            var tokenScanner   = new CoreTokenScanner(byteArrayInput);

            Assert.True(tokenScanner.MoveNext());
            Assert.True(tokenScanner.CurrentToken is NumericToken);
            var numeric = (NumericToken)tokenScanner.CurrentToken;

            Assert.True(tokenScanner.MoveNext());
            Assert.True(tokenScanner.CurrentToken is OperatorToken);
            var opToken = (OperatorToken)tokenScanner.CurrentToken;

            Assert.Equal("begincodespacerange", opToken.Data);

            var cmapBuilder = new CharacterMapBuilder();

            parser.Parse(numeric, tokenScanner, cmapBuilder);

            Assert.Empty(cmapBuilder.CodespaceRanges);
        }
예제 #2
0
파일: CMapParser.cs 프로젝트: lulzzz/PdfPig
        public CMap Parse(IInputBytes inputBytes, bool isLenientParsing)
        {
            var scanner = new CoreTokenScanner(inputBytes);

            var builder = new CharacterMapBuilder();

            IToken previousToken = null;

            while (scanner.MoveNext())
            {
                var token = scanner.CurrentToken;

                if (token is OperatorToken operatorToken)
                {
                    switch (operatorToken.Data)
                    {
                    case "usecmap":
                    {
                        if (previousToken is NameToken name)
                        {
                            var external = ParseExternal(name.Data);

                            builder.UseCMap(external);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding external cmap call: " + previousToken);
                        }
                        break;
                    }

                    case "begincodespacerange":
                    {
                        if (previousToken is NumericToken numeric)
                        {
                            CodespaceRangeParser.Parse(numeric, scanner, builder, isLenientParsing);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding start of codespace range: " + previousToken);
                        }
                    }
                    break;

                    case "beginbfchar":
                    {
                        if (previousToken is NumericToken numeric)
                        {
                            BaseFontCharacterParser.Parse(numeric, scanner, builder, isLenientParsing);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding start of base font characters: " + previousToken);
                        }
                    }
                    break;

                    case "beginbfrange":
                    {
                        if (previousToken is NumericToken numeric)
                        {
                            BaseFontRangeParser.Parse(numeric, scanner, builder, isLenientParsing);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding start of base font character ranges: " + previousToken);
                        }
                    }
                    break;

                    case "begincidchar":
                    {
                        if (previousToken is NumericToken numeric)
                        {
                            CidCharacterParser.Parse(numeric, scanner, builder, isLenientParsing);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding start of Cid character mapping: " + previousToken);
                        }
                        break;
                    }

                    case "begincidrange":
                    {
                        if (previousToken is NumericToken numeric)
                        {
                            CidRangeParser.Parse(numeric, scanner, builder, isLenientParsing);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected token preceding start of Cid ranges: " + previousToken);
                        }
                    }
                    break;
                    }
                }
                else if (token is NameToken name)
                {
                    CidFontNameParser.Parse(name, scanner, builder, isLenientParsing);
                }

                previousToken = token;
            }

            return(builder.Build());
        }