Rails PDF Generation with Prawn in IE7

后端 未结 4 947
遇见更好的自我
遇见更好的自我 2021-01-01 07:55

I\'m using Prawn and Prawnto to generate a PDF in a Ruby on Rails app (Rails version 2.2.2) which works great and generates PDFs happily and sends them to the user to downlo

相关标签:
4条回答
  • 2021-01-01 08:08

    I chased my issue down to prawnto's compile_support.rb file.

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

    We were seeing that apache's SERVER_PROTCOL env variable was always set to HTTP/1.1 even when using https. When ssl_required? is false and it's a request from ie prawnto will set Pragma="no-cache". This is what was causing our issues.

    If your app only uses https you can change this function to always return true. If this isn't enough you can write an apache directive along the lines of:

    SetEnv SERVER_PROTOCOL "https"

    I put this right in my ssl.conf file and everything now works as expected.

    0 讨论(0)
  • 2021-01-01 08:14

    As an interim solution, I used the approach documented here: http://chelsearobb.wordpress.com/2009/09/09/saving-a-prawn-pdf-to-file/ and just save the file locally, use send_data and a File.read, and then delete the file which seems to work fine in all browsers.

    I'm still curious as to why it wouldn't work in IE7 previously though.

    0 讨论(0)
  • 2021-01-01 08:21

    I'm having this problem as well. When I try to request the same PDF without SSL on Internet Explorer (7 or 8) it works, but if I request it with SSL, it doesn't work...

    We think we may have tracked this down to headers that IE is expecting when downloading a PDF. I haven't checked the prawnto source code to see what headers it set, but we are likely going to use some Rack Middleware to inject the headers we need:

    # 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
    

    So I tried this, thought it would work, then found that indeed it still didn't work.

    So I ended up doing this, for whatever reason, this worked for me:

    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
    
    0 讨论(0)
  • 2021-01-01 08:22

    This ie issue is explained in http://support.microsoft.com/kb/323308

    The solution is to set your Cache-Control header to something other than no-store with something like:

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

    More people are likely to run into this as rails 2.3.6+ seems to set Cache-Control to no-store where earlier versions didn't.

    0 讨论(0)
提交回复
热议问题