2

私は Prawn と Prawnto を使用して Ruby on Rails アプリ (Rails バージョン 2.2.2) で PDF を生成しています。

問題は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 では、これは期待どおりに機能し、リンクがクリックされると、show アクションが .pdf の形式で呼び出され、正しい名前の PDF で応答します。IE7 でヒットすると、ファイルまたは Web サイトが見つからないと表示され、予期される customer_id_invoice.pdf ファイル名の代わりに「invoices.pdf」が参照されます。

何がこの動作を引き起こしている可能性がありますか?

ありがとう!

4

4 に答える 4

4

私もこの問題を抱えています。Internet Explorer(7または8)でSSLなしで同じPDFをリクエストしようとすると機能しますが、SSLでリクエストすると機能しません...

これは、IE が PDF をダウンロードするときに予期するヘッダーにまで及んでいる可能性があります。prawnto ソース コードをチェックして、どのヘッダーが設定されているかを確認していませんが、Rack ミドルウェアを使用して、必要なヘッダーを挿入する可能性があります。

# 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

https を使用している場合でも、Apache の SERVER_PROTCOL 環境変数が常に HTTP/1.1 に設定されていることがわかりました。いつssl_required? false であり、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 に答える