LoginSignup
9
3

More than 1 year has passed since last update.

フォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう①(Ruby on RailsでPDFファイルを作成)

Last updated at Posted at 2022-10-18

はじめに

こんにちは!えいちゃもと申します。
今回、Ruby on RailsでPDF化を実装した際にPrawnというgemを使ったのでまとめました。
この記事を読むことでフォームに名前を入力するとPDF化された印鑑を出力するアプリを作成することができます。
初学者の私でもできたので実装方法は簡単です。
仕事でよく使う?技術だと思うので、参考になれば嬉しいです。

PDF化の技術を使うと下のようなアプリを作成することもできます
反抗期届
Github
反抗期を宣言する届出を簡単にPDF化することができるアプリです。
使っていただけると嬉しいです。

記事は2部構成です。前半ではPDF出力を行い、後半でPrawnというGemの使い方を説明しています。

フォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう②(PrawnによるPDFファイルのカスタム)

この記事を最後まで読むとできるもの

入力

ユーザーが名前を入力します

image.png

出力

印鑑がPDF化されて出力します

image.png

環境

Rails 6.1.5
Ruby 3.1.2

実装の流れ

  1. gemの導入
  2. ルーティング
  3. モデル
  4. PDF用のクラス作成
  5. コントローラー
  6. ビュー
  7. PDFをカスタマイズ

gemの導入

prawn導入用のgemをGemfileに追記します。
prawn-tableはテーブルの描画に必要なgemです。

Gemfile
gem 'prawn'
gem 'prawn-table'

インストールします。

terminal
$ bundle install

ルーティング

PDF表示画面のルーティングは不要です。

routes.rb
Rails.application.routes.draw do
  root 'users#new'
  resources :users, only: %i[new create]
end

モデル

今回はデータベースを使わないので、ActiveModel::Modelをincludeしてデータベースと連携しないModelを作成します。

user.rb
class User
  include ActiveModel::Model
  attr_accessor :name
  # 名前の文字数を2文字に指定
  validates :name, length: { is: 2 }
end

PDF用のクラスを作成

PDFの内容を作成するための専用クラスを作成します。
Prawnではcontrollerに直接PDFの内容を流し込んでもいいのですが、可読性・保守性ともに下がるため、専用のクラスを作成することを推奨します。

terminal
$ mkdir app/pdfs
$ touch app/pdfs/stamp_pdf.rb # stamp_pdf.rbというファイル名で作成、model名はStampPdfとなる

PDF作成用のモデルを作成します。
Prawn::Documentを継承します。

app/pdf/stamp_pdf.rb
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の出力を行う実装を行います。

user_controller.rb
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

ビュー(フォーム入力画面)

フォーム入力画面の実装を行います。

new.html.erb
<%= form_with model: @user, url: users_path, local: true do |f| %>
  <%= f.text_field :name %>
  <%= f.submit 'PDF作成' %>
<% end %>

確認

フォームに名前を入力し、PDF作成ボタンを押すと、、、
このように表示されればOK

image.png

後半へ

参考文献

9
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3