如何在 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/&lt;item_id&gt;/ 中。 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 标签

Ruby 语言如何走过未来二十五年

使用 ruby​​ pdf-reader 解析 pdf

AWS OpsWorks:成功的 Ruby on Rails 默认层部署在浏览器中显示 404 错误

如何在 Ruby 中解析 pdf