初めに
この記事はフォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう
の後半です。
フォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう①(Ruby on RailsでPDFファイルを作成)
前回まででPDFファイルを出力するところまで実装できました。今回はPrawnのGemによる基本的なカスタム方法について説明していきます。
PrawnによるPDFのカスタム
Prawnの基本機能はText
、Graphics
、Bounding Box
の3つです。
それぞれについて説明しながら印鑑を実装していきます。
実装する準備としてPDFに座標を表示します。
class StampPdf < Prawn::Document
def initialize(user)
super(page_size: 'A4')
# 座標を表示
stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
end
end
PDF画面
Text
早速、Text
を使っていきます。
このPDFのタイトルを中央揃えで表示させます。
class StampPdf < Prawn::Document
def initialize(user)
super(page_size: 'A4')
# 座標を表示
stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# タイトル(追記箇所)
text_box "印鑑のPDF化", at: [0, 700], align: :center, size: 20
end
end
座標[x, y] = [(0と最大値(A4の場合523)の中央値), 700]
にフォントサイズ20
の印鑑のPDF化という文字が表示されます。
PDF画面
Graphics
次にGraphics
を使っていきます。
印鑑の外枠部分を表示させます。
class StampPdf < Prawn::Document
def initialize(user)
super(page_size: 'A4')
# 座標を表示
stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# タイトル
text_box "印鑑のPDF化", at: [0, 700], align: :center, size: 20
# 図形の色(追記箇所)
stroke_color 'ce3337'
# 円(追記箇所)
stroke_circle [260, 550], 50
end
end
円の中心座標[x, y] = [260, 600]
に半径50
、輪郭の色がce3337
の円が表示されます。
PDF画面
Bounding Box
最後にBounding Box
を使っていきます。
一旦、円を消してBox化
を可視化してみます。
class StampPdf < Prawn::Document
def initialize(user)
super(page_size: 'A4')
# 座標を表示
stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# タイトル
text_box "印鑑のPDF化", at: [0, 700], align: :center, size: 20
# 図形の色
stroke_color 'ce3337'
# 円
# stroke_circle [260, 550], 50
# Bounding Boxのブロック(追記箇所)
bounding_box([235, 600], width: 50, height: 100) do
# boxの描画
stroke_bounds
end
end
end
座標[x, y] = [235, 600]
の右下に横50
、縦100
のBounding Box
が表示されます。
Bounding Box
は描画範囲を指定することができるので、rubyのブロックと相性がいいです。
PDF画面
追記したBounding Box
のブロック中に印鑑の輪郭と名前を入れてみます。
class StampPdf < Prawn::Document
def initialize(user)
super(page_size: 'A4')
# 座標を表示
stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# タイトル
text_box "印鑑のPDF化", at: [0, 700], align: :center, size: 20
# 図形の色
stroke_color 'ce3337'
# テキストの色
fill_color 'ce3337'
# Bounding Boxのブロック
bounding_box([235, 600], width: 50, height: 100) do
# boxの描画
stroke_bounds
# 円(追記箇所)
stroke_circle [25, 50], 50
# テキスト(追記箇所)
text_box "#{user.name}", at: [5, 90], size: 40
end
end
end
少しややこしいんですが、このブロック中の原点がわかれば簡単です。
原点は長方形ブロックの左下の頂点[x, y] = [235, 500(600ー100)]
です。
ということで、描写される円の中心は[x, y] = [260(235+25), 550(500+50)]
、半径40
となり、
テキストは座標[x, y] = [240(235+5), 590(500+90)]
の右下へフォント40
の文字が表示されます。
*テキストは右上から左下に表示され、デフォルトでブロックの幅を超えると改行する仕様です。この性質を使って縦書きを表現しています。
PDF画面
最後に座標とブロックの描写を取り除き、コンポーネント化して完成!!!
class StampPdf < Prawn::Document
# userにモデルなどのデータを渡します
def initialize(user)
# superで初期設定を指定 新規PDF作成
super(page_size: 'A4')
# 座標を表示
# stroke_axis
# font指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# box化
create_title
create_stamp(user)
end
# タイトル
def create_title
text_box "俺の印鑑", at: [0, 700], align: :center, size: 20
end
# 印鑑
def create_stamp(user)
bounding_box([235, 600], width: 50, height: 100) do
# boxの描画
# stroke_bounds
# 図形の色
stroke_color 'ce3337'
# 円
stroke_circle [25, 50], 50
# テキストの色
fill_color 'ce3337'
# テキスト
text_box "#{user.name}", at: [5, 90], size: 40
end
end
end
PDF画面
今回は印鑑実装で図形を扱うのでPrawn
というGemを用いてPDF化をしましたが、wicked_pdf
などのGemもあります。これから用途に合わせて使っていきたいです。最後まで読んでいただきありがとうございます。