Невозможно отобразить PDF в браузере, используя Prawn PDF для Ruby on Rails - PullRequest
12 голосов
/ 28 декабря 2011

Я создаю файл 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

Ответы [ 2 ]

20 голосов
/ 31 декабря 2011

Gemfile

gem 'prawn'

/ конфигурации / Инициализаторы / 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.

Я получил эту технику прямо от одного из Railscasts Райана Бейтса . С тех пор пользуюсь им. Вы можете просмотреть этот конкретный эпизод здесь . Он более подробно рассказывает о создании подклассов Prawn и перемещении кода, генерирующего PDF, из контроллера. Также показывает много полезных методов Prawn, чтобы вы начали. Настоятельно рекомендуется.

Многие эпизоды бесплатны, но этот пересмотренный эпизод «Креветки» является одним из тех, которые доступны только по платной подписке. При цене $ 9 в месяц подписка быстро окупается.

1 голос
/ 27 мая 2013

Я считаю, что лучший способ отправить pdf в браузер клиента - поместить ссылку в ссылку для загрузки. Часто вам нужно создать PDF после отправки формы, но также необходимо перенаправить на другую страницу.

Вы не можете перенаправить и отправить pdf одновременно , но вы можете перенаправить и затем предоставить ссылку для скачивания, например:

Сначала добавьте gem 'prawn' в свой гемфайл. 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 
...