使用Wkhtmltopdf / pdfkit + Python / Flask生成大型PDF

时间:2014-01-09 19:31:39

标签: python performance wkhtmltopdf

我必须使用网络应用生成大型PDF。 PDF是使用客户端的大量电子邮件内容数据集生成的,现在它是用PHP编写的,我正在做的基本上是循环遍历数据集中的每个项目,为每个客户端创建一个单独的HTML页面,然后添加所有这些通过添加页面选项将页面逐个添加到wkhtmltopdf。

这显然不是很优雅,当输入非常大时,php会死掉,就像1000个客户端一样。这个pdf背后的想法是我们必须定期向我们的客户发送物理邮件,我们只想创建一个大文件,然后我们将打印并单独将它们放入信封中,然后邮寄它们。

我现在正在使用Python而不是php重做这个。我也不确定应遵循哪种编码实践来确保以最快和最有效的方式生成PDF。

以下是我想到的几个选项

创建一个大变量

我想知道我可以创建一个大变量,然后将整个内容写入一个html文件,然后使用它来创建使用wkhtmltopdf的pdf。然而,这将是一个非常大的变量,RAM可能会变得疯狂。

只写一个文件

不确定我将如何实现这一点,但是我可能只创建一个文件并继续在该html文件的底部附加内容而不是创建一堆html文件?

坚持当前的概念?

也许完全相同的编程设计/概念将神奇地与Python一起使用 ...?

我认为这些选项中的任何一个或全部都可能是完全错误的,但也存在缺陷。

编辑:写入一个文件无法正常工作,因为这些邮件必须以物理方式发送,我需要确保每个客户端的每个新内容都是从新页面开始的。如果我写一个大文件,我就无法做到。

1 个答案:

答案 0 :(得分:2)

就wkhtmltopdf而言,分页很大程度上取决于您的内容和要求。我需要特定的分页符,但我没有“1个内容应该总是一页1”的限制 - 如果你这样做,请不要理会它。此外,如果您有非常具体的样式规则,则可能很难取决于样式。我用wkhtmltopdf做的最大的PDF只有100页左右,所以我无法评论尺寸。

我想用wkhtmltopdf做的是格式化这样的内容

<head>
    <style>
        .pb { page-break-before: always; }
    </style>
</head>
<body>
    <div id="mail1" class="pb">...</div>
    <div id="mail2" class="pb">...</div>
    <!-- etc etc -->
</body>

这可确保每封电子邮件都从新页面开始。然后使用所需的样式和cli选项将输出提供给wkhtmltopdf,并检查一切是否按计划完成。这个测试应该很快。

此外,如果HTML非常简单并且您始终可以依赖于特定格式(您可以使用简单的XML架构验证它),您可以尝试使用iTextSharp并手动转换HTML。我没有这样做,听起来很糟糕,但可能对你有用 - iTextSharp非常快。