Files
wellnessWheel/batch-convert.js
T

72 lines
2.2 KiB
JavaScript

const puppeteer = require('puppeteer-core');
const path = require('path');
const fs = require('fs');
const HTML_DIR = __dirname;
const PDF_DIR = path.join(__dirname, 'pdfs');
const files = [
{ html: 'mockup.html', width: '11in', height: '8.5in' },
{ html: 'mockup-generalized.html', width: '11in', height: '8.5in' },
{ html: 'mockup-parent-caregiver.html', width: '11in', height: '8.5in' },
{ html: 'mockup-family-member.html', width: '11in', height: '8.5in' },
{ html: 'mockup-professional.html', width: '11in', height: '8.5in' },
{ html: 'mockup-special-needs.html', width: '11in', height: '8.5in' },
];
(async () => {
// Ensure output directory exists
fs.mkdirSync(PDF_DIR, { recursive: true });
const browser = await puppeteer.launch({
executablePath: '/usr/bin/google-chrome-stable',
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu']
});
let success = 0;
let failures = 0;
for (const file of files) {
const htmlPath = path.resolve(HTML_DIR, file.html);
const pdfName = file.html.replace('.html', '.pdf');
const pdfPath = path.join(PDF_DIR, pdfName);
if (!fs.existsSync(htmlPath)) {
console.log(`SKIP: ${file.html} — file not found`);
failures++;
continue;
}
try {
const page = await browser.newPage();
await page.goto(`file://${htmlPath}`, {
waitUntil: 'networkidle0',
timeout: 30000
});
try { await page.evaluate(() => document.fonts.ready); } catch (e) { /* font API sometimes fails in headless */ }
await new Promise(r => setTimeout(r, 2500));
await page.pdf({
path: pdfPath,
width: file.width,
height: file.height,
printBackground: true,
margin: { top: '0', right: '0', bottom: '0', left: '0' },
preferCSSPageSize: false
});
const stats = fs.statSync(pdfPath);
console.log(`OK: ${pdfName} (${(stats.size / 1024).toFixed(0)} KB)`);
success++;
} catch (err) {
console.log(`FAIL: ${file.html}${err.message}`);
failures++;
}
}
await browser.close();
console.log(`\nDone: ${success} succeeded, ${failures} failed`);
})();