unpdf 0.12.1 → 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 +135 -75
  3. package/dist/index.d.cts +46 -36
  4. package/dist/index.d.mts +46 -36
  5. package/dist/index.d.ts +46 -36
  6. package/dist/index.mjs +134 -74
  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,31 +1,38 @@
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
 
6
- declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<Uint8ClampedArray[]>;
5
+ interface ExtractedImageObject {
6
+ data: Uint8ClampedArray;
7
+ width: number;
8
+ height: number;
9
+ channels: 1 | 3 | 4;
10
+ key: string;
11
+ }
12
+ /**
13
+ * Extracts images from a specific page of a PDF document, including necessary metadata,
14
+ * such as width, height, and calculated color channels.
15
+ *
16
+ * @example
17
+ * const imagesData = await extractImages(pdf, pageNum)
18
+ *
19
+ * for (const imgData of imagesData) {
20
+ * const imageIndex = totalImagesProcessed + 1
21
+ * await sharp(imgData.data, {
22
+ * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
23
+ * })
24
+ * .png()
25
+ * .toFile(`${imageIndex}.png`)
26
+ * }
27
+ */
28
+ declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
7
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
8
- canvas?: () => Promise<typeof canvas>;
9
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
10
32
  scale?: number;
11
33
  width?: number;
12
34
  height?: number;
13
35
  }): Promise<ArrayBuffer>;
14
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
15
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
16
- create(width: number, height: number): {
17
- canvas: Canvas | HTMLCanvasElement;
18
- context: CanvasRenderingContext2D;
19
- };
20
- reset(ctx: {
21
- canvas?: Canvas;
22
- context?: CanvasRenderingContext2D;
23
- }, width: number, height: number): void;
24
- destroy(ctx: {
25
- canvas?: Canvas;
26
- context?: CanvasRenderingContext2D;
27
- }): void;
28
- }>;
29
36
 
30
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
31
38
  info: Record<string, any>;
@@ -45,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
45
52
  text: string;
46
53
  }>;
47
54
 
48
- type PDFJS = typeof _PDFJS;
49
- interface UnPDFConfiguration {
50
- /**
51
- * By default, UnPDF will use the latest version of PDF.js compiled for
52
- * serverless environments. If you want to use a different version, you can
53
- * provide a custom resolver function.
54
- *
55
- * @example
56
- * // Use the official PDF.js build (make sure to install it first)
57
- * () => import('pdfjs-dist')
58
- */
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: {
59
69
  pdfjs?: () => Promise<any>;
60
- }
70
+ }): Promise<void>;
61
71
 
62
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
63
73
 
64
74
  /**
65
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -70,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
70
80
  */
71
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
72
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
73
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
74
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
75
85
  }): Promise<void>;
76
86
 
77
87
  declare const getMeta: typeof getMeta$1;
@@ -79,4 +89,4 @@ declare const extractText: typeof extractText$1;
79
89
  declare const extractImages: typeof extractImages$1;
80
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
81
91
 
82
- 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,31 +1,38 @@
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
 
6
- declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<Uint8ClampedArray[]>;
5
+ interface ExtractedImageObject {
6
+ data: Uint8ClampedArray;
7
+ width: number;
8
+ height: number;
9
+ channels: 1 | 3 | 4;
10
+ key: string;
11
+ }
12
+ /**
13
+ * Extracts images from a specific page of a PDF document, including necessary metadata,
14
+ * such as width, height, and calculated color channels.
15
+ *
16
+ * @example
17
+ * const imagesData = await extractImages(pdf, pageNum)
18
+ *
19
+ * for (const imgData of imagesData) {
20
+ * const imageIndex = totalImagesProcessed + 1
21
+ * await sharp(imgData.data, {
22
+ * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
23
+ * })
24
+ * .png()
25
+ * .toFile(`${imageIndex}.png`)
26
+ * }
27
+ */
28
+ declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
7
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
8
- canvas?: () => Promise<typeof canvas>;
9
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
10
32
  scale?: number;
