Rails5로 Prown의 PDF 만들기
개시하다
Rails5에서 PDF를 제작할 때 편리한 젬 프라운의 사용법에 대해서는 메모 형식으로 요약한다.누구한테 도움이 됐으면 좋겠어요.
컨디션
Rails
5.1.6
데이터베이스에서 mysql 사용
영입
먼저 Gemfile에 prawn 가져오기용gem을 추가합니다.
Gemfilegem '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.rbclass 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.rbclass 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.rbclass 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.rbclass 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.rbclass 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.rbclass 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.rbclass 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.rbclass 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
그게 다야.
참고 자료
gem 'prawn'
gem 'prawn-table'
$ bundle install
$ mkdir app/pdfs
$ touch app/pdfs/record_pdf.rb # record_pdf.rbというファイル名で作成、model名はRecordPdfとなる
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
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
$ rails g controller record_pdfs index # コントローラ作成時にindexページも作成
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
<%= link_to "PDFを表示", 適宜指定_path(format: "pdf") %>
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
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
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
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
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
Reference
이 문제에 관하여(Rails5로 Prown의 PDF 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yacci/items/61a26ddd3f6eb2494121텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)