Почему PDFKit / wkhtmltopdf зависает, но отображает PDF, как ожидалось, когда приложение Rails убито?

фон

после прочтения мне показалось, что креветки и wkhtmltopdf в. Это также похоже на PDFKit и wicked_pdf камни на рельсы новых классных. Поэтому я нашел скринкаст Райна on как использовать PDFKit. Я установил все, протестировал wkhtmltopdf на CLI без проблем, возился с настройками Rails для запуска нескольких процессов, поэтому конвейер активов работает, и все казалось хорошим, за исключением того, что я все еще застрял в самом конце процесса (фактически получая ответ PDF от сервера).

вопрос

когда я прошу .pdf версия моего представления (я использую опцию Pdfkit Middleware) мой браузер просто сидит там, ожидая ответа, но как только я убью Rails процесс PDF, который я ожидал получить, только тогда появится в окне моего браузера. Что происходит?

что Я использую

  • OS: OSX 10.8.1
  • рельсы: 3.2.8
  • Ruby: 1.9.3
  • wkhtmltopdf: 0.11.0_rc1 (хотя при запуске wkhtmltopdf -V Он говорит, 0.10.0_rc2)
  • qt: 4.8.2

что я сделал

  • использовал промежуточное ПО PDFKit, загрузив config.middleware.use "PDFKit::Middleware" в своем .
  • входит gem 'pdfkit' в моем Gemfile и установил его с Bundler
  • установить .pdf MIME-тип в my mime_types.rb инициализатор с Mime::Type.register_alias "application/pdf", :pdf
  • добавил config.threadsafe! to config/environments/development.rb для нескольких потоков, поэтому конвейер активов не конфликтует с PDF engine
  • проверен wkhtmltopdf http://www.google.com google.pdf и он сгенерировал PDF-файл главной страницы Google, как и ожидалось
  • попробовал поменять PDFKit на wicked_pdf и столкнулся с той же проблемой (зависание, но когда процесс Rails убит, PDF отображается, как ожидалось)

как это выглядит

это обычная html-страница, отображаемая Rails (я размыл детали клиента): enter image description here

это вывод CLI по рельсам, когда я пытаюсь перейти к localhost:3000/some/path.pdf. (приложение зависает в ожидании ответа): enter image description here

когда я, наконец, убью процесс Rails с ctrl-c PDF, наконец, появляется в браузере, как я ожидал увидеть его (CSS и HTML отображаются правильно, поэтому активы, похоже, загружаются нормально): enter image description here

Выводы Так Далеко!--18-->

замена PDFKit на wicked_pdf и получение тех же результатов, похоже, заставляют меня думать, что проблема не в этих библиотеках, а в моей среде разработки. Но wkhtmltopdf отлично работает в командной строке, поэтому я думаю, что он и QT делают свою работу. Проблема должна быть в рельсах. Может, я что-то неправильно настраиваю?

просьба о помощи

как определить что именно проблема и как мне это исправить?

Я буду любить вас, если вы можете мне помочь

обновление

Я также попытался использовать альтернативный метод рендеринга PDF (с .to_pdf) без опции промежуточного по следующим образом (делая это, я прокомментировал config.middleware.use "PDFKit::Middleware" от меня ):

respond_to do |format|
    format.html
    format.pdf do
        html = '<html><body>This is a test.</body></html>'
        @pdf = PDFKit.new(html)

        send_data @pdf.to_pdf, 
            :filename => 'whatever.pdf', 
            :type => 'application/pdf', 
            :disposition => 'attachment'
    end
end

7 ответов


проблема заключается в самой wkhtmltopdf, в частности, в любой версии после 0.9.9. wkhtmltopdf зависает при запуске непосредственно из командной строки.

действия для исправления:

brew uninstall wkhtmltopdf
cd /usr/local/Library/Formula/
git checkout 6e2d550 /usr/local/Library/Formula/wkhtmltopdf.rb
brew install wkhtmltopdf

затем убедитесь, что установлена правильная версия wkhtmltopdf --version что должно принести wkhtmltopdf 0.9.9

цитаты:

  1. https://github.com/mileszs/wicked_pdf/issues/110
  2. http://wearepandr.com/blog/article/homebrew-and-installing-old-package-versions#blog_nav

попробуйте последнюю версию. Простой способ установки на MacOS:

brew install Caskroom/cask/wkhtmltopdf

исправления scarver2 работал на меня, как рекламируется. Но мне нужна была более свежая версия wkhtmltopdf. Поскольку версия homebrew все еще кажется устаревшей (она все еще висит в командной строке), и поскольку нет недавнего предварительно скомпилированного двоичного файла, я использовал сценарий сборки os x для компиляции:

$ git clone git@github.com:wkhtmltopdf/wkhtmltopdf.git
$ cd wkhtmltopdf
$ ./build_osx.sh     # i'm running 10.9.2
$ bin/wkhtmltopdf --version                                                                                  
Name:
  wkhtmltopdf 0.12.1-72a9f2066fe9ffd162dec007a4d9b6a5cd63b670
$ curl www.example.com | bin/wkhtmltopdf - test.pdf  # render pdf of example.com
$ open test.pdf   # to confirm pdf 

Я использую pdfkit 0.6.2 С Rails 3.2.17. Я поместил двоичный файл в /vendor и pdfkit инициализатор, указал на него с config.wkhtmltopdf. Пока все идет хорошо.


У меня такая же проблема. Он работает, когда я добавил: 'config.многопотоковое исполнение!' в применении.rb как ответ в стек. Надеюсь, это поможет.


Мой также висел и открывал значок wkhtmltopdf в доке.

Я действительно нашел проблему для меня, у меня был только 1 рабочий процесс unicorn. Как только я добавил более 1, он работал нормально.

Я запускаю wkhtmltopdf 0.9.9 на OS X с pdfkit 0.6.2


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

к сожалению, ни одна из рекомендаций, которые я смог найти в Stack / Google, не работала для меня. Вместо этого мне нужно было объединить несколько предложений, в том числе некоторые из них, найденные в этом посте.

решение:

  1. brew uninstall wkhtmltopdf
  2. найти и удалить любые копии wkhtmltopdf на /usr/bin
  3. комментарий WickedPdf.config в строке config/initializers
  4. добавить config.threadsafe! to development.rb
  5. удалить промежуточное программное обеспечение и разрешить "показать" действие главного контроллера для обработки pdf-запросов (может не потребоваться)
  6. добавить wkhtmltopdf-binary в gemfile
  7. bundle
  8. перезагрузка сервера
  9. вам также может потребоваться добавить Mime::Type.register_alias "application/pdf", :pdf to config/initializers/mime_types.rb (для меня, это вызывает 'предупреждение: уже инициализированная константа PDF')

моя настройка была: Mac OSX Горный лев с рельсами 3.2.1, Webrick, Postgres и wkhtmltopdf-binary (0.9.9.1).


попробуйте изменить config/initializer/pdfkit.rb следующим образом:

PDFKit.configure do |config|

config.wkhtmltopdf = Rails.root.join('bin', 'wkhtmltopdf-i386').to_s

config.default_options = {

  :encoding=>"UTF-8",
  :page_size=>"A4",
  :margin_top=>"0.25in",
  :margin_right=>"0.1in",
  :margin_bottom=>"0.25in",
  :margin_left=>"0.1in",
  :disable_smart_shrinking=> false
}
end