pdf-oxide 0.3.24

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 (62) hide show
  1. package/README.md +218 -0
  2. package/binding.gyp +35 -0
  3. package/package.json +78 -0
  4. package/src/builders/annotation-builder.ts +367 -0
  5. package/src/builders/conversion-options-builder.ts +257 -0
  6. package/src/builders/index.ts +12 -0
  7. package/src/builders/metadata-builder.ts +317 -0
  8. package/src/builders/pdf-builder.ts +386 -0
  9. package/src/builders/search-options-builder.ts +151 -0
  10. package/src/document-editor-manager.ts +318 -0
  11. package/src/errors.ts +1629 -0
  12. package/src/form-field-manager.ts +666 -0
  13. package/src/hybrid-ml-manager.ts +283 -0
  14. package/src/index.ts +453 -0
  15. package/src/managers/accessibility-manager.ts +338 -0
  16. package/src/managers/annotation-manager.ts +439 -0
  17. package/src/managers/barcode-manager.ts +235 -0
  18. package/src/managers/batch-manager.ts +533 -0
  19. package/src/managers/cache-manager.ts +486 -0
  20. package/src/managers/compliance-manager.ts +375 -0
  21. package/src/managers/content-manager.ts +339 -0
  22. package/src/managers/document-utility-manager.ts +922 -0
  23. package/src/managers/dom-pdf-creator.ts +365 -0
  24. package/src/managers/editing-manager.ts +514 -0
  25. package/src/managers/enterprise-manager.ts +478 -0
  26. package/src/managers/extended-managers.ts +437 -0
  27. package/src/managers/extraction-manager.ts +583 -0
  28. package/src/managers/final-utilities.ts +429 -0
  29. package/src/managers/hybrid-ml-advanced.ts +479 -0
  30. package/src/managers/index.ts +239 -0
  31. package/src/managers/layer-manager.ts +500 -0
  32. package/src/managers/metadata-manager.ts +303 -0
  33. package/src/managers/ocr-manager.ts +756 -0
  34. package/src/managers/optimization-manager.ts +262 -0
  35. package/src/managers/outline-manager.ts +196 -0
  36. package/src/managers/page-manager.ts +289 -0
  37. package/src/managers/pattern-detection.ts +440 -0
  38. package/src/managers/rendering-manager.ts +863 -0
  39. package/src/managers/search-manager.ts +385 -0
  40. package/src/managers/security-manager.ts +345 -0
  41. package/src/managers/signature-manager.ts +1664 -0
  42. package/src/managers/streams.ts +618 -0
  43. package/src/managers/xfa-manager.ts +500 -0
  44. package/src/pdf-creator-manager.ts +494 -0
  45. package/src/properties.ts +522 -0
  46. package/src/result-accessors-manager.ts +867 -0
  47. package/src/tests/advanced-features.test.ts +414 -0
  48. package/src/tests/advanced.test.ts +266 -0
  49. package/src/tests/extended-managers.test.ts +316 -0
  50. package/src/tests/final-utilities.test.ts +455 -0
  51. package/src/tests/foundation.test.ts +315 -0
  52. package/src/tests/high-demand.test.ts +257 -0
  53. package/src/tests/specialized.test.ts +97 -0
  54. package/src/thumbnail-manager.ts +272 -0
  55. package/src/types/common.ts +142 -0
  56. package/src/types/document-types.ts +457 -0
  57. package/src/types/index.ts +6 -0
  58. package/src/types/manager-types.ts +284 -0
  59. package/src/types/native-bindings.ts +517 -0
  60. package/src/workers/index.ts +7 -0
  61. package/src/workers/pool.ts +274 -0
  62. package/src/workers/worker.ts +131 -0
