Render a PDF page to PNG or JPG
Renders a page to a PNG or JPG data URL with configurable scale. Browser-only (uses canvas).
typescript
import * as pdfjsLib from "pdfjs-dist";
import workerUrl from "pdfjs-dist/build/pdf.worker.min.mjs?url";
pdfjsLib.GlobalWorkerOptions.workerSrc = workerUrl;
// pageNumber is 1-based; scale controls the resolution (2 is roughly high quality).
export async function renderPdfPageToImage(
file: File,
pageNumber: number,
scale = 2,
format: "png" | "jpeg" = "png",
quality = 0.92,
): Promise<string> {
const data = new Uint8Array(await file.arrayBuffer());
const pdf = await pdfjsLib.getDocument({ data }).promise;
const page = await pdf.getPage(pageNumber);
const viewport = page.getViewport({ scale });
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
if (!context) {
throw new Error("Couldn't get the canvas 2D context.");
}
canvas.width = Math.ceil(viewport.width);
canvas.height = Math.ceil(viewport.height);
await page.render({ canvas, canvasContext: context, viewport }).promise;
await pdf.destroy();
return canvas.toDataURL(format === "jpeg" ? "image/jpeg" : "image/png", format === "jpeg" ? quality : undefined);
}Dependencias
pdfjs-distNotas de uso
- The worker config above is for Vite (import with ?url).
- Generic bundler alternative (no Vite): GlobalWorkerOptions.workerPort = new Worker(new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url), { type: 'module' }).
- CDN alternative: GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/<VERSION>/pdf.worker.min.mjs'.
- For several pages, loop from 1 to pdf.numPages.
Limitaciones
- Browser-only: relies on document.createElement('canvas'); won't run in Node without polyfills.
- A high scale raises resolution and cost: large pages can use a lot of memory.
- Multi-page bundling into a ZIP (with jszip) is left as an extension outside this snippet.
- The worker version must match the installed pdfjs-dist version.