рдкреАрдбреАрдПрдл рдЬреЗрдирд░реЗрд╢рди рдкреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЭреАрдВрдЧрд╛ рд░реЗрд▓ рдкреАрдбреАрдПрдл
рдкрд░рд┐рдЪрдп

рд╡рд┐рд╖рдп рдореЗрдВ, рдореИрдВ рд░реВрдмреА / рд░реЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ, рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ, рд╕рд╛рдЗрдЯ рд╕реЗ рд╕реАрдзреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдпрд╛ рд░реЗрдХ рдХрд╛рд░реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдореЗрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд▓рдЧреНрдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
рд╣рдо рд░реЗрд▓ 3.0.9 рдФрд░ рдЭреАрдВрдЧрд╛ рдордгрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред


рдЭреАрдВрдЧрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

рдмрдВрдбрд▓рд░

gem 'prawn', :git => "git://github.com/sandal/prawn.git", :submodules => true 


рд░реЗрд▓ рдПрдХреАрдХрд░рдг

рд░рд┐рдкреЛрд░реНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
$ mkdir app/reports

рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдСрдЯреЛрд▓реЙрдб рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ config / application.rb рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 config.autoload_paths << "#{Rails.root}/app/reports" 

рдФрд░ рдорд╛рдЗрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ (config / initializers / mime_types.rb)
 Mime::Type.register_alias "application/pdf", :pdf 

рд╣рдо рдСрдЯреЛрд▓реИрдб рдореЗрдВ рдордгрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗ (рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЧрдИ) рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ / prawn.rb
 require "prawn" 

рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЭреАрдВрдЧрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдЖрд░рд╡реАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)
 $ 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" 

рдкреАрдбреАрдПрдл рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдЭреАрдВрдЧрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд░реВрд╕реА рдлреЛрдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдШрд░ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦреЛ, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ / рдШрд░ / kir / prawn_fontsред рд╡рд░рджрд╛рди, рдкреНрд░реЙрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред

рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рд╣рдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рдбрд╝ рдмрдирд╛рдПрдВред

rails g scaffold customer name:string amount:float
rake db:migrate


рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рднрд░реЗрдВред

рдЕрдм рдЖрдк рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝рд╛рдЗрд▓ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд░рд┐рдкреЛрд░реНрдЯ / 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 

рдкреАрдбреАрдПрдл рдЬрдирд░реЗрдЯрд░ рддреИрдпрд╛рд░ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдПрдХреНрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
 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 

/ рдЧреНрд░рд╛рд╣рдХреЛрдВ / download_pdf рдкрд░ рдЬрд╛рдПрдВ ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдРрд╕рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ ред

рд░реЗрдХ рдХрд╛рд░реНрдп


рд▓реЗрдХрд┐рди рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рд░реЗрдХ рдХрд╛рд░реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреАрдбреАрдПрдл рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (lib / рдХрд╛рд░реНрдп / 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
рд░рд┐рдкреЛрд░реНрдЯ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / report.pdf рдореЗрдВ рдЬрдирд░реЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред

рд░реЗрдХ рдХрд╛рд░реНрдп + рдореЗрд▓рд░


рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐: рдкреАрдбреАрдПрдл рдХреЛ рдорд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдИ-рдореЗрд▓ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдореЗрд▓рд░ рдФрд░ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореЗрд▓рд░ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ: 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 

рдФрд░ рдЗрд╕рдХреЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣рдо рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рдорд╛рди рдХрд╛рд░реНрдп / рдХрд╛рд░реНрдп / 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 

рд╣реЛ рдЧрдпрд╛ред рдкрд░реНрдпрд╛рд╡рд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреЗ рдФрд░ рдПрдХреНрд╢рди_рдореЗрд▓рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛!
рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: rake customers_report:send_by_email --trace

рд╕рдВрджрд░реНрдн:

Github рдкрд░ рдЭреАрдВрдЧрд╛ рдХрд╛ рднрдВрдбрд╛рд░: https://github.com/sandal/prawn/
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рднрдВрдбрд╛рд░: https://github.com/kirs/pdfer
Github рдкрд░ рдЭреАрдВрдЧрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: https://github.com/sandal/prawn/wiki/Using-Prawn-in-Rails
рдкреАрдПрд╕ рдиреЗ рд░реЗрд▓реНрд╕ рдХреНрд▓рдм рдореЗрдВ рдЕрдкреНрд░реИрд▓ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рджрд┐рдорд┐рддреНрд░реА рдЧреИрд▓рд┐рдВрд╕реНрдХреА рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рджрд┐рдпрд╛!

Source: https://habr.com/ru/post/In120388/


All Articles