simple-html-to-pdf
Version:
Quick CLI command for converting HTML (from URL) to PDF
102 lines (89 loc) • 2.55 kB
JavaScript
const argv = require('minimist')(process.argv.slice(2));
const conversion = require('phantom-html-to-pdf')();
import phantom from 'node-phantom-async';
import fs from 'fs';
import chalk from 'chalk';
import Promise from 'promise';
const {
url,
file,
verbose = false,
fitToPage = false,
phantomDelay = 200,
printDelay,
} = argv;
if (!url || !file) {
console.log(chalk.red('Some of the arguments are missing.'));
console.log(chalk.red('Usage: simple-html-to-pdf --url="http://www.somewebsite.com" --file="/tmp/my.pdf" [--verbose] [--fitToPage] [--phantomDelay] [--printDelay]'));
console.log(chalk.red('Exiting...'));
console.log('\n');
process.exit(0);
}
let conversionOptions = { fitToPage, printDelay };
function myConsole(message, verbose = false) {
if (verbose) {
return console.log(message);
}
}
let self = {};
phantom.create()
.bind({})
.then((ph) => {
self.ph = ph;
return ph.createPage();
})
.then((page) => {
self.page = page;
return page.open(url);
})
.then((status) => {
myConsole(status, verbose);
console.log(chalk.bold.cyan(`Going to wait ${phantomDelay} milliseconds...`));
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(chalk.bold.cyan('Wait finished.'));
self.page.get('content')
.then(resolve)
.catch(reject);
}, phantomDelay);
});
})
.then((content) => {
myConsole(content, verbose);
conversionOptions = { ...conversionOptions, html: content };
return new Promise((resolve, reject) => {
conversion(conversionOptions, function(err, pdf) {
if (err) {
console.log(chalk.red(err));
conversion.kill();
return reject(err);
}
myConsole(pdf.logs, verbose);
myConsole(pdf.numberOfPages, verbose);
let stream = pdf.stream.pipe(fs.createWriteStream(file));
stream.on('finish', () =>{
conversion.kill();
console.log(chalk.bold.cyan('Conversion success!'));
resolve();
});
stream.on('error', (error) => {
console.error(chalk.red('Failed to write a file...'));
console.error(chalk.red(error));
conversion.kill();
reject(error);
});
});
});
})
.catch((error) => {
console.error(chalk.red('Conversion failed...'));
console.error(chalk.red(error));
})
.finally(function() {
console.log(chalk.bold.cyan('Going to close Phantom'));
return self.ph.exit();
})
.finally(function() {
console.log(chalk.bold.cyan('Going to exit the process'));
process.exit();
});