unpdf 0.12.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +147 -79
  2. package/dist/index.cjs +118 -73
  3. package/dist/index.d.cts +24 -41
  4. package/dist/index.d.mts +24 -41
  5. package/dist/index.d.ts +24 -41
  6. package/dist/index.mjs +117 -72
  7. package/dist/pdfjs.mjs +1 -1
  8. package/dist/types/src/display/annotation_layer.d.ts +25 -1
  9. package/dist/types/src/display/annotation_storage.d.ts +1 -8
  10. package/dist/types/src/display/api.d.ts +147 -57
  11. package/dist/types/src/display/canvas.d.ts +21 -28
  12. package/dist/types/src/display/canvas_factory.d.ts +27 -0
  13. package/dist/types/src/display/cmap_reader_factory.d.ts +25 -0
  14. package/dist/types/src/display/display_utils.d.ts +40 -60
  15. package/dist/types/src/display/draw_layer.d.ts +7 -19
  16. package/dist/types/src/display/editor/alt_text.d.ts +3 -2
  17. package/dist/types/src/display/editor/annotation_editor_layer.d.ts +16 -11
  18. package/dist/types/src/display/editor/color_picker.d.ts +1 -0
  19. package/dist/types/src/display/editor/draw.d.ts +121 -0
  20. package/dist/types/src/display/editor/drawers/contour.d.ts +3 -0
  21. package/dist/types/src/display/editor/drawers/freedraw.d.ts +31 -0
  22. package/dist/types/src/display/editor/drawers/highlight.d.ts +36 -0
  23. package/dist/types/src/display/editor/drawers/inkdraw.d.ts +129 -0
  24. package/dist/types/src/display/editor/drawers/outline.d.ts +19 -0
  25. package/dist/types/src/display/editor/drawers/signaturedraw.d.ts +79 -0
  26. package/dist/types/src/display/editor/editor.d.ts +55 -13
  27. package/dist/types/src/display/editor/freetext.d.ts +5 -16
  28. package/dist/types/src/display/editor/highlight.d.ts +8 -25
  29. package/dist/types/src/display/editor/ink.d.ts +21 -74
  30. package/dist/types/src/display/editor/signature.d.ts +80 -0
  31. package/dist/types/src/display/editor/stamp.d.ts +16 -22
  32. package/dist/types/src/display/editor/toolbar.d.ts +5 -2
  33. package/dist/types/src/display/editor/tools.d.ts +17 -9
  34. package/dist/types/src/display/fetch_stream.d.ts +6 -13
  35. package/dist/types/src/display/filter_factory.d.ts +29 -0
  36. package/dist/types/src/display/font_loader.d.ts +3 -6
  37. package/dist/types/src/display/metadata.d.ts +1 -2
  38. package/dist/types/src/display/network.d.ts +11 -7
  39. package/dist/types/src/display/network_utils.d.ts +7 -6
  40. package/dist/types/src/display/node_stream.d.ts +6 -22
  41. package/dist/types/src/display/node_utils.d.ts +15 -11
  42. package/dist/types/src/display/optional_content_config.d.ts +2 -2
  43. package/dist/types/src/display/pattern_helper.d.ts +4 -2
  44. package/dist/types/src/display/standard_fontdata_factory.d.ts +20 -0
  45. package/dist/types/src/display/svg_factory.d.ts +14 -0
  46. package/dist/types/src/display/text_layer.d.ts +12 -9
  47. package/dist/types/src/display/touch_manager.d.ts +18 -0
  48. package/dist/types/src/display/transport_stream.d.ts +1 -1
  49. package/dist/types/src/display/wasm_factory.d.ts +20 -0
  50. package/dist/types/src/display/worker_options.d.ts +2 -2
  51. package/dist/types/src/interfaces.d.ts +4 -0
  52. package/dist/types/src/pdf.d.ts +13 -5
  53. package/dist/types/src/shared/message_handler.d.ts +9 -4
  54. package/dist/types/src/shared/util.d.ts +137 -129
  55. package/dist/types/web/annotation_editor_layer_builder.d.ts +20 -5
  56. package/dist/types/web/annotation_layer_builder.d.ts +35 -4
  57. package/dist/types/web/app_options.d.ts +1 -1
  58. package/dist/types/web/autolinker.d.ts +28 -0
  59. package/dist/types/web/base_pdf_page_view.d.ts +27 -0
  60. package/dist/types/web/draw_layer_builder.d.ts +13 -2
  61. package/dist/types/web/event_utils.d.ts +2 -2
  62. package/dist/types/web/genericl10n.d.ts +5 -5
  63. package/dist/types/web/interfaces.d.ts +5 -5
  64. package/dist/types/web/l10n.d.ts +2 -2
  65. package/dist/types/web/pdf_find_controller.d.ts +2 -0
  66. package/dist/types/web/pdf_link_service.d.ts +1 -2
  67. package/dist/types/web/pdf_page_detail_view.d.ts +32 -0
  68. package/dist/types/web/pdf_page_view.d.ts +44 -23
  69. package/dist/types/web/pdf_rendering_queue.d.ts +2 -1
  70. package/dist/types/web/pdf_thumbnail_view.d.ts +23 -3
  71. package/dist/types/web/pdf_thumbnail_viewer.d.ts +21 -1
  72. package/dist/types/web/pdf_viewer.d.ts +44 -16
  73. package/dist/types/web/struct_tree_layer_builder.d.ts +20 -2
  74. package/dist/types/web/text_accessibility.d.ts +1 -1
  75. package/dist/types/web/text_layer_builder.d.ts +25 -17
  76. package/dist/types/web/ui_utils.d.ts +3 -19
  77. package/dist/types/web/xfa_layer_builder.d.ts +14 -3
  78. package/package.json +31 -28
  79. package/dist/types/src/display/base_factory.d.ts +0 -60
  80. package/dist/types/src/display/editor/outliner.d.ts +0 -70
