2011-12-28 7 views
11

Tworzę plik pdf w najnowszej wersji biblioteki Prawn (v1.0.1rc) w Railsach (3.1.1) i kiedy uruchamiam mój kod to generuje plik PDF w katalogu głównym aplikacji.Nie można renderować pliku PDF do przeglądarki za pomocą Prawn PDF dla Ruby on Rails

Nie chcę tego. Chcę, aby renderował dane wyjściowe w oknie przeglądarki użytkownika, nie zapisując go lokalnie na serwerze.

Proszę mi powiedzieć, jak mogę to osiągnąć. Tutaj są moje pliki:

views/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") 

%> 

kontrolery/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 

Odpowiedz

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 

ja używałem prawnto gem przed Rails 3.1, ale to nie działa bez odrobiny hacking już. Jest to znacznie czystszy sposób tworzenia i wyświetlania obiektu PDF w wersji 3.1 poprzez bezpośredni dostęp do krewetki.

Mam tę technikę prosto z jednego z Railscasts Ryana Batesa. Używam go od tego czasu. Możesz wyświetlić ten konkretny odcinek here. Bardziej szczegółowo omawia podklasy Prawn i przeniesienia kodu generującego PDF z kontrolera. Pokazuje również wiele przydatnych metod Prawn, aby zacząć. Wysoce polecany.

Wiele odcinków jest darmowych, ale ten poprawiony odcinek Prawn jest jednym z tych, które są dostępne tylko w płatnym abonamencie. Przy 9 USD miesięcznie subskrypcja szybko się opłaca.

+0

Thanks Vickash. To z pewnością zadziałało i zgadzam się na punkt subskrypcji - naprawdę warto! – Betjamin

+0

Czy istnieje sposób, aby to zrobić w sposób dorozumiany? – 0112

1

Uważam, że najlepszym sposobem wysłania pliku PDF do przeglądarki klienta jest umieszczenie pobierania w łączu. Często po wygenerowaniu formularza musisz wygenerować plik PDF, ale musisz również przekierować na inną stronę.

Nie można przekierować i wysłać pdf jednocześnie, ale można przekierować, a następnie podać link do pobrania, tak:

Pierwszy dodać gem 'prawn' do gemfile. Pakiet. Następnie wykonaj następujące czynności:

link do swojego specjalnego działania drukarni w widoku

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

drogę do specjalnej akcji drukarni w trasach.rb

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

działania, które wysyła outputted plik (zmiana na swoje potrzeby):

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