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.
- package/README.md +218 -0
- package/binding.gyp +35 -0
- package/package.json +78 -0
- package/src/builders/annotation-builder.ts +367 -0
- package/src/builders/conversion-options-builder.ts +257 -0
- package/src/builders/index.ts +12 -0
- package/src/builders/metadata-builder.ts +317 -0
- package/src/builders/pdf-builder.ts +386 -0
- package/src/builders/search-options-builder.ts +151 -0
- package/src/document-editor-manager.ts +318 -0
- package/src/errors.ts +1629 -0
- package/src/form-field-manager.ts +666 -0
- package/src/hybrid-ml-manager.ts +283 -0
- package/src/index.ts +453 -0
- package/src/managers/accessibility-manager.ts +338 -0
- package/src/managers/annotation-manager.ts +439 -0
- package/src/managers/barcode-manager.ts +235 -0
- package/src/managers/batch-manager.ts +533 -0
- package/src/managers/cache-manager.ts +486 -0
- package/src/managers/compliance-manager.ts +375 -0
- package/src/managers/content-manager.ts +339 -0
- package/src/managers/document-utility-manager.ts +922 -0
- package/src/managers/dom-pdf-creator.ts +365 -0
- package/src/managers/editing-manager.ts +514 -0
- package/src/managers/enterprise-manager.ts +478 -0
- package/src/managers/extended-managers.ts +437 -0
- package/src/managers/extraction-manager.ts +583 -0
- package/src/managers/final-utilities.ts +429 -0
- package/src/managers/hybrid-ml-advanced.ts +479 -0
- package/src/managers/index.ts +239 -0
- package/src/managers/layer-manager.ts +500 -0
- package/src/managers/metadata-manager.ts +303 -0
- package/src/managers/ocr-manager.ts +756 -0
- package/src/managers/optimization-manager.ts +262 -0
- package/src/managers/outline-manager.ts +196 -0
- package/src/managers/page-manager.ts +289 -0
- package/src/managers/pattern-detection.ts +440 -0
- package/src/managers/rendering-manager.ts +863 -0
- package/src/managers/search-manager.ts +385 -0
- package/src/managers/security-manager.ts +345 -0
- package/src/managers/signature-manager.ts +1664 -0
- package/src/managers/streams.ts +618 -0
- package/src/managers/xfa-manager.ts +500 -0
- package/src/pdf-creator-manager.ts +494 -0
- package/src/properties.ts +522 -0
- package/src/result-accessors-manager.ts +867 -0
- package/src/tests/advanced-features.test.ts +414 -0
- package/src/tests/advanced.test.ts +266 -0
- package/src/tests/extended-managers.test.ts +316 -0
- package/src/tests/final-utilities.test.ts +455 -0
- package/src/tests/foundation.test.ts +315 -0
- package/src/tests/high-demand.test.ts +257 -0
- package/src/tests/specialized.test.ts +97 -0
- package/src/thumbnail-manager.ts +272 -0
- package/src/types/common.ts +142 -0
- package/src/types/document-types.ts +457 -0
- package/src/types/index.ts +6 -0
- package/src/types/manager-types.ts +284 -0
- package/src/types/native-bindings.ts +517 -0
- package/src/workers/index.ts +7 -0
- package/src/workers/pool.ts +274 -0
- 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;
|