Python relatorio -Bilder in Odt Dateien einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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

@martinjo: Ohne mich jetzt damit näher befasst zu haben ist ein `readlines()` auf einer JPG-Bildatei mit Sicherheit falsch.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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')
Antworten