PDF を出力できる Rails アプリを作成して Heroku で動かす

Rails アプリに PDF 出力を実装して、それを Heroku で動かすまでの作業メモ。

プロジェクトを作成

rails new pdf_sample --skip-bundle

gem は vendor/bundle にインストールしたいから、bunele install はスキップして後でやる。

Heroku には git を使ってデプロイするので、git リポジトリも作成しておく。

git init
git add .
git commit -m "Initial commit"

wicked_pdf と wkhtmltopdf-binary-11 をインストール

PDF 出力には wicked_pdf を使う。

wicked_pdf は wkhtmltopdf に依存しているので、wkhtmltopdf-binary-11 も使う。 bundler で wkhtmltopdf-binary-11 をインストールすれば、wkhtmltopdf 本体もインストールされる寸法。

wkhtmltopdf-binary は wkhtmltopdf 本体のバージョンが低いので、wkhtmltopdf-binary-11 を選択した。

ruby "2.0.0"

gem "wkhtmltopdf-binary-11"
gem "wicked_pdf"

gem "sqlite3", group: [:development, :test]
gem 'rails_12factor', group: [:production]

sqlite3 は Heroku 上では使わないので、開発中またはテストのみインストールする。

あとは

bundle install --path vendor/bundle --without production

を実行して gem のインストール完了。

コントローラーを作成

bundle exec rails g controller home index

でひな形を生成し、PDF を表示するコードを記述。

class HomeController < ApplicationController
  def index
    respond_to do |format|
      format.html { redirect_to root_path(format: :pdf, debug: 1) }
      format.pdf do
        render pdf: "index",
          encoding: "UTF-8",
          layout: "pdf.html",
          show_as_html: params[:debug].present?
      end
    end
  end
end

PDF 用のレイアウトを作成

app/views/layout 下に pdf.html.erb を作成する。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">  
    <title>PdfSample</title>
    <%= wicked_pdf_stylesheet_link_tag "application" -%>
    <%= wicked_pdf_javascript_include_tag "application" %>
  </head>

  <body>

  <%= yield %>

  </body>
</html>

PDF 用のビューを作成

app/views/home 下に index.pdf.erb を作成する。中身は index.html.erb をまんまコピペ。

<h1>Home#index</h1>
<p>Find me in app/views/home/index.pdf.erb</p>

ルーティングを修正

今回は home#index をルートに割り当てる。

PdfSample::Application.routes.draw do
  root 'home#index'
end

ローカルで確認

bundle exec rails server

でアプリを起動し http://localhost:3000/?format=pdf にアクセス。

f:id:griefworker:20140313204229p:plain

PDF のビューアーで表示されたら成功。

あとは、これまでの修正を git リポジトリに忘れずコミットしておく。

git add .
git commit -m "PDF 出力を作成"

Heroku 上で確認

あらかじめ Heroku にアプリを作成しておき、git リポジトリの remote に追加。

そして

git push heroku master

でデプロイ。 データベース使わないからマイグレーションは不要。 しばらく待って、デプロイが無事成功したら、Heroku 上のアプリにアクセスしてみる。

f:id:griefworker:20140313204244p:plain

Heroku 上でも PDF ビューアーで表示されたら、めでたしめでたし。

2014/03/16 追記

canvas を描画したい場合は、wkhtmltopdf-heroku または wkhtmltopdf-binary を使った方がいい。