はじめに
こんにちは!えいちゃもと申します。
今回、Ruby on RailsでPDF化を実装した際にPrawnというgemを使ったのでまとめました。
この記事を読むことでフォームに名前を入力するとPDF化された印鑑を出力するアプリ
を作成することができます。
初学者の私でもできたので実装方法は簡単です。
仕事でよく使う?技術だと思うので、参考になれば嬉しいです。
PDF化の技術を使うと下のようなアプリを作成することもできます
反抗期届
Github
反抗期を宣言する届出を簡単にPDF化することができるアプリです。
使っていただけると嬉しいです。
記事は2部構成です。前半ではPDF出力を行い、後半でPrawnというGemの使い方を説明しています。
フォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう②(PrawnによるPDFファイルのカスタム)
この記事を最後まで読むとできるもの
入力
ユーザーが名前を入力します
出力
印鑑がPDF化されて出力します
環境
Rails | 6.1.5 |
---|---|
Ruby | 3.1.2 |
実装の流れ
- gemの導入
- ルーティング
- モデル
- PDF用のクラス作成
- コントローラー
- ビュー
- PDFをカスタマイズ
gemの導入
prawn導入用のgemをGemfileに追記します。
prawn-tableはテーブルの描画に必要なgemです。
gem 'prawn'
gem 'prawn-table'
インストールします。
$ bundle install
ルーティング
PDF表示画面のルーティングは不要です。
Rails.application.routes.draw do
root 'users#new'
resources :users, only: %i[new create]
end
モデル
今回はデータベースを使わないので、ActiveModel::Model
をincludeしてデータベースと連携しないModelを作成します。
class User
include ActiveModel::Model
attr_accessor :name
# 名前の文字数を2文字に指定
validates :name, length: { is: 2 }
end
PDF用のクラスを作成
PDFの内容を作成するための専用クラスを作成します。
Prawnではcontrollerに直接PDFの内容を流し込んでもいいのですが、可読性・保守性ともに下がるため、専用のクラスを作成することを推奨します。
$ mkdir app/pdfs
$ touch app/pdfs/stamp_pdf.rb # stamp_pdf.rbというファイル名で作成、model名はStampPdfとなる
PDF作成用のモデルを作成します。
Prawn::Documentを継承します。
class StampPdf < Prawn::Document
# userにモデルなどのデータを渡します
def initialize(user)
# superで初期設定を指定
super(page_size: 'A4') # 新規PDF作成
# フォントのパスを指定
font "app/assets/fonts/SourceHanSans-Bold.ttc"
# 名前の出力
text user.name
end
end
Prownはデフォルトでは日本語に対応していないので、日本語用のフォントを用意します。
日本語のフォントはここからダウンロードできます。
ダウンロードしたフォントはassets/fontsに入れます。
コントローラー
PDFの出力を行う実装を行います。
class UsersController < ApplicationController
def new
@user = User.new
end
def create
user = User.new(user_params)
stamp_pdf = StampPdf.new(user).render
# PDF出力に必要なオプション
send_data stamp_pdf,
filename: 'stamp_pdf.pdf',
type: 'application/pdf',
disposition: 'inline' #PDFをブラウザ上に出力 外すとダウンロード
end
private
def user_params
params.require(:user).permit(:name)
end
end
ビュー(フォーム入力画面)
フォーム入力画面の実装を行います。
<%= form_with model: @user, url: users_path, local: true do |f| %>
<%= f.text_field :name %>
<%= f.submit 'PDF作成' %>
<% end %>
確認
フォームに名前を入力し、PDF作成ボタンを押すと、、、
このように表示されればOK