開発
【Railsエンジニア必見】PDF出力するPrawnを使ってみた
Tetsu Kan
どうも、入社して一ヶ月が経った韓です!
私は普段、スタートアップ界隈では盛り上がっている(今は少し落ち着いているかもしれない…?)Ruby on Railsというプログラミング言語を爆速で打っています。
そこでちょうどPDFで出力する機能を実装してほしいという依頼がありましたので、少し調べてみました。
PDF出力関連のGemたち
「Rails PDF 出力」と調べてみると案外出てきました。ちょうど下のようなまとめサイトも出てきました。
http://ruby-rails.hatenadiary.com/entry/20140906/1409995011
抜粋して説明しますが、以下の表をみてください。
サクッと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
すると下の画面のように出力されました。(うまくいかない場合はサーバーを再起動してみてください。)
しかし、これはまだ日本語対応していないので、日本語のフォントを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
これで日本語対応もさせました。では次のセクションから作っていきましょう。
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を使ったりして表などを駆使したいと思います。