ヴァル研究所アドベントカレンダー2018の2日目です。
PDF帳票が必要な場合、どんな方法で作成していますか?
html・cssで書いてそれをPDFに変換できると便利ですよね。html・cssでのレイアウトにはみんな慣れていますし、テーブルや文字のセンタリング等も簡単です。cssでは長さの単位に mm
や cm
も使えるので、物理的なサイズをそのまま指定できます。
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ページのスクリーンショットを取る場合にももちろん使えます。