11

我有一个使用Recurly的 rails 应用程序。我正在尝试下载 PDF 并在浏览器中呈现它。我目前有一个链接:

link_to 'Download', get_invoice_path(:number => invoice.invoice_number)

关联的控制器具有如下get_invoice所示的方法:

def get_invoice
    begin
      @pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
    rescue Recurly::Resource::NotFound => e
      flash[:error] = 'Invoice not found.'
    end
  end

当我单击链接时,我会在控制台中以二进制形式呈现 PDF。如何使它在浏览器中呈现 PDF?

4

2 回答 2

16

您不会将 PDF 呈现给浏览器,而是将其作为文件发送。像这样:

# GET /something/:id[.type]
def show
  # .. set @pdf variable
  respond_to do |format|
    format.html { # html page }
    format.pdf do
      send_file(@pdf, filename: 'my-awesome-pdf.pdf', type: 'application/pdf')
    end
  end
end

如果您不支持多种格式,则不需要 HTML 响应。

如果您想在浏览器中显示 PDF 而不是开始下载,请添加disposition: :inlinesend_file调用中。

于 2014-11-05T22:51:13.020 回答
12

假设 PDF 保存在内存中,使用 将send_data数据流发送回浏览器。

def get_invoice
  @pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
  send_data @pdf, filename: "#{params[:number]}.pdf", type: :pdf
end

如果文件存储在某处(但这似乎不是您的情况),请使用send_file.

于 2014-11-05T22:51:00.113 回答