Help us understand the problem. What is going on with this article?

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

参考

awakia
検索とか推薦とかやってきたエンジニア。早稲田の山名研出身。大学院の頃、論文を書こうとしない僕を見かねた教授に、北京のMSRAに追放されるが3ヶ月後無事帰還。 大学を卒業後、エンジニアのブラックホールとの別名を持つGoogleに吸収されそうになるが1年2ヶ月後無事生還。 現在は、Wantedly(https://www.wantedly.com/ )の4番目のエージェントとして救出活動に専念。
http://awakia-n.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした