Generating a report: Python to ODT (OOO) or doc

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.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo zusammen,

vorab, ich habe natürlich die Forumsuche sowie Google schon verwendet.

Im Forum habe ich zu generierung zu otp-Files nur folgenden Link gefunden,
und dieser behandelt eher eine Grundsatzdiskussion als nützliche Links.

http://www.python-forum.de/viewtopic.ph ... &hilit=odt

Aber fangen wir von Vorne an, was will der Spinner überhaupt?

Ich habe eine sagen wir mal Python Serveranwendung welche mit einer postgresql
datenbank ganz viele und vor allem umwerfende Dinge bewältigt. Dieses Pyhton
Programm soll nun in der Lage sein einen dynamischen Report (mittels der in der
datenbank vorhandenen daten) zu erstellen und dieses in ein Template in Form von
odt (open office) oder alternativ in doc zu speichern.
Ich spreche hier von einem Template da ich das corporate design einhalten muss, dh.
ich habe Fusszahlen, einen Index, Deckblatt und was die Bürohängste halt sonst noch
gerne so haben.

Ich habe wie gesagt schon etwas gegoogelt und folgende Möglichkeiten gefunden

- ix3/2010 die Sagen umwogene UNO-Schnittstelle (PyUno) mit Beautiful Soap und PIL (pyhton imaging library)
http://udk.openoffice.org/
http://www.crummy.com/software/BeautifulSoup/

oder

- POD (Python Open Document)
http://appyframework.org/pod.html


Ich persönlich halte POD für interessanter, da ich hier schon so etwas in die Richtung mit Templates komme.


Ok, jetzt haben wir schon viel Luft bewegt aber passiert ist natürlich noch nichts.
Da hier offenbar viele erfahrene Mitglieder umhergeistern wollte ich zu einem Fragen, "hat schonmal jemand was Vergleichbares gemacht?" und des weiteren "hat vielleicht wer ein beispiel?" da ich mit der api relativ schlecht zurecht komme. Auch ein Tutorial habe ich bis dato nicht finden können.

Vielen Dank schonmal für eure Unterstützung

Grüße

p.s. Man verzeihe mir die Ironie, 8 Std gesucht und gegooglet und immer noch nichts rausgekommen. Das verkrafte ich nur mit Humor.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um mal eine Alternative einzuwerfen: Ist es denn noetig die Berichte veraenderlich zu halten? Wenn nicht wuerde ich den Weg ueber LaTeX und pdflatex gehen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

cofi hat geschrieben:Um mal eine Alternative einzuwerfen: Ist es denn noetig die Berichte veraenderlich zu halten? Wenn nicht wuerde ich den Weg ueber LaTeX und pdflatex gehen.
Mit einer konventionellen Template-Engine wie Jinja. ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Hase
User
Beiträge: 101
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo,
ich mache sowas auch mit LaTeX, was aber auch Nachteile hat. Eigentlich finde ich den Weg über OOO besser, nur leider benutzt es bei uns (außer mir) keiner.

Schau dir mal http://odfpy.forge.osor.eu/
an, damit kann man eine Menge machen.

I.H.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mir fallen 3 Alternativen ein:

1. Je nachdem wie komplex euer Cooperate-Design ist baust du es mit reStructured Text nach und nutzt dann rst2odf.
2. Wenn das Enddokument auch ein PDF sein darf machst du alles mit ReportLab.
3. Wenn das Enddokument auch ein PDf sein darf baust du dir ein blanko Cooperate-Design PDF, generierst deinen Report mit LaTeX (dann LaTeX zu PDF) oder ReportLab und mergst dann beide PDF.

IMHO ist Weg nur 2 der flexibelste. Und relativ simpel, wenn man sich ein bisschen mit ReportLab auskennt. :-)

Gruß, noisefloor
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Primitive Lösung: odts sind ja lediglich zip-Archive mit XML-Dateien. In der Vergangenheit habe ich das so gelöst, daß ich mir ein ODT-Dokument als Vorlage angelegt und darin Platzhalter definiert habe. Dann wurde das Dokument von Python nur noch kopiert, "aufgeschnürt", die Platzhalter ersetzt, neuer Inhalt zurückgeschrieben und anschließend wieder verschnürt. Fertig. Das ganze nur mit Bordmitteln von Python, namentlich zipfile und re.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo zusammen und danke für die vielen Antworten,

ein PDF darf es leider nicht sein, auch Latex nicht. Der erstellte Report (z.b. Bugreport) soll von einer typischen Bürokraft clientseitig zur erstellung angefordert werden und nach Erstellung vom Server
zum Client gesendet werden.

