import fs from "fs"; import path from "path"; import { createRequire } from "module"; import { pathToFileURL } from "url"; const require = createRequire(import.meta.url); const repoRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname.slice(1)), "..", ".."); const toolRoot = path.join(repoRoot, ".local", "ppt-tools", "node_modules"); const canvasModule = require(path.join(toolRoot, "@napi-rs", "canvas")); globalThis.DOMMatrix = canvasModule.DOMMatrix; globalThis.ImageData = canvasModule.ImageData; globalThis.Path2D = canvasModule.Path2D; const pdfjsPath = path.join(toolRoot, "pdfjs-dist", "legacy", "build", "pdf.mjs"); const pdfjs = await import(pathToFileURL(pdfjsPath).href); const [pdfArgument, outputArgument] = process.argv.slice(2); if (!pdfArgument || !outputArgument) { throw new Error("Usage: node render-pdf.mjs "); } const pdfPath = path.resolve(pdfArgument); const outputDir = path.resolve(outputArgument); fs.mkdirSync(outputDir, { recursive: true }); const data = new Uint8Array(fs.readFileSync(pdfPath)); const document = await pdfjs.getDocument({ data, disableFontFace: true, isEvalSupported: false, useSystemFonts: true, }).promise; for (let pageNumber = 1; pageNumber <= document.numPages; pageNumber += 1) { const page = await document.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); const scale = 1600 / baseViewport.width; const viewport = page.getViewport({ scale }); const canvas = canvasModule.createCanvas( Math.round(viewport.width), Math.round(viewport.height), ); const context = canvas.getContext("2d"); await page.render({ canvasContext: context, viewport }).promise; const outputPath = path.join(outputDir, `slide${pageNumber}.png`); fs.writeFileSync(outputPath, canvas.toBuffer("image/png")); } console.log(`Rendered ${document.numPages} pages to ${outputDir}`);