Django/Python:使用正确的语言生成 pdf
Posted
技术标签:
【中文标题】Django/Python:使用正确的语言生成 pdf【英文标题】:Django/Python: generate pdf with the proper language 【发布时间】:2012-12-06 17:11:05 【问题描述】:我在我的 Django 应用程序中使用 Pisa/xhtml2pdf 从 HTML 源生成 pdf。那就是:
-
我生成了使用所有“打印”内容(例如分页符、页眉、页脚等)格式化的 HTML 文件
我使用 Pisa 将此 HTML 转换为 pdf
这个过程没问题,但速度很慢(特别是在处理长表时),我必须根据 Pisa 的特性/限制使用 HTML/CSS。
问题是:这是从 Web 应用程序生成 pdf 的正确方法(即创建 HTML,然后将其转换为 pdf)还是有更直接的方法,即用更合适的语言“编写”pdf ?
【问题讨论】:
跟进:对于像素完美的报告,我们决定转给专门的报告设计师 (Pentaho) 【参考方案1】:众所周知,比萨存在各种问题 - 尤其是长桌。一般来说,应该避免使用 PISA。其他选项是:
直接使用 Reportlab z3c.rml(Reportlab 模板语言克隆) 商业替代品: PrinceXML PDFreactorPDF 制作的一般规则:一分钱一分货。
像 Pisa 或 Apache FOP 这样的转换器是半生不熟的解决方案,适用于简单的情况,但总的来说很糟糕。
【讨论】:
谢谢。但是你觉得把 HTML 转成 pdf 是个好办法吗? 奇怪的后续问题...做什么的好方法?你还有什么输入数据? 我的意思是:我必须从我的应用程序中提取数据并将其放入pdf; HTML 只是数据和 pdf 之间的媒介。我想知道我是否可以直接写 pdf 或使用其他媒体。 可能是我的英语不够好。您建议哪种解决方案:Reportlab(即从 Python 到 Pdf)或类似 Pisa 的“html 到 pdf”转换器(即从 Python 到 HTML 到 Pdf)? 来自 github 的最新 xhtml2pdf 在长表中表现正常,现在也有 pdftotalpages 计数,也没有记录,请查看 google 组。在 Latex 噩梦之后,在生产中使用它来制作长发票。无论如何,Latex 更快,但也有局限性,比如内存会让你转向 lualatex。还有大约 8 个包用于创建长表。回到好老 HTML 男孩。 (这是个笑话,因为 Latex 比较老,但根据我的经验不是)更多:在 Latex 之前,我使用 libreoffice headless 实现了 pdf 生成,它随机死亡。【参考方案2】:我认为使用 Pisa 或 http://weasyprint.org/ 等库从 html 生成 pdf 是最简单的方法。因为它负责插入图像、css、条形码(在比萨上)...等
如果您想自己编写 pdf,请查看 Reportlab,但实施时间会更长。在这两种情况下,我建议始终使用 celery 或 python-rq 在后台生成 pdf 以进行优化。
【讨论】:
【参考方案3】:WeasyPrint 作者在这里。使用 HTML/CSS 生成 PDF(与直接使用较低级别的 PDF 库相比)的重点是获得自动布局。它可以让您指定像h1 page-break-after: avoid
这样的高级约束并让布局引擎解决它,而不是指定所有内容的绝对位置。当您对文档进行更改时,前者更易于维护。
像 rst2pdf 这样的一些工具有their own stylesheet syntax,但这只是重新发明 CSS 的一种糟糕方式。
但是,是的,转储为屏幕制作的复杂样式表可能不会产生很好的效果。最好在构建样式表时考虑到打印,甚至使用完全不同的样式表,在 CSS 中使用 @media print
或在 HTML 中使用 <link media="print">
。
【讨论】:
【参考方案4】:您还可以使用 QT webkit 渲染引擎通过http://code.google.com/p/wkhtmltopdf/ 和 django-wkhtmltopdf 从 HTML 创建 PDF。
优点是您可以像通常编写 WebKit 一样编写 HTML 和 CSS。如果您要输出现有网页,这很有效,但如果从头开始生成 PDF,则可能不太合适。
【讨论】:
以上是关于Django/Python:使用正确的语言生成 pdf的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django (python) 和 s3 上传文件?