Seite 1 von 1

Python relatorio -Bilder in Odt Dateien einfügen

Verfasst: Samstag 13. Juni 2015, 14:06
von martinjo
Hallo,

ich hatte letztens ein Thema zum erstellen von ODT-Dateien mit relatorio erstellt, dass funktioniert zwischenzeitlich: http://www.python-forum.de/viewtopic.php?f=1&t=36130

Nun wollte ich einen Schritt weiter gehen und zusätzlich Bilder mit ein das Dokument einfügen. Im Beispielcode soll nur ein Datum sowie ein Bild eingefügt werden:

Code: Alles auswählen

my_store = {}
my_store ["date"] = datetime.date.today()
with open("test.jpg", "r") as jpgfile:
    my_store ["image"] = jpgfile.readlines()
basic = Template(source="", filepath=  os.path.join(os.path.expanduser('~'), 'template.odt') )
basic_generated = basic.generate(s=my_store ).render()
file('ODTFILEs.odt', 'wb').write(basic_generated.getvalue())

In die Vorlagen-Datei kommt ein Text-Platzhalter mit dem Inhalt " s.date ", sowie ein Rahmen mit dem Namen " image: (str(s.image), 'image/jpg' " (ohne die doppelten Anführungsstriche).

Leider erhalte ich beim ausführen folgende Fehlermeldung:

Code: Alles auswählen

genshi.template.base.TemplateSyntaxError: unexpected EOF while parsing in expression "__relatorio_make_dimension(__relatorio_store_cache(140432910415416, (str(s.image), 'image/jpg'), '2.531cm', '')" of "attrs" directive (, line 1) (template.odt, line 1)

edit:
Ändere ich den Rahmen in der Vorlage ab auf " image: s.image, 'image/jpg' " (ohne die doppelten Anführungsstriche) erhalte ich die Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "image.py", line 36, in <module>
    basic_generated = basic.generate(s=mystore).render()
  File "/usr/local/lib/python2.7/dist-packages/relatorio/templates/base.py", line 34, in render
    return self.serializer(self.events)
  File "/usr/local/lib/python2.7/dist-packages/relatorio/templates/opendocument.py", line 855, in __call__
    for kind, data, pos in stream:
  File "/usr/lib/python2.7/dist-packages/genshi/template/base.py", line 618, in _include
    for event in stream:
  File "/usr/lib/python2.7/dist-packages/genshi/template/markup.py", line 326, in _match
    for event in stream:
  File "/usr/lib/python2.7/dist-packages/genshi/template/base.py", line 558, in _flatten
    for kind, data, pos in stream:
  File "/usr/lib/python2.7/dist-packages/genshi/template/directives.py", line 169, in _generate
    attrs = _eval_expr(self.expr, ctxt, vars)
  File "/usr/lib/python2.7/dist-packages/genshi/template/base.py", line 289, in _eval_expr
    retval = expr.evaluate(ctxt)
  File "/usr/lib/python2.7/dist-packages/genshi/template/eval.py", line 178, in evaluate
    return eval(self.code, _globals, {'__data__': data})
  File "<string>", line 1, in <Expression u"__relatorio_make_dimension(__relatorio_store_cache(140715623941688, s.image, 'image/jpg'), '2.531cm', '')">
TypeError: store() takes exactly 3 arguments (4 given)

Re: Python relatorio -Bilder in Odt Dateien einfügen

Verfasst: Samstag 13. Juni 2015, 15:31
von BlackJack
@martinjo: Ohne mich jetzt damit näher befasst zu haben ist ein `readlines()` auf einer JPG-Bildatei mit Sicherheit falsch.

Re: Python relatorio -Bilder in Odt Dateien einfügen

Verfasst: Mittwoch 1. Juli 2015, 18:42
von martinjo
BlackJack hat geschrieben:@martinjo: Ohne mich jetzt damit näher befasst zu haben ist ein `readlines()` auf einer JPG-Bildatei mit Sicherheit falsch.
Ja, Danke, dass war einer von vielen Versuchen :-)

Gelöst habe ich es nun folgendermaßen:

Im Code:

Code: Alles auswählen

with open("test.jpg", "rb") as img_file:
    string_io = StringIO.StringIO()
    string_io.write( img_file.read() )
    mystore["image"] = string_io

Im ODT-Frame, Name: image: (s.image, 'image/jpg', '3cm', '3cm')