@ooneex/pdf 1.1.1 → 1.1.3

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/dist/index.js CHANGED
@@ -1,6 +1,496 @@
1
1
  // @bun
2
- import V from"path";import{PDFDocument as Y,rgb as O,StandardFonts as v}from"pdf-lib";import{pdf as R}from"pdf-to-img";import z from"sharp";import{extractImages as B,getDocumentProxy as S}from"unpdf";import{Exception as W}from"@ooneex/exception";import{HttpStatus as I}from"@ooneex/http-status";class G extends W{constructor(C,j={}){super(C,{status:I.Code.InternalServerError,data:j});this.name="PDFException"}}class T{source;options;constructor(C,j={}){this.source=V.join(...C.split(/[/\\]/)),this.options={scale:j.scale??3,...j.password!==void 0&&{password:j.password}}}async create(C={}){try{let j=await Y.create();if(C.title)j.setTitle(C.title);if(C.author)j.setAuthor(C.author);if(C.subject)j.setSubject(C.subject);if(C.keywords)j.setKeywords(C.keywords);if(C.producer)j.setProducer(C.producer);if(C.creator)j.setCreator(C.creator);let q=await j.save();return await Bun.write(this.source,q),{pageCount:j.getPageCount()}}catch(j){if(j instanceof G)throw j;throw new G("Failed to create PDF document",{source:this.source,error:j instanceof Error?j.message:String(j)})}}async addPage(C={}){try{let j=await Bun.file(this.source).arrayBuffer(),q=await Y.load(j,{ignoreEncryption:this.options.password!==void 0}),A=q.addPage();if(C.content){let J=await q.embedFont(v.Helvetica),L=C.fontSize??12,K=50,M=L*1.2,{height:Q}=A.getSize(),U=Q-50,Z=C.content.split(`
3
- `);for(let _ of Z){if(U<50)break;A.drawText(_,{x:50,y:U,size:L,font:J,color:O(0,0,0)}),U-=M}}let H=await q.save();return await Bun.write(this.source,H),{pageCount:q.getPageCount()}}catch(j){if(j instanceof G)throw j;throw new G("Failed to add page to PDF",{source:this.source,error:j instanceof Error?j.message:String(j)})}}async getMetadata(){try{let C=await Bun.file(this.source).arrayBuffer(),j=await Y.load(C,{ignoreEncryption:this.options.password!==void 0,updateMetadata:!1});return{title:j.getTitle(),author:j.getAuthor(),subject:j.getSubject(),keywords:j.getKeywords(),producer:j.getProducer(),creator:j.getCreator(),creationDate:j.getCreationDate(),modificationDate:j.getModificationDate(),pageCount:j.getPageCount()}}catch(C){if(C instanceof G)throw C;throw new G("Failed to get PDF metadata",{source:this.source,error:C instanceof Error?C.message:String(C)})}}async updateMetadata(C){try{let j=await Bun.file(this.source).arrayBuffer(),q=await Y.load(j,{ignoreEncryption:this.options.password!==void 0});if(C.title!==void 0)q.setTitle(C.title);if(C.author!==void 0)q.setAuthor(C.author);if(C.subject!==void 0)q.setSubject(C.subject);if(C.keywords!==void 0)q.setKeywords(C.keywords);if(C.producer!==void 0)q.setProducer(C.producer);if(C.creator!==void 0)q.setCreator(C.creator);if(C.creationDate!==void 0)q.setCreationDate(C.creationDate);if(C.modificationDate!==void 0)q.setModificationDate(C.modificationDate);let A=await q.save();await Bun.write(this.source,A)}catch(j){if(j instanceof G)throw j;throw new G("Failed to update PDF metadata",{source:this.source,error:j instanceof Error?j.message:String(j)})}}async getPageCount(){try{let C=await Bun.file(this.source).arrayBuffer();return(await Y.load(C,{ignoreEncryption:this.options.password!==void 0,updateMetadata:!1})).getPageCount()}catch(C){throw new G("Failed to get page count",{source:this.source,error:C instanceof Error?C.message:String(C)})}}async getPageContent(C){if(C<1||!Number.isInteger(C))throw new G("Page number must be a positive integer",{pageNumber:C});try{let j=await Bun.file(this.source).arrayBuffer(),q=await S(new Uint8Array(j)),A=q.numPages;if(C>A)throw new G("Page number exceeds total pages",{pageNumber:C,totalPages:A});return(await(await q.getPage(C)).getTextContent()).items.filter((K)=>("str"in K)).map((K)=>("hasEOL"in K)&&K.hasEOL?`${K.str}
4
- `:K.str).join("").trim()}catch(j){if(j instanceof G)throw j;throw new G("Failed to get page content",{source:this.source,pageNumber:C,error:j instanceof Error?j.message:String(j)})}}async getImages(C){let{pageNumber:j}=C;if(j!==void 0&&(j<1||!Number.isInteger(j)))throw new G("Page number must be a positive integer",{pageNumber:j});let q=V.join(...C.outputDir.split(/[/\\]/)),A=C.prefix??"image";try{let H=await Bun.file(this.source).arrayBuffer(),J=await S(new Uint8Array(H)),L=J.numPages;if(j!==void 0&&j>L)throw new G("Page number exceeds total pages",{pageNumber:j,totalPages:L});let K=async(Q)=>{let U=await B(J,Q),Z=[],_=0;for(let X of U){_++;let w=`${A}-p${Q}-${_}.png`,$=V.join(q,w),k=await z(X.data,{raw:{width:X.width,height:X.height,channels:X.channels}}).png().toBuffer();await Bun.write($,k),Z.push({page:Q,path:$,width:X.width,height:X.height})}return Z};if(j!==void 0)return await K(j);return(await Promise.all(Array.from({length:L},(Q,U)=>K(U+1)))).flat()}catch(H){if(H instanceof G)throw H;throw new G("Failed to extract images from PDF",{source:this.source,outputDir:q,pageNumber:j,error:H instanceof Error?H.message:String(H)})}}async*pagesToImages(C){let j=V.join(...C.outputDir.split(/[/\\]/)),q=C.prefix??"page",A=globalThis.pdfjsWorker;globalThis.pdfjsWorker=void 0;try{let H=await R(this.source,this.options),J=1;for await(let L of H){let K=`${q}-${J}.png`,M=V.join(j,K);await Bun.write(M,Buffer.from(L)),yield{page:J,path:M},J++}globalThis.pdfjsWorker=A}catch(H){throw globalThis.pdfjsWorker=A,new G("Failed to convert PDF to images",{source:this.source,outputDir:j,error:H instanceof Error?H.message:String(H)})}}async pageToImage(C,j){if(C<1||!Number.isInteger(C))throw new G("Page number must be a positive integer",{pageNumber:C});let q=V.join(...j.outputDir.split(/[/\\]/)),A=j.prefix??"page",H=globalThis.pdfjsWorker;globalThis.pdfjsWorker=void 0;try{let J=await R(this.source,this.options);if(C>J.length)throw new G("Page number exceeds total pages",{pageNumber:C,totalPages:J.length});let L=await J.getPage(C),K=`${A}-${C}.png`,M=V.join(q,K);return await Bun.write(M,Buffer.from(L)),globalThis.pdfjsWorker=H,{page:C,path:M}}catch(J){if(globalThis.pdfjsWorker=H,J instanceof G)throw J;throw new G("Failed to get page image",{source:this.source,pageNumber:C,outputDir:q,error:J instanceof Error?J.message:String(J)})}}async*split(C){let j=V.join(...C.outputDir.split(/[/\\]/)),q=C.prefix??"page";try{let A=await Bun.file(this.source).arrayBuffer(),H=await Y.load(A,{ignoreEncryption:this.options.password!==void 0}),J=H.getPageCount();if(J===0)throw new G("PDF has no pages",{source:this.source});let L=this.normalizeRanges(C.ranges,J);for(let{start:K,end:M}of L)if(K<1||M>J||K>M)throw new G("Invalid page range",{start:K,end:M,totalPages:J});for(let{start:K,end:M}of L){let Q=await Y.create(),U=Array.from({length:M-K+1},($,k)=>K-1+k),Z=await Q.copyPages(H,U);for(let $ of Z)Q.addPage($);let _=await Q.save(),X=K===M?`${q}-${K}.pdf`:`${q}-${K}-${M}.pdf`,w=V.join(j,X);await Bun.write(w,_),yield{pages:{start:K,end:M},path:w}}}catch(A){if(A instanceof G)throw A;throw new G("Failed to split PDF",{source:this.source,outputDir:j,error:A instanceof Error?A.message:String(A)})}}async removePages(C){try{let j=await Bun.file(this.source).arrayBuffer(),q=await Y.load(j,{ignoreEncryption:this.options.password!==void 0}),A=q.getPageCount();if(A===0)throw new G("PDF has no pages",{source:this.source});let H=this.normalizePageNumbers(C,A);if(H.length===0)throw new G("No valid pages specified for removal",{pages:C});if(H.length>=A)throw new G("Cannot remove all pages from PDF",{pagesToRemove:H,totalPages:A});let J=[...H].sort((K,M)=>M-K);for(let K of J)q.removePage(K-1);let L=await q.save();return await Bun.write(this.source,L),{remainingPages:q.getPageCount()}}catch(j){if(j instanceof G)throw j;throw new G("Failed to remove pages from PDF",{source:this.source,pages:C,error:j instanceof Error?j.message:String(j)})}}normalizePageNumbers(C,j){let q=new Set;for(let A of C)if(typeof A==="number"){if(A>=1&&A<=j&&Number.isInteger(A))q.add(A)}else{let[H,J]=A;if(H<=J){for(let L=Math.max(1,H);L<=Math.min(j,J);L++)if(Number.isInteger(L))q.add(L)}}return Array.from(q)}normalizeRanges(C,j){if(!C||C.length===0)return Array.from({length:j},(q,A)=>({start:A+1,end:A+1}));return C.map((q)=>{if(typeof q==="number")return{start:q,end:q};return{start:q[0],end:q[1]}})}}export{G as PDFException,T as PDF};
2
+ // src/PDF.ts
3
+ import path from "path";
4
+ import { PDFDocument, rgb, StandardFonts } from "pdf-lib";
5
+ import { pdf } from "pdf-to-img";
6
+ import sharp from "sharp";
7
+ import { extractImages, getDocumentProxy } from "unpdf";
5
8
 
