【问题标题】:How do I display a PDF in ROR (Ruby)? [closed]如何在 ROR (Ruby) 中显示 PDF? [关闭]
【发布时间】:2011-11-21 23:05:08
【问题描述】:

我在互联网上四处查看,但似乎无法找到如何在 rails 中显示 PDF(我只能找到有关如何创建 PDF 的信息)。

有人知道我需要显示什么代码/宝石吗?

【问题讨论】:

  • 使用prawn 是一种事实上的标准。
  • 大厅监视器再次响起。截至今天,我们中有 29 人认为这是一个很好的问题,并且 1 人都知道这不是,但不知何故有权关闭它。 SO 坏了。

标签: ruby-on-rails ruby pdf


【解决方案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 %> width="600" height="780" 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 的解决方案。
    猜你喜欢
    • 2011-09-16
    • 2018-01-10
    • 2013-04-08
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多