[Elixir] PDF生成
PDF生成をElixirでやる必要が出てきたので、その調査をメモ書きしておく
HTML=>PDF でconvertしたい。PureにPDFを生成するとのは辛い。
そうなると、package の前にHTML=coreなconverter について前提知識を整理する。最初はここらへんも知らなくて、packageを見始めたがpackageなのかconverterなのかで混乱したので整理。
Core HTML => PDF
- wkhtmltopdf(C++)
- Pupetter(TS)
- https://github.com/puppeteer/puppeteer
- SDK for Chromium APIs for Node.js
- Chrome DevToolsチームがメンテナンス
- PDFTK(Java)(+Encription)
- Chromium(directly)
Package
- 後述
Packageを見てみる。
GitHub - gutschilla/elixir-pdf-generator: Create PDFs with wkhtmltopdf or puppeteer/chromium from Elixir.
Create PDFs with wkhtmltopdf or puppeteer/chromium from Elixir.
-
(star: 272)
-
pupetter か wkhtmltopdf で実行可能
-
pupetter の場合は node で install する
GitHub - bitcrowd/chromic_pdf: Convenient HTML to PDF/A rendering library for Elixir based on Chrome & Ghostscript
Convenient HTML to PDF/A rendering library for Elixir based on Chrome & Ghostscript
-
(star: 163)
-
Pupetter は使わないで Dev Tool API 経由で直接 chromium とやりとりする。
GitHub - coletiv/puppeteer-pdf: PDF generation wrapper for Elixir using Puppeteer
PDF generation wrapper for Elixir using Puppeteer
-
(star: 86)
-
gutnex だと Elixir でデザインするので HTML を書くよか大変
-
Wkhtmltopdf だと table のデザイン崩れがおきる。Chinese Character などがバグる。Machine Display ベースでデザインするので
font-size:42px
とかになってかなり違和感を覚える。 -
ファイルサイズは 10 倍デカくなる(wkgtmltopdf よか)
-
所感として、このライブラリの紹介してる著者の記事にて他のライブラリとの比較がない。なので、star 数から来る安定度を考えると他のメジャーのもののほうが良いかも。
GitHub - andrewtimberlake/elixir-pdf: An attempt to get a nice API for PDF generation in Elixir
An attempt to get a nice API for PDF generation in Elixir
-
(star: 26)
-
Pure に Elixir で PDF を書けるので、本当に要件が少ないならこれで良さそう。
assetsを反映させるにあたっていくつかのハマリポイントがありそう?
- fontとかは事前にロードさせないとPDFで表示できない
- セキュリティ的にremoteのデータ取得は非推奨なのでdefaultでNG
セキュアな方法として
- assetsはrenderする前に取得+base64変換しておき、それをHTMLにinjectする
- fontの場合は他にも、linux側にfontを事前に取得させておけば読み込ませられる?
非セキュアな方法として
- external networkを許可しちゃえばassetsもデータ取得できちゃいそう