@ooneex/pdf 1.1.10 → 1.2.0

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.d.ts CHANGED
@@ -39,6 +39,19 @@ interface PDFPageImageResultType {
39
39
  path: string;
40
40
  }
41
41
  /**
42
+ * Result of extracting text content from a PDF page
43
+ */
44
+ interface PDFPageTextResultType {
45
+ /**
46
+ * Page number (1-indexed)
47
+ */
48
+ page: number;
49
+ /**
50
+ * Extracted text content from the page
51
+ */
52
+ text: string;
53
+ }
54
+ /**
42
55
  * Options for splitting a PDF and saving to disk
43
56
  */
44
57
  interface PDFSplitOptionsType {
@@ -257,10 +270,6 @@ interface PDFExtractedImageType {
257
270
  height: number;
258
271
  }
259
272
  /**
260
- * Result of extracting images from PDF pages
261
- */
262
- type PDFGetImagesResultType = PDFExtractedImageType[];
263
- /**
264
273
  * Interface for PDF class
265
274
  */
266
275
  interface IPDF {
@@ -321,11 +330,22 @@ interface IPDF {
321
330
  */
322
331
  getPageContent(pageNumber: number): Promise<string>;
323
332
  /**
333
+ * Extract text content from all pages
334
+ * @yields Page text result with page number and text content
335
+ */
336
+ pagesToText(): AsyncGenerator<PDFPageTextResultType, void, unknown>;
337
+ /**
338
+ * Extract text content from a specific page
339
+ * @param pageNumber - Page number (1-indexed)
340
+ * @returns Page text result with page number and text content
341
+ */
342
+ pageToText(pageNumber: number): Promise<PDFPageTextResultType>;
343
+ /**
324
344
  * Extract images from PDF pages and save to disk
325
345
  * @param options - Options including output directory, optional prefix, and optional page number
326
346
  * @returns Result containing total pages and array of extracted images with file paths
327
347
  */
328
- getImages(options: PDFGetImagesOptionsType): Promise<PDFGetImagesResultType>;
348
+ getImages(options: PDFGetImagesOptionsType): AsyncGenerator<PDFExtractedImageType, void, unknown>;
329
349
  }
330
350
  declare class PDF implements IPDF {
331
351
  private readonly source;
@@ -439,26 +459,53 @@ declare class PDF implements IPDF {
439
459
  */
440
460
  getPageContent(pageNumber: number): Promise<string>;
441
461
  /**
462
+ * Extract text content from all pages
463
+ * @yields Page text result with page number and text content
464
+ *
465
+ * @example
466
+ * ```typescript
467
+ * const pdf = new PDF("/path/to/document.pdf");
468
+ *
469
+ * for await (const { page, text } of pdf.pagesToText()) {
470
+ * console.log(`Page ${page}: ${text}`);
471
+ * }
472
+ * ```
473
+ */
474
+ pagesToText(): AsyncGenerator<PDFPageTextResultType, void, unknown>;
475
+ /**
476
+ * Extract text content from a specific page
477
+ * @param pageNumber - Page number (1-indexed)
478
+ * @returns Page text result with page number and text content
479
+ *
480
+ * @example
481
+ * ```typescript
482
+ * const pdf = new PDF("/path/to/document.pdf");
483
+ * const { page, text } = await pdf.pageToText(1);
484
+ * console.log(`Page ${page}: ${text}`);
485
+ * ```
486
+ */
487
+ pageToText(pageNumber: number): Promise<PDFPageTextResultType>;
488
+ /**
442
489
  * Extract images from PDF pages and save to disk
443
490
  * @param options - Options including output directory, optional prefix, and optional page number
444
- * @returns Result containing total pages and array of extracted images with file paths
491
+ * @yields Extracted image with page number, file path, and dimensions
445
492
  *
446
493
  * @example
447
494
  * ```typescript
448
495
  * const pdf = new PDF("/path/to/document.pdf");
449
496
  *
450
497
  * // Extract images from all pages
451
- * const images = await pdf.getImages({ outputDir: "/output" });
452
- * console.log(`Found ${images.length} images`);
498
+ * for await (const image of pdf.getImages({ outputDir: "/output" })) {
499
+ * console.log(`Image: ${image.path}, ${image.width}x${image.height}`);
500
+ * }
453
501
  *
454
502
  * // Extract images from a specific page
455
- * const page1Images = await pdf.getImages({ outputDir: "/output", prefix: "doc", pageNumber: 1 });
456
- * for (const image of page1Images) {
457
- * console.log(`Image: ${image.path}, ${image.width}x${image.height}`);
503
+ * for await (const image of pdf.getImages({ outputDir: "/output", prefix: "doc", pageNumber: 1 })) {
504
+ * console.log(`Page ${image.page}: ${image.path}`);
458
505
  * }
459
506
  * ```
460
507
  */
461
- getImages(options: PDFGetImagesOptionsType): Promise<PDFGetImagesResultType>;
508
+ getImages(options: PDFGetImagesOptionsType): AsyncGenerator<PDFExtractedImageType, void, unknown>;
462
509
  /**
463
510
  * Convert all pages to images and save to disk
464
511
  * @param options - Options including output directory and optional prefix
@@ -518,4 +565,4 @@ import { Exception } from "@ooneex/exception";
518
565
  declare class PDFException extends Exception {
519
566
  constructor(message: string, key: string, data?: Record<string, unknown>);
520
567
  }
521
- export { PDFUpdateMetadataOptionsType, PDFToImagesOptionsType, PDFSplitResultType, PDFSplitOptionsType, PDFRemovePagesResultType, PDFPageImageResultType, PDFOptionsType, PDFMetadataResultType, PDFGetImagesResultType, PDFGetImagesOptionsType, PDFExtractedImageType, PDFException, PDFCreateResultType, PDFCreateOptionsType, PDFAddPageResultType, PDFAddPageOptionsType, PDF, IPDF };
568
+ export { PDFUpdateMetadataOptionsType, PDFToImagesOptionsType, PDFSplitResultType, PDFSplitOptionsType, PDFRemovePagesResultType, PDFPageTextResultType, PDFPageImageResultType, PDFOptionsType, PDFMetadataResultType, PDFGetImagesOptionsType, PDFExtractedImageType, PDFException, PDFCreateResultType, PDFCreateOptionsType, PDFAddPageResultType, PDFAddPageOptionsType, PDF, IPDF };
package/dist/index.js CHANGED
@@ -230,7 +230,67 @@ class PDF {
230
230
  });
231
231
  }
232
232
  }
233
- async getImages(options) {
233
+ async* pagesToText() {
234
+ try {
235
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
236
+ const document = await getDocumentProxy(new Uint8Array(sourceBytes));
237
+ const totalPages = document.numPages;
238
+ for (let pageNumber = 1;pageNumber <= totalPages; pageNumber++) {
239
+ const page = await document.getPage(pageNumber);
240
+ const textContent = await page.getTextContent();
241
+ const text = textContent.items.filter((item) => ("str" in item)).map((item) => ("hasEOL" in item) && item.hasEOL ? `${item.str}
242
+ ` : item.str).join("");
243
+ yield {
244
+ page: pageNumber,
245
+ text: text.trim()
246
+ };
247
+ }
248
+ } catch (error) {
249
+ if (error instanceof PDFException) {
250
+ throw error;
251
+ }
252
+ throw new PDFException("Failed to extract text from PDF", "PDF_PAGES_TO_TEXT_FAILED", {
253
+ source: this.source,
254
+ error: error instanceof Error ? error.message : String(error)
255
+ });
256
+ }
257
+ }
258
+ async pageToText(pageNumber) {
259
+ if (pageNumber < 1 || !Number.isInteger(pageNumber)) {
260
+ throw new PDFException("Page number must be a positive integer", "PDF_INVALID_PAGE_NUMBER", {
261
+ pageNumber
262
+ });
263
+ }
264
+ try {
265
+ const sourceBytes = await Bun.file(this.source).arrayBuffer();
266
+ const document = await getDocumentProxy(new Uint8Array(sourceBytes));
267
+ const totalPages = document.numPages;
268
+ if (pageNumber > totalPages) {
269
+ throw new PDFException("Page number exceeds total pages", "PDF_PAGE_OUT_OF_RANGE", {
270
+ pageNumber,
271
+ totalPages
272
+ });
273
+ }
274
+ const page = await document.getPage(pageNumber);
275
+ const textContent = await page.getTextContent();
276
+ const text = textContent.items.filter((item) => ("str" in item)).map((item) => ("hasEOL" in item) && item.hasEOL ? `${item.str}
277
+ ` : item.str).join("");
278
+ return {
279
+ page: pageNumber,
280
+ text: text.trim()
281
+ };
282
+ } catch (error) {
283
+ if (error instanceof PDFException) {
284
+ throw error;
285
+ }
286
+ throw new PDFException("Failed to get page text", "PDF_PAGE_TEXT_FAILED", {
287
+ source: this.source,
288
+ pageNumber,
289
+ error: error instanceof Error ? error.message : String(error)
290
+ });
291
+ }
292
+ }
293
+ async* getImages(options) {
234
294
  const { pageNumber } = options;
235
295
  if (pageNumber !== undefined && (pageNumber < 1 || !Number.isInteger(pageNumber))) {
236
296
  throw new PDFException("Page number must be a positive integer", "PDF_INVALID_PAGE_NUMBER", {
@@ -249,9 +309,10 @@ class PDF {
249
309
  totalPages
250
310
  });
251
311
  }
252
- const processPage = async (page) => {
312
+ const startPage = pageNumber ?? 1;
313
+ const endPage = pageNumber ?? totalPages;
314
+ for (let page = startPage;page <= endPage; page++) {
253
315
  const pageImages = await extractImages(document, page);
254
- const results = [];
255
316
  let imageIndex = 0;
256
317
  for (const img of pageImages) {
257
318
  imageIndex++;
@@ -265,20 +326,14 @@ class PDF {
265
326
  }
266
327
  }).png().toBuffer();
267
328
  await Bun.write(filePath, pngBuffer);
268
- results.push({
329
+ yield {
269
330
  page,
270
331
  path: filePath,
271
332
  width: img.width,
272
333
  height: img.height
273
- });
334
+ };
274
335
  }
275
- return results;
276
- };
277
- if (pageNumber !== undefined) {
278
- return await processPage(pageNumber);
279
336
  }
280
- const allResults = await Promise.all(Array.from({ length: totalPages }, (_, i) => processPage(i + 1)));
281
- return allResults.flat();
282
337
  } catch (error) {
283
338
  if (error instanceof PDFException) {
284
339
  throw error;
@@ -286,7 +341,6 @@ class PDF {
286
341
  throw new PDFException("Failed to extract images from PDF", "PDF_EXTRACT_IMAGES_FAILED", {
287
342
  source: this.source,
288
343
  outputDir: normalizedOutputDir,
289
- pageNumber,
290
344
  error: error instanceof Error ? error.message : String(error)
291
345
  });
292
346
  }
@@ -494,4 +548,4 @@ export {
494
548
  PDF
495
549
  };
496
550
 
497
- //# debugId=50118D49CA2A880B64756E2164756E21
551
+ //# debugId=806816E3FF22AC1764756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["src/PDF.ts", "src/PDFException.ts"],
4
4
  "sourcesContent": [
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\", \"PDF_CREATE_FAILED\", {\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\", \"PDF_ADD_PAGE_FAILED\", {\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\", \"PDF_METADATA_GET_FAILED\", {\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\", \"PDF_METADATA_UPDATE_FAILED\", {\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\", \"PDF_PAGE_COUNT_FAILED\", {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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\", \"PDF_PAGE_CONTENT_FAILED\", {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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\", \"PDF_EXTRACT_IMAGES_FAILED\", {\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\", \"PDF_CONVERT_IMAGES_FAILED\", {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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\", \"PDF_PAGE_IMAGE_FAILED\", {\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\", \"PDF_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\", \"PDF_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\", \"PDF_SPLIT_FAILED\", {\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\", \"PDF_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\", \"PDF_NO_VALID_PAGES\", {\n pages,\n });\n }\n\n if (pagesToRemove.length >= totalPages) {\n throw new PDFException(\"Cannot remove all pages from PDF\", \"PDF_CANNOT_REMOVE_ALL_PAGES\", {\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\", \"PDF_REMOVE_PAGES_FAILED\", {\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",
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 PDFMetadataResultType,\n PDFOptionsType,\n PDFPageImageResultType,\n PDFPageTextResultType,\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\", \"PDF_CREATE_FAILED\", {\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\", \"PDF_ADD_PAGE_FAILED\", {\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\", \"PDF_METADATA_GET_FAILED\", {\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\", \"PDF_METADATA_UPDATE_FAILED\", {\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\", \"PDF_PAGE_COUNT_FAILED\", {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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\", \"PDF_PAGE_CONTENT_FAILED\", {\n source: this.source,\n pageNumber,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Extract text content from all pages\n * @yields Page text result with page number and text content\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * for await (const { page, text } of pdf.pagesToText()) {\n * console.log(`Page ${page}: ${text}`);\n * }\n * ```\n */\n public async *pagesToText(): AsyncGenerator<PDFPageTextResultType, void, unknown> {\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 for (let pageNumber = 1; pageNumber <= totalPages; pageNumber++) {\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 yield {\n page: pageNumber,\n text: text.trim(),\n };\n }\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to extract text from PDF\", \"PDF_PAGES_TO_TEXT_FAILED\", {\n source: this.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Extract text content from a specific page\n * @param pageNumber - Page number (1-indexed)\n * @returns Page text result with page number and text content\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n * const { page, text } = await pdf.pageToText(1);\n * console.log(`Page ${page}: ${text}`);\n * ```\n */\n public async pageToText(pageNumber: number): Promise<PDFPageTextResultType> {\n if (pageNumber < 1 || !Number.isInteger(pageNumber)) {\n throw new PDFException(\"Page number must be a positive integer\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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 {\n page: pageNumber,\n text: text.trim(),\n };\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to get page text\", \"PDF_PAGE_TEXT_FAILED\", {\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 * @yields Extracted image with page number, file path, and dimensions\n *\n * @example\n * ```typescript\n * const pdf = new PDF(\"/path/to/document.pdf\");\n *\n * // Extract images from all pages\n * for await (const image of pdf.getImages({ outputDir: \"/output\" })) {\n * console.log(`Image: ${image.path}, ${image.width}x${image.height}`);\n * }\n *\n * // Extract images from a specific page\n * for await (const image of pdf.getImages({ outputDir: \"/output\", prefix: \"doc\", pageNumber: 1 })) {\n * console.log(`Page ${image.page}: ${image.path}`);\n * }\n * ```\n */\n public async *getImages(options: PDFGetImagesOptionsType): AsyncGenerator<PDFExtractedImageType, void, unknown> {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\n pageNumber,\n totalPages,\n });\n }\n\n const startPage = pageNumber ?? 1;\n const endPage = pageNumber ?? totalPages;\n\n for (let page = startPage; page <= endPage; page++) {\n const pageImages = await extractImages(document, page);\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 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 yield {\n page,\n path: filePath,\n width: img.width,\n height: img.height,\n };\n }\n }\n } catch (error) {\n if (error instanceof PDFException) {\n throw error;\n }\n throw new PDFException(\"Failed to extract images from PDF\", \"PDF_EXTRACT_IMAGES_FAILED\", {\n source: this.source,\n outputDir: normalizedOutputDir,\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\", \"PDF_CONVERT_IMAGES_FAILED\", {\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\", \"PDF_INVALID_PAGE_NUMBER\", {\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\", \"PDF_PAGE_OUT_OF_RANGE\", {\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\", \"PDF_PAGE_IMAGE_FAILED\", {\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\", \"PDF_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\", \"PDF_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\", \"PDF_SPLIT_FAILED\", {\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\", \"PDF_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\", \"PDF_NO_VALID_PAGES\", {\n pages,\n });\n }\n\n if (pagesToRemove.length >= totalPages) {\n throw new PDFException(\"Cannot remove all pages from PDF\", \"PDF_CANNOT_REMOVE_ALL_PAGES\", {\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\", \"PDF_REMOVE_PAGES_FAILED\", {\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, key: string, data: Record<string, unknown> = {}) {\n super(message, {\n key,\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": "50118D49CA2A880B64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "806816E3FF22AC1764756E2164756E21",
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.10",
4
+ "version": "1.2.0",
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.2.6",
32
- "@ooneex/http-status": "1.1.9",
31
+ "@ooneex/exception": "^1.2.7",
32
+ "@ooneex/http-status": "^1.1.9",
33
33
  "pdf-lib": "^1.17.1",
34
34
  "pdf-to-img": "^5.0.0",
35
35
  "sharp": "^0.34.0",