I'm using Prawn and Prawnto to display a PDF-based reports to the user, but in some circumstances, I'd also like to save the PDF as an attachment to one of my models. I'm using Paperclip for all of my attachments. Does anyone have any开发者_如何转开发 suggestions on how to do this?
Thanks!
When using prawnto you will need to eval the variables in the .pdf.prawn template. Second step is to mimic a real file for paperclip.
Generating the 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
Save PDF with paperclip:
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!
Hope this helps.
It should work if you just pass a File reference to that PDF to 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
I got it working without instance eval by turning it the other way around : generate the PDF in your model and render it in you controller
In a model :
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
You can then send it as a mail attachment :
attachment = generate_pdf
mail = Notifier.send_pdf(attachment)
mail.deliver
Or render it in your browser windows in your controller :
send_data your_model.generate_pdf, :type => "application/pdf", :disposition => 'inline'
This worked for 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!
Where certificate
is what my paperclip attachment is saved as in the model:
class User < ActiveRecord::Base
has_attached_file :certificate
@Adam Albrecht,You will be saving image as a attachment but for saving pdf as an attachment you need to add one more validation -
****validates_attachment :document, content_type: { content_type: 'application/pdf' }****
精彩评论