@vue-pdf-viewer/viewer 0.0.0-experimental.13 → 0.0.0-experimental.14

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.
@@ -0,0 +1,21 @@
1
+ import type { AnnotationStamp } from '@/utils/types';
2
+ import type { PDFPageProxy, PageViewport } from 'pdfjs-dist';
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
4
+ page: PDFPageProxy;
5
+ viewport: PageViewport;
6
+ annotation: AnnotationStamp;
7
+ }>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
8
+ page: PDFPageProxy;
9
+ viewport: PageViewport;
10
+ annotation: AnnotationStamp;
11
+ }>>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
12
+ export default _default;
13
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
14
+ type __VLS_TypePropsToRuntimeProps<T> = {
15
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
16
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
17
+ } : {
18
+ type: import('vue').PropType<T[K]>;
19
+ required: true;
20
+ };
21
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -2,6 +2,7 @@ import type { AnnotationEventPayload, TextLayerLoadedEventPayload, RotateEvent,
2
2
  import { ScrollMode, ViewMode, ZoomLevel } from '@/utils/enumerators';
3
3
  import '../style.scss';
4
4
  import '../assets/styles/annotation-highlight.scss';
5
+ import '../assets/styles/annotation-stamp.scss';
5
6
  import { Localization } from '@vue-pdf-viewer/shared';
6
7
  declare const _default: {
7
8
  new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<Readonly<import("vue").ExtractPropTypes<{
@@ -0,0 +1,435 @@
1
+ import { AnnotationStamp } from '@/utils/types';
2
+ import { type ImageData } from '@/utils/annotation-image';
3
+ import { type PDFPageProxy } from 'pdfjs-dist';
4
+ import { Ref } from 'vue';
5
+ /**
6
+ * useAnnotationStamp - Extract bitmap data from stamp annotations with ImageManager
7
+ *
8
+ * PDF.js Canvas Flow:
9
+ * 1. pdf_page_view.draw() creates empty annotationCanvasMap
10
+ * 2. During rendering, CanvasGraphics.beginAnnotation() creates canvases for hasOwnCanvas annotations
11
+ * 3. annotationCanvasMap.set(id, canvas) stores canvas by annotation ID
12
+ * 4. AnnotationLayer.#setAnnotationCanvasMap() inserts canvases into DOM
13
+ * 5. We extract bitmaps using AnnotationImageManager for proper memory management
14
+ */
15
+ interface UseAnnotationStampProps {
16
+ page: Ref<PDFPageProxy>;
17
+ }
18
+ interface StampBitmapData {
19
+ id: string;
20
+ imageData: ImageData;
21
+ bitmapId: string;
22
+ width: number;
23
+ height: number;
24
+ rect: number[];
25
+ rotation: number;
26
+ pageIndex: number;
27
+ }
28
+ export declare const useAnnotationStamp: (props: UseAnnotationStampProps) => {
29
+ stampAnnotations: Ref<{
30
+ hasOwnCanvas: boolean;
31
+ pageIndex?: number | undefined;
32
+ annotationType: number;
33
+ color?: {
34
+ [x: number]: number;
35
+ readonly BYTES_PER_ELEMENT: number;
36
+ readonly buffer: {
37
+ readonly byteLength: number;
38
+ slice: (begin: number, end?: number | undefined) => ArrayBuffer;
39
+ readonly [Symbol.toStringTag]: string;
40
+ } | {
41
+ readonly byteLength: number;
42
+ slice: (begin: number, end?: number | undefined) => SharedArrayBuffer;
43
+ readonly [Symbol.species]: SharedArrayBuffer;
44
+ readonly [Symbol.toStringTag]: "SharedArrayBuffer";
45
+ };
46
+ readonly byteLength: number;
47
+ readonly byteOffset: number;
48
+ copyWithin: (target: number, start: number, end?: number | undefined) => Uint8ClampedArray;
49
+ every: (predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any) => boolean;
50
+ fill: (value: number, start?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
51
+ filter: (predicate: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any) => Uint8ClampedArray;
52
+ find: (predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any) => number | undefined;
53
+ findIndex: (predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any) => number;
54
+ forEach: (callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any) => void;
55
+ indexOf: (searchElement: number, fromIndex?: number | undefined) => number;
56
+ join: (separator?: string | undefined) => string;
57
+ lastIndexOf: (searchElement: number, fromIndex?: number | undefined) => number;
58
+ readonly length: number;
59
+ map: (callbackfn: (value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any) => Uint8ClampedArray;
60
+ reduce: {
61
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
62
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
63
+ <U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
64
+ };
65
+ reduceRight: {
66
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
67
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
68
+ <U_1>(callbackfn: (previousValue: U_1, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U_1, initialValue: U_1): U_1;
69
+ };
70
+ reverse: () => Uint8ClampedArray;
71
+ set: (array: ArrayLike<number>, offset?: number | undefined) => void;
72
+ slice: (start?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
73
+ some: (predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any) => boolean;
74
+ sort: (compareFn?: ((a: number, b: number) => number) | undefined) => Uint8ClampedArray;
75
+ subarray: (begin?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
76
+ toLocaleString: () => string;
77
+ toString: () => string;
78
+ valueOf: () => Uint8ClampedArray;
79
+ entries: () => IterableIterator<[number, number]>;
80
+ keys: () => IterableIterator<number>;
81
+ values: () => IterableIterator<number>;
82
+ includes: (searchElement: number, fromIndex?: number | undefined) => boolean;
83
+ at: (index: number) => number | undefined;
84
+ [Symbol.iterator]: () => IterableIterator<number>;
85
+ readonly [Symbol.toStringTag]: "Uint8ClampedArray";
86
+ } | undefined;
87
+ dest: string | [number | {
88
+ gen: number;
89
+ num: number;
90
+ }, {
91
+ name: string;
92
+ }, ...any[]];
93
+ hasAppearance: boolean;
94
+ id: string;
95
+ rect: number[];
96
+ subtype: string;
97
+ borderStyle: {
98
+ dashArray: number[];
99
+ horizontalCornerRadius: number;
100
+ style: number;
101
+ verticalCornerRadius: number;
102
+ width: number;
103
+ };
104
+ hasPopup?: boolean | undefined;
105
+ contents?: string | undefined;
106
+ contentsObj?: {
107
+ dir: string;
108
+ str: string;
109
+ } | undefined;
110
+ modificationDate?: string | undefined;
111
+ quadPoints?: any[] | undefined;
112
+ title?: string | undefined;
113
+ titleObj?: {
114
+ dir: string;
115
+ str: string;
116
+ } | undefined;
117
+ parentId?: string | undefined;
118
+ parentType?: string | undefined;
119
+ file?: {
120
+ content: {
121
+ [x: number]: number;
122
+ readonly BYTES_PER_ELEMENT: number;
123
+ readonly buffer: {
124
+ readonly byteLength: number;
125
+ slice: (begin: number, end?: number | undefined) => ArrayBuffer;
126
+ readonly [Symbol.toStringTag]: string;
127
+ } | {
128
+ readonly byteLength: number;
129
+ slice: (begin: number, end?: number | undefined) => SharedArrayBuffer;
130
+ readonly [Symbol.species]: SharedArrayBuffer;
131
+ readonly [Symbol.toStringTag]: "SharedArrayBuffer";
132
+ };
133
+ readonly byteLength: number;
134
+ readonly byteOffset: number;
135
+ copyWithin: (target: number, start: number, end?: number | undefined) => Uint8Array;
136
+ every: (predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any) => boolean;
137
+ fill: (value: number, start?: number | undefined, end?: number | undefined) => Uint8Array;
138
+ filter: (predicate: (value: number, index: number, array: Uint8Array) => any, thisArg?: any) => Uint8Array;
139
+ find: (predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any) => number | undefined;
140
+ findIndex: (predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any) => number;
141
+ forEach: (callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any) => void;
142
+ indexOf: (searchElement: number, fromIndex?: number | undefined) => number;
143
+ join: (separator?: string | undefined) => string;
144
+ lastIndexOf: (searchElement: number, fromIndex?: number | undefined) => number;
145
+ readonly length: number;
146
+ map: (callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any) => Uint8Array;
147
+ reduce: {
148
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
149
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
150
+ <U_2>(callbackfn: (previousValue: U_2, currentValue: number, currentIndex: number, array: Uint8Array) => U_2, initialValue: U_2): U_2;
151
+ };
152
+ reduceRight: {
153
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
154
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
155
+ <U_3>(callbackfn: (previousValue: U_3, currentValue: number, currentIndex: number, array: Uint8Array) => U_3, initialValue: U_3): U_3;
156
+ };
157
+ reverse: () => Uint8Array;
158
+ set: (array: ArrayLike<number>, offset?: number | undefined) => void;
159
+ slice: (start?: number | undefined, end?: number | undefined) => Uint8Array;
160
+ some: (predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any) => boolean;
161
+ sort: (compareFn?: ((a: number, b: number) => number) | undefined) => Uint8Array;
162
+ subarray: (begin?: number | undefined, end?: number | undefined) => Uint8Array;
163
+ toLocaleString: () => string;
164
+ toString: () => string;
165
+ valueOf: () => Uint8Array;
166
+ entries: () => IterableIterator<[number, number]>;
167
+ keys: () => IterableIterator<number>;
168
+ values: () => IterableIterator<number>;
169
+ includes: (searchElement: number, fromIndex?: number | undefined) => boolean;
170
+ at: (index: number) => number | undefined;
171
+ [Symbol.iterator]: () => IterableIterator<number>;
172
+ readonly [Symbol.toStringTag]: "Uint8Array";
173
+ };
174
+ filename: string;
175
+ } | undefined;
176
+ inkLists?: {
177
+ x: number;
178
+ y: number;
179
+ }[][] | undefined;
180
+ lineCoordinates: number[];
181
+ action?: string | undefined;
182
+ unsafeUrl?: string | undefined;
183
+ url?: string | undefined;
184
+ newWindow?: boolean | undefined;
185
+ vertices?: {
186
+ x: number;
187
+ y: number;
188
+ }[] | undefined;
189
+ name?: string | undefined;
190
+ fieldType: string;
191
+ pushButton: boolean;
192
+ }[], AnnotationStamp[] | {
193
+ hasOwnCanvas: boolean;
194
+ pageIndex?: number | undefined;
195
+ annotationType: number;
196
+ color?: {
197
+ [x: number]: number;
198
+ readonly BYTES_PER_ELEMENT: number;
199
+ readonly buffer: {
200
+ readonly byteLength: number;
201
+ slice: (begin: number, end?: number | undefined) => ArrayBuffer;
202
+ readonly [Symbol.toStringTag]: string;
203
+ } | {
204
+ readonly byteLength: number;
205
+ slice: (begin: number, end?: number | undefined) => SharedArrayBuffer;
206
+ readonly [Symbol.species]: SharedArrayBuffer;
207
+ readonly [Symbol.toStringTag]: "SharedArrayBuffer";
208
+ };
209
+ readonly byteLength: number;
210
+ readonly byteOffset: number;
211
+ copyWithin: (target: number, start: number, end?: number | undefined) => Uint8ClampedArray;
212
+ every: (predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any) => boolean;
213
+ fill: (value: number, start?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
214
+ filter: (predicate: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any) => Uint8ClampedArray;
215
+ find: (predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any) => number | undefined;
216
+ findIndex: (predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any) => number;
217
+ forEach: (callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any) => void;
218
+ indexOf: (searchElement: number, fromIndex?: number | undefined) => number;
219
+ join: (separator?: string | undefined) => string;
220
+ lastIndexOf: (searchElement: number, fromIndex?: number | undefined) => number;
221
+ readonly length: number;
222
+ map: (callbackfn: (value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any) => Uint8ClampedArray;
223
+ reduce: {
224
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
225
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
226
+ <U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
227
+ };
228
+ reduceRight: {
229
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
230
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
231
+ <U_1>(callbackfn: (previousValue: U_1, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U_1, initialValue: U_1): U_1;
232
+ };
233
+ reverse: () => Uint8ClampedArray;
234
+ set: (array: ArrayLike<number>, offset?: number | undefined) => void;
235
+ slice: (start?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
236
+ some: (predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any) => boolean;
237
+ sort: (compareFn?: ((a: number, b: number) => number) | undefined) => Uint8ClampedArray;
238
+ subarray: (begin?: number | undefined, end?: number | undefined) => Uint8ClampedArray;
239
+ toLocaleString: () => string;
240
+ toString: () => string;
241
+ valueOf: () => Uint8ClampedArray;
242
+ entries: () => IterableIterator<[number, number]>;
243
+ keys: () => IterableIterator<number>;
244
+ values: () => IterableIterator<number>;
245
+ includes: (searchElement: number, fromIndex?: number | undefined) => boolean;
246
+ at: (index: number) => number | undefined;
247
+ [Symbol.iterator]: () => IterableIterator<number>;
248
+ readonly [Symbol.toStringTag]: "Uint8ClampedArray";
249
+ } | undefined;
250
+ dest: string | [number | {
251
+ gen: number;
252
+ num: number;
253
+ }, {
254
+ name: string;
255
+ }, ...any[]];
256
+ hasAppearance: boolean;
257
+ id: string;
258
+ rect: number[];
259
+ subtype: string;
260
+ borderStyle: {
261
+ dashArray: number[];
262
+ horizontalCornerRadius: number;
263
+ style: number;
264
+ verticalCornerRadius: number;
265
+ width: number;
266
+ };
267
+ hasPopup?: boolean | undefined;
268
+ contents?: string | undefined;
269
+ contentsObj?: {
270
+ dir: string;
271
+ str: string;
272
+ } | undefined;
273
+ modificationDate?: string | undefined;
274
+ quadPoints?: any[] | undefined;
275
+ title?: string | undefined;
276
+ titleObj?: {
277
+ dir: string;
278
+ str: string;
279
+ } | undefined;
280
+ parentId?: string | undefined;
281
+ parentType?: string | undefined;
282
+ file?: {
283
+ content: {
284
+ [x: number]: number;
285
+ readonly BYTES_PER_ELEMENT: number;
286
+ readonly buffer: {
287
+ readonly byteLength: number;
288
+ slice: (begin: number, end?: number | undefined) => ArrayBuffer;
289
+ readonly [Symbol.toStringTag]: string;
290
+ } | {
291
+ readonly byteLength: number;
292
+ slice: (begin: number, end?: number | undefined) => SharedArrayBuffer;
293
+ readonly [Symbol.species]: SharedArrayBuffer;
294
+ readonly [Symbol.toStringTag]: "SharedArrayBuffer";
295
+ };
296
+ readonly byteLength: number;
297
+ readonly byteOffset: number;
298
+ copyWithin: (target: number, start: number, end?: number | undefined) => Uint8Array;
299
+ every: (predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any) => boolean;
300
+ fill: (value: number, start?: number | undefined, end?: number | undefined) => Uint8Array;
301
+ filter: (predicate: (value: number, index: number, array: Uint8Array) => any, thisArg?: any) => Uint8Array;
302
+ find: (predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any) => number | undefined;
303
+ findIndex: (predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any) => number;
304
+ forEach: (callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any) => void;
305
+ indexOf: (searchElement: number, fromIndex?: number | undefined) => number;
306
+ join: (separator?: string | undefined) => string;
307
+ lastIndexOf: (searchElement: number, fromIndex?: number | undefined) => number;
308
+ readonly length: number;
309
+ map: (callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any) => Uint8Array;
310
+ reduce: {
311
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
312
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
313
+ <U_2>(callbackfn: (previousValue: U_2, currentValue: number, currentIndex: number, array: Uint8Array) => U_2, initialValue: U_2): U_2;
314
+ };
315
+ reduceRight: {
316
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
317
+ (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
318
+ <U_3>(callbackfn: (previousValue: U_3, currentValue: number, currentIndex: number, array: Uint8Array) => U_3, initialValue: U_3): U_3;
319
+ };
320
+ reverse: () => Uint8Array;
321
+ set: (array: ArrayLike<number>, offset?: number | undefined) => void;
322
+ slice: (start?: number | undefined, end?: number | undefined) => Uint8Array;
323
+ some: (predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any) => boolean;
324
+ sort: (compareFn?: ((a: number, b: number) => number) | undefined) => Uint8Array;
325
+ subarray: (begin?: number | undefined, end?: number | undefined) => Uint8Array;
326
+ toLocaleString: () => string;
327
+ toString: () => string;
328
+ valueOf: () => Uint8Array;
329
+ entries: () => IterableIterator<[number, number]>;
330
+ keys: () => IterableIterator<number>;
331
+ values: () => IterableIterator<number>;
332
+ includes: (searchElement: number, fromIndex?: number | undefined) => boolean;
333
+ at: (index: number) => number | undefined;
334
+ [Symbol.iterator]: () => IterableIterator<number>;
335
+ readonly [Symbol.toStringTag]: "Uint8Array";
336
+ };
337
+ filename: string;
338
+ } | undefined;
339
+ inkLists?: {
340
+ x: number;
341
+ y: number;
342
+ }[][] | undefined;
343
+ lineCoordinates: number[];
344
+ action?: string | undefined;
345
+ unsafeUrl?: string | undefined;
346
+ url?: string | undefined;
347
+ newWindow?: boolean | undefined;
348
+ vertices?: {
349
+ x: number;
350
+ y: number;
351
+ }[] | undefined;
352
+ name?: string | undefined;
353
+ fieldType: string;
354
+ pushButton: boolean;
355
+ }[]>;
356
+ stampBitmaps: Ref<{
357
+ id: string;
358
+ imageData: {
359
+ bitmap: HTMLImageElement | {
360
+ readonly height: number;
361
+ readonly width: number;
362
+ close: () => void;
363
+ };
364
+ id: string;
365
+ refCounter: number;
366
+ isSvg: boolean;
367
+ url?: string | undefined;
368
+ file?: {
369
+ readonly lastModified: number;
370
+ readonly name: string;
371
+ readonly webkitRelativePath: string;
372
+ readonly size: number;
373
+ readonly type: string;
374
+ arrayBuffer: () => Promise<ArrayBuffer>;
375
+ slice: (start?: number | undefined, end?: number | undefined, contentType?: string | undefined) => Blob;
376
+ stream: () => ReadableStream<Uint8Array>;
377
+ text: () => Promise<string>;
378
+ } | undefined;
379
+ blobPromise?: {
380
+ then: <TResult1 = Blob, TResult2 = never>(onfulfilled?: ((value: Blob) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined) => Promise<TResult1 | TResult2>;
381
+ catch: <TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined) => Promise<Blob | TResult>;
382
+ finally: (onfinally?: (() => void) | null | undefined) => Promise<Blob>;
383
+ readonly [Symbol.toStringTag]: string;
384
+ } | undefined;
385
+ svgUrl?: string | undefined;
386
+ };
387
+ bitmapId: string;
388
+ width: number;
389
+ height: number;
390
+ rect: number[];
391
+ rotation: number;
392
+ pageIndex: number;
393
+ }[], StampBitmapData[] | {
394
+ id: string;
395
+ imageData: {
396
+ bitmap: HTMLImageElement | {
397
+ readonly height: number;
398
+ readonly width: number;
399
+ close: () => void;
400
+ };
401
+ id: string;
402
+ refCounter: number;
403
+ isSvg: boolean;
404
+ url?: string | undefined;
405
+ file?: {
406
+ readonly lastModified: number;
407
+ readonly name: string;
408
+ readonly webkitRelativePath: string;
409
+ readonly size: number;
410
+ readonly type: string;
411
+ arrayBuffer: () => Promise<ArrayBuffer>;
412
+ slice: (start?: number | undefined, end?: number | undefined, contentType?: string | undefined) => Blob;
413
+ stream: () => ReadableStream<Uint8Array>;
414
+ text: () => Promise<string>;
415
+ } | undefined;
416
+ blobPromise?: {
417
+ then: <TResult1 = Blob, TResult2 = never>(onfulfilled?: ((value: Blob) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined) => Promise<TResult1 | TResult2>;
418
+ catch: <TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined) => Promise<Blob | TResult>;
419
+ finally: (onfinally?: (() => void) | null | undefined) => Promise<Blob>;
420
+ readonly [Symbol.toStringTag]: string;
421
+ } | undefined;
422
+ svgUrl?: string | undefined;
423
+ };
424
+ bitmapId: string;
425
+ width: number;
426
+ height: number;
427
+ rect: number[];
428
+ rotation: number;
429
+ pageIndex: number;
430
+ }[]>;
431
+ annotationCanvasMap: import("vue").Reactive<Map<string, HTMLCanvasElement>>;
432
+ annotationImageManager: import("@/utils/annotation-image").AnnotationImageManager;
433
+ prepareStampElements: () => void;
434
+ };
435
+ export {};
@@ -1,6 +1,6 @@
1
1
  import type { MaybeRef } from 'vue';
2
2
  import type { PDFDestination, PDFOptions, PDFSrc } from '../utils/types';
3
- import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist/types/src/display/api';
3
+ import { type PDFDocumentProxy, type PDFPageProxy } from 'pdfjs-dist/types/src/display/api';
4
4
  /**
5
5
  * @typedef {Object} UsePDFParameters
6
6
  * @property {string} password
@@ -5,6 +5,7 @@ import type { HighlightMatchPosition, HighlightOptions, NormalizedKeyword, Offse
5
5
  import { AnnotationType } from './utils/enumerators';
6
6
  import { LicenseType, ScrollMode, ViewMode, ZoomLevel } from './components';
7
7
  import { HighlightColor } from '@vue-pdf-viewer/shared';
8
+ import { AnnotationImageManager } from './utils/annotation-image';
8
9
  export declare const CSS_CLASSES: {
9
10
  SELECTING: string;
10
11
  END_OF_CONTENT: string;
@@ -98,9 +99,12 @@ export declare const SLOT_ICON_DOWNLOAD: InjectionKey<Slot<any> | undefined>;
98
99
  export declare const SLOT_ICON_PRINT: InjectionKey<Slot<any> | undefined>;
99
100
  export declare const SLOT_ICON_FULLSCREEN: InjectionKey<Slot<any> | undefined>;
100
101
  export declare const SYMBOL_ANNOTATION_KEYS: {
102
+ ANNOTATION_IMAGE_MANAGER: InjectionKey<AnnotationImageManager>;
101
103
  ENABLE_ANNOTATION_EDITOR: InjectionKey<Ref<boolean, boolean>>;
102
104
  ACTIVE_ANNOTATION: InjectionKey<Ref<AnnotationType | null, AnnotationType | null>>;
103
105
  HIGHLIGHT_COLOR: InjectionKey<Ref<HighlightColor | null, HighlightColor | null>>;
106
+ ENABLE_ANNOTATION_IMAGE_EDITOR: InjectionKey<Ref<boolean, boolean>>;
107
+ SELECTED_IMAGE_ANNOTATION: InjectionKey<Ref<boolean, boolean>>;
104
108
  };
105
109
  export declare const FUNC_GO_TO_PAGE: InjectionKey<(page: number) => void>;
106
110
  export declare const LICENSE_DEFAULT: {
@@ -117,3 +121,8 @@ export declare const PDF_COMMENTS: InjectionKey<{
117
121
  export declare const ANNOTATION_CANVAS_MAP: InjectionKey<Reactive<Map<string, HTMLCanvasElement>>>;
118
122
  export declare const DEFAULT_VIEWER_STATE: Reactive<ViewerState>;
119
123
  export declare const SUPPORTED_IMAGE_MIME_TYPES: readonly ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"];
124
+ export declare const PIXELS_PER_INCH: {
125
+ CSS: number;
126
+ PDF: number;
127
+ PDF_TO_CSS_UNITS: number;
128
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Scale factors for the canvas, necessary with HiDPI displays.
3
+ */
4
+ export declare class OutputScale {
5
+ sx: number;
6
+ sy: number;
7
+ constructor();
8
+ /**
9
+ * @type {boolean} Returns `true` when scaling is required, `false` otherwise.
10
+ */
11
+ get scaled(): boolean;
12
+ /**
13
+ * @type {boolean} Returns `true` when scaling is symmetric,
14
+ * `false` otherwise.
15
+ */
16
+ get symmetric(): boolean;
17
+ /**
18
+ * @returns {boolean} Returns `true` if scaling was limited,
19
+ * `false` otherwise.
20
+ */
21
+ limitCanvas(width: number, height: number, maxPixels: number, maxDim: number, capAreaFactor?: number): boolean;
22
+ static get pixelRatio(): number;
23
+ static capPixels(maxPixels: number, capAreaFactor: number): number;
24
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * AnnotationImageManager - Based on PDF.js ImageManager
3
+ *
4
+ * Manages images used by annotation editors with memory optimization.
5
+ * Features:
6
+ * - Caching with reference counting
7
+ * - Memory management (converts to blob when not in use)
8
+ * - Multiple image sources: File, URL, Blob, Canvas
9
+ * - SVG support with aspect ratio preservation
10
+ * - Unique ID generation and validation
11
+ */
12
+ export interface ImageData {
13
+ bitmap: ImageBitmap | HTMLImageElement;
14
+ id: string;
15
+ refCounter: number;
16
+ isSvg: boolean;
17
+ url?: string;
18
+ file?: File;
19
+ blobPromise?: Promise<Blob>;
20
+ svgUrl?: string;
21
+ }
22
+ export interface ImageManagerOptions {
23
+ baseId?: string;
24
+ }
25
+ /**
26
+ * Utility function to generate unique IDs
27
+ */
28
+ declare function generateUuid(): string;
29
+ /**
30
+ * Utility function to fetch data from URL
31
+ */
32
+ declare function fetchImageData(url: string): Promise<Blob>;
33
+ declare function isSVGFittingCanvas(): Promise<boolean>;
34
+ export declare class AnnotationImageManager {
35
+ private readonly baseId;
36
+ private idCounter;
37
+ private cache;
38
+ constructor(options?: ImageManagerOptions);
39
+ /**
40
+ * Get image data from cache or create new entry
41
+ */
42
+ private get;
43
+ /**
44
+ * Handle SVG image loading with aspect ratio preservation
45
+ */
46
+ private handleSvgImage;
47
+ /**
48
+ * Get image from File object
49
+ */
50
+ getFromFile(file: File): Promise<ImageData | null>;
51
+ /**
52
+ * Get image from URL
53
+ */
54
+ getFromUrl(url: string): Promise<ImageData | null>;
55
+ /**
56
+ * Get image from Blob with custom ID
57
+ */
58
+ getFromBlob(id: string, blobPromise: Promise<Blob>): Promise<ImageData | null>;
59
+ /**
60
+ * Get image by ID (restore from cache)
61
+ */
62
+ getFromId(id: string): Promise<ImageData | null>;
63
+ /**
64
+ * Get image from Canvas element
65
+ */
66
+ getFromCanvas(id: string, canvas: HTMLCanvasElement): ImageData;
67
+ /**
68
+ * Get SVG URL by ID
69
+ */
70
+ getSvgUrl(id: string): string | null;
71
+ /**
72
+ * Delete image by ID (decrement reference counter)
73
+ */
74
+ deleteId(id: string): void;
75
+ /**
76
+ * Check if ID belongs to this manager
77
+ */
78
+ isValidId(id: string): boolean;
79
+ /**
80
+ * Get all cached image IDs
81
+ */
82
+ getCachedIds(): string[];
83
+ /**
84
+ * Get cache statistics
85
+ */
86
+ getCacheStats(): {
87
+ totalImages: number;
88
+ loadedImages: number;
89
+ totalMemory: number;
90
+ };
91
+ /**
92
+ * Clear all cached images
93
+ */
94
+ clear(): void;
95
+ /**
96
+ * Convert ImageBitmap to data URL (for export/clipboard)
97
+ */
98
+ bitmapToDataUrl(imageData: ImageData): Promise<string>;
99
+ /**
100
+ * Create ImageBitmap from existing ImageData for serialization
101
+ */
102
+ serializeBitmap(imageData: ImageData, options?: {
103
+ width?: number;
104
+ height?: number;
105
+ preserveAspectRatio?: boolean;
106
+ }): Promise<ImageBitmap>;
107
+ }
108
+ export declare const annotationImageManager: AnnotationImageManager;
109
+ export { generateUuid, fetchImageData, isSVGFittingCanvas };
@@ -701,4 +701,8 @@ export interface AnnotationHighlight extends Annotation {
701
701
  deleted?: boolean;
702
702
  pageIndex?: number;
703
703
  }
704
+ export interface AnnotationStamp extends Annotation {
705
+ hasOwnCanvas: boolean;
706
+ pageIndex?: number;
707
+ }
704
708
  export {};
@@ -14,3 +14,4 @@ export declare function calculateScale(container: HTMLElement, pageHeight: numbe
14
14
  export declare const getPdfDate: (date: string) => string | Date;
15
15
  export declare const cssTextToObject: (cssText: string) => Record<string, string>;
16
16
  export declare function rectBoundingBox(x0: number, y0: number, x1: number, y1: number, minMax: number[]): void;
17
+ export declare function MathClamp(v: number, min: number, max: number): number;