Почему PDFKit/wkhtmltopdf зависает, но визуализирует PDF как ожидалось, когда приложение Rails убито?
Фон
После прочтения мне показалось, что Prawn отсутствует и wkhtmltopdf. Это также похоже на PDFKit и wicked_pdf gems для Rails - новый классный. Поэтому я нашел screencast Ryan на как использовать PDFKit, Я установил все, протестировал wkhtmltopdf на CLI без проблем, возился с настройками Rails, чтобы запускать несколько процессов, так что конвейер активов работает, и все было хорошо, за исключением того, что я все еще застрял в самом конце процесса (фактически получая PDF файл ответ от сервера).
Вопрос
Когда я запрашиваю версию моего представления .pdf
(я использую опцию PDFKit Middleware), мой браузер просто сидит там, ожидая ответа, но как только я убью процесс Rails, я ожидал получить только PDF файл затем появляется в моем окне браузера. Что дает?
Что я использую
- ОС: OSX 10.8.1
- Rails: 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"
в мой файл application.rb
.
- включил
gem 'pdfkit'
в мой Gemfile и установил его с помощью Bundler
- установите mime-тип
.pdf
в моем инициализаторе mime_types.rb
с помощью Mime::Type.register_alias "application/pdf", :pdf
- добавлено
config.threadsafe!
в config/environments/development.rb
для нескольких потоков, поэтому конвейер ресурсов не конфликтует с движком PDF
- протестирован
wkhtmltopdf http://www.google.com google.pdf
, и он сгенерировал PDF файл главной страницы Google, как ожидалось
- попробовал обмен PDFKit для wicked_pdf и столкнулся с той же проблемой (зависание, но когда Rails-процесс был убит, PDF отображается как ожидалось)
Что это выглядит
Это обычная html-страница, созданная Rails (я размыл детали клиента):
![enter image description here]()
Это результат CLI, созданный Rails, когда я пытаюсь перейти к localhost:3000/some/path.pdf
. (приложение висит во время ожидания ответа):
![enter image description here]()
Когда я окончательно уничтожу процесс Rails с помощью ctrl-c
, PDF, наконец, появится в браузере, как я ожидал увидеть (CSS и HTML отображаются правильно, поэтому активы, похоже, загружаются нормально):
![enter image description here]()
Выводы до сих пор
Обмен PDFKit для wicked_pdf и получение тех же результатов, кажется, заставляет меня думать, что проблема не в этих библиотеках, а что-то с моей средой разработки. Но wkhtmltopdf отлично справляется с командной строкой, поэтому мне кажется, что он и QT выполняют свою работу. Проблема должна быть в Rails. Может быть, я не настраиваю что-то должным образом?
Обращение за помощью
Как определить, в чем проблема, и как ее исправить?
Я буду любить тебя, если ты поможешь мне < 3
Update
Я также попытался использовать альтернативный метод рендеринга PDF (с .to_pdf
) без опции промежуточного программного обеспечения, как описано ниже (делая это, я прокомментировал config.middleware.use "PDFKit::Middleware"
из моего файла application.rb
):
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
Ответы
Ответ 1
Проблема заключается в самом wkhtmltopdf, в частности, любой версии после 0.9.9. whtmltopdf зависает при запуске непосредственно из командной строки.
Шаги для исправления:
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
Цитирования:
Ответ 2
Простой способ для MacOS:
brew install Caskroom/cask/wkhtmltopdf
Ответ 3
Исправление scarver2 работало для меня как рекламируемое. Но мне нужна была более новая версия wkhtmltopdf
. Поскольку версия homebrew по-прежнему кажется устаревшей (она по-прежнему зависает в командной строке), и поскольку нет доступного недавно прекомпилированного двоичного файла, я сам использовал команду os x build script:
$ git clone [email protected]: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
. Все идет нормально.
Ответ 4
У меня такая же проблема. Он работает, когда я добавил: "config.threadsafe!" в application.rb как ответ в стек. Надеюсь на эту помощь.
Ответ 5
Точные же симптомы, но с использованием WickedPdf
в настоящее время. На данный момент я считаю, что проблема заключается и в wkhtmltopdf
.
К сожалению, ни одна из рекомендаций, которые мне удалось найти в Stack/Google, не работала для меня. Вместо этого мне нужно было объединить несколько предложений, в том числе некоторые, найденные в этом сообщении.
Решение было:
-
brew uninstall wkhtmltopdf
- найти и удалить любые копии
wkhtmltopdf
в /usr/bin
- комментарий
WickedPdf.config
строка в config/initializers
- добавить
config.threadsafe!
в development.rb
- удалить промежуточное программное обеспечение и разрешить "показывать" действие основного контроллера для обработки запросов в формате PDF (может и не понадобиться).
- добавить
wkhtmltopdf-binary
в gemfile
- расслоение
- сервер перезагрузки
- Вам также может потребоваться добавить
Mime::Type.register_alias "application/pdf", :pdf
в config/initializers/mime_types.rb
(для меня это вызывает "предупреждение: уже инициализированный постоянный PDF" )
Моя настройка: Mac OSX Mountain Lion с Rails 3.2.1, Webrick, Postgres и wkhtmltopdf-binary (0.9.9.1).
Ответ 6
Шахта также висела и открывала значок wkhtmltopdf в доке.
Я действительно нашел проблему для меня, у меня был только один рабочий процесс единорога. Как только я добавил более 1, он работал нормально.
Я запускаю wkhtmltopdf 0.9.9 на OS X с pdfkit 0.6.2
Ответ 7
Попробуйте отредактировать 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