Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成ODT/DOC(X)并转换为PDF,无OO.o/MS_Python_Pdf_Ms Office_Openoffice.org_Odf - Fatal编程技术网

Python 生成ODT/DOC(X)并转换为PDF,无OO.o/MS

Python 生成ODT/DOC(X)并转换为PDF,无OO.o/MS,python,pdf,ms-office,openoffice.org,odf,Python,Pdf,Ms Office,Openoffice.org,Odf,我有一个WSGI应用程序,可以生成发票并将其存储为PDF格式 到目前为止,我已经用FPDF(或等效工具)解决了类似的问题,像GUI一样从头开始生成PDF。遗憾的是,这意味着整个格式化逻辑(定位页眉、页脚和内容、样式)都在应用程序中,而实际上不应该在应用程序中 由于模板已经存在于Office格式(ODT、DOC、DOCX)中,我更愿意将其作为基础并填充实际内容。我已经找到了Appy框架,它可以通过带注释的ODT文件实现这一点 这仍然存在一个更大的问题,即:将ODT(或DOC,或DOCX)转换为PD

我有一个WSGI应用程序,可以生成发票并将其存储为PDF格式

到目前为止,我已经用FPDF(或等效工具)解决了类似的问题,像GUI一样从头开始生成PDF。遗憾的是,这意味着整个格式化逻辑(定位页眉、页脚和内容、样式)都在应用程序中,而实际上不应该在应用程序中

由于模板已经存在于Office格式(ODT、DOC、DOCX)中,我更愿意将其作为基础并填充实际内容。我已经找到了Appy框架,它可以通过带注释的ODT文件实现这一点

这仍然存在一个更大的问题,即:将ODT(或DOC,或DOCX)转换为PDF。在服务器上。运行Linux。没有GUI库。因此,没有OO.o或MS Office

这是可能的,还是我最好在代码中保留样式

实际填写的内容实际上是相当有限的:一些段落,其中一些可能是可选的,一个或两个标题,总是在同一个地方,以及表中的几行。在HTML中,这将是微不足道的


编辑:基本上,我想要一个可以从ODF文件作为模板生成ODT文件的库,以及一个可以将结果转换为PDF的库(这可能是关键)。

我不知道如何进行ODT->PDF自动转换,但一个更简单的方法可能是将发票生成为HTML并使用HTML将其转换为PDF。我自己还没有尝试过这个库,但它看起来确实很有希望。

您可以在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文件

更多信息,请访问:

我认为这种方法的问题在于页脚/页眉仍然需要直接处理——我必须将页脚保持在每页的相同位置。我知道CSS有很多打印选项,但我不确定它是否能做到(证明我错了)。似乎XHTML2PDF/Pisa通过一些CSS扩展支持页眉和页脚。请看一看-第7.4节包含了一个关于如何在文档的每一页上创建页脚的示例。这似乎可以做到这一点。伟大的我不得不稍微修改一下,但我认为这是一个完美的解决方案,可以避免代码中出现样式。它仍然保留了将ODF/DOC(X)模板重新创建为XHTML/CSS+的冗余,但这只是一个小问题。