如何在 ROR (Ruby) 中显示 PDF? [关闭]
Posted
技术标签:
【中文标题】如何在 ROR (Ruby) 中显示 PDF? [关闭]【英文标题】:How do I display a PDF in ROR (Ruby)? [closed] 【发布时间】:2011-11-21 23:05:08 【问题描述】:我在互联网上四处查看,但似乎无法找到如何在 rails 中显示 PDF(我只能找到有关如何创建 PDF 的信息)。
有人知道我需要显示什么代码/宝石吗?
【问题讨论】:
使用prawn 是一种事实上的标准。 大厅监视器再次响起。截至今天,我们中有 29 人认为这是一个很好的问题,并且 1 人都知道这不是,但不知何故有权关闭它。 SO 坏了。 【参考方案1】:在您的控制器中:
def pdf
pdf_filename = File.join(Rails.root, "tmp/my_document.pdf")
send_file(pdf_filename, :filename => "your_document.pdf", :type => "application/pdf")
end
在config/environment/production.rb
:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
或
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
配置修改是必需的,因为它使 Web 服务器可以直接从磁盘发送文件,这会大大提高性能。
更新
如果您想显示而不是下载它,请使用send_file
的:disposition
选项:
send_file(pdf_filename, :filename => "your_document.pdf", :disposition => 'inline', :type => "application/pdf")
如果你想内联显示它,this question 会比我更完整。
【讨论】:
嘿,这是很棒的东西。在向用户发送pdf方面。但是在发送之前在网站上显示它呢? :) 看来我的回答不能让你满意,你能告诉我为什么吗? 对不起,是的。简要添加配置仍然希望用户下载它。我没有添加 iframe,但是一个例子会很好地说明如何在其中加载 pdf。 :)。在您回复后不久,我昨天完成了工作,并且从那以后就预先参与了其他软件的错误。我最近才设法通过我的网络服务成功接收 pdf 文件。 认为不应该坚持简单的、已经实施的想法。你帮我解决了这个问题。谢谢 这是为我做的:send_file(..., disposition: 'inline')
【参考方案2】:
基本上你只需要把它写在你视图中的html中。所以这个简单的解决方案对我有用:
在'show.hmtl.erb'中
<iframe src=<%= @certificate.certificate_pdf %> style="border: none;"> </iframe>
经过数小时的搜索后,只需将文件位置放入嵌入式 ruby 作为 iframe 标记的来源即可。 'certificate' 是我的模型,'certificate_pdf' 是我的附件。
【讨论】:
这对我有用。使用send_file(..., disposition: 'inline')
加上使用生成 pdf 的路由将在 iframe 中显示 pdf。【参考方案3】:
根据 PDF 的来源,以下内容可能会对您有所帮助。我有一个存储很多东西的应用程序,其中一些有(附加的)PDF 连接到这些项目。我将项目存储在目录/public/res/<item_id>/
中。 res
表示结果,item_id
是 Rails 中该项的数字 id。
在视图中,我通过以下(伪)代码提供了指向 PDF 的链接作为辅助方法,可以在视图中使用:
def file_link(key, name = nil)
res= Ressource.find(:first, :conditions => ["key = ?", key])
list = Dir["public/res/#res.id/*"]
file= list.empty? ? "" : list[0]
return file if file.empty?
fn = name ? name : File.basename(file)
link_to fn, "/res/#res.id/#File.basename(file)", :popup => true
end
这里的相关部分是link_to name, "/res/#res.id/#File.basename(file)"
的东西。
【讨论】:
解决方案需要注意两点:1/ 您只能显示位于public
文件夹中的文件。 2/ 您不能在浏览器保存对话框中更改文件的名称。
确实如此,但有时就足够了。这是一个简单的解决方案,我知道 :-)
你说得完全正确,我只是想指出可能(或不是 ;-) )会破坏交易的限制。【参考方案4】:
这可能太简单了,但我很难找到一个简单的答案来解决我的问题,所以我把它贴在这里。我真的不想为了下载静态文件而向我的控制器添加另一个动作。
我刚刚将我的文件上传到 S3 并使用 link_to 指的是 S3 在您上传文件并设置权限后提供的路径(请记住,每个人都必须能够上传和下载它)。我在 S3 上存储了应用程序的大量数据,所以这似乎是一个不错的选择。
<%= link_to "speaker registration form", "https://s3.amazonaws.com/gws_documents/speaker_registration.pdf" %>
【讨论】:
【参考方案5】:def pdf
pdf_content = ...# create the pdf
send_data(pdf_content, :filename => "test.pdf", :type => "application/pdf")
end
【讨论】:
嗨,这看起来很有希望,但如果我只想从文件加载和显示怎么办。 IE。我没有 pdf_content 变量。 在这种情况下,看看 Benoit 的解决方案。以上是关于如何在 ROR (Ruby) 中显示 PDF? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ruby on rails 中显示 Datatable 表格工具(复制、csv、excel、pdf、保存)
RoR TagLib-Ruby:如何在 DB 中设置 ID3 标签