Created
January 16, 2020 21:14
-
-
Save tomshaw/5071a3669428f27bbb6c63d8ec14de58 to your computer and use it in GitHub Desktop.
Quickly export to PDF whatever page/url.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node | |
const puppeteer = require('puppeteer'); | |
/** | |
* npm link/savepage url=https://stackoverflow.com/ | |
* Margins default to Microsoft Word A4 margins. | |
*/ | |
class SavePage { | |
constructor(params) { | |
const settings = this.normalizeOptions(params); | |
if (!settings.url) { | |
throw new Error('Missing save page url! Try again.'); | |
} | |
const config = { | |
verbose: true, | |
consolePage: false, | |
consoleOptions: false, | |
path: `${this.getHostName(settings.url)}.pdf`, | |
width: 800, | |
height: 600, | |
waitUntil: 'networkidle2', | |
headless: true, | |
slowMo: 0, // 250ms | |
deviceScaleFactor: 1, | |
format: 'A4', | |
printBackground: false, | |
margin: { | |
top: '2.54cm', | |
bottom: '2.54cm', | |
left: '2.54cm', | |
right: '2.54cm' | |
} | |
}; | |
this.options = { ...config, ...settings }; | |
} | |
async save() { | |
const options = this.options; | |
if (options.consoleOptions === true) { | |
console.log('Save options:', options); | |
} | |
const browser = await puppeteer.launch({ | |
headless: options.headless, | |
slowMo: options.slowMo | |
}); | |
const page = await browser.newPage(); | |
await page.setViewport({ | |
width: options.width, | |
height: options.height, | |
deviceScaleFactor: options.deviceScaleFactor | |
}); | |
await page.goto(options.url, { waitUntil: options.waitUntil }); | |
if (options.verbose === true) { | |
const data = await page.evaluate(() => { | |
return { | |
href: location.href, | |
width: document.documentElement.clientWidth, | |
height: document.documentElement.clientHeight, | |
deviceScaleFactor: window.devicePixelRatio | |
}; | |
}); | |
console.log('...'); | |
console.log('URL:', data.href); | |
console.log('Page width:', data.width); | |
console.log('Page height:', data.height); | |
console.log('Page scale:', data.deviceScaleFactor); | |
} | |
if (options.consolePage) { | |
page.on('console', msg => console.log(msg.text())); | |
} | |
await page.pdf({ | |
path: options.path, | |
format: options.format, | |
printBackground: options.printBackground, | |
margin: options.margin | |
}); | |
return await browser.close(); | |
} | |
normalizeOptions(args) { | |
return args | |
.slice(2) | |
.map(arg => arg.split('=')) | |
.reduce((args, [value, key]) => { | |
args[value] = key; | |
return args; | |
}, {}); | |
} | |
getHostName (url) { | |
return new URL(url).hostname; | |
} | |
} | |
(async () => { | |
const page = new SavePage(process.argv); | |
await page.save(); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
{
"name": "savepage",
"version": "1.0.0",
"description": "",
"main": "savepage.js",
"bin": {
"savepage": "savepage.js"
},
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "Tom Shaw [email protected] (http://tomshaw.us)",
"license": "ISC",
"dependencies": {
"puppeteer": "^2.0.0"
},
"devDependencies": {}
}