package/dist/index.d.cts CHANGED
@@ -1,5 +1,4 @@
1
- import * as canvas from 'canvas';
2
- import { Canvas } from 'canvas';
1
+ import * as _napi_rs_canvas from '@napi-rs/canvas';
3
2
  import { DocumentInitParameters, PDFDocumentProxy } from './types/src/display/api';
4
3
  import * as _PDFJS from './types/src/pdf';
5
4
 
@@ -14,45 +13,26 @@ interface ExtractedImageObject {
14
13
  * Extracts images from a specific page of a PDF document, including necessary metadata,
15
14
  * such as width, height, and calculated color channels.
16
15
  *
17
- * This version calculates channels based on image data length, width, and height,
18
- * as the `kind` property provided by PDF.js might not reliably indicate the actual
19
- * channel count of the raw pixel data (e.g., returning RGBA data even when kind is 3).
20
- *
21
16
  * @example
22
17
  * const imagesData = await extractImages(pdf, pageNum)
23
18
  *
24
19
  * for (const imgData of imagesData) {
25
- * const imageIndex = totalImagesProcessed + 1;
20
+ * const imageIndex = totalImagesProcessed + 1
26
21
  * await sharp(imgData.data, {
27
22
  * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
28
23
  * })
29
24
  * .png()
30
- * .toFile(`${imageIndex}.png`);
25
+ * .toFile(`${imageIndex}.png`)
31
26
  * }
32
27
  */
33
28
  declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
34
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
35
- canvas?: () => Promise<typeof canvas>;
36
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
37
32
  scale?: number;
38
33
  width?: number;
39
34
  height?: number;
40
35
  }): Promise<ArrayBuffer>;
41
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
42
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
43
- create(width: number, height: number): {
44
- canvas: Canvas | HTMLCanvasElement;
45
- context: CanvasRenderingContext2D;
46
- };
47
- reset(ctx: {
48
- canvas?: Canvas;
49
- context?: CanvasRenderingContext2D;
50
- }, width: number, height: number): void;
51
- destroy(ctx: {
52
- canvas?: Canvas;
53
- context?: CanvasRenderingContext2D;
54
- }): void;
55
- }>;
56
36
 
57
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
58
38
  info: Record<string, any>;
