我正在使用 Python 和 Qt 4.4,我必须打印一些页面。最初我以为我会使用带有 CSS 的 HTML 来生成这些页面。但是 HTML 有一些限制。
现在的问题是:有什么东西比 HTML 更好,但同样(或几乎)易于使用?此外,它应该与 GPL 兼容。
编辑:
kdgregory & Mark G:最明显的限制是我不能指定打印机边距。还有一个问题:如何添加页码?
Jeremy French:我必须打印的一件事是某人订购的所有产品的清单,该清单可以分布在几页上。
8 年来,我一直在与 Python 的打印(或 PDF)输出作斗争,到目前为止,我遇到了以下方法(按个人喜好排序):
对于订单、发票等,我强烈推荐 JasperReports。使用可视化编辑器定义布局的能力可以节省大量时间。
有乳胶。不确定这是否属于“像 html 一样易于使用”的类别,但这并不难。
打印是指打印机吗?如果是这样,请检查ReportLab的 PDF 工具。
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
c = canvas.Canvas("hello.pdf")
c.drawString(9*cm, 22*cm, "Hello World!")
c.showPage()
c.save()
您可能会考虑Sphinx,这是一个将 reStructuredText 文件转换为各种输出格式(包括 HTML 和 LaTeX)的包,用于可打印的 PDF。它在 BSD 下获得许可,现在是官方 Python 文档工具。
你看过http://www.w3.org/TR/css3-page/吗?印刷媒体是高度可定制的。在我的新项目中,我将用这个替换 PDF 生成器。
XSL 格式化对象(可扩展样式表语言系列 (XSL) 的一部分),如果您需要完全控制打印文档。
然后,您需要一个格式化对象处理器,如FOP或Antenna house,将 XSL-FO 文档转换为 PDF 或 PostScript。
仅使用Qt 的本机打印有什么问题?
或者,如果您使用的是 Mac,您可以查看Python 的石英绑定,但它显然不是 GPL。
我开始喜欢asciidoc。基本上你会产生纯文本。这可以通过使用像Django 模板或Jinja2这样的模板系统来增强很多。这在原则上很像 mdorseif 描述的 XSLT-FO 事物(您使用工具链来生成 docbook,然后生成任何您喜欢的东西),但并没有那么令人头疼。已经有一个很好的工具链包装器可以让大多数事情变得简单。
JasperReports已经提到过,但是我们在没有服务器或 servlet(即,不需要 JasperServer 或 pyJasper)的 Python-Qt 应用程序中使用它。
所以基本上,您安装Jasper Reports Library而不是服务器/servlet 。然后,您需要创建一个小的 Java 程序,该程序使用 Jasper 报告库从序列化输入(例如 XML)生成 PDF 报告。如果你进行网络搜索,应该有很多这样的例子,你只需要写一次。然后将这个 Java 程序连同所有必需的库一起编译成一个 JAR 文件。
此时您可以安装JasperSoft Studio并创建 Jasper 报告模板。然后在 Python 中,您可以使用JPype(或任何其他 Python-to-Java 库)来启动 JVM,加载您的 JAR 文件,调用您的 Java 函数,将您的序列化数据传递给它,并指定您想要的报告模板。
所有这些都不是微不足道的,但它非常简单。我们喜欢这个解决方案,因为它在 Qt Designer/Creator 中提供了一个拖放式表单编辑器、一个拖放式 JasperReports 报表设计器,以及直接从 Python 中收集的数据生成 PDF 报表的能力。所有这些都使用了支持良好的工具和库,因此该解决方案在可预见的未来不太可能分崩离析。