PDF würde Zusatzsoftware zur Nachkorrektur verlangen und Latex ist zwar für technische Mitarbeiter durchaus üblich aber wie gesagt eher weniger für kaufmänische Bürokräfte.

So finde ich den Weg von Pekh sehr interessant.
Gerne würde ich mir, wenn natürlich möglich, dein erstellets Beispiel ma genauer anschauen und zusätzlich würde mich interessieren wo die Grenzen der Lösung sind.

Ich habe zwar ein Template bei welchem ein Deckblatt, Fussnoten und weitere Corporate Design Elemente vordefiniert sind. Jedoch muss ich Über Python dann H1,H2,H3.. Elemente, Textformatierungen sowie Anpassung ob/oder ohne Deckblatt sowie das Inhaltsverzeichnis anpassen.

Ich bin brennden darauf gespannt, ob das möglich ist.

Schon mal danke euch

Grüße
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Das sollte alles möglich sein. Bastel dir doch mal ein Dokument, das alles (Inhaltsverzeichnis, Seitenumbrüche, verschiedene Formatierungen) enthält. Dann packe es aus (wenn sich dein Archivprogramm querstellt Dateierweiterung auf .zip setzen) und schaue dir mal die content.xml an. Mit ein bisschen Ahnung von xml-Formaten (notfalls tuts auch xhtml) solltest du schnell erkennen, welche Texte du einfügen mußt. Der ätzende Teil ist dann, passende reguläre Ausdrücke zu entwerfen um den noch benötigten Code vom Rest zu trennen. Wenn es sehr komplex werden sollte, könntest du über den Einsatz von xml-Bibliotheken nachdenken.

Den Code kann ich vermutlich erst nächste Woche hochladen. Wir sind hier gerade mitten im Umzug begriffen, und der ist irgendwo vergraben. Ich muß aber ohnehin in den nächsten Tagen an das Programm ran, da werde ich mal versuchen, ein brauchbares Beispiel zu extrahieren. Wenn ich es vergessen sollte, bitte per PM erinnern.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hi,

schonmal vielen Dank. Ich werde das morgen in der Arbeit mal ausprobieren.
Reguläre Ausdrücke? War Theoretische Informatik doch für was gut.

Danke soweit und einen schönen Vatertag
BlackJack

Also ich würde ja gleich auf eine XML-Bibliothek setzen statt mit regulären Ausdrücken zu arbeiten. Man kann die zu ersetzenden Teile dann zum Beispiel über entsprechend benannte Absatz- und Formatvorlagen in der Textverarbeitung kennzeichnen und mit XPath zielgenau erfassen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pekh hat geschrieben:Primitive Lösung: odts sind ja lediglich zip-Archive mit XML-Dateien. In der Vergangenheit habe ich das so gelöst, daß ich mir ein ODT-Dokument als Vorlage angelegt und darin Platzhalter definiert habe. Dann wurde das Dokument von Python nur noch kopiert, "aufgeschnürt", die Platzhalter ersetzt, neuer Inhalt zurückgeschrieben und anschließend wieder verschnürt. Fertig. Das ganze nur mit Bordmitteln von Python, namentlich zipfile und re.
Ich würde zwar eher lxml und/oder Genshi nutzen, aber das scheint mir keine allzuschlechte Lösung zu sein, wenn ODT rauskommen soll :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Genshi habe ohnehin schon im Einsatz. Mir ist allerding noch nicht klar wie ich das OpenOffice Document ansprechen kann, ein file.open wird da ja wohl nicht ausreichen.
Was nutze ich als Zwischenschicht?
problembär

Hallo,

bin grad' an sowas (Berichte generieren mit Python) mit LaTeX dran. Klappt auch, aber ziemlich umständlich zu programmieren. Aber ästhetisch sehr schönes Textergebnis am Ende, nach all der Arbeit.

Wenn Du über OpenOffice gehen willst, kannst Du ja mal sehen, ob das hier was für Dich wäre.

Gruß
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

rads hat geschrieben:Genshi habe ohnehin schon im Einsatz. Mir ist allerding noch nicht klar wie ich das OpenOffice Document ansprechen kann, ein file.open wird da ja wohl nicht ausreichen.
Was nutze ich als Zwischenschicht?
od* sind doch einfach nur Zip-Archive. Also im Zweifel das zip-Modul aus der Standard-Lib.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

So:

Code: Alles auswählen

import zipfile

f = zipfile.ZipFile("test.odt", "a")

