pdf-oxide 0.3.24 → 0.3.28

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 (271) hide show
  1. package/lib/builders/annotation-builder.d.ts +199 -0
  2. package/lib/builders/annotation-builder.d.ts.map +1 -0
  3. package/lib/builders/annotation-builder.js +318 -0
  4. package/lib/builders/annotation-builder.js.map +1 -0
  5. package/lib/builders/conversion-options-builder.d.ts +107 -0
  6. package/lib/builders/conversion-options-builder.d.ts.map +1 -0
  7. package/lib/builders/conversion-options-builder.js +215 -0
  8. package/lib/builders/conversion-options-builder.js.map +1 -0
  9. package/{src/builders/index.ts → lib/builders/index.d.ts} +1 -1
  10. package/lib/builders/index.d.ts.map +1 -0
  11. package/lib/builders/index.js +12 -0
  12. package/lib/builders/index.js.map +1 -0
  13. package/lib/builders/metadata-builder.d.ts +202 -0
  14. package/lib/builders/metadata-builder.d.ts.map +1 -0
  15. package/lib/builders/metadata-builder.js +286 -0
  16. package/lib/builders/metadata-builder.js.map +1 -0
  17. package/lib/builders/pdf-builder.d.ts +215 -0
  18. package/lib/builders/pdf-builder.d.ts.map +1 -0
  19. package/lib/builders/pdf-builder.js +339 -0
  20. package/lib/builders/pdf-builder.js.map +1 -0
  21. package/lib/builders/search-options-builder.d.ts +74 -0
  22. package/lib/builders/search-options-builder.d.ts.map +1 -0
  23. package/lib/builders/search-options-builder.js +130 -0
  24. package/lib/builders/search-options-builder.js.map +1 -0
  25. package/lib/document-editor-manager.d.ts +140 -0
  26. package/lib/document-editor-manager.d.ts.map +1 -0
  27. package/lib/document-editor-manager.js +257 -0
  28. package/lib/document-editor-manager.js.map +1 -0
  29. package/lib/errors.d.ts +383 -0
  30. package/lib/errors.d.ts.map +1 -0
  31. package/lib/errors.js +1117 -0
  32. package/lib/errors.js.map +1 -0
  33. package/lib/form-field-manager.d.ts +300 -0
  34. package/lib/form-field-manager.d.ts.map +1 -0
  35. package/lib/form-field-manager.js +567 -0
  36. package/lib/form-field-manager.js.map +1 -0
  37. package/lib/hybrid-ml-manager.d.ts +143 -0
  38. package/lib/hybrid-ml-manager.d.ts.map +1 -0
  39. package/lib/hybrid-ml-manager.js +209 -0
  40. package/lib/hybrid-ml-manager.js.map +1 -0
  41. package/lib/index.d.ts +23 -0
  42. package/lib/index.d.ts.map +1 -0
  43. package/lib/index.js +280 -0
  44. package/lib/index.js.map +1 -0
  45. package/lib/managers/accessibility-manager.d.ts +149 -0
  46. package/lib/managers/accessibility-manager.d.ts.map +1 -0
  47. package/lib/managers/accessibility-manager.js +224 -0
  48. package/lib/managers/accessibility-manager.js.map +1 -0
  49. package/lib/managers/annotation-manager.d.ts +220 -0
  50. package/lib/managers/annotation-manager.d.ts.map +1 -0
  51. package/lib/managers/annotation-manager.js +360 -0
  52. package/lib/managers/annotation-manager.js.map +1 -0
  53. package/lib/managers/barcode-manager.d.ts +80 -0
  54. package/lib/managers/barcode-manager.d.ts.map +1 -0
  55. package/lib/managers/barcode-manager.js +226 -0
  56. package/lib/managers/barcode-manager.js.map +1 -0
  57. package/lib/managers/batch-manager.d.ts +186 -0
  58. package/lib/managers/batch-manager.d.ts.map +1 -0
  59. package/lib/managers/batch-manager.js +389 -0
  60. package/lib/managers/batch-manager.js.map +1 -0
  61. package/lib/managers/cache-manager.d.ts +182 -0
  62. package/lib/managers/cache-manager.d.ts.map +1 -0
  63. package/lib/managers/cache-manager.js +387 -0
  64. package/lib/managers/cache-manager.js.map +1 -0
  65. package/lib/managers/compliance-manager.d.ts +104 -0
  66. package/lib/managers/compliance-manager.d.ts.map +1 -0
  67. package/lib/managers/compliance-manager.js +415 -0
  68. package/lib/managers/compliance-manager.js.map +1 -0
  69. package/lib/managers/content-manager.d.ts +121 -0
  70. package/lib/managers/content-manager.d.ts.map +1 -0
  71. package/lib/managers/content-manager.js +295 -0
  72. package/lib/managers/content-manager.js.map +1 -0
  73. package/lib/managers/document-utility-manager.d.ts +370 -0
  74. package/lib/managers/document-utility-manager.d.ts.map +1 -0
  75. package/lib/managers/document-utility-manager.js +731 -0
  76. package/lib/managers/document-utility-manager.js.map +1 -0
  77. package/lib/managers/dom-pdf-creator.d.ts +105 -0
  78. package/lib/managers/dom-pdf-creator.d.ts.map +1 -0
  79. package/lib/managers/dom-pdf-creator.js +300 -0
  80. package/lib/managers/dom-pdf-creator.js.map +1 -0
  81. package/lib/managers/editing-manager.d.ts +249 -0
  82. package/lib/managers/editing-manager.d.ts.map +1 -0
  83. package/lib/managers/editing-manager.js +388 -0
  84. package/lib/managers/editing-manager.js.map +1 -0
  85. package/lib/managers/enterprise-manager.d.ts +193 -0
  86. package/lib/managers/enterprise-manager.d.ts.map +1 -0
  87. package/lib/managers/enterprise-manager.js +305 -0
  88. package/lib/managers/enterprise-manager.js.map +1 -0
  89. package/lib/managers/extended-managers.d.ts +123 -0
  90. package/lib/managers/extended-managers.d.ts.map +1 -0
  91. package/lib/managers/extended-managers.js +658 -0
  92. package/lib/managers/extended-managers.js.map +1 -0
  93. package/lib/managers/extraction-manager.d.ts +247 -0
  94. package/lib/managers/extraction-manager.d.ts.map +1 -0
  95. package/lib/managers/extraction-manager.js +478 -0
  96. package/lib/managers/extraction-manager.js.map +1 -0
  97. package/lib/managers/final-utilities.d.ts +128 -0
  98. package/lib/managers/final-utilities.d.ts.map +1 -0
  99. package/lib/managers/final-utilities.js +653 -0
  100. package/lib/managers/final-utilities.js.map +1 -0
  101. package/lib/managers/hybrid-ml-advanced.d.ts +137 -0
  102. package/lib/managers/hybrid-ml-advanced.d.ts.map +1 -0
  103. package/lib/managers/hybrid-ml-advanced.js +707 -0
  104. package/lib/managers/hybrid-ml-advanced.js.map +1 -0
  105. package/lib/managers/index.d.ts +65 -0
  106. package/lib/managers/index.d.ts.map +1 -0
  107. package/lib/managers/index.js +70 -0
  108. package/lib/managers/index.js.map +1 -0
  109. package/lib/managers/layer-manager.d.ts +204 -0
  110. package/lib/managers/layer-manager.d.ts.map +1 -0
  111. package/lib/managers/layer-manager.js +403 -0
  112. package/lib/managers/layer-manager.js.map +1 -0
  113. package/lib/managers/metadata-manager.d.ts +149 -0
  114. package/lib/managers/metadata-manager.d.ts.map +1 -0
  115. package/lib/managers/metadata-manager.js +281 -0
  116. package/lib/managers/metadata-manager.js.map +1 -0
  117. package/lib/managers/ocr-manager.d.ts +195 -0
  118. package/lib/managers/ocr-manager.d.ts.map +1 -0
  119. package/lib/managers/ocr-manager.js +583 -0
  120. package/lib/managers/ocr-manager.js.map +1 -0
  121. package/lib/managers/optimization-manager.d.ts +103 -0
  122. package/lib/managers/optimization-manager.d.ts.map +1 -0
  123. package/lib/managers/optimization-manager.js +194 -0
  124. package/lib/managers/optimization-manager.js.map +1 -0
  125. package/lib/managers/outline-manager.d.ts +102 -0
  126. package/lib/managers/outline-manager.d.ts.map +1 -0
  127. package/lib/managers/outline-manager.js +170 -0
  128. package/lib/managers/outline-manager.js.map +1 -0
  129. package/lib/managers/page-manager.d.ts +143 -0
  130. package/lib/managers/page-manager.d.ts.map +1 -0
  131. package/lib/managers/page-manager.js +237 -0
  132. package/lib/managers/page-manager.js.map +1 -0
  133. package/lib/managers/pattern-detection.d.ts +170 -0
  134. package/lib/managers/pattern-detection.d.ts.map +1 -0
  135. package/lib/managers/pattern-detection.js +325 -0
  136. package/lib/managers/pattern-detection.js.map +1 -0
  137. package/lib/managers/rendering-manager.d.ts +354 -0
  138. package/lib/managers/rendering-manager.d.ts.map +1 -0
  139. package/lib/managers/rendering-manager.js +680 -0
  140. package/lib/managers/rendering-manager.js.map +1 -0
  141. package/lib/managers/search-manager.d.ts +236 -0
  142. package/lib/managers/search-manager.d.ts.map +1 -0
  143. package/lib/managers/search-manager.js +330 -0
  144. package/lib/managers/search-manager.js.map +1 -0
  145. package/lib/managers/security-manager.d.ts +162 -0
  146. package/lib/managers/security-manager.d.ts.map +1 -0
  147. package/lib/managers/security-manager.js +293 -0
  148. package/lib/managers/security-manager.js.map +1 -0
  149. package/lib/managers/signature-manager.d.ts +725 -0
  150. package/lib/managers/signature-manager.d.ts.map +1 -0
  151. package/lib/managers/signature-manager.js +1365 -0
  152. package/lib/managers/signature-manager.js.map +1 -0
  153. package/lib/managers/streams.d.ts +263 -0
  154. package/lib/managers/streams.d.ts.map +1 -0
  155. package/lib/managers/streams.js +472 -0
  156. package/lib/managers/streams.js.map +1 -0
  157. package/lib/managers/xfa-manager.d.ts +228 -0
  158. package/lib/managers/xfa-manager.d.ts.map +1 -0
  159. package/lib/managers/xfa-manager.js +490 -0
  160. package/lib/managers/xfa-manager.js.map +1 -0
  161. package/lib/pdf-creator-manager.d.ts +201 -0
  162. package/lib/pdf-creator-manager.d.ts.map +1 -0
  163. package/lib/pdf-creator-manager.js +379 -0
  164. package/lib/pdf-creator-manager.js.map +1 -0
  165. package/lib/properties.d.ts +80 -0
  166. package/lib/properties.d.ts.map +1 -0
  167. package/lib/properties.js +455 -0
  168. package/lib/properties.js.map +1 -0
  169. package/lib/result-accessors-manager.d.ts +347 -0
  170. package/lib/result-accessors-manager.d.ts.map +1 -0
  171. package/lib/result-accessors-manager.js +705 -0
  172. package/lib/result-accessors-manager.js.map +1 -0
  173. package/lib/thumbnail-manager.d.ts +122 -0
  174. package/lib/thumbnail-manager.d.ts.map +1 -0
  175. package/lib/thumbnail-manager.js +206 -0
  176. package/lib/thumbnail-manager.js.map +1 -0
  177. package/lib/types/common.d.ts +93 -0
  178. package/lib/types/common.d.ts.map +1 -0
  179. package/lib/types/common.js +5 -0
  180. package/lib/types/common.js.map +1 -0
  181. package/lib/types/document-types.d.ts +353 -0
  182. package/lib/types/document-types.d.ts.map +1 -0
  183. package/lib/types/document-types.js +83 -0
  184. package/lib/types/document-types.js.map +1 -0
  185. package/{src/types/index.ts → lib/types/index.d.ts} +1 -1
  186. package/lib/types/index.d.ts.map +1 -0
  187. package/lib/types/index.js +6 -0
  188. package/lib/types/index.js.map +1 -0
  189. package/lib/types/manager-types.d.ts +180 -0
  190. package/lib/types/manager-types.d.ts.map +1 -0
  191. package/lib/types/manager-types.js +99 -0
  192. package/lib/types/manager-types.js.map +1 -0
  193. package/lib/types/native-bindings.d.ts +440 -0
  194. package/lib/types/native-bindings.d.ts.map +1 -0
  195. package/lib/types/native-bindings.js +8 -0
  196. package/lib/types/native-bindings.js.map +1 -0
  197. package/{src/workers/index.ts → lib/workers/index.d.ts} +1 -1
  198. package/lib/workers/index.d.ts.map +1 -0
  199. package/lib/workers/index.js +6 -0
  200. package/lib/workers/index.js.map +1 -0
  201. package/lib/workers/pool.d.ts +65 -0
  202. package/lib/workers/pool.d.ts.map +1 -0
  203. package/lib/workers/pool.js +195 -0
  204. package/lib/workers/pool.js.map +1 -0
  205. package/lib/workers/worker.d.ts +6 -0
  206. package/lib/workers/worker.d.ts.map +1 -0
  207. package/lib/workers/worker.js +100 -0
  208. package/lib/workers/worker.js.map +1 -0
  209. package/package.json +12 -22
  210. package/prebuilds/darwin-arm64/pdf_oxide.node +0 -0
  211. package/prebuilds/darwin-x64/pdf_oxide.node +0 -0
  212. package/prebuilds/linux-arm64/pdf_oxide.node +0 -0
  213. package/prebuilds/linux-x64/pdf_oxide.node +0 -0
  214. package/prebuilds/win32-x64/pdf_oxide.node +0 -0
  215. package/binding.gyp +0 -35
  216. package/src/builders/annotation-builder.ts +0 -367
  217. package/src/builders/conversion-options-builder.ts +0 -257
  218. package/src/builders/metadata-builder.ts +0 -317
  219. package/src/builders/pdf-builder.ts +0 -386
  220. package/src/builders/search-options-builder.ts +0 -151
  221. package/src/document-editor-manager.ts +0 -318
  222. package/src/errors.ts +0 -1629
  223. package/src/form-field-manager.ts +0 -666
  224. package/src/hybrid-ml-manager.ts +0 -283
  225. package/src/index.ts +0 -453
  226. package/src/managers/accessibility-manager.ts +0 -338
  227. package/src/managers/annotation-manager.ts +0 -439
  228. package/src/managers/barcode-manager.ts +0 -235
  229. package/src/managers/batch-manager.ts +0 -533
  230. package/src/managers/cache-manager.ts +0 -486
  231. package/src/managers/compliance-manager.ts +0 -375
  232. package/src/managers/content-manager.ts +0 -339
  233. package/src/managers/document-utility-manager.ts +0 -922
  234. package/src/managers/dom-pdf-creator.ts +0 -365
  235. package/src/managers/editing-manager.ts +0 -514
  236. package/src/managers/enterprise-manager.ts +0 -478
  237. package/src/managers/extended-managers.ts +0 -437
  238. package/src/managers/extraction-manager.ts +0 -583
  239. package/src/managers/final-utilities.ts +0 -429
  240. package/src/managers/hybrid-ml-advanced.ts +0 -479
  241. package/src/managers/index.ts +0 -239
  242. package/src/managers/layer-manager.ts +0 -500
  243. package/src/managers/metadata-manager.ts +0 -303
  244. package/src/managers/ocr-manager.ts +0 -756
  245. package/src/managers/optimization-manager.ts +0 -262
  246. package/src/managers/outline-manager.ts +0 -196
  247. package/src/managers/page-manager.ts +0 -289
  248. package/src/managers/pattern-detection.ts +0 -440
  249. package/src/managers/rendering-manager.ts +0 -863
  250. package/src/managers/search-manager.ts +0 -385
  251. package/src/managers/security-manager.ts +0 -345
  252. package/src/managers/signature-manager.ts +0 -1664
  253. package/src/managers/streams.ts +0 -618
  254. package/src/managers/xfa-manager.ts +0 -500
  255. package/src/pdf-creator-manager.ts +0 -494
  256. package/src/properties.ts +0 -522
  257. package/src/result-accessors-manager.ts +0 -867
  258. package/src/tests/advanced-features.test.ts +0 -414
  259. package/src/tests/advanced.test.ts +0 -266
  260. package/src/tests/extended-managers.test.ts +0 -316
  261. package/src/tests/final-utilities.test.ts +0 -455
  262. package/src/tests/foundation.test.ts +0 -315
  263. package/src/tests/high-demand.test.ts +0 -257
  264. package/src/tests/specialized.test.ts +0 -97
  265. package/src/thumbnail-manager.ts +0 -272
  266. package/src/types/common.ts +0 -142
  267. package/src/types/document-types.ts +0 -457
  268. package/src/types/manager-types.ts +0 -284
  269. package/src/types/native-bindings.ts +0 -517
  270. package/src/workers/pool.ts +0 -274
  271. package/src/workers/worker.ts +0 -131