@@ -72,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
72
52
  text: string;
73
53
  }>;
74
54
 
75
- type PDFJS = typeof _PDFJS;
76
- interface UnPDFConfiguration {
77
- /**
78
- * By default, UnPDF will use the latest version of PDF.js compiled for
79
- * serverless environments. If you want to use a different version, you can
80
- * provide a custom resolver function.
81
- *
82
- * @example
83
- * // Use the official PDF.js build (make sure to install it first)
84
- * () => import('pdfjs-dist')
85
- */
55
+ /**
56
+ * By default, unpdf will use the latest version of PDF.js compiled for
57
+ * serverless environments. If you want to use a different version, you can
58
+ * provide a custom resolver function.
59
+ *
60
+ * @example
61
+ * // Use the official PDF.js build (make sure to install it first)
62
+ * import { definePDFJSModule } from 'unpdf'
63
+ *
64
+ * await definePDFJSModule(() => import('pdfjs-dist'))
65
+ */
66
+ declare function definePDFJSModule(pdfjs: () => Promise<any>): Promise<void>;
67
+ /** @deprecated Use `definePDFJSModule` instead. */
68
+ declare function configureUnPDF(options: {
86
69
  pdfjs?: () => Promise<any>;
87
- }
70
+ }): Promise<void>;
88
71
 
89
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
90
73
 
91
74
  /**
92
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -97,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
97
80
  */
98
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
99
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
100
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
101
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
102
85
  }): Promise<void>;
103
86
 
104
87
  declare const getMeta: typeof getMeta$1;
@@ -106,4 +89,4 @@ declare const extractText: typeof extractText$1;
106
89
  declare const extractImages: typeof extractImages$1;
107
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
108
91
 
109
- export { configureUnPDF, createIsomorphicCanvasFactory, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImports };
92
+ export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import * as canvas from 'canvas';
2
- import { Canvas } from 'canvas';
1
+ import * as _napi_rs_canvas from '@napi-rs/canvas';
3
2
  import { DocumentInitParameters, PDFDocumentProxy } from './types/src/display/api';
4
3
  import * as _PDFJS from './types/src/pdf';
5
4
 
@@ -14,45 +13,26 @@ interface ExtractedImageObject {
14
13
  * Extracts images from a specific page of a PDF document, including necessary metadata,
15
14
  * such as width, height, and calculated color channels.
16
15
  *
17
- * This version calculates channels based on image data length, width, and height,
18
- * as the `kind` property provided by PDF.js might not reliably indicate the actual
19
- * channel count of the raw pixel data (e.g., returning RGBA data even when kind is 3).
20
- *
21
16
  * @example
22
17
  * const imagesData = await extractImages(pdf, pageNum)
23
18
  *
24
19
  * for (const imgData of imagesData) {
25
- * const imageIndex = totalImagesProcessed + 1;
20
+ * const imageIndex = totalImagesProcessed + 1
26
21
  * await sharp(imgData.data, {
27
22
  * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
28
23
  * })
29
24
  * .png()
30
- * .toFile(`${imageIndex}.png`);
25
+ * .toFile(`${imageIndex}.png`)
31
26
  * }
32
27
  */
33
28
  declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
34
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
35
- canvas?: () => Promise<typeof canvas>;
36
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
37
32
  scale?: number;
38
33
  width?: number;
39
34
  height?: number;
40
35
  }): Promise<ArrayBuffer>;
41
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
42
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
43
- create(width: number, height: number): {
44
- canvas: Canvas | HTMLCanvasElement;
45
- context: CanvasRenderingContext2D;
46
- };
47
- reset(ctx: {
48
- canvas?: Canvas;
49
- context?: CanvasRenderingContext2D;
50
- }, width: number, height: number): void;
51
- destroy(ctx: {
52
- canvas?: Canvas;
53
- context?: CanvasRenderingContext2D;
54
- }): void;
55
- }>;
56
36
 
57
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
58
38
  info: Record<string, any>;
@@ -72,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
72
52
  text: string;
73
53
  }>;
74
54
 
