Changeset 726

Show
Ignore:
Timestamp:
01/30/06 09:51:08 (3 years ago)
Author:
mfenniak
Message:

Adjustments to use new StreamObject? classes. Add graphics state push/pop around page content. Merge all page content into one stream.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pypdf/trunk/pyPdf/pdf.py

    r723 r726  
    150150                if value == None: 
    151151                    print objects, value, origvalue 
    152                 if hasattr(value, "has_key") and value.has_key("__streamdata__"): 
     152                if isinstance(value, StreamObject): 
    153153                    # a dictionary value is a stream.  streams must be indirect 
    154154                    # objects, so we need to change this value. 
     
    159159            for i in range(len(data)): 
    160160                value = self._sweepIndirectReferences(externMap, data[i]) 
    161                 if hasattr(value, "has_key") and value.has_key("__streamdata__"): 
     161                if isinstance(value, StreamObject): 
    162162                    # an array value is a stream.  streams must be indirect 
    163163                    # objects, so we need to change this value 
     
    275275            assert objStm['/Type'] == '/ObjStm' 
    276276            assert idx < objStm['/N'] 
    277             streamData = StringIO(filters.decodeStreamData(objStm)) 
     277            streamData = StringIO(objStm.getData()) 
    278278            for i in range(objStm['/N']): 
    279279                objnum = NumberObject.readFromStream(streamData) 
     
    375375                assert xrefstream["/Type"] == "/XRef" 
    376376                self.cacheIndirectObject(generation, idnum, xrefstream) 
    377                 streamData = StringIO(filters.decodeStreamData(xrefstream)) 
     377                streamData = StringIO(xrefstream.getData()) 
    378378                num, size = xrefstream.get("/Index", [0, xrefstream.get("/Size")]) 
    379379                entrySizes = xrefstream.get("/W") 
     
    527527    def _contentStreamRename(stream, rename): 
    528528        if not rename: 
    529             if isinstance(stream, ArrayObject): 
    530                 return stream 
    531             else: 
    532                 return [stream] 
     529            return stream 
    533530        stream = ContentStream(stream) 
    534         newdata = StringIO() 
    535         for operands,operator in stream.operations
    536             for op in operands: 
     531        for operands,operator in stream.operands: 
     532            for i in range(len(operands))
     533                op = oprands[i] 
    537534                if isinstance(op, NameObject): 
    538                     op = rename.get(op, op) 
    539                 op.writeToStream(newdata) 
    540                 newdata.write(" ") 
    541             newdata.write(operator) 
    542             newdata.write("\n") 
    543         retval = DictionaryObject() 
    544         retval["__streamdata__"] = newdata.getvalue() 
    545         retval[NameObject('/Length')] = NumberObject(len(retval["__streamdata__"])) 
    546         return [retval] 
     535                    operands[i] = rename.get(op, op) 
     536        return stream 
    547537    _contentStreamRename = staticmethod(_contentStreamRename) 
     538 
     539    def _pushPopGS(contents): 
     540        # adds a graphics state "push" and "pop" to the beginning and end 
     541        # of a content stream.  This isolates it from changes such as  
     542        # transformation matricies. 
     543        stream = ContentStream(contents) 
     544        stream.operations.insert(0, [[], "q"]) 
     545        stream.operations.append([[], "Q"]) 
     546        return stream 
     547    _pushPopGS = staticmethod(_pushPopGS) 
    548548 
    549549    def mergePage(self, page2): 
     
    581581 
    582582        originalContent = self["/Contents"].getObject() 
    583         if isinstance(originalContent, ArrayObject): 
    584             newContentArray.extend(originalContent) 
    585         else: 
    586             newContentArray.append(originalContent) 
     583        newContentArray.append(PageObject._pushPopGS(originalContent)) 
    587584 
    588585        page2Content = page2['/Contents'].getObject() 
    589         newContentArray.extend(PageObject._contentStreamRename(page2Content, rename)) 
    590  
    591         self[NameObject('/Contents')] = newContentArray 
     586        page2Content = PageObject._contentStreamRename(page2Content, rename) 
     587        page2Content = PageObject._pushPopGS(page2Content) 
     588        newContentArray.append(page2Content) 
     589 
     590        self[NameObject('/Contents')] = ContentStream(newContentArray) 
    592591        self[NameObject('/Resources')] = newResources 
    593592 
     
    630629 
    631630 
    632 class ContentStream(DictionaryObject): 
     631class ContentStream(DecodedStreamObject): 
    633632    def __init__(self, stream): 
    634633        self.operations = [] 
    635         self.__parseContentStream(stream) 
    636  
    637     def __parseContentStream(self, stream): 
    638         # stream may be an array of streams to concatenate. 
     634        # stream may be a StreamObject or an ArrayObject containing 
     635        # multiple StreamObjects to be cat'd together. 
    639636        stream = stream.getObject() 
    640637        if isinstance(stream, ArrayObject): 
    641638            data = "" 
    642639            for s in stream: 
    643                 data += filters.decodeStreamData(s.getObject()
     640                data += s.getObject().getData(
    644641            stream = StringIO(data) 
    645642        else: 
    646             stream = StringIO(filters.decodeStreamData(stream)) 
     643            stream = StringIO(stream.getData()) 
     644        self.__parseContentStream(stream) 
     645 
     646    def __parseContentStream(self, stream): 
    647647        operands = [] 
    648648        while True: 
     
    658658                operands.append(readObject(stream, None)) 
    659659 
     660    def _getData(self): 
     661        newdata = StringIO() 
     662        for operands,operator in self.operations: 
     663            for op in operands: 
     664                op.writeToStream(newdata) 
     665                newdata.write(" ") 
     666            newdata.write(operator) 
     667            newdata.write("\n") 
     668        return newdata.getvalue() 
     669 
     670    def _setData(self, value): 
     671        self.__parseContentStream(StringIO(value)) 
     672 
     673    _data = property(_getData, _setData) 
     674 
    660675 
    661676def convertToInt(d, size): 
     
    676691    output = PdfFileWriter() 
    677692 
    678     input1 = PdfFileReader(file("..\\test\\5000-s1-05e.pdf", "rb")) 
     693    input1 = PdfFileReader(file("test\\5000-s1-05e.pdf", "rb")) 
    679694    page1 = input1.getPage(0) 
    680695 
    681     input2 = PdfFileReader(file("..\\test\\PDFReference16.pdf", "rb")) 
     696    input2 = PdfFileReader(file("test\\PDFReference16.pdf", "rb")) 
    682697    page2 = input2.getPage(0) 
    683698    page3 = input2.getPage(1) 
     
    685700    page1.mergePage(page3) 
    686701 
    687     input3 = PdfFileReader(file("..\\test\\cc-cc.pdf", "rb")) 
     702    input3 = PdfFileReader(file("test\\cc-cc.pdf", "rb")) 
    688703    page1.mergePage(input3.getPage(0)) 
    689704 
    690705    output.addPage(page1) 
    691     output.write(file("test.pdf", "wb")) 
    692  
    693  
     706    output.write(file("test\\merge-test.pdf", "wb")) 
     707 
     708