2011-12-28 1 views
11

Я создаю pdf-файл в последней версии библиотеки Prawn (v1.0.1rc) в Rails (3.1.1), а когда я запускаю свой код, генерирует PDF в корень приложения.Невозможно отрисовать PDF в браузере с помощью Prawn PDF для Ruby on Rails

Я не хочу этого. Я хочу, чтобы он выводил результат в окно браузера пользователя, не сохраняя его локально на сервере.

Пожалуйста, расскажите мне, как я могу это достичь. Вот мои файлы:

просмотров/Foo/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 

ответ

19

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 

Я использовал, чтобы использовать prawnto камень, прежде чем Rails 3.1, но он не работает без толики взлома больше. Это гораздо более простой способ создать экземпляр и показать объект PDF в 3.1, напрямую обратившись к Prawn.

Я получил эту технику прямо от одного из Райан Бэйтс Railscasts. Я использовал его с тех пор. Вы можете просмотреть этот эпизод here. Он более подробно рассказывает о подклассификации креветок и перемещении кода генерации PDF из контроллера. Также показано много полезных методов Креветки, чтобы вы начали. Настоятельно рекомендуется.

Многие эпизоды бесплатны, но этот пересмотренный эпизод «Креветка» является одним из тех, которые доступны только с платной подпиской. При цене $ 9 в месяц подписка быстро окупается.

+0

Спасибо Vickash. Это, безусловно, сработало, и я согласен с подпиской - ну стоит! – Betjamin

+0

Есть ли способ сделать это неявно? – 0112

1

Я нахожу, что лучший способ отправить PDF в браузер клиента - это установить загрузку в ссылку. Часто вам нужно создать pdf-файл после отправки формы, но также необходимо перенаправить на другую страницу.

Вы не можете перенаправить и отправить PDF одновременно, но вы можете перенаправить, а затем предоставить ссылку для загрузки, например, так:

Сначала добавьте gem 'prawn' к вашему Gemfile. Bundle. Затем выполните следующие действия:

Ссылка на ваш спецоперацию печати на ваш взгляд

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

маршрут к специальной акции печати в маршрутах.Р.Б.

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