我们打算使用 wkhtmltopdf 将 html 转换为 pdf,但我们担心 wkhtmltopdf 的可扩展性。有谁知道它是如何扩展的?我们的网络应用程序可能会尝试转换数十万个(相对复杂的)html,所以对我们来说有一些想法很重要。有人得到这方面的任何信息吗?
5 回答
首先,您的问题很笼统;在询问任何项目的可扩展性时,需要考虑许多变量。显然,在一周内转换“数十万”个 HTML 文件与期望在一天或一小时内完成转换是有区别的。除此之外,“相对复杂”的 HTML 对其他人来说可能意味着不同的东西。
话虽如此,我想因为我做了类似的事情,使用 wkhtmltopdf 转换了大约 450,000 个 html 文件;我会分享我的经验。
这是我的场景:
- 450,000 个 HTML 文件
- 95% 的文件只有一页
- 一般包含2张图片(相对路径,本地系统)
- 表格数据(有时包含嵌套表)
- 其他地方的简单标记(强、斜体、下划线等)
- 备用台式电脑
- 8GB 内存
- 2.4GHz 双核处理器
- 7200转高清
我使用了一个用 PHP 编写的简单单线程脚本来遍历文件夹并将 html 文件路径传递给 wkhtmltopdf。转换所有文件的过程大约需要 2.5 天,而且错误非常少。
我希望这能让您深入了解在 Web 应用程序中使用 wkhtmltopdf 可以得到什么。一些明显的改进来自于在更好的硬件上运行它,但主要来自利用多线程应用程序同时处理文件。
根据我的经验,性能很大程度上取决于你的照片。它有很多大图片,它可以显着减慢。如果可能的话,我会尝试进行测试,以估计您的服务器的负载。有些人确实将它用于密集操作,但我从未听说过数十万。我想就像所有事情一样,这取决于您的内容和资源。
以下引用直接来自wkhtmltopdf 邮件列表:
我每天使用 wkHtmlToPDF 将大约 6000 封电子邮件转换为 PDF。这一切都是在具有 4GB 内存的四核服务器上完成的……这已经足够了。
有一些性能提示,但我建议在优化性能之前尝试一下你的瓶颈。例如,我记得有人说过,如果可能的话,直接从磁盘加载图像而不是在中间使用 Web 服务器可以大大加快速度。
编辑:除此之外,我在玩 wkhtmltopdf 时玩得很开心。目前在具有 4Gb 内存的 Intel Centrino 2 上,我生成包含 57 页内容(混合 p、ul、table)、约 100 张图像和 toc 持续时间小于 7 秒的 PDF。我还在运行 Visual Studio、浏览器、http 服务器和其他各种可能会减慢它的软件。我直接使用标准输入和标准输出而不是文件。
编辑:我还没有尝试过,但是如果您已链接 CSS,请尝试将其嵌入 HTML 文件中(请记住进行前后测试以正确查看效果!)。这里的改进很可能取决于缓存和提供 CSS 的位置 - 如果每次都从磁盘读取它或者上帝禁止从 scss 重新生成它,它可能会非常慢,但如果结果被网络服务器缓存(我不认为wkhtmltopdf 缓存实例之间的任何内容)它可能不会产生很大的影响。YMMV。
wkhtmltopdf --print-media-type
正在快速燃烧。但是你会因此失去正常的 CSS 样式。
这可能不是复杂 html 页面导出的理想解决方案。但它对我有用,因为我的 html 内容非常简单并且采用表格形式。
在版本上测试wkhtmltopdf 0.12.2.1
我们尝试在任何实现中使用 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
您可以创建自己的 wkhtmltopdf 引擎池。我通过直接调用 API 而不是每次都启动进程 wkhtmltopdf.exe 来实现一个简单的用例。wkhtmltopdf API 不是线程安全的,所以不容易做到。此外,您不应忘记在 AppDomain 之间共享本机代码。