2009-11-30 10 views
6

Ho un'applicazione WSGI che genera fatture e le archivia come PDF.Genera ODT/DOC (X) e converti in PDF, senza OO.o/MS

Finora ho risolto problemi simili con FPDF (o equivalenti), generando il PDF da zero come una GUI. Purtroppo questo significa che l'intera logica di formattazione (posizionamento di intestazioni, piè di pagina e contenuto, stile) si trova nell'applicazione, dove in realtà non dovrebbe essere.

Poiché i modelli esistono già nei formati Office (ODT, DOC, DOCX), preferirei semplicemente utilizzarli come base e inserire il contenuto effettivo. Ho trovato il framework Appy, che fa più che altro con i file ODT annotati.

Ciò lascia ancora aperto il problema più grande, ovvero: conversione di ODT (o DOC o DOCX) in PDF. Su un server Esecuzione di Linux. Senza librerie GUI. E così, senza OO.o o MS Office.

È possibile o è meglio mantenere lo stile nel mio codice?

Il contenuto effettivo che verrebbe compilato in realtà è piuttosto limitato: alcuni paragrafi, alcuni dei quali potrebbero essere facoltativi, un titolo o due, sempre nello stesso posto e poche righe di un tavolo. In HTML questo sarebbe banale.

MODIFICA: In sostanza, voglio una libreria in grado di generare file ODT da file ODF che fungono da modelli e una libreria in grado di convertire il risultato in PDF (che è probabilmente il punto cruciale).

risposta

2

Non so come andare su ODT automatico -> conversione PDF, ma un percorso più semplice potrebbe essere quello di generare le fatture come HTML e convertirle in PDF utilizzando http://www.xhtml2pdf.com/. Non ho provato la libreria da solo, ma sembra decisamente promettente.

+0

ho pensato che il problema di questo approccio è che piè di pagina/avrebbero ancora bisogno di essere gestite direttamente intestazioni - devo continuare a piè di pagina nella stessa posizione in ogni pagina. So che i CSS hanno molte opzioni di stampa, ma non sono sicuro che sia in grado di farlo (dimostrami che sbaglio). –

+1

Sembra che XHTML2PDF/Pisa supporti intestazioni e piè di pagina tramite alcune estensioni CSS. Dai un'occhiata a http://www.xhtml2pdf.com/doc/pisa-en.html - la sezione 7.4 contiene un esempio su come creare un piè di pagina su ogni pagina in un documento. –

+0

Questo sembra fare il trucco. Grande! Dovrò giocherellare un po ', ma penso che sia una soluzione perfetta per mantenere lo stile fuori dal codice. Lascia comunque la ridondanza di ricreare un modello ODF/DOC (X) come XHTML/CSS +, ma questa è solo una preoccupazione minore. –

1

È possibile utilizzare QTextDocument, QTextCursor e QTextDocumentWriter in PyQt4. Un semplice esempio per mostrare come scrivere un file 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 

Se non che la differenza tra ODT e ODF in questo caso. Ho controllato il tipo di file e ha detto "application/vnd.oasis.opendocument.text". Quindi presumo sia odt. È possibile stampare su un file PDF utilizzando QPrinter.

Maggiori informazioni su: http://qt-project.org/doc/qt-4.8/