ことの発端
Spring bootを利用した社内システムを作成していますが、表示されたHTMLを紙に印刷して掲示する、という運用をしています。
これを、印刷せずにAndroidタブレット端末に表示させて設置し、デジタルサイネージ的に表示させたいと思いました。
ところが意外な問題は、紙はA4サイズ、タブレット画面は16:9となり、ページがタブレット画面に収まらない。
解決案としては
- 完全にページを分ける(印刷用、タブレット用)
- cssのmediaクエリを使う
- pdfにして画面に収める
があります。mediaクエリが良さそうに見えますが、タブレットは解像度が高いのでPCとタブレットが区別できません。
そこでpdfです。pdfの場合、一回の出力で紙だろうがPCだろうがタブレット端末だろうが問題ないし、あとなんとなくpdf出力できる感じがかっこいいと思ったのでこのパターンをとることにしました。
作成法
システムがSpring bootで、ここからpdfを作成する方法を検討します。
調査の結果
- AbstractPdfViewを使う(Springのクラス。htmlのviewの代わりにpdfを表示するviewとして使える)
- flying-saucer-pdfを使う(この場合 “How To Create PDF through HTML Template In Spring Boot” が秀逸。ただし渡すMapはMap<String, Object>にした方がいい)
- WkHTMLtoPDFを使う(コマンドラインアプリ 参照:wkhtmltopdf.org)
これらが見つかりました。
ただ、AbstractPdfViewもflying-saucer-pdfも外部cssや画像を取り込むのが難しそうで、フォントの扱いやレイアウトのコントロールについて煩雑な印象がありました。その点WkHTMLtoPDFはhtmlを直接読み込んで、内部のレンダリングエンジン(webkit)の表示結果をpdf化するということなので、出来上がりイメージが全く想定通り!これは素晴らしいです!
ローカルファイルを扱う場合の注意点は –enable-local-file-access オプションを使うこと。これがあればcssや画像もしっかり読み込んでくれます。
まとめ
出来上がったHTMLを表示イメージ通りにpdfにするならWkHTMLtoPDFがベスト。
ローカルファイルを指定するなら –enable-local-file-access オプションを使いましょう。