Files

51 lines
1.9 KiB
JavaScript

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 <input.pdf> <output-dir>");
}
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}`);