wkhtmltopdf的性能表现

29

我们打算使用wkhtmltopdf将HTML转换为PDF,但我们担心wkhtmltopdf的可扩展性。 有谁知道它的扩展性如何? 我们的Web应用程序可能会尝试转换数十万个(相对复杂的)HTML,因此了解一些信息对我们很重要。 有人有相关信息吗?


3
圆角 CSS 边框导致我的渲染时间增加了20倍。移除这些后,我的渲染时间从一个相对简单的HTML页面的约6秒降至约0.3秒。例如:border-radius: 8px;border-top-left-radius: 6px; - T. Brian Jones
在我的情况下,经过大量的调查,我找到了一个从第三方获取QR码的URL,该第三方负责创建我的门票。 - shareef
5个回答

25
首先,你的问题相当笼统;在问及任何项目的可扩展性时需要考虑许多变量。显然,将“数十万”个HTML文件转换为一周,并期望在一天或一小时内完成,这是有区别的。此外,“相对复杂”的HTML对其他人可能意味着不同的事情。
尽管如此,由于我做过类似的事情——使用wkhtmltopdf转换约450,000个HTML文件,因此我想分享我的经验。
以下是我的情况:
  • 450,000个HTML文件
    • 95%的文件仅包含一页
    • 通常包含2个图像(相对路径,本地系统)
    • 表格数据(有时包含嵌套表格)
    • 其他地方有简单的标记(加粗,斜体,下划线等)
  • 备用台式电脑
    • 8GB RAM
    • 2.4GHz双核处理器
    • 7200RPM硬盘
我使用了一个简单的单线程PHP脚本,遍历文件夹并将HTML文件路径传递给wkhtmltopdf。该过程花费了大约2.5天的时间来转换所有文件,出现非常少量的错误。
希望这可以让你了解使用wkhtmltopdf在你的Web应用程序中可以期望得到的结果。一些明显的改进来自于在更好的硬件上运行它,但主要是通过利用多线程的应用程序同时处理文件来实现的。

42
对于不喜欢做数学的人来说,FYI是每个文档平均480毫秒。 - Derek Dahmer
4
每秒2页。 - xyres
根据我的经验,在超线程四核CPU上,我能够在大约30分钟内生成约4,000个简单发票,但前提是将发票分成4批同时发送到Web服务器。这样4个请求就可以并行处理。如果再增加请求数量,可能会导致Web服务器崩溃。 - Ciaran Gallagher

10
在我的经验中,性能很大程度上取决于您的图片。如果有很多大图片,它会明显减慢速度。如果可能的话,我建议进行一个测试,估计一下服务器的负载情况。有些人确实将其用于密集操作,但我从未听说过成千上万的情况。我想像所有事情一样,这取决于您的内容和资源。
以下引用直接来自wkhtmltopdf邮件列表
“我正在使用wkHtmlToPDF将每天约6000封电子邮件转换为PDF格式。这全部都是在四核服务器上完成的,内存为4GB……即使对此也足够了。”
有一些性能提示,但我建议在优化性能之前先尝试找出瓶颈所在。例如,我记得有些人说,如果可能的话,直接从磁盘加载图像而不是通过Web服务器可以显著加快速度。

编辑: 此外,我刚刚尝试了一些有趣的wkhtmltopdf操作。目前我使用一台配备4GB内存的英特尔Centrino 2电脑,生成包含57页内容(混合p、ul、table),约100张图片和目录的PDF文件,平均只需要不到7秒的时间。同时,我还在运行Visual Studio、浏览器、HTTP服务器以及其他可能会减慢速度的软件。我直接使用标准输入和标准输出,而不是文件。


编辑:我没有尝试过这个方法,但如果你已经链接了CSS,请尝试将其嵌入HTML文件中(记得进行前后测试以正确查看效果!)。这里的改进很可能取决于缓存和CSS所在的位置-如果每次从磁盘读取或重新生成SCSS文件,则可能会非常慢,但如果结果被Web服务器缓存(我认为wkhtmltopdf在实例之间不会缓存任何内容),则可能效果不大。具体情况因人而异。


2
改为从磁盘加载图片而非通过网络服务器加载,这样可以节省70%的生成时间!我刚测试了一下。 - np87
2
我想在这个答案中补充一点,如果你已经链接了CSS,你应该尝试将它嵌入到HTML文件中。这也可以节省一些时间。 - xyres
不错的技巧!我也正在使用ProcessStart通过WKHTML处理大约10个HTML页面(+定制页脚)。已经处理了超过2200万个PDF文件,每个PDF需要2秒左右的时间,有时候感觉有点多。 - Moons

3

我们在任何实现中都尝试使用wkhtmltopdf。我的对象是生成坐标点的巨大表格。通常我的pdf体积为500页。

我们尝试使用wkhtmltopdf的端口到.net。结果是

- Pechkin - Pro: don't need other app. Contra: slow. 500 pages generated about 5 minutes
- PdfCodaxy - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Problems with non unicode text
- Nreco - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Incorrect unlock libs after use (for me)

我们尝试使用从C#代码调用的二进制wkhtmltopdf。
Pro: easy to use, faster that libs
Contra: need temporary files (cannot use Stream objects). Break with very huge (100MB+)html files as like as other libs

1
关于NReco.PdfGenerator,我不知道它如何比纯WkHtmlToPdf慢(内部调用WkHtmlToPdf.exe在单独的进程中)。而且它不需要安装WkHtmlToPdf:所有文件都嵌入到DLL中,并在缺失时自动提取。 - Vitaliy Fedorchenko
@VitaliyFedorchenko 或许“badma”是通过标准输入(--read-args-from-stdin)发送作业,同时避免启动进程的惩罚,从而重复使用单个子进程,而Nreco则为每个PDF文件启动wkhtmltopdf进程。 - timmi4sa
@timmi4sa NReco.PdfGenerator也可以使用“--read-args-from-stdin”与“BeginBatch”/“EndBatch”API(请注意,此API仅适用于具有许可证密钥的商业用户)。 - Vitaliy Fedorchenko

3

wkhtmltopdf --print-media-type 是非常快速的。但是这样会失去普通的CSS样式。

对于复杂的HTML页面导出,这可能不是理想的解决方案。但对于我来说,它适用于我的HTML内容相当简单且以表格形式呈现。

在版本wkhtmltopdf 0.12.2.1上进行了测试。


奇怪的是,当我尝试这样做时,我的性能出现了下降。由于某种原因,它需要两倍的时间。 - Ciaran Gallagher
“--print-media-type” 只会忽略未定义为“打印”样式的 CSS 样式,所以这完全取决于您放置样式的位置。我不明白为什么这会变得“极快”,除了这个原因之外?为什么这对于复杂的 HTML 不是理想的呢?这完全取决于它正在渲染的 CSS。 - cederlof

2

您可以创建自己的wkhtmltopdf引擎池。我为一个简单的用例直接调用API而不是每次启动wkhtmltopdf.exe进程来实现。 wkhtmltopdf API不是线程安全的,所以这并不容易。此外,您不应忘记在AppDomains之间共享本机代码。


8
你能否举例说明代码,而不只是提供一般概念? - lacostenycoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接