2011-09-21 27 views
28

Rozglądałem się po Internecie, ale nie potrafię znaleźć sposobu wyświetlenia pliku PDF w szynach (mogę tylko znaleźć informacje o tym, jak je utworzyć).Jak wyświetlić plik PDF w ROR (Ruby)?

Czy ktoś wie jaki kod/klejnot muszę go wyświetlić?

+0

Użyj [prawn] (https://github.com/sandal/prawn) to rodzaj de facto standardu. – lucapette

Odpowiedz

47

W kontrolerze:

def pdf 
    pdf_filename = File.join(Rails.root, "tmp/my_document.pdf") 
    send_file(pdf_filename, :filename => "your_document.pdf", :type => "application/pdf") 
end 

W config/environment/production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 

lub

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 

Modyfikacja config jest wymagane, ponieważ pozwala serwerowi aby wysłać Plik direc z dysku, co daje miły wzrost wydajności.

Aktualizacja

Jeśli chcesz wyświetlić go zamiast pobraniem, należy wybrać opcję :disposition z send_file:

send_file(pdf_filename, :filename => "your_document.pdf", :disposition => 'inline', :type => "application/pdf") 

Jeśli chcesz wyświetlić go inline, this question będzie znacznie bardziej kompletne że kiedykolwiek mógłbym być.

+0

Hej, to są świetne rzeczy. W zakresie wysyłania pdf do użytkownika. Ale co z wyświetlaniem go na stronie internetowej przed wysłaniem? :) – Doomsknight

+5

Zaktualizowałem moją odpowiedź. –

+0

Wygląda na to, że moja odpowiedź Cię nie zadowala. Czy możesz mi powiedzieć, dlaczego? –

1
def pdf 
    pdf_content = ...# create the pdf 
    send_data(pdf_content, :filename => "test.pdf", :type => "application/pdf") 
end 
+0

Witam, to wygląda obiecująco, ale co, jeśli po prostu chcę załadować i wyświetlić z pliku. To znaczy. Nie mam żadnej zmiennej pdf_content. – Doomsknight

+0

W takim przypadku spójrz na rozwiązanie Benoit. – Matt

3

W zależności od tego, skąd pochodzi plik PDF, mogą Ci się przydać poniższe wskazówki. Mam aplikację, w której przechowuję wiele rzeczy, a niektóre z nich mają (dodatkowe) pliki PDF połączone z przedmiotami. Przechowuję pozycje w katalogu /public/res/<item_id>/. res oznacza wynik, a item_id to numeryczny identyfikator tego elementu w Railsach.

W widoku, I podać link do PDF za pomocą następującego kodu (pseudo) jako metody pomocnika, który może być użyty w widoku:

def file_link(key, name = nil) 
    res= Ressource.find(:first, :conditions => ["key = ?", key]) 
    list = Dir["public/res/#{res.id}/*"] 
    file= list.empty? ? "" : list[0] 
    return file if file.empty? 
    fn = name ? name : File.basename(file) 
    link_to fn, "/res/#{res.id}/#{File.basename(file)}", :popup => true 
end 

Właściwa część Oto link_to name, "/res/#{res.id}/#{File.basename(file)}" rzecz.

+0

Dwie rzeczy do zapamiętania na temat rozwiązania: 1/możesz wyświetlać tylko pliki znajdujące się w folderze 'public'. 2/Nie można zmienić nazwy pliku w oknie dialogowym zapisywania przeglądarki. –

+0

To prawda, ale czasami wystarczające. Jest to proste rozwiązanie, wiem :-) – mliebelt

+1

Masz całkowitą rację, chciałem tylko wskazać ograniczenia, które mogą (lub nie ;-)) być wyłącznikami. –

2

To może być zbyt proste, ale miałem problem ze znalezieniem prostej odpowiedzi na mój problem, więc zamieszczam go tutaj. Naprawdę nie chciałem dodawać do kontrolera kolejnej akcji, aby pobrać plik statyczny.

Właśnie przesłałem plik do S3 & użyłem odnośnika do określenia ścieżki, którą zapewnia S3 po przesłaniu pliku i ustawieniu uprawnień (pamiętaj, że każdy musi mieć możliwość przesłania i pobrania). Przechowuję wiele danych dla aplikacji na S3, więc wydawało mi się, że to dobry wybór.

<%= link_to "speaker registration form", "https://s3.amazonaws.com/gws_documents/speaker_registration.pdf" %> 
4

Zasadniczo wystarczy napisać go w html w widoku. Więc to proste rozwiązanie pracował dla mnie:

W „show.hmtl.erb”

<iframe src=<%= @certificate.certificate_pdf %> width="600" height="780" style="border: none;"> </iframe> 

tylko wprowadzenie lokalizację pliku w osadzonej rubin jako źródło iframe tag pracował dla mnie po wiele godzin wyszukiwania. "certyfikat" to mój model, a "certificate_pdf" to mój plik załącznika.