4

PDFKit ミドルウェアを使用して PDF をレンダリングしています。これが何をするかです:

  • アプリへの着信要求を検査します。PDF の場合は、その事実をアプリから隠しますが、応答を変更する準備をします。
  • アプリを HTML としてレンダリングする
  • 応答を取得し、HTML を PDF に変換してから送信します

一般的に、私はその動作が必要です。しかし、PDF が要求されたという事実に基づいて、別のコンテンツをレンダリングするためにアプリが実際に必要なケースが 1 つあります。

PDFKit は、応答のレンダリングを計画していることを検出するためのマーカーを提供します。これはenv["Rack-Middleware-PDFKit"]true に設定されます。

しかし、Rails に、そのフラグに基づいて render したいことを伝える必要がありますshow.pdf.haml。どうやってやるの?

4

2 に答える 2

5

request.format と response ヘッダーを設定する

理解した。Rails sourceによるとrequest.format = 'pdf'、応答形式を手動で PDF に設定します。これは、たとえば .Rails がレンダリングすることを意味しますshow.pdf.haml

Content-Typeただし、実際には HTML のみを生成しているのに、ヘッダーには既に PDF であると示されているため、PDFKit は応答を実際の PDF に変換しません。そのため、Rails の応答ヘッダーをオーバーライドして、まだ HTML であることを示す必要もあります。

このコントローラ メソッドはそれを処理します。

# By default, when PDF format is requested, PDFKit's middleware asks the app
# to respond with HTML. If we actually need to generate different HTML based
# on the fact that a PDF was requested, this method reverts us back to the
# normal Rails `respond_to` for PDF.
def use_pdf_specific_template
  return unless env['Rack-Middleware-PDFKit']

  # Tell the controller that the request is for PDF so it 
  # will use a PDF-specific template
  request.format = 'pdf'
  # Tell PDFKit that the response is HTML so it will convert to PDF
  response.headers['Content-Type'] = 'text/html'
end

つまり、コントローラーのアクションは次のようになります。

def show
  @invoice = Finance::Invoice.get!(params[:id])

  # Only call this if PDF responses should not use the same templates as HTML
  use_pdf_specific_template

  respond_to do |format|
    format.html
    format.pdf
  end
end
于 2012-06-28T18:18:26.103 に答える
1

ミドルウェアなしでPDFKitを使用することもできます。

于 2012-12-30T21:57:09.597 に答える