Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
wkhtmltopdfの次どうするか問題2026
Search
Shinichi Maeshima
September 18, 2026
Programming
52
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
wkhtmltopdfの次どうするか問題2026
2026/09/17 に開催されたRailsTokyo#6 での発表資料です
https://railstokyo.connpass.com/event/400709/
Shinichi Maeshima
September 18, 2026
More Decks by Shinichi Maeshima
See All by Shinichi Maeshima
メタプログラミングRuby問題集の活用
willnet
2
2k
rails g authenticationから学ぶRails8.0時代の認証
willnet
5
5.7k
What's a well-behaved Rails extension gem?
willnet
0
940
Sidekiq vs Solid Queue
willnet
15
15k
どうしてこうなった?から理解するActive Recordの関連の裏側
willnet
6
1.7k
Exceptional Rails
willnet
6
8.4k
Breaking the Flaky Test Cycle
willnet
2
2.5k
mrskで広がるインフラの選択肢
willnet
1
1.2k
アプリケーションを長期にわたって無理なく運用するためのたったひとつの方法
willnet
2
2.3k
Other Decks in Programming
See All in Programming
Go のフラットな パッケージに 「ファイル単位の private」を 〜Linter “declscope” を作った話〜
mpyw
0
310
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
0
270
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
210
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
Building an Out-of-Order CPU
latte72
1
770
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
170
Security issues being discussed on Web Platforms
petamoriken
0
930
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
110
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
XHTMLが残したもの
yosuke_furukawa
PRO
2
800
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
550
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
300
Paper Plane (Part 1)
katiecoart
PRO
2
11k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Ruling the World: When Life Gets Gamed
codingconduct
0
330
Believing is Seeing
oripsolob
1
220
Being A Developer After 40
akosma
91
590k
Navigating Weather and Climate Data
rabernat
0
520
Art, The Web, and Tiny UX
lynnandtonic
304
22k
4 Signs Your Business is Dying
shpigford
187
23k
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Transcript
wkhtmltopdfの次どうするか問 題2026 Shinichi Maeshima(@willnet) RailsTokyo#6 2026/09/17
wkhtmltopdfの次どうするか問 題2026
wkhtmltopdf知ってる人🖐
wkhtmltopdfとは • HTMLからPDFを生成するツール • Qt Webkitというブラウザエンジンを利用してHTMLを描画し、その結果を PDFとして出力する • Qt(デスクトップアプリや組み込みアプリを作るためのフレームワーク)の中 のプロジェクトの一つがQt
Webkit • 主にユーザに「今見ている画面のPDF版」をダウンロードさせたいときに使 われる • Rubyからだと主にwicked̲pdfやpdfkitなどのgem経由で使われる
wicked̲pdfを利用したときのコード例
wkhtmltopdfはPDFをレンダリ ングするときの第一候補だった が…
None
This repository was archived by the owner • Qt webkit自体がメンテナンス終了してしまったことにより、Qt
webkitに依 存しているwkhtmltopdfもメンテナンスが終了した • QtはQtWebEngineというchromiumベースのプロジェクトに移行している • wkhtmltopdfが依存しているのはQt4系であり、2012年のブラウザエンジン である
2012年のブラウザエンジン
wkhtmltopdfを利用したときに使えないjsの記法や機能 • アロー関数 • let, const • async, await
wkhtmltopdfを利用したときに使えないcssの記法や機能 • FlexBox • Grid • CSS変数
セキュリティの問題 • CVE-2022-35583 • 最新のwkhtmltopdf(0.12.6)に見つかったSSRFの脆弱性 • iframeなどのsrcを外部入力できると任意のURLの情報をPDFの形で得るこ とができてしまう • 外部からの入力をエスケープしない、というのが条件なので一般的なRails
アプリケーションでは成立しづらいとは思います
wkhtmltopdfから他の何かに移 行したい!!!!
次どうします? • というのを以前(3年半前)ブログに書いた • 要約: ferrumやgrover、Thinreportsなんかがいいんですかね?
続編も書いた • 要約: ferrumを利用してPDF変換するferrum̲pdfが便利で良さそう
2026年現在 • まだまだwkhtmltopdfを使い続けているプロジェクトは残っている印象
なぜなのか • 工数が足りない • 情報が足りない • その他(もし知ってたら後で教えて!)
工数が足りない • 僕にはどうにもできないので頑張ってください><
情報が足りない • どの選択肢を選ぶといいのかがわからない、知見が足りていないのでは?と いう仮説 • 例1: wkhtmltopdfから(任意のツール)に移行するとどのくらい負荷がかかり ますか? • 例2:
候補となるツールの比較
選択肢とそれに関する知見を話し ていきます
選択肢1: 運用でカバーする
運用でカバーする • ユーザに対して、macなら⌘+p、pcならctrl-pを押してもらい自分でwebペー ジをPDFに保存してもらう • 自社の社員が触る管理画面である、という前提なら割と現実的かつ楽な選択 肢じゃないかと思います
選択肢2: 一からPDFを生成する
一からPDFを生成する • 「HTMLをPDF変換」ではなく、Thinreportsなどのツールを使って一から PDFを生成する • HTMLをPDF化する必要がないなら考えることが減って楽
選択肢3: chromiumをアプリケ ーションサーバ内で使う
chromiumをアプリケーションサーバ内で使う • groverとferrum̲pdfが候補 • groverはpuppeteer経由でchromiumを動かす • ferrum̲pdfはRubyから直接chromiumを動かす
puppeteer経由だと何がどれくらい違うんですか? • puppeteerを使うにはアプリケーションサーバにnodeが必要、というのはあ るけど、それ以外で具体的にどう違うんですかね • メモリ消費量など変わったりするんですか???
具体的に知るためにベンチマークをとった • willnet/html-to-pdf-benchmark (https://github.com/willnet/html-to-pdf-benchmark) • dockerがあればお手元でも試すことができるようにしています • 利用マシン: M1 Max
MBP • wkhtmltopdf、Grover, Ferrum(ferrum̲pdf)で次の環境を用意して32のPDF化リクエストを 割り振り、その時のCPU、メモリ、スループットを見た • 1スレッド1プロセス • 4スレッド1プロセス • 1スレッド4プロセス • 4スレッド4プロセス
None
None
なぜこのような違いがあるのか • ferrumはプロセスごとに1つのchromiumブラウザインスタンスを使い回す • (ただしPDFへの変換はロックを用いて1スレッドのみ実行できるようにし ている) • groverはPDF生成を1回実行するごとに新しいchromiumブラウザインスタン スを起動してPDF生成後に終了する •
なので単純なベンチマークだとferrumの方が優れているように見える
運用も考えるとgroverの方が安定していそう • 毎回chromiumブラウザインスタンスを作成→終了する方がメモリリークやメ モリの断片化の影響を受けにくい • chromiumがクラッシュしても影響はその時1回だけに限定される
groverとferrumの比較をしたものの • そもそもの話としてchromiumで500MB以上のメモリ消費量がアプリケーシ ョンに上乗せされるのってどうなんですかね • アプリケーションサーバの台数を増やす必要が出てくる • アプリケーションサーバの依存ライブラリも増える
選択肢4: 別のアプリケーション サーバでchromiumを動かすも のを作る
HTML→PDFの専用アプリケーションを作る • 「HTMLを投げたらPDFを返すアプリケーション」があるとアプリケーショ ンサーバのメモリ問題等をある程度緩和できる • SaaSは検索すると色々出てくるけど、大体においてPDF化したいHTMLは帳 票などの外に出したくない情報なので自前で持ちたい
自社で作っている例1: ANDPAD社 • PDF 生成との終わらない戦い、あるいはデータ量の見積もりミスの話 ANDPAD Tech Blog (https://tech.andpad.co.jp/entry/ 2026/06/30/100000)
• 専用アプリケーション内でgroverを使ってHTML→PDF化 • 運用中に起きた問題点を共有してくれてありがたい🙏
自社で作っている例2: Gusto社 • Building Virtuous PDF: How Gusto Replaced a
Deprecated Library with a Modern PDF Microservice (https://engineering.gusto.com/ building-virtuous-pdf-how-gusto-replaced-a-deprecated-library-with-amodern-pdf-microservice-b37c481eaa03) • wicked̲pdfに対するvirtuous̲pdfを作った • 専用アプリケーションでferrumを利用している
自社で作るという選択肢 • 素朴な実装であればサッと作ることはできそう • ただし長期にわたって運用するのであれば巨人の肩に乗れると楽では
選択肢5: 別のアプリケーション サーバでchromiumを動かすも のを使う
Gotenberg • Dockerベースのgo言語製PDF生成ツール • HTMLを受け取りPDFを返すHTTPアプリケーションサーバ • 内部ではchromiumを利用 • PDF生成ツールとしてはだいぶ有名
gotenbergのRubyクライアント • sanzstez/gotenberg-ruby • しかし個人的に書き味が好みではない
gotenberg-rubyの書き味
自分好みにしたくて自作してみた • willnet/gotenberg-rails
gotenberg-rails • 諸々準備しておけば↓だけでpdfを返せる
ここまでのまとめ • wkhtmltopdfの代替方法としていくつかの手法を紹介しました • 運用でカバーする • 一からPDFを生成する • アプリケーションサーバ内で変換する •
PDF変換用アプリケーションサーバを作る • PDF変換用アプリケーションサーバを使う
おしまい? • 応募時点ではそのつもりだったのですが… • sghtmltopdfという超新星が8月に現れてしまった
None
sghtmltopdfとは • rust製 • chromiumを使わず、servo(OSS webレンダリングエンジン)内の各ツールを利用 してHTMLをレンダリングし、それをPDFに変換している • wkhtmltopdfとメモリ容量がほぼ同等で速い( https://waka.github.io/
sghtmltopdf/ ) • wkhtmltopdf(wicked̲pdf)からの移行ドキュメントがある • アプリケーションサーバから使う、もできるしgotenbergのような形でも使える • ストリーミングモード(PDFを作りつつクライアントにレスポンスを返す)ができる
sghtmltopdfを使うときに考慮すること • 現時点でJavaScriptは使えない • <script>タグは無視される • CSSもchromeと同等ではなく、使えないものがある • 他にもいくつか制限あり( https://waka.github.io/sghtmltopdf/appendix/
limitations.html ) • ただしwkhtmltopdfからの移行、という前提ならおおよそ問題ないはず?
まとめ • wkhtmltopdfからの移行であればsghtmltopdfをまず検証してみましょう • どうしてもchromiumが欲しい時にはgotenbergかferrum̲pdfがいいんじゃ ないでしょうか • アプリケーションサーバでPDF生成する、と外部サービスとしてPDF生成 機能を外出しするかを検討しましょう •
自分たちでコントロールしたいぞ、というのであれば自作も選択肢として良さ そうです
Shinichi Maeshima Willnet Inc. @netwillnet @willnet https://blog.willnet.in
2027/01/23(土) ぎんざRuby会議02やります
Kaigi on Rails 2026で 設定の話をします
技術顧問業をしています
顧問先は週1程度 空きあります