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.
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
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''