26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ヴァル研究所Advent Calendar 2018

Day 2

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

Last updated at Posted at 2018-12-01

ヴァル研究所アドベントカレンダー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ページのスクリーンショットを取る場合にももちろん使えます。

26
19
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?