| 150 | ## PDFXRefStream |
| 151 | ## |
| 152 | class PDFXRefStream(PDFBaseXRef): |
| 153 | |
| 154 | def __init__(self): |
| 155 | self.data = None |
| 156 | self.entlen = None |
| 157 | self.fl1 = self.fl2 = self.fl3 = None |
| 158 | self.objid_ranges = [] |
| 159 | return |
| 160 | |
| 161 | def __repr__(self): |
| 162 | return '<PDFXRefStream: fields=%d,%d,%d>' % (self.fl1, self.fl2, self.fl3) |
| 163 | |
| 164 | def load(self, parser, debug=0): |
| 165 | (_,objid) = parser.nexttoken() # ignored |
| 166 | (_,genno) = parser.nexttoken() # ignored |
| 167 | (_,kwd) = parser.nexttoken() |
| 168 | (_,stream) = parser.nextobject() |
| 169 | if not isinstance(stream, PDFStream) or stream['Type'] is not LITERAL_XREF: |
| 170 | raise PDFNoValidXRef('Invalid PDF stream spec.') |
| 171 | size = stream['Size'] |
| 172 | index_array = stream.get('Index', (0,size)) |
| 173 | if len(index_array) % 2 != 0: |
| 174 | raise PDFSyntaxError('Invalid index number') |
| 175 | self.objid_ranges.extend( ObjIdRange(start, nobjs) |
| 176 | for (start,nobjs) in choplist(2, index_array) ) |
| 177 | (self.fl1, self.fl2, self.fl3) = stream['W'] |
| 178 | self.data = stream.get_data() |
| 179 | self.entlen = self.fl1+self.fl2+self.fl3 |
| 180 | self.trailer = stream.attrs |
| 181 | if 1 <= debug: |
| 182 | print >>sys.stderr, ('xref stream: objid=%s, fields=%d,%d,%d' % |
| 183 | (', '.join(map(repr, self.objid_ranges)), |
| 184 | self.fl1, self.fl2, self.fl3)) |
| 185 | return |
| 186 | |
| 187 | def get_trailer(self): |
| 188 | return self.trailer |
| 189 | |
| 190 | def get_objids(self): |
| 191 | for objid_range in self.objid_ranges: |
| 192 | for x in xrange(objid_range.get_start_id(), objid_range.get_end_id()+1): |
| 193 | yield x |
| 194 | return |
| 195 | |
| 196 | def get_pos(self, objid): |
| 197 | offset = 0 |
| 198 | found = False |
| 199 | for objid_range in self.objid_ranges: |
| 200 | if objid >= objid_range.get_start_id() and objid <= objid_range.get_end_id(): |
| 201 | offset += objid - objid_range.get_start_id() |
| 202 | found = True |
| 203 | break |
| 204 | else: |
| 205 | offset += objid_range.get_nobjs() |
| 206 | if not found: raise KeyError(objid) |
| 207 | i = self.entlen * offset |
| 208 | ent = self.data[i:i+self.entlen] |
| 209 | f1 = nunpack(ent[:self.fl1], 1) |
no outgoing calls
no test coverage detected
searching dependent graphs…