はじめに
このトピックでは、Ruby / Railsを使用してPDFドキュメントを作成、生成、サイトから直接ダウンロード、またはrakeタスクを介して作成し、メーラー経由で添付ファイルとして送信する機能を検討します。
Rails 3.0.9とPrawn gemを使用します。
エビのインストール
バンドラー
gem 'prawn', :git => "git://github.com/sandal/prawn.git", :submodules => true
レール統合
レポートクラスのディレクトリを作成します。
$ mkdir app/reports
config / application.rbのこのディレクトリからクラスを自動ロードするには:
config.autoload_paths << "#{Rails.root}/app/reports"
そして、MIMEタイプを登録します(config / initializers / mime_types.rb)
Mime::Type.register_alias "application/pdf", :pdf
autoload(以前にファイルを作成した)config / initializers / prawn.rbにgemを含めます
require "prawn"
エビが動作するかどうかを確認する(RVMを使用)
$ rails c Loading development environment (Rails 3.0.9) ruby-1.9.2-p180 :001 > Prawn::BASEDIR => "/home/kir/.rvm/gems/ruby-1.9.2-p180@pdfer/bundler/gems/prawn-1288242ddece"
PDFを生成
Prawnがキリル文字をサポートするには、ロシア語のフォントを提供する必要があります。 それらをホームディレクトリに入れて、/ home / kir / prawn_fontsにします。 Prawnとの作業でテストされたVerdanがここに投稿しました 。
データを含むテーブルを作成するには、Customerモデルでスキャフォールドを作成します。
rails g scaffold customer name:string amount:float
rake db:migrate
テーブルにデータを入力します。
これで、レポートファイルジェネレーターを作成できます。 次のコードでapp / reports / customers_report.rbにします:
# encoding: utf-8 class CustomersReport < Prawn::Document # Widths = [200, 200, 120] # Headers = [' ', '', ''] def row(date, customer_name, amount) row = [date, customer_name, amount] make_table([row]) do |t| t.column_widths = Widths t.cells.style :borders => [:left, :right], :padding => 2 end end def to_pdf # font_families.update( "Verdana" => { :bold => "/home/kir/prawn_fonts/verdanab.ttf", :italic => "/home/kir/prawn_fonts/verdanai.ttf", :normal => "/home/kir/prawn_fonts/verdana.ttf" }) font "Verdana", :size => 10 text " #{Time.zone.now.strftime('%b %Y')}", :size => 15, :style => :bold, :align => :center move_down(18) # @customers = Customer.order('created_at') data = [] items = @customers.each do |item| data << row(item.created_at.strftime('%d/%m/%y %H:%M'), item.friendly_name, item.) end head = make_table([Headers], :column_widths => Widths) table([[head], *(data.map{|d| [d]})], :header => true, :row_colors => %w[cccccc ffffff]) do row(0).style :background_color => '000000', :text_color => 'ffffff' cells.style :borders => [] end # creation_date = Time.zone.now.strftime(" %e %b %Y %H:%M") go_to_page(page_count) move_down(710) text creation_date, :align => :right, :style => :italic, :size => 9 render end end
PDFジェネレーターの準備ができました。 顧客アクションコントローラーに追加します。これは、PDFのダウンロードを担当します。
def download_pdf output = CustomersReport.new.to_pdf send_data output, :type => 'application/pdf', :filename => "customers.pdf" end
このアクションのルートを登録することを忘れないでください! たとえば、次のように:
resources :customers do collection do get 'download_pdf' end end
/ customers / download_pdfに移動します 。 結果はそのような文書です。
すくいタスク
しかし、rakeタスクを介してPDFを生成したいとします。 実装を検討してください(lib / tasks / customers_report.rakeコード):
namespace :customers_report do desc 'Generates report with customers' task :generate_pdf => :environment do output = CustomersReport.new.to_pdf filename = "report.pdf" File.open(Rails.root.join('public', filename), 'wb') do |f| f.write(output) end puts "Report was written to #{filename}" end end
実行中:
rake customers_report:generate_pdf --trace
レポートは、public / report.pdfで生成されます。
熊手タスク+メーラー
別の状況:PDFは毎月電子メールで送信する必要があります。 これを行うには、メーラーと別のタスクを作成する必要があります。
メーラーの生成:
rails g mailer customers_mailer report_email
およびコードapp /
rails g mailer customers_mailer report_email
/ customers_mailer.rbを変更します:
class CustomersMailer < ActionMailer::Base default :from => "me@yandexteam.ru" # ! def report_email(pdf_output, to) report_filename = Time.zone.now.strftime('Report %d-%m-%Y') attachments[report_filename] = { :mime_type => 'application/pdf', :content => pdf_output } mail(:to => to, :subject => report_filename.titleize) end end
また、送信用のタスクも規定しています(同じlib / tasks / customers_report.rake):
namespace :customers_report do desc 'Generates report with customers' task :generate_pdf => :environment do #... end desc 'Send report by email' task :send_by_email => :environment do # # recipient = ["vasya@gmail.com", "petya@gmail.com"] recipient = 'me@yandexteam.ru' # ! output = CustomersReport.new.to_pdf CustomersMailer.report_email(output, recipient).deliver puts "Report was sent to #{recipient}" end end
できた 環境パラメーターで実際のアドレスとaction_mailer設定を指定することを忘れないでください!
パフォーマンスの確認:
rake customers_report:send_by_email --trace
参照:
Githubのエビリポジトリ: https : //github.com/sandal/prawn/
記事に記載されているデモアプリケーションを使用した私のリポジトリ: https : //github.com/kirs/pdfer
GithubへのPrawnのインストールについて: https : //github.com/sandal/prawn/wiki/Using-Prawn-in-Rails
PS Rails Clubでの4月のプレゼンテーションについて、evroneのDmitry Galinskyに感謝します!