Changeset 707

Show
Ignore:
Timestamp:
01/27/06 10:24:45 (3 years ago)
Author:
mfenniak
Message:

Initial revision support merging multiple pages. It merges the resource directories properly, but *does not* rename duplicate instances of resources in the content streams yet.

Files:

Legend:

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

    r704 r707  
    4646from generic import * 
    4747from utils import readNonWhitespace, readUntilWhitespace 
     48from sets import ImmutableSet 
    4849 
    4950class PdfFileWriter(object): 
     
    157158        elif isinstance(data, ArrayObject): 
    158159            for i in range(len(data)): 
    159                 data[i] = self._sweepIndirectReferences(externMap, data[i]) 
     160                value = self._sweepIndirectReferences(externMap, data[i]) 
     161                if hasattr(value, "has_key") and value.has_key("__streamdata__"): 
     162                    # an array value is a stream.  streams must be indirect 
     163                    # objects, so we need to change this value 
     164                    value = self._addObject(value) 
     165                data[i] = value 
    160166            return data 
    161167        elif isinstance(data, IndirectObject): 
     
    490496        self[NameObject("/Rotate")] = NumberObject(currentAngle + angle) 
    491497 
     498    def __mergeResources(res1, res2, resource): 
     499        newRes = DictionaryObject() 
     500        newRes.update(res1.get(resource, DictionaryObject()).getObject()) 
     501        page2Res = res2.get(resource, DictionaryObject()).getObject() 
     502        renameRes = {} 
     503        for key in page2Res.keys(): 
     504            if newRes.has_key(key) and newRes[key] != page2Res[key]: 
     505                newname = NameObject(key + "_renamed") 
     506                renameRes[key] = newname 
     507                newRes[newname] = page2Res[key] 
     508            elif not newRes.has_key(key): 
     509                newRes[key] = page2Res[key] 
     510        return newRes, renameRes 
     511    __mergeResources = staticmethod(__mergeResources) 
     512 
     513    def mergePage(self, page2): 
     514        """ 
     515        Merges the content streams of two pages into one. 
     516 
     517        Stability: Added in v1.4, will exist for all v1.x releases thereafter. 
     518        """ 
     519        newContentArray = ArrayObject() 
     520 
     521        originalContent = self["/Contents"].getObject() 
     522        if isinstance(originalContent, ArrayObject): 
     523            newContentArray.extend(originalContent) 
     524        else: 
     525            newContentArray.append(originalContent) 
     526 
     527        page2Content = page2['/Contents'].getObject() 
     528        if isinstance(page2Content, ArrayObject): 
     529            newContentArray.extend(page2Content) 
     530        else: 
     531            newContentArray.append(page2Content) 
     532 
     533        newResources = DictionaryObject() 
     534 
     535        originalResources = self["/Resources"].getObject() 
     536        page2Resources = page2["/Resources"].getObject() 
     537 
     538        newFonts, renameFonts = PageObject.__mergeResources(originalResources, page2Resources, "/Font") 
     539        newResources[NameObject("/Font")] = newFonts 
     540        newGS, renameGS = PageObject.__mergeResources(originalResources, page2Resources, "/ExtGState") 
     541        newResources[NameObject("/ExtGState")] = newGS 
     542 
     543        newResources[NameObject("/ProcSet")] = ArrayObject( 
     544            ImmutableSet(originalResources.get("/ProcSet", ArrayObject()).getObject()).union( 
     545                ImmutableSet(page2Resources.get("/ProcSet", ArrayObject()).getObject()) 
     546            ) 
     547        ) 
     548 
     549        self[NameObject('/Contents')] = newContentArray 
     550        self[NameObject('/Resources')] = newResources 
     551 
    492552addRectangleAccessor(PageObject, "mediaBox", "/MediaBox", (), 
    493553        """A rectangle, expressed in default user space units, defining the 
     
    567627    output = PdfFileWriter() 
    568628 
    569     #input1 = PdfFileReader(file("input1.pdf", "rb")) 
    570     #output.addPage(input1.getPage(0)) 
    571  
    572     input2 = PdfFileReader(file("..\\test\\5000-s1-05e.pdf", "rb")) 
    573     page = input2.getPage(1) 
    574     page.cropBox.upperRight = (200, 200) 
    575     print repr(page.cropBox) 
    576     page.cropBox = RectangleObject((20, 20, 40, 40)) 
    577     print repr(page.cropBox) 
    578     del page.cropBox 
    579     print repr(page.cropBox) 
    580     #contents = input2.getObject(page["/Contents"]) 
    581     #contentStream = ContentStream(contents) 
    582     #for operands,operator in contentStream.operations: 
    583     #    for operand in operands: 
    584     #        if isinstance(operand, NameObject): 
    585     #            print "name object" 
    586  
    587     output.addPage(page) 
     629    input1 = PdfFileReader(file("..\\test\\PDFReference16.pdf", "rb")) 
     630    page1 = input1.getPage(0) 
     631    page2 = input1.getPage(1) 
     632    page3 = input1.getPage(2) 
     633    page1.mergePage(page2) 
     634    page1.mergePage(page3) 
     635    output.addPage(page1) 
     636 
    588637    output.write(file("test.pdf", "wb")) 
    589638