diff --git a/README.md b/README.md index a13a651..998aa22 100644 --- a/README.md +++ b/README.md @@ -179,8 +179,11 @@ defineUnPDFConfig({ const pdf = await readFile("./dummy.pdf"); const buffer = new Uint8Array(pdf); +const pageNumber = 1; -const result = await renderPageAsImage(buffer, 1); +const result = await renderPageAsImage(buffer, pageNumber, { + canvas: () => import("canvas"), +}); await writeFile("dummy-page-1.png", Buffer.from(result)); ``` @@ -191,8 +194,9 @@ declare function renderPageAsImage( data: BinaryData | PDFDocumentProxy, pageNumber: number, options?: { + canvas?: () => Promise; /** @default 1 */ - scale?: number; + scale?: number width?: number; height?: number; }, diff --git a/src/image.ts b/src/image.ts index d3c3e32..6af8f04 100644 --- a/src/image.ts +++ b/src/image.ts @@ -49,6 +49,7 @@ export async function renderPageAsImage( data: BinaryData | PDFDocumentProxy, pageNumber: number, options: { + canvas?: () => Promise; /** @default 1 */ scale?: number; width?: number; @@ -78,7 +79,7 @@ export async function renderPageAsImage( viewport = page.getViewport({ scale: outputScale }); } - const canvasFactory = await createIsomorphicCanvasFactory(); + const canvasFactory = await createIsomorphicCanvasFactory(options.canvas); const ctx = canvasFactory.create(viewport.width, viewport.height); await page.render({ @@ -94,19 +95,10 @@ export async function renderPageAsImage( return await response.arrayBuffer(); } -async function createIsomorphicCanvasFactory() { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let _canvas: typeof import("canvas") | undefined; - - if (isNode) { - try { - _canvas = await import("canvas"); - } catch { - throw new Error( - 'The "canvas" package is required when running in Node.js.', - ); - } - } +async function createIsomorphicCanvasFactory( + canvas?: () => Promise, +) { + const _canvas = await canvas?.(); return { _createCanvas(width: number, height: number) { @@ -116,8 +108,11 @@ async function createIsomorphicCanvasFactory() { canvas.height = height; return canvas; } else if (isNode) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return _canvas!.createCanvas(width, height); + if (!_canvas) { + throw new Error('Failed to resolve "canvas" package.'); + } + + return _canvas.createCanvas(width, height); } throw new Error("Unsupported environment for canvas creation."); diff --git a/test/index.test.ts b/test/index.test.ts index b92d39e..a2d84ee 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -57,6 +57,7 @@ describe("unpdf", () => { const result = (await renderPageAsImage( await getPDF("image-sample.pdf"), 1, + { canvas: () => import("canvas") }, ))!; // await writeFile( // new URL("image-sample.png", import.meta.url),