| 58 | ## PDFXRef |
| 59 | ## |
| 60 | class PDFXRef(PDFBaseXRef): |
| 61 | |
| 62 | def __init__(self): |
| 63 | self.offsets = {} |
| 64 | self.trailer = {} |
| 65 | return |
| 66 | |
| 67 | def load(self, parser, debug=0): |
| 68 | while 1: |
| 69 | try: |
| 70 | (pos, line) = parser.nextline() |
| 71 | if not line.strip(): continue |
| 72 | except PSEOF: |
| 73 | raise PDFNoValidXRef('Unexpected EOF - file corrupted?') |
| 74 | if not line: |
| 75 | raise PDFNoValidXRef('Premature eof: %r' % parser) |
| 76 | if line.startswith('trailer'): |
| 77 | parser.seek(pos) |
| 78 | break |
| 79 | f = line.strip().split(' ') |
| 80 | if len(f) != 2: |
| 81 | raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) |
| 82 | try: |
| 83 | (start, nobjs) = map(long, f) |
| 84 | except ValueError: |
| 85 | raise PDFNoValidXRef('Invalid line: %r: line=%r' % (parser, line)) |
| 86 | for objid in xrange(start, start+nobjs): |
| 87 | try: |
| 88 | (_, line) = parser.nextline() |
| 89 | except PSEOF: |
| 90 | raise PDFNoValidXRef('Unexpected EOF - file corrupted?') |
| 91 | f = line.strip().split(' ') |
| 92 | if len(f) != 3: |
| 93 | raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) |
| 94 | (pos, genno, use) = f |
| 95 | if use != 'n': continue |
| 96 | self.offsets[objid] = (int(genno), long(pos)) |
| 97 | if 1 <= debug: |
| 98 | print >>sys.stderr, 'xref objects:', self.offsets |
| 99 | self.load_trailer(parser) |
| 100 | return |
| 101 | |
| 102 | KEYWORD_TRAILER = KWD('trailer') |
| 103 | def load_trailer(self, parser): |
| 104 | try: |
| 105 | (_,kwd) = parser.nexttoken() |
| 106 | assert kwd is self.KEYWORD_TRAILER |
| 107 | (_,dic) = parser.nextobject() |
| 108 | except PSEOF: |
| 109 | x = parser.pop(1) |
| 110 | if not x: |
| 111 | raise PDFNoValidXRef('Unexpected EOF - file corrupted') |
| 112 | (_,dic) = x[0] |
| 113 | self.trailer.update(dict_value(dic)) |
| 114 | return |
| 115 | |
| 116 | PDFOBJ_CUE = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') |
| 117 | def load_fallback(self, parser, debug=0): |
no outgoing calls
no test coverage detected
searching dependent graphs…