2

我正在使用 Prawn 和 Prawnto 在 Ruby on Rails 应用程序(Rails 版本 2.2.2)中生成 PDF,它运行良好,可以愉快地生成 PDF 并将它们发送给用户以在 Firefox 中下载。

问题出在 IE7 中。

我有一个这样设置的路线:

map.invoice_pdf '/invoices.pdf', :controller => 'invoices', 
                :action => 'index', :format => 'pdf'

然后我有一个这样的链接:

invoice_pdf_path(:year => params[:year], :month => params[:month], 
                 :unpaid_only => params[:unpaid_only])

我的控制器中有以下内容:

 def index
    params[:year]  = default params[:year]
    params[:month] = default params[:month]
    params[:page] ||= 1

    @invoices = Arobl.find_invoices_for_customer(current_customer.strCustomerID,
                       params)

    respond_to do |format|
      format.html{ render :action => 'index' }
      format.pdf{
        prawnto :inline => false, :filename => 
                "#{current_customer.strCustomerID}_invoice.pdf"
  end

在 FF 中,这按预期工作,当单击链接时,会以 .pdf 格式调用显示操作,并以正确命名的 PDF 进行响应。当它被 IE7 击中时,它说找不到文件或网站,并引用“invoices.pdf”而不是预期的 customer_id_invoice.pdf 文件名。

知道什么可能导致这种行为吗?

谢谢!

4

4 回答 4

4

我也有这个问题。当我尝试在 Internet Explorer(7 或 8)上请求没有 SSL 的相同 PDF 时,它可以工作,但如果我使用 SSL 请求它,它就无法工作......

我们认为我们可能已经将其追踪到 IE 在下载 PDF 时所期望的标题。我还没有检查 prawnto 源代码以查看它设置了哪些标头,但我们可能会使用一些 Rack Middleware 来注入我们需要的标头:

# add headers for PDF downloads in IE
# PDFs not downloading correctly via SSL in IE
# solution: add some headers for PDF downloads
# http://marc.info/?l=php-general&m=124301243808544&w=2
class RackAddPdfHeadersForIe
  def initialize( app )
    @app = app
  end

  def call( env )
    @status, @headers, @body = @app.call env
    add_headers if is_pdf? and is_internet_explorer?        
    [@status, @headers, @body]
  end

  def is_pdf?
    @headers['Content-Type'] =~ /pdf/
  end

  def is_internet_explorer?
    @headers['User-Agent'] =~ /MSIE ([0-9]{1,}[\.0-9]{0,})/
  end

  def add_headers
    @headers['Content-Description'] = 'File Transfer'
    @headers['Content-Transfer-Encoding'] = 'binary'
    @headers['Expires'] = '0'
    @headers['Pragma'] = 'public'
  end      
end

所以我尝试了这个,认为它会起作用,然后发现它确实仍然不起作用。

所以我最终这样做了,无论出于何种原因,这对我有用:

class ReportsController < ApplicationController

  def payroll_summary
    respond_to do |format|
      format.pdf do 
        response.headers['Content-Disposition'] = "attachment;filename=\"#{action_name}.pdf\""
        response.headers['Content-Description'] = 'File Transfer'
        response.headers['Content-Transfer-Encoding'] = 'binary'
        response.headers['Expires'] = '0'
        response.headers['Pragma'] = 'public'
        render
      end  #format.pdf
    end #respond_to
  end #payroll_summary

end
于 2010-01-11T17:12:57.360 回答
1

这个问题在http://support.microsoft.com/kb/323308中有解释

解决方案是将您的 Cache-Control 标头设置为 no-store 以外的其他内容,例如:

response.headers["Cache-Control"] = "private, max-age=0, must-revalidate"

更多的人可能会遇到这种情况,因为 rails 2.3.6+ 似乎将 Cache-Control 设置为 no-store 而早期版本没有。

于 2010-05-28T03:50:39.230 回答
1

我将我的问题归结为 prawnto 的 compile_support.rb 文件。

  # added to make ie happy with ssl pdf's (per naisayer)
  def ssl_request?
    @controller.request.env['SERVER_PROTOCOL'].downcase == "https"
  end

我们看到 apache 的 SERVER_PROTCOL 环境变量总是设置为 HTTP/1.1,即使使用 https 也是如此。什么时候需要 ssl_?是假的,它是来自 ie prawnto 的请求,将设置 Pragma="no-cache"。这就是造成我们问题的原因。

如果您的应用仅使用 https,您可以将此函数更改为始终返回 true。如果这还不够,您可以编写一个 apache 指令,如下所示:

SetEnv SERVER_PROTOCOL "https"

我把它放在我的 ssl.conf 文件中,现在一切都按预期工作。

于 2010-11-19T06:43:55.003 回答
0

作为临时解决方案,我使用了此处记录的方法:http: //chelsearobb.wordpress.com/2009/09/09/saving-a-prawn-pdf-to-file/并在本地保存文件,使用 send_data 和a File.read,然后删除似乎在所有浏览器中都可以正常工作的文件。

我仍然很好奇为什么它以前不能在 IE7 中工作。

于 2009-10-15T19:10:21.903 回答