Esempio n. 1
0
 def _savePictures(self, object, folder):
     hasPictures = False
     for arcname, picturerec in object.Pictures.items():
         what_it_is, fileobj, mediatype = picturerec
         self.manifest.addElement(
             manifest.FileEntry(fullpath="%s%s" % (folder, arcname),
                                mediatype=mediatype))
         hasPictures = True
         if what_it_is == IS_FILENAME:
             self._z.write(fileobj, arcname, zipfile.ZIP_STORED)
         else:
             zi = zipfile.ZipInfo(str(arcname), self._now)
             zi.compress_type = zipfile.ZIP_STORED
             zi.external_attr = UNIXPERMS
             self._z.writestr(zi, fileobj)
     if hasPictures:
         self.manifest.addElement(
             manifest.FileEntry(fullpath="%sPictures/" % folder,
                                mediatype=""))
     # Look in subobjects
     subobjectnum = 1
     for subobject in object.childobjects:
         self._savePictures(subobject,
                            '%sObject %d/' % (folder, subobjectnum))
         subobjectnum += 1
Esempio n. 2
0
    def __zipwrite(self, outputfp):
        """
        Write the document to an open file pointer
        This is where the real work is done
        @param outputfp instance of zipfile.ZipFile
        """
        assert (isinstance(outputfp, zipfile.ZipFile))

        self._z = outputfp
        self._now = time.localtime()[:6]
        self.manifest = manifest.Manifest()

        # Write mimetype
        zi = zipfile.ZipInfo('mimetype', self._now)
        zi.compress_type = zipfile.ZIP_STORED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, self.mimetype.encode("utf-8"))

        self._saveXmlObjects(self, u"")

        # Write pictures
        self._savePictures(self, u"")

        # Write the thumbnail
        if self.thumbnail is not None:
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"Thumbnails/", mediatype=u''))
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"Thumbnails/thumbnail.png",
                                   mediatype=u''))
            zi = zipfile.ZipInfo(u"Thumbnails/thumbnail.png", self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, self.thumbnail)

        # Write any extra files
        for op in self._extra:
            if op.filename == u"META-INF/documentsignatures.xml":
                continue  # Don't save signatures
            self.manifest.addElement(
                manifest.FileEntry(fullpath=op.filename,
                                   mediatype=op.mediatype))
            if sys.version_info[0] == 3:
                zi = zipfile.ZipInfo(op.filename, self._now)
            else:
                zi = zipfile.ZipInfo(op.filename.encode('utf-8'), self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            if op.content is not None:
                self._z.writestr(zi, op.content)
        # Write manifest
        zi = zipfile.ZipInfo(u"META-INF/manifest.xml", self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, self.__manifestxml())
        del self._z
        del self._now
        del self.manifest
Esempio n. 3
0
    def _zipwrite(self, outputfp):
        """ Write the document to an open file pointer """
        self._z = outputfp
        self._now = time.localtime()[:6]
        self.manifest = manifest.Manifest()

        # Write mimetype
        zi = zipfile.ZipInfo('mimetype', self._now)
        zi.compress_type = zipfile.ZIP_STORED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, self.mimetype)

        self._saveXmlObjects(self, "")

        # Write pictures
        self._savePictures(self, "")

        # Write the thumbnail
        if self.thumbnail is not None:
            self.manifest.addElement(
                manifest.FileEntry(fullpath="Thumbnails/", mediatype=''))
            self.manifest.addElement(
                manifest.FileEntry(fullpath="Thumbnails/thumbnail.png",
                                   mediatype=''))
            zi = zipfile.ZipInfo("Thumbnails/thumbnail.png", self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, self.thumbnail)

        # Write any extra files
        for op in self._extra:
            if op.filename == "META-INF/documentsignatures.xml":
                continue  # Don't save signatures
            self.manifest.addElement(
                manifest.FileEntry(fullpath=op.filename,
                                   mediatype=op.mediatype))
            zi = zipfile.ZipInfo(op.filename.encode('utf-8'), self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            if op.content is not None:
                self._z.writestr(zi, op.content)
        # Write manifest
        zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, self.manifestxml())
        del self._z
        del self._now
        del self.manifest
Esempio n. 4
0
    def _savePictures(self, anObject, folder):
        """
        saves pictures contained in an object
        @param anObject instance of OpenDocument containing pictures
        @param folder unicode string: place to save pictures
        """
        assert (isinstance(anObject, OpenDocument))
        assert (type(folder) == type(u""))

        hasPictures = False
        for arcname, picturerec in anObject.Pictures.items():
            what_it_is, fileobj, mediatype = picturerec
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"%s%s" % (folder, arcname),
                                   mediatype=mediatype))
            hasPictures = True
            if what_it_is == IS_FILENAME:
                self._z.write(fileobj, arcname, zipfile.ZIP_STORED)
            else:
                zi = zipfile.ZipInfo(str(arcname), self._now)
                zi.compress_type = zipfile.ZIP_STORED
                zi.external_attr = UNIXPERMS
                self._z.writestr(zi, fileobj)
        # According to section 17.7.3 in ODF 1.1, the pictures folder should not have a manifest entry
#       if hasPictures:
#           self.manifest.addElement(manifest.FileEntry(fullpath="%sPictures/" % folder, mediatype=""))
# Look in subobjects
        subobjectnum = 1
        for subobject in anObject.childobjects:
            self._savePictures(subobject,
                               u'%sObject %d/' % (folder, subobjectnum))
            subobjectnum += 1
