Почему 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-тип в mymime_types.rb
инициализатор сMime::Type.register_alias "application/pdf", :pdf
- добавил
config.threadsafe!
toconfig/environments/development.rb
для нескольких потоков, поэтому конвейер активов не конфликтует с PDF engine - проверен
wkhtmltopdf http://www.google.com google.pdf
и он сгенерировал PDF-файл главной страницы Google, как и ожидалось - попробовал поменять PDFKit на wicked_pdf и столкнулся с той же проблемой (зависание, но когда процесс Rails убит, PDF отображается, как ожидалось)
как это выглядит
это обычная html-страница, отображаемая Rails (я размыл детали клиента):
это вывод CLI по рельсам, когда я пытаюсь перейти к localhost:3000/some/path.pdf
. (приложение зависает в ожидании ответа):
когда я, наконец, убью процесс Rails с ctrl-c
PDF, наконец, появляется в браузере, как я ожидал увидеть его (CSS и HTML отображаются правильно, поэтому активы, похоже, загружаются нормально):
Выводы Так Далеко!--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
цитаты:
попробуйте последнюю версию. Простой способ установки на 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, не работала для меня. Вместо этого мне нужно было объединить несколько предложений, в том числе некоторые из них, найденные в этом посте.
решение:
brew uninstall wkhtmltopdf
- найти и удалить любые копии
wkhtmltopdf
на/usr/bin
- комментарий
WickedPdf.config
в строкеconfig/initializers
- добавить
config.threadsafe!
todevelopment.rb
- удалить промежуточное программное обеспечение и разрешить "показать" действие главного контроллера для обработки pdf-запросов (может не потребоваться)
- добавить
wkhtmltopdf-binary
в gemfile - bundle
- перезагрузка сервера
- вам также может потребоваться добавить
Mime::Type.register_alias "application/pdf", :pdf
toconfig/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