diff --git a/README.md b/README.md index 1770a68..b55cf47 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ Convertion to PDF takes care of `@media print` CSS rules and preserves links to ## Getting Started -### Setting up wkhtmltopdf +### Setting up wkhtmltopdf Download and install wkhtmltopdf from the [project page][wkhtmltopdf_dl]. -Make sure `wkhtmltopdf` is accessible from your `PATH` (Try `wkhtmltopdf -V` in your Terminal). +Make sure `wkhtmltopdf` is accessible from your `PATH` (Try `wkhtmltopdf -V` in your Terminal). I'm on Mac OS X, so I created the following symlink to my `/usr/local/bin/` folder: ``` @@ -29,11 +29,6 @@ Then add this line to your project's `grunt.js` gruntfile: grunt.loadNpmTasks('grunt-wkhtmltopdf'); ``` -[wkhtmltopdf]: http://code.google.com/p/wkhtmltopdf/ -[wkhtmltopdf_dl]: http://code.google.com/p/wkhtmltopdf/downloads/list -[grunt]: https://github.com/gruntjs/grunt -[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md - ## Documentation Simply add task definition in your gruntfile. See the folllowing example: @@ -54,18 +49,61 @@ Simply add task definition in your gruntfile. See the folllowing example: Run `grunt wkhtmltopdf` to execute all the targets or `grunt wkhtmltopdf:targetname` to execute a specific target. Every `html` file defined by the `src` parameter will be turned into a PDF and saved to `dest` folder. +### Sending arguments to `wkhtml2pdf` + +Arguments sent via the `args` key in the task definition will be forwarded to `wkhtml2pdf` as follow : + +```javascript + //... + wkhtmltopdf: { + prod: { + src: 'path/to/some/html/file/*.html', + dest: 'pdf/output/', + args: [ + '--dpi', '96', + '--print-media-type', + '--grayscale' + ] + } + }, + //... +``` + +Defining custom arguments will override default ones: + +```javascript +// grunt-wkhtml2pdf default arguments +var args = [ + '--dpi', '96', + '--print-media-type' +] +``` + +See [wkhtml2pdf documentation][wkhtmltopdf_doc] for available options + ## Contributing In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt][grunt]. ## Release History - - *v0.1.0*: First Release - - *v0.2.0*: Fixed compatibility with grunt 0.4 - - *v0.3.0*: grunt-wkhtmltopdf is now a multi-task - - *v0.4.0*: + - *v0.5.0*: + - Merged [#12](https://github.com/dharFr/grunt-wkhtmltopdf/pull/12) (Fix [#11](https://github.com/dharFr/grunt-wkhtmltopdf/issues/11)) : Added async support + - Merged [#9](https://github.com/dharFr/grunt-wkhtmltopdf/pull/9) : Added ability to override the arguments + - *v0.4.0*: - Update project config files to work with Grunt 0.4 - Update wkthmltopdf task to use Grunt 0.4 multi-task API - - Improve predictability of the destination for created PDFs + - Improve predictability of the destination for created PDFs + - *v0.3.0*: grunt-wkhtmltopdf is now a multi-task + - *v0.2.0*: Fixed compatibility with grunt 0.4 + - *v0.1.0*: First Release + ## License -Copyright (c) 2012 Olivier Audard +Copyright (c) 2012 Olivier Audard Licensed under the MIT license. + + +[wkhtmltopdf]: http://wkhtmltopdf.org/ +[wkhtmltopdf_dl]: http://wkhtmltopdf.org/downloads.html +[wkhtmltopdf_doc]: http://wkhtmltopdf.org/docs.html +[grunt]: https://github.com/gruntjs/grunt +[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md diff --git a/tasks/wkhtmltopdf.js b/tasks/wkhtmltopdf.js index 6f6dc05..375915d 100644 --- a/tasks/wkhtmltopdf.js +++ b/tasks/wkhtmltopdf.js @@ -18,7 +18,13 @@ module.exports = function(grunt) { grunt.registerMultiTask('wkhtmltopdf', 'Your task description goes here.', function() { - this.files.forEach(function(file) { + // using grunt async support so we can be sure task doesn't + // end before PDF processing does: http://gruntjs.com/api/inside-tasks + var done = this.async(), + files = this.files; + + // iterate through each file grouping + files.forEach(function(file, filesIndex) { var pathlib = require('path'); // calculate the destination directory and ensure it exists, since @@ -30,7 +36,7 @@ module.exports = function(grunt) { } grunt.file.mkdir(destPath); - file.src.forEach(function(src) { + file.src.forEach(function(src, srcIndex) { var dest = file.dest; // wkhtmltopdf seems to require that the destination be a file @@ -51,19 +57,32 @@ module.exports = function(grunt) { "Converting " + src + " -> " + dest ); - // Launch PhantomJS. + // default args + var args = [ + '--dpi', '96', // workarround to wkhtmltopdf letter-spacing bug (see http://code.google.com/p/wkhtmltopdf/issues/detail?id=72) + '--print-media-type' // Use @print media type + ]; + + // overrides the args + if (file.args) { + args = file.args; + } + + // adds the src and dest + args = args.concat([src, dest]); + + // Launch wkhtmltopdf. helper.convert({ code: 90, - args: [ - '--dpi', '96', // workarround to wkhtmltopdf letter-spacing bug (see http://code.google.com/p/wkhtmltopdf/issues/detail?id=72) - '--print-media-type', // Use @print media type - src, - dest - ], + args: args, done: function(err) { if (err) { grunt.log('>>>', err); } + // if this is the last src of the last file, we are done. + if((filesIndex+1 >= files.length) && (srcIndex+1 >= file.src.length)) { + done(); + } } }); });