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
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
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
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
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
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
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
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