2011-02-17 3 views
20

Sto utilizzando Prawn e Prawnto per visualizzare un report basato su PDF all'utente, ma in alcune circostanze, vorrei anche salvare il PDF come allegato a uno dei miei modelli. Sto usando Paperclip per tutti i miei allegati. Qualcuno ha qualche suggerimento su come farlo?Salva un PDF Prawn come allegato Paperclip?

Grazie!

risposta

8

Dovrebbe funzionare se si passa semplicemente un riferimento File a quel PDF a Paperclip.

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

Grazie funziona per me. – tjeden

25

Quando si utilizza prawnto è necessario valutare le variabili nel modello .pdf.prawn. Il secondo passo è quello di imitare un file reale per paperclip.

  1. Generazione del 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. Salva PDF con graffetta:

    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! 
    

Spero che questo aiuti.

+0

Ho trovato questo estremamente utile per la generazione di pdf da un metodo di modello. Uno scivolone in cui mi sono imbattuto è che devi nominare l'output di Prawn :: Document.new "pdf" se i tuoi template di prawnto usano lo stile pdf.method_name. Grazie! – Unixmonkey

2

ho preso a lavorare senza esempio eval ruotandolo il contrario: generare il PDF nel modello e renderlo in voi controllore

In un modello:

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 

È possibile quindi inviare come un allegato di posta elettronica:

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

O renderlo nelle finestre del browser nel tuo controller:

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

^Questa è stata una risposta perfetta su come utilizzare una routine di generazione di gamberi comune e rendere schermo o e-mail. Grazie! – Jetblackstar

1

Questo ha funzionato per me

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! 

Dove certificate è ciò che il mio attaccamento graffetta viene salvato come nel modello:

class User < ActiveRecord::Base 
    has_attached_file :certificate 
0

@ Adamo Albrecht, si risparmia immagine come un allegato, ma per salvando il pdf come allegato è necessario aggiungere un'altra convalida -

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