PDFKit (wkhtmltopdf) Сломанная труба, OS X и Rails 3

Я использую PDFKit (который использует wkhtmltopdf) в попытке сделать представление в формате pdf в приложении Rails 3.

PDFKit отображает с Errno::EPIPE (Broken pipe), указывающим на send_data(kit.to_pdf, :filename => "generated.pdf", :type => 'application/pdf') в моем действии show show:

# Controller
def show
  respond_to do |format|
    format.html { render }
    format.pdf do
      html = render_to_string(:layout => false , :action => "show.html.haml")
      kit = PDFKit.new(html)
      send_data(kit.to_pdf, :filename => "invoice.pdf", :type => 'application/pdf')
      return # to avoid double render call
    end
  end
end

# Gemfile
...
gem 'pdfkit'
gem 'wkhtmltopdf'
...

Я знаю, что wkhtmltopdf не является источником этой ошибки, поскольку wkhtmltopdf public/404.html tmp/404.pdf из Rails.root работает как ожидалось.

Я использую пример из jonathanspies.com после того, как использование промежуточного программного обеспечения завершилось неудачно таким же образом.

# config/application.rb
require 'pdfkit'
config.middleware.use PDFKit::Middleware

Попробовав его в новом приложении Rails 3, я получаю следующую ошибку:

command failed: "~/.rvm/gems/[email protected]/bin/wkhtmltopdf" "--page-size" "Letter" "--margin-right" "0.75in" "--margin-top" "0.75in" "--margin-bottom" "0.75in" "--encoding" "UTF-8" "--margin-left" "0.75in" "--quiet" "-" "-"

Выполняется запуск команды вручную, а экран использования отображается, глядя на параметр --quiet. Легко видеть, что он должен быть --quit

Измените /lib/pdfkit/pdfkit.rb:35 на следующее, и все работает так, как ожидалось (с промежуточным программным обеспечением тоже).

args << '--quit'

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

Ответы

Ответ 1

Относительно изменения тихого аргумента для выхода.

Это изменение действует только в том случае, если вы используете жемчужину wkhtmltopdf, которая использует очень старую версию двоичного файла wkhtmltopdf.

С помощью wkhtmltopdf gem

10:32:15 wkhtml >     wkhtmltopdf --version
wkhtmltopdf 0.8.3 using wkhtmltopdf patched qt
Copyright (C) 2008,2009 Jakob Truelsen,
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jakob Truelsen
Patches by Mário Silva and Emmanuel Bouthenot

10:32:16 wkhtml >     wkhtmltopdf --help | grep quit
  -q, --quit                      Be less verbose.
10:32:16 wkhtml >     wkhtmltopdf --help | grep quite
10:32:19 wkhtml > 

В последнем бинарнике я установил

10:33:40 tmp > wkhtmltopdf --version
Name:
  wkhtmltopdf 0.9.9

License:
  Copyright (C) 2008,2009 Wkhtmltopdf Authors.



  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
  This is free software: you are free to change and redistribute it. There is NO
  WARRANTY, to the extent permitted by law.

Authors:
  Written by Jakob Truelsen. Patches by Mário Silva, Benoit Garret and Emmanuel
  Bouthenot.

10:33:50 tmp > wkhtmltopdf --help | grep quit
10:34:02 tmp > wkhtmltopdf --help | grep quiet
  -q, --quiet                         Be less verbose
10:34:07 tmp > 

Ошибка орфографии существует в старой двоичной версии, которая поставляется с жемчужиной wkhtmltopdf. Я предлагаю вам патч monkey patch pdfkit с инициализацией или чем-то, основанный на том, если вы включили жемчужину wkhtmltopdf или нет.

Я также принимаю запрос на перенос, который сделал pdfkit осведомленным о версии wkthtmltopdf, с которой он работал, и условно переключил этот аргумент.

Ответ 2

Измените /lib/pdfkit/pdfkit.rb: 35 на следующее, и все работает так, как ожидалось (с промежуточным программным обеспечением тоже).

args << '--quit'