2011-02-17 17 views
20

Estoy usando Prawn y Prawnto para mostrar informes basados ​​en PDF al usuario, pero en algunas circunstancias, también me gustaría guardar el PDF como un archivo adjunto a uno de mis modelos. Estoy usando Paperclip para todos mis archivos adjuntos. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto?¿Guarda un PDF de gambas como archivo adjunto de Paperclip?

Gracias!

Respuesta

8

Debería funcionar si acaba de pasar una referencia de archivo a ese PDF en 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

Gracias, me funciona. – tjeden

25

Al usar gamba, deberá evaluar las variables en la plantilla .pdf.prawn. El segundo paso es imitar un archivo real para clip.

  1. Generación 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. Guardar PDF con un clip:

    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! 
    

Espero que esto ayude.

+0

Encontré esto muy útil para generar pdfs a partir de un método modelo. Un error al que me topé es que debe nombrar el resultado de Prawn :: Document.new "pdf" si sus plantillas de gambón usan el estilo de pdf.method_name. ¡Gracias! – Unixmonkey

2

lo tengo trabajando sin instancia eval girándolo en el revés: generar el PDF en el modelo y hacerlo en ti controlador

En un modelo:

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 

entonces usted puede enviar como un archivo adjunto del mensaje:

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

O hacerla en las ventanas del navegador en su controlador:

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

^Esta fue una respuesta perfecta sobre cómo usar una rutina común de generación de gambas y procesar tanto la pantalla como el correo electrónico. ¡Gracias! – Jetblackstar

1

Esto funcionó para mí

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! 

Dónde certificate es lo que mi apego clip se guarda como en el modelo:

class User < ActiveRecord::Base 
    has_attached_file :certificate 
0

@ Adam Albrecht, se le ahorra la imagen como un archivo adjunto, pero para guardando el pdf como archivo adjunto necesita agregar una validación más -

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

Cuestiones relacionadas