4

我正在使用 PDFKit 中间件来呈现 PDF。这是它的作用:

  • 检查对应用程序的传入请求。如果它们用于 PDF,请从应用程序中隐藏该事实,但准备修改响应。
  • 让应用呈现为 HTML
  • 在发送之前取回响应并将 HTML 转换为 PDF

一般来说,我想要那种行为。但是我有一种情况,我实际上需要我的应用程序根据请求 PDF 的事实来呈现不同的内容。

PDFKit 为我提供了一个标记来检测它是否计划呈现我的响应:它设置env["Rack-Middleware-PDFKit"]为 true。

但我需要告诉 Rails,基于那个标志,我希望它渲染show.pdf.haml. 我怎样才能做到这一点?

4

2 回答 2

5

设置 request.format 和响应标头

弄清楚了。根据Rails 源码request.format = 'pdf'将手动设置响应格式为 PDF。这意味着 Rails 将呈现例如show.pdf.haml.

但是,现在 PDFKit 不会将响应转换为实际的 PDF,因为Content-Type标题表明它已经是 PDF,而我们实际上只生成 HTML。所以我们还需要覆盖 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 回答