Есть ли способ заставить задание на восстановление отправить сгенерированный PDF-файл прямо в браузер?
Мне нужна система, в которой PDF-файл генерируется динамически, асинхронно и напрямую передается в браузер. Дисковое хранилище недоступно. Приступить к использованию креветок, похоже, легко: нужно взять эти данные и отправить их в браузер, не сохраняя их где-то в первую очередь. Я ничего не могу найти в Интернете. Я думал о Фэй, но может ли Фэй отправить PDF-файл в браузер?
3 ответа
Вы можете использовать "PDFkit" для этого. пример кода
def some_action
...
respond_to do |format|
format.html
format.pdf do
generate_pdf(file.html.haml, :css => [array of css file names that need to be added])
end
end
end
в контроллере приложения -
def generate_pdf(template, options={})
html = render_to_string(template, :layout => false)
kit = PDFKit.new(html, :orientation => 'Landscape')
kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/default_css1.css"
kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/default_css2.css"
# Add CSS
if options[:css]
options[:css].each do |css|
kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/#{css}.css"
end
end
send_data(kit.to_pdf, :filename => 'latest.pdf', :type => 'application/pdf', :disposition => 'inline')
end
Насколько велики эти PDF-файлы? В вашей базе данных есть столбцы BLOB (если у вас нет хранилища, вы не используете SQLite...), и вы можете сохранить полученный PDF-файл в нем.
Или вы можете сохранить полученный PDF в Redis DB. Или сохраните его в S3.
С другой стороны, браузер будет время от времени опрашивать (с помощью ajax), чтобы узнать, завершен ли PDF, и как только он будет готов, он загрузит его и покажет пользователю.
Я делал это раньше в.net, где у меня есть атрибут src iframe, установленный на сервис, который возвращает поток. Сервис также переворачивает заголовок http на content-inline, чтобы браузер не пытался загрузить его, а вместо этого попытался сделать его встроенным. Если вы попытаетесь это сделать, это не сработает, если в браузере нет плагина pdf (должны быть у современных, но у вас всегда есть этот парень, использующий IE6). Я не знаю, что такое ruby, но думаю, что вы сможете сделать что-то подобное, или, по крайней мере, но iframe на странице, которая предназначена для службы, написанной в другом месте.