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; }