Ruby
Rails
PDF

RailsアプリでPDFを出力する (Heroku対応)

More than 5 years have passed since last update.

wicked_pdfというGemを使うとHTMLを元にPDFを生成できるのでこれを使う。


Gem

wicked_pdfは、wkhtmltopdfコマンドを叩くという実装になっているので、まずはそのバイナリをインストールする必要がある。

普通にインストールしてもいいのだが、wkhtmltopdf-binary gemで入れることをお薦めする。これで、wkhtmltopdfをインストールする必要があることを知らない他のメンバーのPCでも動き、Herokuでも動くアプリになる。

結果Gemfileは以下のようになる。


Gemfile

gem 'wkhtmltopdf-binary'

gem 'wicked_pdf'

やらなくてもいいのかもしれないが、本家ドキュメントに書かれているので、PDFのMimeタイプも設定しておく。


config/initializers/mime_types.rb

Mime::Type.register "application/pdf", :pdf


後は表示用にroutes, controller, view, layoutを作成していく。


Controller

ここではhttp://localhost:3000/pdf/sample.pdfでアクセスできるようなページを作る。


config/routes.rb

Your::Application.routes.draw do

resource :pdf, only: [] do
get :sample
end
end


app/controllers/pdfs_controller

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


app/views/layout/pdf.html.haml

!!!

%html
%head
%meta{ charset: "utf-8" }
= wicked_pdf_stylesheet_link_tag 'pdf'
%body
= yield


app/views/pdfs/sample.pdf.haml

%h1 hoge

%h2 あいうえお
%h3 愛上尾
= params[:debug].present? ? image_tag('foo') : wicked_pdf_image_tag('foo')

個別viewの拡張子はデフォルトで.pdfを見に行くので注意。

変えたい場合は、pdfオプションではなく、templetefileオプションで指定することによって対象のテンプレートファイルを変更できる。


app/assets/stylesheets/pdf.css.scss

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ファイルを放り込めば良い。


bash

$ tree .fonts/

.fonts/
└── ipaexg.ttf

後は生成したいPDFのHTMLとCSSを書くだけ!!(これが一番大変だけど・・・)


参考