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
@@ -1,151 +0,0 @@
1
- /**
2
- * Builder for text search options
3
- *
4
- * Configures how text search is performed in PDF documents,
5
- * including case sensitivity, whole word matching, and regex support.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { SearchOptionsBuilder } from 'pdf_oxide';
10
- *
11
- * const options = SearchOptionsBuilder.create()
12
- * .caseSensitive(false)
13
- * .wholeWords(true)
14
- * .useRegex(false)
15
- * .build();
16
- *
17
- * const results = doc.search('pattern', 0, options);
18
- * ```
19
- */
20
-
21
- export interface SearchOptions {
22
- caseSensitive: boolean;
23
- wholeWords: boolean;
24
- useRegex: boolean;
25
- ignoreAccents: boolean;
26
- maxResults: number;
27
- searchAnnotations: boolean;
28
- }
29
-
30
- export class SearchOptionsBuilder {
31
- private _caseSensitive: boolean = false;
32
- private _wholeWords: boolean = false;
33
- private _useRegex: boolean = false;
34
- private _ignoreAccents: boolean = false;
35
- private _maxResults: number = 1000;
36
- private _searchAnnotations: boolean = false;
37
-
38
- /**
39
- * Creates a new SearchOptionsBuilder instance
40
- * @private
41
- */
42
- private constructor() {}
43
-
44
- /**
45
- * Creates a new SearchOptionsBuilder instance
46
- * @returns New builder instance
47
- */
48
- static create(): SearchOptionsBuilder {
49
- return new SearchOptionsBuilder();
50
- }
51
-
52
- /**
53
- * Creates options with default search settings (case-insensitive, no regex)
54
- * @returns Search options with default preset
55
- */
56
- static default(): SearchOptions {
57
- return SearchOptionsBuilder.create().build();
58
- }
59
-
60
- /**
61
- * Creates options with strict search settings (case-sensitive, whole words, no regex)
62
- * @returns Search options with strict preset
63
- */
64
- static strict(): SearchOptions {
65
- return SearchOptionsBuilder.create()
66
- .caseSensitive(true)
67
- .wholeWords(true)
68
- .useRegex(false)
69
- .build();
70
- }
71
-
72
- /**
73
- * Creates options with regex search settings
74
- * @returns Search options with regex preset
75
- */
76
- static regex(): SearchOptions {
77
- return SearchOptionsBuilder.create()
78
- .useRegex(true)
79
- .caseSensitive(false)
80
- .wholeWords(false)
81
- .build();
82
- }
83
-
84
- caseSensitive(sensitive: boolean): this {
85
- if (typeof sensitive !== 'boolean') {
86
- throw new Error('caseSensitive must be a boolean');
87
- }
88
- this._caseSensitive = sensitive;
89
- return this;
90
- }
91
-
92
- wholeWords(wholeOnly: boolean): this {
93
- if (typeof wholeOnly !== 'boolean') {
94
- throw new Error('wholeWords must be a boolean');
95
- }
96
- this._wholeWords = wholeOnly;
97
- return this;
98
- }
99
-
100
- useRegex(regex: boolean): this {
101
- if (typeof regex !== 'boolean') {
102
- throw new Error('useRegex must be a boolean');
103
- }
104
- this._useRegex = regex;
105
- return this;
106
- }
107
-
108
- ignoreAccents(ignore: boolean): this {
109
- if (typeof ignore !== 'boolean') {
110
- throw new Error('ignoreAccents must be a boolean');
111
- }
112
- this._ignoreAccents = ignore;
113
- return this;
114
- }
115
-
116
- maxResults(max: number): this {
117
- if (typeof max !== 'number' || max <= 0) {
118
- throw new Error('maxResults must be a positive number');
119
- }
120
- this._maxResults = Math.floor(max);
121
- return this;
122
- }
123
-
124
- searchAnnotations(search: boolean): this {
125
- if (typeof search !== 'boolean') {
126
- throw new Error('searchAnnotations must be a boolean');
127
- }
128
- this._searchAnnotations = search;
129
- return this;
130
- }
131
-
132
- build(): SearchOptions {
133
- return {
134
- caseSensitive: this._caseSensitive,
135
- wholeWords: this._wholeWords,
136
- useRegex: this._useRegex,
137
- ignoreAccents: this._ignoreAccents,
138
- maxResults: this._maxResults,
139
- searchAnnotations: this._searchAnnotations,
140
- };
141
- }
142
- }
143
-
144
- /**
145
- * Create a new SearchOptionsBuilder with static factory
146
- * @deprecated Use SearchOptionsBuilder.create() instead
147
- * @returns New builder instance
148
- */
149
- export function createSearchOptionsBuilder(): SearchOptionsBuilder {
150
- return SearchOptionsBuilder.create();
151
- }
@@ -1,318 +0,0 @@
1
- /**
2
- * DocumentEditorManager for PDF document editing operations
3
- *
4
- * Provides methods to edit and modify PDF documents including page operations,
5
- * content manipulation, and document merging. API is consistent with Python,
6
- * Java, C#, Go, and Swift implementations.
7
- */
8
-
9
- import { EventEmitter } from 'events';
10
-
11
- /**
12
- * Page rotation options
13
- */
14
- export enum PageRotation {
15
- None = 0,
16
- Rotate90 = 90,
17
- Rotate180 = 180,
18
- Rotate270 = 270,
19
- }
20
-
21
- /**
22
- * Configuration for page insertion
23
- */
24
- export interface InsertConfig {
25
- pageIndex: number;
26
- width?: number;
27
- height?: number;
28
- content?: Buffer;
29
- }
30
-
31
- /**
32
- * Configuration for page extraction
33
- */
34
- export interface ExtractConfig {
35
- startPage: number;
36
- endPage: number;
37
- outputPath?: string;
38
- }
39
-
40
- /**
41
- * Configuration for document merging
42
- */
43
- export interface MergeConfig {
44
- documents: any[];
45
- outputPath?: string;
46
- preserveOutlines?: boolean;
47
- preserveAnnotations?: boolean;
48
- }
49
-
50
- /**
51
- * Edit operation record
52
- */
53
- export interface EditOperation {
54
- type: string;
55
- timestamp: Date;
56
- details: Record<string, any>;
57
- }
58
-
59
- /**
60
- * Document Editor Manager for document manipulation
61
- *
62
- * Provides methods to:
63
- * - Delete, insert, and reorder pages
64
- * - Rotate pages
65
- * - Extract page ranges to new documents
66
- * - Merge multiple documents
67
- * - Track edit history
68
- */
69
- export class DocumentEditorManager extends EventEmitter {
70
- private document: any;
71
- private editHistory: EditOperation[] = [];
72
- private hasUnsavedChanges = false;
73
-
74
- constructor(document: any) {
75
- super();
76
- if (!document) {
77
- throw new Error('Document is required');
78
- }
79
- this.document = document;
80
- }
81
-
82
- /**
83
- * Deletes a page from the document
84
- * Matches: Python deletePage(), Java deletePage(), C# DeletePage()
85
- */
86
- async deletePage(pageIndex: number): Promise<void> {
87
- this.validatePageIndex(pageIndex);
88
-
89
- try {
90
- if (this.document?.removePage) {
91
- this.document.removePage(pageIndex);
92
- }
93
- this.recordOperation('deletePage', { pageIndex });
94
- this.emit('pageDeleted', pageIndex);
95
- } catch (error) {
96
- this.emit('error', error);
97
- throw error;
98
- }
99
- }
100
-
101
- /**
102
- * Deletes multiple pages from the document
103
- * Matches: Python deletePages(), Java deletePages(), C# DeletePages()
104
- */
105
- async deletePages(pageIndices: number[]): Promise<void> {
106
- // Sort in descending order to avoid index shifting issues
107
- const sorted = [...pageIndices].sort((a, b) => b - a);
108
-
109
- for (const pageIndex of sorted) {
110
- await this.deletePage(pageIndex);
111
- }
112
- }
113
-
114
- /**
115
- * Inserts a blank page at the specified position
116
- * Matches: Python insertBlankPage(), Java insertBlankPage(), C# InsertBlankPage()
117
- */
118
- async insertBlankPage(pageIndex: number, width = 612, height = 792): Promise<void> {
119
- try {
120
- if (this.document?.insertPage) {
121
- this.document.insertPage(pageIndex, width, height);
122
- }
123
- this.recordOperation('insertBlankPage', { pageIndex, width, height });
124
- this.emit('pageInserted', pageIndex);
125
- } catch (error) {
126
- this.emit('error', error);
127
- throw error;
128
- }
129
- }
130
-
131
- /**
132
- * Rotates a page by the specified angle
133
- * Matches: Python rotatePage(), Java rotatePage(), C# RotatePage()
134
- */
135
- async rotatePage(pageIndex: number, rotation: PageRotation): Promise<void> {
136
- this.validatePageIndex(pageIndex);
137
-
138
- try {
139
- if (this.document?.rotatePage) {
140
- this.document.rotatePage(pageIndex, rotation);
141
- }
142
- this.recordOperation('rotatePage', { pageIndex, rotation });
143
- this.emit('pageRotated', pageIndex, rotation);
144
- } catch (error) {
145
- this.emit('error', error);
146
- throw error;
147
- }
148
- }
149
-
150
- /**
151
- * Rotates multiple pages
152
- * Matches: Python rotatePages(), Java rotatePages(), C# RotatePages()
153
- */
154
- async rotatePages(pageIndices: number[], rotation: PageRotation): Promise<void> {
155
- for (const pageIndex of pageIndices) {
156
- await this.rotatePage(pageIndex, rotation);
157
- }
158
- }
159
-
160
- /**
161
- * Moves a page to a new position
162
- * Matches: Python movePage(), Java movePage(), C# MovePage()
163
- */
164
- async movePage(fromIndex: number, toIndex: number): Promise<void> {
165
- this.validatePageIndex(fromIndex);
166
- this.validatePageIndex(toIndex);
167
-
168
- try {
169
- // Implement move by extracting and re-inserting
170
- if (this.document?.getPage && this.document?.removePage && this.document?.insertPage) {
171
- const page = this.document.getPage(fromIndex);
172
- this.document.removePage(fromIndex);
173
- // Note: After removal, toIndex may need adjustment
174
- const adjustedIndex = toIndex > fromIndex ? toIndex - 1 : toIndex;
175
- if (page) {
176
- this.document.insertPage(adjustedIndex, page.getWidth?.(), page.getHeight?.());
177
- }
178
- }
179
- this.recordOperation('movePage', { fromIndex, toIndex });
180
- this.emit('pageMoved', fromIndex, toIndex);
181
- } catch (error) {
182
- this.emit('error', error);
183
- throw error;
184
- }
185
- }
186
-
187
- /**
188
- * Extracts pages to a new document
189
- * Matches: Python extractPages(), Java extractPages(), C# ExtractPages()
190
- */
191
- async extractPages(config: ExtractConfig): Promise<any> {
192
- const { startPage, endPage } = config;
193
- this.validatePageIndex(startPage);
194
- this.validatePageIndex(endPage);
195
-
196
- // FFI call placeholder
197
- // const newDoc = await FFI.extractPages(this.document.handle, startPage, endPage);
198
-
199
- this.recordOperation('extractPages', { startPage, endPage });
200
- this.emit('pagesExtracted', startPage, endPage);
201
-
202
- return null; // Placeholder - would return new document
203
- }
204
-
205
- /**
206
- * Merges multiple documents into one
207
- * Matches: Python mergeDocuments(), Java mergeDocuments(), C# MergeDocuments()
208
- */
209
- static async mergeDocuments(config: MergeConfig): Promise<any> {
210
- const { documents, preserveOutlines = true, preserveAnnotations = true } = config;
211
-
212
- if (!documents || documents.length === 0) {
213
- throw new Error('At least one document is required for merging');
214
- }
215
-
216
- // FFI call placeholder
217
- // const merged = await FFI.mergeDocuments(documents, preserveOutlines, preserveAnnotations);
218
-
219
- return null; // Placeholder - would return merged document
220
- }
221
-
222
- /**
223
- * Saves the document with all modifications
224
- * Matches: Python save(), Java save(), C# Save()
225
- */
226
- async save(outputPath?: string): Promise<void> {
227
- try {
228
- if (outputPath) {
229
- // Save to file path
230
- if (this.document?.save_async) {
231
- await this.document.save_async(outputPath);
232
- } else if (this.document?.saveToPath) {
233
- this.document.saveToPath(outputPath);
234
- }
235
- } else {
236
- // Save changes to current document
237
- if (this.document?.save_async) {
238
- await this.document.save_async(this.document.filePath || 'output.pdf');
239
- }
240
- }
241
- this.hasUnsavedChanges = false;
242
- this.emit('saved', outputPath);
243
- } catch (error) {
244
- this.emit('error', error);
245
- throw error;
246
- }
247
- }
248
-
249
- /**
250
- * Gets the edit history
251
- * Matches: Python getEditHistory(), Java getEditHistory(), C# GetEditHistory()
252
- */
253
- getEditHistory(): EditOperation[] {
254
- return [...this.editHistory];
255
- }
256
-
257
- /**
258
- * Checks if there are unsaved changes
259
- * Matches: Python hasUnsavedChanges(), Java hasUnsavedChanges(), C# HasUnsavedChanges()
260
- */
261
- hasChanges(): boolean {
262
- return this.hasUnsavedChanges;
263
- }
264
-
265
- /**
266
- * Undoes the last operation (if supported)
267
- * Matches: Python undo(), Java undo(), C# Undo()
268
- */
269
- async undo(): Promise<boolean> {
270
- if (this.editHistory.length === 0) {
271
- return false;
272
- }
273
-
274
- // Placeholder - would implement undo logic
275
- this.editHistory.pop();
276
- this.emit('undone');
277
- return true;
278
- }
279
-
280
- /**
281
- * Clears the edit history
282
- * Matches: Python clearHistory(), Java clearHistory(), C# ClearHistory()
283
- */
284
- clearHistory(): void {
285
- this.editHistory = [];
286
- this.emit('historyCleared');
287
- }
288
-
289
- /**
290
- * Gets the page count after modifications
291
- */
292
- getPageCount(): number {
293
- try {
294
- return this.document.pageCount || 0;
295
- } catch {
296
- return 0;
297
- }
298
- }
299
-
300
- // Private helper methods
301
- private validatePageIndex(pageIndex: number): void {
302
- const count = this.getPageCount();
303
- if (pageIndex < 0 || pageIndex >= count) {
304
- throw new Error(`Invalid page index: ${pageIndex}. Document has ${count} pages.`);
305
- }
306
- }
307
-
308
- private recordOperation(type: string, details: Record<string, any>): void {
309
- this.editHistory.push({
310
- type,
311
- timestamp: new Date(),
312
- details,
313
- });
314
- this.hasUnsavedChanges = true;
315
- }
316
- }
317
-
318
- export default DocumentEditorManager;