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

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

PDF化の技術を使うと下のようなアプリを作成することもできます
[反抗期届](https://www.hankouki-todoke.com/)
[Github](https://github.com/eityamo/hankouki)
反抗期を宣言する届出を簡単にPDF化することができるアプリです。
使っていただけると嬉しいです。

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

[フォームに名前を入力するとPDF化された印鑑を出力するアプリを作ろう②（PrawnによるPDFファイルのカスタム）](https://qiita.com/eityamo/items/ca23ba80b48980ea62f5)

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

**入力**

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520341/a866502d-81bd-3fde-8d8f-c8318635b9ac.png)

**出力**

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520341/0f8c9f19-08b8-5f49-2d6d-05f4ef27bfdd.png)



# 環境
| Rails            |         6.1.5      |
|:-----------------|:------------------:|
| Ruby             |         3.1.2      |

# 実装の流れ

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

## gemの導入

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

```ruby:Gemfile
gem 'prawn'
gem 'prawn-table'
```
インストールします。

```terminal:terminal
$ bundle install
```

## ルーティング

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

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

## モデル

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

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

## PDF用のクラスを作成

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

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

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

```ruby: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はデフォルトでは日本語に対応していないので、日本語用のフォントを用意します。
日本語のフォントは[ここから](https://github.com/adobe-fonts/source-han-sans/tree/release/SubsetOTF/JP)ダウンロードできます。

ダウンロードしたフォントは**assets/fonts**に入れます。

## コントローラー

PDFの出力を行う実装を行います。

```ruby: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
```

## ビュー（フォーム入力画面）

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

```ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520341/39f52d6f-b943-1231-717c-9b8c01c23fb9.png)

[後半へ](https://qiita.com/eityamo/items/ca23ba80b48980ea62f5)

## 参考文献
- [Rails Prawnを使ってPDFを作成する](https://qiita.com/ayies128/items/7262b771fdae5b7f0098)
- [【Rails】PDF出力が実装できるGem「Prawn」の実装方法について簡単に解説](https://techtechmedia.com/prawn-pdf-rails/)