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

Posted

技术标签:

【中文标题】生成 ODT/DOC(X) 并转换为 PDF,无需 OO.o/MS【英文标题】:Generate ODT/DOC(X) and convert to PDF, without OO.o/MS 【发布时间】:2009-11-30 13:01:30 【问题描述】:

我有一个 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 的库(这可能是症结所在)。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我认为这种方法的问题在于页脚/页眉仍然需要直接处理——我必须将页脚保持在每一页的相同位置。我知道 CSS 有很多打印选项,但我不确定它是否可以做到这一点(证明我错了)。 似乎 XHTML2PDF/Pisa 通过一些 CSS 扩展支持页眉和页脚。查看xhtml2pdf.com/doc/pisa-en.html - 第 7.4 节包含有关如何在文档的每一页上创建页脚的示例。 这似乎可以解决问题。伟大的!我将不得不稍微摆弄一下,但我认为这是将样式排除在代码之外的完美解决方案。它仍然留下了将 ODF/DOC(X) 模板重新创建为 XHTML/CSS+ 的冗余,但这只是一个小问题。【参考方案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”。所以我认为这是奇怪的。您可以使用 QPrinter 打印到 pdf 文件。

更多信息请访问: http://qt-project.org/doc/qt-4.8/

【讨论】:

以上是关于生成 ODT/DOC(X) 并转换为 PDF,无需 OO.o/MS的主要内容,如果未能解决你的问题,请参考以下文章

将 .odt .doc .ods 文件转换为 .txt 文件

从 OpenOffice 保存为 pdf

Android 4.4 无需用户参与即可打印为 PDF

是否有 Python 库可以为各种文档文件格式创建缩略图?

使用 ghostscript 将 PDF 转换为 x-3:2002 时,我应该使用哪些设置来保持颜色正确?

使用Aspose.PDF for .NET将PDF转换为HTML格式示例解读