Сохранить PDF-файл с креветками как вложение в виде скрепки? - PullRequest
21 голосов
/ 18 февраля 2011

Я использую Prawn и Prawnto для отображения отчетов в формате PDF для пользователя, но в некоторых случаях я также хотел бы сохранить PDF в качестве вложения в одну из моих моделей. Я использую Скрепку для всех своих вложений. У кого-нибудь есть предложения как это сделать?

Спасибо!

Ответы [ 5 ]

26 голосов
/ 25 февраля 2011

При использовании prawnto вам нужно будет оценить переменные в шаблоне .pdf.prawn.Второй шаг - имитировать настоящий файл для скрепки.

  1. Создание 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. Сохранение PDF с помощью скрепки:

    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!
    

Надеюсь, это поможет.

9 голосов
/ 18 февраля 2011

Это должно работать, если вы просто передадите ссылку на файл в этот PDF-файл в 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
2 голосов
/ 02 декабря 2013

Я получил его без экземпляра eval, перевернув его наоборот: сгенерируйте PDF-файл в своей модели и визуализируйте его в своем контроллере

В модели:

  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'
1 голос
/ 28 сентября 2014

Это сработало для меня

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 голосов
/ 29 января 2015

@ Adam Albrecht, Вы будете сохранять изображение в виде вложения, но для сохранения pdf в качестве вложения необходимо добавить еще одну проверку -

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

...