@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.
- package/dist/index.js +7550 -6801
- package/dist/index.umd.cjs +15 -15
- package/dist/types/components/LayerAnnotationEditorImage.vue.d.ts +21 -0
- package/dist/types/components/LayerAnnotationStampResizer.vue.d.ts +2 -0
- package/dist/types/components/VPdfViewer.vue.d.ts +1 -0
- package/dist/types/composables/useAnnotationStamp.d.ts +435 -0
- package/dist/types/composables/usePdf.d.ts +1 -1
- package/dist/types/const.d.ts +9 -0
- package/dist/types/utils/annotation-display.d.ts +24 -0
- package/dist/types/utils/annotation-image.d.ts +109 -0
- package/dist/types/utils/types.d.ts +4 -0
- package/dist/types/utils.d.ts +1 -0
- package/package.json +2 -2
|
@@ -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
|
|
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
|
package/dist/types/const.d.ts
CHANGED
|
@@ -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 };
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -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;
|