wicked_pdf
というGemを使うとHTMLを元にPDFを生成できるのでこれを使う。
Gem
wicked_pdf
は、wkhtmltopdf
コマンドを叩くという実装になっているので、まずはそのバイナリをインストールする必要がある。
普通にインストールしてもいいのだが、wkhtmltopdf-binary
gemで入れることをお薦めする。これで、wkhtmltopdf
をインストールする必要があることを知らない他のメンバーのPCでも動き、Herokuでも動くアプリになる。
結果Gemfileは以下のようになる。
gem 'wkhtmltopdf-binary'
gem 'wicked_pdf'
やらなくてもいいのかもしれないが、本家ドキュメントに書かれているので、PDFのMimeタイプも設定しておく。
Mime::Type.register "application/pdf", :pdf
後は表示用にroutes, controller, view, layoutを作成していく。
Controller
ここではhttp://localhost:3000/pdf/sample.pdf
でアクセスできるようなページを作る。
Your::Application.routes.draw do
resource :pdf, only: [] do
get :sample
end
end
class PdfsController < ApplicationController
def sample
respond_to do |format|
format.html { redirect_to sample_pdf_path(format: :pdf, debug: 1)}
format.pdf do
render pdf: 'sample',
encoding: 'UTF-8',
layout: 'pdf.html',
show_as_html: params[:debug].present?
end
end
end
end
Contllorの注意点:
- layoutはControllerにつけるlayoutは効かないので、個別に設定してあげる。
-
debug=1
でアクセスした時HTML表示できるようにしておく。そうするとうまくPDFが生成されない時、HTML出力の時点で失敗しているのか、wkhtmltopdf
でPDFを生成するときに失敗しているのかが区別できる。 -
.pdf
をつけずにhtmlでアクセスした場合はdebug用のhtml表示するようにしておく。PDF出力したい場合、そのURLでHTMLも、JSONも、PDFもなんてことはなかなかないと思うので、これが一番いい気がする。
View
!!!
%html
%head
%meta{ charset: "utf-8" }
= wicked_pdf_stylesheet_link_tag 'pdf'
%body
= yield
%h1 hoge
%h2 あいうえお
%h3 愛上尾
= params[:debug].present? ? image_tag('foo') : wicked_pdf_image_tag('foo')
個別viewの拡張子はデフォルトで.pdf
を見に行くので注意。
変えたい場合は、pdf
オプションではなく、templete
やfile
オプションで指定することによって対象のテンプレートファイルを変更できる。
html {
font-family: 'IPAexゴシック', 'IPA Pゴシック', 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, 'MS Pゴシック', sans-serif;
}
Font
Herokuだと日本語フォントが存在しなくて出力されないなどということがあるので、世の中にあるTrue Typeフォントを取ってこないといけない。
フリーでダウンロードできる普通っぽいフォントだとIPAフォントがいい気がした。
今回はこの中のIPAexゴシックのみ使ってみる。Herokuの場合.fonts
ディレクトリを作成し、その中に.ttf
ファイルを放り込めば良い。
$ tree .fonts/
.fonts/
└── ipaexg.ttf
後は生成したいPDFのHTMLとCSSを書くだけ!!(これが一番大変だけど・・・)