22

我正在使用 Prawn 和 Prawnto 向用户显示基于 PDF 的报告,但在某些情况下,我还想将 PDF 保存为我的模型之一的附件。我对所有附件都使用回形针。有人对如何做到这一点有任何建议吗?

谢谢!

4

5 回答 5

27

使用 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!
    

希望这可以帮助。

于 2011-02-24T23:52:25.403 回答
10

如果您只是将对该 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
于 2011-02-18T04:27:38.910 回答
2

我让它在没有实例 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'
于 2013-12-02T17:33:55.913 回答
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
于 2014-09-28T00:34:23.210 回答
0

@Adam Albrecht,您将图像保存为附件,但要将 pdf 保存为附件,您需要再添加一个验证-

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

于 2015-01-29T12:35:46.713 回答