在IE7中使用Pails生成Rails PDF

我正在使用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格式调用show动作,并使用正确命名的PDF进行响应。 当它被IE7命中时,它表示无法找到该文件或网站,并引用“invoices.pdf”而不是预期的customer_id_invoice.pdf文件名。

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

谢谢!

我也有这个问题。 当我尝试在Internet Explorer(7或8)上请求相同的PDF而不使用SSL时,它可以工作,但如果我使用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 

这个问题在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,而早期版本没有。

我将我的问题追溯到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 

我们看到即使使用https,apache的SERVER_PROTCOL env变量也始终设置为HTTP / 1.1。 什么时候ssl_required? 是假的,这是来自prawnto的请求将设置Pragma =“no-cache”。 这就是造成我们问题的原因。

如果您的应用仅使用https,则可以将此function更改为始终返回true。 如果这还不够,你可以写下一条apache指令:

SetEnv SERVER_PROTOCOL“https”

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

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

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