是否有比HTML更好的布局语言进行打印?

时间:2009-01-19 17:05:39

标签: python qt layout printing gpl

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

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

修改

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

Jeremy French:我要打印的一件事就是有人订购的所有产品的清单,这些产品可以分布在几页上。

10 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分:14)

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

答案 2 :(得分:7)

通过 print 你的意思是打印机吗?如果是这样,请检查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()

答案 3 :(得分:4)

你见过http://www.w3.org/TR/css3-page/吗?打印介质可高度自定义。 在我的新项目中,我将用这个替换PDF生成器。

答案 4 :(得分:3)

XSL格式化对象(The Extensible Stylesheet Language Family (XSL)的一部分),如果您需要控制打印文档。

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

答案 5 :(得分:3)

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

答案 6 :(得分:1)

仅使用Qt's native printing有什么问题?

答案 7 :(得分:1)

或者,如果您使用的是mac,则可以查看quartz bindings for Python,但这显然不是GPL。

答案 8 :(得分:1)

我开始喜欢asciidoc。基本上你生成纯文本。使用Django templatesJinja2等模板系统可以大大增强这一点。这与mdorseif描述的XSLT-FO很相似(你使用工具链生成docbook,然后是你喜欢的任何东西),但不是那么令人头痛。已经有一个很好的工具链包装器,可以让大多数事情变得简单。

答案 9 :(得分:1)

已经提到了

JasperReports ,但是我们在没有服务器或servlet的Python-Qt应用程序中使用它(也就是说,不需要JasperServer或pyJasper)。

所以基本上,不是服务器/ servlet,而是安装Jasper Reports Library。然后,您需要创建一个Java程序,该程序使用Jasper Reports Library从序列化输入(如XML)生成PDF报告。如果你进行网络搜索,应该有很多例子,你只需要写一次。然后,将包含所有必需库的Java程序编译为JAR文件。

此时,您可以安装JasperSoft Studio并创建Jasper报告模板。然后在Python中,您可以使用JPype(或任何其他Python-to-Java库)来启动JVM,加载JAR文件,调用Java函数,将序列化数据传递给它,并指定所需的报告模板。

所有这一切都不是微不足道的,但它非常简单。我们喜欢这个解决方案,因为它在Qt Designer / Creator中提供了一个拖放式表单编辑器,一个拖放式JasperReports报表设计器,以及直接从Python中收集的数据生成PDF报表的功能。所有这些都使用了受到良好支持的工具和库,因此在可预见的未来,这种解决方案不太可能会崩溃。