the industrial

ブログと言うより自分のためのメモ以外の何モノでもないです。でも読んでくださってありがとうございます。

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>

ダウンロード実行

f:id:omiend:20171221132203g:plain

実際にダウンロード...文字化け。

これは単純に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ダウンロードを再実行すれば、日本語が表示されるはず。

f:id:omiend:20171221132057g:plain

PDF生成さえ出来れば、基本的な帳票作成機能はカバー出来るね。

また、wicked_pdfはHTMLとCSSの知識さえアレば、自由にレイアウトを作成できるので、新しく参画したエンジニアでもすぐにPDF生成機能を構築することが良い。