From b0a01bae1a8bd4fcaf1db27c568a10452e6204ea Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 11 Dec 2012 12:27:06 +0100 Subject: [PATCH] document generation with images: embedding of image OK --- docgen/README.txt | 14 +++++++++--- docgen/mht.py | 39 ++++++++++++++++++++++------------ docgen/testing/test_image.jpg | Bin 0 -> 30188 bytes 3 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 docgen/testing/test_image.jpg diff --git a/docgen/README.txt b/docgen/README.txt index f378c85..2e5b281 100644 --- a/docgen/README.txt +++ b/docgen/README.txt @@ -21,19 +21,27 @@ Working with MHT Files >>> f.close() >>> imagePath = os.path.join(basePath, 'test_image.jpg') + >>> f = open(imagePath, 'rt') + >>> imageData = f.read() + >>> f.close() - >>> body = ''' + >>> body = '''
+ ... + ... + ... + ...
... ''' >>> from cybertools.docgen.mht import MHTFile >>> document = MHTFile(data, body) - >>> document.addImage(imagePath) # TODO: provide imageData, path + >>> document.addImage(imageData, 'files/test_image.jpg') >>> document.insertBody() >>> output = document.asString() >>> len(data), len(output) - (294996, 295346) + (294996, 336268) >>> outPath = os.path.join(basePath, 'out_doc.mht') >>> #f = open(outPath, 'wt') diff --git a/docgen/mht.py b/docgen/mht.py index cff3e4b..2eb9367 100644 --- a/docgen/mht.py +++ b/docgen/mht.py @@ -22,6 +22,7 @@ Working with MHT Files. import base64 import email +import mimetypes import os @@ -31,15 +32,18 @@ class MHTFile(object): #encoding = 'ISO8859-15' encoding = 'Windows-1252' bodyMarker = 'lxdoc_body' + foldernameSuffix = 'Dateien' indexes = dict(body=2, filelist=-2) + path = documentName = None + imageTemplate = ('\n' - 'Content-Location: file:///C:/AF2749EC/%(docname)s-Dateien/$(imgname)s\n' + 'Content-Location: %(path)s/%(docname)s-%(suffix)s/%(imgname)s\n' 'Content-Transfer-Encoding: base64\n' 'Content-Type: %(ctype)s\n\n%(imgdata)s\n\n') filelistItemTemplate = ' \n' - filelistPattern ='' + filelistPattern =' ' def __init__(self, data, body): self.data = data @@ -50,23 +54,30 @@ class MHTFile(object): self.htmlDoc = HTMLDoc(body) self.lastImageNum = 0 self.imageMappings = [] - #print '***', len(self.parts) for idx, part in enumerate(self.msg.walk()): - # print '***', idx, , part.get_content_type() - if idx == 1: - docPath = part['Content-Location'] - self.documentName = docPath - # TODO: collect existing images to provide consistent naming + docPath = part['Content-Location'] + contentType = part.get_content_type() + #print '***', idx, docPath, contentType + if idx == self.indexes['body'] - 1: + self.path, docname = os.path.split(docPath) + self.documentName, ext = os.path.splitext(docname) + if contentType.startswith('image/'): + self.lastImageNum += 1 + #print '###', self.path, self.documentName, self.lastImageNum def getImageRefs(self): return self.htmlDoc.getImageRefs() - def addImage(self, imageData, path='image001.jpg', contentType='image/jpeg'): + def addImage(self, imageData, path, contentType='image/jpeg'): + contentType, enc = mimetypes.guess_type(path) + bp, ext = os.path.splitext(path) + self.lastImageNum += 1 + name = 'image%03i%s' % (self.lastImageNum, ext) + self.imageMappings.append((path, name)) flpos = self.indexes['filelist'] - # TODO: get contentType from path - # TODO: generate name, update self.imageMappings - name = path - vars = dict(docname=self.documentName, imgname=name, ctype=contentType, + vars = dict(path=self.path, docname=self.documentName, + suffix=self.foldernameSuffix, + imgname=name, ctype=contentType, imgdata=base64.encodestring(imageData)) content = self. imageTemplate % vars self.parts.insert(flpos, content) @@ -76,7 +87,7 @@ class MHTFile(object): def insertBody(self): - # self.htmlDoc.updateImageRefs(self.imageMappings) + self.htmlDoc.updateImageRefs(self.imageMappings) # TODO: convert changed self.htmlDoc to new body content = self.body.encode(self.encoding) bodyIndex = self.indexes['body'] diff --git a/docgen/testing/test_image.jpg b/docgen/testing/test_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f33480248b1540645664c16955a18ba883d7564 GIT binary patch literal 30188 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