Esempio n. 5
0
    def save(self, outputfile, addsuffix=False):
        """ Save the document under the filename """
        self.manifest = manifest.Manifest()
        mimetype = self.mimetype
        suffix = odmimetypes.get(mimetype, '.xxx')

        if outputfile == '-':
            self._z = zipfile.ZipFile(sys.stdout, "w")
        else:
            if addsuffix:
                outputfile = outputfile + suffix
            self._z = zipfile.ZipFile(outputfile, "w")

        self._now = time.localtime()[:6]

        # Write mimetype
        zi = zipfile.ZipInfo('mimetype', self._now)
        zi.compress_type = zipfile.ZIP_STORED
        self._z.writestr(zi, self.mimetype)

        self._saveXmlObjects(self, "")

        # Write pictures
        self._savePictures(self, "")

        # Write the thumbnail
        if self.thumbnail is not None:
            self.manifest.addElement(
                manifest.FileEntry(fullpath="Thumbnails/", mediatype=''))
            self.manifest.addElement(
                manifest.FileEntry(fullpath="Thumbnails/thumbnail.png",
                                   mediatype=''))
            zi = zipfile.ZipInfo("Thumbnails/thumbnail.png", self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            self._z.writestr(zi, self.thumbnail)

        # Write manifest
        zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        self._z.writestr(zi, self.manifestxml())
        self._z.close()
        del self._z
        del self._now
        del self.manifest
Esempio n. 6
0
 def _savePictures(self, object, folder):
     hasPictures = False
     for arcname, picturerec in object.Pictures.items():
         filename, mediatype = picturerec
         self.manifest.addElement(
             manifest.FileEntry(fullpath="%s%s" % (folder, arcname),
                                mediatype=mediatype))
         hasPictures = True
         self._z.write(filename, arcname, zipfile.ZIP_STORED)
     if hasPictures:
         self.manifest.addElement(
             manifest.FileEntry(fullpath="%sPictures/" % folder,
                                mediatype=""))
     # Look in subobjects
     subobjectnum = 1
     for subobject in object.childobjects:
         self._savePictures(subobject,
                            '%sObject %d/' % (folder, subobjectnum))
         subobjectnum += 1
Esempio n. 7
0
    def _saveXmlObjects(self, anObject, folder):
        """
        save xml objects of an opendocument to some folder
        @param anObject instance of OpenDocument
        @param folder unicode string place to save xml objects
        """
        assert (isinstance(anObject, OpenDocument))
        assert (type(folder) == type(u""))

        if self == anObject:
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"/", mediatype=anObject.mimetype))
        else:
            self.manifest.addElement(
                manifest.FileEntry(fullpath=folder,
                                   mediatype=anObject.mimetype))
        # Write styles
        self.manifest.addElement(
            manifest.FileEntry(fullpath=u"%sstyles.xml" % folder,
                               mediatype=u"text/xml"))
        zi = zipfile.ZipInfo(u"%sstyles.xml" % folder, self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, anObject.stylesxml().encode("utf-8"))

        # Write content
        self.manifest.addElement(
            manifest.FileEntry(fullpath=u"%scontent.xml" % folder,
                               mediatype=u"text/xml"))
        zi = zipfile.ZipInfo(u"%scontent.xml" % folder, self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, anObject.contentxml())

        # Write settings
        if anObject.settings.hasChildNodes():
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"%ssettings.xml" % folder,
                                   mediatype=u"text/xml"))
            zi = zipfile.ZipInfo(u"%ssettings.xml" % folder, self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, anObject.settingsxml())

        # Write meta
        if self == anObject:
            self.manifest.addElement(
                manifest.FileEntry(fullpath=u"meta.xml",
                                   mediatype=u"text/xml"))
            zi = zipfile.ZipInfo(u"meta.xml", self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, anObject.metaxml())

        # Write subobjects
        subobjectnum = 1
        for subobject in anObject.childobjects:
            self._saveXmlObjects(subobject,
                                 u'%sObject %d/' % (folder, subobjectnum))
            subobjectnum += 1
Esempio n. 8
0
    def _saveXmlObjects(self, object, folder):
        if self == object:
            self.manifest.addElement(
                manifest.FileEntry(fullpath="/", mediatype=object.mimetype))
        else:
            self.manifest.addElement(
                manifest.FileEntry(fullpath=folder, mediatype=object.mimetype))
        # Write styles
        self.manifest.addElement(
            manifest.FileEntry(fullpath="%sstyles.xml" % folder,
                               mediatype="text/xml"))
        zi = zipfile.ZipInfo("%sstyles.xml" % folder, self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, object.stylesxml())

        # Write content
        self.manifest.addElement(
            manifest.FileEntry(fullpath="%scontent.xml" % folder,
                               mediatype="text/xml"))
        zi = zipfile.ZipInfo("%scontent.xml" % folder, self._now)
        zi.compress_type = zipfile.ZIP_DEFLATED
        zi.external_attr = UNIXPERMS
        self._z.writestr(zi, object.contentxml())

        # Write settings
        if object.settings.hasChildNodes():
            self.manifest.addElement(
                manifest.FileEntry(fullpath="%ssettings.xml" % folder,
                                   mediatype="text/xml"))
            zi = zipfile.ZipInfo("%ssettings.xml" % folder, self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, object.settingsxml())

        # Write meta
        if self == object:
            self.manifest.addElement(
                manifest.FileEntry(fullpath="meta.xml", mediatype="text/xml"))
            zi = zipfile.ZipInfo("meta.xml", self._now)
            zi.compress_type = zipfile.ZIP_DEFLATED
            zi.external_attr = UNIXPERMS
            self._z.writestr(zi, object.metaxml())

        # Write subobjects
        subobjectnum = 1
        for subobject in object.childobjects:
            self._saveXmlObjects(subobject,
                                 '%sObject %d/' % (folder, subobjectnum))
            subobjectnum += 1