import { mkdir, writeFile } from 'node:fs/promises'; import { resolve } from 'node:path'; import { defaultOutputDir, parsePageSelection } from './parser.js'; import { pdfPageCount, renderPdfPages } from './pdf.js'; import type { PdfScreenshotArtifact, RenderedPage } from './types.js'; export async function renderPdfScreenshots( source: string, options: { pages?: string; dpi?: number; outputDir?: string } = {}, ): Promise<{ outputDir: string; screenshots: PdfScreenshotArtifact[]; rendered: RenderedPage[]; }> { const pageCount = await pdfPageCount(source); const selection = parsePageSelection(options.pages, pageCount); if (selection.pages.length > 8) { throw new Error( `pdf_screenshot accepts at most 8 pages per call; ${selection.pages.length} were selected. Narrow pages to the relevant area.`, ); } const rendered = await renderPdfPages(source, selection, options.dpi ?? 150); const outputDir = resolve(options.outputDir ?? defaultOutputDir(source), 'screenshots'); await mkdir(outputDir, { recursive: true }); const screenshots: PdfScreenshotArtifact[] = []; for (const page of rendered) { const path = resolve(outputDir, `page-${String(page.page).padStart(4, '0')}.png`); await writeFile(path, page.png); screenshots.push({ page: page.page, width: page.width, height: page.height, path, bytes: page.png.byteLength, }); } return { outputDir, screenshots, rendered }; }