0

I have installed both PDFKit and wkhtmltopdf. I used brew install for wkhtmltopdf, and for PDFkit, I added it to my gem file and created the following:

# config/initializers/pdfkit.rb
PDFKit.configure do |config|
  config.wkhtmltopdf = '/usr/local/bin/wkhtmltopdf'
  config.default_options = {
    # :page_size => 'Legal',
    # :print_media_type => true
  }
  # config.root_url = "http://localhost" # Use only if your external hostname is unavailable on the server.
end

as well as added the following to application.rb

require 'pdfkit'
config.middleware.use PDFKit::Middleware

when I run which wkhtmltopdf I get: /usr/local/bin/wkhtmltopdf

and I can also run wkhtmltopdf google.com google.pdf and it pulls down the file correctly.

I can even do something like wkhtmltopdf http://localhost:3000/about google.pdf and it works just fine.

However, if I try to do: http://localhost:3000/about.pdf and just go there in my browser the whole website just tries to load and never finishes. However, I get the following:

RuntimeError (command failed: "/usr/local/bin/wkhtmltopdf" "--quiet" "-" "-"):
  pdfkit (0.5.2) lib/pdfkit/pdfkit.rb:71:in `to_pdf'
  pdfkit (0.5.2) lib/pdfkit/middleware.rb:21:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
  rack (1.4.1) lib/rack/etag.rb:23:in `call'
  rack (1.4.1) lib/rack/conditionalget.rb:25:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/head.rb:14:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/flash.rb:242:in `call'
  rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context'
  rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/cookies.rb:338:in `call'
  activerecord (3.2.3) lib/active_record/query_cache.rb:64:in `call'
  activerecord (3.2.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:467:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
  activesupport (3.2.3) lib/active_support/callbacks.rb:405:in `_run__1600846312864942852__call__3683691454379641054__callbacks'
  activesupport (3.2.3) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.3) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
  activesupport (3.2.3) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.2.3) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/reloader.rb:65:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.3) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.3) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.1) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.3) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.1) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.3) lib/rails/engine.rb:479:in `call'
  railties (3.2.3) lib/rails/application.rb:220:in `call'
  rack (1.4.1) lib/rack/content_length.rb:14:in `call'
  railties (3.2.3) lib/rails/rack/log_tailer.rb:14:in `call'
  rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
  /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /usr/local/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

and just to confirm it is in the middleware.

rake middleware
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fc11b9c4a30>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use ActionDispatch::Head
use Rack::ConditionalGet
use Rack::ETag
use ActionDispatch::BestStandardsSupport
use PDFKit::Middleware
run Teacherjoy::Application.routes

What am I missing to get this working?

Noah Clark
  • 8,101
  • 14
  • 74
  • 116
  • 1
    So, the command that is constructed is: `/usr/local/bin/wkhtmltopdf --quiet - -`. Perhaps you need to actually feed it some input/output information? – Brian Jun 27 '12 at 13:57

2 Answers2

0

I tried PDFKit this morning and had the same issue of infinitely page loading. I fixed it by adding "config.threadsafe!" to my application.rb

Additionally I changed my code guided by the solution of this stackoverflow answer

Community
  • 1
  • 1
chrobs
  • 389
  • 1
  • 3
  • 8
0

The path for the pdfkit /usr/local/bin/wkhtmltopdfis not correct if you are using rvm in your system . This is the case in my local development environment system .

I checked which wkhtmltopdf this command is returning 2 paths in my application directory if i have used my gemset then i am getting a path like this

  which wkhtmltopdf
/home/re10/.rvm/gems/ruby-1.8.7-p358@lmft/bin/wkhtmltopdf  (path to the gemset in server)

I tried the same command in the root directory then i am getting a path

which wkhtmltopdf
/usr/local/bin/wkhtmltopdf

so try to install the package after entering to your project directory and after using the gemset the path for the command which wkhtmltopdf should be inside your rvm and inside where all the gems are stored for that gemset .

please refer this stackoverflow for a example . this works for me . https://stackoverflow.com/a/5764290/1304966

Community
  • 1
  • 1
Amit
  • 174
  • 1
  • 7