@@ -0,0 +1,583 @@
1
+ /**
2
+ * OcrManager - Canonical OCR Manager (merged from 3 implementations)
3
+ *
4
+ * Consolidates:
5
+ * - src/ocr-manager.ts (simple API with setLanguage, extractText, analyzePage)
6
+ * - src/managers/ocr-compliance-cache.ts OCRManager (engine lifecycle)
7
+ * - src/managers/ocr-manager-typed.ts OCRManager (full TypeScript, FFI-wired)
8
+ *
9
+ * Provides optical character recognition operations with complete type safety,
10
+ * proper error handling, and full FFI integration.
11
+ */
12
+ import { BaseManager, OcrLanguage, } from '../types/manager-types.js';
13
+ import { promises as fs } from 'fs';
14
+ import { dirname } from 'path';
15
+ // Re-export types for convenience
16
+ export { OcrLanguage };
17
+ /**
18
+ * OCR detection modes for accuracy/speed tradeoff
19
+ */
20
+ export var OcrDetectionMode;
21
+ (function (OcrDetectionMode) {
22
+ OcrDetectionMode["Accurate"] = "accurate";
23
+ OcrDetectionMode["Fast"] = "fast";
24
+ OcrDetectionMode["Balanced"] = "balanced";
25
+ })(OcrDetectionMode || (OcrDetectionMode = {}));
26
+ /**
27
+ * Canonical OcrManager - Comprehensive OCR with full TypeScript support
28
+ *
29
+ * Features:
30
+ * - Full text recognition with confidence scoring
31
+ * - Batch page processing with skip optimization
32
+ * - Text region detection with coordinates
33
+ * - Multi-language support
34
+ * - Comprehensive event emission
35
+ * - Automatic resource cleanup
36
+ * - Legacy API compatibility (setLanguage, extractText, analyzePage, etc.)
37
+ */
38
+ export class OcrManager extends BaseManager {
39
+ constructor(document, options) {
40
+ super(document, options);
41
+ this.ocrEngine = null;
42
+ this.currentLanguage = OcrLanguage.ENGLISH;
43
+ this.preprocessingType = 'auto';
44
+ try {
45
+ this.native = require('../../index.node');
46
+ }
47
+ catch {
48
+ this.native = null;
49
+ }
50
+ }
51
+ // ==========================================================================
52
+ // Engine Lifecycle (from typed version)
53
+ // ==========================================================================
54
+ /**
55
+ * Initialize OCR engine with specified configuration
56
+ */
57
+ async initializeEngine(detectionThreshold = 0.5, recognitionThreshold = 0.5, maxSideLen = 960, useGpu = false, gpuDeviceId = 0) {
58
+ try {
59
+ this.recordOperation();
60
+ if (this.ocrEngine) {
61
+ return true;
62
+ }
63
+ this.ocrEngine = await this.document?.createOcrEngine(detectionThreshold, recognitionThreshold, maxSideLen, useGpu, gpuDeviceId);
64
+ if (this.ocrEngine) {
65
+ this.emit('ocr-engine-initialized', {
66
+ useGpu,
67
+ gpuDeviceId,
68
+ detectionThreshold,
69
+ recognitionThreshold,
70
+ });
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+ catch (error) {
76
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
77
+ throw error;
78
+ }
79
+ }
80
+ /**
81
+ * Destroy OCR engine and free resources
82
+ */
83
+ async destroyOcrEngine() {
84
+ try {
85
+ this.recordOperation();
86
+ if (this.ocrEngine) {
87
+ await this.document?.destroyOcrEngine(this.ocrEngine);
88
+ this.ocrEngine = null;
89
+ this.emit('ocr-engine-destroyed', { timestamp: Date.now() });
90
+ }
91
+ }
92
+ catch (error) {
93
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
94
+ throw error;
95
+ }
96
+ }
97
+ // ==========================================================================
98
+ // Core Recognition (from typed version)
99
+ // ==========================================================================
100
+ /**
101
+ * Check if page needs OCR processing
102
+ */
103
+ async pageNeedsOcr(pageIndex) {
104
+ try {
105
+ this.recordOperation();
106
+ return (await this.document?.pageNeedsOcr(pageIndex)) || false;
107
+ }
108
+ catch (error) {
109
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Recognize text on a page with full confidence scoring
115
+ */
116
+ async recognizePage(pageIndex) {
117
+ try {
118
+ this.recordOperation();
119
+ if (!this.ocrEngine) {
120
+ throw new Error('OCR engine not initialized. Call initializeEngine() first.');
121
+ }
122
+ const text = await this.document?.recognizePage(pageIndex, this.ocrEngine);
123
+ this.emit('page-recognized', {
124
+ pageIndex,
125
+ textLength: text?.length || 0,
126
+ timestamp: Date.now(),
127
+ });
128
+ return text || '';
129
+ }
130
+ catch (error) {
131
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
132
+ throw error;
133
+ }
134
+ }
135
+ /**
136
+ * Get OCR confidence score for a page
137
+ */
138
+ async getOcrConfidence(pageIndex) {
139
+ try {
140
+ this.recordOperation();
141
+ if (!this.ocrEngine) {
142
+ return 0;
143
+ }
144
+ return (await this.document?.getOcrConfidence(pageIndex)) || 0;
145
+ }
146
+ catch (error) {
147
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
148
+ throw error;
149
+ }
150
+ }
151
+ /**
152
+ * Detect text regions on a page with bounding boxes
153
+ */
154
+ async detectTextRegions(pageIndex) {
155
+ try {
156
+ this.recordOperation();
157
+ if (!this.ocrEngine) {
158
+ return [];
159
+ }
160
+ const regions = await this.document?.detectTextRegions(pageIndex, this.ocrEngine);
161
+ return regions || [];
162
+ }
163
+ catch (error) {
164
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
165
+ throw error;
166
+ }
167
+ }
168
+ // ==========================================================================
169
+ // Language Configuration (from typed + root versions)
170
+ // ==========================================================================
171
+ /**
172
+ * Set OCR language for recognition (FFI-wired)
173
+ */
174
+ async setOcrLanguage(language) {
175
+ try {
176
+ this.recordOperation();
177
+ if (!this.ocrEngine) {
178
+ throw new Error('OCR engine not initialized');
179
+ }
180
+ const result = await this.document?.setOcrLanguage(this.ocrEngine, language);
181
+ if (result) {
182
+ this.currentLanguage = language || OcrLanguage.ENGLISH;
183
+ this.emit('language-changed', {
184
+ language,
185
+ timestamp: Date.now(),
186
+ });
187
+ }
188
+ return !!result;
189
+ }
190
+ catch (error) {
191
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
192
+ throw error;
193
+ }
194
+ }
195
+ /**
196
+ * Sets the OCR language (convenience alias for setOcrLanguage)
197
+ * From root-level OCRManager
198
+ */
199
+ setLanguage(language) {
200
+ this.currentLanguage = language;
201
+ this.invalidateCache('ocr');
202
+ this.emit('languageChanged', language);
203
+ }
204
+ /**
205
+ * Gets the current OCR language
206
+ * From root-level OCRManager
207
+ */
208
+ getLanguage() {
209
+ return this.currentLanguage;
210
+ }
211
+ /**
212
+ * Get available OCR languages
213
+ */
214
+ async getAvailableLanguages() {
215
+ try {
216
+ this.recordOperation();
217
+ const languages = (await this.document?.getAvailableLanguages()) ||
218
+ Object.values(OcrLanguage);
219
+ return languages;
220
+ }
221
+ catch (error) {
222
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
223
+ throw error;
224
+ }
225
+ }
226
+ // ==========================================================================
227
+ // Processing & Export (from typed version)
228
+ // ==========================================================================
229
+ /**
230
+ * Preprocess page before OCR for better recognition
231
+ */
232
+ async preprocessPage(pageIndex, preprocessingType = 'auto') {
233
+ try {
234
+ this.recordOperation();
235
+ const result = await this.document?.preprocessPage(pageIndex, preprocessingType);
236
+ this.preprocessingType = preprocessingType;
237
+ this.emit('page-preprocessed', {
238
+ pageIndex,
239
+ type: preprocessingType,
240
+ timestamp: Date.now(),
241
+ });
242
+ return !!result;
243
+ }
244
+ catch (error) {
245
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
246
+ throw error;
247
+ }
248
+ }
249
+ /**
250
+ * Export OCR text to file
251
+ */
252
+ async exportOcrText(pageIndex, filePath, format = 'txt') {
253
+ try {
254
+ this.recordOperation();
255
+ const text = await this.recognizePage(pageIndex);
256
+ await fs.mkdir(dirname(filePath), { recursive: true });
257
+ let content;
258
+ switch (format) {
259
+ case 'json':
260
+ content = JSON.stringify({ pageIndex, text, timestamp: Date.now() }, null, 2);
261
+ break;
262
+ case 'xml':
263
+ content = `<?xml version="1.0"?>\n<page index="${pageIndex}">\n${text.split('\n').map(line => ` <line>${line}</line>`).join('\n')}\n</page>`;
264
+ break;
265
+ default:
266
+ content = text;
267
+ }
268
+ await fs.writeFile(filePath, content, 'utf8');
269
+ this.emit('text-exported', {
270
+ pageIndex,
271
+ filePath,
272
+ format,
273
+ size: content.length,
274
+ timestamp: Date.now(),
275
+ });
276
+ return true;
277
+ }
278
+ catch (error) {
279
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
280
+ throw error;
281
+ }
282
+ }
283
+ // ==========================================================================
284
+ // Statistics & Batch (from typed version)
285
+ // ==========================================================================
286
+ /**
287
+ * Get comprehensive OCR statistics for a page
288
+ */
289
+ async getOcrStatistics(pageIndex) {
290
+ try {
291
+ this.recordOperation();
292
+ const text = await this.recognizePage(pageIndex);
293
+ const confidence = await this.getOcrConfidence(pageIndex);
294
+ const regions = await this.detectTextRegions(pageIndex);
295
+ return {
296
+ pageIndex,
297
+ text,
298
+ confidence,
299
+ regionCount: regions.length,
300
+ };
301
+ }
302
+ catch (error) {
303
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
304
+ throw error;
305
+ }
306
+ }
307
+ /**
308
+ * Batch recognize multiple pages
309
+ */
310
+ async batchRecognizePages(startPage, endPage) {
311
+ try {
312
+ this.recordOperation();
313
+ const results = new Map();
314
+ for (let i = startPage; i <= endPage; i++) {
315
+ const text = await this.recognizePage(i);
316
+ results.set(i, text);
317
+ }
318
+ this.emit('batch-recognized', {
319
+ startPage,
320
+ endPage,
321
+ pageCount: endPage - startPage + 1,
322
+ totalCharacters: Array.from(results.values()).reduce((s, t) => s + t.length, 0),
323
+ timestamp: Date.now(),
324
+ });
325
+ return results;
326
+ }
327
+ catch (error) {
328
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
329
+ throw error;
330
+ }
331
+ }
332
+ /**
333
+ * Extract OCR text with aggregated statistics from page range (FFI-wired)
334
+ */
335
+ async extractPageRange(startPage, endPage, skipNonScanned = true) {
336
+ try {
337
+ this.recordOperation();
338
+ if (!this.ocrEngine) {
339
+ throw new Error('OCR engine not initialized');
340
+ }
341
+ let totalSpans = 0;
342
+ let confidenceSum = 0;
343
+ let skippedPages = 0;
344
+ for (let pageIdx = startPage; pageIdx <= endPage; pageIdx++) {
345
+ try {
346
+ if (skipNonScanned) {
347
+ const needsOcr = await this.pageNeedsOcr(pageIdx);
348
+ if (!needsOcr) {
349
+ skippedPages++;
350
+ continue;
351
+ }
352
+ }
353
+ const text = await this.recognizePage(pageIdx);
354
+ const confidence = await this.getOcrConfidence(pageIdx);
355
+ const regions = await this.detectTextRegions(pageIdx);
356
+ totalSpans += Math.max(regions.length, text ? 1 : 0);
357
+ confidenceSum += confidence;
358
+ }
359
+ catch {
360
+ continue;
361
+ }
362
+ }
363
+ const processedPages = endPage - startPage + 1 - skippedPages;
364
+ const avgConfidence = processedPages > 0 ? confidenceSum / processedPages : 0;
365
+ const result = {
366
+ startPage,
367
+ endPage,
368
+ totalPages: endPage - startPage + 1,
369
+ totalSpans,
370
+ averageConfidence: avgConfidence,
371
+ skippedPages,
372
+ };
373
+ this.emit('page-range-extracted', {
374
+ ...result,
375
+ timestamp: Date.now(),
376
+ });
377
+ this.setCached(`ocr-batch:${startPage}-${endPage}`, result);
378
+ return result;
379
+ }
380
+ catch (error) {
381
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
382
+ throw error;
383
+ }
384
+ }
385
+ // ==========================================================================
386
+ // Engine Status & Configuration (from typed version)
387
+ // ==========================================================================
388
+ /**
389
+ * Get OCR engine status and configuration
390
+ */
391
+ async getEngineStatus() {
392
+ try {
393
+ this.recordOperation();
394
+ if (!this.ocrEngine) {
395
+ return 'not_initialized';
396
+ }
397
+ return (await this.document?.getEngineStatus(this.ocrEngine)) || 'unknown';
398
+ }
399
+ catch (error) {
400
+ this.recordError(error instanceof Error ? error : new Error(String(error)));
401
+ throw error;
402
+ }
403
+ }
404
+ /**
405
+ * Get current OCR configuration
406
+ */
407
+ getConfiguration() {
408
+ return {
409
+ language: this.currentLanguage,
410
+ preprocessingType: this.preprocessingType,
411
+ engineInitialized: !!this.ocrEngine,
412
+ };
413
+ }
414
+ // ==========================================================================
415
+ // Methods from root-level OCRManager
416
+ // ==========================================================================
417
+ /**
418
+ * Extracts text from a page (convenience alias for recognizePage)
419
+ * From root-level OCRManager
420
+ */
421
+ async extractText(pageIndex, config) {
422
+ const cacheKey = `ocr:text:${pageIndex}:${this.currentLanguage}`;
423
+ const cached = this.getCached(cacheKey);
424
+ if (cached !== undefined) {
425
+ return cached;
426
+ }
427
+ let result = '';
428
+ if (this.document?.extractText) {
429
+ result = this.document.extractText(pageIndex) || '';
430
+ }
431
+ this.setCached(cacheKey, result);
432
+ this.emit('textExtracted', pageIndex, result.length);
433
+ return result;
434
+ }
435
+ /**
436
+ * Analyzes a page and returns detailed results
437
+ * From root-level OCRManager
438
+ */
439
+ async analyzePage(pageIndex, config) {
440
+ const cacheKey = `ocr:analysis:${pageIndex}:${this.currentLanguage}`;
441
+ const cached = this.getCached(cacheKey);
442
+ if (cached !== undefined) {
443
+ return cached;
444
+ }
445
+ let text = '';
446
+ let needsOcr = false;
447
+ if (this.document?.extractText) {
448
+ text = this.document.extractText(pageIndex) || '';
449
+ needsOcr = !text || text.trim().length < 10;
450
+ }
451
+ const result = {
452
+ pageIndex,
453
+ needsOcr,
454
+ confidence: needsOcr ? 0.0 : 0.95,
455
+ spanCount: text.split(' ').length || 0,
456
+ text,
457
+ };
458
+ this.setCached(cacheKey, result);
459
+ this.emit('pageAnalyzed', pageIndex, result);
460
+ return result;
461
+ }
462
+ /**
463
+ * Performs OCR analysis on all pages in the document
464
+ * From root-level OCRManager
465
+ */
466
+ async analyzeDocument(config) {
467
+ const cacheKey = `ocr:document:${this.currentLanguage}`;
468
+ const cached = this.getCached(cacheKey);
469
+ if (cached !== undefined) {
470
+ return cached;
471
+ }
472
+ const results = [];
473
+ const pageCount = this.document?.pageCount || 0;
474
+ for (let i = 0; i < pageCount; i++) {
475
+ const analysis = await this.analyzePage(i, config);
476
+ results.push(analysis);
477
+ this.emit('pageProcessed', i + 1, pageCount);
478
+ }
479
+ this.setCached(cacheKey, results);
480
+ this.emit('documentAnalyzed', results.length);
481
+ return results;
482
+ }
483
+ /**
484
+ * Extracts text spans with bounding boxes for a page
485
+ * From root-level OCRManager
486
+ */
487
+ async extractSpans(pageIndex, config) {
488
+ const cacheKey = `ocr:spans:${pageIndex}:${this.currentLanguage}`;
489
+ const cached = this.getCached(cacheKey);
490
+ if (cached !== undefined) {
491
+ return cached;
492
+ }
493
+ let spans = [];
494
+ if (this.native?.extract_spans) {
495
+ try {
496
+ const spansJson = this.native.extract_spans(pageIndex) ?? [];
497
+ spans = spansJson.length > 0 ? spansJson.map((json) => JSON.parse(json)) : [];
498
+ }
499
+ catch {
500
+ spans = [];
501
+ }
502
+ }
503
+ this.setCached(cacheKey, spans);
504
+ this.emit('spansExtracted', { page: pageIndex, count: spans.length });
505
+ return spans;
506
+ }
507
+ /**
508
+ * Checks if OCR is available/installed
509
+ * From root-level OCRManager
510
+ */
511
+ async isAvailable() {
512
+ const cacheKey = 'ocr:available';
513
+ const cached = this.getCached(cacheKey);
514
+ if (cached !== undefined) {
515
+ return cached;
516
+ }
517
+ const result = this.native ? true : false;
518
+ this.setCached(cacheKey, result);
519
+ return result;
520
+ }
521
+ /**
522
+ * Gets OCR engine version
523
+ * From root-level OCRManager
524
+ */
525
+ async getVersion() {
526
+ const cacheKey = 'ocr:version';
527
+ const cached = this.getCached(cacheKey);
528
+ if (cached !== undefined) {
529
+ return cached;
530
+ }
531
+ let version = '0.0.0';
532
+ if (this.native?.get_ocr_version) {
533
+ try {
534
+ version = this.native.get_ocr_version() ?? '0.0.0';
535
+ }
536
+ catch {
537
+ version = '0.0.0';
538
+ }
539
+ }
540
+ this.setCached(cacheKey, version);
541
+ return version;
542
+ }
543
+ // ==========================================================================
544
+ // Cache Operations (from root-level OCRManager)
545
+ // ==========================================================================
546
+ /**
547
+ * Clears the result cache
548
+ */
549
+ clearCache() {
550
+ this.invalidateCache();
551
+ this.emit('cacheCleared');
552
+ }
553
+ /**
554
+ * Gets cache statistics
555
+ */
556
+ getCacheStats() {
557
+ return {
558
+ cacheSize: this.cache.size,
559
+ entries: Array.from(this.cache.keys()),
560
+ };
561
+ }
562
+ // ==========================================================================
563
+ // Cleanup
564
+ // ==========================================================================
565
+ /**
566
+ * Cleanup on destroy
567
+ */
568
+ async destroy() {
569
+ try {
570
+ await this.destroyOcrEngine();
571
+ this.invalidateCache();
572
+ this.removeAllListeners();
573
+ this.initialized = false;
574
+ }
575
+ catch (error) {
576
+ console.error('Error during OCR manager cleanup:', error);
577
+ }
578
+ }
579
+ }
580
+ /** @deprecated Use OcrManager instead */
581
+ export const OCRManager = OcrManager;
582
+ export default OcrManager;
583
+ //# sourceMappingURL=ocr-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr-manager.js","sourceRoot":"","sources":["../../src/managers/ocr-manager.ts"],"names":[],"mappings":"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"}