75
- type PDFJS = typeof _PDFJS;
76
- interface UnPDFConfiguration {
77
- /**
78
- * By default, UnPDF will use the latest version of PDF.js compiled for
79
- * serverless environments. If you want to use a different version, you can
80
- * provide a custom resolver function.
81
- *
82
- * @example
83
- * // Use the official PDF.js build (make sure to install it first)
84
- * () => import('pdfjs-dist')
85
- */
55
+ /**
56
+ * By default, unpdf will use the latest version of PDF.js compiled for
57
+ * serverless environments. If you want to use a different version, you can
58
+ * provide a custom resolver function.
59
+ *
60
+ * @example
61
+ * // Use the official PDF.js build (make sure to install it first)
62
+ * import { definePDFJSModule } from 'unpdf'
63
+ *
64
+ * await definePDFJSModule(() => import('pdfjs-dist'))
65
+ */
66
+ declare function definePDFJSModule(pdfjs: () => Promise<any>): Promise<void>;
67
+ /** @deprecated Use `definePDFJSModule` instead. */
68
+ declare function configureUnPDF(options: {
86
69
  pdfjs?: () => Promise<any>;
87
- }
70
+ }): Promise<void>;
88
71
 
89
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
90
73
 
91
74
  /**
92
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -97,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
97
80
  */
98
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
99
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
100
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
101
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
102
85
  }): Promise<void>;
103
86
 
104
87
  declare const getMeta: typeof getMeta$1;
@@ -106,4 +89,4 @@ declare const extractText: typeof extractText$1;
106
89
  declare const extractImages: typeof extractImages$1;
107
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
108
91
 
109
- export { configureUnPDF, createIsomorphicCanvasFactory, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImports };
92
+ export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import * as canvas from 'canvas';
2
- import { Canvas } from 'canvas';
1
+ import * as _napi_rs_canvas from '@napi-rs/canvas';
3
2
  import { DocumentInitParameters, PDFDocumentProxy } from './types/src/display/api';
4
3
  import * as _PDFJS from './types/src/pdf';
5
4
 
@@ -14,45 +13,26 @@ interface ExtractedImageObject {
14
13
  * Extracts images from a specific page of a PDF document, including necessary metadata,
15
14
  * such as width, height, and calculated color channels.
16
15
  *
17
- * This version calculates channels based on image data length, width, and height,
18
- * as the `kind` property provided by PDF.js might not reliably indicate the actual
19
- * channel count of the raw pixel data (e.g., returning RGBA data even when kind is 3).
20
- *
21
16
  * @example
22
17
  * const imagesData = await extractImages(pdf, pageNum)
23
18
  *
24
19
  * for (const imgData of imagesData) {
25
- * const imageIndex = totalImagesProcessed + 1;
20
+ * const imageIndex = totalImagesProcessed + 1
26
21
  * await sharp(imgData.data, {
27
22
  * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
28
23
  * })
29
24
  * .png()
30
- * .toFile(`${imageIndex}.png`);
25
+ * .toFile(`${imageIndex}.png`)
31
26
  * }
32
27
  */
33
28
  declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
34
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
35
- canvas?: () => Promise<typeof canvas>;
36
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
37
32
  scale?: number;
38
33
  width?: number;
39
34
  height?: number;
40
35
  }): Promise<ArrayBuffer>;
41
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
42
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
43
- create(width: number, height: number): {
44
- canvas: Canvas | HTMLCanvasElement;
45
- context: CanvasRenderingContext2D;
46
- };
47
- reset(ctx: {
48
- canvas?: Canvas;
49
- context?: CanvasRenderingContext2D;
50
- }, width: number, height: number): void;
51
- destroy(ctx: {
52
- canvas?: Canvas;
53
- context?: CanvasRenderingContext2D;
54
- }): void;
55
- }>;
56
36
 
57
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
58
38
  info: Record<string, any>;
@@ -72,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
72
52
  text: string;
73
53
  }>;
74
54
 
