エビを使用したPDF生成

エビのレールPDF

はじめに


このトピックでは、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に感謝します!



All Articles