2011-02-17 9 views

Odpowiedz

8

Powinien działać, jeśli wystarczy przekazać odwołanie do pliku do tego pliku PDF na spinacz.

require 'prawn' 
pdf = Prawn::Document.new 
pdf.text("Prawn Rocks") 
pdf.render_file('/path/to/prawn.pdf') 

pdf_file = File.open('/path/to/prawn.pdf') 

# assuming your Paperclip association is named "pdf_attachment" 
my_model.pdf_attachment = pdf_file 
+0

Dzięki to działa dla mnie. – tjeden

25

Podczas korzystania z prawnto będziesz musiał oszacować zmienne w szablonie .pdf.prawn. Drugim krokiem jest naśladowanie prawdziwego pliku do spinacza.

  1. Generowanie PDF:

    #find the prawwnto template you want 
    template = File.read("#{RAILS_ROOT}/app/views/reports/your_report.pdf.prawn") 
    
    pdf = Prawn::Document.new(:page_size => 'A4', :your_options => :etc) 
    
    pdf.instance_eval do 
        @report = find_report #put here, all local variables that the pdf template needs 
        eval(template) #this evaluates the template with your variables 
    end 
    
    attachment = pdf.render 
    
  2. Zapisz PDF z spinacza:

    file = StringIO.new(attachment) #mimic a real upload file 
    file.class.class_eval { attr_accessor :original_filename, :content_type } #add attr's that paperclip needs 
    file.original_filename = "your_report.pdf" 
    file.content_type = "application/pdf" 
    
    
    #now just use the file object to save to the Paperclip association. 
    
    
    # assuming your Paperclip association is named "pdf_report" 
    @report_store.pdf_report = file 
    @report_store.save! 
    

nadzieję, że to pomaga.

+0

Znalazłem to bardzo pomocne przy generowaniu plików PDF z metody modelowej. Jedną wpadką, o której mówiłem, jest to, że musisz podać nazwę pliku Prawn :: Document.new "pdf", jeśli Twoje szablony prawnto używają stylu pdf.method_name. Dzięki! – Unixmonkey

2

mam to działa bez instancji eval obracając ją na odwrót: generowanie plików PDF w modelu i czynią to w sobie kontroler

W modelu

def generate_pdf 
    Prawn::Document.new(:page_size => 'A4', :top_margin => 0, :left_margin => 0) do |pdf| 
     <your pdf code here> 
     <copy paste from your template> 
    end.render 
    end 

Następnie można wysłać to jako załącznik poczty elektronicznej:

attachment = generate_pdf 
mail = Notifier.send_pdf(attachment) 
mail.deliver 

lub uczynić go w oknach przeglądarki w kontrolerze:

send_data your_model.generate_pdf, :type => "application/pdf", :disposition => 'inline' 
+0

^To była doskonała odpowiedź na to, jak używać zwykłej rutyny generowania krewetek i renderować ekran lub e-mail. Dzięki! – Jetblackstar

1

ten pracował dla mnie

pdf = Prawn::Document.new(:page_size => "LETTER", :page_layout => :landscape) 
pdf.render_file File.join(Rails.root, "app/pdfs", "x.pdf") 
current_user.certificate = File.open("#{Rails.root}/app/pdfs/x.pdf") 
current_user.save! 

Gdzie certificate co mój załącznik spinacz zostanie zapisany jak w modelu

class User < ActiveRecord::Base 
    has_attached_file :certificate 
0

@Adam Albrecht, Będziesz oszczędność zdjęcie jako załącznik, ale dla zapisując pdf jako załącznik, musisz dodać jeszcze jedną weryfikację: -

**** validates_att achment: document, content_type: {content_type: 'application/pdf'} ****

Powiązane problemy