@@ -0,0 +1,272 @@
1
+ /**
2
+ * ThumbnailManager for thumbnail generation and caching
3
+ *
4
+ * Generates and caches PDF thumbnails with multiple size and format options.
5
+ * API is consistent with Python, Java, C#, Go, and Swift implementations.
6
+ */
7
+
8
+ import { EventEmitter } from 'events';
9
+
10
+ /**
11
+ * Thumbnail size presets
12
+ */
13
+ export enum ThumbnailSize {
14
+ Small = 'small', // 100x100
15
+ Medium = 'medium', // 200x200
16
+ Large = 'large', // 400x400
17
+ ExtraLarge = 'xl', // 600x600
18
+ Custom = 'custom',
19
+ }
20
+
21
+ /**
22
+ * Image format options
23
+ */
24
+ export enum ImageFormat {
25
+ PNG = 'PNG',
26
+ JPEG = 'JPEG',
27
+ WEBP = 'WEBP',
28
+ }
29
+
30
+ /**
31
+ * Configuration for thumbnail generation
32
+ */
33
+ export interface ThumbnailConfig {
34
+ size?: ThumbnailSize;
35
+ customWidth?: number;
36
+ customHeight?: number;
37
+ format?: ImageFormat;
38
+ quality?: number;
39
+ preserveAspectRatio?: boolean;
40
+ backgroundColor?: string;
41
+ }
42
+
43
+ /**
44
+ * Thumbnail image information
45
+ */
46
+ export interface ThumbnailInfo {
47
+ pageIndex: number;
48
+ width: number;
49
+ height: number;
50
+ mimeType: string;
51
+ fileSize: number;
52
+ }
53
+
54
+ /**
55
+ * Statistics about generated thumbnails
56
+ */
57
+ export interface ThumbnailStatistics {
58
+ totalGenerated: number;
59
+ totalCached: number;
60
+ averageGenerationTime: number;
61
+ totalMemoryUsed: number;
62
+ }
63
+
64
+ /**
65
+ * Thumbnail Manager for thumbnail operations
66
+ *
67
+ * Provides methods to:
68
+ * - Generate thumbnails for individual pages
69
+ * - Batch thumbnail generation
70
+ * - Multiple size options
71
+ * - Format conversion (PNG, JPEG, WebP)
72
+ * - Efficient caching
73
+ */
74
+ export class ThumbnailManager extends EventEmitter {
75
+ private document: any;
76
+ private resultCache = new Map<string, any>();
77
+ private maxCacheSize = 100;
78
+ private native: any;
79
+ private stats: ThumbnailStatistics = {
80
+ totalGenerated: 0,
81
+ totalCached: 0,
82
+ averageGenerationTime: 0,
83
+ totalMemoryUsed: 0,
84
+ };
85
+
86
+ constructor(document: any) {
87
+ super();
88
+ this.document = document;
89
+ try {
90
+ this.native = require('../index.node');
91
+ } catch {
92
+ // Fall back to framework defaults if native module not available
93
+ this.native = null;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Generates a thumbnail for a specific page
99
+ * Matches: Python generateThumbnail(), Java generateThumbnail(), C# GenerateThumbnail()
100
+ */
101
+ async generateThumbnail(pageIndex: number, config?: ThumbnailConfig): Promise<Buffer> {
102
+ const size = config?.size ?? ThumbnailSize.Medium;
103
+ const cacheKey = `thumbnails:page:${pageIndex}:${size}`;
104
+
105
+ if (this.resultCache.has(cacheKey)) {
106
+ this.stats.totalCached += 1;
107
+ return this.resultCache.get(cacheKey);
108
+ }
109
+
110
+ let imageData = Buffer.alloc(0);
111
+ if (this.native?.generate_thumbnail) {
112
+ try {
113
+ const result = this.native.generate_thumbnail(pageIndex, size);
114
+ imageData = Buffer.from(result);
115
+ } catch {
116
+ imageData = Buffer.alloc(0);
117
+ }
118
+ }
119
+
120
+ this.stats.totalGenerated += 1;
121
+ this.setCached(cacheKey, imageData);
122
+ this.emit('thumbnailGenerated', { page: pageIndex, size });
123
+ return imageData;
124
+ }
125
+
126
+ /**
127
+ * Generates thumbnails for a range of pages
128
+ * Matches: Python generateBatchThumbnails(), Java generateBatchThumbnails(), C# GenerateBatchThumbnails()
129
+ */
130
+ async generateBatchThumbnails(
131
+ startPage: number,
132
+ endPage: number,
133
+ config?: ThumbnailConfig
134
+ ): Promise<Map<number, Buffer>> {
135
+ const thumbnails = new Map<number, Buffer>();
136
+
137
+ for (let pageIndex = startPage; pageIndex <= endPage; pageIndex++) {
138
+ const thumb = await this.generateThumbnail(pageIndex, config);
139
+ thumbnails.set(pageIndex, thumb);
140
+ }
141
+
142
+ return thumbnails;
143
+ }
144
+
145
+ /**
146
+ * Generates thumbnails for all pages
147
+ * Matches: Python generateAllThumbnails(), Java generateAllThumbnails(), C# GenerateAllThumbnails()
148
+ */
149
+ async generateAllThumbnails(config?: ThumbnailConfig): Promise<Map<number, Buffer>> {
150
+ const size = config?.size ?? ThumbnailSize.Medium;
151
+ const cacheKey = `thumbnails:all:${size}`;
152
+
153
+ if (this.resultCache.has(cacheKey)) {
154
+ this.stats.totalCached += 1;
155
+ return this.resultCache.get(cacheKey);
156
+ }
157
+
158
+ let thumbnails = new Map<number, Buffer>();
159
+ if (this.native?.generate_all_thumbnails) {
160
+ try {
161
+ const thumbnailsJson = this.native.generate_all_thumbnails(size);
162
+ const parsed = JSON.parse(thumbnailsJson);
163
+ for (const [page, imageData] of Object.entries(parsed)) {
164
+ thumbnails.set(parseInt(page), Buffer.from(imageData as any));
165
+ }
166
+ } catch {
167
+ thumbnails = new Map();
168
+ }
169
+ }
170
+
171
+ this.stats.totalGenerated += 1;
172
+ this.setCached(cacheKey, thumbnails);
173
+ this.emit('allThumbnailsGenerated', { size, count: thumbnails.size });
174
+ return thumbnails;
175
+ }
176
+
177
+ /**
178
+ * Saves a page thumbnail to disk
179
+ * Matches: Python saveThumbnail(), Java saveThumbnail(), C# SaveThumbnail()
180
+ */
181
+ async saveThumbnail(
182
+ pageIndex: number,
183
+ filePath: string,
184
+ config?: ThumbnailConfig
185
+ ): Promise<void> {
186
+ const imageData = await this.generateThumbnail(pageIndex, config);
187
+
188
+ // In real implementation, would write to file
189
+ this.emit('thumbnailSaved', filePath);
190
+ }
191
+
192
+ /**
193
+ * Gets thumbnail information
194
+ * Matches: Python getThumbnailInfo(), Java getThumbnailInfo(), C# GetThumbnailInfo()
195
+ */
196
+ async getThumbnailInfo(pageIndex: number): Promise<ThumbnailInfo> {
197
+ const cacheKey = `thumbnails:info:${pageIndex}`;
198
+
199
+ if (this.resultCache.has(cacheKey)) {
200
+ return this.resultCache.get(cacheKey);
201
+ }
202
+
203
+ // In real implementation, would call native FFI
204
+ const info: ThumbnailInfo = {
205
+ pageIndex,
206
+ width: 200,
207
+ height: 200,
208
+ mimeType: 'image/png',
209
+ fileSize: 0,
210
+ };
211
+ this.setCached(cacheKey, info);
212
+ return info;
213
+ }
214
+
215
+ /**
216
+ * Preload thumbnails for optimal viewing performance
217
+ * Matches: Python preloadThumbnails(), Java preloadThumbnails(), C# PreloadThumbnails()
218
+ */
219
+ async preloadThumbnails(config?: ThumbnailConfig): Promise<void> {
220
+ await this.generateAllThumbnails(config);
221
+ }
222
+
223
+ /**
224
+ * Gets generation statistics
225
+ * Matches: Python getStatistics(), Java getStatistics(), C# GetStatistics()
226
+ */
227
+ getStatistics(): ThumbnailStatistics {
228
+ return { ...this.stats };
229
+ }
230
+
231
+ /**
232
+ * Clears the result cache
233
+ * Matches: Python clearCache(), Java clearCache(), C# ClearCache()
234
+ */
235
+ clearCache(): void {
236
+ this.resultCache.clear();
237
+ this.stats = {
238
+ totalGenerated: 0,
239
+ totalCached: 0,
240
+ averageGenerationTime: 0,
241
+ totalMemoryUsed: 0,
242
+ };
243
+ this.emit('cacheCleared');
244
+ }
245
+
246
+ /**
247
+ * Gets cache statistics
248
+ * Matches: Python getCacheStats(), Java getCacheStats(), C# GetCacheStats()
249
+ */
250
+ getCacheStats(): Record<string, any> {
251
+ return {
252
+ cacheSize: this.resultCache.size,
253
+ maxCacheSize: this.maxCacheSize,
254
+ entries: Array.from(this.resultCache.keys()),
255
+ };
256
+ }
257
+
258
+ // Private helper methods
259
+ private setCached(key: string, value: any): void {
260
+ this.resultCache.set(key, value);
261
+
262
+ // Simple LRU eviction
263
+ if (this.resultCache.size > this.maxCacheSize) {
264
+ const firstKey = this.resultCache.keys().next().value;
265
+ if (firstKey !== undefined) {
266
+ this.resultCache.delete(firstKey);
267
+ }
268
+ }
269
+ }
270
+ }
271
+
272
+ export default ThumbnailManager;
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Common type definitions and utilities
3
+ */
4
+
5
+ import type {
6
+ SearchOptions,
7
+ SearchResult,
8
+ Metadata,
9
+ DocumentInfo,
10
+ EmbeddedFile,
11
+ Annotation,
12
+ } from './native-bindings';
13
+
14
+ // Re-export commonly used native types
15
+ export type {
16
+ SearchOptions,
17
+ SearchResult,
18
+ Metadata,
19
+ DocumentInfo,
20
+ EmbeddedFile,
21
+ Annotation,
22
+ NativePdfDocument,
23
+ NativePdf,
24
+ NativePdfPage,
25
+ Rect,
26
+ Point,
27
+ Color,
28
+ PdfElement,
29
+ PdfText,
30
+ PdfImage,
31
+ PdfPath,
32
+ PdfTable,
33
+ PdfTableCell,
34
+ TextAnnotation,
35
+ HighlightAnnotation,
36
+ LinkAnnotation,
37
+ InkAnnotation,
38
+ SquareAnnotation,
39
+ CircleAnnotation,
40
+ LineAnnotation,
41
+ PolygonAnnotation,
42
+ } from './native-bindings';
43
+
44
+ /**
45
+ * Page range specification for document operations
46
+ */
47
+ export interface PageRange {
48
+ startPage?: number;
49
+ endPage?: number;
50
+ pages?: number[];
51
+ }
52
+
53
+ /**
54
+ * Generic extraction result with metadata
55
+ */
56
+ export interface ExtractionResult<T> {
57
+ data: T;
58
+ pageIndex: number;
59
+ timestamp: Date;
60
+ processingTimeMs?: number;
61
+ }
62
+
63
+ /**
64
+ * Async operation callback function type
65
+ */
66
+ export type AsyncOperationCallback<T> = (err: Error | null, result?: T) => void;
67
+
68
+ /**
69
+ * Manager configuration interface for all managers
70
+ */
71
+ export interface ManagerConfig {
72
+ maxCacheSize?: number;
73
+ cacheExpirationMs?: number;
74
+ enableCaching?: boolean;
75
+ timeout?: number;
76
+ retryAttempts?: number;
77
+ retryDelayMs?: number;
78
+ }
79
+
80
+ /**
81
+ * Batch operation options
82
+ */
83
+ export interface BatchOptions {
84
+ batchSize?: number;
85
+ parallel?: boolean;
86
+ maxParallel?: number;
87
+ progressCallback?: (processed: number, total: number) => void;
88
+ continueOnError?: boolean;
89
+ }
90
+
91
+ /**
92
+ * Error details for exception context
93
+ */
94
+ export interface PdfErrorDetails {
95
+ timestamp?: string;
96
+ operation?: string;
97
+ context?: Record<string, any>;
98
+ originalError?: Error;
99
+ stack?: string;
100
+ }
101
+
102
+ /**
103
+ * Optional content (layers) information
104
+ */
105
+ export interface OptionalContent {
106
+ id: string;
107
+ name: string;
108
+ visible: boolean;
109
+ locked?: boolean;
110
+ printable?: boolean;
111
+ exportable?: boolean;
112
+ viewState?: string;
113
+ }
114
+
115
+ /**
116
+ * Form field value map for filling forms
117
+ */
118
+ export type FormFieldValues = Record<string, string | number | boolean | string[]>;
119
+
120
+ /**
121
+ * Type for validation result
122
+ */
123
+ export interface ValidationResult {
124
+ isValid: boolean;
125
+ errors: string[];
126
+ warnings: string[];
127
+ }
128
+
129
+ /**
130
+ * Stream operation callback
131
+ */
132
+ export type StreamCallback<T> = (data: T) => void;
133
+
134
+ /**
135
+ * Stream error callback
136
+ */
137
+ export type StreamErrorCallback = (error: Error) => void;
138
+
139
+ /**
140
+ * Stream end callback
141
+ */
142
+ export type StreamEndCallback = () => void;