こんにちは、とだ (cohki0305) です。
今日は Ruby と Rails を使って PDF ファイルを作る方法を 3 つ紹介します
これだけ知っていれば、どんな形式の書類でも作成できるでしょーという範囲です!
ざっと概要を紹介すると
3 つの方法
- HTML を PDF に変換する
- 既存の PDF や画像ファイルに字を埋め込み、PDF ファイルを作成する
- PDF ファイルを合体する
と言った感じです。
既存の PDF や画像ファイルに字を埋め込み、PDF ファイルを作成する
Thinreports とは帳票作成ツールです。
Thinreportsでらくらく帳票作成
http://ruby-rails.hatenadiary.com/entry/20140909/1410241835
特定の形式を持つ書類(たとえば、見積書や履歴書など)を作成するのに便利なライブラリーです。
以下のような chrome のアドオンを使用することで PDF の作ります。
画像をインポートできるので、作成したい形式の書類を画像化して貼り付けます。
あとは書類に入力したい項目を以下のように指定して、ID を指定します。
あとは、上記で作成した tlf
ファイルを以下のように読み込み
指定した ID に value を定義すれば、PDF のバイナリデータが作成されます。
1 2 3 |
report = ThinReports::Report.new(layout: "#{Rails.root}/app/pdfs/sample.tlf") report.page.item(:full_name).value '名前 名前' file = report.generate |
HTML を PDF に変換する
これはよくあるやつですね。
gem wicked_pdf が有名です。
以下のようにコントローラーを設定して、テンプレート作成することで HTML を PDF に変換してダウンロードできます。
1 2 3 4 5 6 7 8 9 10 |
class ThingsController < ApplicationController def show respond_to do |format| format.html format.pdf do render pdf: "file_name" # Excluding ".pdf" extension. end end end end |
他にも以下のように指定して、 PDF のバイナリデータを作成することもできます。
こちらのほうが何かと応用が効くかと思います。
1 2 3 4 5 6 |
pdf = render_to_string( pdf: 'pdf_filename', template: 'views/pdfs/sample.pdf.haml', encoding: 'UTF-8', layout: 'pdf.html' ) |
詳しくは以下を参考にしていただければと思います。
README | wicked_pdf
Railsでwicked_pdfを使って画像入りのPDFを生成する
HTML を render するためか、thinreport よりダウンロードに時間がかかる気がします。
PDF ファイルを合体する
最後は、PDF ファイルを合体する方法です。
ストレージの PDF ファイル同士でも、上で作成した PDF データであっても合体できます。
gem Combined_pdf を使います。
以下のように load メソッドを使うと、ストレージの PDF ファイルを読み込むことができます。
以下のようにすれば、pdf ファイル同士を合体させられます。
1 2 3 4 5 |
combined_pdf = CombinePDF.new combined_pdf << CombinePDF.load("なんとか.pdf") combined_pdf << CombinePDF.load("かんとか.pdf") send_data combined_pdf.to_pdf, filename: 'なんとかかんとか.pdf', type: 'application/pdf' |
send_data を使うことでダウンロードができますよ。
parse メソッドを使えば、PDF binary データや外部のサーバーの PDF データと合体することができます。
たとえば、wicked_pdf で作成したデータと合体させることができます。
1 2 3 4 5 6 7 8 9 10 |
pdf = render_to_string( pdf: 'pdf_filename', template: 'views/pdfs/sample.pdf.haml', encoding: 'UTF-8', layout: 'pdf.html' ) combined_pdf = CombinePDF.new combined_pdf << CombinePDF.load("なんとか.pdf") combined_pdf << CombinePDF.parse(pdf) |
最後に
以上、3つが PDF を自由自在に扱うための Gem でした!
今回は簡単な紹介でしたが、それぞれの Gem はもっといろいろな機能があるので興味がある方は詳しく調べてみてください。
不明点などあれば、コメントください!
コメント