UNPKG

xml-pdf

Version:

XML to PDF converter

135 lines (116 loc) 4.15 kB
#!/usr/bin/env node 'use strict'; var fs = require('fs'); var pdf = require('html-pdf'); var Mustache = require('mustache'); var xml2js = require('xml2js'); var parser = new xml2js.Parser(); var chalk = require('chalk'); var program = require('commander'); var util = require('util') //Module exports.xmlpdf = function (inPath, outPath, templatePath, options, done) { if(!inPath){ var err = new Error('Path to XML not specified'); return done(err); } if(!outPath){ var err = new Error('Export path not specified'); return done(err); } if(!templatePath){ var err = new Error('Template path not specified'); return done(err); } if(Object.keys(options).length === 0 && options.constructor === Object){ console.log(chalk.bold.underline.yellow("Warning:")); console.log(chalk.yellow("Using default options.")); console.log(chalk.bold.underline.green("End Warning")); options = { format: 'Letter', verbose: false }; } if(options.verbose) { //VERBOSE MODE console.log(chalk.bgBlack.magenta("START VERBOSE: OPTIONS")) console.log(util.inspect(options, {showHidden: false, depth: null})) console.log(chalk.bgGreen.black("END VERBOSE: OPTIONS")) //END VERBOSE MODE } fs.readFile(inPath, function(err, data) { if (err) return done(err); if(options.verbose) { //VERBOSE MODE console.log(chalk.bgBlack.magenta("START VERBOSE: XML BUFFER")) console.log(data) console.log(chalk.bgGreen.black("END VERBOSE: XML BUFFER")) //END VERBOSE MODE } parser.parseString(data, function (err, result) { if (err) return done(err); if(options.verbose) { //VERBOSE MODE console.log(chalk.bgBlack.magenta("START VERBOSE: XML2JSON")) console.log(util.inspect(result, {showHidden: false, depth: null})); console.log(chalk.bgGreen.black("END VERBOSE: XML2JSON")) //END VERBOSE MODE } var template = fs.readFileSync(templatePath, 'utf8'); var html = Mustache.render(template, result); if(options.verbose) { //VERBOSE MODE console.log(chalk.bgBlack.magenta("START VERBOSE: MUSTACHE COMPILED HTML")) console.log(html); console.log(chalk.bgGreen.black("END VERBOSE: MUSTACHE COMPILED HTML")) //END VERBOSE MODE } pdf.create(html, options).toFile(outPath, function(err, res) { if (err) return done(err); if(options.verbose) { //VERBOSE MODE console.log(chalk.bgBlack.magenta("START VERBOSE: PDF CREATE")) console.log(res); console.log(chalk.bgGreen.black("END VERBOSE: PDF CREATE")) //END VERBOSE MODE } return done(null, res) }); }); }); }; var glob = this; //CLI program .arguments('<xml> <template> <output>') .option('-h, --height <height>', 'Height of the pdf. Not to be used with \"--format\" and \"--orientation\" Allowed units: mm, cm, in, px') .option('-w, --width <width>', 'Width of the pdf. Not to be used with \"--format\" and \"--orientation\" Allowed units: mm, cm, in, px') .option('-f, --format <format>', 'Not to be used with \"--height\" and \"--width\" Allowed units: A3, A4, A5, Legal, Letter, Tabloid') .option('-o, --orientation <orientation>', 'portrait or landscape. Not to be used with \"--height\" and \"--width\"') .option('-v, --verbose', 'Enables verbose mode. Helpful when setting up the template.') .action(function(input, template, output) { var settings = {} if(program.height){ settings.height = program.height } if(program.width){ settings.width = program.width } if(program.format){ settings.format = program.format } if(program.orientation){ settings.orientation = program.orientation } if(program.verbose){ settings.verbose = program.verbose } glob.xmlpdf(input, output, template, settings, function(err, pth) { if(err) { console.log(chalk.underline.keyword('orange')("XML2PDF Encountered an error. Check below for details.")) console.log(chalk.bgRed.black("START ERROR")); console.log(chalk.bold.red(err)) console.log(chalk.bgGreen.black("END ERROR")) } else { console.log(chalk.bold.blue("Exported To: ") + chalk.green(pth.filename)); } }) }) .parse(process.argv);