生成ODT/DOC(X)并转换为PDF,无需OO.o/MS
我有一个WSGI应用程序,它可以生成发票并将其保存为PDF文件。
到目前为止,我用FPDF(或者类似的工具)解决过类似的问题,都是从头开始生成PDF,就像在图形界面中操作一样。可惜的是,这样一来,所有的格式化逻辑(比如标题、页脚和内容的位置,样式等)都在应用程序里,这其实不应该是这样。
因为模板已经存在于Office格式(ODT、DOC、DOCX)中,我更希望直接使用这些模板,然后填入实际的内容。我发现了Appy框架,它可以用带注释的ODT文件来做到这一点。
不过,这样还是留下了一个更大的问题:如何在服务器上将ODT(或DOC、DOCX)转换为PDF。服务器运行的是Linux,没有图形界面库。因此,也就不能使用OO.o或MS Office。
这到底可行吗?还是说我还是应该把样式放在代码里呢?
实际上,要填入的内容是相当有限的:几段文字,其中一些可能是可选的,还有一两个标题,总是放在同样的位置,以及几行表格。在HTML中,这个操作会简单得多。
补充:基本上,我想要一个可以从ODF文件生成ODT文件的库,作为模板使用,还有一个可以将结果转换为PDF的库(这可能是关键所在)。
2 个回答
你可以在PyQt4中使用QTextDocument、QTextCursor和QTextDocumentWriter。这是一个简单的例子,展示如何写入一个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
如果你不确定在这个情况下odt和odf有什么区别,我查了一下文件类型,它显示为'application/vnd.oasis.opendocument.text'。所以我猜它是odt格式。你也可以通过使用QPrinter将内容打印成pdf文件。
更多信息可以查看: http://qt-project.org/doc/qt-4.8/
我不知道怎么自动把ODT文件转换成PDF,不过有个简单的方法可以试试,就是把你的发票先生成成HTML格式,然后再用http://www.xhtml2pdf.com/这个工具把HTML转换成PDF。我自己还没试过这个库,但看起来很有希望。