75
- type PDFJS = typeof _PDFJS;
76
- interface UnPDFConfiguration {
77
- /**
78
- * By default, UnPDF will use the latest version of PDF.js compiled for
79
- * serverless environments. If you want to use a different version, you can
80
- * provide a custom resolver function.
81
- *
82
- * @example
83
- * // Use the official PDF.js build (make sure to install it first)
84
- * () => import('pdfjs-dist')
85
- */
55
+ /**
56
+ * By default, unpdf will use the latest version of PDF.js compiled for
57
+ * serverless environments. If you want to use a different version, you can
58
+ * provide a custom resolver function.
59
+ *
60
+ * @example
61
+ * // Use the official PDF.js build (make sure to install it first)
62
+ * import { definePDFJSModule } from 'unpdf'
63
+ *
64
+ * await definePDFJSModule(() => import('pdfjs-dist'))
65
+ */
66
+ declare function definePDFJSModule(pdfjs: () => Promise<any>): Promise<void>;
67
+ /** @deprecated Use `definePDFJSModule` instead. */
68
+ declare function configureUnPDF(options: {
86
69
  pdfjs?: () => Promise<any>;
87
- }
70
+ }): Promise<void>;
88
71
 
89
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
90
73
 
91
74
  /**
92
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -97,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
97
80
  */
98
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
99
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
100
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
101
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
102
85
  }): Promise<void>;
103
86
 
104
87
  declare const getMeta: typeof getMeta$1;
@@ -106,4 +89,4 @@ declare const extractText: typeof extractText$1;
106
89
  declare const extractImages: typeof extractImages$1;
107
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
108
91
 
109
- export { configureUnPDF, createIsomorphicCanvasFactory, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImports };
92
+ export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.mjs CHANGED
@@ -14,24 +14,21 @@ async function getDocumentProxy(data, options = {}) {
14
14
  }
15
15
  async function getResolvedPDFJS() {
16
16
  if (!resolvedModule) {
17
- await resolvePDFJSImports();
17
+ await resolvePDFJSImport();
18
18
  }
19
19
  return resolvedModule;
20
20
  }
