From 7e2a3c3e7ebfbc85fff40bb764262ca0e8af2c7c Mon Sep 17 00:00:00 2001 From: ryneeverett Date: Fri, 6 Jan 2017 19:05:46 -0500 Subject: [PATCH] Add option to pass wkhtmltopdf options. Fix #176. It seems that some time in the last couple years wkhtmltopdf's default margins were changed from '10mm' to zero. As an alternative to #177, this PR adds an option to pass in arbitrary wkhtmltopdf long arguments and sets the default top and bottom margin to '10mm'. --- README.md | 4 ++++ dist/generators/html-pdf-cli-generator.js | 18 +++++++++++++----- dist/verbs/build.js | 1 + src/generators/html-pdf-cli-generator.coffee | 17 +++++++++++++---- src/verbs/build.coffee | 1 + 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 989c078..93a7224 100644 --- a/README.md +++ b/README.md @@ -490,6 +490,10 @@ The options file can contain any documented HackMyResume option, including "sectionTitles": { "employment": "Work" } + // Change wkhtmltopdf margins + "wkhtmltopdf": { + "margin-top": "20mm" + } } ``` diff --git a/dist/generators/html-pdf-cli-generator.js b/dist/generators/html-pdf-cli-generator.js index c93aea2..8a81b6e 100644 --- a/dist/generators/html-pdf-cli-generator.js +++ b/dist/generators/html-pdf-cli-generator.js @@ -52,7 +52,7 @@ Definition of the HtmlPdfCLIGenerator class. } if (_.has(engines, safe_eng)) { this.errHandler = info.opts.errHandler; - engines[safe_eng].call(this, info.mk, info.outputFile, this.onError); + engines[safe_eng].call(this, info.mk, info.outputFile, info.opts, this.onError); return null; } }; @@ -86,11 +86,19 @@ Definition of the HtmlPdfCLIGenerator class. TODO: If HTML generation has run, reuse that output TODO: Local web server to ease wkhtmltopdf rendering */ - wkhtmltopdf: function(markup, fOut, on_error) { - var tempFile; + wkhtmltopdf: function(markup, fOut, opts, on_error) { + var tempFile, wkhtmltopdf_args, wkhtmltopdf_options; tempFile = fOut.replace(/\.pdf$/i, '.pdf.html'); FS.writeFileSync(tempFile, markup, 'utf8'); - SPAWN('wkhtmltopdf', [tempFile, fOut], false, on_error, this); + wkhtmltopdf_options = _.extend({ + 'margin-bottom': '10mm', + 'margin-top': '10mm' + }, opts.wkhtmltopdf); + wkhtmltopdf_options = _.flatten(_.map(wkhtmltopdf_options, function(v, k) { + return ['--' + k, v]; + })); + wkhtmltopdf_args = wkhtmltopdf_options.concat([tempFile, fOut]); + SPAWN('wkhtmltopdf', wkhtmltopdf_args, false, on_error, this); }, /** @@ -100,7 +108,7 @@ Definition of the HtmlPdfCLIGenerator class. TODO: If HTML generation has run, reuse that output TODO: Local web server to ease Phantom rendering */ - phantomjs: function(markup, fOut, on_error) { + phantomjs: function(markup, fOut, opts, on_error) { var destPath, scriptPath, sourcePath, tempFile; tempFile = fOut.replace(/\.pdf$/i, '.pdf.html'); FS.writeFileSync(tempFile, markup, 'utf8'); diff --git a/dist/verbs/build.js b/dist/verbs/build.js index 2220acd..6db2476 100644 --- a/dist/verbs/build.js +++ b/dist/verbs/build.js @@ -242,6 +242,7 @@ Implementation of the 'build' verb for HackMyResume. _opts.noTips = opts.noTips; _opts.debug = opts.debug; _opts.sort = opts.sort; + _opts.wkhtmltopdf = opts.wkhtmltopdf; that = this; _opts.onTransform = function(info) { that.stat(HMEVENT.afterTransform, info); diff --git a/src/generators/html-pdf-cli-generator.coffee b/src/generators/html-pdf-cli-generator.coffee index 29884af..1912384 100644 --- a/src/generators/html-pdf-cli-generator.coffee +++ b/src/generators/html-pdf-cli-generator.coffee @@ -37,7 +37,7 @@ module.exports = class HtmlPdfCLIGenerator extends TemplateGenerator safe_eng = 'phantomjs' if safe_eng == 'phantom' if _.has engines, safe_eng @errHandler = info.opts.errHandler - engines[ safe_eng ].call @, info.mk, info.outputFile, @onError + engines[ safe_eng ].call @, info.mk, info.outputFile, info.opts, @onError return null # halt further processing @@ -64,11 +64,20 @@ engines = TODO: If HTML generation has run, reuse that output TODO: Local web server to ease wkhtmltopdf rendering ### - wkhtmltopdf: (markup, fOut, on_error) -> + wkhtmltopdf: (markup, fOut, opts, on_error) -> # Save the markup to a temporary file tempFile = fOut.replace /\.pdf$/i, '.pdf.html' FS.writeFileSync tempFile, markup, 'utf8' - SPAWN 'wkhtmltopdf', [ tempFile, fOut ], false, on_error, @ + + # Prepare wkhtmltopdf arguments. + wkhtmltopdf_options = _.extend( + {'margin-bottom': '10mm', 'margin-top': '10mm'}, opts.wkhtmltopdf) + wkhtmltopdf_options = _.flatten(_.map(wkhtmltopdf_options, (v, k)-> + return ['--' + k, v] + )) + wkhtmltopdf_args = wkhtmltopdf_options.concat [ tempFile, fOut ] + + SPAWN 'wkhtmltopdf', wkhtmltopdf_args , false, on_error, @ return @@ -80,7 +89,7 @@ engines = TODO: If HTML generation has run, reuse that output TODO: Local web server to ease Phantom rendering ### - phantomjs: ( markup, fOut, on_error ) -> + phantomjs: ( markup, fOut, opts, on_error ) -> # Save the markup to a temporary file tempFile = fOut.replace /\.pdf$/i, '.pdf.html' FS.writeFileSync tempFile, markup, 'utf8' diff --git a/src/verbs/build.coffee b/src/verbs/build.coffee index 1214da1..4d54dab 100644 --- a/src/verbs/build.coffee +++ b/src/verbs/build.coffee @@ -176,6 +176,7 @@ _prep = ( src, dst, opts ) -> _opts.noTips = opts.noTips _opts.debug = opts.debug _opts.sort = opts.sort + _opts.wkhtmltopdf = opts.wkhtmltopdf that = @ # Set up callbacks for internal generators