Ruby on rails 生成带有图像的pdf时,PDFkit挂起

Ruby on rails 生成带有图像的pdf时,PDFkit挂起,ruby-on-rails,pdf,ruby-on-rails-4,wkhtmltopdf,pdfkit,Ruby On Rails,Pdf,Ruby On Rails 4,Wkhtmltopdf,Pdfkit,我想将网页呈现为PDF格式。它使用一个图像,我读到您需要为PDFkit提供绝对URL才能使用该图像,因此我的代码是: = image_tag image_url(user.avatar) 当以HTML形式查看时,它可以工作,并且PDFkit能够生成删除图像的PDF。但是,在使用映像时,它会一直挂起,直到我杀死服务器。我怎样才能让它工作 以下是我关闭服务器时的完整输出: 2013-12-04 13:53:36.576 wkhtmltopdf[27410:507] CoreText perform

我想将网页呈现为PDF格式。它使用一个图像,我读到您需要为PDFkit提供绝对URL才能使用该图像,因此我的代码是:

= image_tag image_url(user.avatar)
当以HTML形式查看时,它可以工作,并且PDFkit能够生成删除图像的PDF。但是,在使用映像时,它会一直挂起,直到我杀死服务器。我怎样才能让它工作

以下是我关闭服务器时的完整输出:

