98
95

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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を書くだけ!!(これが一番大変だけど・・・)

参考

98
95
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
98
95

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?