Rails5로 Prown의 PDF 만들기

17387 단어 RubyRailsprawn

개시하다


Rails5에서 PDF를 제작할 때 편리한 젬 프라운의 사용법에 대해서는 메모 형식으로 요약한다.누구한테 도움이 됐으면 좋겠어요.

컨디션


Rails
5.1.6
데이터베이스에서 mysql 사용

영입


먼저 Gemfile에 prawn 가져오기용gem을 추가합니다.
Gemfile
gem 'prawn'
gem 'prawn-table'
난 bundle install.
terminal
$ bundle install
로컬 서버 등을 다시 시작하십시오.

PDF 클래스 만들기


PDF 컨텐트를 만들기 위한 특수 카테고리를 작성합니다.
Prawn의 controller에서는 PDF의 내용을 직접 입력할 수 있지만 가독성과 보수성이 떨어지기 때문에 전용 반을 만드는 것을 권장합니다.
terminal
$ mkdir app/pdfs
$ touch app/pdfs/record_pdf.rb # record_pdf.rbというファイル名で作成、model名はRecordPdfとなる
PDF 제작용 모델입니다.
Prown: Document를 상속합니다.
app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

# recordにモデルなどのデータを渡します
def initialize(record)

  # superで初期設定を指定します(ページサイズ、マージン等)
  super(
    page_size: 'A4',
    top_margin: 40,
    bottom_margin: 30,
    left_margin: 20,
    right_margin: 20
  )

  @record = record # インスタンスを受け取り。コンポーネント作成時などにレコード内のデータを使える

end

end

글꼴 지정


기본적으로 Prown은 일본어를 지원하지 않기 때문에 일본어용 글꼴을 준비합니다.
일본어 글씨체여기서부터.는 다운로드할 수 있다.
다운로드한 글꼴은 assets/fonts에 있습니다.
(참고로 이곳 이외의 글씨체도 조작할 수 있습니다. 저작권에 주의하세요.)
app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

  def initialize(record)

    super(
      page_size: 'A4',
      top_margin: 40,
      bottom_margin: 30,
      left_margin: 20,
      right_margin: 20
    )

    font 'app/assets/fonts/ipaexg.ttf' # fontをパスで指定

    @record = record

  end

end

controller의 제작


controller를 만듭니다.생성된 디렉터를 통해서도 사용할 수 있습니다.
terminal
$ rails g controller record_pdfs index # コントローラ作成時にindexページも作成
app/controllers/record_pdfs_controller.rb
class RecordPdfsController < ApplicationController

  def index
    @records = Record.all # pdf上で使用するレコードのインスタンスを作成
    respond_to do |format|
      format.html
      format.pdf do

        # pdfを新規作成。インスタンスを渡す。
        pdf = RecordPdf.new(@records)

        send_data pdf.render,
          filename:    "sample.pdf",
          type:        "application/pdf",
          disposition: "inline" # 画面に表示。外すとダウンロードされる。
      end
    end
  end

end

PDF 디스플레이


페이지로 링크는 라우팅에 따라 달라지므로 적절하게 확인하십시오.
링크를 만드는 예는 다음과 같습니다.
<%= link_to "PDFを表示", 適宜指定_path(format: "pdf") %>
모델을 편집합니다.
app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

  def initialize(record)

    super(
      page_size: 'A4',
      top_margin: 40,
      bottom_margin: 30,
      left_margin: 20,
      right_margin: 20
    )

    font 'app/assets/fonts/ipaexg.ttf'

    @record = record

    # きちんと日本語も表示されるか確認
    text 'hello こんにちは 春夏秋冬'

  end

end
이렇게 뜨면 오케이.

사용자 정의


Prawn은 좌표 지정을 통해 문자 등의 표시 위치를 결정할 수 있기 때문에 미리 격자를 표시하면 편집이 수월합니다.
app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

  def initialize(record)

    super(
      page_size: 'A4',
      top_margin: 40,
      bottom_margin: 30,
      left_margin: 20,
      right_margin: 20
    )

    @record = record

    font 'app/assets/fonts/ipaexg.ttf'

    stroke_axis # これでメモリが表示される

    text 'hello こんにちは 春夏秋冬'

  end

end
데이텀으로 표시된 메모리

PDF의 어셈블리 제작


app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

  def initialize(record)

    super(
      page_size: 'A4',
      top_margin: 40,
      bottom_margin: 30,
      left_margin: 20,
      right_margin: 20
    )

    @record = record

    font 'app/assets/fonts/ipaexg.ttf'

    stroke_axis

    # 下記で作成したコンポーネントを表示順に
    header
    move_down 50
    contents

  end

  # コンポーネント作成
  def header
    text 'PDFのタイトル', size: 50
    move_down 20
    text '作成者氏名', size: 14
  end

  def contents
    text '本文'
    move_down 10
    text 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
          Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
          Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
          Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
  end

end

보기

인스턴스 사용


디렉터를 통해 전달된 후 PDF 내에서 데이터베이스에서 가져온 데이터를 사용할 수 있습니다.
app/controllers/record_pdfs_controller.rb
class RecordPdfsController < ApplicationController

  def index
    @records = Record.all # pdf上で使用するレコードのインスタンスを作成
    respond_to do |format|
      format.html
      format.pdf do

        pdf = RecordPdf.new(@records) # ここで受け取っている

        send_data pdf.render,
          filename:    "sample.pdf",
          type:        "application/pdf",
          disposition: "inline" # 画面に表示。外すとダウンロードされる。
      end
    end
  end

end
app/pdf/record_pdf.rb
class RecordPdf < Prawn::Document

  def initialize(record) # 受け取ったものがrecordに入っている

    super(
      page_size: 'A4',
      top_margin: 40,
      bottom_margin: 30,
      left_margin: 20,
      right_margin: 20
    )

    @record = record # メソッドで利用できるようにインスタンス化

    font 'app/assets/fonts/ipaexg.ttf'

    stroke_axis

    # 下記で作成したコンポーネントを表示順に
    header
    move_down 50
    contents

  end

  # コンポーネント作成
  def header
    text 'PDFのタイトル', size: 50
    move_down 20
    text '作成者氏名', size: 14
  end

  def contents
    text '本文'
    move_down 10
    text 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
          Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
          Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
          Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'

    move_down 50

    text "データの内容は#{@record.data}です" # 例えば、このように利用できる

  end

end

그게 다야.

참고 자료

  • Rails에서 Prawn을 사용하여 PDF 만들기
  • [Rails 엔지니어 필수] PDF 출력의 Prawn을 사용해 봤습니다.
  • Prawn manual
  • 좋은 웹페이지 즐겨찾기