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生成機能を構築することが良い。