使用Prawn with rails app:将生成的pdf文件发送到用户的下载文件夹而不是app目录

时间:2015-10-05 17:36:29

标签: ruby-on-rails ruby prawn

在控制器中,我在其中一个操作中有以下行:

def some_action
  @blog = Blog.find(11)
  PdfSingleBlog.new(@blog).print
end

PDfSingleBlog只是一个充当服务的PORO类。该服务的工作显然是生成该博客的pdf,并且应该将该pdf发送到用户的下载文件夹。该代码位于此处:

#app/services/pdf_single_blog.rb
class PdfSingleBlog

  def initialize(blog)
    @blog = blog
  end

  def print
    pdf = Prawn::Document.new
    pdf.text "Blog Name: #{@blog.name}"
    pdf.text "Description: #{@blog.description}"
    pdf.render_file "blog_info.pdf"
  end
end

pdf已成功生成,但未将其发送到用户的下载文件夹。而是将其保存到服务器上的应用程序目录中。

如何将生成的pdf实际发送到用户的下载文件夹?

PDF of prawn manual found here

<小时/> 更新了以下答案:

def some_action
  @blog = Blog.find(11)
  blog_pdf = PdfSingleBlog.new(@blog).prepare_for_print
  send_data blog_pdf.render, filename: "blog.pdf", type: "application/pdf"
end

#app/services/pdf_single_blog.rb
class PdfSingleBlog

  attr_reader :blog
  def initialize(blog)
    @blog = blog
  end

  def prepare_for_print
    pdf = Prawn::Document.new
    pdf.text "Blog Name: #{@blog.name}"
    pdf.text "Description: #{@blog.description}"
    return pdf
  end
end

1 个答案:

答案 0 :(得分:2)

当您正在生成文件时,您实际上并未将其发送到浏览器。虽然您可以使用send_file将本地生成的文件发送到浏览器,但这需要您生成文件并将其保存在本地。

由于这个文件是动态生成的,我建议使用send_data来避免需要保存文件。

您可以通过进行以下修改来实现此目的

在您的控制器中:

def some_action
  @blog = Blog.find(11)
  send_data PdfSingleBlog.new(@blog).print_data, filename:'blog.pdf', type: "application/pdf", disposition: :attachment
end

在你的模特中:

class PdfSingleBlog

  def print_data
    pdf = Prawn::Document.new
    pdf.text "Blog Name: #{@blog.name}"
    pdf.text "Description: #{@blog.description}"
    pdf.render
  end
end

这会将pdf作为附件流式传输到浏览器,这将提示最终用户打开或下载文件。