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
84
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
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
200
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
390
Building an Out-of-Order CPU
latte72
1
780
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.2k
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
190
アクセシビリティから考える情報設計
high_g_engineer
0
370
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
710
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
SREの越境 / SRE Collaboration
y0hgi
0
100
App Intentsのビルドプロセスを支える技術
kntkymt
0
370
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
4
2.3k
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
1.8k
Featured
See All Featured
How to make the Groovebox
asonas
2
2.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
A designer walks into a library…
pauljervisheath
211
25k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
570
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
The Language of Interfaces
destraynor
162
27k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
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程度 空きあります