2013-12-04 13:53:36.576 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
2013-12-04 13:53:36.577 wkhtmltopdf[27410:507] CoreText performance note: Set a breakpoint on CTFontLogSuboptimalRequest to debug.
2013-12-04 13:53:36.582 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
2013-12-04 13:53:36.584 wkhtmltopdf[27410:507] CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT". For best performance, only use PostScript names when calling this API.
^C
RuntimeError - command failed: /usr/local/bin/wkhtmltopdf --page-size Legal --print-media-type --quiet - -:
  pdfkit (0.5.4) lib/pdfkit/pdfkit.rb:73:in `to_pdf'
  pdfkit (0.5.4) lib/pdfkit/middleware.rb:21:in `call'
  warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.3) lib/warden/manager.rb:34:in `catch'
  warden (1.2.3) lib/warden/manager.rb:34:in `call'
  rack (1.5.2) lib/rack/etag.rb:23:in `call'
  rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
  rack (1.5.2) lib/rack/head.rb:11:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in `call'
  rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in `call'
  activerecord (4.0.0) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
  activerecord (4.0.0) lib/active_record/migration.rb:369:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__4124003592524659480__call__callbacks'
  activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks'
  actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (1.0.1) lib/better_errors/middleware.rb:56:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged'
  activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged'
  railties (4.0.0) lib/rails/rack/logger.rb:21:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call'
  railties (4.0.0) lib/rails/engine.rb:511:in `call'
  railties (4.0.0) lib/rails/application.rb:97:in `call'
  rack (1.5.2) lib/rack/content_length.rb:14:in `call'
  thin (1.6.0) lib/thin/connection.rb:82:in `block in pre_process'
  thin (1.6.0) lib/thin/connection.rb:80:in `catch'
  thin (1.6.0) lib/thin/connection.rb:80:in `pre_process'
  thin (1.6.0) lib/thin/connection.rb:55:in `process'
  thin (1.6.0) lib/thin/connection.rb:41:in `receive_data'
  eventmachine (1.0.3) lib/eventmachine.rb:187:in `run_machine'
  eventmachine (1.0.3) lib/eventmachine.rb:187:in `run'
  thin (1.6.0) lib/thin/backends/base.rb:73:in `start'
  thin (1.6.0) lib/thin/server.rb:162:in `start'
  rack (1.5.2) lib/rack/handler/thin.rb:16:in `run'
  rack (1.5.2) lib/rack/server.rb:264:in `start'
  railties (4.0.0) lib/rails/commands/server.rb:84:in `start'
  railties (4.0.0) lib/rails/commands.rb:78:in `block in <top (required)>'
  railties (4.0.0) lib/rails/commands.rb:73:in `tap'
  railties (4.0.0) lib/rails/commands.rb:73:in `<top (required)>'
  bin/rails:4:in `require'
  bin/rails:4:in `<main>'
2013-12-04 13:53:36.576 wkhtmltopdf[27410:507]CoreText性能说明:客户端使用名称“Arial”调用了CTFontCreateWithName(),并获得了PostScript名称为“ArialMT”的字体。为了获得最佳性能,在调用此API时仅使用PostScript名称。
2013-12-04 13:53:36.577 wkhtmltopdf[27410:507]CoreText性能说明:在CTFontLogSuboptimalRequest上设置断点以进行调试。
2013-12-04 13:53:36.582 wkhtmltopdf[27410:507]CoreText性能说明:客户端使用名称“Arial”调用了CTFontCreateWithName(),并获得了PostScript名称为“ArialMT”的字体。为了获得最佳性能,在调用此API时仅使用PostScript名称。
2013-12-04 13:53:36.584 wkhtmltopdf[27410:507]CoreText性能说明:客户端使用名称“Arial”调用了CTFontCreateWithName(),并获得了PostScript名称为“ArialMT”的字体。为了获得最佳性能,在调用此API时仅使用PostScript名称。
^C
RuntimeError-命令失败:/usr/local/bin/wkhtmltopdf--页面大小合法--打印媒体类型--安静--:
pdfkit(0.5.4)lib/pdfkit/pdfkit.rb:73:in'to_pdf'
pdfkit(0.5.4)lib/pdfkit/middleware.rb:21:in'call'
典狱长(1.2.3)lib/warden/manager.rb:35:in'block in call'
典狱长(1.2.3)lib/warden/manager.rb:34:in'catch'
典狱长(1.2.3)lib/warden/manager.rb:34:in'call'
机架(1.5.2)lib/rack/etag.rb:23:in'call'
rack(1.5.2)lib/rack/conditionalget.rb:25:in'call'
机架(1.5.2)lib/rack/head.rb:11:in'call'
actionpack(4.0.0)lib/action_dispatch/middleware/params_parser.rb:27:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/flash.rb:241:in'call'
框架(1.5.2)lib/rack/session/abstract/id.rb:225:在“上下文”中
机架(1.5.2)lib/rack/session/abstract/id.rb:220:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/cookies.rb:486:in'call'
activerecord(4.0.0)lib/active\u record/query\u cache.rb:36:in'call'
activerecord(4.0.0)lib/active\u record/connection\u adapters/abstract/connection\u pool.rb:626:in'call'
activerecord(4.0.0)lib/active_record/migration.rb:369:in'call'
actionpack(4.0.0)lib/action_dispatch/middleware/callbacks.rb:29:in'block in call'
activesupport(4.0.0)lib/active\u support/callbacks.rb:373:in``运行\uuuu 4124003592524659480\uu调用\uu callbacks'
activesupport(4.0.0)lib/active\u support/callbacks.rb:80:in'run\u callbacks'
actionpack(4.0.0)lib/action_dispatch/middleware/callbacks.rb:27:in'call'
actionpack(4.0.0)lib/action_dispatch/middleware/reloader.rb:64:in'call'
actionpack(4.0.0)lib/action_dispatch/middleware/remote_ip.rb:76:in'call'
better_errors(1.0.1)lib/better_errors/middleware.rb:84:in'protected_app_call'
better\u errors(1.0.1)lib/better\u errors/middleware.rb:79:in'better\u errors\u call'
better_errors(1.0.1)lib/better_errors/middleware.rb:56:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/debug\u exceptions.rb:17:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/show\u exceptions.rb:30:in'call'
railties(4.0.0)lib/rails/rack/logger.rb:38:in'call_app'
railties(4.0.0)lib/rails/rack/logger.rb:21:in'block in call'
activesupport(4.0.0)lib/active\u support/taged\u logging.rb:67:in'block in taged'
activesupport(4.0.0)lib/active\u support/taged\u logging.rb:25:in'taged'
activesupport(4.0.0)lib/active\u support/taged\u logging.rb:67:in'taged'
railties(4.0.0)lib/rails/rack/logger.rb:21:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/request\u id.rb:21:in'call'
rack(1.5.2)lib/rack/methodoverride.rb:21:in'call'
rack(1.5.2)lib/rack/runtime.rb:17:in'call'
activesupport(4.0.0)lib/active_support/cache/strategy/local_cache.rb:83:in'call'
机架(1.5.2)lib/rack/lock.rb:17:in'call'
actionpack(4.0.0)lib/action\u dispatch/middleware/static.rb:64:in'call'
railties(4.0.0)lib/rails/engine.rb:511:in'call'
railties(4.0.0)lib/rails/application.rb:97:in'call'
机架(1.5.2)lib/rack/content_length.rb:14:in'call'
精简(1.6.0)lib/thin/connection.rb:82:in'block in pre_进程'
精简(1.6.0)lib/thin/connection.rb:80:in'catch'
精简(1.6.0)lib/thin/connection.rb:80:in'pre_进程'
精简(1.6.0)lib/thin/connection.rb:55:in'process'
精简(1.6.0)lib/thin/connection.rb:41:in'receive_data'
eventmachine(1.0.3)lib/eventmachine.rb:187:in'run_machine'
eventmachine(1.0.3)lib/eventmachine.rb:187:in'run'
精简(1.6.0)lib/thin/backends/base.rb:73:in'start'
精简(1.6.0)lib/thin/server.rb:162:in'start'
机架(1.5.2)lib/rack/handler/thin.rb:16:in'run'
机架(1.5.2)lib/rack/server.rb:264:in'start'
railties(4.0.0)lib/rails/commands/server.rb:84:in'start'
railties(4.0.0)lib/rails/commands.rb:78:in'block-in'
railties(4.0.0)lib/rails/commands.rb:73:in'tap'
railties(4.0.0)lib/rails/commands.rb:73:in`'
箱子/轨道:4:在'require'中
箱子/轨道:4:in`'

这是一个臭名昭著的问题,您遇到它是因为您的HTML中可能有相对链接的资产(即图像、CSS、JS、字体等),而您的web服务器一次只能处理一个请求/线程(如
WEBrick

那么会发生什么呢?当您请求其URL时,服务器开始生成PDF。PDFkit找到一个链接的资源,因此它尝试从服务器加载此资源,该服务器恰好是运行PDFkit的同一台服务器。但是,服务器的单个线程已经在忙于运行PDFkit,因此它无法“释放”以服务请求的资产。总之,这是一个死锁——PDFkit正在同一台服务器上的资产上等待PDFkit完成进程
module PdfHelper

  def pdf_image_tag(image_name)
    if Rails.env.development? || Rails.env.test?
      # Unless running a web server that can process 2 requests at the same
      # time, trying to insert an image in a PDF creates a deadlock: the server
      # can't finish processing the PDF request until it gets the image, but it
      # can't start processing the image request until it has finished
      # processing the PDF request.
      # This will not be a problem in production, but in dev, a workaround is
      # to base64 the image and insert its contents into the HTML
      image_data = Rails.application.assets[image_name].to_s
      image_tag "data:image/png;base64,#{::Base64.encode64(image_data)}"
    else
      image_tag image_name
    end
  end

end
# Remove Rack::Lock so WEBrick can be fully multi-threaded.
require 'rails/commands/server'

class Rails::Server
  def middleware
    middlewares = []
    middlewares << [Rails::Rack::Debugger] if options[:debugger]
    middlewares << [::Rack::ContentLength]

    Hash.new middlewares
  end
end