public void ParseContent()
        {
            IList <PdfObject> args = new List <PdfObject>();
            var context            = new PsContext(_file, _page);

            while (_lexer.NextToken())
            {
                switch (_lexer.Token)
                {
                case Token.Ider:
                    ExecuteCommand(context, _lexer.StringValue, args);
                    args.Clear();
                    break;

                case Token.StartArray:
                    var arr = _lexer.ReadArray(null);
                    args.Add(arr);
                    break;

                default:
                    args.Add(_lexer.PlainPdfObject());
                    break;
                }
            }
        }
예제 #2
0
        public IEnumerable <Tuple <Int32, PdfObject> > ReadObjStream()
        {
            Dictionary <Int32, Int32> _refs = new Dictionary <Int32, Int32>();
            Boolean bVal      = false;
            Int32   nKey      = 0;
            Int32   _startPos = -1;

            while (_lexer.NextToken())
            {
                switch (_lexer.Token)
                {
                case Token.Number:
                    if (bVal)
                    {
                        _refs.Add(nKey, _lexer.IntValue);
                        bVal = false;
                    }
                    else
                    {
                        bVal = true;
                        nKey = _lexer.IntValue;
                    }
                    break;

                case Token.StartDictionary:
                case Token.StartArray:
                    if (_startPos == -1)
                    {
                        _startPos = _lexer.Position;
                    }
                    Int32     pos = _lexer.Position - _startPos;
                    PdfObject obj = null;
                    if (_lexer.Token == Token.StartDictionary)
                    {
                        obj = _lexer.ReadDictionary();
                    }
                    else if (_lexer.Token == Token.StartArray)
                    {
                        obj = _lexer.ReadArray(null);
                    }
                    var k = _refs.FirstOrDefault(kv => Math.Abs(kv.Value - pos) < 3);
                    if (k.Key != 0)
                    {
                        _refs.Remove(k.Key);
                        yield return(Tuple.Create(k.Key, obj));
                    }
                    if (_refs.Count == 0)
                    {
                        yield break;
                    }
                    break;
                }
            }
        }