2011-02-17 40 views
20

Tôi đang sử dụng Prawn và Prawnto để hiển thị báo cáo dựa trên PDF cho người dùng, nhưng trong một số trường hợp, tôi cũng muốn lưu tệp PDF dưới dạng tệp đính kèm vào một trong các mô hình của tôi. Tôi đang sử dụng Paperclip cho tất cả các tài liệu đính kèm của tôi. Có ai có bất cứ đề nghị về làm thế nào để làm điều này?Lưu tệp PDF của Prawn dưới dạng tệp đính kèm Kẹp giấy?

Cảm ơn!

Trả lời

8

Nó sẽ hoạt động nếu bạn chỉ cần chuyển tham chiếu Tệp tới tệp PDF đó tới 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

Cảm ơn nó phù hợp với tôi. – tjeden

25

Khi sử dụng tôm, bạn sẽ cần đánh giá các biến trong mẫu .pdf.prawn. Bước thứ hai là bắt chước một tệp thực sự cho kẹp giấy.

  1. Tạo 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. Save PDF với kẹp giấy:

    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.

+0

Tôi thấy điều này cực kỳ hữu ích để tạo các tệp pdf từ một phương thức mô hình. Một trong những slip-up tôi chạy vào là bạn phải đặt tên cho đầu ra của Prawn :: Document.new "pdf" nếu mẫu prawnto của bạn sử dụng phong cách pdf.method_name. Cảm ơn! – Unixmonkey

2

tôi đã nhận nó làm việc mà không dụ eval bằng cách chuyển nó theo cách khác xung quanh: tạo ra PDF trong mô hình của bạn và làm cho nó trong bạn bộ điều khiển

Trong một mô hình:

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 

Sau đó bạn có thể gửi nó như là một tập tin đính kèm mail:

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

Hoặc render nó trong cửa sổ trình duyệt của bạn trong điều khiển của bạn:

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

^Đây là một câu trả lời hoàn hảo về cách sử dụng thường trình tạo thông thường của Prawn và hiển thị màn hình hoặc email. Cảm ơn! – Jetblackstar

1

này làm việc cho tôi

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! 

đâu certificate là những gì gắn kẹp giấy của tôi được lưu như trong mô hình:

class User < ActiveRecord::Base 
    has_attached_file :certificate 
0

@ Adam Albrecht, Bạn sẽ được lưu hình ảnh như một tập tin đính kèm nhưng để lưu pdf dưới dạng tệp đính kèm, bạn cần phải thêm một xác thực khác -

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

Các vấn đề liên quan