import puppeteer from 'puppeteer'; import fs from 'fs'; import moment from 'moment'; import PDFMerger from 'pdf-merger-js'; let [ url, title = '', subtitle = '', date = moment().format('YYYY-MM-DD') ] = process.argv.slice(2); const path = './pdf'; if (!fs.existsSync(path)) fs.mkdirSync(path); let browser; try{ browser = await puppeteer.launch({ headless: true, args: [ "--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox", ] }); const page = await browser.newPage(); page.setDefaultNavigationTimeout(0); await page.goto(url); await Promise.any([ page.mainFrame().waitForNavigation({waitUntil: 'networkidle0'}), new Promise(resolve => setTimeout(resolve,1000)) ]); if (!title) title = await (await page.waitForSelector('h1')).evaluate(el => el.textContent); if (!subtitle) subtitle = await (await page.waitForSelector('h2')).evaluate(el => el.textContent); console.log(title,subtitle) const pages = await page.pdf({ //path: `${path}/${date}_${title}_pages.pdf`, format: 'A4', margin: { top: '20mm', bottom: '20mm', left: '12mm', right: '12mm' }, displayHeaderFooter: true, headerTemplate: `
${[title, subtitle].map(el=>el.trim()).filter(el=>!!el).join(' - ')}
`, footerTemplate: `
Page
`, printBackground: true }); let coverHTML = fs.readFileSync('./cover.html', {encoding: 'utf-8', flag: 'r'}); Object.entries({ title, subtitle, date }).forEach(([key, value]) => { coverHTML = coverHTML.replaceAll(`{{${key}}}`, value); }); const page2 = await browser.newPage(); await page2.setContent(coverHTML); const cover = await page2.pdf({ //path: `${path}/${date}_${title}_cover.pdf`, format: 'A4', margin: { top: '20mm', bottom: '20mm', left: '12mm', right: '12mm' } }); await browser.close(); const merger = new PDFMerger(); merger.add(cover); merger.add(pages); await merger.save(`${path}/${date}_${title.trim().replaceAll(' ', '_')}.pdf`) } catch (e) { if (browser) await browser.close(); throw e; } console.log('finished');