@epam/pdf-highlighter-kit 0.0.1

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 (77) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +219 -0
  3. package/dist/PDFHighlightViewer.d.ts +219 -0
  4. package/dist/PDFHighlightViewer.d.ts.map +1 -0
  5. package/dist/PDFHighlightViewer.js +1551 -0
  6. package/dist/PDFHighlightViewer.js.map +1 -0
  7. package/dist/api.d.ts +59 -0
  8. package/dist/api.d.ts.map +1 -0
  9. package/dist/api.js +2 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/config.d.ts +12 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +32 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/core/interaction-handler.d.ts +63 -0
  16. package/dist/core/interaction-handler.d.ts.map +1 -0
  17. package/dist/core/interaction-handler.js +430 -0
  18. package/dist/core/interaction-handler.js.map +1 -0
  19. package/dist/core/pdf-engine.d.ts +37 -0
  20. package/dist/core/pdf-engine.d.ts.map +1 -0
  21. package/dist/core/pdf-engine.js +281 -0
  22. package/dist/core/pdf-engine.js.map +1 -0
  23. package/dist/core/performance-optimizer.d.ts +91 -0
  24. package/dist/core/performance-optimizer.d.ts.map +1 -0
  25. package/dist/core/performance-optimizer.js +473 -0
  26. package/dist/core/performance-optimizer.js.map +1 -0
  27. package/dist/core/style-manager.d.ts +88 -0
  28. package/dist/core/style-manager.d.ts.map +1 -0
  29. package/dist/core/style-manager.js +413 -0
  30. package/dist/core/style-manager.js.map +1 -0
  31. package/dist/core/text-segmentation.d.ts +41 -0
  32. package/dist/core/text-segmentation.d.ts.map +1 -0
  33. package/dist/core/text-segmentation.js +338 -0
  34. package/dist/core/text-segmentation.js.map +1 -0
  35. package/dist/core/unified-layer-builder.d.ts +27 -0
  36. package/dist/core/unified-layer-builder.d.ts.map +1 -0
  37. package/dist/core/unified-layer-builder.js +331 -0
  38. package/dist/core/unified-layer-builder.js.map +1 -0
  39. package/dist/core/viewport-manager.d.ts +103 -0
  40. package/dist/core/viewport-manager.d.ts.map +1 -0
  41. package/dist/core/viewport-manager.js +222 -0
  42. package/dist/core/viewport-manager.js.map +1 -0
  43. package/dist/index.d.ts +27 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +57 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/pdf-highlight-viewer.css +488 -0
  48. package/dist/types.d.ts +279 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -0
  52. package/dist/utils/highlight-adapter.d.ts +31 -0
  53. package/dist/utils/highlight-adapter.d.ts.map +1 -0
  54. package/dist/utils/highlight-adapter.js +202 -0
  55. package/dist/utils/highlight-adapter.js.map +1 -0
  56. package/dist/utils/pdf-utils.d.ts +14 -0
  57. package/dist/utils/pdf-utils.d.ts.map +1 -0
  58. package/dist/utils/pdf-utils.js +120 -0
  59. package/dist/utils/pdf-utils.js.map +1 -0
  60. package/dist/utils/worker-loader-simple.d.ts +8 -0
  61. package/dist/utils/worker-loader-simple.d.ts.map +1 -0
  62. package/dist/utils/worker-loader-simple.js +65 -0
  63. package/dist/utils/worker-loader-simple.js.map +1 -0
  64. package/dist/vite.config.d.ts +3 -0
  65. package/dist/vite.config.d.ts.map +1 -0
  66. package/dist/vite.config.js +20 -0
  67. package/dist/vite.config.js.map +1 -0
  68. package/dist/vitest.config.d.ts +3 -0
  69. package/dist/vitest.config.d.ts.map +1 -0
  70. package/dist/vitest.config.js +24 -0
  71. package/dist/vitest.config.js.map +1 -0
  72. package/dist/vitest.setup.d.ts +2 -0
  73. package/dist/vitest.setup.d.ts.map +1 -0
  74. package/dist/vitest.setup.js +8 -0
  75. package/dist/vitest.setup.js.map +1 -0
  76. package/package.json +74 -0
  77. package/styles/pdf-highlight-viewer.css +488 -0
