pdfkit не стилизует pdf

У меня есть приложение rails 3.1, которое создает pdf-документы с помощью pdfkit, и все работает, как указано, за исключением того факта, что сгенерированные pdf-файлы не имеют стилей. Я предполагаю, что wkhtmltopdf не имеет доступа к моим таблицам стилей и что это не более серьезная проблема. Кто-нибудь знает, как разрешить доступ к этим таблицам стилей? Я в основном следил за railscast # 220 по этому вопросу, однако мне пришлось создать новый инициализатор, чтобы заставить pdfkit работать с rails 3.1.

Это инициализатор, который мне пришлось использовать, чтобы заставить pdfkit работать с рельсами 3.1.

ActionController::Base.asset_host = Proc.new { |source, request|
  if request.env["REQUEST_PATH"].include? ".pdf"
    "file://#{Rails.root.join('public')}"
  else
    "#{request.protocol}#{request.host_with_port}"
  end
 } 

Ссылка на pdf выглядит так:

<%= link_to 'Download PDF', load_path(@load, :format => "pdf") %>

Это даст мне ссылку на PDF-файл без стиля.

В моем application.rb я настроил pdfkit как таковой:

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

Я также добавил это в свой файл layouts/application.html.erb:

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

person tomciopp    schedule 08.11.2011    source источник
comment
Я добавил еще немного кода, если вам нужна визуальная или любая другая информация, я буду рад помочь.   -  person tomciopp    schedule 08.11.2011
comment
У меня такая же проблема. Использование Rails 3.1 и конвейера ресурсов делает все вышеперечисленные инициализаторы и хаки бесполезными. Не могу найти способ обойти это.   -  person Nuby    schedule 22.11.2011
comment
Вы уверены, что указано :media => "all"? Я был удивлен, увидев, что по умолчанию используется только «экран». Еще один способ проверить: если вы попросите браузер распечатать, оформлена ли страница?   -  person Marc-André Lafortune    schedule 23.11.2011
comment
@tomciopp Ты разобрался с этим? уже несколько дней бьюсь с этим...   -  person Tony Tambe    schedule 06.10.2014
comment
На самом деле это не решение, а обходной путь, поскольку с тех пор, как об этом впервые сообщалось, прошли годы, и, возможно, они никогда не будут исправлены. Поместите свои стили в обычный файл представления, написанный как встроенный с тегами ‹style› — не один в кошмаре ресурсов-конвейера — просто файл в /views/layouts или аналогичный — затем визуализируйте его в заголовке файла макета, который вы используют для pdf.   -  person JosephK    schedule 24.04.2017


Ответы (6)


Кража нескольких строк из кода промежуточного ПО, найденного по адресу https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/middleware.rb

Ты можешь использовать:

root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')

Мой пример:

html = render_to_string #render current action to string
root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')
kit = PDFKit.new(html, :print_media_type => true)
person user2185938    schedule 12.08.2013
comment
Спасибо! Действительно полезно! - person NickGnd; 16.03.2016

Для меня это была проблема с установкой для Ubuntu. Я только что переустановил из исходников:

# first, installing dependencies
sudo aptitude install openssl build-essential xorg libssl-dev

# for 64bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-amd64.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2
mv wkhtmltopdf-amd64 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf

# for 32bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-i386.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-i386.tar.bz2
mv wkhtmltopdf-i386 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf

И теперь у меня все работает. Поэтому мой совет: не устанавливайте wkhtmltopdf с помощью этой команды sudo apt-get install wkhtmltopdf, а устанавливайте из исходников. Полные инструкции по процессу установки

person ka8725    schedule 18.04.2012

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

class DocumentController < ApplicationController

  def show
    @document = Document.last
    # ... implement your respond_to

    kit = PDFKit.new(@document.content, :page_size => 'Letter')
    kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf.css"
    send_data kit.to_pdf, :filename => "#{@document.title}.pdf", :type => 'application/pdf'
  end

end

теперь pdf.css должен быть css, поэтому теоретически, если вам нужно загрузить sass, загрузите его из предварительно скомпилированного public/assets/

person equivalent8    schedule 14.08.2012
comment
как мы загружаем файл scss из общедоступных/активов в среду разработки? - person prasad.surase; 02.04.2015
comment
Используйте Sass.compile(File.read(path_to_file)), затем сохраните файл .css и передайте путь к экземпляру PDFKit. - person hlcs; 22.06.2017

Я тоже столкнулся с этой проблемой, и оказалось, что когда конвейер ресурсов был добавлен в Rails 3.1, у pdfkit возникла проблема со ссылками на таблицы стилей. См. ошибку GitHub об этой проблеме.

В итоге я перешел на wicked_pdf и очень доволен этим. Они решили эту проблему, и она прекрасно работает на Rails 3.2.x (не пробовал 3.1.x).

person Community    schedule 22.02.2012

Я использовал гем wicked_pdf и его помощники для включения CSS в страницы. Внутри эти помощники просто читают все файлы CSS и включают их в саму страницу. Так что, если вы предпочитаете использовать PdfKit, попробуйте выяснить, как включать невстроенные таблицы стилей.

person Mark Huk    schedule 08.11.2011

Я успешно запустил PDFKit на Rails 3.1. Однако я использовал другую настройку.

Сначала у меня была та же проблема, что и у вас, но это было потому, что stylesheet_link_tag по умолчанию установлено на media => "screen"; явное указание media => "all" исправило это.

person Marc-André Lafortune    schedule 22.11.2011
comment
Я указал media =› all в файле layouts/application.html.erb, так что это не должно быть проблемой. Можете ли вы подробнее рассказать о вашей другой настройке, чтобы я мог посмотреть, заставит ли это работать? Вы проверили, будет ли это работать в производственной среде, поскольку вы изменили только среду разработки? - person tomciopp; 24.11.2011
comment
@demondeac11: я видел, что вы указали это, но, может быть, вы используете другой макет? Вы проверили, будет ли оформлена просьба Chrome распечатать вашу страницу? Перейдите по ссылке на мою другую настройку. Настройки для производства будут зависеть от вашей среды, и, как правило, ваши ресурсы будут обслуживаться статически, возможно, из CDN или балансировщиков нагрузки и т. д. - person Marc-André Lafortune; 24.11.2011