Search code examples
angularjswkhtmltopdf

Wkhtmltopdf patched QT issue with angularjs


I get this JavaScript error when running any version of wkhtmltopdf with patched Qt:

Warning: undefined:0 Error: [$injector:modulerr] Failed to instantiate module ng due to:
'undefined' is not an object
http://errors.angularjs.org/1.5.7/$injector/modulerrp0=ng&p1='undefined'%20is%20not%20an%20object

(I'm trying to render a page with angularjs 1.5).

When I use a version of wkhtmltopdf without patched Qt I don't get the error and everything works fine.

I use this heroku buildpack which installs version 0.12.3 with patched Qt, and I got this error.

Any idea how to solve my problem? I may install wkhtmltopdf without patched Qt on production but it seems I will have to compile it...


Solution

  • I finally managed to make it work with all versions: I needed a special version of the .bind() JavaScript function polyfill:

    var isFunction = function (o) {
    return typeof o == 'function';
    };
    
    var bind,
    slice = [].slice,
    proto = Function.prototype,
    featureMap;
    
    featureMap = {
    'function-bind': 'bind'
    };
    
    function has(feature) {
      var prop = featureMap[feature];
      return isFunction(proto[prop]);
    }
    
    // check for missing features
    if (!has('function-bind')) {
      // adapted from Mozilla Developer Network example at
      // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
      bind = function bind(obj) {
        var args = slice.call(arguments, 1),
          self = this,
          nop = function() {
          },
          bound = function() {
            return self.apply(this instanceof nop ? this : (obj || {}), args.concat(slice.call(arguments)));
          };
        nop.prototype = this.prototype || {}; // Firefox cries sometimes if prototype is undefined
        bound.prototype = new nop();
        return bound;
      };
      proto.bind = bind;
    }