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ć?
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ć?
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ć.
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
Zaktualizowałem moją odpowiedź. –
Wygląda na to, że moja odpowiedź Cię nie zadowala. Czy możesz mi powiedzieć, dlaczego? –
def pdf
pdf_content = ...# create the pdf
send_data(pdf_content, :filename => "test.pdf", :type => "application/pdf")
end
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
W takim przypadku spójrz na rozwiązanie Benoit. – Matt
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.
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. –
To prawda, ale czasami wystarczające. Jest to proste rozwiązanie, wiem :-) – mliebelt
Masz całkowitą rację, chciałem tylko wskazać ograniczenia, które mogą (lub nie ;-)) być wyłącznikami. –
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" %>
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.
Użyj [prawn] (https://github.com/sandal/prawn) to rodzaj de facto standardu. – lucapette