21
- async function resolvePDFJSImports(pdfjsResolver, { force = false } = {}) {
22
- if (resolvedModule && !force) {
21
+ async function resolvePDFJSImport(pdfjsResolver, { reload = false } = {}) {
22
+ if (resolvedModule && !reload) {
23
23
  return;
24
24
  }
25
25
  if (pdfjsResolver) {
26
26
  try {
27
27
  resolvedModule = await interopDefault(pdfjsResolver());
28
- if (resolvedModule && "resolvePDFJS" in resolvedModule) {
29
- resolvedModule = await resolvedModule.resolvePDFJS();
30
- }
31
28
  return;
32
29
  } catch (error) {
33
30
  console.error(error);
34
- throw new Error("Resolving failed. Please check the provided configuration.");
31
+ throw new Error("PDF.js could not be resolved. Please check the resolver function.");
35
32
  }
36
33
  }
37
34
  try {
@@ -39,7 +36,7 @@ async function resolvePDFJSImports(pdfjsResolver, { force = false } = {}) {
39
36
  resolvedModule = await resolvePDFJS();
40
37
  } catch (error) {
41
38
  console.error(error);
42
- throw new Error("PDF.js is not available. Please add the package as a dependency.");
39
+ throw new Error("PDF.js package not available. Please install it first.");
43
40
  }
44
41
  }
45
42
  function isPDFDocumentProxy(data) {
@@ -50,6 +47,87 @@ async function interopDefault(m) {
50
47
  return resolved.default || resolved;
51
48
  }
52
49
 
50
+ let canvasModule;
51
+ /**
52
+ * Derived from the PDF.js project by the Mozilla Foundation.
53
+ * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18
54
+ * @license Apache-2.0
55
+ */
56
+ class BaseCanvasFactory {
57
+ #enableHWA = false;
58
+ constructor({ enableHWA = false } = {}) {
59
+ this.#enableHWA = enableHWA;
60
+ }
61
+ create(width, height) {
62
+ const canvas = this._createCanvas(width, height);
63
+ return {
64
+ canvas,
65
+ context: canvas.getContext("2d", {
66
+ willReadFrequently: !this.#enableHWA
67
+ })
68
+ };
69
+ }
70
+ reset({ canvas }, width, height) {
71
+ if (!canvas) {
72
+ throw new Error("Canvas is not specified");
73
+ }
74
+ canvas.width = width;
75
+ canvas.height = height;
76
+ }
77
+ destroy(context) {
78
+ if (!context.canvas) {
79
+ throw new Error("Canvas is not specified");
80
+ }
81
+ context.canvas.width = 0;
82
+ context.canvas.height = 0;
83
+ context.canvas = void 0;
84
+ context.context = void 0;
85
+ }
86
+ // eslint-disable-next-line unused-imports/no-unused-vars
87
+ _createCanvas(width, height) {
88
+ throw new Error("Not implemented");
89
+ }
90
+ }
91
+ /**
92
+ * Derived from the PDF.js project by the Mozilla Foundation.
93
+ * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18
94
+ * @license Apache-2.0
95
+ */
96
+ class DOMCanvasFactory extends BaseCanvasFactory {
97
+ _document;
98
+ constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {
99
+ super({ enableHWA });
100
+ this._document = ownerDocument;
101
+ }
102
+ _createCanvas(width, height) {
103
+ const canvas = this._document.createElement("canvas");
104
+ canvas.width = width;
105
+ canvas.height = height;
106
+ return canvas;
107
+ }
108
+ }
109
+ class NodeCanvasFactory extends BaseCanvasFactory {
110
+ constructor({ enableHWA = false } = {}) {
111
+ super({ enableHWA });
112
+ }
113
+ _createCanvas(width, height) {
114
+ if (!canvasModule) {
115
+ throw new Error("@napi-rs/canvas module is not resolved");
116
+ }
117
+ return canvasModule.createCanvas(width, height);
118
+ }
119
+ }
120
+ async function resolveCanvasModule(canvasImport) {
121
+ canvasModule ??= await interopDefault(canvasImport());
122
+ }
123
+ function injectCanvasConstructors() {
124
+ if (!canvasModule)
125
+ return;
126
+ globalThis.DOMMatrix ??= canvasModule.DOMMatrix;
127
+ globalThis.ImageData ??= canvasModule.ImageData;
128
+ globalThis.Path2D ??= canvasModule.Path2D;
129
+ }
130
+
53
131
  async function extractImages$1(data, pageNumber) {
54
132
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
55
133
  if (pageNumber < 1 || pageNumber > pdf.numPages) {
@@ -86,74 +164,41 @@ async function extractImages$1(data, pageNumber) {
86
164
  return images;
87
165
  }
88
166
  async function renderPageAsImage$1(data, pageNumber, options = {}) {
89
- const canvasFactory = await createIsomorphicCanvasFactory(options.canvas);
90
- const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { canvasFactory });
167
+ const CanvasFactory = await createIsomorphicCanvasFactory(options.canvasImport);
168
+ const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { CanvasFactory });
91
169
  const page = await pdf.getPage(pageNumber);
92
170
  if (pageNumber < 1 || pageNumber > pdf.numPages) {
93
171
  throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
94
172
  }
95
- let outputScale = options.scale || 1;
96
- let viewport = page.getViewport({ scale: outputScale });
173
+ const defaultViewport = page.getViewport({ scale: 1 });
174
+ let scale = options.scale || 1;
97
175
  if (options.width) {
98
- outputScale = options.width / viewport.width;
176
+ scale = options.width / defaultViewport.width;
99
177
  } else if (options.height) {
100
- outputScale = options.height / viewport.height;
178
+ scale = options.height / defaultViewport.height;
101
179
  }
102
- if (outputScale !== 1 && outputScale > 0) {
103
- viewport = page.getViewport({ scale: outputScale });
104
- }
105
- const ctx = canvasFactory.create(viewport.width, viewport.height);
180
+ const viewport = page.getViewport({ scale: Math.max(0, scale) });
181
+ const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);
106
182
  await page.render({
107
- canvasContext: ctx.context,
183
+ canvasContext: drawingContext.context,
108
184
  viewport
109
185
  }).promise;
110
- const dataUrl = isBrowser ? ctx.canvas.toDataURL() : ctx.canvas.toDataURL();
186
+ const dataUrl = drawingContext.canvas.toDataURL();
111
187
  const response = await fetch(dataUrl);
112
188
  return await response.arrayBuffer();
113
189
  }
114
- async function createIsomorphicCanvasFactory(canvas) {
115
- const _canvas = canvas ? await interopDefault(canvas()) : void 0;
116
- return {
117
- _createCanvas(width, height) {
118
- if (isBrowser) {
119
- const canvas2 = document.createElement("canvas");
120
- canvas2.width = width;
121
- canvas2.height = height;
122
- return canvas2;
123
- }
124
- if (isNode) {
125
- if (!_canvas) {
126
- throw new Error('Failed to resolve "canvas" package.');
127
- }
128
- return _canvas.createCanvas(width, height);
129
- }
130
- throw new Error("Unsupported environment for canvas creation.");
131
- },
132
- create(width, height) {
133
- const _canvas2 = this._createCanvas(width, height);
134
- const context = _canvas2.getContext(
135
- "2d"
136
- );
137
- return {
138
- canvas: _canvas2,
139
- context
140
- };
141
- },
142
- reset(ctx, width, height) {
143
- if (ctx.canvas) {
144
- ctx.canvas.width = width;
145
- ctx.canvas.height = height;
146
- }
147
- },
148
- destroy(ctx) {
149
- if (ctx.canvas) {
150
- ctx.canvas.width = 0;
151
- ctx.canvas.height = 0;
152
- }
153
- ctx.canvas = void 0;
154
- ctx.context = void 0;
190
+ async function createIsomorphicCanvasFactory(canvasImport) {
191
+ if (isBrowser)
192
+ return DOMCanvasFactory;
193
+ if (isNode) {
194
+ if (!canvasImport) {
195
+ throw new Error('Parameter "canvasImport" is required in Node.js environment.');
155
196
  }
156
- };
197
+ await resolveCanvasModule(canvasImport);
198
+ injectCanvasConstructors();
199
+ return NodeCanvasFactory;
200
+ }
201
+ throw new Error("Unsupported environment for canvas creation.");
157
202
  }
158
203
 
159
204
  async function getMeta$1(data) {
@@ -166,7 +211,7 @@ async function getMeta$1(data) {
166
211
  }
167
212
 
168
213
  async function extractText$1(data, options = {}) {
169
- const { mergePages = false } = { ...options };
214
+ const { mergePages = false } = options;
170
215
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
171
216
  const texts = await Promise.all(
172
217
  Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
@@ -182,28 +227,28 @@ async function getPageText(document, pageNumber) {
182
227
  return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? "\n" : "")).join("");
183
228
  }
184
229
 
230
+ async function definePDFJSModule(pdfjs) {
231
+ await resolvePDFJSImport(pdfjs, { reload: true });
232
+ }
185
233
  async function configureUnPDF(options) {
186
- const { pdfjs } = { ...options };
187
- if (pdfjs) {
188
- await resolvePDFJSImports(pdfjs, { force: true });
189
- }
234
+ await resolvePDFJSImport(options.pdfjs, { reload: true });
190
235
  }
191
236
 
192
237
  const getMeta = async (...args) => {
193
- await resolvePDFJSImports();
238
+ await resolvePDFJSImport();
194
239
  return await getMeta$1(...args);
195
240
  };
196
241
  const extractText = async (...args) => {
197
- await resolvePDFJSImports();
242
+ await resolvePDFJSImport();
198
243
  return await extractText$1(...args);
199
244
  };
200
245
  const extractImages = async (...args) => {
201
- await resolvePDFJSImports();
246
+ await resolvePDFJSImport();
202
247
  return await extractImages$1(...args);
203
248
  };
204
249
  const renderPageAsImage = async (...args) => {
205
- await resolvePDFJSImports();
250
+ await resolvePDFJSImport();
206
251
  return await renderPageAsImage$1(...args);
207
252
  };
208
253
 
209
- export { configureUnPDF, createIsomorphicCanvasFactory, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImports };
254
+ export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };