Rails PDF Generation with Prawn in IE7

后端 未结 4 951
遇见更好的自我
遇见更好的自我 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: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
    

提交回复
热议问题