Herokuで帳票(PDF)
ふと思い立ってPDF出力のAddonの調査していたら予想外に大変な便利Addonにぶちあたりました(^^;
多分これは今年一番のお役立ちエントリです。一度でもPDF出力に悩まされたことのある人なら読まないと後悔するレベル(かも)
★HerokuのPDF Addon
Addonを探すとDocRaptorとHyPDFという二つのAddonが見つかります。
どちらもHTMLを渡せばそれをPDFに変換してくれるというサービスのようです。
多分、DocRaptorの方が有名なので、最初こちらから試そうと思ったんですが。。。
料金プランを見てビックリ
- Starter(Free) - 月に5件まで
- Basic($19) - 月に125件まで
- Professional($37) - 月に325件まで
- Premium($95) - 月に1250件まで
- Max($189) - 月に5000件まで
無料プランがあるのは良いんだけど、月に5件ってなんだよ。。。(--
そんなのテストしてたら一瞬で消費するっちゅーの。
一番上のプランでも月に5000件、一日換算だと166件しか出せないって。。。
なんでこんな料金プランにしてるんだろ。。。
一方のHyPDFの料金プランは以下
- Nano(Free) - 日に5件まで
- Milli($15) - 日に15件まで
- Kilo($30) - 日に45件まで
- Mega($60) - 日に135件まで
- Giga($120) - 無制限
安っ!
制限のリセットも1日単位なので、ちょっと試すだけでもこちらの方が扱いやすそうです。
何より$120で使い放題というのは太っ腹。(^^;
ていうか、あんまり商売っ気がないのかも。
ブラウザで「www.hypdf.com」にアクセスすると、いきなりHeroku AddonsのページにリダイレクトされるのでどうもHyPDF単体ではサービス提供しておらず、Heroku Addonとしてしか提供されてないみたいなんですよね。
そういうのもアリなのか。。。(^^;
そんなこんなでまずはHyPDFから試してみることにしました。
(後から気がつきましたがDocRaptorにもHyPDFにもテストモードがあって、その場合は制限回数は更新されません。と言ってもDocRaptorの方はもはや試していませんが。。。)
★HyPDFの使い方
https://devcenter.heroku.com/articles/hypdf#api-reference
基本的な使い方としてはJSONで出力対象のHTMLと各種オプションを渡すだけです。
そうするとレスポンスのHTTPボディでPDFのバイナリが返ってきます。
HTMLの渡し方には文字列でHTMLを丸ごと渡す方法と、URLで外部サイトへの参照を渡す方法の両方がサポートされています。
オプションとしては
- ヘッダ、フッタ
- 上下左右の余白
- グレイスケール
- コールバックURL(指定した場合PDF生成が非同期となり生成完了時にこのURLがキックされる)
- 生成したPDFをS3にアップロードするためのオプション情報
などが指定できます。
何回か試したところ、PDF生成には最大10秒くらいかかることがあったのでHerokuから使う場合は非同期にした方が良いかも。
使い方は難しくないですけど唯一の注意点はHyPDFの使っている証明書がStartCom(StartSSL)の証明書だという点です。
知らなかったんですがこの証明書、デフォルトではOracle JDKのキーストアには入ってないんですね。なので、接続するためには自分で証明書をインストールするかHostNameの検証をスキップするかする必要があります。
(この辺を調べてる過程でさらに憂鬱な衝撃の事実を知ったんだけど、それはまた別に書きます。)
一応JavaのAPIラッパーも作ったのでサクッと試したい場合は使ってみてください。
https://github.com/shunjikonishi/hypdf4j
ちなみにHeroku上ではOpenJDKだからなのか、キーストアをHerokuが独自で用意しているからかわかりませんが証明書のインストールは不要です。
ちなみにちなみにPDF生成以外にも
- PDFのプロパティ情報取得(pdfinfo)
- PDFのテキスト取得(pdftotext)
- PDFの連結(pdfunite)
- 複数ページのPDFから指定ページの抜き出し(pdfextract)
といったことが(APIラッパーでも)できますが、多分そんなに使うことはないです。(^^;
★PDFの日本語出力は必ずはまることになっている
そして、とりあえず試しに作ってみたPDFがこんな。
。。。
あー、うん。。。。この豆腐見慣れてるなぁ。。。(--
思い出したけど、自力でPDF生成を試みた時も日本語フォントで挫折したんだった。。。。
PDFを生成するホストに日本語フォントをインストールすれば出力することはできるんだけど、ライセンス関係がどうなっているのかがイマイチ確信が持てなくて結局棚上げにしたような気が。
これはアカンかもなぁ。。。と思いつつ、一応サポートに日本語出ないんだけどと投げてみました。
で、その間にDocRaptorの方も試してみるかとドキュメントを読んでたらなんと20分後には返事が来ました。
早っ!!
You can use any custom font by including it with @font-face in your styles:
@font-face {
font-family: MyFont;
src: url(www.somecdn.com/my_font.ttf);
}
body {
font-family: MyFont;
}
な・る・ほ・ど!!!
ここでWebフォントなのか!!!!
Webフォントって図形文字や凝ったデザインの文字を使う場合に使用するものというイメージでしたが、探してみるとIPAフォントとか標準的なものもあるんですね。
IPAフォントを組み込んで出力してみると日本語も正しく出力されるようになりました。素晴らしい!(^^v
PDFのフォント問題って世界中の開発者が頭を抱えてる問題のような気がしますけど、これはかなり見事な解決方法だと思います。
心の底から感心しました。
★excel2canvasと組み合わせてみる
ところで僕はexcel2canvasというHTMLのCanvasを使ってExcelをブラウザ上で表示するというライブラリを作ってたりするんですが、それとHyPDFを組み合わせた場合どうなるかということが気になってちょっと試してみました。
Canvasへの描画はちょっと厳しいんじゃないかと事前には思ってたんですが、試してみると結果はこんな感じ
凄っ!!!
思った以上にイケてるやんけ!
何パターンか試してみたところ、HyPDFはHTMLの横幅に合わせてスケールを調整するらしく、幅がExcelの標準レイアウトで1ページに収まらないようなものはレイアウトが崩れますが、印刷前提でレイアウトが調整されているようなExcelファイルはだいたい良い感じに出力されました。(^^v
今時のExcelはファイルをHTML形式で保存できたりもしますが、Webフォントへの変更とかそれなりに手間だったりもするので、これはこれでアリなソリューションだと思います。
勢い余ってデモサイトも作ってみたのでご興味ある方はお試しあれ。
http://hypdf-excel.herokuapp.com/
ていうか、これこのままHerokuアドオン化しても需要ありそうじゃね?(^^;