2011-02-17 11 views
20

मैं उपयोगकर्ता को पीडीएफ-आधारित रिपोर्ट प्रदर्शित करने के लिए प्रोन और प्रोनटो का उपयोग कर रहा हूं, लेकिन कुछ परिस्थितियों में, मैं पीडीएफ को अपने मॉडल में से एक के लिए अनुलग्नक के रूप में भी सहेजना चाहता हूं। मैं अपने सभी अनुलग्नकों के लिए पेपरक्लिप का उपयोग कर रहा हूं। क्या किसी को यह करने के बारे में कोई सुझाव है?पेपरक्लिप लगाव के रूप में एक प्रोन पीडीएफ सहेजें?

धन्यवाद!

उत्तर

8

यदि आप पेपरक्लिप में उस पीडीएफ के लिए फ़ाइल संदर्भ पास करते हैं तो इसे काम करना चाहिए।

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

धन्यवाद यह मेरे लिए काम करता है। – tjeden

25

प्रावंटो का उपयोग करते समय आपको .pdf.prawn टेम्पलेट में चर को eval करने की आवश्यकता होगी। दूसरा चरण पेपरक्लिप के लिए वास्तविक फ़ाइल की नकल करना है। पेपर क्लिप के साथ

#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 
  • सहेजें पीडीएफ:

    1. पीडीएफ जनरेट कर रहा है

      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! 
      

    आशा इस मदद करता है।

  • +0

    मुझे मॉडल विधि से पीडीएफ उत्पन्न करने के लिए यह बेहद उपयोगी पाया गया। एक पर्ची-अप में भाग लिया गया है कि अगर आप अपने prawnto टेम्पलेट्स pdf.method_name शैली का उपयोग करते हैं तो आपको Prawn :: Document.new "pdf" के आउटपुट का नाम देना होगा। धन्यवाद! – Unixmonkey

    2

    मैं इसे यह दूसरी तरह के आसपास बदल कर उदाहरण eval के बिना काम कर ली: अपने मॉडल में पीडीएफ पैदा करते हैं और आप में यह प्रस्तुत करना नियंत्रक

    एक मॉडल में:

    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 
    

    फिर आप भेज सकते हैं

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

    या अपने नियंत्रक में अपने ब्राउज़र विंडो में यह प्रस्तुत करना:

    यह एक मेल अनुलग्नक के रूप में
    send_data your_model.generate_pdf, :type => "application/pdf", :disposition => 'inline' 
    
    +0

    ^यह सामान्य प्रोन पीढ़ी के दिनचर्या का उपयोग करने और स्क्रीन या ईमेल प्रस्तुत करने के बारे में एक सही जवाब था। धन्यवाद! – Jetblackstar

    1

    यह मेरे लिए

    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! 
    

    काम कहाँ certificate क्या मेरी पेपरक्लिप लगाव मॉडल में रूप में सहेजा जाता है:

    class User < ActiveRecord::Base 
        has_attached_file :certificate 
    
    0

    @Adam अल्ब्रेक्ट, आप एक अनुलग्नक के रूप में छवि को सहेजने की जाएगी, लेकिन एक अनुलग्नक के रूप में पीडीएफ को सहेजने के लिए आपको एक और सत्यापन जोड़ने की आवश्यकता है -

    **** validates_att एंचमेंट: दस्तावेज़, content_type: {content_type: 'application/pdf'} ****

    संबंधित मुद्दे