51 lines
1.9 KiB
JavaScript
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}`);
|