11
33
  width?: number;
12
34
  height?: number;
13
35
  }): Promise<ArrayBuffer>;
14
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
15
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
16
- create(width: number, height: number): {
17
- canvas: Canvas | HTMLCanvasElement;
18
- context: CanvasRenderingContext2D;
19
- };
20
- reset(ctx: {
21
- canvas?: Canvas;
22
- context?: CanvasRenderingContext2D;
23
- }, width: number, height: number): void;
24
- destroy(ctx: {
25
- canvas?: Canvas;
26
- context?: CanvasRenderingContext2D;
27
- }): void;
28
- }>;
29
36
 
30
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
31
38
  info: Record<string, any>;
@@ -45,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
45
52
  text: string;
46
53
  }>;
47
54
 
48
- type PDFJS = typeof _PDFJS;
49
- interface UnPDFConfiguration {
50
- /**
51
- * By default, UnPDF will use the latest version of PDF.js compiled for
52
- * serverless environments. If you want to use a different version, you can
53
- * provide a custom resolver function.
54
- *
55
- * @example
56
- * // Use the official PDF.js build (make sure to install it first)
57
- * () => import('pdfjs-dist')
58
- */
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: {
59
69
  pdfjs?: () => Promise<any>;
60
- }
70
+ }): Promise<void>;
61
71
 
62
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
63
73
 
64
74
  /**
65
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -70,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
70
80
  */
71
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
72
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
73
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
74
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
75
85
  }): Promise<void>;
76
86
 
77
87
  declare const getMeta: typeof getMeta$1;
@@ -79,4 +89,4 @@ declare const extractText: typeof extractText$1;
79
89
  declare const extractImages: typeof extractImages$1;
80
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
81
91
 
82
- 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,31 +1,38 @@
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
 
6
- declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<Uint8ClampedArray[]>;
5
+ interface ExtractedImageObject {
6
+ data: Uint8ClampedArray;
7
+ width: number;
8
+ height: number;
9
+ channels: 1 | 3 | 4;
10
+ key: string;
11
+ }
12
+ /**
13
+ * Extracts images from a specific page of a PDF document, including necessary metadata,
14
+ * such as width, height, and calculated color channels.
15
+ *
16
+ * @example
17
+ * const imagesData = await extractImages(pdf, pageNum)
18
+ *
19
+ * for (const imgData of imagesData) {
20
+ * const imageIndex = totalImagesProcessed + 1
21
+ * await sharp(imgData.data, {
22
+ * raw: { width: imgData.width, height: imgData.height, channels: imgData.channels }
23
+ * })
24
+ * .png()
25
+ * .toFile(`${imageIndex}.png`)
26
+ * }
27
+ */
28
+ declare function extractImages$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number): Promise<ExtractedImageObject[]>;
7
29
  declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, pageNumber: number, options?: {
8
- canvas?: () => Promise<typeof canvas>;
9
- /** @default 1 */
30
+ canvasImport?: () => Promise<typeof _napi_rs_canvas>;
31
+ /** @default 1.0 */
10
32
  scale?: number;
11
33
  width?: number;
12
34
  height?: number;
13
35
  }): Promise<ArrayBuffer>;
14
- declare function createIsomorphicCanvasFactory(canvas?: () => Promise<typeof canvas>): Promise<{
15
- _createCanvas(width: number, height: number): Canvas | HTMLCanvasElement;
16
- create(width: number, height: number): {
17
- canvas: Canvas | HTMLCanvasElement;
18
- context: CanvasRenderingContext2D;
19
- };
20
- reset(ctx: {
21
- canvas?: Canvas;
22
- context?: CanvasRenderingContext2D;
23
- }, width: number, height: number): void;
24
- destroy(ctx: {
25
- canvas?: Canvas;
26
- context?: CanvasRenderingContext2D;
27
- }): void;
28
- }>;
29
36
 
30
37
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
31
38
  info: Record<string, any>;
@@ -45,21 +52,24 @@ declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumen
45
52
  text: string;
