Eyes, JAPAN Blog > 【Railsエンジニア必見】PDF出力するPrawnを使ってみた

【Railsエンジニア必見】PDF出力するPrawnを使ってみた

Tetsu Kan

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

どうも、入社して一ヶ月が経った韓です!

私は普段、スタートアップ界隈では盛り上がっている(今は少し落ち着いているかもしれない…?)Ruby on Railsというプログラミング言語を爆速で打っています。

そこでちょうどPDFで出力する機能を実装してほしいという依頼がありましたので、少し調べてみました。

PDF出力関連のGemたち

「Rails PDF 出力」と調べてみると案外出てきました。ちょうど下のようなまとめサイトも出てきました。

http://ruby-rails.hatenadiary.com/entry/20140906/1409995011

抜粋して説明しますが、以下の表をみてください。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-02-17-19-55

 

サクッとHTMLの画面でPDF出力していいならば、PDFKitやWicked PDFでいいと思います。しかし、今回私はPDFを細かく調整したりする作業が絡んだため、Prawnを採用しました。

Prawnの導入

まずはRailsエンジニアお馴染みのGemfileに以下を書いて、bundle installしてください。


gem 'prawn'

gem 'prawn-table'

prawn-tableというのはPDF上で表を作成するのに必要なので、表を作るRailsエンジニアの方々は是非導入してください。

まずは、PDFを出力するページ先のリンクを作成し、そこのControllerにPDFの内容を書いていきましょう!(今回は簡単な会社の資料を作っていきたいと思います!)

まずはPDFを出力させるリンクとアクションを用意しましょう!

View画面


<%= link_to "〇〇会社見積書PDF", office_path(@office, format: "pdf") %>

Controller画面


def show
 @office = Office.find(params[:id])
 respond_to do |format|
      format.html
      format.pdf do

        # PDF文書を作成
        pdf = Prawn::Document.new

        # PDFに "Hello, world!!" と表示する
        pdf.text "Hello, world!!"

        send_data pdf.render,
          filename:    "#{@office.id}.pdf",
          type:        "application/pdf",
          disposition: "inline"
      end
    end
end

すると下の画面のように出力されました。(うまくいかない場合はサーバーを再起動してみてください。)
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-08-18-53-46

しかし、これはまだ日本語対応していないので、日本語のフォントをvendor/assets/fonts下に入れましょう。日本語のフォントはここからダウンロードできます。


def show
 @office = Office.find(params[:id])
 respond_to do |format|
      format.html
      format.pdf do

        # PDF文書を作成
        pdf = Prawn::Document.new

                # フォントを設定(明朝体)
        pdf.font "vendor/assets/fonts/ipaexm.ttf" 

        # PDFに "〇〇会社見積書PDF" と表示する
        pdf.text "〇〇会社見積書PDF"

        send_data pdf.render,
          filename:    "#{@office.id}.pdf",
          type:        "application/pdf",
          disposition: "inline"
      end
    end
end

すると下のように出力されました。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-09-9-12-58

これで日本語対応もさせました。では次のセクションから作っていきましょう。

Prawnで実際にPDFの画面を作っていこう

これで準備万端なのですが、controller上にPDFのtextなどを書くと、かなり長くなり、見えにくくなるので、app下にpdfsというフォルダにファイルを置き、クラスを作ってPDFを作っていきましょう。

ここではapp/pdfs/office_pdf.rbを作って、そこに下のように記していきます。

app/pdfs/office_pdf.rb


# OfficePdfというクラスを作成。
class OfficePdf < Prawn::Document

  def initialize(office)

    # 初期設定。ここでは用紙のサイズを指定している。
    super(page_size: 'A4')

    #日本語のフォント
    font "vendor/assets/fonts/ipaexm.ttf"

    #インスタンス変数
    @office = office

    # メソッドを作成。下記に内容あり。
    content

  end

  def content
    text "〇〇会社見積書PDF"
  end

controllers/offices_controller.rb


def show
    @office = Office.find(params[:id])
    respond_to do |format|
      format.html
      format.pdf do

        # pdfを新規作成。
        pdf = OfficePdf.new(@office)

        send_data pdf.render,
          filename:    "#{@office.id}.pdf",
          type:        "application/pdf",
          disposition: "inline"
      end
    end
  end

これで同じように作成できます。

なんだ前よりも面倒じゃないか、って思うかもしれませんが、PDFのデザインがややこしくなっていくとこっちの良さがわかってくると思います。

次回はこのprawnを使って、実際にprawn-tableを使ったりして表などを駆使したいと思います。

Comments are closed.