PDF生成パイプラインはwkhtmltopdfで動いており、長年問題なく機能してきた — そのプロジェクトがアーカイブされるまでは。リポジトリは2023年1月2日に読み取り専用となり、以降セキュリティパッチは提供されていない。内部で使われている古いWebKitエンジンは、モダンなCSS(flexbox、grid、カスタムプロパティ)を予測できない形でレンダリングする。レポートのレイアウトが崩れるようになった、あるいは本番サーバーでメンテナンスされていないバイナリを使い続ける理由がなくなったなら、サポートされた代替ツールが必要だ。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)のみ |
| コマンドライン | 対応 — サイレント実行のバイナリで、GUIなし、ダイアログなし、ポップアップなし | 対応 — コマンドラインツール |
| サーバーAPI | ActiveX/COMにより、ASP、PHP、.NET、Python、Ruby、Javaから呼び出し可能 | サードパーティ製の言語バインディングやラッパー。コミュニティによる保守 |
| PDFセキュリティ | デジタル署名(X.509 PFX)、AES暗号化、パスワード、権限フラグに対応 | 基本機能のみ。署名には非対応 |
| ライセンス | 商用、$750からの買い切りライセンス、30日間無料トライアル | 無料、オープンソース |
| 対応OS | Windows 7/8/10/11およびWindows Server(IIS、Docker、Citrix、Wine) | Windows、Linux、macOS |
| サポート | CoolUtilsによる開発者サポート | コミュニティのみ。プロジェクトはアーカイブ済み |
正当に評価すべき点はある — wkhtmltopdfはその地位に見合う実績を積んできた。無料でオープンソースであり、たった1つのコマンドで実行でき、シェルアウトできる言語であればどれにでもスクリプトとして組み込める。10年もの間、「このHTMLをサーバー上でPDFに変換する」という問いへの定番の答えであり続け、導入実績は膨大だ — 数えきれないほどの請求書発行、レポート作成、エクスポートのパイプラインが今も毎日これを呼び出している。テーブルやスタイル付きの領収書、シンプルなレポートといった単純で静的なHTMLであれば、コストゼロで今でも十分なPDFを生成できる。
テンプレートが単純で変更されないものであり、アーカイブされたバイナリを使い続けることを受け入れられるなら、wkhtmltopdfは壊れているわけではない。問題は、開発が止まった後に変化したすべてのもの — 新しいCSS、新しいTLS、新しいセキュリティ要件 — にある。
Windowsサーバーであれば、Total HTML Converter Xが最も近い代替となる — 既存のスクリプトで使っているコマンドライン形式のワークフローをそのまま維持しつつ、メンテナンスされたレンダリングエンジンを追加し、出力をPDF以外にも広げられる。CLIの呼び出しを1つ置き換えるだけで、署名、暗号化、追加フォーマットが手に入る。LinuxやmacOSで運用している場合、Total HTML Converter Xは役に立たない — Windows専用だからだ — そうした環境でメンテナンスされている選択肢は、直接またはラッパー経由で使うヘッドレスのChromeやChromiumになる。
方法は2つある — コマンドラインのバイナリをシェルアウトで呼び出すか、ActiveX/COMオブジェクトをプロセス内から呼び出すかだ。シェルアウトはwkhtmltopdfのパイプラインからの変更が最も小さく済む方法で、実行ファイルとスイッチの構文を置き換えるだけでよい。
<?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スイッチで出力形式を指定する。複数のファイルを1つのPDFにまとめるには-combineを追加し、結果に署名するには-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へという呼び出しをそのまま置き換えるものだ。同じパターンは画像出力にも使え、PDFを書き出す代わりに-c jpgや-c tiffでページをラスタライズできる。ワイルドカードマスクや-listテキストファイルを使えば、1つのコマンドでURLやローカルファイルのバッチ全体を処理できる。
Total HTML Converter Xはサーバー単位のライセンスで$750からとなっており、30日間の試用版には制限が一切ない完全な機能が備わっている — 現在のパイプラインで最もレンダリングが崩れているページを対象に試して、出力されたPDFを見比べてほしい。単発の作業でGUIが必要な場合は、同じエンジンをデスクトップ版のTotal HTML Converterとしても利用できる。
無料トライアルをダウンロードして、ファイルを数分で変換。
クレジットカードもメールアドレスも不要。