在Rails应用程序中内联显示pdf文件

时间:2010-06-08 19:09:20

标签: ruby-on-rails pdf

我在云端保存了pdf文件附件。该文件使用attachment_fu附加。我在视图中显示的所有内容是:

<%= image_tag @model.pdf_attachment.public_filename %>

当我在浏览器中加载包含此代码的页面时,它会执行我想要的操作:它显示附加的pdf文件。

但仅限于Mac。

在Windows上,浏览器将显示损坏的图像占位符。 Chrome的开发者工具报告:“资源被解释为图像,但使用MIME类型application / pdf进行传输。”

我也试过从控制器发送文件:

PdfAttachmentsController中的

def send_pdf_attachment
  pdf_attachment = PdfAttachment.find params[:id]
  send_file pdf_attachment.public_filename,
    :type => pdf_attachment.content_type,
    :file_name => pdf_attachment.filename,
    :disposition => 'inline'
end

在routes.rb中:

map.send_pdf_attachment '/pdf_attachments/send_pdf_attachment/:id', 
  :controller => 'pdf_attachments', 
  :action => 'send_pdf_attachment'

并在视图中:

<%= send_pdf_attachment_path @model.pdf_attachment %>
or
<%= image_tag( send_pdf_attachment_path @model.pdf_attachment ) %>

并且这不会在Mac上显示该文件(我没有尝试在Windows上),它会显示路径:

pdf_attachments/send_pdf_attachment/35

如何正确显示内联的pdf文件?

5 个答案:

答案 0 :(得分:3)

您是否尝试使用简单的<iframe>代码?

这对我有用:

在视图(show.hmtl.erb)

<iframe src=<%= @certificate.certificate_pdf %> width="600" height="780" style="border: none;"> </iframe>

只需调用带有嵌入式ruby的文件作为'iframe'标记的来源,经过数小时的搜索后,我就可以使用它。 'certificate'是我的模型,'certificate_pdf'是我的附件文件。我测试了它并适用于Mac(Safari,FF,Chrome)和Windows(IE10,FF,Chrome)

答案 1 :(得分:2)

您无法发送本地计算机上没有的文件。如果要将文件发送到其内容存在于另一台服务器上的Web客户端,则首先需要获取文件的内容,然后在将该文件下载到本地文件后对其进行流式传输。

ie ...向(远程)服务器发出HTTP get请求,然后将其内容保存在文件对象中,然后发送send_file THAT。

答案 2 :(得分:1)

您是否尝试过停用该文件的流媒体?

send_file pdf_attachment.public_filename,
  :type => pdf_attachment.content_type,
  :file_name => pdf_attachment.filename,
  :disposition => 'inline',
  :stream => false

另外请确保文件没有损坏,如果您将配置更改为附件并下载它仍然可以打开,如果你制作md5-hash,它是否与原始相同?

答案 3 :(得分:1)

我的猜测是它没有显示,因为你试图在图片标签中显示pdf。这不是一个图像,它是一个pdf 要么在iframe中显示,要么将其放在一个链接中,该链接仅使用send_file和内联处置显示pdf。

我使用princely插件创建pdf,并使用此方法显示内联。

答案 4 :(得分:0)

您是否已尝试通过编写:type => ‘application/pdf’来明确设置类型? 当文件从云端提供时,它由你的其他网络服务器提供服务 - 也许他们发送的是Mime Type“application / octet-stream”,而不是pdf?