f.extract("content.xml")
with open("content.xml") as h:
    data = h.read().replace("test", "tset")
with open("content.xml", "w") as h:
    h.write(data)

f.write("content.xml")
f.close()
Wobei ein XML Parser oder RegEx sichere sind als ein einfaches replace.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Schonmal vielen Dank, ich schaue mir das gleich an und halte euch über Ergebnisse auf dem laufenden.

Vielen Dank und Grüße.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

hallo zusammen,

ich hab mich heute ein bisl gespielt und denke ich mache es jetzt über ODFPY.
http://odfpy.forge.osor.eu/.

Allerdings habe ich noch ein paar Schwierigkeiten.
Ich habe jetzt ein Template (odt file mit ein paar variablen, footer, header, mainpage, index) angelegt.
Nun möchte ich, nach dem Inhaltsverzeichnis, anfangen die Struktur aufzubauen.
Also h1 element, text, h1 elment, h2 element , text element und so weiter.

Allerings habe ich es bis dato nicht hinbekommen, an eine bestimmte Stelle zu springen und dort dann "einfach"
Text anzuhängen.Versucht habe ich das indem ich eine variable im odt file definiert habe und diese über

Code: Alles auswählen

mydoc.text.VariableGet("content")
ansprechen wollte.

Anbei ein Beispiel

Code: Alles auswählen

from odf.opendocument import OpenDocumentText
from odf.style import Style, TextProperties
from odf.text import H, P, Span
from opendocument import load

mydoc = load("GS_Beispiel.odt")
position = mydoc.text.VariableGet("content")
h=P(text="Hello World!")
position.text.addElement(h)
mydoc.save("newReport.odt")
FehlerMeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Entwicklungsecke\EclipseWorkspace\x_OOOExport\src\tutorial\helloWord.py", line 14, in <module>
    position = mydoc.text.VariableGet("content")
AttributeError: Element instance has no attribute 'VariableGet'
An sich logisch, da nach Api das Anhängen an einer Variable nicht möglich ist, jedenfalls so wie ich das verstehe.
Aber wie dann *grübel*


Das eigentliche Problem ist allerdings für mich das ich aus der Api/Dokumentation nicht schau werde.
http://odfpy.forge.osor.eu/manual/

Die Beispiele beschäftigen sich immer mit dem kompletten Neuaufbau, jedoch will ich wie ich das durch Xpath und genshi kenne an eine Stelle springen und dort Text anfügen. Sicherlich möglich aber mir wohl noch nicht bekannt.

Hat von euch vielleicht einer ein Beispiel? Wahrscheinlich stehe ich schon wieder auf dem Schlauch.

Danke und schönes Wochenende.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo und guten Morgen an diesen schönen regnerischen Tag,

ich finde mich langsam in ODFPY rein, obwohl da sicherlich noch viel ausprobieren notwendig ist.
Allerdings stehe ich immer noch vor einem größen Problem, wer hätte das jetzt erwartet? Ich habe
in der Datenbank bzw. als Quelle Wiki-Texte vorliegen.

Kennt einer von euch ein Modull wie ich nun die Wiki Formatierung zu OO.org xml-Formatierung umwandle.
Sicherlich, das könnte man selber schreiben, aber das hat doch bestimmt schon einer in einer schönen
lib gemacht?

Grüße
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Welche Wikisyntax wurde denn verwendet?
Gibt es nicht schon einen Konverter für deine Wikisyntax?
Musst du die Seiten noch nachbearbeiten?
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo Snede

verwendet werden würde MoinMoin. Allerdings habe ich jetzt die Eingabe umgestellt von Wiki zu HTML.
Die HTML Eingabe wird durch eine neue Editorerweiterung realisiert.

Folglich muss ich "nur" noch HTML zu ODT wandeln.
Da habe ich im Forum etree einmal aus der Standardlib oder aus lxml hier i als Empfehlung gefunden.

Bis jetzt habe ich die Änderungen noch nicht genau verglichen, denke aber das die Standardlib
reichen sollte da ich wie gesagt "nur" von (x)html zu odt (XML) muss und keine nachträgliche Änderung
mittels xpath durchfühern will. Ansonsten würd ich auch hier wieder auf Genshi zurück greifen.

Wichtig ist mir eigentlich nur das das Format (Farbe, Einrücken, Zeilenumbrüche) erhalten bleibt, Umlaute
richtig übersetzt werden so das ich das ganze möglichst einfach mittels odfpy in ein file schreiben kann.

Schaunma mal
Antworten