Подтвердить что ты не робот

Почему 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
4b9b3361

Ответ 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