Невозможно отобразить PDF в браузере с помощью Prawn PDF для Ruby on Rails
Я создаю pdf файл в последней версии библиотеки Prawn (v1.0.1rc) в Rails (3.1.1), и когда я запускаю свой код, он генерирует PDF в корень приложения.
Я не хочу этого. Я хочу, чтобы он выводил вывод в окно браузера пользователя, не сохраняя его локально на сервере.
Скажите, пожалуйста, как я могу это достичь. Вот мои файлы:
вид /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
Ответы
Ответ 1
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.
Я получил эту технику прямо из одного из Ryan Bates Railscasts. Я использовал его с тех пор. Вы можете просмотреть этот конкретный эпизод здесь. Он более подробно рассказывает о подклассификации креветок и перемещении кода генерации PDF из контроллера. Также показано много полезных методов Креветки, чтобы вы начали. Очень рекомендуется.
Многие эпизоды бесплатны, но этот пересмотренный эпизод "Креветка" является одним из тех, которые доступны только с платной подпиской. При цене $9 в месяц подписка быстро окупается.
Ответ 2
Я нахожу, что лучший способ отправить PDF в клиентский браузер - это перевести загрузку в ссылку. Часто вам нужно создать pdf файл после отправки формы, но также необходимо перенаправить на другую страницу.
Вы не можете перенаправить и отправить PDF одновременно, но вы можете перенаправить и затем предоставить ссылку для загрузки, например:
Сначала добавьте gem 'prawn'
в свой gemfile. Bundle. Затем выполните следующие действия:
Ссылка на ваше специальное действие печати в вашем представлении
<%= link_to 'print ticket', print_ticket_path %>
маршрут к специальному действию печати в route.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