2009-11-30 15 views
6

Tengo una aplicación WSGI que genera facturas y las almacena como PDF.Generar ODT/DOC (X) y convertir a PDF, sin OO.o/MS

Hasta ahora he resuelto problemas similares con FPDF (o equivalentes), generando el PDF desde cero como una GUI. Lamentablemente, esto significa que toda la lógica de formateo (encabezados de posicionamiento, pies de página y contenido, estilo) está en la aplicación, donde realmente no debería estar.

Como las plantillas ya existen en los formatos de Office (ODT, DOC, DOCX), preferiría simplemente utilizarlas como base y completar el contenido real. Encontré el framework Appy, que hace más o menos eso con los archivos ODT anotados.

Eso todavía deja el problema más grande abierto, tho: conversión de ODT (o DOC, o DOCX) a PDF. En un servidor Ejecutando Linux. Sin bibliotecas de GUI. Y así, sin OO.o o MS Office.

¿Es esto posible o prefiero mantener el estilo en mi código?

El contenido real que se rellenaría en realidad es bastante restringido: unos pocos párrafos, algunos de los cuales pueden ser opcionales, un título o dos, siempre en el mismo lugar y unas pocas filas de una tabla. En HTML esto sería trivial.

EDITAR: Básicamente, quiero una biblioteca que pueda generar archivos ODT a partir de archivos ODF que actúen como plantillas y una biblioteca que pueda convertir el resultado en PDF (que probablemente sea la clave).

Respuesta

2

No sé cómo hacer una conversión automática de ODT -> PDF, pero una ruta más simple podría ser generar sus facturas como HTML y convertirlas a PDF usando http://www.xhtml2pdf.com/. No he probado la biblioteca, pero definitivamente parece prometedor.

+0

que pensé el problema con este enfoque sería que los pies de página/cabeceras todavía tendrían que ser manejado directamente - Tengo que mantener el pie en el mismo lugar en cada página. Sé que CSS tiene muchas opciones de impresión, pero no estoy seguro de si puede hacer eso (demuéstrame que estoy equivocado). –

+1

Parece que XHTML2PDF/Pisa admite encabezados y pie de página mediante algunas extensiones de CSS. Eche un vistazo a http://www.xhtml2pdf.com/doc/pisa-en.html: la sección 7.4 contiene un ejemplo sobre cómo crear un pie de página en cada página de un documento. –

+0

Eso parece hacer el truco. ¡Estupendo! Tendré que jugar un poco con esto, pero creo que es una solución perfecta para mantener el estilo fuera del código. Todavía deja la redundancia de volver a crear una plantilla ODF/DOC (X) como XHTML/CSS +, pero eso es solo una preocupación menor. –

1

Puede usar QTextDocument, QTextCursor y QTextDocumentWriter en PyQt4. Un simple ejemplo para mostrar cómo escribir en un archivo ODT:

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

Si no está seguro de la diferencia entre ODT y ODF en este caso. Verifiqué el tipo de archivo y decía 'application/vnd.oasis.opendocument.text'. Entonces supongo que es extraño. Puede imprimir en un archivo pdf usando QPrinter.

Más información en: http://qt-project.org/doc/qt-4.8/