你的PDF处理流程一直依赖wkhtmltopdf,多年来运行良好—直到这个项目被归档。代码仓库已于2023年1月2日转为只读,此后不会再有安全补丁,其内置的老旧WebKit引擎在渲染flexbox、grid、自定义属性等现代CSS时也变得难以预测。如果你的报表现在经常出现错位,或者你已经无法为在生产服务器上继续运行一个无人维护的程序找到理由,那么你需要一个有人维护的替代方案。在Windows上,这个替代方案就是Total HTML Converter X。
快速答案:对于简单的静态HTML,wkhtmltopdf仍然可用,也仍然免费—但项目已被归档,不会再有安全补丁,现代CSS的渲染效果也变得不可预测。若需要在Windows服务器上部署有人持续维护的生产环境,Total HTML Converter X提供最新的CSS渲染、实时URL与本地文件批量转换为PDF、DOC、TIFF和JPEG、静默命令行,以及可从ASP、PHP和.NET调用的COM/ActiveX API。
| Total HTML Converter X | wkhtmltopdf | |
|---|---|---|
| 持续维护 | 是—商业产品,持续更新 | 否—代码仓库自2023年1月2日起归档并转为只读 |
| 渲染引擎 | 现代引擎,完整支持CSS 1/2、分页符、适应页宽,另可选用Chrome渲染引擎 | 老旧的WebKit版本;现代CSS(flexbox、grid)经常渲染错误,且不会再有修复 |
| JavaScript处理 | 支持—通过Chrome渲染引擎(-engine chrome) | 受限于已停止更新的WebKit引擎 |
| 输入来源 | 本地HTML/MHT文件及实时URL,支持批量处理 | 本地文件和URL |
| 输出格式 | PDF、DOC、RTF、XLS、TIFF、JPG、PNG、TXT | 仅支持PDF和图像(PNG、JPG) |
| 命令行 | 支持—静默运行的程序,无图形界面、无对话框、无弹窗 | 支持—命令行工具 |
| 服务器API | ActiveX/COM,可从ASP、PHP、.NET、Python、Ruby、Java调用 | 第三方语言绑定和封装库,由社区维护 |
| PDF安全性 | 数字签名(X.509 PFX)、AES加密、密码保护、权限标志 | 基础功能;不支持签名 |
| 授权方式 | 商业授权,一次性付费,起价$750,提供30天免费试用 | 免费开源 |
| 操作系统 | Windows 7/8/10/11以及Windows Server(IIS、Docker、Citrix、Wine) | Windows、Linux、macOS |
| 技术支持 | CoolUtils开发团队提供支持 | 仅有社区支持;项目已归档 |
先说句公道话:wkhtmltopdf当得起这个地位。它免费开源,一条命令就能运行,也能干净地嵌入任何支持shell调用的语言脚本。整整十年间,它都是“如何在服务器上把这段HTML渲染成PDF”这个问题的默认答案,装机量极大—无数发票、报表和导出流程如今仍在每天调用它。对于简单的静态HTML—一张表格、一张带样式的收据、一份纯文本报告—它依然能以零成本生成一份过得去的PDF。
如果你的模板简单且不再变动,并且能接受运行一个已归档的程序,wkhtmltopdf并没有坏。真正的问题在于它停止维护之后发生的一切变化:更新的CSS、更新的TLS、更高的安全要求。
在Windows服务器上,Total HTML Converter X是最接近于直接替换的方案:它保留了你脚本中已经在用的命令行工作方式,换上一个持续维护的渲染引擎,并将输出范围扩展到PDF之外。你只是把一次命令行调用换成另一次,却换来了签名、加密和更多格式支持。如果你运行在Linux或macOS上,Total HTML Converter X帮不上忙—它仅支持Windows—这类平台上持续维护的路线是无头Chrome或Chromium,可以直接调用,也可以通过封装库调用。
有两种方式:通过shell调用命令行程序,或者在进程内直接调用ActiveX/COM对象。对于原本使用wkhtmltopdf的流程来说,shell调用是改动最小的方式—只需替换可执行文件和参数写法:
<?php
// Convert a local HTML file to PDF from PHP on Windows
exec('HtmlConverter.exe C:\www\invoice.html C:\pdf\invoice.pdf -c pdf -log C:\log\html.txt');
?>
-c pdf开关用于设置目标格式;加上-combine可将多个文件合并为一个PDF,加上-pfxfile和-pfxpass则可为结果签名。由于该程序静默运行,不会有对话框阻塞Web请求。在经典ASP或.NET中,你也可以改为创建内置的ActiveX/COM对象,在进程内运行同样的转换,无需为每个页面都启动一个子进程。
可以—只需把URL传给转换器代替文件路径,它就会抓取并渲染实时页面:
HtmlConverter.exe http://www.example.com C:\pdf\page.pdf -c pdf -log C:\log\html.txt
这可以直接替代wkhtmltopdf的URL转PDF调用。同样的方式也适用于图像—使用-c jpg或-c tiff即可将页面栅格化为图像,而不是生成PDF。通配符掩码或-list文本文件可以让一条命令处理一整批URL或本地文件。
Total HTML Converter X按服务器授权,起价$750,30天试用版功能完全不受限—可以拿你现有流程中渲染效果最差的页面来测试,并排比较生成的PDF。同一个引擎也以桌面版Total HTML Converter的形式提供,适合偶尔需要图形界面处理单个任务的场景。