在Heroku上使用Prawn

Mat*_*t K 10 ruby ruby-on-rails heroku prawn ruby-on-rails-3

我们目前正在研究Heroku上托管的Rails应用程序.我们正在尝试生成PDF并将其推送给用户下载.

我们正在使用Prawn来处理PDF生成.

我们目前生成PDF的代码:

Prawn::Document.generate @name[0]+ ".pdf" do
Run Code Online (Sandbox Code Playgroud)

接下来是我们生成文档的所有代码.不幸的是,这会将文档保存到磁盘上,这对于Heroku上托管的应用程序来说是不可能的(据我所知).

然后我们使用它将其推送给用户

send_file "#{Rails.root}/"+@name[0]+ ".pdf", :type =>
'application/pdf',:filename => @name[0]+ ".pdf"
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Prawn直接将文档下载到用户而不先将文档保存到磁盘?如果没有,是否有任何其他宝石用于生成PDF,在发送文件之前不需要将文件保存到磁盘?

Gen*_*ene 8

虽然很久以前就回答了这个问题,但我会为其他可能想要这样做的人发帖.

您也可以render在当前的Prawn v0.13.2中调用无文件名.将返回一个字符串,可以将其发送给客户端send_data.模式是:

pdf = Prawn::Document.new
# ... calls to build the pdf
send_data pdf.render, 
          type: 'application/pdf', 
          filename: 'download_filename.pdf',  
          disposition: :inline
Run Code Online (Sandbox Code Playgroud)

这将在浏览器中显示PDF.如果您希望让用户下载它,请省略, disposition: :inline

当然,如果文档相当短或者您的系统使用不当,您只想这样做,因为在用户下载完成之前它会消耗RAM.


yfe*_*lum 7

在Aspen/Bamboo上,您可以将文件保存到tmp/应用程序目录(可能Rails.root.join("tmp"))或任何子目录中的目录中.

在Cedar上,您可以将文件保存到应用程序目录中的任何位置,但您仍应选择应用程序目录的子目录tmp/.

在任何一种情况下,保存的文件都是短暂的.它们不在应用程序的两个运行实例之间共享; 它们不会在重启之间保持; 不要依赖于在一个请求中保存文件,然后能够在第二个请求中访问它.