Python 使用Wkhtmltopdf/pdfkit+生成大型PDF;蟒蛇/烧瓶

Python 使用Wkhtmltopdf/pdfkit+生成大型PDF;蟒蛇/烧瓶,python,performance,wkhtmltopdf,Python,Performance,Wkhtmltopdf,我必须使用web应用程序生成一个大型PDF。PDF是使用客户端的大量电子邮件内容数据集生成的,现在它是用php编写的,我所做的基本上是在数据集中的每个项目上循环,为每个客户端创建一个单独的HTML页面,然后通过添加页面选项将所有这些页面逐个添加到wkhtmltopdf 这显然不是很优雅,当输入非常大时,php就会消亡,比如1000个客户端。这个pdf背后的想法是,我们必须定期向客户发送物理邮件,我们只想创建一个大文件,然后打印并单独放入信封中,然后邮寄它们和其他东西 我现在用Python而不是p

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

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

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

以下是我考虑过的几个选择

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

只写入一个文件 我不确定我将如何实现这一点,但也许我不应该创建一堆html文件,我应该只创建一个文件,并继续在html文件的底部添加内容

坚持当前的理念? 也许完全相同的编程设计/概念将神奇地与Python配合使用

不过,我认为这些选择中的任何一个或所有可能都是完全错误和有缺陷的


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

就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>

.pb{之前的分页符:始终;}
...
...
这样可以确保每封电子邮件都从一个新页面开始。然后使用所需的样式和cli选项将输出馈送到wkhtmltopdf,并检查是否一切都按计划进行。这个测试应该做得很快


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

为什么不能使用单个文件?你可以使用分页符,不是吗?这可能是我可以考虑的一个很好的选择——如果可行的话:那么我建议使用一个更健壮的工具!Reportlab或Weasyprint可以完成这项工作(Weasyprint可能是最好的选择,因为它可以将html转换为pdf)