ruby-on-rails ruby-on-rails-3 paperclip prawn prawnto

ruby on rails - ¿Guardar un PDF de gamba como un archivo adjunto Paperclip?



ruby-on-rails ruby-on-rails-3 (5)

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

**** validates_attachment: document, content_type: {content_type: ''application / pdf''} ****

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?

¡Gracias!


Cuando use prawnto, necesitará evaluar las variables en la plantilla .pdf.prawn. El segundo paso es imitar un archivo real para un clip.

  1. Generando el 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 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.


Debería funcionar si simplemente pasa una referencia de archivo a ese 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


Esto funciono para mi

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!

Donde certificate es lo que mi archivo adjunto se guarda como en el modelo:

class User < ActiveRecord::Base has_attached_file :certificate


Lo conseguí funcionando sin evaluación de instancias girándolo a la inversa: genere el PDF en su modelo y créelo en su 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

A continuación, puede enviarlo como un archivo adjunto de correo:

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

O lo representa en las ventanas de su navegador en su controlador:

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