Node.js
PDF
PDF出力
lambda

LambdaでサーバーレスにhtmlをPDFに変換しよう

ヴァル研究所アドベントカレンダー2018の2日目です。

PDF帳票が必要な場合、どんな方法で作成していますか?

html・cssで書いてそれをPDFに変換できると便利ですよね。html・cssでのレイアウトにはみんな慣れていますし、テーブルや文字のセンタリング等も簡単です。cssでは長さの単位に mmcm も使えるので、物理的なサイズをそのまま指定できます。

html-pdfというNode.jsライブラリ・CLIツールを使うとhtmlをPDFに変換できます。内部ではPhantomJSを使っているので、htmlのレンダリングにも安心感があります。

$ npm install -g html-pdf

$ html-pdf test/businesscard.html businesscard.pdf

当方ではサーバーレスで開発していたので、この変換をLambdaで行いたいと考えました。そうなるとネックになるのがLambdaのデフォルト環境には日本語フォントが入っていないという問題。結局そこは、フォントをzipパッケージに含めて、実行時に font-cache を実行することで PhantomJSから使えるようにする方法で解決しました(fonts.conf の中で cachedir を指定しているのが何気にキモです)。fontconfig 自体はLambda環境にデフォルトで入っているのでインストール不要です。

 

font-cache に3秒程度かかってしまいますが、許容範囲かと思います。

API Gatewayと組み合わせて、「htmlをリクエストボディとしてPOSTするとPDF化してS3に保存してそのURLを返す」というAPIの形にして利用しました。

そのLambdaのzipパッケージをこちらにアップロードしてあるので、すぐにお使いいただけます。


備考

HTMLページをPDFファイルへ変換するPDFShiftというWebサービスもあるようです。

実行時に font-cache を実行する方法は、LambdaでPhantomJSを使ってWebページのスクリーンショットを取る場合にももちろん使えます。