我在我的 Django 应用程序中使用Pisa/xhtml2pdf从 HTML 源生成 pdf。那是:
- 我生成了使用所有“打印”内容(例如分页符、页眉、页脚等)格式化的 HTML 文件
- 我使用 Pisa 将此 HTML 转换为 pdf
这个过程没问题,但速度很慢(特别是在处理长表时),我必须根据比萨特性/限制使用 HTML/CSS。
问题是:这是从 Web 应用程序生成 pdf 的正确方法(即创建 HTML,然后将其转换为 pdf)还是有更直接的方法,即用更合适的语言“编写”pdf?
我在我的 Django 应用程序中使用Pisa/xhtml2pdf从 HTML 源生成 pdf。那是:
这个过程没问题,但速度很慢(特别是在处理长表时),我必须根据比萨特性/限制使用 HTML/CSS。
问题是:这是从 Web 应用程序生成 pdf 的正确方法(即创建 HTML,然后将其转换为 pdf)还是有更直接的方法,即用更合适的语言“编写”pdf?
WeasyPrint作者在这里。使用 HTML/CSS 生成 PDF(与直接使用较低级别的 PDF 库相比)的重点是获得自动布局。它允许您指定高级约束,例如h1 { page-break-after: avoid }
并让布局引擎计算出来,而不是指定所有内容的绝对位置。当您对文档进行更改时,前者更易于维护。
像 rst2pdf 这样的一些工具有自己的样式表语法,但这只是重新发明 CSS 的一种不好的方式。
但是,是的,转储为屏幕制作的复杂样式表可能不会产生很好的结果。最好在构建样式表时考虑到打印,或者甚至@media print
在 CSS 或<link media="print">
HTML 中使用完全不同的样式表。
我认为使用 Pisa 或http://weasyprint.org/等库从 html 生成 pdf是最简单的方法。因为它负责插入图像、css、条形码(在比萨上)......等
如果您想自己编写 pdf,请查看 Reportlab,但实施时间会更长。在这两种情况下,我建议始终使用 celery 或 python-rq 在后台生成 pdf 以进行优化。
众所周知,比萨存在各种问题——尤其是长桌。一般来说,应该避免使用 PISA。其他选项包括:
制作 PDF 的一般规则:一分钱一分货。
像 Pisa 或 Apache FOP 这样的转换器是半生不熟的解决方案,适用于简单的情况,但总的来说很糟糕。
您还可以使用 QT webkit 渲染引擎通过http://code.google.com/p/wkhtmltopdf/和 django-wkhtmltopdf 从 HTML 创建 PDF。
优点是您可以像通常编写 WebKit 一样编写 HTML 和 CSS。如果您要输出现有网页,这很有效,但如果从头开始生成 PDF,则可能不太合适。