phantom-html2pdf
Version:
Simple and lightweight HTML to PDF conversion using Node and PhantomJS
105 lines (84 loc) • 2.91 kB
JavaScript
var system = require("system"),
page = require("webpage").create(),
fs = require("fs");
var cmdArgs = ["htmlPath",
"pdfPath",
"cssPath",
"jsPath",
"runningsPath",
"paperFormat",
"paperOrientation",
"paperBorder",
"paperWidth",
"paperHeight",
"renderDelay",
"runningsArgs"];
args = cmdArgs.reduce(function (args, name, i) {
args[name] = system.args[i + 1];
return args;
}, {});
// Fix for PhantomJS >= v2 requiring protocol specification
var skeleton = page.libraryPath + "/skeleton.html";
skeleton = phantom.version.major >= 2 ? "file://" + skeleton : skeleton;
page.open(skeleton, function (status) {
if (status == "fail") {
page.close();
phantom.exit(1);
return;
}
/* Add HTML source to the page */
page.evaluate(function(html) {
var body = document.querySelector("body")
body.innerHTML = html
}, fs.read(args.htmlPath));
/* Add CSS source to the page */
page.evaluate(function(cssPath) {
var head = document.querySelector("head");
var css = document.createElement("link");
css.rel = "stylesheet";
css.href = cssPath;
head.appendChild(css);
}, args.cssPath);
/* Add JS source to the page */
page.evaluate(function(jsPath) {
var head = document.querySelector("head");
var script = document.createElement("script");
script.src = jsPath;
head.appendChild(script);
}, args.jsPath);
/* Alter pagesize according to specified header/footer data */
var defaultFormat = {format: args.paperFormat, orientation: args.paperOrientation, border: args.paperBorder};
if(args.paperWidth !== 'false'){
defaultFormat = {width: args.paperWidth, height: args.paperHeight, border: args.paperBorder};
}
page.paperSize = defaultFormat;
if (args.runningsPath !== "nofile") {
var runningsArgs = args.runningsArgs ? JSON.parse(args.runningsArgs) : undefined;
var runnings = runningsArgs ? require(args.runningsPath)(runningsArgs) : require(args.runningsPath);
page.paperSize = paperSize(runnings, defaultFormat);
}
/* Render the page */
setTimeout(function () {
page.render(args.pdfPath);
page.close();
phantom.exit(0);
}, parseInt(args.renderDelay, 10));
});
function paperSize(runnings, obj) {
// encapsulate .contents into phantom.callback()
// Why does phantomjs not support Array.prototype.forEach?!
var keys = ["header", "footer"];
for (var i = 0; i < keys.length; i++) {
var which = keys[i];
if (runnings[which]
&& runnings[which].contents
&& typeof runnings[which].contents === "function") {
obj[which] = {
contents: phantom.callback(runnings[which].contents)
};
if (runnings[which].height)
obj[which].height = runnings[which].height
}
}
return obj
}