@@ -0,0 +1,281 @@
1
+ import * as pdfjsLib from 'pdfjs-dist';
2
+ import { normalizePDFSource, validateBase64PDF, extractPDFMetadata, detectPDFSourceType, } from '../utils/pdf-utils';
3
+ if (!pdfjsLib.GlobalWorkerOptions.workerSrc) {
4
+ pdfjsLib.GlobalWorkerOptions.workerSrc =
5
+ 'https://unpkg.com/pdfjs-dist@5.4.149/build/pdf.worker.min.mjs';
6
+ console.log('PDF.js worker configured to CDN:', pdfjsLib.GlobalWorkerOptions.workerSrc);
7
+ }
8
+ export class PDFEngine {
9
+ constructor(options = {}) {
10
+ this.options = options;
11
+ this.pdfDocument = null;
12
+ this.pages = new Map();
13
+ this.renderingQueue = {
14
+ high: [],
15
+ medium: [],
16
+ low: [],
17
+ idle: [],
18
+ };
19
+ this.isRendering = false;
20
+ this.canvasPool = [];
21
+ this.pageRenderCallback = null;
22
+ this.maxPoolSize = 10;
23
+ this.initializeCanvasPool();
24
+ }
25
+ setPageRenderCallback(callback) {
26
+ this.pageRenderCallback = callback;
27
+ }
28
+ async loadDocument(source) {
29
+ try {
30
+ const sourceType = detectPDFSourceType(source);
31
+ if (sourceType === 'base64') {
32
+ const base64String = source;
33
+ if (!validateBase64PDF(base64String)) {
34
+ throw new Error('Invalid base64 PDF data');
35
+ }
36
+ try {
37
+ const metadata = extractPDFMetadata(base64String);
38
+ console.log(`Loading PDF from base64: ${Math.round(metadata.size / 1024)}KB, version: ${metadata.version || 'unknown'}`);
39
+ }
40
+ catch (metaError) {
41
+ console.warn('Could not extract PDF metadata:', metaError);
42
+ }
43
+ }
44
+ const normalizedSource = await normalizePDFSource(source);
45
+ const loadingTask = pdfjsLib.getDocument({
46
+ data: normalizedSource,
47
+ disableFontFace: sourceType === 'base64',
48
+ disableRange: sourceType !== 'url',
49
+ disableStream: sourceType === 'base64' || sourceType === 'blob',
50
+ });
51
+ this.pdfDocument = await loadingTask.promise;
52
+ for (let i = 1; i <= this.pdfDocument.numPages; i++) {
53
+ this.pages.set(i, {
54
+ pageNumber: i,
55
+ rendered: false,
56
+ loading: false,
57
+ });
58
+ }
59
+ console.log(`PDF loaded successfully: ${this.pdfDocument.numPages} pages, fingerprint: ${this.pdfDocument.fingerprints?.[0] || 'unknown'}`);
60
+ }
61
+ catch (error) {
62
+ console.error('Failed to load PDF document:', error);
63
+ if (error instanceof Error) {
64
+ if (error.message.includes('Invalid PDF')) {
65
+ throw new Error('Invalid PDF format or corrupted file');
66
+ }
67
+ else if (error.message.includes('base64')) {
68
+ throw new Error('Invalid base64 PDF data - ensure the string is properly encoded');
69
+ }
70
+ else if (error.message.includes('fetch')) {
71
+ throw new Error('Failed to load PDF from URL - check network connection and file availability');
72
+ }
73
+ }
74
+ throw new Error('Failed to load PDF document');
75
+ }
76
+ }
77
+ getDocumentInfo() {
78
+ if (!this.pdfDocument) {
79
+ throw new Error('No PDF document loaded');
80
+ }
81
+ return {
82
+ numPages: this.pdfDocument.numPages,
83
+ fingerprint: this.pdfDocument.fingerprints?.[0] || 'unknown',
84
+ };
85
+ }
86
+ async getPage(pageNumber) {
87
+ if (!this.pdfDocument) {
88
+ throw new Error('No PDF document loaded');
89
+ }
90
+ return await this.pdfDocument.getPage(pageNumber);
91
+ }
92
+ async extractTextContent(pageNumber) {
93
+ const page = await this.getPage(pageNumber);
94
+ const textContent = await page.getTextContent();
95
+ const pageData = this.pages.get(pageNumber);
96
+ if (pageData) {
97
+ pageData.textContent = textContent;
98
+ this.pages.set(pageNumber, pageData);
99
+ }
100
+ return textContent;
101
+ }
102
+ async renderPage(pageNumber, scale = 1.5, canvas) {
103
+ console.log(`PDF Engine: renderPage ${pageNumber} at scale ${scale}`);
104
+ const pageData = this.pages.get(pageNumber);
105
+ if (!pageData) {
106
+ throw new Error(`Page ${pageNumber} not found`);
107
+ }
108
+ if (pageData.rendered && pageData.canvas && pageData.scale === scale) {
109
+ console.log(`PDF Engine: Page ${pageNumber} already rendered at scale ${scale}, returning cached`);
110
+ return pageData.canvas;
111
+ }
112
+ if (pageData.rendered && pageData.scale !== scale) {
113
+ console.log(`PDF Engine: Page ${pageNumber} scale changed from ${pageData.scale} to ${scale}, re-rendering`);
114
+ pageData.rendered = false;
115
+ pageData.canvas = undefined;
116
+ }
117
+ const page = await this.getPage(pageNumber);
118
+ const viewport = page.getViewport({ scale });
119
+ const renderCanvas = canvas || this.getCanvasFromPool();
120
+ const context = renderCanvas.getContext('2d');
121
+ if (!context) {
122
+ throw new Error('Failed to get 2D context');
123
+ }
124
+ renderCanvas.width = viewport.width;
125
+ renderCanvas.height = viewport.height;
126
+ const renderContext = {
127
+ canvasContext: context,
128
+ viewport: viewport,
129
+ canvas: renderCanvas,
130
+ };
131
+ try {
132
+ pageData.loading = true;
133
+ await page.render(renderContext).promise;
134
+ pageData.canvas = renderCanvas;
135
+ pageData.viewport = viewport;
136
+ pageData.rendered = true;
137
+ pageData.loading = false;
138
+ pageData.scale = scale;
139
+ this.pages.set(pageNumber, pageData);
140
+ return renderCanvas;
141
+ }
142
+ catch (error) {
143
+ pageData.loading = false;
144
+ this.pages.set(pageNumber, pageData);
145
+ console.error(`Failed to render page ${pageNumber}:`, error);
146
+ throw error;
147
+ }
148
+ }
149
+ queuePagesForRendering(pageNumbers, priority) {
150
+ const targetQueue = this.renderingQueue[priority];
151
+ pageNumbers.forEach((pageNumber) => {
152
+ const pageData = this.pages.get(pageNumber);
153
+ if (pageData && !pageData.rendered && !pageData.loading) {
154
+ this.removeFromAllQueues(pageData);
155
+ targetQueue.push(pageData);
156
+ }
157
+ });
158
+ if (!this.isRendering) {
159
+ this.processRenderQueue();
160
+ }
161
+ }
162
+ async processRenderQueue() {
163
+ if (this.isRendering)
164
+ return;
165
+ this.isRendering = true;
166
+ const frameBudget = 16;
167
+ while (this.hasQueuedItems()) {
168
+ const startTime = performance.now();
169
+ const page = this.getNextPageFromQueue();
170
+ if (page) {
171
+ try {
172
+ if (this.pageRenderCallback) {
173
+ await this.pageRenderCallback(page.pageNumber);
174
+ }
175
+ else {
176
+ await this.renderPage(page.pageNumber);
177
+ }
178
+ }
179
+ catch (error) {
180
+ console.error(`Failed to render queued page ${page.pageNumber}:`, error);
181
+ }
182
+ }
183
+ const elapsed = performance.now() - startTime;
184
+ if (elapsed > frameBudget) {
185
+ await new Promise((resolve) => setTimeout(resolve, 0));
186
+ }
187
+ }
188
+ this.isRendering = false;
189
+ }
190
+ getNextPageFromQueue() {
191
+ if (this.renderingQueue.high.length > 0) {
192
+ return this.renderingQueue.high.shift();
193
+ }
194
+ if (this.renderingQueue.medium.length > 0) {
195
+ return this.renderingQueue.medium.shift();
196
+ }
197
+ if (this.renderingQueue.low.length > 0) {
198
+ return this.renderingQueue.low.shift();
199
+ }
200
+ if (this.renderingQueue.idle.length > 0) {
201
+ return this.renderingQueue.idle.shift();
202
+ }
203
+ return null;
204
+ }
205
+ hasQueuedItems() {
206
+ return Object.values(this.renderingQueue).some((queue) => queue.length > 0);
207
+ }
208
+ removeFromAllQueues(page) {
209
+ Object.values(this.renderingQueue).forEach((queue) => {
210
+ const index = queue.indexOf(page);
211
+ if (index !== -1) {
212
+ queue.splice(index, 1);
213
+ }
214
+ });
215
+ }
216
+ unloadDistantPages(currentPage, threshold = 5) {
217
+ this.pages.forEach((page, pageNumber) => {
218
+ const distance = Math.abs(pageNumber - currentPage);
219
+ if (distance > threshold && page.rendered) {
220
+ if (page.canvas) {
221
+ this.returnCanvasToPool(page.canvas);
222
+ }
223
+ page.canvas = undefined;
224
+ page.rendered = false;
225
+ page.textContent = undefined;
226
+ this.pages.set(pageNumber, page);
227
+ }
228
+ });
229
+ }
230
+ initializeCanvasPool() {
231
+ for (let i = 0; i < this.maxPoolSize; i++) {
232
+ const canvas = document.createElement('canvas');
233
+ this.canvasPool.push(canvas);
234
+ }
235
+ }
236
+ getCanvasFromPool() {
237
+ return this.canvasPool.pop() || document.createElement('canvas');
238
+ }
239
+ returnCanvasToPool(canvas) {
240
+ if (this.canvasPool.length < this.maxPoolSize) {
241
+ const context = canvas.getContext('2d');
242
+ if (context) {
243
+ context.clearRect(0, 0, canvas.width, canvas.height);
244
+ }
245
+ this.canvasPool.push(canvas);
246
+ }
247
+ }
248
+ getPageData(pageNumber) {
249
+ return this.pages.get(pageNumber);
250
+ }
251
+ getAllPages() {
252
+ return this.pages;
253
+ }
254
+ isDocumentLoaded() {
255
+ return this.pdfDocument !== null;
256
+ }
257
+ clearAllPageCache() {
258
+ console.log('PDF Engine: Clearing all cached page renders');
259
+ this.pages.forEach((page, pageNumber) => {
260
+ if (page.canvas) {
261
+ this.returnCanvasToPool(page.canvas);
262
+ }
263
+ page.canvas = undefined;
264
+ page.rendered = false;
265
+ page.textContent = undefined;
266
+ page.scale = undefined;
267
+ this.pages.set(pageNumber, page);
268
+ });
269
+ }
270
+ destroy() {
271
+ if (this.pdfDocument) {
272
+ this.pdfDocument.destroy();
273
+ this.pdfDocument = null;
274
+ }
275
+ this.pages.clear();
276
+ this.renderingQueue = { high: [], medium: [], low: [], idle: [] };
277
+ this.canvasPool = [];
278
+ this.isRendering = false;
279
+ }
280
+ }
281
+ //# sourceMappingURL=pdf-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-engine.js","sourceRoot":"","sources":["../../core/pdf-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { MemoryMetrics, BoundingBox, TermOccurrence, HeavyTask, PerformanceMetrics } from '../types';
2
+ export interface SpatialIndex {
3
+ insert(bounds: BoundingBox, data: any): void;
4
+ search(bounds: BoundingBox): any[];
5
+ remove(bounds: BoundingBox, data: any): void;
6
+ clear(): void;
7
+ }
8
+ export declare class RTree implements SpatialIndex {
9
+ private root;
10
+ private maxEntries;
11
+ private minEntries;
12
+ insert(bounds: BoundingBox, data: any): void;
13
+ search(bounds: BoundingBox): any[];
14
+ remove(bounds: BoundingBox, data: any): void;
15
+ clear(): void;
16
+ private _chooseSubtree;
17
+ private _search;
18
+ private _intersects;
19
+ private _enlargement;
20
+ private _extend;
21
+ private _area;
22
+ private _adjustBounds;
23
+ private _split;
24
+ private _chooseSplitAxis;
25
+ private _condenseTree;
26
+ private _findItem;
27
+ private _boundsEqual;
28
+ }
29
+ export declare class MemoryManager {
30
+ private cache;
31
+ private maxCacheSize;
32
+ private currentCacheSize;
33
+ constructor(maxCacheSizeMB?: number);
34
+ set(key: string, data: any): void;
35
+ get(key: string): any | null;
36
+ has(key: string): boolean;
37
+ delete(key: string): void;
38
+ clear(): void;
39
+ getMemoryUsage(): MemoryMetrics;
40
+ private evictIfNeeded;
41
+ private findLRUKey;
42
+ private estimateSize;
43
+ private calculatePageMemory;
44
+ private calculateHighlightMemory;
45
+ private startMemoryMonitoring;
46
+ private forceEviction;
47
+ }
48
+ export declare class RenderOptimizer {
49
+ private frameBudget;
50
+ private renderQueue;
51
+ private isProcessing;
52
+ constructor(frameBudget?: number);
53
+ queueRenderTask(task: () => Promise<void>): void;
54
+ private processQueue;
55
+ measureRenderTime(fn: () => void | Promise<void>): Promise<number>;
56
+ clearQueue(): void;
57
+ getQueueStatus(): {
58
+ queueLength: number;
59
+ isProcessing: boolean;
60
+ };
61
+ }
62
+ export declare class WorkerTaskManager {
63
+ private workers;
64
+ private taskQueue;
65
+ private maxWorkers;
66
+ constructor(workerScript: string);
67
+ private initializeWorkers;
68
+ executeTask(task: HeavyTask): Promise<any>;
69
+ private processQueue;
70
+ destroy(): void;
71
+ }
72
+ export declare class PerformanceOptimizer {
73
+ memoryManager: MemoryManager;
74
+ spatialIndex: SpatialIndex;
75
+ renderOptimizer: RenderOptimizer;
76
+ workerManager: WorkerTaskManager | null;
77
+ private performanceMetrics;
78
+ constructor(options?: {
79
+ maxCacheSize?: number;
80
+ frameBudget?: number;
81
+ workerScript?: string;
82
+ });
83
+ buildSpatialIndex(highlights: TermOccurrence[], pageNumber: number): void;
84
+ findHighlightsInViewport(viewportBounds: BoundingBox): any[];
85
+ getPerformanceMetrics(): PerformanceMetrics;
86
+ updateMetric(metric: keyof PerformanceMetrics, value: any): void;
87
+ private startPerformanceMonitoring;
88
+ optimize(): void;
89
+ destroy(): void;
90
+ }
91
+ //# sourceMappingURL=performance-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-optimizer.d.ts","sourceRoot":"","sources":["../../core/performance-optimizer.ts"],"names":[],"mappings":"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"}