2015-12-24 3 views
1

Мне нужно распечатать заказ в формате PDF. Я использую драгоценный камень pdfkit. Абсолютно измучен, но его просто не печатают какие-либо css.Rails 4 application no css при печати

application.html.erb:

<%= stylesheet_link_tag "application", :media => "all"%> 

order_controller.rb

respond_to do |format| 
    format.html 
    format.pdf { 
    html = render_to_string(:template => "show.html.erb") 
    kit = PDFKit.new(html) 
    kit.stylesheets << "http://localhost:3000/stylesheets/application.css" <-- hardcoded this 
    send_data(kit.to_pdf, :filename => "test_pdf", :type => "application/pdf", :disposition => 'attachment') 

    return 
    } 

конфигурации/инициализаторы/pdfkit.rb

PDFKit.configure do |config| 
    config.wkhtmltopdf = 'Gem/Path/to/wkhtmltopdf' 
    config.default_options = { 
    :page_size => 'Legal', 
    :print_media_type => true 
    } 
    # Use only if your external hostname is unavailable on the server. 
    config.root_url = "http://localhost" 
    config.verbose = false 
end 

application.rb

config.middleware.use "PDFKit::Middleware", :print_media_type => true 

mime_types.rb

Mime::Type.register 'application/pdf', :pdf 

Я просто перейти на страницу как http://localhost:3000/orders/4 и присоединять .pdf (как в Railscasts). http://localhost:3000/orders/4.pdf показывает pdf, но не css. То же самое с предварительным просмотром браузера.

Кто-нибудь знает, как я могу отладить это дальше?

ответ

1

Проблема в том, что вы пытаетесь загрузить таблицу стилей через HTTP. Однако для PDFKit требуется файл.

Это берется из исходного кода PDFKit:

def style_tag_for(stylesheet) 
    "<style>#{File.read(stylesheet)}</style>" 
    end 

См остальную часть кода по адресу:

https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/pdfkit.rb#L105

Мое предложение было бы попробовать изменить show.html.erb с добавлением :

<style> <%= Rails.application.assets['application.css'].to_s %> </style> 

Или загрузить его из файла. Измените код следующим образом:

temp = Tempfile.new("pdf_css_temp") 
temp.write(Rails.application.assets['application.css'].to_s) 
temp.close 
kit.stylesheets << temp.path 

other_controller.rb

respond_to do |format| 
    format.html 
    format.pdf { 
    html = render_to_string(:template => "show.html.erb") 
    kit = PDFKit.new(html) 
    temp = Tempfile.new("pdf_css_temp") 
    temp.write(Rails.application.assets['application.css'].to_s) 
    temp.close 
    kit.stylesheets << temp.path 
    send_data(kit.to_pdf, :filename => "test_pdf", :type => "application/pdf", :disposition => 'attachment') 
    temp.unlink 
    return 
    } 

Однако недостатком этого является то, что он будет писать временный файл каждый раз, когда Вы создаете PDF. В рабочей среде вы, вероятно, захотите решить эту проблему, используя статический файл, созданный рельсами.

+0

Так я должен изменить это: kit.stylesheets << "Http: // Localhost: 3000/таблиц стилей/application.css" к kit.stylesheets << "таблицы стилей/application.css" – user2511030

+0

Я обновил ответ, надеюсь, это поможет вам. – Meeh

+0

не работает. – user2511030

Смежные вопросы