6
- //# debugId=D77D34577E7BB37C64756E2164756E21
9
+ // src/PDFException.ts
10
+ import { Exception } from "@ooneex/exception";
11
+ import { HttpStatus } from "@ooneex/http-status";
12
+
13
+ class PDFException extends Exception {
14
+ constructor(message, data = {}) {
15
+ super(message, {
16
+ status: HttpStatus.Code.InternalServerError,
17
+ data
18
+ });
19
+ this.name = "PDFException";
20
+ }
21
+ }
22
+
23
+ // src/PDF.ts
24
+ class PDF {
25
+ source;
26
+ options;
27
+ constructor(source, options = {}) {
28
+ this.source = path.join(...source.split(/[/\\]/));
29
+ this.options = {
30
+ scale: options.scale ?? 3,
31
+ ...options.password !== undefined && { password: options.password }
32
+ };
33
+ }
34
+ async create(options = {}) {
35
+ try {
36
+ const pdfDoc = await PDFDocument.create();
37
+ if (options.title) {
38
+ pdfDoc.setTitle(options.title);
39
+ }
40
+ if (options.author) {
41
+ pdfDoc.setAuthor(options.author);
42
+ }
43
+ if (options.subject) {
44
+ pdfDoc.setSubject(options.subject);
45
+ }
46
+ if (options.keywords) {
47
+ pdfDoc.setKeywords(options.keywords);
48
+ }
49
+ if (options.producer) {
50
+ pdfDoc.setProducer(options.producer);
51
+ }
52
+ if (options.creator) {
53
+ pdfDoc.setCreator(options.creator);
54
+ }
55
+ const pdfBytes = await pdfDoc.save();
56
+ await Bun.write(this.source, pdfBytes);
57
+ return {
58
+ pageCount: pdfDoc.getPageCount()
59
+ };
60
+ } catch (error) {
61
+ if (error instanceof PDFException) {
62
+ throw error;
63
+ }
64
+ throw new PDFException("Failed to create PDF document", {
65
+ source: this.source,
66
+ error: error instanceof Error ? error.message : String(error)
67
+ });
68
+ }
69
+ }
70
+ async addPage(options = {}) {
71
+ try {
72
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
73
+ const pdfDoc = await PDFDocument.load(sourceBytes, {
74
+ ignoreEncryption: this.options.password !== undefined
75
+ });
76
+ const page = pdfDoc.addPage();
77
+ if (options.content) {
78
+ const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
79
+ const fontSize = options.fontSize ?? 12;
80
+ const margin = 50;
81
+ const lineHeight = fontSize * 1.2;
82
+ const { height } = page.getSize();
83
+ let y = height - margin;
84
+ const lines = options.content.split(`
85
+ `);
86
+ for (const line of lines) {
87
+ if (y < margin) {
88
+ break;
89
+ }
90
+ page.drawText(line, {
91
+ x: margin,
92
+ y,
93
+ size: fontSize,
94
+ font,
95
+ color: rgb(0, 0, 0)
96
+ });
97
+ y -= lineHeight;
98
+ }
99
+ }
100
+ const pdfBytes = await pdfDoc.save();
101
+ await Bun.write(this.source, pdfBytes);
102
+ return {
103
+ pageCount: pdfDoc.getPageCount()
104
+ };
105
+ } catch (error) {
106
+ if (error instanceof PDFException) {
107
+ throw error;
108
+ }
109
+ throw new PDFException("Failed to add page to PDF", {
110
+ source: this.source,
111
+ error: error instanceof Error ? error.message : String(error)
112
+ });
113
+ }
114
+ }
115
+ async getMetadata() {
116
+ try {
117
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
118
+ const pdfDoc = await PDFDocument.load(sourceBytes, {
119
+ ignoreEncryption: this.options.password !== undefined,
120
+ updateMetadata: false
121
+ });
122
+ return {
123
+ title: pdfDoc.getTitle(),
124
+ author: pdfDoc.getAuthor(),
125
+ subject: pdfDoc.getSubject(),
126
+ keywords: pdfDoc.getKeywords(),
127
+ producer: pdfDoc.getProducer(),
128
+ creator: pdfDoc.getCreator(),
129
+ creationDate: pdfDoc.getCreationDate(),
130
+ modificationDate: pdfDoc.getModificationDate(),
131
+ pageCount: pdfDoc.getPageCount()
132
+ };
133
+ } catch (error) {
134
+ if (error instanceof PDFException) {
135
+ throw error;
136
+ }
137
+ throw new PDFException("Failed to get PDF metadata", {
138
+ source: this.source,
139
+ error: error instanceof Error ? error.message : String(error)
140
+ });
141
+ }
142
+ }
143
+ async updateMetadata(options) {
144
+ try {
145
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
146
+ const pdfDoc = await PDFDocument.load(sourceBytes, {
147
+ ignoreEncryption: this.options.password !== undefined
148
+ });
149
+ if (options.title !== undefined) {
150
+ pdfDoc.setTitle(options.title);
151
+ }
152
+ if (options.author !== undefined) {
153
+ pdfDoc.setAuthor(options.author);
154
+ }
155
+ if (options.subject !== undefined) {
156
+ pdfDoc.setSubject(options.subject);
157
+ }
158
+ if (options.keywords !== undefined) {
159
+ pdfDoc.setKeywords(options.keywords);
160
+ }
161
+ if (options.producer !== undefined) {
162
+ pdfDoc.setProducer(options.producer);
163
+ }
164
+ if (options.creator !== undefined) {
165
+ pdfDoc.setCreator(options.creator);
166
+ }
167
+ if (options.creationDate !== undefined) {
168
+ pdfDoc.setCreationDate(options.creationDate);
169
+ }
170
+ if (options.modificationDate !== undefined) {
171
+ pdfDoc.setModificationDate(options.modificationDate);
172
+ }
173
+ const pdfBytes = await pdfDoc.save();
174
+ await Bun.write(this.source, pdfBytes);
175
+ } catch (error) {
176
+ if (error instanceof PDFException) {
177
+ throw error;
178
+ }
179
+ throw new PDFException("Failed to update PDF metadata", {
180
+ source: this.source,
181
+ error: error instanceof Error ? error.message : String(error)
182
+ });
183
+ }
184
+ }
185
+ async getPageCount() {
186
+ try {
187
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
188
+ const pdfDoc = await PDFDocument.load(sourceBytes, {
189
+ ignoreEncryption: this.options.password !== undefined,
190
+ updateMetadata: false
191
+ });
192
+ return pdfDoc.getPageCount();
193
+ } catch (error) {
194
+ throw new PDFException("Failed to get page count", {
195
+ source: this.source,
196
+ error: error instanceof Error ? error.message : String(error)
197
+ });
198
+ }
199
+ }
200
+ async getPageContent(pageNumber) {
201
+ if (pageNumber < 1 || !Number.isInteger(pageNumber)) {
202
+ throw new PDFException("Page number must be a positive integer", {
203
+ pageNumber
204
+ });
205
+ }
206
+ try {
207
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
208
+ const document = await getDocumentProxy(new Uint8Array(sourceBytes));
209
+ const totalPages = document.numPages;
210
+ if (pageNumber > totalPages) {
211
+ throw new PDFException("Page number exceeds total pages", {
212
+ pageNumber,
213
+ totalPages
214
+ });
215
+ }
216
+ const page = await document.getPage(pageNumber);
217
+ const textContent = await page.getTextContent();
218
+ const text = textContent.items.filter((item) => ("str" in item)).map((item) => ("hasEOL" in item) && item.hasEOL ? `${item.str}
219
+ ` : item.str).join("");
220
+ return text.trim();
221
+ } catch (error) {
222
+ if (error instanceof PDFException) {
223
+ throw error;
224
+ }
225
+ throw new PDFException("Failed to get page content", {
226
+ source: this.source,
227
+ pageNumber,
228
+ error: error instanceof Error ? error.message : String(error)
229
+ });
230
+ }
231
+ }
232
+ async getImages(options) {
233
+ const { pageNumber } = options;
234
+ if (pageNumber !== undefined && (pageNumber < 1 || !Number.isInteger(pageNumber))) {
235
+ throw new PDFException("Page number must be a positive integer", {
236
+ pageNumber
237
+ });
238
+ }
239
+ const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\]/));
240
+ const prefix = options.prefix ?? "image";
241
+ try {
242
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
243
+ const document = await getDocumentProxy(new Uint8Array(sourceBytes));
244
+ const totalPages = document.numPages;
245
+ if (pageNumber !== undefined && pageNumber > totalPages) {
246
+ throw new PDFException("Page number exceeds total pages", {
247
+ pageNumber,
248
+ totalPages
249
+ });
250
+ }
251
+ const processPage = async (page) => {
252
+ const pageImages = await extractImages(document, page);
253
+ const results = [];
254
+ let imageIndex = 0;
255
+ for (const img of pageImages) {
256
+ imageIndex++;
257
+ const fileName = `${prefix}-p${page}-${imageIndex}.png`;
258
+ const filePath = path.join(normalizedOutputDir, fileName);
259
+ const pngBuffer = await sharp(img.data, {
260
+ raw: {
261
+ width: img.width,
262
+ height: img.height,
263
+ channels: img.channels
264
+ }
265
+ }).png().toBuffer();
266
+ await Bun.write(filePath, pngBuffer);
267
+ results.push({
268
+ page,
269
+ path: filePath,
270
+ width: img.width,
271
+ height: img.height
272
+ });
273
+ }
274
+ return results;
275
+ };
276
+ if (pageNumber !== undefined) {
277
+ return await processPage(pageNumber);
278
+ }
279
+ const allResults = await Promise.all(Array.from({ length: totalPages }, (_, i) => processPage(i + 1)));
280
+ return allResults.flat();
281
+ } catch (error) {
282
+ if (error instanceof PDFException) {
283
+ throw error;
284
+ }
285
+ throw new PDFException("Failed to extract images from PDF", {
286
+ source: this.source,
287
+ outputDir: normalizedOutputDir,
288
+ pageNumber,
289
+ error: error instanceof Error ? error.message : String(error)
290
+ });
291
+ }
292
+ }
293
+ async* pagesToImages(options) {
294
+ const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\]/));
295
+ const prefix = options.prefix ?? "page";
296
+ const savedWorker = globalThis.pdfjsWorker;
297
+ globalThis.pdfjsWorker = undefined;
298
+ try {
299
+ const document = await pdf(this.source, this.options);
300
+ let pageNumber = 1;
301
+ for await (const image of document) {
302
+ const fileName = `${prefix}-${pageNumber}.png`;
303
+ const filePath = path.join(normalizedOutputDir, fileName);
304
+ await Bun.write(filePath, Buffer.from(image));
305
+ yield {
306
+ page: pageNumber,
307
+ path: filePath
308
+ };
309
+ pageNumber++;
310
+ }
311
+ globalThis.pdfjsWorker = savedWorker;
312
+ } catch (error) {
313
+ globalThis.pdfjsWorker = savedWorker;
314
+ throw new PDFException("Failed to convert PDF to images", {
315
+ source: this.source,
316
+ outputDir: normalizedOutputDir,
317
+ error: error instanceof Error ? error.message : String(error)
318
+ });
319
+ }
320
+ }
321
+ async pageToImage(pageNumber, options) {
322
+ if (pageNumber < 1 || !Number.isInteger(pageNumber)) {
323
+ throw new PDFException("Page number must be a positive integer", {
324
+ pageNumber
325
+ });
326
+ }
327
+ const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\]/));
328
+ const prefix = options.prefix ?? "page";
329
+ const savedWorker = globalThis.pdfjsWorker;
330
+ globalThis.pdfjsWorker = undefined;
331
+ try {
332
+ const document = await pdf(this.source, this.options);
333
+ if (pageNumber > document.length) {
334
+ throw new PDFException("Page number exceeds total pages", {
335
+ pageNumber,
336
+ totalPages: document.length
337
+ });
338
+ }
339
+ const image = await document.getPage(pageNumber);
340
+ const fileName = `${prefix}-${pageNumber}.png`;
341
+ const filePath = path.join(normalizedOutputDir, fileName);
342
+ await Bun.write(filePath, Buffer.from(image));
343
+ globalThis.pdfjsWorker = savedWorker;
344
+ return {
345
+ page: pageNumber,
346
+ path: filePath
347
+ };
348
+ } catch (error) {
349
+ globalThis.pdfjsWorker = savedWorker;
350
+ if (error instanceof PDFException) {
351
+ throw error;
352
+ }
353
+ throw new PDFException("Failed to get page image", {
354
+ source: this.source,
355
+ pageNumber,
356
+ outputDir: normalizedOutputDir,
357
+ error: error instanceof Error ? error.message : String(error)
358
+ });
359
+ }
360
+ }
361
+ async* split(options) {
362
+ const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\]/));
363
+ const prefix = options.prefix ?? "page";
364
+ try {
365
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
366
+ const sourcePdf = await PDFDocument.load(sourceBytes, {
367
+ ignoreEncryption: this.options.password !== undefined
368
+ });
369
+ const totalPages = sourcePdf.getPageCount();
370
+ if (totalPages === 0) {
371
+ throw new PDFException("PDF has no pages", {
372
+ source: this.source
373
+ });
374
+ }
375
+ const ranges = this.normalizeRanges(options.ranges, totalPages);
376
+ for (const { start, end } of ranges) {
377
+ if (start < 1 || end > totalPages || start > end) {
378
+ throw new PDFException("Invalid page range", {
379
+ start,
380
+ end,
381
+ totalPages
382
+ });
383
+ }
384
+ }
385
+ for (const { start, end } of ranges) {
386
+ const newPdf = await PDFDocument.create();
387
+ const pageIndices = Array.from({ length: end - start + 1 }, (_, i) => start - 1 + i);
388
+ const copiedPages = await newPdf.copyPages(sourcePdf, pageIndices);
389
+ for (const page of copiedPages) {
390
+ newPdf.addPage(page);
391
+ }
392
+ const pdfBytes = await newPdf.save();
393
+ const fileName = start === end ? `${prefix}-${start}.pdf` : `${prefix}-${start}-${end}.pdf`;
394
+ const filePath = path.join(normalizedOutputDir, fileName);
395
+ await Bun.write(filePath, pdfBytes);
396
+ yield {
397
+ pages: { start, end },
398
+ path: filePath
399
+ };
400
+ }
401
+ } catch (error) {
402
+ if (error instanceof PDFException) {
403
+ throw error;
404
+ }
405
+ throw new PDFException("Failed to split PDF", {
406
+ source: this.source,
407
+ outputDir: normalizedOutputDir,
408
+ error: error instanceof Error ? error.message : String(error)
409
+ });
410
+ }
411
+ }
412
+ async removePages(pages) {
413
+ try {
414
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
415
+ const pdfDoc = await PDFDocument.load(sourceBytes, {
416
+ ignoreEncryption: this.options.password !== undefined
417
+ });
418
+ const totalPages = pdfDoc.getPageCount();
419
+ if (totalPages === 0) {
420
+ throw new PDFException("PDF has no pages", {
421
+ source: this.source
422
+ });
423
+ }
424
+ const pagesToRemove = this.normalizePageNumbers(pages, totalPages);
425
+ if (pagesToRemove.length === 0) {
426
+ throw new PDFException("No valid pages specified for removal", {
427
+ pages
428
+ });
429
+ }
430
+ if (pagesToRemove.length >= totalPages) {
431
+ throw new PDFException("Cannot remove all pages from PDF", {
432
+ pagesToRemove,
433
+ totalPages
434
+ });
435
+ }
436
+ const sortedDescending = [...pagesToRemove].sort((a, b) => b - a);
437
+ for (const pageNum of sortedDescending) {
438
+ pdfDoc.removePage(pageNum - 1);
439
+ }
440
+ const pdfBytes = await pdfDoc.save();
441
+ await Bun.write(this.source, pdfBytes);
442
+ return {
443
+ remainingPages: pdfDoc.getPageCount()
444
+ };
445
+ } catch (error) {
446
+ if (error instanceof PDFException) {
447
+ throw error;
448
+ }
449
+ throw new PDFException("Failed to remove pages from PDF", {
450
+ source: this.source,
451
+ pages,
452
+ error: error instanceof Error ? error.message : String(error)
453
+ });
454
+ }
455
+ }
456
+ normalizePageNumbers(pages, totalPages) {
457
+ const pageSet = new Set;
458
+ for (const page of pages) {
459
+ if (typeof page === "number") {
460
+ if (page >= 1 && page <= totalPages && Number.isInteger(page)) {
461
+ pageSet.add(page);
462
+ }
463
+ } else {
464
+ const [start, end] = page;
465
+ if (start <= end) {
466
+ for (let i = Math.max(1, start);i <= Math.min(totalPages, end); i++) {
467
+ if (Number.isInteger(i)) {
468
+ pageSet.add(i);
469
+ }
470
+ }
471
+ }
472
+ }
473
+ }
474
+ return Array.from(pageSet);
475
+ }
476
+ normalizeRanges(ranges, totalPages) {
477
+ if (!ranges || ranges.length === 0) {
478
+ return Array.from({ length: totalPages }, (_, i) => ({
479
+ start: i + 1,
480
+ end: i + 1
481
+ }));
482
+ }
483
+ return ranges.map((range) => {
484
+ if (typeof range === "number") {
485
+ return { start: range, end: range };
486
+ }
487
+ return { start: range[0], end: range[1] };
488
+ });
489
+ }
490
+ }
491
+ export {
492
+ PDFException,
493
+ PDF
494
+ };
495
+
496
+ //# debugId=655E21E0779DE5B064756E2164756E21
package/dist/index.js.map CHANGED
@@ -5,7 +5,7 @@
5
5
  "import path from \"node:path\";\nimport { PDFDocument, rgb, StandardFonts } from \"pdf-lib\";\nimport { pdf } from \"pdf-to-img\";\nimport sharp from \"sharp\";\nimport { extractImages, getDocumentProxy } from \"unpdf\";\nimport { PDFException } from \"./PDFException\";\nimport type {\n IPDF,\n PDFAddPageOptionsType,\n PDFAddPageResultType,\n PDFCreateOptionsType,\n PDFCreateResultType,\n PDFExtractedImageType,\n PDFGetImagesOptionsType,\n PDFGetImagesResultType,\n PDFMetadataResultType,\n PDFOptionsType,\n PDFPageImageResultType,\n PDFRemovePagesResultType,\n PDFSplitOptionsType,\n PDFSplitResultType,\n PDFToImagesOptionsType,\n PDFUpdateMetadataOptionsType,\n} from \"./types\";\n\nexport class PDF implements IPDF {\n private readonly source: string;\n private readonly options: PDFOptionsType;\n\n /**\n * Create a new PDF instance\n * @param source - Path to PDF file\n * @param options - Options for PDF processing\n */\n constructor(source: string, options: PDFOptionsType = {}) {\n this.source = path.join(...source.split(/[/\\\\]/));\n this.options = {\n scale: options.scale ?? 3,\n ...(options.password !== undefined && { password: options.password }),\n };\n }\n\n /**\n * Create a new PDF document and save to the source path\n * @param options - Optional content and metadata options for the PDF document\n * @returns Result containing the page count\n *\n * @example\n * ```typescript\n * // Create a simple empty PDF\n * const pdf = new PDF(\"/path/to/output.pdf\");\n * const result = await pdf.create();\n *\n * // Create a PDF with metadata\n * const pdf = new PDF(\"/path/to/output.pdf\");\n * const result = await pdf.create({\n * title: \"My Document\",\n * author: \"John Doe\",\n * subject: \"Example PDF\",\n * keywords: [\"example\", \"pdf\", \"document\"],\n * creator: \"My App\",\n * producer: \"pdf-lib\",\n * });\n * ```\n */\n public async create(options: PDFCreateOptionsType = {}): Promise<PDFCreateResultType> {\n try {\n const pdfDoc = await PDFDocument.create();\n\n // Set metadata if provided\n if (options.title) {\n pdfDoc.setTitle(options.title);\n }\n if (options.author) {\n pdfDoc.setAuthor(options.author);\n }\n if (options.subject) {\n pdfDoc.setSubject(options.subject);\n }\n if (options.keywords) {\n pdfDoc.setKeywords(options.keywords);\n }\n if (options.producer) {\n pdfDoc.setProducer(options.producer);\n }\n if (options.creator) {\n pdfDoc.setCreator(options.creator);\n }\n\n const pdfBytes = await pdfDoc.save();\n\n await Bun.write(this.source, pdfBytes);\n\n return {\n pageCount: pdfDoc.getPageCount(),\n };\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to create PDF document\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Add a page to an existing PDF document\n * @param options - Optional content options for the page\n * @returns Result containing the total page count\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * // Add an empty page\n * await pdf.addPage();\n *\n * // Add a page with content\n * await pdf.addPage({\n * content: \"Hello, World!\",\n * fontSize: 24,\n * });\n * ```\n */\n public async addPage(options: PDFAddPageOptionsType = {}): Promise<PDFAddPageResultType> {\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n\n const pdfDoc = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n });\n\n const page = pdfDoc.addPage();\n\n // Add content if provided\n if (options.content) {\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const fontSize = options.fontSize ?? 12;\n const margin = 50;\n const lineHeight = fontSize * 1.2;\n\n const { height } = page.getSize();\n let y = height - margin;\n\n const lines = options.content.split(\"\\n\");\n\n for (const line of lines) {\n if (y < margin) {\n break;\n }\n\n page.drawText(line, {\n x: margin,\n y,\n size: fontSize,\n font,\n color: rgb(0, 0, 0),\n });\n\n y -= lineHeight;\n }\n }\n\n const pdfBytes = await pdfDoc.save();\n\n await Bun.write(this.source, pdfBytes);\n\n return {\n pageCount: pdfDoc.getPageCount(),\n };\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to add page to PDF\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Get metadata from the PDF document\n * @returns PDF metadata including title, author, dates, and page count\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n * const metadata = await pdf.getMetadata();\n *\n * console.log(metadata.title);\n * console.log(metadata.author);\n * console.log(metadata.pageCount);\n * ```\n */\n public async getMetadata(): Promise<PDFMetadataResultType> {\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n\n const pdfDoc = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n updateMetadata: false,\n });\n\n return {\n title: pdfDoc.getTitle(),\n author: pdfDoc.getAuthor(),\n subject: pdfDoc.getSubject(),\n keywords: pdfDoc.getKeywords(),\n producer: pdfDoc.getProducer(),\n creator: pdfDoc.getCreator(),\n creationDate: pdfDoc.getCreationDate(),\n modificationDate: pdfDoc.getModificationDate(),\n pageCount: pdfDoc.getPageCount(),\n };\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to get PDF metadata\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Update metadata of an existing PDF document\n * @param options - Metadata options to update\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n * await pdf.updateMetadata({\n * title: \"Updated Title\",\n * author: \"New Author\",\n * subject: \"Updated Subject\",\n * keywords: [\"updated\", \"keywords\"],\n * producer: \"My App\",\n * creator: \"pdf-lib\",\n * creationDate: new Date(\"2020-01-01\"),\n * modificationDate: new Date(),\n * });\n * ```\n */\n public async updateMetadata(options: PDFUpdateMetadataOptionsType): Promise<void> {\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n\n const pdfDoc = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n });\n\n if (options.title !== undefined) {\n pdfDoc.setTitle(options.title);\n }\n if (options.author !== undefined) {\n pdfDoc.setAuthor(options.author);\n }\n if (options.subject !== undefined) {\n pdfDoc.setSubject(options.subject);\n }\n if (options.keywords !== undefined) {\n pdfDoc.setKeywords(options.keywords);\n }\n if (options.producer !== undefined) {\n pdfDoc.setProducer(options.producer);\n }\n if (options.creator !== undefined) {\n pdfDoc.setCreator(options.creator);\n }\n if (options.creationDate !== undefined) {\n pdfDoc.setCreationDate(options.creationDate);\n }\n if (options.modificationDate !== undefined) {\n pdfDoc.setModificationDate(options.modificationDate);\n }\n\n const pdfBytes = await pdfDoc.save();\n\n await Bun.write(this.source, pdfBytes);\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to update PDF metadata\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Get the total number of pages in the PDF\n */\n public async getPageCount(): Promise<number> {\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n const pdfDoc = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n updateMetadata: false,\n });\n return pdfDoc.getPageCount();\n } catch (error) {\n throw new PDFException(\"Failed to get page count\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Get the text content of a specific page\n * @param pageNumber - Page number (1-indexed)\n * @returns Extracted text content from the page\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * // Get content from page 1\n * const content = await pdf.getPageContent(1);\n * console.log(content); // \"Lorem ipsum dolor sit amet...\"\n *\n * // Get content from a specific page\n * const page3Content = await pdf.getPageContent(3);\n * console.log(page3Content); // Plain text content\n * ```\n */\n public async getPageContent(pageNumber: number): Promise<string> {\n if (pageNumber < 1 || !Number.isInteger(pageNumber)) {\n throw new PDFException(\"Page number must be a positive integer\", {\n pageNumber,\n });\n }\n\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n const document = await getDocumentProxy(new Uint8Array(sourceBytes));\n const totalPages = document.numPages;\n\n if (pageNumber > totalPages) {\n throw new PDFException(\"Page number exceeds total pages\", {\n pageNumber,\n totalPages,\n });\n }\n\n const page = await document.getPage(pageNumber);\n const textContent = await page.getTextContent();\n const text = textContent.items\n .filter((item) => \"str\" in item)\n .map((item) => (\"hasEOL\" in item && item.hasEOL ? `${item.str}\\n` : item.str))\n .join(\"\");\n\n return text.trim();\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to get page content\", {\n source: this.source,\n pageNumber,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Extract images from PDF pages and save to disk\n * @param options - Options including output directory, optional prefix, and optional page number\n * @returns Result containing total pages and array of extracted images with file paths\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * // Extract images from all pages\n * const images = await pdf.getImages({ outputDir: \"/output\" });\n * console.log(`Found ${images.length} images`);\n *\n * // Extract images from a specific page\n * const page1Images = await pdf.getImages({ outputDir: \"/output\", prefix: \"doc\", pageNumber: 1 });\n * for (const image of page1Images) {\n * console.log(`Image: ${image.path}, ${image.width}x${image.height}`);\n * }\n * ```\n */\n public async getImages(options: PDFGetImagesOptionsType): Promise<PDFGetImagesResultType> {\n const { pageNumber } = options;\n\n if (pageNumber !== undefined && (pageNumber < 1 || !Number.isInteger(pageNumber))) {\n throw new PDFException(\"Page number must be a positive integer\", {\n pageNumber,\n });\n }\n\n const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\\\]/));\n const prefix = options.prefix ?? \"image\";\n\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n const document = await getDocumentProxy(new Uint8Array(sourceBytes));\n const totalPages = document.numPages;\n\n if (pageNumber !== undefined && pageNumber > totalPages) {\n throw new PDFException(\"Page number exceeds total pages\", {\n pageNumber,\n totalPages,\n });\n }\n\n const processPage = async (page: number) => {\n const pageImages = await extractImages(document, page);\n const results: PDFExtractedImageType[] = [];\n let imageIndex = 0;\n for (const img of pageImages) {\n imageIndex++;\n const fileName = `${prefix}-p${page}-${imageIndex}.png`;\n const filePath = path.join(normalizedOutputDir, fileName);\n\n // Convert raw image data to PNG using sharp\n const pngBuffer = await sharp(img.data, {\n raw: {\n width: img.width,\n height: img.height,\n channels: img.channels,\n },\n })\n .png()\n .toBuffer();\n\n await Bun.write(filePath, pngBuffer);\n\n results.push({\n page,\n path: filePath,\n width: img.width,\n height: img.height,\n });\n }\n return results;\n };\n\n if (pageNumber !== undefined) {\n return await processPage(pageNumber);\n }\n\n const allResults = await Promise.all(Array.from({ length: totalPages }, (_, i) => processPage(i + 1)));\n return allResults.flat();\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to extract images from PDF\", {\n source: this.source,\n outputDir: normalizedOutputDir,\n pageNumber,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Convert all pages to images and save to disk\n * @param options - Options including output directory and optional prefix\n * @returns Array of page image results with page numbers and file paths\n */\n public async *pagesToImages(options: PDFToImagesOptionsType): AsyncGenerator<PDFPageImageResultType, void, unknown> {\n const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\\\]/));\n const prefix = options.prefix ?? \"page\";\n const savedWorker = (globalThis as Record<string, unknown>).pdfjsWorker;\n (globalThis as Record<string, unknown>).pdfjsWorker = undefined;\n\n try {\n const document = await pdf(this.source, this.options);\n let pageNumber = 1;\n\n for await (const image of document) {\n const fileName = `${prefix}-${pageNumber}.png`;\n const filePath = path.join(normalizedOutputDir, fileName);\n\n await Bun.write(filePath, Buffer.from(image));\n\n yield {\n page: pageNumber,\n path: filePath,\n };\n pageNumber++;\n }\n\n (globalThis as Record<string, unknown>).pdfjsWorker = savedWorker;\n } catch (error) {\n (globalThis as Record<string, unknown>).pdfjsWorker = savedWorker;\n throw new PDFException(\"Failed to convert PDF to images\", {\n source: this.source,\n outputDir: normalizedOutputDir,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Convert a specific page to an image and save to disk\n * @param pageNumber - Page number (1-indexed)\n * @param options - Options including output directory and optional prefix\n * @returns Page image result with page number and file path\n */\n public async pageToImage(pageNumber: number, options: PDFToImagesOptionsType): Promise<PDFPageImageResultType> {\n if (pageNumber < 1 || !Number.isInteger(pageNumber)) {\n throw new PDFException(\"Page number must be a positive integer\", {\n pageNumber,\n });\n }\n\n const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\\\]/));\n const prefix = options.prefix ?? \"page\";\n const savedWorker = (globalThis as Record<string, unknown>).pdfjsWorker;\n (globalThis as Record<string, unknown>).pdfjsWorker = undefined;\n\n try {\n const document = await pdf(this.source, this.options);\n\n if (pageNumber > document.length) {\n throw new PDFException(\"Page number exceeds total pages\", {\n pageNumber,\n totalPages: document.length,\n });\n }\n\n const image = await document.getPage(pageNumber);\n\n const fileName = `${prefix}-${pageNumber}.png`;\n const filePath = path.join(normalizedOutputDir, fileName);\n\n await Bun.write(filePath, Buffer.from(image));\n\n (globalThis as Record<string, unknown>).pdfjsWorker = savedWorker;\n\n return {\n page: pageNumber,\n path: filePath,\n };\n } catch (error) {\n (globalThis as Record<string, unknown>).pdfjsWorker = savedWorker;\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to get page image\", {\n source: this.source,\n pageNumber,\n outputDir: normalizedOutputDir,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Split the PDF into separate documents and save to disk\n * @param options - Split options with output directory, page ranges, and optional prefix\n * @returns Array of split PDF results with page ranges and file paths\n */\n public async *split(options: PDFSplitOptionsType): AsyncGenerator<PDFSplitResultType, void, unknown> {\n const normalizedOutputDir = path.join(...options.outputDir.split(/[/\\\\]/));\n const prefix = options.prefix ?? \"page\";\n\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n\n const sourcePdf = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n });\n\n const totalPages = sourcePdf.getPageCount();\n\n if (totalPages === 0) {\n throw new PDFException(\"PDF has no pages\", {\n source: this.source,\n });\n }\n\n const ranges = this.normalizeRanges(options.ranges, totalPages);\n\n // Validate all ranges first\n for (const { start, end } of ranges) {\n if (start < 1 || end > totalPages || start > end) {\n throw new PDFException(\"Invalid page range\", {\n start,\n end,\n totalPages,\n });\n }\n }\n\n for (const { start, end } of ranges) {\n const newPdf = await PDFDocument.create();\n const pageIndices = Array.from({ length: end - start + 1 }, (_, i) => start - 1 + i);\n const copiedPages = await newPdf.copyPages(sourcePdf, pageIndices);\n\n for (const page of copiedPages) {\n newPdf.addPage(page);\n }\n\n const pdfBytes = await newPdf.save();\n\n const fileName = start === end ? `${prefix}-${start}.pdf` : `${prefix}-${start}-${end}.pdf`;\n const filePath = path.join(normalizedOutputDir, fileName);\n\n await Bun.write(filePath, pdfBytes);\n\n yield {\n pages: { start, end },\n path: filePath,\n };\n }\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to split PDF\", {\n source: this.source,\n outputDir: normalizedOutputDir,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Remove specified pages from the PDF\n * @param pages - Page numbers to remove (1-indexed). Can be individual numbers or ranges [start, end]\n * @returns Result with remaining page count and PDF buffer\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * // Remove individual pages (pages 2 and 5)\n * const result1 = await pdf.removePages([2, 5]);\n *\n * // Remove a range of pages (pages 3 to 6)\n * const result2 = await pdf.removePages([[3, 6]]);\n *\n * // Remove mixed: individual pages and ranges (pages 1, 4-6, and 10)\n * const result3 = await pdf.removePages([1, [4, 6], 10]);\n *\n * console.log(result3.remainingPages); // Number of pages left\n * console.log(result3.buffer); // Buffer containing the resulting PDF\n *\n * // Save to file\n * await Bun.write(\"/path/to/output.pdf\", result3.buffer);\n * ```\n */\n public async removePages(pages: (number | [number, number])[]): Promise<PDFRemovePagesResultType> {\n try {\n const sourceBytes = await Bun.file(this.source).arrayBuffer();\n\n const pdfDoc = await PDFDocument.load(sourceBytes, {\n ignoreEncryption: this.options.password !== undefined,\n });\n\n const totalPages = pdfDoc.getPageCount();\n\n if (totalPages === 0) {\n throw new PDFException(\"PDF has no pages\", {\n source: this.source,\n });\n }\n\n // Normalize page numbers to remove into a flat sorted array\n const pagesToRemove = this.normalizePageNumbers(pages, totalPages);\n\n if (pagesToRemove.length === 0) {\n throw new PDFException(\"No valid pages specified for removal\", {\n pages,\n });\n }\n\n if (pagesToRemove.length >= totalPages) {\n throw new PDFException(\"Cannot remove all pages from PDF\", {\n pagesToRemove,\n totalPages,\n });\n }\n\n // Remove pages in reverse order to maintain correct indices\n const sortedDescending = [...pagesToRemove].sort((a, b) => b - a);\n for (const pageNum of sortedDescending) {\n pdfDoc.removePage(pageNum - 1); // Convert to 0-indexed\n }\n\n const pdfBytes = await pdfDoc.save();\n\n await Bun.write(this.source, pdfBytes);\n\n return {\n remainingPages: pdfDoc.getPageCount(),\n };\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to remove pages from PDF\", {\n source: this.source,\n pages,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Normalize page numbers into a flat array of unique valid page numbers\n */\n private normalizePageNumbers(pages: (number | [number, number])[], totalPages: number): number[] {\n const pageSet = new Set<number>();\n\n for (const page of pages) {\n if (typeof page === \"number\") {\n if (page >= 1 && page <= totalPages && Number.isInteger(page)) {\n pageSet.add(page);\n }\n } else {\n const [start, end] = page;\n if (start <= end) {\n for (let i = Math.max(1, start); i <= Math.min(totalPages, end); i++) {\n if (Number.isInteger(i)) {\n pageSet.add(i);\n }\n }\n }\n }\n }\n\n return Array.from(pageSet);\n }\n\n /**\n * Normalize page ranges for splitting\n * If no ranges provided, creates individual page ranges\n */\n private normalizeRanges(\n ranges: PDFSplitOptionsType[\"ranges\"] | undefined,\n totalPages: number,\n ): { start: number; end: number }[] {\n if (!ranges || ranges.length === 0) {\n return Array.from({ length: totalPages }, (_, i) => ({\n start: i + 1,\n end: i + 1,\n }));\n }\n\n return ranges.map((range) => {\n if (typeof range === \"number\") {\n return { start: range, end: range };\n }\n return { start: range[0], end: range[1] };\n });\n }\n}\n",
6
6
  "import { Exception } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\n\nexport class PDFException extends Exception {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, {\n status: HttpStatus.Code.InternalServerError,\n data,\n });\n this.name = \"PDFException\";\n }\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "D77D34577E7BB37C64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "655E21E0779DE5B064756E2164756E21",
10
10
  "names": []
11
11
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ooneex/pdf",
3
3
  "description": "PDF document toolkit for generating, editing, merging, splitting, and converting PDF files to images with page-level content extraction",
4
- "version": "1.1.1",
4
+ "version": "1.1.3",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -28,8 +28,8 @@
28
28
  "npm:publish": "bun publish --tolerate-republish --force --production --access public"
29
29
  },
30
30
  "dependencies": {
31
- "@ooneex/exception": "1.1.1",
32
- "@ooneex/http-status": "1.1.1",
31
+ "@ooneex/exception": "1.1.2",
32
+ "@ooneex/http-status": "1.1.2",
33
33
  "pdf-lib": "^1.17.1",
34
34
  "pdf-to-img": "^5.0.0",
35
35
  "sharp": "^0.34.0",