46
53
  }>;
47
54
 
48
- type PDFJS = typeof _PDFJS;
49
- interface UnPDFConfiguration {
50
- /**
51
- * By default, UnPDF will use the latest version of PDF.js compiled for
52
- * serverless environments. If you want to use a different version, you can
53
- * provide a custom resolver function.
54
- *
55
- * @example
56
- * // Use the official PDF.js build (make sure to install it first)
57
- * () => import('pdfjs-dist')
58
- */
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: {
59
69
  pdfjs?: () => Promise<any>;
60
- }
70
+ }): Promise<void>;
61
71
 
62
- declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
72
+ type PDFJS = typeof _PDFJS;
63
73
 
64
74
  /**
65
75
  * Returns a PDFDocumentProxy instance from a given binary data.
@@ -70,8 +80,8 @@ declare function configureUnPDF(options: UnPDFConfiguration): Promise<void>;
70
80
  */
71
81
  declare function getDocumentProxy(data: DocumentInitParameters['data'], options?: DocumentInitParameters): Promise<PDFDocumentProxy>;
72
82
  declare function getResolvedPDFJS(): Promise<PDFJS>;
73
- declare function resolvePDFJSImports(pdfjsResolver?: () => Promise<any>, { force }?: {
74
- force?: boolean | undefined;
83
+ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload }?: {
84
+ reload?: boolean | undefined;
75
85
  }): Promise<void>;
76
86
 
77
87
  declare const getMeta: typeof getMeta$1;
@@ -79,4 +89,4 @@ declare const extractText: typeof extractText$1;
79
89
  declare const extractImages: typeof extractImages$1;
80
90
  declare const renderPageAsImage: typeof renderPageAsImage$1;
81
91
 
82
- 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,12 +47,93 @@ 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
- const page = await pdf.getPage(pageNumber);
56
133
  if (pageNumber < 1 || pageNumber > pdf.numPages) {
57
134
  throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
58
135
  }
136
+ const page = await pdf.getPage(pageNumber);
59
137
  const operatorList = await page.getOperatorList();
60
138
  const { OPS } = await getResolvedPDFJS();
61
139
  const images = [];
@@ -66,79 +144,61 @@ async function extractImages$1(data, pageNumber) {
66
144
  }
67
145
  const imageKey = operatorList.argsArray[i][0];
68
146
  const image = await page.objs.get(imageKey);
69
- images.push(image.data);
147
+ if (!image || !image.data || !image.width || !image.height) {
148
+ continue;
149
+ }
150
+ const { width, height, data: data2 } = image;
151
+ const calculatedChannels = data2.length / (width * height);
152
+ if (![1, 3, 4].includes(calculatedChannels)) {
153
+ continue;
154
+ }
155
+ const channels = calculatedChannels;
156
+ images.push({
157
+ data: data2,
158
+ width,
159
+ height,
160
+ channels,
161
+ key: imageKey
162
+ });
70
163
  }
71
164
  return images;
72
165
  }
73
166
  async function renderPageAsImage$1(data, pageNumber, options = {}) {
74
- const canvasFactory = await createIsomorphicCanvasFactory(options.canvas);
75
- 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 });
76
169
  const page = await pdf.getPage(pageNumber);
77
170
  if (pageNumber < 1 || pageNumber > pdf.numPages) {
78
171
  throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
79
172
  }
80
- let outputScale = options.scale || 1;
81
- let viewport = page.getViewport({ scale: outputScale });
173
+ const defaultViewport = page.getViewport({ scale: 1 });
174
+ let scale = options.scale || 1;
82
175
  if (options.width) {
83
- outputScale = options.width / viewport.width;
176
+ scale = options.width / defaultViewport.width;
84
177
  } else if (options.height) {
85
- outputScale = options.height / viewport.height;
86
- }
87
- if (outputScale !== 1 && outputScale > 0) {
88
- viewport = page.getViewport({ scale: outputScale });
178
+ scale = options.height / defaultViewport.height;
89
179
  }
