Handles PDF-related keywords.
(self, pos, token)
| 613 | KEYWORD_XREF = KWD('xref') |
| 614 | KEYWORD_STARTXREF = KWD('startxref') |
| 615 | def do_keyword(self, pos, token): |
| 616 | """Handles PDF-related keywords.""" |
| 617 | |
| 618 | if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): |
| 619 | self.add_results(*self.pop(1)) |
| 620 | |
| 621 | elif token is self.KEYWORD_ENDOBJ: |
| 622 | self.add_results(*self.pop(4)) |
| 623 | |
| 624 | elif token is self.KEYWORD_NULL: |
| 625 | # null object |
| 626 | self.push((pos, None)) |
| 627 | |
| 628 | elif token is self.KEYWORD_R: |
| 629 | # reference to indirect object |
| 630 | try: |
| 631 | ((_,objid), (_,genno)) = self.pop(2) |
| 632 | (objid, genno) = (int(objid), int(genno)) |
| 633 | obj = PDFObjRef(self.doc, objid, genno) |
| 634 | self.push((pos, obj)) |
| 635 | except PSSyntaxError: |
| 636 | pass |
| 637 | |
| 638 | elif token is self.KEYWORD_STREAM: |
| 639 | # stream object |
| 640 | ((_,dic),) = self.pop(1) |
| 641 | dic = dict_value(dic) |
| 642 | objlen = 0 |
| 643 | if not self.fallback: |
| 644 | try: |
| 645 | objlen = int_value(dic['Length']) |
| 646 | except KeyError: |
| 647 | if STRICT: |
| 648 | raise PDFSyntaxError('/Length is undefined: %r' % dic) |
| 649 | self.seek(pos) |
| 650 | try: |
| 651 | (_, line) = self.nextline() # 'stream' |
| 652 | except PSEOF: |
| 653 | if STRICT: |
| 654 | raise PDFSyntaxError('Unexpected EOF') |
| 655 | return |
| 656 | pos += len(line) |
| 657 | self.fp.seek(pos) |
| 658 | data = self.fp.read(objlen) |
| 659 | self.seek(pos+objlen) |
| 660 | while 1: |
| 661 | try: |
| 662 | (linepos, line) = self.nextline() |
| 663 | except PSEOF: |
| 664 | if STRICT: |
| 665 | raise PDFSyntaxError('Unexpected EOF') |
| 666 | break |
| 667 | if 'endstream' in line: |
| 668 | i = line.index('endstream') |
| 669 | objlen += i |
| 670 | data += line[:i] |
| 671 | break |
| 672 | objlen += len(line) |
nothing calls this directly
no test coverage detected