15

我正在使用 Python 和 Qt 4.4,我必须打印一些页面。最初我以为我会使用带有 CSS 的 HTML 来生成这些页面。但是 HTML 有一些限制。

现在的问题是:有什么东西比 HTML 更好,但同样(或几乎)易于使用?此外,它应该与 GPL 兼容。

编辑:

kdgregory & Mark G:最明显的限制是我不能指定打印机边距。还有一个问题:如何添加页码?

Jeremy French:我必须打印的一件事是某人订购的所有产品的清单,该清单可以分布在几页上。

4

10 回答 10

24

8 年来,我一直在与 Python 的打印(或 PDF)输出作斗争,到目前为止,我遇到了以下方法(按个人喜好排序):

  • 通过pyJasper(由我编写)或JasperServer使用JasperReports。您可以使用所见即所得的设计工具iReport来定义您的布局。您的 Python 代码将通过 HTTP 联系基于 Java 的 Jasper 引擎并使其呈现 PDF(pyJasper 处理)。我们每天使用几千页。
  • 使用纯文本输出。你不能再快了。我们每天使用它几百页。
  • 使用 XSLT-FO。您还必须调用基于 Java 的渲染引擎,例如 FOB。可能会导致性能问题,但可以通过长时间运行 Java 服务器进程来缓解 - 与 Jasper 相同的方法。我们每天使用它几百页,但编写 XSLT-FO 文档让我头疼。不用于新代码。
  • 生成LaTeX源代码并使用 Latex 软件包渲染为 PDF。让 LaTeX 看起来像喜欢的样子是相当困难的。但只要您使用提供的 LaTeX 样式,就可以了。在我的商店没有用于生产。
  • 使用ReportLab 工具包生成 PDF 。水平有点低。更底层:FPDF。我们每天使用 FPDF-Ruby 几百页。花了很多时间才得到我们想要的布局。
  • 直接生成Postscript。奇怪,但在速度和控制方面你几乎无法获得更多。我们用它来生成每天有几十万 Jpeg 的联系表。需要摆弄,但很有趣。
  • 使用troff /groff 生成 Postscript/PDF。非常低级别的但很适合做简单的、高容量的事情。因此从未在生产中使用过它。

对于订单、发票等,我强烈推荐 JasperReports。使用可视化编辑器定义布局的能力可以节省大量时间。

于 2009-01-19T21:59:41.810 回答
14

有乳胶。不确定这是否属于“像 html 一样易于使用”的类别,但这并不难。

于 2009-01-19T17:07:50.747 回答
7

打印是指打印机吗?如果是这样,请检查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()
于 2009-01-19T17:08:00.403 回答
4

您可能会考虑Sphinx,这是一个将 reStructuredText 文件转换为各种输出格式(包括 HTML 和 LaTeX)的包,用于可打印的 PDF。它在 BSD 下获得许可,现在是官方 Python 文档工具。

于 2009-01-19T17:26:14.717 回答
4

你看过http://www.w3.org/TR/css3-page/吗?印刷媒体是高度可定制的。在我的新项目中,我将用这个替换 PDF 生成器。

于 2012-10-07T10:36:21.353 回答
3

XSL 格式化对象(可扩展样式表语言系列 (XSL) 的一部分),如果您需要完全控制打印文档。

然后,您需要一个格式化对象处理器,如FOPAntenna house,将 XSL-FO 文档转换为 PDF 或 PostScript。

于 2009-01-19T17:18:15.747 回答
1

仅使用Qt 的本机打印有什么问题?

于 2009-01-19T17:18:00.850 回答
1

或者,如果您使用的是 Mac,您可以查看Python 的石英绑定,但它显然不是 GPL。

于 2009-01-19T20:58:24.853 回答
1

我开始喜欢asciidoc。基本上你会产生纯文本。这可以通过使用像Django 模板Jinja2这样的模板系统来增强很多。这在原则上很像 mdorseif 描述的 XSLT-FO 事物(您使用工具链来生成 docbook,然后生成任何您喜欢的东西),但并没有那么令人头疼。已经有一个很好的工具链包装器可以让大多数事情变得简单。

于 2013-10-31T09:00:42.320 回答
1

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 报表的能力。所有这些都使用了支持良好的工具和库,因此该解决方案在可预见的未来不太可能分崩离析。

于 2014-12-30T18:37:18.240 回答