はじめに
RailsアプリケーションでPDFを作成する僕の中のノウハウを軽くですが公開します。
Webから帳票を作成する機能って案外需要あると思うんですよねー。
特に業務系のアプリケーションでは必須と言っても過言ではないのではないでしょうか?
その割にはあまり情報が転がっていないのが現状です...
今回は、prawnの導入方法と、
これくらい扱えたら割と形にできる?というサンプルを紹介しようと思います。
プローンて読むらしいですよ?エビですって。
シュリンプはエビの総称、プローンは中形のエビらしいです。どうでもいいです。
prawnの導入
gem
Gemfileに以下の2つを追加します。
gem 'prawn'
gem 'prawn-table'
prawn-tableはテーブルの描画に必要なgemです。
日本語フォント
当たり前なのですが日本語フォントを使用しないと日本語の描画でエラーが出ます。
こちらからダウンロードして適当なフォルダに置いてください。
https://ipafont.ipa.go.jp/
controller
/test.pdf
にアクセスするとPDFが画面に表示されるようにします。
class TestController < ApplicationController
def index
respond_to do |format|
format.pdf do
test_pdf = TestPdf.new.render
send_data test_pdf,
filename: 'test.pdf',
type: 'application/pdf',
disposition: 'inline' # 画面に表示
end
end
end
end
ちなみにdisposition: 'inline'
を消したらダウンロードになります。
class
Prawn::Document
を継承したクラスを作成します。
ここにPDFに描画する内容をガンガン書いていきます。
とりあえず手始めにPDFの座標を表示するstroke_axis
だけ書いておきます。
class TestPdf < Prawn::Document
def initialize
super()
# 座標を表示
stroke_axis
end
end
出力
/test.pdf
にアクセスするとこんなPDFができます。
なんかそれっぽいですね。
サンプル
準備が整ったところで、サンプルです。
class TestPdf < Prawn::Document
def initialize
super()
# 日本語フォントを使用しないと日本語使えません
font_families.update('Test' => { normal: 'vendor/fonts/ipaexm.ttf', bold: 'vendor/fonts/ipaexg.ttf' })
font 'Test'
# 座標を表示
stroke_axis
# 単純なテキストの表示
text 'Hello Prawn'
# 単純なテーブルの表示
# テーブルの要素は2次元配列で定義する
rows = [
['1-1', '1-2'],
['2-1', '2-2'],
['3-1', '3-2']
]
table rows
# 下に20
move_down 20
# 複雑なテーブルの表示
rows = [
[{ content: '1×2の横長', colspan: 2 }, '1-3'],
[{ content: '2×1の縦長', rowspan: 2 }, '2-2', '2-3'],
['3-2', '3-4'],
[{ content: '2×2のワガママ', colspan: 2, rowspan: 2 }, '4-3'],
['5-3']
]
# セルの高さ30、左上詰め詰め
table rows, cell_style: { height: 50, width: 200, padding: 0 } do
# 枠線なし
cells.borders = []
# 文字サイズ
cells.size = 20
# 枠線左と上だけ
cells.borders = %i[left top]
# 1行目はセンター寄せ
row(0).align = :center
# 1行目の背景色をff7500に
row(0).background_color = 'ff7500'
# 1列目の横幅を30に
columns(0).width = 100
# 行列の最終の文字を小さく
columns(-1).row(-1).size = 5
# 行列の枠は四方固める
columns(-1).row(-1).borders = %i[top bottom left right]
# 行列の枠線は点線で
columns(-1).row(-1).border_lines = %i[dotted]
end
# 第一引数の座標にボックスを作る
bounding_box([100, 350], width: 200, height: 100) do
# 周りに枠線をつける
transparent(1) { stroke_bounds }
font_size 16
text '太文字', style: :bold
text 'このボックスの使い勝手はかなりいい'
end
# 座標を指定して画像を表示する
image 'app/assets/images/me.jpg', at: [10, 200], width: 100
image 'app/assets/images/pote.jpg', at: [150, 200], width: 150
# 座標を指定してテキストを表示する
draw_text 'ネコと和解せよ', at: [160, 50], size: 30
end
end
終わりに
PDF作成なんてクソムズイやろ!!と思っていましたが、思ったより簡単にできますね。
画面サイズなど気にしなくていいので結構とっつきやすかったです。
もっと細かい扱い方は公式マニュアルで確認してください!
http://prawnpdf.org/manual.pdf
http://prawnpdf.org/prawn-table-manual.pdf
ブログでみたい方はこちら
Rails prawnを使ってPDFを作成する