2009-11-30 11 views
6

Ich habe eine WSGI-Anwendung, die Rechnungen generiert und sie als PDF speichert.ODT/DOC (X) generieren und in PDF konvertieren, ohne OO.o/MS

Bisher habe ich ähnliche Probleme mit FPDF (oder Äquivalenten) gelöst, die PDF von Grund auf wie eine GUI zu generieren. Leider bedeutet das, dass die gesamte Formatierungslogik (Positionierung von Kopf- und Fußzeilen und Inhalten, Styling) in der Anwendung liegt, wo sie eigentlich nicht sein sollte.

Da die Vorlagen bereits in Office-Formaten (ODT, DOC, DOCX) existieren, würde ich diese lieber als Basis verwenden und den eigentlichen Inhalt ausfüllen. Ich habe das Appy-Framework gefunden, das ziemlich genau das mit annotierten ODT-Dateien macht.

Das lässt immer noch das größere Problem offen, tho: Konvertieren von ODT (oder DOC oder DOCX) in PDF. Auf einem Server. Linux läuft. Ohne GUI-Bibliotheken. Und damit ohne OO.o oder MS Office.

Ist das überhaupt möglich oder ist es besser, das Styling in meinem Code zu behalten?

Der eigentliche Inhalt, der ausgefüllt werden würde, ist tatsächlich ziemlich eingeschränkt: ein paar Absätze, von denen einige optional sein können, eine Überschrift oder zwei, immer an der gleichen Stelle und ein paar Zeilen einer Tabelle. In HTML wäre das trivial.

EDIT: Grundsätzlich möchte ich eine Bibliothek, die ODT-Dateien aus ODF-Dateien als Vorlagen generieren kann und eine Bibliothek, die das Ergebnis in PDF konvertieren kann (das ist wahrscheinlich die Crux).

Antwort

2

Ich weiß nicht, wie man automatische ODT -> PDF-Konvertierung, aber eine einfachere Route könnte Ihre Rechnungen als HTML generieren und konvertieren sie in PDF mit http://www.xhtml2pdf.com/. Ich habe die Bibliothek nicht selbst ausprobiert, aber es scheint definitiv vielversprechend.

+0

ich das Problem mit diesem Ansatz gedacht wären, dass Fußzeilen/Header würde immer noch direkt behandelt werden müssen - ich habe auf jeder Seite die Fußzeile an der gleichen Stelle zu halten. Ich weiß, dass CSS viele Druckoptionen hat, aber ich bin mir nicht sicher, ob es das kann (beweise mich falsch). –

+1

Es scheint, XHTML2PDF/Pisa unterstützt Kopf- und Fußzeilen über einige CSS-Erweiterungen. Werfen Sie einen Blick auf http://www.xhtml2pdf.com/doc/pisa-de.html - Abschnitt 7.4 enthält ein Beispiel zum Erstellen einer Fußzeile auf jeder Seite eines Dokuments. –

+0

Das scheint den Trick zu machen. Groß! Ich werde ein bisschen damit herumspielen müssen, aber ich denke, es ist eine perfekte Lösung, um das Styling aus dem Code herauszuhalten. Es bleibt immer noch die Redundanz, ein ODF/DOC (X) Template als XHTML/CSS + neu zu erstellen, aber das ist nur ein geringes Problem. –

1

Sie können QTextDocument, QTextCursor und QTextDocumentWriter in PyQt4 verwenden. Ein einfaches Beispiel zu zeigen, wie man eine odt-Datei schreiben:

>>>from pyqt4 import QtGui 
# Create a document object 
>>>doc = QtGui.QTextDocument() 
# Create a cursor pointing to the beginning of the document 
>>>cursor = QtGui.QTextCursor(doc) 
# Insert some text 
>>>cursor.insertText('Hello world') 
# Create a writer to save the document 
>>>writer = QtGui.QTextDocumentWriter() 
>>>writer.supportedDocumentFormats() 
[PyQt4.QtCore.QByteArray(b'HTML'), PyQt4.QtCore.QByteArray(b'ODF'), PyQt4.QtCore.QByteArray(b'plaintext')] 
>>>odf_format = writer.supportedDocumentFormats()[1] 
>>>writer.setFormat(odf_format) 
>>>writer.setFileName('hello_world.odt') 
>>>writer.write(doc) # Return True if successful 
True 

Wenn nicht sicher, ob der Unterschied zwischen odt und ODF in diesem Fall. Ich überprüfte den Dateityp und es stand 'application/vnd.oasis.opendocument.text'. Also ich nehme an es ist odt. Sie können mit QPrinter in eine PDF-Datei drucken.

Weitere Informationen unter: http://qt-project.org/doc/qt-4.8/