Ruby on RailsでPDF作成&ダウンロード機能を実装
PDFダウンロード機能を実装したのでメモ
環境
ここに作った。
https://github.com/omiend/my_strongest_ror
wkhtmltopdf / wicked_pdf
PDF生成に利用したGEMは下記。
gem ‘wkhtmltopdf-binary’ gem ‘wicked_pdf’
wicked_pdfはwkhtmltopdfのラッパーで、単純にHTML画面をPDFとしてダウンロード出来るといったGEM。
他のPDF生成GEMをいろいろと試した中で一番簡単かつ、直感的で、独自DSLがないためキャッチアップが必要ないから、色々と楽。
コンテナの再構築
Gemfileに追加したら、コンテナを再構築。
$ docker-compose build
wicked_pdf.rbの作成
rails generate wicked_pdf
を実行すると、 config/initializers/wicked_pdf.rb
が作成される。
$ ./exec.sh rails generate wicked_pdf rails generate wicked_pdf create config/initializers/wicked_pdf.rb
次に、作成された wicked_pdf.rb
の内容を、下記のように編集。
WickedPdf.config = { :exe_path => “#{Gem.loaded_specs[‘wkhtmltopdf-binary’].full_gem_path}/bin/wkhtmltopdf” }
これでインストール完了。
routesの編集
config/routes.rb に、下記の通り追記。
get ‘/pdf-download’, to: ‘pdf#download’, as: ‘pdf_download’, :format => ‘pdf’
formatにpdfを指定するのがミソ?
コントローラーを作成
基本的な内容なので詳細は割愛。
coffee scriptや、helperは今回不要なので削除。
$ ./exec.sh rails g controller pdf
メソッドの定義はざっとこんな感じ。
class PdfController < ApplicationController def download respond_to do |format| # format.html format.pdf do render pdf: "pdf_download_test", # PDFのファイル名 encording: 'UTF-8', # エンコード指定 layout: 'layouts/pdf.html', # PDF用の共通レイアウト # trueを指定すると、HTML画面として確認ができる show_as_html: params[:show_as_html].present? end end end end
他にもいろいろなオプションがありますが、詳しくはコチラを参考に。
PDF用のレイアウトを作成
コントローラーで指定した layout: ‘layouts/pdf.html’,
に対応する、PDF用のlayoutを layouts/pdf.html.erb
として作成。
<html> <head> <meta charset="utf-8" ?> <%= wicked_pdf_stylesheet_link_tag 'pdf' %> <head> <body> <div class="header">header</div> <%= yield %> <div class="footer">footer</div> </body> </html>
中身は通常のHTML(erb)ファイルだが、CSSファイルの指定だけは通常の stylesheet_link_tag
ではなく、 wicked_pdf_stylesheet_link_tag
を利用。
画面を作成
PDFの画面として、 download.pdf.erb
を作成。
こちらも中身は通常のHTMLと代わりない。
<h1>PDFダウンロードテスト</h1> <h2>PDFダウンロードテスト</h2> <h3>PDFダウンロードテスト</h3>
ダウンロード実行
実際にダウンロード...文字化け。
これは単純にDockerコンテナ内に日本語が存在しないため。
PDF出力については以上だが、せっかくなので日本語表示出来るように修正する。
Dockerコンテナ内に日本語を追加
Dockerfile
にて、コンテナ作成時にIPAから日本語フォーマットをダウンロードする処理を追加。
修正前
RUN apt-get update -qq \ && apt-get install -y build-essential libpq-dev nodejs imagemagick libmagick++-dev \ && rm -rf /var/lib/apt/lists/*
修正後
RUN apt-get update -qq \ && apt-get install -y build-essential libpq-dev nodejs imagemagick libmagick++-dev \ && apt-get install fonts-ipa* \ && rm -rf /var/lib/apt/lists/*
修正したら、 docker-compose build
をして、PDFダウンロードを再実行すれば、日本語が表示されるはず。
PDF生成さえ出来れば、基本的な帳票作成機能はカバー出来るね。
また、wicked_pdfはHTMLとCSSの知識さえアレば、自由にレイアウトを作成できるので、新しく参画したエンジニアでもすぐにPDF生成機能を構築することが良い。