90
- 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);
91
182
  await page.render({
92
- canvasContext: ctx.context,
183
+ canvasContext: drawingContext.context,
93
184
  viewport
94
185
  }).promise;
95
- const dataUrl = isBrowser ? ctx.canvas.toDataURL() : ctx.canvas.toDataURL();
186
+ const dataUrl = drawingContext.canvas.toDataURL();
96
187
  const response = await fetch(dataUrl);
97
188
  return await response.arrayBuffer();
98
189
  }
99
- async function createIsomorphicCanvasFactory(canvas) {
100
- const _canvas = canvas ? await interopDefault(canvas()) : void 0;
101
- return {
102
- _createCanvas(width, height) {
103
- if (isBrowser) {
104
- const canvas2 = document.createElement("canvas");
105
- canvas2.width = width;
106
- canvas2.height = height;
107
- return canvas2;
108
- }
109
- if (isNode) {
110
- if (!_canvas) {
111
- throw new Error('Failed to resolve "canvas" package.');
112
- }
113
- return _canvas.createCanvas(width, height);
114
- }
115
- throw new Error("Unsupported environment for canvas creation.");
116
- },
117
- create(width, height) {
118
- const _canvas2 = this._createCanvas(width, height);
119
- const context = _canvas2.getContext(
120
- "2d"
121
- );
122
- return {
123
- canvas: _canvas2,
124
- context
125
- };
126
- },
127
- reset(ctx, width, height) {
128
- if (ctx.canvas) {
129
- ctx.canvas.width = width;
130
- ctx.canvas.height = height;
131
- }
132
- },
133
- destroy(ctx) {
134
- if (ctx.canvas) {
135
- ctx.canvas.width = 0;
136
- ctx.canvas.height = 0;
137
- }
138
- ctx.canvas = void 0;
139
- 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.');
140
196
  }
141
- };
197
+ await resolveCanvasModule(canvasImport);
198
+ injectCanvasConstructors();
199
+ return NodeCanvasFactory;
200
+ }
201
+ throw new Error("Unsupported environment for canvas creation.");
142
202
  }
143
203
 
144
204
  async function getMeta$1(data) {
@@ -151,7 +211,7 @@ async function getMeta$1(data) {
151
211
  }
152
212
 
153
213
  async function extractText$1(data, options = {}) {
154
- const { mergePages = false } = { ...options };
214
+ const { mergePages = false } = options;
155
215
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
156
216
  const texts = await Promise.all(
157
217
  Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
@@ -167,28 +227,28 @@ async function getPageText(document, pageNumber) {
167
227
  return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? "\n" : "")).join("");
168
228
  }
169
229
 
230
+ async function definePDFJSModule(pdfjs) {
231
+ await resolvePDFJSImport(pdfjs, { reload: true });
232
+ }
170
233
  async function configureUnPDF(options) {
171
- const { pdfjs } = { ...options };
172
- if (pdfjs) {
173
- await resolvePDFJSImports(pdfjs, { force: true });
174
- }
234
+ await resolvePDFJSImport(options.pdfjs, { reload: true });
175
235
  }
176
236
 
177
237
  const getMeta = async (...args) => {
178
- await resolvePDFJSImports();
238
+ await resolvePDFJSImport();
179
239
  return await getMeta$1(...args);
180
240
  };
181
241
  const extractText = async (...args) => {
182
- await resolvePDFJSImports();
242
+ await resolvePDFJSImport();
183
243
  return await extractText$1(...args);
184
244
  };
185
245
  const extractImages = async (...args) => {
186
- await resolvePDFJSImports();
246
+ await resolvePDFJSImport();
187
247
  return await extractImages$1(...args);
188
248
  };
189
249
  const renderPageAsImage = async (...args) => {
190
- await resolvePDFJSImports();
250
+ await resolvePDFJSImport();
191
251
  return await renderPageAsImage$1(...args);
192
252
  };
193
253
 
194
- export { configureUnPDF, createIsomorphicCanvasFactory, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImports };
254
+ export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };