无法使用Prawn PDF for Ruby on Rails将PDF呈现给浏览器

时间:2011-12-28 16:10:44

标签: ruby-on-rails-3.1 prawn

我正在Rails(3.1.1)中的最新版本的Prawn库(v1.0.1rc)中创建一个pdf文件,当我运行我的代码时,它会将PDF生成到应用程序的根目录中。

我不想要这个。我希望它将输出呈现到用户的浏览器窗口中,而不是将其本地保存到服务器。

请告诉我如何实现这一目标。这是我的文件:

视图/富/ show.pdf.erb

<%=

require 'prawn'

pdf = Prawn::Document.new(:page_size => 'LETTER', :page_layout => :landscape, :margin => 50, :top_margin => 20, :bottom_margin => 50)

.....

render_file("foo.pdf")

%>

控制器/ foo_controller

class AuditsController < ApplicationController
  before_filter :authenticate_user!
  layout 'application'
  can_edit_on_the_spot
  respond_to :html, :xml, :js, :pdf

  def index
    @audits = Audit.all
    respond_with @audits
  end

  def show
    @audit = Audit.find(params[:id])
    respond_with @audit do |format|
      format.pdf { render :layour => false }
    end
  end

2 个答案:

答案 0 :(得分:20)

<强>的Gemfile

gem 'prawn'

<强> /config/initializers/mime_types.rb

Mime::Type.register "application/pdf", :pdf

<强> AuditsController

def show
  @audit = Audit.find(params[:id])
  respond_to do |format|
    format.html
    format.pdf do
      pdf = Prawn::Document.new
      pdf.text "This is an audit."
      # Use whatever prawn methods you need on the pdf object to generate the PDF file right here.

      send_data pdf.render, type: "application/pdf", disposition: "inline"
      # send_data renders the pdf on the client side rather than saving it on the server filesystem.
      # Inline disposition renders it in the browser rather than making it a file download.
    end
  end
end

我曾经在Rails 3.1之前使用prawnto gem,但它不再有任何黑客攻击而无法工作。这是一种更简洁的方法,通过直接访问Prawn来实例化和显示3.1中的PDF对象。

我直接从Ryan Bates和#39; Railscasts。从那以后一直在使用它。您可以查看该特定剧集here。他详细介绍了如何对Prawn进行子类化并将PDF生成代码移出控制器。还展示了许多有用的Prawn方法来帮助您入门。强烈推荐。

很多剧集都是免费的,但修订后的Prawn剧集只有付费订阅才能获得。但是,每月9美元,订阅很快就能收回成本。

答案 1 :(得分:1)

我发现将pdf发送到客户端浏览器的最佳方法是将下载链接到链接。通常,您需要在表单提交后生成pdf,但还需要重定向到另一个页面。

您无法同时重定向和发送pdf ,但您可以重定向然后提供下载链接,如下所示:

首先将gem 'prawn'添加到您的gemfile中。束。然后执行以下操作:

链接到您视图中的特殊打印操作

<%= link_to 'print ticket', print_ticket_path %>

路由到routes.rb中的特殊打印操作

match 'print_ticket', to: 'tickets#print_ticket'

发送输出文件的动作(根据您的需要进行更改):

  def print_ticket
    if session[:token]
      @pdf = generate_pdf(session[:token])
      send_data(@pdf, :filename => "output.pdf", :type => "application/pdf")
    end
  end

  private 
  def generate_pdf(token)
    Prawn::Document.new do
        formatted_text [ { :text=>"xxx.org", :styles => [:bold], :size => 30 } ]
        move_down 20
        text "Please proceed to the following web address:" 
        move_down 20
        text "http://xxx.org/finder"
        move_down 20
        text "and enter this code:"
        move_down 20
        formatted_text [ { :text=>token, :styles => [:bold], :size => 20 } ]
    end.render 
  end