Пример #1
0
        internal Dictionary <int, PdfFileObject> LoadObjects(Stream s)
        {
            s.Seek(0, SeekOrigin.Begin);
            Dictionary <int, PdfFileObject> objects = new Dictionary <int, PdfFileObject>();
            int           c = 0, objIDCandidate = 0, streamLengthCandidate = -1;
            long          streamPositionCandidate = -2;
            long          addressCandidate = -1, step = 0, position = 0;
            ObjectAddress oa = null;

            while ((c = s.ReadByte()) != -1)
            {
                switch (step)
                {
                case 0:
                    if (oa != null)
                    {
                        if (c == ' ' || c == '\r' || c == '\n')
                        {
                            oa.Length++;
                        }
                        else
                        {
                            PdfFileObject pfo = oa.CreateFileObject(this);
                            if (pfo.OriginalObjectAbsolutePosition == this.startxref)
                            {
                                this.trailer = pfo;
                            }

                            objects[oa.ObjID] = pfo;
                            this.inputStream.Seek(position + 1, SeekOrigin.Begin);
                            oa = null;
                            streamPositionCandidate = -2;
                            streamLengthCandidate   = -1;
                        }
                    }
                    if (c > 48 && c < 58)
                    {
                        addressCandidate = position;
                        objIDCandidate   = c - 48;
                        step             = 1;
                    }
                    break;

                case 1:
                    if (c > 47 && c < 58)
                    {
                        objIDCandidate = objIDCandidate * 10 + c - 48;
                    }
                    else
                    {
                        step = (c == ' ') ? 2 : 0;
                    }
                    break;

                case 2:
                    step = (c == '0') ? 3 : 0;
                    break;

                case 3:
                    step = (c == ' ') ? 4 : 0;
                    break;

                case 4:
                    step = (c == 'o') ? 5 : 0;
                    break;

                case 5:
                    step = (c == 'b') ? 6 : 0;
                    break;

                case 6:
                    if (c == 'j')
                    {
                        step = 7;
                    }
                    else
                    {
                        step = 0;
                    }
                    break;

                case 7:

                    if (objIDCandidate != lastObjID)
                    {
                        lastObjID = objIDCandidate;
                    }

                    if (objIDCandidate == 8)
                    {
                        if (c == '>')
                        {
                        }
                    }

                    if (c == 'e')
                    {
                        // possible beginning of stream
                        step = 29;
                    }
                    if (c == 's')
                    {
                        step = 9;
                        break;
                    }
                    break;

                case 8:
                    if (c == 's')
                    {
                        step++;
                        break;
                    }
                    if (c == 'e')
                    {
                        step = 29;
                        break;
                    }
                    if (c == '\r' || c == '\n' || c == ' ')
                    {
                        break;
                    }
                    step = 7;
                    break;

                case 9:
                    step = (c == 't') ? 10 : 7;
                    break;

                case 10:
                    step = (c == 'r') ? 11 : 7;
                    break;

                case 11:
                    step = (c == 'e') ? 12 : 7;
                    break;

                case 12:
                    step = (c == 'a') ? 13 : 7;
                    break;

                case 13:
                    step = (c == 'm') ? 14 : 7;
                    break;

                case 14:
                    step = (c == '\r' || c == '\n' || c == ' ') ? 15 : 7;
                    break;

                case 15:
                    if (c == '\r' || c == '\n' || c == ' ')
                    {
                    }
                    else
                    {
                        step++;
                        streamPositionCandidate = position;
                    }
                    break;

                case 16:
                    if (c == 'e')
                    {
                        step++;
                        break;
                    }

                    streamLengthCandidate = (int)(position - streamPositionCandidate + 1);
                    break;

                case 17:
                    step = (c == 'n') ? 18 : 16;
                    break;

                case 18:
                    step = (c == 'd') ? 19 : 16;
                    break;

                case 19:
                    if (c == 'o')
                    {
                        step = 32;
                        break;
                    }
                    if (c == 's')
                    {
                        step = 20;
                        break;
                    }
                    step = 16;
                    break;

                case 20:
                    step = (c == 't') ? 21 : 16;
                    break;

                case 21:
                    step = (c == 'r') ? 22 : 16;
                    break;

                case 22:
                    step = (c == 'e') ? 23 : 16;
                    break;

                case 23:
                    step = (c == 'a') ? 24 : 16;
                    break;

                case 24:
                    step = (c == 'm') ? 25 : 16;
                    break;

                case 25:
                    step = (c == '\r' || c == '\n' || c == ' ') ? 28 : 16;
                    break;


                case 28:
                    step = (c == 'e') ? 29 : 7;
                    break;

                case 29:
                    step = (c == 'n') ? 30 : 7;
                    break;

                case 30:
                    step = (c == 'd') ? 31 : 7;
                    break;

                case 31:
                    step = (c == 'o') ? 32 : 7;
                    break;

                case 32:
                    step = (c == 'b') ? 33 : 7;
                    break;

                case 33:
                    if (c == 'j')
                    {
                        step = 0;
                        if (objIDCandidate == 140)
                        {
                        }
                        oa = new ObjectAddress(objIDCandidate, addressCandidate
                                               , (int)(position - addressCandidate + 1), streamPositionCandidate, streamLengthCandidate);
                    }
                    else
                    {
                        step = 7;
                    }
                    break;
                }
                position++;
            }

            List <PdfFileObject> ObjStms = new List <PdfFileObject>();

            foreach (PdfFileObject pfo in objects.Values)
            {
                if (pfo.Type == PdfObjectTypes.ObjStm)
                {
                    ObjStms.Add(pfo);
                }
            }
            foreach (PdfFileObject ObjStm in ObjStms)
            {
                foreach (PdfFileObject pfo2 in ObjStm.GetStreamObjects())
                {
                    objects[pfo2.ObjID] = pfo2;
                }
            }
            return(objects);
        }
        internal Dictionary<int, PdfFileObject> LoadObjects(Stream s)
        {
            s.Seek(0, SeekOrigin.Begin);
            Dictionary<int, PdfFileObject> objects = new Dictionary<int, PdfFileObject>();
            int c = 0, objIDCandidate = 0, streamLengthCandidate = -1;
            long streamPositionCandidate = -2;
            long addressCandidate = -1, step = 0, position = 0;
            ObjectAddress oa = null;
            while ((c = s.ReadByte()) != -1)
            {               
                switch (step)
                {
                    case 0:
                        if (oa != null)
                        {
                            if (c == ' ' || c == '\r' || c == '\n')
                            {
                                oa.Length++;
                            }
                            else
                            {
                                PdfFileObject pfo = oa.CreateFileObject(this);
                                if (pfo.OriginalObjectAbsolutePosition == this.startxref)
                                {
                                    this.trailer = pfo;
                                }

                                objects[oa.ObjID] = pfo;
                                this.inputStream.Seek(position+1, SeekOrigin.Begin);
                                oa = null;
                                streamPositionCandidate = -2;
                                streamLengthCandidate = -1;
                            }
                        }
                        if (c > 48 && c < 58)
                        {
                            addressCandidate = position;
                            objIDCandidate = c - 48;
                            step = 1;
                        }
                        break;
                    case 1:
                        if (c > 47 && c < 58)
                        {
                            objIDCandidate = objIDCandidate * 10 + c - 48;                           
                        }
                        else
                        {
                            step = (c == ' ') ? 2 : 0;
                        }
                        break;
                    case 2:
                        step = (c == '0') ? 3 : 0;
                        break;
                    case 3:
                        step = (c == ' ') ? 4 : 0;
                        break;
                    case 4:
                        step = (c == 'o') ? 5 : 0;
                        break;
                    case 5:
                        step = (c == 'b') ? 6 : 0;
                        break;
                    case 6:
                        if (c == 'j')
                        {
                            step = 7;
                           
                        }
                        else
                        {
                            step = 0;
                        }
                        break;
                    case 7:
                        
                        if (objIDCandidate !=lastObjID)
                        {
                            lastObjID = objIDCandidate;
                            
                        }

                        if (objIDCandidate == 8)
                        {
                            if (c == '>')
                            {

                            }
                        }
                       
                        if (c == 'e')
                        {
                            // possible beginning of stream
                            step = 29;
                        }
                        if (c == 's')
                        {
                            step = 9;
                            break;
                        }
                        break;
                    case 8:
                        if (c == 's')
                        {
                            step++;
                            break;
                        }
                        if (c == 'e')
                        {
                            step = 29;
                            break;
                        }
                        if (c == '\r' || c == '\n' || c == ' ')
                        {
                            break;
                        }
                        step = 7;
                        break;
                    case 9:
                        step = (c == 't') ? 10 : 7;
                        break;
                    case 10:
                        step = (c == 'r') ? 11 : 7;
                        break;
                    case 11:
                        step = (c == 'e') ? 12 : 7;
                        break;
                    case 12:
                        step = (c == 'a') ? 13 : 7;
                        break;
                    case 13:
                        step = (c == 'm') ? 14 : 7;
                        break;
                    case 14:
                        step = (c == '\r' || c == '\n' || c == ' ') ? 15 : 7;
                        break;
                    case 15:
                        if (c == '\r' ||c  == '\n' || c == ' ')
                        {

                        }
                        else
                        {
                            step++;
                            streamPositionCandidate = position;
                        }
                        break;
                    case 16:
                        if (c == 'e')
                        {
                            step++;
                            break;
                        }
                       
                        streamLengthCandidate = (int)(position - streamPositionCandidate + 1);
                        break;
                    case 17:
                        step = (c == 'n') ? 18 : 16;
                        break;
                    case 18:
                        step = (c == 'd') ? 19 : 16;
                        break;
                    case 19:
                        if (c == 'o')
                        {
                            step = 32;
                            break;
                        }
                        if (c == 's')
                        {
                            step = 20;
                            break;
                        }
                        step = 16;
                        break;
                    case 20:
                        step = (c == 't') ? 21 : 16;
                        break;
                    case 21:
                        step = (c == 'r') ? 22 : 16;
                        break;
                    case 22:
                        step = (c == 'e') ? 23 : 16;
                        break;
                    case 23:
                        step = (c == 'a') ? 24 : 16;
                        break;
                    case 24:
                        step = (c == 'm') ? 25 : 16;
                        break;
                    case 25:
                        step = (c == '\r' || c == '\n' || c == ' ') ? 28 : 16;
                        break;
                        

                    case 28:
                        step = (c == 'e') ? 29 : 7;
                        break;
                    case 29:
                        step = (c == 'n') ? 30 : 7;
                        break;
                    case 30:
                        step = (c == 'd') ? 31 : 7;
                        break;
                    case 31:
                        step = (c == 'o') ? 32 : 7;
                        break;
                    case 32:
                        step = (c == 'b') ? 33 : 7;
                        break;
                    case 33:
                        if (c == 'j')
                        {
                            step = 0;
                            if (objIDCandidate == 140)
                            {

                            }
                            oa = new ObjectAddress(objIDCandidate, addressCandidate
                                ,(int)( position - addressCandidate+1),streamPositionCandidate,streamLengthCandidate);
                           
                        }
                        else
                        {
                            step = 7;
                        }
                        break;



                }
                position++;
            }

            List<PdfFileObject> ObjStms = new List<PdfFileObject>();
            foreach (PdfFileObject pfo in objects.Values)
            {
                if (pfo.Type == PdfObjectTypes.ObjStm)
                {
                    ObjStms.Add(pfo);
                }
            }
            foreach (PdfFileObject ObjStm in ObjStms)
            {
                foreach (PdfFileObject pfo2 in ObjStm.GetStreamObjects())
                {
                    objects[pfo2.ObjID] = pfo2;
                }
            }
            return objects;
        }