最近の開発では、データをPDF化するニーズが高まっているようです。

PDF化の作業は、テンプレート構成によって大きく3つのパターンに分けられます。

  • ファイルの内容がほぼテキストで、画像や図が少ない
  • 決まったフォーマットで、空白の箇所にテキストを入れるだけ
  • フォーマットが決まっておらず、画像や図が多い

PDFを生成する有料ツールはいくつかありますが、本記事では無料ツールを使用して質の高いPDFファイルを作る方法をご紹介します。

HTMLからPDF化

HTMLからPDFを生成してくれるRuby gemはたくさんありますが、The Ruby Toolboxを見る限りではwicked_pdfpdfkitなどがよく使われているようです。
自分はwicked_pdfに慣れているので、プロジェクトにはwicked_pdfを採用しました。

wicked_pdfwkhtmltopdfHTMLからPDFを生成するツール)のRubyラッパーなので、利用する際にはwkhtmltopdfをインストールする必要があります。

Gemfileに以下の2つのgemを入れて、bundle installを実行すれば、初期インストールはひとまず完了です。

ビューをPDF形式でレンダリングする

例えば、/posts/1.pdfのようなURLでユーザーにPDFをダウンロードさせたい場合、コントローラーを以下のように定義できます。

wicked_pdfActionController::Baserenderメソッドをオーバーライドして、render pdf:の場合、HTMLをレンダリングしてからPDF化するようにします。

app/views/posts/show.pdf.erbのファイルにHTMLコードを書くと、ユーザーがアクセスしたときにPDFとして表示されます。

render pdf:以外にwicked_pdfrenderメソッドにはいろいろなオプションがあります。
こちらのページ
が参考になるでしょう。

PDFをファイルサーバーに保存する

実際には、PDF化されたファイルをAWSのS3などに保存する必要があります。
そのために、wicked_pdfが提供するpdf_from_stringメソッドを使うサービスを作りました。

レイアウトファイルはこんな感じです(ERBの代わりにSlimを使います)。

wkhtmltopdfはRailsサービス外で走るため、CSS/JSファイルの絶対URLを指定しなければいけません。Railsのstylesheet_link_tagjavascript_include_tagのhelpersメソッドを使えないので、wicked_pdf_stylesheet_link_tagwicked_pdf_javascript_include_tagを使いました。

次にテストのレイアウトを作成して

以下のようにサービスメソッドを実行すれば、

こんなPDFファイルが生成されます。

カスタマイズフォントの利用

少しCSSを調整してみます。

Caveat.ttfファイルをapp/assets/fontsにおいておきました。

結果は真っ白のファイルでした!!!

解決方法は2つあります。

解決方法①:スタイルをCSSファイルに定義する場合

スタイルをCSSファイルに定義するには、src: url(data:font/ttf;base64,AAEAAAATAQAABAAwR1BPU+Df..)のようにbase64-encodedのデータにする必要があります。wicked_pdfではこのように書きます。

解決方法②:スタイルをHTMLファイルに定義する場合

以下の2つの方法で解決できます。

結果はこちら。

PDFファイルからPDFファイルを生成する

例として、以下の履歴書のPDFテンプレートに情報を記入して、新規のPDFファイルを生成したい場合の手順を説明します。

 Prawnというgemを使います。Rubyラッパーのwicked_pdfと違って、Rubyで書かれたライブラリです。たくさんのオプションがあり、RubyのPDF生成のgemの中では最も人気です。

インストールは、Gemfileに以下の行を入れてからbundle installを実行すれば終了です。

 Prawnの使い方は、http://prawnpdf.org/manual.pdfを参考にしてください。

注意点は、 PrawnがPDF修正をサポートしていないことです。

まず追加内容のPDFファイルを作成して、

その後、2つのPDFファイルをマージすることで、以下のようになります。

PDF生成を簡略化するサービスを書いてみました。

呼び出しはこんな感じです。

Wordファイル・ExcelファイルなどからPDF生成

オープンソースのLibreOfficeを使います。

  • Wordファイルから

  • Excelファイルから

  • PowerPointファイルから

ただ、MicrosoftOfficeのファイルだとレイアウトが壊れるケースが多いです。
LibreOfficeで開いて、レイアウトを調整してから行なったほうが良いでしょう。

※有料のライブラリを使った経験はありませんが、Googleで調べてみたら結構出ていました。10万円以上のものばかりです。

まとめ

  • ファイル内容がほぼテキストで、画像や図が少ない
    → Wicked PDFを使って、HTMLから作成
  • 決まったフォーマットで、空白の箇所にテキストを入れるだけ
    → Prawn PDFを利用
  • フォーマットがが決まらず、画像や図が多い
    → LibreOfficeライブラリを利用、Wordファイル・ExcelファイルなどをPDF化

ここまでお読みいただき、ありがとうございました。

Vibloの元記事:https://viblo.asia/p/cac-giai-phap-tao-file-pdf-trong-ruby-on-rails-3P0lPz8GKox