@embedpdf/engines 2.0.0 → 2.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-engine-CHrj3o_a.js","sources":["../src/lib/pdfium/helper.ts","../src/lib/pdfium/types/branded.ts","../src/lib/pdfium/cache.ts","../src/lib/pdfium/constants/limits.ts","../src/lib/pdfium/core/memory-manager.ts","../src/lib/pdfium/engine.ts","../src/lib/pdfium/web/direct-engine.ts"],"sourcesContent":["import { Matrix, Rotation, Rect, Size } from '@embedpdf/models';\nimport { PdfiumRuntimeMethods, PdfiumModule } from '@embedpdf/pdfium';\n\n/**\n * Read string from WASM heap\n * @param wasmModule - pdfium wasm module instance\n * @param readChars - function to read chars\n * @param parseChars - function to parse chars\n * @param defaultLength - default length of chars that needs to read\n * @returns string from the heap\n *\n * @public\n */\nexport function readString(\n wasmModule: PdfiumRuntimeMethods & PdfiumModule,\n readChars: (buffer: number, bufferLength: number) => number,\n parseChars: (buffer: number) => string,\n defaultLength: number = 100,\n): string {\n let buffer = wasmModule.wasmExports.malloc(defaultLength);\n for (let i = 0; i < defaultLength; i++) {\n wasmModule.HEAP8[buffer + i] = 0;\n }\n const actualLength = readChars(buffer, defaultLength);\n let str: string;\n if (actualLength > defaultLength) {\n wasmModule.wasmExports.free(buffer);\n buffer = wasmModule.wasmExports.malloc(actualLength);\n for (let i = 0; i < actualLength; i++) {\n wasmModule.HEAP8[buffer + i] = 0;\n }\n readChars(buffer, actualLength);\n str = parseChars(buffer);\n } else {\n str = parseChars(buffer);\n }\n wasmModule.wasmExports.free(buffer);\n\n return str;\n}\n/**\n * Read arraybyffer from WASM heap\n * @param wasmModule - pdfium wasm module instance\n * @param readChars - function to read chars\n * @returns arraybuffer from the heap\n *\n * @public\n */\nexport function readArrayBuffer(\n wasmModule: PdfiumRuntimeMethods & PdfiumModule,\n readChars: (buffer: number, bufferLength: number) => number,\n): ArrayBuffer {\n const bufferSize = readChars(0, 0);\n\n const bufferPtr = wasmModule.wasmExports.malloc(bufferSize);\n\n readChars(bufferPtr, bufferSize);\n\n const arrayBuffer = new ArrayBuffer(bufferSize);\n const view = new DataView(arrayBuffer);\n\n for (let i = 0; i < bufferSize; i++) {\n view.setInt8(i, wasmModule.getValue(bufferPtr + i, 'i8'));\n }\n\n wasmModule.wasmExports.free(bufferPtr);\n\n return arrayBuffer;\n}\n\nconst RESERVED_INFO_KEYS = new Set([\n 'Title',\n 'Author',\n 'Subject',\n 'Keywords',\n 'Producer',\n 'Creator',\n 'CreationDate',\n 'ModDate',\n 'Trapped',\n]);\n\nexport function isValidCustomKey(key: string): boolean {\n // PDF Name object rules are looser than strings here, but keep it sane:\n // - non-empty ASCII, no embedded NULs, avoid leading slash\n if (!key || key.length > 127) return false;\n if (RESERVED_INFO_KEYS.has(key)) return false;\n if (key[0] === '/') return false;\n // Keep ASCII-ish to avoid surprises; relax if you need.\n for (let i = 0; i < key.length; i++) {\n const c = key.charCodeAt(i);\n if (c < 0x20 || c > 0x7e) return false;\n }\n return true;\n}\n\ninterface FormDrawParams {\n startX: number;\n startY: number;\n formsWidth: number;\n formsHeight: number;\n scaleX: number;\n scaleY: number;\n}\n\nexport function computeFormDrawParams(\n matrix: Matrix,\n rect: Rect,\n pageSize: Size,\n rotation: Rotation,\n): FormDrawParams {\n const rectLeft = rect.origin.x;\n const rectBottom = rect.origin.y;\n const rectRight = rectLeft + rect.size.width;\n const rectTop = rectBottom + rect.size.height;\n const pageWidth = pageSize.width;\n const pageHeight = pageSize.height;\n\n // Extract the per-axis scale that the render matrix applies.\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n const swap = (rotation & 1) === 1;\n\n const formsWidth = swap\n ? Math.max(1, Math.round(pageHeight * scaleX))\n : Math.max(1, Math.round(pageWidth * scaleX));\n const formsHeight = swap\n ? Math.max(1, Math.round(pageWidth * scaleY))\n : Math.max(1, Math.round(pageHeight * scaleY));\n\n let startX: number;\n let startY: number;\n switch (rotation) {\n case Rotation.Degree0:\n startX = -Math.round(rectLeft * scaleX);\n startY = -Math.round(rectBottom * scaleY);\n break;\n case Rotation.Degree90:\n startX = Math.round((rectTop - pageHeight) * scaleX);\n startY = -Math.round(rectLeft * scaleY);\n break;\n case Rotation.Degree180:\n startX = Math.round((rectRight - pageWidth) * scaleX);\n startY = Math.round((rectTop - pageHeight) * scaleY);\n break;\n case Rotation.Degree270:\n startX = -Math.round(rectBottom * scaleX);\n startY = Math.round((rectRight - pageWidth) * scaleY);\n break;\n default:\n startX = -Math.round(rectLeft * scaleX);\n startY = -Math.round(rectBottom * scaleY);\n break;\n }\n\n return { startX, startY, formsWidth, formsHeight, scaleX, scaleY };\n}\n","/**\n * Branded types for better type safety\n * @public\n */\n\ndeclare const PointerBrand: unique symbol;\n\nexport type WasmPointer = number & { [PointerBrand]: never };\n\n// Helper functions to create branded types\nexport const WasmPointer = (ptr: number): WasmPointer => ptr as WasmPointer;\n","import { WrappedPdfiumModule } from '@embedpdf/pdfium';\nimport { MemoryManager } from './core/memory-manager';\nimport { WasmPointer } from './types/branded';\n\nexport interface CacheConfig {\n /** Time-to-live for pages in milliseconds (default: 5000ms) */\n pageTtl?: number;\n /** Maximum number of pages to keep in cache per document (default: 50) */\n maxPagesPerDocument?: number;\n}\n\nconst DEFAULT_CONFIG: Required<CacheConfig> = {\n pageTtl: 5000, // 5 seconds\n maxPagesPerDocument: 10,\n};\n\nexport class PdfCache {\n private readonly docs = new Map<string, DocumentContext>();\n private readonly config: Required<CacheConfig>;\n\n constructor(\n private readonly pdfium: WrappedPdfiumModule,\n private readonly memoryManager: MemoryManager,\n config: CacheConfig = {},\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /** Open (or re-use) a document */\n setDocument(id: string, filePtr: number, docPtr: number) {\n let ctx = this.docs.get(id);\n if (!ctx) {\n ctx = new DocumentContext(filePtr, docPtr, this.pdfium, this.memoryManager, this.config);\n this.docs.set(id, ctx);\n }\n }\n\n /** Retrieve the DocumentContext for a given PdfDocumentObject */\n getContext(docId: string): DocumentContext | undefined {\n return this.docs.get(docId);\n }\n\n /** Close & fully release a document and all its pages */\n closeDocument(docId: string): boolean {\n const ctx = this.docs.get(docId);\n if (!ctx) return false;\n ctx.dispose(); // tears down pages first, then FPDF_CloseDocument, free()\n this.docs.delete(docId);\n return true;\n }\n\n /** Close all documents */\n closeAllDocuments(): void {\n for (const ctx of this.docs.values()) {\n ctx.dispose();\n }\n this.docs.clear();\n }\n\n /** Update cache configuration for all existing documents */\n updateConfig(newConfig: CacheConfig): void {\n Object.assign(this.config, newConfig);\n // Update config for all existing document contexts\n for (const ctx of this.docs.values()) {\n ctx.updateConfig(this.config);\n }\n }\n\n /** Get current cache statistics */\n getCacheStats(): {\n documents: number;\n totalPages: number;\n pagesByDocument: Record<string, number>;\n } {\n const pagesByDocument: Record<string, number> = {};\n let totalPages = 0;\n\n for (const [docId, ctx] of this.docs.entries()) {\n const pageCount = ctx.getCacheSize();\n pagesByDocument[docId] = pageCount;\n totalPages += pageCount;\n }\n\n return {\n documents: this.docs.size,\n totalPages,\n pagesByDocument,\n };\n }\n}\n\nexport class DocumentContext {\n private readonly pageCache: PageCache;\n\n constructor(\n public readonly filePtr: number,\n public readonly docPtr: number,\n pdfium: WrappedPdfiumModule,\n private readonly memoryManager: MemoryManager,\n config: Required<CacheConfig>,\n ) {\n this.pageCache = new PageCache(pdfium, docPtr, config);\n }\n\n /** Main accessor for pages */\n acquirePage(pageIdx: number): PageContext {\n return this.pageCache.acquire(pageIdx);\n }\n\n /** Scoped accessor for one-off / bulk operations */\n borrowPage<T>(pageIdx: number, fn: (ctx: PageContext) => T): T {\n return this.pageCache.borrowPage(pageIdx, fn);\n }\n\n /** Update cache configuration */\n updateConfig(config: Required<CacheConfig>): void {\n this.pageCache.updateConfig(config);\n }\n\n /** Get number of pages currently in cache */\n getCacheSize(): number {\n return this.pageCache.size();\n }\n\n /** Tear down all pages + this document */\n dispose(): void {\n // 1️⃣ release all pages (with their TTL or immediate)\n this.pageCache.forceReleaseAll();\n\n // 2️⃣ close the PDFium document\n this.pageCache.pdf.FPDF_CloseDocument(this.docPtr);\n\n // 3️⃣ free the file handle through memory manager for proper tracking\n this.memoryManager.free(WasmPointer(this.filePtr));\n }\n}\n\nexport class PageCache {\n private readonly cache = new Map<number, PageContext>();\n private readonly accessOrder: number[] = []; // LRU tracking\n private config: Required<CacheConfig>;\n\n constructor(\n public readonly pdf: WrappedPdfiumModule,\n private readonly docPtr: number,\n config: Required<CacheConfig>,\n ) {\n this.config = config;\n }\n\n acquire(pageIdx: number): PageContext {\n let ctx = this.cache.get(pageIdx);\n\n if (!ctx) {\n // Ensure we don't exceed max cache size\n this.evictIfNeeded();\n\n const pagePtr = this.pdf.FPDF_LoadPage(this.docPtr, pageIdx);\n ctx = new PageContext(this.pdf, this.docPtr, pageIdx, pagePtr, this.config.pageTtl, () => {\n this.cache.delete(pageIdx);\n this.removeFromAccessOrder(pageIdx);\n });\n this.cache.set(pageIdx, ctx);\n }\n\n // Update LRU order\n this.updateAccessOrder(pageIdx);\n\n ctx.clearExpiryTimer(); // cancel any pending teardown\n ctx.bumpRefCount(); // bump ref‐count\n return ctx;\n }\n\n /** Helper: run a function \"scoped\" to a page.\n * – if the page was already cached → .release() (keeps TTL logic)\n * – if the page was loaded just now → .disposeImmediate() (free right away)\n */\n borrowPage<T>(pageIdx: number, fn: (ctx: PageContext) => T): T {\n const existed = this.cache.has(pageIdx);\n const ctx = this.acquire(pageIdx);\n try {\n return fn(ctx);\n } finally {\n existed ? ctx.release() : ctx.disposeImmediate();\n }\n }\n\n forceReleaseAll(): void {\n for (const ctx of this.cache.values()) {\n ctx.disposeImmediate();\n }\n this.cache.clear();\n this.accessOrder.length = 0;\n }\n\n /** Update cache configuration */\n updateConfig(config: Required<CacheConfig>): void {\n this.config = config;\n\n // Update TTL for all existing pages\n for (const ctx of this.cache.values()) {\n ctx.updateTtl(config.pageTtl);\n }\n\n // Evict pages if new max size is smaller\n this.evictIfNeeded();\n }\n\n /** Get current cache size */\n size(): number {\n return this.cache.size;\n }\n\n /** Evict least recently used pages if cache exceeds max size */\n private evictIfNeeded(): void {\n while (this.cache.size >= this.config.maxPagesPerDocument) {\n const lruPageIdx = this.accessOrder[0];\n if (lruPageIdx !== undefined) {\n const ctx = this.cache.get(lruPageIdx);\n if (ctx) {\n // Only evict if not currently in use (refCount === 0)\n if (ctx.getRefCount() === 0) {\n ctx.disposeImmediate();\n // onFinalDispose callback will remove from cache and accessOrder\n } else {\n // If the LRU page is in use, we can't evict it\n // Move to a different strategy or break to avoid infinite loop\n break;\n }\n } else {\n // Page not in cache but in access order - clean up\n this.removeFromAccessOrder(lruPageIdx);\n }\n } else {\n break;\n }\n }\n }\n\n /** Update the access order for LRU tracking */\n private updateAccessOrder(pageIdx: number): void {\n // Remove from current position\n this.removeFromAccessOrder(pageIdx);\n // Add to end (most recently used)\n this.accessOrder.push(pageIdx);\n }\n\n /** Remove a page from the access order array */\n private removeFromAccessOrder(pageIdx: number): void {\n const index = this.accessOrder.indexOf(pageIdx);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n }\n}\n\nexport class PageContext {\n private refCount = 0;\n private expiryTimer?: ReturnType<typeof setTimeout>;\n private disposed = false;\n private ttl: number;\n\n // lazy helpers\n private textPagePtr?: number;\n private formInfoPtr?: number;\n private formHandle?: number;\n\n constructor(\n private readonly pdf: WrappedPdfiumModule,\n public readonly docPtr: number,\n public readonly pageIdx: number,\n public readonly pagePtr: number,\n ttl: number,\n private readonly onFinalDispose: () => void,\n ) {\n this.ttl = ttl;\n }\n\n /** Called by PageCache.acquire() */\n bumpRefCount() {\n if (this.disposed) throw new Error('Context already disposed');\n this.refCount++;\n }\n\n /** Get current reference count */\n getRefCount(): number {\n return this.refCount;\n }\n\n /** Called by PageCache.acquire() */\n clearExpiryTimer() {\n if (this.expiryTimer) {\n clearTimeout(this.expiryTimer);\n this.expiryTimer = undefined;\n }\n }\n\n /** Update TTL configuration */\n updateTtl(newTtl: number): void {\n this.ttl = newTtl;\n // If there's an active timer and ref count is 0, restart with new TTL\n if (this.expiryTimer && this.refCount === 0) {\n this.clearExpiryTimer();\n this.expiryTimer = setTimeout(() => this.disposeImmediate(), this.ttl);\n }\n }\n\n /** Called by PageCache.release() internally */\n release() {\n if (this.disposed) return;\n this.refCount--;\n if (this.refCount === 0) {\n // schedule the one-and-only timer for the page\n this.expiryTimer = setTimeout(() => this.disposeImmediate(), this.ttl);\n }\n }\n\n /** Tear down _all_ sub-pointers & the page. */\n disposeImmediate() {\n if (this.disposed) return;\n this.disposed = true;\n\n // Clear any pending timer\n this.clearExpiryTimer();\n\n // 2️⃣ close text-page if opened\n if (this.textPagePtr !== undefined) {\n this.pdf.FPDFText_ClosePage(this.textPagePtr);\n }\n\n // 3️⃣ close form-fill if opened\n if (this.formHandle !== undefined) {\n this.pdf.FORM_OnBeforeClosePage(this.pagePtr, this.formHandle);\n this.pdf.PDFiumExt_ExitFormFillEnvironment(this.formHandle);\n }\n if (this.formInfoPtr !== undefined) {\n this.pdf.PDFiumExt_CloseFormFillInfo(this.formInfoPtr);\n }\n\n // 4️⃣ finally close the page itself\n this.pdf.FPDF_ClosePage(this.pagePtr);\n\n // 5️⃣ remove from the cache\n this.onFinalDispose();\n }\n\n // ── public helpers ──\n\n /** Always safe: opens (once) and returns the text-page ptr. */\n getTextPage(): number {\n this.ensureAlive();\n if (this.textPagePtr === undefined) {\n this.textPagePtr = this.pdf.FPDFText_LoadPage(this.pagePtr);\n }\n return this.textPagePtr;\n }\n\n /** Always safe: opens (once) and returns the form-fill handle. */\n getFormHandle(): number {\n this.ensureAlive();\n if (this.formHandle === undefined) {\n this.formInfoPtr = this.pdf.PDFiumExt_OpenFormFillInfo();\n this.formHandle = this.pdf.PDFiumExt_InitFormFillEnvironment(this.docPtr, this.formInfoPtr);\n this.pdf.FORM_OnAfterLoadPage(this.pagePtr, this.formHandle);\n }\n return this.formHandle;\n }\n\n /**\n * Safely execute `fn` with an annotation pointer.\n * Pointer is ALWAYS closed afterwards.\n */\n withAnnotation<T>(annotIdx: number, fn: (annotPtr: number) => T): T {\n this.ensureAlive();\n const annotPtr = this.pdf.FPDFPage_GetAnnot(this.pagePtr, annotIdx);\n try {\n return fn(annotPtr);\n } finally {\n this.pdf.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n private ensureAlive() {\n if (this.disposed) throw new Error('PageContext already disposed');\n }\n}\n","/**\n * System limits and safety thresholds for PDFium engine operations\n *\n * These limits are designed to prevent:\n * - Memory exhaustion\n * - Browser crashes\n * - DoS attacks\n * - WASM heap overflow\n * - Unreasonable resource usage\n *\n * @module constants/limits\n */\n\n/**\n * Memory allocation limits\n */\nexport const MEMORY_LIMITS = {\n /** Maximum total memory that can be allocated (2GB) */\n MAX_TOTAL_MEMORY: 2 * 1024 * 1024 * 1024,\n} as const;\n\n/**\n * All limits combined for easy access\n */\nexport const LIMITS = {\n MEMORY: MEMORY_LIMITS,\n} as const;\n\nexport type Limits = typeof LIMITS;\n","import { WasmPointer } from '../types/branded';\nimport { LIMITS } from '../constants/limits';\nimport type { WrappedPdfiumModule } from '@embedpdf/pdfium';\nimport { Logger } from '@embedpdf/models';\n\nconst LOG_SOURCE = 'PDFiumEngine';\nconst LOG_CATEGORY = 'MemoryManager';\n\ninterface Allocation {\n ptr: WasmPointer;\n size: number;\n timestamp: number;\n stack?: string;\n}\n\nexport class MemoryManager {\n private allocations = new Map<number, Allocation>();\n private totalAllocated = 0;\n\n constructor(\n private pdfiumModule: WrappedPdfiumModule,\n private logger: Logger,\n ) {}\n\n /**\n * Allocate memory with tracking and validation\n */\n malloc(size: number): WasmPointer {\n // Check total memory usage\n if (this.totalAllocated + size > LIMITS.MEMORY.MAX_TOTAL_MEMORY) {\n throw new Error(\n `Total memory usage would exceed limit: ` +\n `${this.totalAllocated + size} > ${LIMITS.MEMORY.MAX_TOTAL_MEMORY}`,\n );\n }\n\n const ptr = this.pdfiumModule.pdfium.wasmExports.malloc(size);\n\n if (!ptr) {\n throw new Error(`Failed to allocate ${size} bytes`);\n }\n\n // Track allocation\n const allocation: Allocation = {\n ptr: WasmPointer(ptr),\n size,\n timestamp: Date.now(),\n stack: this.logger.isEnabled('debug') ? new Error().stack : undefined,\n };\n\n this.allocations.set(ptr, allocation);\n this.totalAllocated += size;\n\n return WasmPointer(ptr);\n }\n\n /**\n * Free memory with validation\n */\n free(ptr: WasmPointer): void {\n const allocation = this.allocations.get(ptr);\n if (!allocation) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, `Freeing untracked pointer: ${ptr}`);\n } else {\n this.totalAllocated -= allocation.size;\n this.allocations.delete(ptr);\n }\n\n this.pdfiumModule.pdfium.wasmExports.free(ptr);\n }\n\n /**\n * Get memory statistics\n */\n getStats() {\n return {\n totalAllocated: this.totalAllocated,\n allocationCount: this.allocations.size,\n allocations: this.logger.isEnabled('debug') ? Array.from(this.allocations.values()) : [],\n };\n }\n\n /**\n * Check for memory leaks\n */\n checkLeaks(): void {\n if (this.allocations.size > 0) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Potential memory leak: ${this.allocations.size} unfreed allocations`,\n );\n\n for (const [ptr, alloc] of this.allocations) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, ` - ${ptr}: ${alloc.size} bytes`, alloc.stack);\n }\n }\n }\n}\n","import {\n BatchProgress,\n ImageDataLike,\n IPdfiumExecutor,\n PdfActionObject,\n PdfAnnotationObject,\n PdfTextRectObject,\n PdfAnnotationSubtype,\n PdfLinkAnnoObject,\n PdfWidgetAnnoObject,\n PdfLinkTarget,\n PdfZoomMode,\n Logger,\n NoopLogger,\n SearchResult,\n PdfDestinationObject,\n PdfBookmarkObject,\n PdfDocumentObject,\n PdfPageObject,\n PdfActionType,\n Rotation,\n PDF_FORM_FIELD_FLAG,\n PDF_FORM_FIELD_TYPE,\n PdfWidgetAnnoOption,\n PdfFileAttachmentAnnoObject,\n Rect,\n Size,\n PdfAttachmentObject,\n PdfUnsupportedAnnoObject,\n PdfTextAnnoObject,\n PdfSignatureObject,\n PdfInkAnnoObject,\n PdfInkListObject,\n Position,\n PdfStampAnnoObject,\n PdfCircleAnnoObject,\n PdfSquareAnnoObject,\n PdfFreeTextAnnoObject,\n PdfCaretAnnoObject,\n PdfSquigglyAnnoObject,\n PdfStrikeOutAnnoObject,\n PdfUnderlineAnnoObject,\n PdfFile,\n PdfSegmentObject,\n AppearanceMode,\n PdfImageObject,\n PdfPageObjectType,\n PdfPathObject,\n PdfFormObject,\n PdfPolygonAnnoObject,\n PdfPolylineAnnoObject,\n PdfLineAnnoObject,\n PdfHighlightAnnoObject,\n PdfStampAnnoObjectContents,\n PdfWidgetAnnoField,\n PdfTransformMatrix,\n FormFieldValue,\n PdfErrorCode,\n PdfTaskHelper,\n PdfPageFlattenFlag,\n PdfPageFlattenResult,\n PdfTask,\n transformRect,\n PdfOpenDocumentBufferOptions,\n Task,\n PdfErrorReason,\n TextContext,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfRun,\n toIntRect,\n Quad,\n PdfAnnotationState,\n PdfAnnotationStateModel,\n quadToRect,\n PageTextSlice,\n stripPdfUnwantedMarkers,\n rectToQuad,\n dateToPdfDate,\n pdfDateToDate,\n PdfAnnotationColorType,\n PdfAnnotationBorderStyle,\n flagsToNames,\n PdfAnnotationFlagName,\n namesToFlags,\n PdfAnnotationLineEnding,\n LinePoints,\n LineEndings,\n WebColor,\n webColorToPdfColor,\n PdfColor,\n pdfColorToWebColor,\n pdfAlphaToWebOpacity,\n webOpacityToPdfAlpha,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n AnnotationCreateContext,\n isUuidV4,\n uuidV4,\n PdfAnnotationIcon,\n PdfRenderPageAnnotationOptions,\n PdfRedactTextOptions,\n PdfFlattenPageOptions,\n PdfRenderThumbnailOptions,\n PdfRenderPageOptions,\n buildUserToDeviceMatrix,\n Matrix,\n PdfMetadataObject,\n PdfPrintOptions,\n PdfTrappedStatus,\n PdfStampFit,\n PdfAddAttachmentParams,\n} from '@embedpdf/models';\nimport { computeFormDrawParams, isValidCustomKey, readArrayBuffer, readString } from './helper';\nimport { WrappedPdfiumModule } from '@embedpdf/pdfium';\nimport { DocumentContext, PageContext, PdfCache } from './cache';\nimport { MemoryManager } from './core/memory-manager';\nimport { WasmPointer } from './types/branded';\n\n/**\n * Format of bitmap\n */\nexport enum BitmapFormat {\n Bitmap_Gray = 1,\n Bitmap_BGR = 2,\n Bitmap_BGRx = 3,\n Bitmap_BGRA = 4,\n}\n\n/**\n * Pdf rendering flag\n */\nexport enum RenderFlag {\n ANNOT = 0x01, // Set if annotations are to be rendered.\n LCD_TEXT = 0x02, // Set if using text rendering optimized for LCD display.\n NO_NATIVETEXT = 0x04, // Don't use the native text output available on some platforms\n GRAYSCALE = 0x08, // Grayscale output.\n DEBUG_INFO = 0x80, // Set if you want to get some debug info. Please discuss with Foxit first if you need to collect debug info.\n NO_CATCH = 0x100, // Set if you don't want to catch exception.\n RENDER_LIMITEDIMAGECACHE = 0x200, // Limit image cache size.\n RENDER_FORCEHALFTONE = 0x400, // Always use halftone for image stretching.\n PRINTING = 0x800, // Render for printing.\n REVERSE_BYTE_ORDER = 0x10, // Set whether render in a reverse Byte order, this flag only.\n}\n\nconst LOG_SOURCE = 'PDFiumEngine';\nconst LOG_CATEGORY = 'Engine';\n\n/**\n * Error code of pdfium library\n */\nexport enum PdfiumErrorCode {\n Success = 0,\n Unknown = 1,\n File = 2,\n Format = 3,\n Password = 4,\n Security = 5,\n Page = 6,\n XFALoad = 7,\n XFALayout = 8,\n}\n\ninterface PdfiumEngineOptions {\n logger?: Logger;\n}\n\n/**\n * Pdf engine that based on pdfium wasm\n */\nexport class PdfiumNative implements IPdfiumExecutor {\n /**\n * pdf documents that opened\n */\n private readonly cache: PdfCache;\n\n /**\n * memory manager instance\n */\n private readonly memoryManager: MemoryManager;\n\n /**\n * interval to check memory leaks\n */\n private memoryLeakCheckInterval: number | null = null;\n\n /**\n * logger instance\n */\n private logger: Logger;\n\n /**\n * Create an instance of PdfiumNative and initialize PDFium\n * @param wasmModule - pdfium wasm module\n * @param options - configuration options\n */\n constructor(\n private pdfiumModule: WrappedPdfiumModule,\n options: PdfiumEngineOptions = {},\n ) {\n const { logger = new NoopLogger() } = options;\n\n this.logger = logger;\n this.memoryManager = new MemoryManager(this.pdfiumModule, this.logger);\n this.cache = new PdfCache(this.pdfiumModule, this.memoryManager);\n\n if (this.logger.isEnabled('debug')) {\n this.memoryLeakCheckInterval = setInterval(() => {\n this.memoryManager.checkLeaks();\n }, 10000) as unknown as number;\n }\n\n // Initialize PDFium in constructor\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'initialize');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Initialize`, 'Begin', 'General');\n this.pdfiumModule.PDFiumExt_Init();\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Initialize`, 'End', 'General');\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.destroy}\n *\n * @public\n */\n destroy() {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'destroy');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Destroy`, 'Begin', 'General');\n this.pdfiumModule.FPDF_DestroyLibrary();\n if (this.memoryLeakCheckInterval) {\n clearInterval(this.memoryLeakCheckInterval);\n this.memoryLeakCheckInterval = null;\n }\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Destroy`, 'End', 'General');\n return PdfTaskHelper.resolve(true);\n }\n\n /** Write a UTF-16LE (WIDESTRING) to wasm, call `fn(ptr)`, then free. */\n private withWString<T>(value: string, fn: (ptr: number) => T): T {\n // bytes = (len + 1) * 2\n const length = (value.length + 1) * 2;\n const ptr = this.memoryManager.malloc(length);\n try {\n // emscripten runtime exposes stringToUTF16\n this.pdfiumModule.pdfium.stringToUTF16(value, ptr, length);\n return fn(ptr);\n } finally {\n this.memoryManager.free(ptr);\n }\n }\n\n /** Write a float[] to wasm, call `fn(ptr, count)`, then free. */\n private withFloatArray<T>(\n values: number[] | undefined,\n fn: (ptr: number, count: number) => T,\n ): T {\n const arr = values ?? [];\n const bytes = arr.length * 4;\n const ptr = bytes ? this.memoryManager.malloc(bytes) : WasmPointer(0);\n try {\n if (bytes) {\n for (let i = 0; i < arr.length; i++) {\n this.pdfiumModule.pdfium.setValue(ptr + i * 4, arr[i], 'float');\n }\n }\n return fn(ptr, arr.length);\n } finally {\n if (bytes) this.memoryManager.free(ptr);\n }\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.openDocument}\n *\n * @public\n */\n openDocumentBuffer(file: PdfFile, options?: PdfOpenDocumentBufferOptions) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'openDocumentBuffer', file, options);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `OpenDocumentBuffer`, 'Begin', file.id);\n const array = new Uint8Array(file.content);\n const length = array.length;\n const filePtr = this.memoryManager.malloc(length);\n this.pdfiumModule.pdfium.HEAPU8.set(array, filePtr);\n\n const docPtr = this.pdfiumModule.FPDF_LoadMemDocument(filePtr, length, options?.password ?? '');\n\n if (!docPtr) {\n const lastError = this.pdfiumModule.FPDF_GetLastError();\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, `FPDF_LoadMemDocument failed with ${lastError}`);\n this.memoryManager.free(filePtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `OpenDocumentBuffer`, 'End', file.id);\n\n return PdfTaskHelper.reject<PdfDocumentObject>({\n code: lastError,\n message: `FPDF_LoadMemDocument failed`,\n });\n }\n\n const pageCount = this.pdfiumModule.FPDF_GetPageCount(docPtr);\n\n const pages: PdfPageObject[] = [];\n const sizePtr = this.memoryManager.malloc(8);\n for (let index = 0; index < pageCount; index++) {\n const result = this.pdfiumModule.FPDF_GetPageSizeByIndexF(docPtr, index, sizePtr);\n if (!result) {\n const lastError = this.pdfiumModule.FPDF_GetLastError();\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `FPDF_GetPageSizeByIndexF failed with ${lastError}`,\n );\n this.memoryManager.free(sizePtr);\n this.pdfiumModule.FPDF_CloseDocument(docPtr);\n this.memoryManager.free(filePtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `OpenDocumentBuffer`, 'End', file.id);\n return PdfTaskHelper.reject<PdfDocumentObject>({\n code: lastError,\n message: `FPDF_GetPageSizeByIndexF failed`,\n });\n }\n\n const rotation = this.pdfiumModule.EPDF_GetPageRotationByIndex(docPtr, index) as Rotation;\n\n const page = {\n index,\n size: {\n width: this.pdfiumModule.pdfium.getValue(sizePtr, 'float'),\n height: this.pdfiumModule.pdfium.getValue(sizePtr + 4, 'float'),\n },\n rotation,\n };\n\n pages.push(page);\n }\n this.memoryManager.free(sizePtr);\n\n const pdfDoc: PdfDocumentObject = {\n id: file.id,\n pageCount,\n pages,\n };\n\n this.cache.setDocument(file.id, filePtr, docPtr);\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `OpenDocumentBuffer`, 'End', file.id);\n\n return PdfTaskHelper.resolve(pdfDoc);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getMetadata}\n *\n * @public\n */\n getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getMetadata', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetMetadata`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetMetadata`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const creationRaw = this.readMetaText(ctx.docPtr, 'CreationDate');\n const modRaw = this.readMetaText(ctx.docPtr, 'ModDate');\n\n const metadata: PdfMetadataObject = {\n title: this.readMetaText(ctx.docPtr, 'Title'),\n author: this.readMetaText(ctx.docPtr, 'Author'),\n subject: this.readMetaText(ctx.docPtr, 'Subject'),\n keywords: this.readMetaText(ctx.docPtr, 'Keywords'),\n producer: this.readMetaText(ctx.docPtr, 'Producer'),\n creator: this.readMetaText(ctx.docPtr, 'Creator'),\n creationDate: creationRaw ? (pdfDateToDate(creationRaw) ?? null) : null,\n modificationDate: modRaw ? (pdfDateToDate(modRaw) ?? null) : null,\n trapped: this.getMetaTrapped(ctx.docPtr),\n custom: this.readAllMeta(ctx.docPtr, true),\n };\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetMetadata`, 'End', doc.id);\n\n return PdfTaskHelper.resolve(metadata);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.setMetadata}\n *\n * @public\n */\n setMetadata(doc: PdfDocumentObject, meta: Partial<PdfMetadataObject>) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'setMetadata', doc, meta);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'SetMetadata', 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'SetMetadata', 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // Field -> PDF Info key\n const strMap: Array<[keyof PdfMetadataObject, string]> = [\n ['title', 'Title'],\n ['author', 'Author'],\n ['subject', 'Subject'],\n ['keywords', 'Keywords'],\n ['producer', 'Producer'],\n ['creator', 'Creator'],\n ];\n\n let ok = true;\n\n // Write string fields (string|null|undefined)\n for (const [field, key] of strMap) {\n const v = meta[field];\n if (v === undefined) continue;\n const s = v === null ? null : (v as string);\n if (!this.setMetaText(ctx.docPtr, key, s)) ok = false;\n }\n\n // Write date fields (Date|null|undefined)\n const writeDate = (\n field: 'creationDate' | 'modificationDate',\n key: 'CreationDate' | 'ModDate',\n ) => {\n const v = meta[field];\n if (v === undefined) return;\n if (v === null) {\n if (!this.setMetaText(ctx.docPtr, key, null)) ok = false;\n return;\n }\n const d = v as Date;\n const raw = dateToPdfDate(d);\n if (!this.setMetaText(ctx.docPtr, key, raw)) ok = false;\n };\n\n writeDate('creationDate', 'CreationDate');\n writeDate('modificationDate', 'ModDate');\n\n if (meta.trapped !== undefined) {\n if (!this.setMetaTrapped(ctx.docPtr, meta.trapped ?? null)) ok = false;\n }\n\n if (meta.custom !== undefined) {\n for (const [key, value] of Object.entries(meta.custom)) {\n if (!isValidCustomKey(key)) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, 'Invalid custom metadata key skipped', key);\n continue;\n }\n if (!this.setMetaText(ctx.docPtr, key, value ?? null)) ok = false;\n }\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'SetMetadata', 'End', doc.id);\n\n return ok\n ? PdfTaskHelper.resolve(true)\n : PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'one or more metadata fields could not be written',\n });\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getDocPermissions}\n *\n * @public\n */\n getDocPermissions(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getDocPermissions', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `getDocPermissions`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `getDocPermissions`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const permissions = this.pdfiumModule.FPDF_GetDocPermissions(ctx.docPtr);\n\n return PdfTaskHelper.resolve(permissions);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getDocUserPermissions}\n *\n * @public\n */\n getDocUserPermissions(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getDocUserPermissions', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `getDocUserPermissions`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `getDocUserPermissions`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const permissions = this.pdfiumModule.FPDF_GetDocUserPermissions(ctx.docPtr);\n\n return PdfTaskHelper.resolve(permissions);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getSignatures}\n *\n * @public\n */\n getSignatures(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getSignatures', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetSignatures`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetSignatures`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const signatures: PdfSignatureObject[] = [];\n\n const count = this.pdfiumModule.FPDF_GetSignatureCount(ctx.docPtr);\n for (let i = 0; i < count; i++) {\n const signatureObjPtr = this.pdfiumModule.FPDF_GetSignatureObject(ctx.docPtr, i);\n\n const contents = readArrayBuffer(this.pdfiumModule.pdfium, (buffer, bufferSize) => {\n return this.pdfiumModule.FPDFSignatureObj_GetContents(signatureObjPtr, buffer, bufferSize);\n });\n\n const byteRange = readArrayBuffer(this.pdfiumModule.pdfium, (buffer, bufferSize) => {\n return (\n this.pdfiumModule.FPDFSignatureObj_GetByteRange(signatureObjPtr, buffer, bufferSize) * 4\n );\n });\n\n const subFilter = readArrayBuffer(this.pdfiumModule.pdfium, (buffer, bufferSize) => {\n return this.pdfiumModule.FPDFSignatureObj_GetSubFilter(signatureObjPtr, buffer, bufferSize);\n });\n\n const reason = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFSignatureObj_GetReason(\n signatureObjPtr,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n\n const time = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFSignatureObj_GetTime(signatureObjPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF8ToString,\n );\n\n const docMDP = this.pdfiumModule.FPDFSignatureObj_GetDocMDPPermission(signatureObjPtr);\n\n signatures.push({\n contents,\n byteRange,\n subFilter,\n reason,\n time,\n docMDP,\n });\n }\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetSignatures`, 'End', doc.id);\n\n return PdfTaskHelper.resolve(signatures);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getBookmarks}\n *\n * @public\n */\n getBookmarks(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getBookmarks', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetBookmarks`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `getBookmarks`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const bookmarks = this.readPdfBookmarks(ctx.docPtr, 0);\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetBookmarks`, 'End', doc.id);\n\n return PdfTaskHelper.resolve({\n bookmarks,\n });\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.setBookmarks}\n *\n * @public\n */\n setBookmarks(doc: PdfDocumentObject, list: PdfBookmarkObject[]) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'setBookmarks', doc, list);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SetBookmarks`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SetBookmarks`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // Clear any existing outlines\n if (!this.pdfiumModule.EPDFBookmark_Clear(ctx.docPtr)) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SetBookmarks`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'failed to clear existing bookmarks',\n });\n }\n\n // Recursive builder\n const build = (parentPtr: number, items: PdfBookmarkObject[]): boolean => {\n let prevChild = 0;\n for (const item of items) {\n // Create\n const bmPtr = this.withWString(item.title ?? '', (wptr) =>\n this.pdfiumModule.EPDFBookmark_AppendChild(ctx.docPtr, parentPtr, wptr),\n );\n if (!bmPtr) return false;\n\n // Target (optional)\n if (item.target) {\n const ok = this.applyBookmarkTarget(ctx.docPtr, bmPtr, item.target);\n if (!ok) return false;\n }\n\n // Children\n if (item.children?.length) {\n const ok = build(bmPtr, item.children);\n if (!ok) return false;\n }\n\n prevChild = bmPtr;\n }\n return true;\n };\n\n const ok = build(/*top-level*/ 0, list);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SetBookmarks`, 'End', doc.id);\n\n if (!ok) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'failed to build bookmark tree',\n });\n }\n return PdfTaskHelper.resolve(true);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.deleteBookmarks}\n *\n * @public\n */\n deleteBookmarks(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'deleteBookmarks', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteBookmarks`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteBookmarks`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const ok = this.pdfiumModule.EPDFBookmark_Clear(ctx.docPtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteBookmarks`, 'End', doc.id);\n\n return ok\n ? PdfTaskHelper.resolve(true)\n : PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'failed to clear bookmarks',\n });\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.renderPage}\n *\n * @public\n */\n renderPageRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'renderPage', doc, page, options);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `RenderPage`, 'Begin', `${doc.id}-${page.index}`);\n\n const rect = { origin: { x: 0, y: 0 }, size: page.size };\n const task = this.renderRectEncoded(doc, page, rect, options);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `RenderPage`, 'End', `${doc.id}-${page.index}`);\n\n return task;\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.renderPageRect}\n *\n * @public\n */\n renderPageRect(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'renderPageRect', doc, page, rect, options);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderPageRect`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const task = this.renderRectEncoded(doc, page, rect, options);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `RenderPageRect`, 'End', `${doc.id}-${page.index}`);\n\n return task;\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getPageAnnotations}\n *\n * @public\n */\n getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getPageAnnotations', doc, page);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotations`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotations`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const annotations = this.readPageAnnotations(ctx, page);\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotations`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotations`,\n `${doc.id}-${page.index}`,\n annotations,\n );\n\n return PdfTaskHelper.resolve(annotations);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.createPageAnnotation}\n *\n * @public\n */\n createPageAnnotation<A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ): PdfTask<string> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'createPageAnnotation', doc, page, annotation);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n const annotationPtr = this.pdfiumModule.EPDFPage_CreateAnnot(pageCtx.pagePtr, annotation.type);\n if (!annotationPtr) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n pageCtx.release();\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCreateAnnot,\n message: 'can not create annotation with specified type',\n });\n }\n\n if (!isUuidV4(annotation.id)) {\n annotation.id = uuidV4();\n }\n\n if (!this.setAnnotString(annotationPtr, 'NM', annotation.id)) {\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n pageCtx.release();\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSetAnnotString,\n message: 'can not set the name of the annotation',\n });\n }\n\n if (!this.setPageAnnoRect(page, annotationPtr, annotation.rect)) {\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSetAnnotRect,\n message: 'can not set the rect of the annotation',\n });\n }\n\n let isSucceed = false;\n switch (annotation.type) {\n case PdfAnnotationSubtype.INK:\n isSucceed = this.addInkStroke(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.STAMP:\n isSucceed = this.addStampContent(\n ctx.docPtr,\n page,\n pageCtx.pagePtr,\n annotationPtr,\n annotation,\n context?.imageData,\n );\n break;\n case PdfAnnotationSubtype.TEXT:\n isSucceed = this.addTextContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.FREETEXT:\n isSucceed = this.addFreeTextContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.LINE:\n isSucceed = this.addLineContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.POLYLINE:\n case PdfAnnotationSubtype.POLYGON:\n isSucceed = this.addPolyContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.CIRCLE:\n case PdfAnnotationSubtype.SQUARE:\n isSucceed = this.addShapeContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n case PdfAnnotationSubtype.UNDERLINE:\n case PdfAnnotationSubtype.STRIKEOUT:\n case PdfAnnotationSubtype.SQUIGGLY:\n case PdfAnnotationSubtype.HIGHLIGHT:\n isSucceed = this.addTextMarkupContent(page, pageCtx.pagePtr, annotationPtr, annotation);\n break;\n }\n\n if (!isSucceed) {\n this.pdfiumModule.FPDFPage_RemoveAnnot(pageCtx.pagePtr, annotationPtr);\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSetAnnotContent,\n message: 'can not add content of the annotation',\n });\n }\n\n if (annotation.blendMode !== undefined) {\n this.pdfiumModule.EPDFAnnot_GenerateAppearanceWithBlend(annotationPtr, annotation.blendMode);\n } else {\n this.pdfiumModule.EPDFAnnot_GenerateAppearance(annotationPtr);\n }\n\n this.pdfiumModule.FPDFPage_GenerateContent(pageCtx.pagePtr);\n\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `CreatePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n\n return PdfTaskHelper.resolve<string>(annotation.id);\n }\n\n /**\n * Update an existing page annotation in-place\n *\n * • Locates the annot by page-local index (`annotation.id`)\n * • Re-writes its /Rect and type-specific payload\n * • Calls FPDFPage_GenerateContent so the new appearance is rendered\n *\n * @returns PdfTask<boolean> – true on success\n */\n updatePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'updatePageAnnotation', doc, page, annotation);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'UpdatePageAnnotation',\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'UpdatePageAnnotation',\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n const annotPtr = this.getAnnotationByName(pageCtx.pagePtr, annotation.id);\n if (!annotPtr) {\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'UpdatePageAnnotation',\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'annotation not found' });\n }\n\n /* 1 ── (re)set bounding-box ────────────────────────────────────────────── */\n if (!this.setPageAnnoRect(page, annotPtr, annotation.rect)) {\n this.pdfiumModule.FPDFPage_CloseAnnot(annotPtr);\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'UpdatePageAnnotation',\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSetAnnotRect,\n message: 'failed to move annotation',\n });\n }\n\n /* 2 ── wipe previous payload and rebuild fresh one ─────────────────────── */\n let ok = false;\n switch (annotation.type) {\n /* ── Ink ─────────────────────────────────────────────────────────────── */\n case PdfAnnotationSubtype.INK: {\n /* clear every existing stroke first */\n if (!this.pdfiumModule.FPDFAnnot_RemoveInkList(annotPtr)) break;\n ok = this.addInkStroke(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Stamp ───────────────────────────────────────────────────────────── */\n case PdfAnnotationSubtype.STAMP: {\n ok = this.addStampContent(ctx.docPtr, page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n case PdfAnnotationSubtype.TEXT: {\n ok = this.addTextContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Free text ────────────────────────────────────────────────────────── */\n case PdfAnnotationSubtype.FREETEXT: {\n ok = this.addFreeTextContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Shape ───────────────────────────────────────────────────────────── */\n case PdfAnnotationSubtype.CIRCLE:\n case PdfAnnotationSubtype.SQUARE: {\n ok = this.addShapeContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Line ─────────────────────────────────────────────────────────────── */\n case PdfAnnotationSubtype.LINE: {\n ok = this.addLineContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Polygon / Polyline ───────────────────────────────────────────────── */\n case PdfAnnotationSubtype.POLYGON:\n case PdfAnnotationSubtype.POLYLINE: {\n ok = this.addPolyContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Text-markup family ──────────────────────────────────────────────── */\n case PdfAnnotationSubtype.HIGHLIGHT:\n case PdfAnnotationSubtype.UNDERLINE:\n case PdfAnnotationSubtype.STRIKEOUT:\n case PdfAnnotationSubtype.SQUIGGLY: {\n /* replace quad-points / colour / strings in one go */\n ok = this.addTextMarkupContent(page, pageCtx.pagePtr, annotPtr, annotation);\n break;\n }\n\n /* ── Unsupported edits – fall through to error ───────────────────────── */\n default:\n ok = false;\n }\n\n /* 3 ── regenerate appearance if payload was changed ───────────────────── */\n if (ok) {\n if (annotation.blendMode !== undefined) {\n this.pdfiumModule.EPDFAnnot_GenerateAppearanceWithBlend(annotPtr, annotation.blendMode);\n } else {\n this.pdfiumModule.EPDFAnnot_GenerateAppearance(annotPtr);\n }\n this.pdfiumModule.FPDFPage_GenerateContent(pageCtx.pagePtr);\n }\n\n /* 4 ── tidy-up native handles ──────────────────────────────────────────── */\n this.pdfiumModule.FPDFPage_CloseAnnot(annotPtr);\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'UpdatePageAnnotation',\n 'End',\n `${doc.id}-${page.index}`,\n );\n\n return ok\n ? PdfTaskHelper.resolve<boolean>(true)\n : PdfTaskHelper.reject<boolean>({\n code: PdfErrorCode.CantSetAnnotContent,\n message: 'failed to update annotation',\n });\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.removePageAnnotation}\n *\n * @public\n */\n removePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'removePageAnnotation', doc, page, annotation);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RemovePageAnnotation`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RemovePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n let result = false;\n result = this.removeAnnotationByName(pageCtx.pagePtr, annotation.id);\n if (!result) {\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `FPDFPage_RemoveAnnot Failed`,\n `${doc.id}-${page.index}`,\n );\n } else {\n result = this.pdfiumModule.FPDFPage_GenerateContent(pageCtx.pagePtr);\n if (!result) {\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `FPDFPage_GenerateContent Failed`,\n `${doc.id}-${page.index}`,\n );\n }\n }\n\n pageCtx.release();\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RemovePageAnnotation`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.resolve(result);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getPageTextRects}\n *\n * @public\n */\n getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getPageTextRects', doc, page);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageTextRects`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageTextRects`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n const textPagePtr = this.pdfiumModule.FPDFText_LoadPage(pageCtx.pagePtr);\n\n const textRects = this.readPageTextRects(page, pageCtx.docPtr, pageCtx.pagePtr, textPagePtr);\n\n this.pdfiumModule.FPDFText_ClosePage(textPagePtr);\n pageCtx.release();\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageTextRects`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.resolve(textRects);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.renderThumbnail}\n *\n * @public\n */\n renderThumbnailRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ): PdfTask<ImageDataLike> {\n const { scaleFactor = 1, ...rest } = options ?? {};\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'renderThumbnail', doc, page, options);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderThumbnail`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderThumbnail`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const result = this.renderPageRaw(doc, page, {\n scaleFactor: Math.max(scaleFactor, 0.5),\n ...rest,\n });\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `RenderThumbnail`, 'End', `${doc.id}-${page.index}`);\n\n return result;\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getAttachments}\n *\n * @public\n */\n getAttachments(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getAttachments', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetAttachments`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetAttachments`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const attachments: PdfAttachmentObject[] = [];\n\n const count = this.pdfiumModule.FPDFDoc_GetAttachmentCount(ctx.docPtr);\n for (let i = 0; i < count; i++) {\n const attachment = this.readPdfAttachment(ctx.docPtr, i);\n attachments.push(attachment);\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `GetAttachments`, 'End', doc.id);\n return PdfTaskHelper.resolve(attachments);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.addAttachment}\n *\n * @public\n */\n addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'addAttachment', doc, params?.name);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const { name, description, mimeType, data } = params ?? {};\n if (!name) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'attachment name is required',\n });\n }\n if (!data || (data instanceof Uint8Array ? data.byteLength === 0 : data.byteLength === 0)) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'attachment data is empty',\n });\n }\n\n // 1) Create the attachment handle (also inserts into the EmbeddedFiles name tree).\n const attachmentPtr = this.withWString(name, (wNamePtr) =>\n this.pdfiumModule.FPDFDoc_AddAttachment(ctx.docPtr, wNamePtr),\n );\n\n if (!attachmentPtr) {\n // Most likely: duplicate name in the name tree.\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: `An attachment named \"${name}\" already exists`,\n });\n }\n\n this.withWString(description, (wDescriptionPtr) =>\n this.pdfiumModule.EPDFAttachment_SetDescription(attachmentPtr, wDescriptionPtr),\n );\n\n this.pdfiumModule.EPDFAttachment_SetSubtype(attachmentPtr, mimeType);\n\n // 3) Copy data into WASM memory and call SetFile (this stores bytes and fills Size/CreationDate/CheckSum)\n const u8 = data instanceof Uint8Array ? data : new Uint8Array(data);\n const len = u8.byteLength;\n\n const contentPtr = this.memoryManager.malloc(len);\n try {\n this.pdfiumModule.pdfium.HEAPU8.set(u8, contentPtr);\n const ok = this.pdfiumModule.FPDFAttachment_SetFile(\n attachmentPtr,\n ctx.docPtr,\n contentPtr,\n len,\n );\n if (!ok) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'failed to write attachment bytes',\n });\n }\n } finally {\n this.memoryManager.free(contentPtr);\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `AddAttachment`, 'End', doc.id);\n return PdfTaskHelper.resolve<boolean>(true);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.removeAttachment}\n *\n * @public\n */\n removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'deleteAttachment', doc, attachment);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteAttachment`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const count = this.pdfiumModule.FPDFDoc_GetAttachmentCount(ctx.docPtr);\n if (attachment.index < 0 || attachment.index >= count) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteAttachment`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: `attachment index ${attachment.index} out of range`,\n });\n }\n\n const ok = this.pdfiumModule.FPDFDoc_DeleteAttachment(ctx.docPtr, attachment.index);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `DeleteAttachment`, 'End', doc.id);\n\n if (!ok) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'failed to delete attachment',\n });\n }\n return PdfTaskHelper.resolve<boolean>(true);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.readAttachmentContent}\n *\n * @public\n */\n readAttachmentContent(doc: PdfDocumentObject, attachment: PdfAttachmentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'readAttachmentContent', doc, attachment);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ReadAttachmentContent`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ReadAttachmentContent`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const attachmentPtr = this.pdfiumModule.FPDFDoc_GetAttachment(ctx.docPtr, attachment.index);\n const sizePtr = this.memoryManager.malloc(4);\n if (!this.pdfiumModule.FPDFAttachment_GetFile(attachmentPtr, 0, 0, sizePtr)) {\n this.memoryManager.free(sizePtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ReadAttachmentContent`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantReadAttachmentSize,\n message: 'can not read attachment size',\n });\n }\n const size = this.pdfiumModule.pdfium.getValue(sizePtr, 'i32') >>> 0;\n\n const contentPtr = this.memoryManager.malloc(size);\n if (!this.pdfiumModule.FPDFAttachment_GetFile(attachmentPtr, contentPtr, size, sizePtr)) {\n this.memoryManager.free(sizePtr);\n this.memoryManager.free(contentPtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ReadAttachmentContent`, 'End', doc.id);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantReadAttachmentContent,\n message: 'can not read attachment content',\n });\n }\n\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n for (let i = 0; i < size; i++) {\n view.setInt8(i, this.pdfiumModule.pdfium.getValue(contentPtr + i, 'i8'));\n }\n\n this.memoryManager.free(sizePtr);\n this.memoryManager.free(contentPtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ReadAttachmentContent`, 'End', doc.id);\n\n return PdfTaskHelper.resolve(buffer);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.setFormFieldValue}\n *\n * @public\n */\n setFormFieldValue(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'SetFormFieldValue', doc, annotation, value);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'Begin',\n `${doc.id}-${annotation.id}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'SetFormFieldValue', 'document is not opened');\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'End',\n `${doc.id}-${annotation.id}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const formFillInfoPtr = this.pdfiumModule.PDFiumExt_OpenFormFillInfo();\n const formHandle = this.pdfiumModule.PDFiumExt_InitFormFillEnvironment(\n ctx.docPtr,\n formFillInfoPtr,\n );\n\n const pageCtx = ctx.acquirePage(page.index);\n\n this.pdfiumModule.FORM_OnAfterLoadPage(pageCtx.pagePtr, formHandle);\n\n const annotationPtr = this.getAnnotationByName(pageCtx.pagePtr, annotation.id);\n\n if (!annotationPtr) {\n pageCtx.release();\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'SetFormFieldValue',\n 'End',\n `${doc.id}-${page.index}`,\n );\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'annotation not found' });\n }\n\n if (!this.pdfiumModule.FORM_SetFocusedAnnot(formHandle, annotationPtr)) {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'SetFormFieldValue',\n 'failed to set focused annotation',\n );\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'End',\n `${doc.id}-${annotation.id}`,\n );\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n this.pdfiumModule.FORM_OnBeforeClosePage(pageCtx.pagePtr, formHandle);\n pageCtx.release();\n this.pdfiumModule.PDFiumExt_ExitFormFillEnvironment(formHandle);\n this.pdfiumModule.PDFiumExt_CloseFormFillInfo(formFillInfoPtr);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantFocusAnnot,\n message: 'failed to set focused annotation',\n });\n }\n\n switch (value.kind) {\n case 'text':\n {\n if (!this.pdfiumModule.FORM_SelectAllText(formHandle, pageCtx.pagePtr)) {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'SetFormFieldValue',\n 'failed to select all text',\n );\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'End',\n `${doc.id}-${annotation.id}`,\n );\n this.pdfiumModule.FORM_ForceToKillFocus(formHandle);\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n this.pdfiumModule.FORM_OnBeforeClosePage(pageCtx.pagePtr, formHandle);\n pageCtx.release();\n this.pdfiumModule.PDFiumExt_ExitFormFillEnvironment(formHandle);\n this.pdfiumModule.PDFiumExt_CloseFormFillInfo(formFillInfoPtr);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSelectText,\n message: 'failed to select all text',\n });\n }\n const length = 2 * (value.text.length + 1);\n const textPtr = this.memoryManager.malloc(length);\n this.pdfiumModule.pdfium.stringToUTF16(value.text, textPtr, length);\n this.pdfiumModule.FORM_ReplaceSelection(formHandle, pageCtx.pagePtr, textPtr);\n this.memoryManager.free(textPtr);\n }\n break;\n case 'selection':\n {\n if (\n !this.pdfiumModule.FORM_SetIndexSelected(\n formHandle,\n pageCtx.pagePtr,\n value.index,\n value.isSelected,\n )\n ) {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'SetFormFieldValue',\n 'failed to set index selected',\n );\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'End',\n `${doc.id}-${annotation.id}`,\n );\n this.pdfiumModule.FORM_ForceToKillFocus(formHandle);\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n this.pdfiumModule.FORM_OnBeforeClosePage(pageCtx.pagePtr, formHandle);\n pageCtx.release();\n this.pdfiumModule.PDFiumExt_ExitFormFillEnvironment(formHandle);\n this.pdfiumModule.PDFiumExt_CloseFormFillInfo(formFillInfoPtr);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantSelectOption,\n message: 'failed to set index selected',\n });\n }\n }\n break;\n case 'checked':\n {\n const kReturn = 0x0d;\n if (!this.pdfiumModule.FORM_OnChar(formHandle, pageCtx.pagePtr, kReturn, 0)) {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'SetFormFieldValue',\n 'failed to set field checked',\n );\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `SetFormFieldValue`,\n 'End',\n `${doc.id}-${annotation.id}`,\n );\n this.pdfiumModule.FORM_ForceToKillFocus(formHandle);\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n this.pdfiumModule.FORM_OnBeforeClosePage(pageCtx.pagePtr, formHandle);\n pageCtx.release();\n this.pdfiumModule.PDFiumExt_ExitFormFillEnvironment(formHandle);\n this.pdfiumModule.PDFiumExt_CloseFormFillInfo(formFillInfoPtr);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCheckField,\n message: 'failed to set field checked',\n });\n }\n }\n break;\n }\n\n this.pdfiumModule.FORM_ForceToKillFocus(formHandle);\n\n this.pdfiumModule.FPDFPage_CloseAnnot(annotationPtr);\n this.pdfiumModule.FORM_OnBeforeClosePage(pageCtx.pagePtr, formHandle);\n pageCtx.release();\n\n this.pdfiumModule.PDFiumExt_ExitFormFillEnvironment(formHandle);\n this.pdfiumModule.PDFiumExt_CloseFormFillInfo(formFillInfoPtr);\n\n return PdfTaskHelper.resolve<boolean>(true);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.flattenPage}\n *\n * @public\n */\n flattenPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ): PdfTask<PdfPageFlattenResult> {\n const { flag = PdfPageFlattenFlag.Display } = options ?? {};\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'flattenPage', doc, page, flag);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `flattenPage`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `flattenPage`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n const result = this.pdfiumModule.FPDFPage_Flatten(pageCtx.pagePtr, flag);\n pageCtx.release();\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `flattenPage`, 'End', doc.id);\n\n return PdfTaskHelper.resolve(result);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.extractPages}\n *\n * @public\n */\n extractPages(doc: PdfDocumentObject, pageIndexes: number[]) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'extractPages', doc, pageIndexes);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractPages`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractPages`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const newDocPtr = this.pdfiumModule.FPDF_CreateNewDocument();\n if (!newDocPtr) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractPages`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCreateNewDoc,\n message: 'can not create new document',\n });\n }\n\n const pageIndexesPtr = this.memoryManager.malloc(pageIndexes.length * 4);\n for (let i = 0; i < pageIndexes.length; i++) {\n this.pdfiumModule.pdfium.setValue(pageIndexesPtr + i * 4, pageIndexes[i], 'i32');\n }\n\n if (\n !this.pdfiumModule.FPDF_ImportPagesByIndex(\n newDocPtr,\n ctx.docPtr,\n pageIndexesPtr,\n pageIndexes.length,\n 0,\n )\n ) {\n this.pdfiumModule.FPDF_CloseDocument(newDocPtr);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractPages`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantImportPages,\n message: 'can not import pages to new document',\n });\n }\n\n const buffer = this.saveDocument(newDocPtr);\n\n this.pdfiumModule.FPDF_CloseDocument(newDocPtr);\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractPages`, 'End', doc.id);\n return PdfTaskHelper.resolve(buffer);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.extractText}\n *\n * @public\n */\n extractText(doc: PdfDocumentObject, pageIndexes: number[]) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'extractText', doc, pageIndexes);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractText`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractText`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const strings: string[] = [];\n for (let i = 0; i < pageIndexes.length; i++) {\n const pageCtx = ctx.acquirePage(pageIndexes[i]);\n const textPagePtr = this.pdfiumModule.FPDFText_LoadPage(pageCtx.pagePtr);\n const charCount = this.pdfiumModule.FPDFText_CountChars(textPagePtr);\n const bufferPtr = this.memoryManager.malloc((charCount + 1) * 2);\n this.pdfiumModule.FPDFText_GetText(textPagePtr, 0, charCount, bufferPtr);\n const text = this.pdfiumModule.pdfium.UTF16ToString(bufferPtr);\n this.memoryManager.free(bufferPtr);\n strings.push(text);\n this.pdfiumModule.FPDFText_ClosePage(textPagePtr);\n pageCtx.release();\n }\n\n const text = strings.join('\\n\\n');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `ExtractText`, 'End', doc.id);\n return PdfTaskHelper.resolve(text);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.getTextSlices}\n *\n * @public\n */\n getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getTextSlices', doc, slices);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetTextSlices', 'Begin', doc.id);\n\n /* ⚠︎ 1 — trivial case */\n if (slices.length === 0) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetTextSlices', 'End', doc.id);\n return PdfTaskHelper.resolve<string[]>([]);\n }\n\n /* ⚠︎ 2 — document must be open */\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetTextSlices', 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n try {\n /* keep caller order */\n const out = new Array<string>(slices.length);\n\n /* group → open each page once */\n const byPage = new Map<number, { slice: PageTextSlice; pos: number }[]>();\n slices.forEach((s, i) => {\n (byPage.get(s.pageIndex) ?? byPage.set(s.pageIndex, []).get(s.pageIndex))!.push({\n slice: s,\n pos: i,\n });\n });\n\n for (const [pageIdx, list] of byPage) {\n const pageCtx = ctx.acquirePage(pageIdx);\n const textPagePtr = pageCtx.getTextPage();\n\n for (const { slice, pos } of list) {\n const bufPtr = this.memoryManager.malloc(2 * (slice.charCount + 1)); // UTF-16 + NIL\n this.pdfiumModule.FPDFText_GetText(textPagePtr, slice.charIndex, slice.charCount, bufPtr);\n out[pos] = stripPdfUnwantedMarkers(this.pdfiumModule.pdfium.UTF16ToString(bufPtr));\n this.memoryManager.free(bufPtr);\n }\n pageCtx.release();\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetTextSlices', 'End', doc.id);\n return PdfTaskHelper.resolve(out);\n } catch (e) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'getTextSlices error', e);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetTextSlices', 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: String(e),\n });\n }\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.merge}\n *\n * @public\n */\n merge(files: PdfFile[]) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'merge', files);\n const fileIds = files.map((file) => file.id).join('.');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Merge`, 'Begin', fileIds);\n\n const newDocPtr = this.pdfiumModule.FPDF_CreateNewDocument();\n if (!newDocPtr) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Merge`, 'End', fileIds);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCreateNewDoc,\n message: 'can not create new document',\n });\n }\n\n const ptrs: { docPtr: number; filePtr: WasmPointer }[] = [];\n for (const file of files.reverse()) {\n const array = new Uint8Array(file.content);\n const length = array.length;\n const filePtr = this.memoryManager.malloc(length);\n this.pdfiumModule.pdfium.HEAPU8.set(array, filePtr);\n\n const docPtr = this.pdfiumModule.FPDF_LoadMemDocument(filePtr, length, '');\n if (!docPtr) {\n const lastError = this.pdfiumModule.FPDF_GetLastError();\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `FPDF_LoadMemDocument failed with ${lastError}`,\n );\n this.memoryManager.free(filePtr);\n\n for (const ptr of ptrs) {\n this.pdfiumModule.FPDF_CloseDocument(ptr.docPtr);\n this.memoryManager.free(ptr.filePtr);\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Merge`, 'End', fileIds);\n return PdfTaskHelper.reject<PdfFile>({\n code: lastError,\n message: `FPDF_LoadMemDocument failed`,\n });\n }\n ptrs.push({ filePtr, docPtr });\n\n if (!this.pdfiumModule.FPDF_ImportPages(newDocPtr, docPtr, '', 0)) {\n this.pdfiumModule.FPDF_CloseDocument(newDocPtr);\n\n for (const ptr of ptrs) {\n this.pdfiumModule.FPDF_CloseDocument(ptr.docPtr);\n this.memoryManager.free(ptr.filePtr);\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Merge`, 'End', fileIds);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantImportPages,\n message: 'can not import pages to new document',\n });\n }\n }\n const buffer = this.saveDocument(newDocPtr);\n\n this.pdfiumModule.FPDF_CloseDocument(newDocPtr);\n\n for (const ptr of ptrs) {\n this.pdfiumModule.FPDF_CloseDocument(ptr.docPtr);\n this.memoryManager.free(ptr.filePtr);\n }\n\n const file: PdfFile = {\n id: `${Math.random()}`,\n content: buffer,\n };\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `Merge`, 'End', fileIds);\n return PdfTaskHelper.resolve(file);\n }\n\n /**\n * Merges specific pages from multiple PDF documents in a custom order\n *\n * @param mergeConfigs Array of configurations specifying which pages to merge from which documents\n * @returns A PdfTask that resolves with the merged PDF file\n * @public\n */\n mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>) {\n const configIds = mergeConfigs\n .map((config) => `${config.docId}:${config.pageIndices.join(',')}`)\n .join('|');\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'mergePages', mergeConfigs);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `MergePages`, 'Begin', configIds);\n\n // Create a new document to import pages into\n const newDocPtr = this.pdfiumModule.FPDF_CreateNewDocument();\n if (!newDocPtr) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `MergePages`, 'End', configIds);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCreateNewDoc,\n message: 'Cannot create new document',\n });\n }\n\n try {\n // Process each merge configuration in reverse order (since we're inserting at position 0)\n // This ensures the final document has pages in the order specified by the user\n for (const config of [...mergeConfigs].reverse()) {\n // Check if the document is open\n const ctx = this.cache.getContext(config.docId);\n\n if (!ctx) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Document ${config.docId} is not open, skipping`,\n );\n continue;\n }\n\n // Get the page count for this document\n const pageCount = this.pdfiumModule.FPDF_GetPageCount(ctx.docPtr);\n\n // Filter out invalid page indices\n const validPageIndices = config.pageIndices.filter(\n (index) => index >= 0 && index < pageCount,\n );\n\n if (validPageIndices.length === 0) {\n continue; // No valid pages to import\n }\n\n // Convert 0-based indices to 1-based for PDFium and join with commas\n const pageString = validPageIndices.map((index) => index + 1).join(',');\n\n try {\n // Import all specified pages at once from this document\n if (\n !this.pdfiumModule.FPDF_ImportPages(\n newDocPtr,\n ctx.docPtr,\n pageString,\n 0, // Insert at the beginning\n )\n ) {\n throw new Error(`Failed to import pages ${pageString} from document ${config.docId}`);\n }\n } finally {\n }\n }\n\n // Save the new document to buffer\n const buffer = this.saveDocument(newDocPtr);\n\n const file: PdfFile = {\n id: `${Math.random()}`,\n content: buffer,\n };\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `MergePages`, 'End', configIds);\n return PdfTaskHelper.resolve(file);\n } catch (error) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'mergePages failed', error);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `MergePages`, 'End', configIds);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantImportPages,\n message: error instanceof Error ? error.message : 'Failed to merge pages',\n });\n } finally {\n // Clean up the new document\n if (newDocPtr) {\n this.pdfiumModule.FPDF_CloseDocument(newDocPtr);\n }\n }\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.saveAsCopy}\n *\n * @public\n */\n saveAsCopy(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'saveAsCopy', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SaveAsCopy`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SaveAsCopy`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const buffer = this.saveDocument(ctx.docPtr);\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SaveAsCopy`, 'End', doc.id);\n return PdfTaskHelper.resolve(buffer);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.closeDocument}\n *\n * @public\n */\n closeDocument(doc: PdfDocumentObject) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'closeDocument', doc);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `CloseDocument`, 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) return PdfTaskHelper.resolve(true);\n\n ctx.dispose();\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `CloseDocument`, 'End', doc.id);\n return PdfTaskHelper.resolve(true);\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.closeAllDocuments}\n *\n * @public\n */\n closeAllDocuments() {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'closeAllDocuments');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `CloseAllDocuments`, 'Begin');\n this.cache.closeAllDocuments();\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `CloseAllDocuments`, 'End');\n return PdfTaskHelper.resolve(true);\n }\n\n /**\n * Add text content to annotation\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to text annotation\n * @param annotation - text annotation\n * @returns whether text content is added to annotation\n *\n * @private\n */\n private addTextContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfTextAnnoObject,\n ) {\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (\n annotation.inReplyToId &&\n !this.setInReplyToId(pagePtr, annotationPtr, annotation.inReplyToId)\n ) {\n return false;\n }\n if (!this.setAnnotationIcon(annotationPtr, annotation.icon || PdfAnnotationIcon.Comment)) {\n return false;\n }\n if (\n !this.setAnnotationFlags(annotationPtr, annotation.flags || ['print', 'noZoom', 'noRotate'])\n ) {\n return false;\n }\n if (annotation.state && !this.setAnnotString(annotationPtr, 'State', annotation.state)) {\n return false;\n }\n if (\n annotation.stateModel &&\n !this.setAnnotString(annotationPtr, 'StateModel', annotation.stateModel)\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Add free text content to annotation\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to free text annotation\n * @param annotation - free text annotation\n * @returns whether free text content is added to annotation\n *\n * @private\n */\n private addFreeTextContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfFreeTextAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (!this.setBorderStyle(annotationPtr, PdfAnnotationBorderStyle.SOLID, 0)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (!this.setAnnotationTextAlignment(annotationPtr, annotation.textAlign)) {\n return false;\n }\n if (!this.setAnnotationVerticalAlignment(annotationPtr, annotation.verticalAlign)) {\n return false;\n }\n if (\n !this.setAnnotationDefaultAppearance(\n annotationPtr,\n annotation.fontFamily,\n annotation.fontSize,\n annotation.fontColor,\n )\n ) {\n return false;\n }\n if (annotation.intent && !this.setAnnotIntent(annotationPtr, annotation.intent)) {\n return false;\n }\n if (!annotation.backgroundColor || annotation.backgroundColor === 'transparent') {\n if (!this.pdfiumModule.EPDFAnnot_ClearColor(annotationPtr, PdfAnnotationColorType.Color)) {\n return false;\n }\n } else if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.backgroundColor ?? '#FFFFFF',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Set the rect of specified annotation\n * @param page - page info that the annotation is belonged to\n * @param pagePtr - pointer of page object\n * @param annotationPtr - pointer to annotation object\n * @param inkList - ink lists that added to the annotation\n * @returns whether the ink lists is setted\n *\n * @private\n */\n private addInkStroke(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfInkAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (\n !this.setBorderStyle(annotationPtr, PdfAnnotationBorderStyle.SOLID, annotation.strokeWidth)\n ) {\n return false;\n }\n if (!this.setInkList(page, annotationPtr, annotation.inkList)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.color ?? '#FFFF00',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Add line content to annotation\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to line annotation\n * @param annotation - line annotation\n * @returns whether line content is added to annotation\n *\n * @private\n */\n private addLineContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfLineAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (\n !this.setLinePoints(\n page,\n annotationPtr,\n annotation.linePoints.start,\n annotation.linePoints.end,\n )\n ) {\n return false;\n }\n if (\n !this.setLineEndings(\n annotationPtr,\n annotation.lineEndings?.start ?? PdfAnnotationLineEnding.None,\n annotation.lineEndings?.end ?? PdfAnnotationLineEnding.None,\n )\n ) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setBorderStyle(annotationPtr, annotation.strokeStyle, annotation.strokeWidth)) {\n return false;\n }\n if (!this.setBorderDashPattern(annotationPtr, annotation.strokeDashArray ?? [])) {\n return false;\n }\n if (annotation.intent && !this.setAnnotIntent(annotationPtr, annotation.intent)) {\n return false;\n }\n if (!annotation.color || annotation.color === 'transparent') {\n if (\n !this.pdfiumModule.EPDFAnnot_ClearColor(annotationPtr, PdfAnnotationColorType.InteriorColor)\n ) {\n return false;\n }\n } else if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.color ?? '#FFFF00',\n PdfAnnotationColorType.InteriorColor,\n )\n ) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.strokeColor ?? '#FFFF00',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Add polygon or polyline content to annotation\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to polygon or polyline annotation\n * @param annotation - polygon or polyline annotation\n * @returns whether polygon or polyline content is added to annotation\n *\n * @private\n */\n private addPolyContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfPolygonAnnoObject | PdfPolylineAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (\n annotation.type === PdfAnnotationSubtype.POLYLINE &&\n !this.setLineEndings(\n annotationPtr,\n annotation.lineEndings?.start ?? PdfAnnotationLineEnding.None,\n annotation.lineEndings?.end ?? PdfAnnotationLineEnding.None,\n )\n ) {\n return false;\n }\n if (!this.setPdfAnnoVertices(page, annotationPtr, annotation.vertices)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setBorderStyle(annotationPtr, annotation.strokeStyle, annotation.strokeWidth)) {\n return false;\n }\n if (!this.setBorderDashPattern(annotationPtr, annotation.strokeDashArray ?? [])) {\n return false;\n }\n if (annotation.intent && !this.setAnnotIntent(annotationPtr, annotation.intent)) {\n return false;\n }\n if (!annotation.color || annotation.color === 'transparent') {\n if (\n !this.pdfiumModule.EPDFAnnot_ClearColor(annotationPtr, PdfAnnotationColorType.InteriorColor)\n ) {\n return false;\n }\n } else if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.color ?? '#FFFF00',\n PdfAnnotationColorType.InteriorColor,\n )\n ) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.strokeColor ?? '#FFFF00',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Add shape content to annotation\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to shape annotation\n * @param annotation - shape annotation\n * @returns whether shape content is added to annotation\n *\n * @private\n */\n addShapeContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfCircleAnnoObject | PdfSquareAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setBorderStyle(annotationPtr, annotation.strokeStyle, annotation.strokeWidth)) {\n return false;\n }\n if (!this.setBorderDashPattern(annotationPtr, annotation.strokeDashArray ?? [])) {\n return false;\n }\n if (!this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (!annotation.color || annotation.color === 'transparent') {\n if (\n !this.pdfiumModule.EPDFAnnot_ClearColor(annotationPtr, PdfAnnotationColorType.InteriorColor)\n ) {\n return false;\n }\n } else if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.color ?? '#FFFF00',\n PdfAnnotationColorType.InteriorColor,\n )\n ) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.strokeColor ?? '#FFFF00',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Add highlight content to annotation\n * @param page - page info\n * @param annotationPtr - pointer to highlight annotation\n * @param annotation - highlight annotation\n * @returns whether highlight content is added to annotation\n *\n * @private\n */\n addTextMarkupContent(\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation:\n | PdfHighlightAnnoObject\n | PdfUnderlineAnnoObject\n | PdfStrikeOutAnnoObject\n | PdfSquigglyAnnoObject,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (!this.syncQuadPointsAnno(page, annotationPtr, annotation.segmentRects)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (!this.setAnnotationOpacity(annotationPtr, annotation.opacity ?? 1)) {\n return false;\n }\n if (\n !this.setAnnotationColor(\n annotationPtr,\n annotation.color ?? '#FFFF00',\n PdfAnnotationColorType.Color,\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Add contents to stamp annotation\n * @param docPtr - pointer to pdf document object\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to stamp annotation\n * @param rect - rect of stamp annotation\n * @param contents - contents of stamp annotation\n * @returns whether contents is added to annotation\n *\n * @private\n */\n addStampContent(\n docPtr: number,\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n annotation: PdfStampAnnoObject,\n imageData?: ImageData,\n ) {\n if (\n annotation.created &&\n !this.setAnnotationDate(annotationPtr, 'CreationDate', annotation.created)\n ) {\n return false;\n }\n if (annotation.custom && !this.setAnnotCustom(annotationPtr, annotation.custom)) {\n return false;\n }\n if (annotation.flags && !this.setAnnotationFlags(annotationPtr, annotation.flags)) {\n return false;\n }\n if (annotation.modified && !this.setAnnotationDate(annotationPtr, 'M', annotation.modified)) {\n return false;\n }\n if (annotation.icon && !this.setAnnotationIcon(annotationPtr, annotation.icon)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'T', annotation.author || '')) {\n return false;\n }\n if (annotation.subject && !this.setAnnotString(annotationPtr, 'Subj', annotation.subject)) {\n return false;\n }\n if (!this.setAnnotString(annotationPtr, 'Contents', annotation.contents ?? '')) {\n return false;\n }\n if (imageData) {\n for (let i = this.pdfiumModule.FPDFAnnot_GetObjectCount(annotationPtr) - 1; i >= 0; i--) {\n this.pdfiumModule.FPDFAnnot_RemoveObject(annotationPtr, i);\n }\n\n if (!this.addImageObject(docPtr, page, pagePtr, annotationPtr, annotation.rect, imageData)) {\n return false;\n }\n }\n if (!this.pdfiumModule.EPDFAnnot_UpdateAppearanceToRect(annotationPtr, PdfStampFit.Cover)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Add image object to annotation\n * @param docPtr - pointer to pdf document object\n * @param page - page info\n * @param pagePtr - pointer to page object\n * @param annotationPtr - pointer to stamp annotation\n * @param position - position of image\n * @param imageData - data of image\n * @returns whether image is added to annotation\n *\n * @private\n */\n addImageObject(\n docPtr: number,\n page: PdfPageObject,\n pagePtr: number,\n annotationPtr: number,\n rect: Rect,\n imageData: ImageData,\n ) {\n const bytesPerPixel = 4;\n const pixelCount = imageData.width * imageData.height;\n\n const bitmapBufferPtr = this.memoryManager.malloc(bytesPerPixel * pixelCount);\n if (!bitmapBufferPtr) {\n return false;\n }\n\n for (let i = 0; i < pixelCount; i++) {\n const red = imageData.data[i * bytesPerPixel];\n const green = imageData.data[i * bytesPerPixel + 1];\n const blue = imageData.data[i * bytesPerPixel + 2];\n const alpha = imageData.data[i * bytesPerPixel + 3];\n\n this.pdfiumModule.pdfium.setValue(bitmapBufferPtr + i * bytesPerPixel, blue, 'i8');\n this.pdfiumModule.pdfium.setValue(bitmapBufferPtr + i * bytesPerPixel + 1, green, 'i8');\n this.pdfiumModule.pdfium.setValue(bitmapBufferPtr + i * bytesPerPixel + 2, red, 'i8');\n this.pdfiumModule.pdfium.setValue(bitmapBufferPtr + i * bytesPerPixel + 3, alpha, 'i8');\n }\n\n const format = BitmapFormat.Bitmap_BGRA;\n const bitmapPtr = this.pdfiumModule.FPDFBitmap_CreateEx(\n imageData.width,\n imageData.height,\n format,\n bitmapBufferPtr,\n 0,\n );\n if (!bitmapPtr) {\n this.memoryManager.free(bitmapBufferPtr);\n return false;\n }\n\n const imageObjectPtr = this.pdfiumModule.FPDFPageObj_NewImageObj(docPtr);\n if (!imageObjectPtr) {\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.memoryManager.free(bitmapBufferPtr);\n return false;\n }\n\n if (!this.pdfiumModule.FPDFImageObj_SetBitmap(pagePtr, 0, imageObjectPtr, bitmapPtr)) {\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.pdfiumModule.FPDFPageObj_Destroy(imageObjectPtr);\n this.memoryManager.free(bitmapBufferPtr);\n return false;\n }\n\n const matrixPtr = this.memoryManager.malloc(6 * 4);\n this.pdfiumModule.pdfium.setValue(matrixPtr, imageData.width, 'float');\n this.pdfiumModule.pdfium.setValue(matrixPtr + 4, 0, 'float');\n this.pdfiumModule.pdfium.setValue(matrixPtr + 8, 0, 'float');\n this.pdfiumModule.pdfium.setValue(matrixPtr + 12, imageData.height, 'float');\n this.pdfiumModule.pdfium.setValue(matrixPtr + 16, 0, 'float');\n this.pdfiumModule.pdfium.setValue(matrixPtr + 20, 0, 'float');\n if (!this.pdfiumModule.FPDFPageObj_SetMatrix(imageObjectPtr, matrixPtr)) {\n this.memoryManager.free(matrixPtr);\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.pdfiumModule.FPDFPageObj_Destroy(imageObjectPtr);\n this.memoryManager.free(bitmapBufferPtr);\n return false;\n }\n this.memoryManager.free(matrixPtr);\n\n const pagePos = this.convertDevicePointToPagePoint(page, {\n x: rect.origin.x,\n y: rect.origin.y + imageData.height, // shift down by the image height\n });\n this.pdfiumModule.FPDFPageObj_Transform(imageObjectPtr, 1, 0, 0, 1, pagePos.x, pagePos.y);\n\n if (!this.pdfiumModule.FPDFAnnot_AppendObject(annotationPtr, imageObjectPtr)) {\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.pdfiumModule.FPDFPageObj_Destroy(imageObjectPtr);\n this.memoryManager.free(bitmapBufferPtr);\n return false;\n }\n\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.memoryManager.free(bitmapBufferPtr);\n\n return true;\n }\n\n /**\n * Save document to array buffer\n * @param docPtr - pointer to pdf document\n * @returns array buffer contains the pdf content\n *\n * @private\n */\n saveDocument(docPtr: number) {\n const writerPtr = this.pdfiumModule.PDFiumExt_OpenFileWriter();\n this.pdfiumModule.PDFiumExt_SaveAsCopy(docPtr, writerPtr);\n const size = this.pdfiumModule.PDFiumExt_GetFileWriterSize(writerPtr);\n const dataPtr = this.memoryManager.malloc(size);\n this.pdfiumModule.PDFiumExt_GetFileWriterData(writerPtr, dataPtr, size);\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n for (let i = 0; i < size; i++) {\n view.setInt8(i, this.pdfiumModule.pdfium.getValue(dataPtr + i, 'i8'));\n }\n this.memoryManager.free(dataPtr);\n this.pdfiumModule.PDFiumExt_CloseFileWriter(writerPtr);\n\n return buffer;\n }\n\n /**\n * Read Catalog /Lang via EPDFCatalog_GetLanguage (UTF-16LE → JS string).\n * Returns:\n * null -> /Lang not present (getter returned 0) OR doc not open,\n * '' -> /Lang exists but is explicitly empty,\n * 'en', 'en-US', ... -> normal tag.\n *\n * Note: EPDFCatalog_GetLanguage lengths are BYTES (incl. trailing NUL).\n *\n * @private\n */\n private readCatalogLanguage(docPtr: number): string | null {\n // Probe required length in BYTES (includes UTF-16LE trailing NUL).\n const byteLen = this.pdfiumModule.EPDFCatalog_GetLanguage(docPtr, 0, 0) >>> 0;\n\n // 0 => /Lang missing (or invalid doc/root) → expose as null\n if (byteLen === 0) return null;\n\n // 2 => empty UTF-16LE string (just the NUL) → explicitly empty\n if (byteLen === 2) return '';\n\n // Read exact buffer to avoid extra allocs.\n return readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) =>\n this.pdfiumModule.EPDFCatalog_GetLanguage(docPtr, buffer, bufferLength),\n this.pdfiumModule.pdfium.UTF16ToString,\n byteLen,\n );\n }\n\n /**\n * Read metadata from pdf document\n * @param docPtr - pointer to pdf document\n * @param key - key of metadata field\n * @returns metadata value\n *\n * @private\n */\n private readMetaText(docPtr: number, key: string): string | null {\n const exists = !!this.pdfiumModule.EPDF_HasMetaText(docPtr, key);\n if (!exists) return null;\n\n const len = this.pdfiumModule.FPDF_GetMetaText(docPtr, key, 0, 0);\n if (len === 2) return '';\n\n // Read with an exact buffer to avoid extra allocations.\n return readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) =>\n this.pdfiumModule.FPDF_GetMetaText(docPtr, key, buffer, bufferLength),\n this.pdfiumModule.pdfium.UTF16ToString,\n len,\n );\n }\n\n /**\n * Write metadata into the PDF's Info dictionary.\n * If `value` is null or empty string, the key is removed.\n * @param docPtr - pointer to pdf document\n * @param key - key of metadata field\n * @param value - value of metadata field\n * @returns whether metadata is written to the pdf document\n *\n * @private\n */\n private setMetaText(docPtr: number, key: string, value: string | null | undefined): boolean {\n // Remove key if value is null/undefined/empty\n if (value == null || value.length === 0) {\n // Pass nullptr for value → removal in our C++ implementation\n const ok = this.pdfiumModule.EPDF_SetMetaText(docPtr, key, 0);\n return !!ok;\n }\n\n // UTF-16LE buffer (+2 bytes for NUL)\n const bytes = 2 * (value.length + 1);\n const ptr = this.memoryManager.malloc(bytes);\n try {\n this.pdfiumModule.pdfium.stringToUTF16(value, ptr, bytes);\n const ok = this.pdfiumModule.EPDF_SetMetaText(docPtr, key, ptr);\n return !!ok;\n } finally {\n this.memoryManager.free(ptr);\n }\n }\n\n /**\n * Read the document's trapped status via PDFium.\n * Falls back to `Unknown` on unexpected values.\n *\n * @private\n */\n private getMetaTrapped(docPtr: number): PdfTrappedStatus {\n const raw = Number(this.pdfiumModule.EPDF_GetMetaTrapped(docPtr));\n switch (raw) {\n case PdfTrappedStatus.NotSet:\n case PdfTrappedStatus.True:\n case PdfTrappedStatus.False:\n case PdfTrappedStatus.Unknown:\n return raw;\n default:\n return PdfTrappedStatus.Unknown;\n }\n }\n\n /**\n * Write (or clear) the document's trapped status via PDFium.\n * Pass `null`/`undefined` to remove the `/Trapped` key.\n *\n * @private\n */\n private setMetaTrapped(docPtr: number, status: PdfTrappedStatus | null | undefined): boolean {\n // Treat null/undefined as “remove key” — the C++ side handles NotSet by\n // deleting /Trapped from the Info dictionary.\n const toSet = status == null || status === undefined ? PdfTrappedStatus.NotSet : status;\n\n // Guard against unexpected values.\n const valid =\n toSet === PdfTrappedStatus.NotSet ||\n toSet === PdfTrappedStatus.True ||\n toSet === PdfTrappedStatus.False ||\n toSet === PdfTrappedStatus.Unknown;\n\n if (!valid) return false;\n\n return !!this.pdfiumModule.EPDF_SetMetaTrapped(docPtr, toSet);\n }\n\n /**\n * Get the number of keys in the document's Info dictionary.\n * @param docPtr - pointer to pdf document\n * @param customOnly - if true, only count non-reserved (custom) keys; if false, count all keys.\n * @returns the number of keys (possibly 0). On error, returns 0.\n *\n * @private\n */\n private getMetaKeyCount(docPtr: number, customOnly: boolean): number {\n return Number(this.pdfiumModule.EPDF_GetMetaKeyCount(docPtr, customOnly)) | 0;\n }\n\n /**\n * Get the name of the Info dictionary key at |index|.\n * @param docPtr - pointer to pdf document\n * @param index - 0-based key index in the order returned by PDFium.\n * @param customOnly - if true, indexes only over non-reserved (custom) keys; if false, indexes over all keys.\n * @returns the name of the key, or null if the key is not found.\n *\n * @private\n */\n private getMetaKeyName(docPtr: number, index: number, customOnly: boolean): string | null {\n const len = this.pdfiumModule.EPDF_GetMetaKeyName(docPtr, index, customOnly, 0, 0);\n if (!len) return null;\n return readString(\n this.pdfiumModule.pdfium,\n (buffer, buflen) =>\n this.pdfiumModule.EPDF_GetMetaKeyName(docPtr, index, customOnly, buffer, buflen),\n this.pdfiumModule.pdfium.UTF8ToString,\n len,\n );\n }\n\n /**\n * Read all metadata from the document's Info dictionary.\n * @param docPtr - pointer to pdf document\n * @param customOnly - if true, only read non-reserved (custom) keys; if false, read all keys.\n * @returns all metadata\n *\n * @private\n */\n private readAllMeta(docPtr: number, customOnly: boolean = true): Record<string, string | null> {\n const n = this.getMetaKeyCount(docPtr, customOnly);\n const out: Record<string, string | null> = {};\n for (let i = 0; i < n; i++) {\n const key = this.getMetaKeyName(docPtr, i, customOnly);\n if (!key) continue;\n out[key] = this.readMetaText(docPtr, key); // returns null if not present\n }\n return out;\n }\n\n /**\n * Read bookmarks in the pdf document\n * @param docPtr - pointer to pdf document\n * @param rootBookmarkPtr - pointer to root bookmark\n * @returns bookmarks in the pdf document\n *\n * @private\n */\n readPdfBookmarks(docPtr: number, rootBookmarkPtr = 0) {\n let bookmarkPtr = this.pdfiumModule.FPDFBookmark_GetFirstChild(docPtr, rootBookmarkPtr);\n\n const bookmarks: PdfBookmarkObject[] = [];\n while (bookmarkPtr) {\n const bookmark = this.readPdfBookmark(docPtr, bookmarkPtr);\n bookmarks.push(bookmark);\n\n const nextBookmarkPtr = this.pdfiumModule.FPDFBookmark_GetNextSibling(docPtr, bookmarkPtr);\n\n bookmarkPtr = nextBookmarkPtr;\n }\n\n return bookmarks;\n }\n\n /**\n * Read bookmark in the pdf document\n * @param docPtr - pointer to pdf document\n * @param bookmarkPtr - pointer to bookmark object\n * @returns pdf bookmark object\n *\n * @private\n */\n private readPdfBookmark(docPtr: number, bookmarkPtr: number): PdfBookmarkObject {\n const title = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFBookmark_GetTitle(bookmarkPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n\n const bookmarks = this.readPdfBookmarks(docPtr, bookmarkPtr);\n\n const target = this.readPdfBookmarkTarget(\n docPtr,\n () => {\n return this.pdfiumModule.FPDFBookmark_GetAction(bookmarkPtr);\n },\n () => {\n return this.pdfiumModule.FPDFBookmark_GetDest(docPtr, bookmarkPtr);\n },\n );\n\n return {\n title,\n target,\n children: bookmarks,\n };\n }\n\n /**\n * Read text rects in pdf page\n * @param page - pdf page info\n * @param docPtr - pointer to pdf document\n * @param pagePtr - pointer to pdf page\n * @param textPagePtr - pointer to pdf text page\n * @returns text rects in the pdf page\n *\n * @public\n */\n private readPageTextRects(\n page: PdfPageObject,\n docPtr: number,\n pagePtr: number,\n textPagePtr: number,\n ) {\n const rectsCount = this.pdfiumModule.FPDFText_CountRects(textPagePtr, 0, -1);\n\n const textRects: PdfTextRectObject[] = [];\n for (let i = 0; i < rectsCount; i++) {\n const topPtr = this.memoryManager.malloc(8);\n const leftPtr = this.memoryManager.malloc(8);\n const rightPtr = this.memoryManager.malloc(8);\n const bottomPtr = this.memoryManager.malloc(8);\n const isSucceed = this.pdfiumModule.FPDFText_GetRect(\n textPagePtr,\n i,\n leftPtr,\n topPtr,\n rightPtr,\n bottomPtr,\n );\n if (!isSucceed) {\n this.memoryManager.free(leftPtr);\n this.memoryManager.free(topPtr);\n this.memoryManager.free(rightPtr);\n this.memoryManager.free(bottomPtr);\n continue;\n }\n\n const left = this.pdfiumModule.pdfium.getValue(leftPtr, 'double');\n const top = this.pdfiumModule.pdfium.getValue(topPtr, 'double');\n const right = this.pdfiumModule.pdfium.getValue(rightPtr, 'double');\n const bottom = this.pdfiumModule.pdfium.getValue(bottomPtr, 'double');\n\n this.memoryManager.free(leftPtr);\n this.memoryManager.free(topPtr);\n this.memoryManager.free(rightPtr);\n this.memoryManager.free(bottomPtr);\n\n const deviceXPtr = this.memoryManager.malloc(4);\n const deviceYPtr = this.memoryManager.malloc(4);\n this.pdfiumModule.FPDF_PageToDevice(\n pagePtr,\n 0,\n 0,\n page.size.width,\n page.size.height,\n 0,\n left,\n top,\n deviceXPtr,\n deviceYPtr,\n );\n const x = this.pdfiumModule.pdfium.getValue(deviceXPtr, 'i32');\n const y = this.pdfiumModule.pdfium.getValue(deviceYPtr, 'i32');\n this.memoryManager.free(deviceXPtr);\n this.memoryManager.free(deviceYPtr);\n\n const rect = {\n origin: {\n x,\n y,\n },\n size: {\n width: Math.ceil(Math.abs(right - left)),\n height: Math.ceil(Math.abs(top - bottom)),\n },\n };\n\n const utf16Length = this.pdfiumModule.FPDFText_GetBoundedText(\n textPagePtr,\n left,\n top,\n right,\n bottom,\n 0,\n 0,\n );\n const bytesCount = (utf16Length + 1) * 2; // include NIL\n const textBuffer = this.memoryManager.malloc(bytesCount);\n this.pdfiumModule.FPDFText_GetBoundedText(\n textPagePtr,\n left,\n top,\n right,\n bottom,\n textBuffer,\n utf16Length,\n );\n const content = this.pdfiumModule.pdfium.UTF16ToString(textBuffer);\n this.memoryManager.free(textBuffer);\n\n const charIndex = this.pdfiumModule.FPDFText_GetCharIndexAtPos(textPagePtr, left, top, 2, 2);\n let fontFamily = '';\n let fontSize = rect.size.height;\n if (charIndex >= 0) {\n fontSize = this.pdfiumModule.FPDFText_GetFontSize(textPagePtr, charIndex);\n\n const fontNameLength = this.pdfiumModule.FPDFText_GetFontInfo(\n textPagePtr,\n charIndex,\n 0,\n 0,\n 0,\n );\n\n const bytesCount = fontNameLength + 1; // include NIL\n const textBufferPtr = this.memoryManager.malloc(bytesCount);\n const flagsPtr = this.memoryManager.malloc(4);\n this.pdfiumModule.FPDFText_GetFontInfo(\n textPagePtr,\n charIndex,\n textBufferPtr,\n bytesCount,\n flagsPtr,\n );\n fontFamily = this.pdfiumModule.pdfium.UTF8ToString(textBufferPtr);\n this.memoryManager.free(textBufferPtr);\n this.memoryManager.free(flagsPtr);\n }\n\n const textRect: PdfTextRectObject = {\n content,\n rect,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n };\n\n textRects.push(textRect);\n }\n\n return textRects;\n }\n\n /**\n * Return geometric + logical text layout for one page\n * (glyph-only implementation, no FPDFText_GetRect).\n *\n * @public\n */\n getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry> {\n const label = 'getPageGeometry';\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, label, 'Begin', doc.id);\n\n /* ── guards ───────────────────────────────────────────── */\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, label, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n /* ── native handles ──────────────────────────────────── */\n const pageCtx = ctx.acquirePage(page.index);\n const textPagePtr = pageCtx.getTextPage();\n\n /* ── 1. read ALL glyphs in logical order ─────────────── */\n const glyphCount = this.pdfiumModule.FPDFText_CountChars(textPagePtr);\n const glyphs: PdfGlyphObject[] = [];\n\n for (let i = 0; i < glyphCount; i++) {\n const g = this.readGlyphInfo(page, pageCtx.pagePtr, textPagePtr, i);\n glyphs.push(g);\n }\n\n /* ── 2. build visual runs from glyph stream ───────────── */\n const runs: PdfRun[] = this.buildRunsFromGlyphs(glyphs, textPagePtr);\n\n /* ── 3. cleanup & resolve task ───────────────────────── */\n pageCtx.release();\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, label, 'End', doc.id);\n return PdfTaskHelper.resolve({ runs });\n }\n\n /**\n * Group consecutive glyphs that belong to the same CPDF_TextObject\n * using FPDFText_GetTextObject(), and calculate rotation from glyph positions.\n */\n private buildRunsFromGlyphs(glyphs: PdfGlyphObject[], textPagePtr: number): PdfRun[] {\n const runs: PdfRun[] = [];\n let current: PdfRun | null = null;\n let curObjPtr: number | null = null;\n let bounds: { minX: number; minY: number; maxX: number; maxY: number } | null = null;\n\n /** ── main loop ──────────────────────────────────────────── */\n for (let i = 0; i < glyphs.length; i++) {\n const g = glyphs[i];\n\n /* 1 — find the CPDF_TextObject this glyph belongs to */\n const objPtr = this.pdfiumModule.FPDFText_GetTextObject(textPagePtr, i) as number;\n\n /* 2 — start a new run when the text object changes */\n if (objPtr !== curObjPtr) {\n curObjPtr = objPtr;\n current = {\n rect: {\n x: g.origin.x,\n y: g.origin.y,\n width: g.size.width,\n height: g.size.height,\n },\n charStart: i,\n glyphs: [],\n };\n bounds = {\n minX: g.origin.x,\n minY: g.origin.y,\n maxX: g.origin.x + g.size.width,\n maxY: g.origin.y + g.size.height,\n };\n runs.push(current);\n }\n\n /* 3 — append the slim glyph record */\n current!.glyphs.push({\n x: g.origin.x,\n y: g.origin.y,\n width: g.size.width,\n height: g.size.height,\n flags: g.isEmpty ? 2 : g.isSpace ? 1 : 0,\n });\n\n /* 4 — expand the run's bounding rect */\n if (g.isEmpty) {\n continue;\n }\n\n const right = g.origin.x + g.size.width;\n const bottom = g.origin.y + g.size.height;\n\n // Update bounds\n bounds!.minX = Math.min(bounds!.minX, g.origin.x);\n bounds!.minY = Math.min(bounds!.minY, g.origin.y);\n bounds!.maxX = Math.max(bounds!.maxX, right);\n bounds!.maxY = Math.max(bounds!.maxY, bottom);\n\n // Calculate final rect from bounds\n current!.rect.x = bounds!.minX;\n current!.rect.y = bounds!.minY;\n current!.rect.width = bounds!.maxX - bounds!.minX;\n current!.rect.height = bounds!.maxY - bounds!.minY;\n }\n\n return runs;\n }\n\n /**\n * Extract glyph geometry + metadata for `charIndex`\n *\n * Returns device–space coordinates:\n * x,y → **top-left** corner (integer-pixels)\n * w,h → width / height (integer-pixels, ≥ 1)\n *\n * And two flags:\n * isSpace → true if the glyph's Unicode code-point is U+0020\n */\n private readGlyphInfo(\n page: PdfPageObject,\n pagePtr: number,\n textPagePtr: number,\n charIndex: number,\n ): PdfGlyphObject {\n // ── native stack temp pointers ──────────────────────────────\n const dx1Ptr = this.memoryManager.malloc(4);\n const dy1Ptr = this.memoryManager.malloc(4);\n const dx2Ptr = this.memoryManager.malloc(4);\n const dy2Ptr = this.memoryManager.malloc(4);\n const rectPtr = this.memoryManager.malloc(16); // 4 floats = 16 bytes\n\n let x = 0,\n y = 0,\n width = 0,\n height = 0,\n isSpace = false;\n\n // ── 1) raw glyph bbox in page-user-space\n if (this.pdfiumModule.FPDFText_GetLooseCharBox(textPagePtr, charIndex, rectPtr)) {\n const left = this.pdfiumModule.pdfium.getValue(rectPtr, 'float');\n const top = this.pdfiumModule.pdfium.getValue(rectPtr + 4, 'float');\n const right = this.pdfiumModule.pdfium.getValue(rectPtr + 8, 'float');\n const bottom = this.pdfiumModule.pdfium.getValue(rectPtr + 12, 'float');\n\n if (left === right || top === bottom) {\n [rectPtr, dx1Ptr, dy1Ptr, dx2Ptr, dy2Ptr].forEach((p) => this.memoryManager.free(p));\n\n return {\n origin: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n isEmpty: true,\n };\n }\n\n // ── 2) map 2 opposite corners to device-space\n this.pdfiumModule.FPDF_PageToDevice(\n pagePtr,\n 0,\n 0,\n page.size.width,\n page.size.height,\n /*rotate=*/ 0,\n left,\n top,\n dx1Ptr,\n dy1Ptr,\n );\n this.pdfiumModule.FPDF_PageToDevice(\n pagePtr,\n 0,\n 0,\n page.size.width,\n page.size.height,\n /*rotate=*/ 0,\n right,\n bottom,\n dx2Ptr,\n dy2Ptr,\n );\n\n const x1 = this.pdfiumModule.pdfium.getValue(dx1Ptr, 'i32');\n const y1 = this.pdfiumModule.pdfium.getValue(dy1Ptr, 'i32');\n const x2 = this.pdfiumModule.pdfium.getValue(dx2Ptr, 'i32');\n const y2 = this.pdfiumModule.pdfium.getValue(dy2Ptr, 'i32');\n\n x = Math.min(x1, x2);\n y = Math.min(y1, y2);\n width = Math.max(1, Math.abs(x2 - x1));\n height = Math.max(1, Math.abs(y2 - y1));\n\n // ── 3) extra flags ───────────────────────────────────────\n const uc = this.pdfiumModule.FPDFText_GetUnicode(textPagePtr, charIndex);\n isSpace = uc === 32;\n }\n\n // ── free tmps ───────────────────────────────────────────────\n [rectPtr, dx1Ptr, dy1Ptr, dx2Ptr, dy2Ptr].forEach((p) => this.memoryManager.free(p));\n\n return {\n origin: { x, y },\n size: { width, height },\n ...(isSpace && { isSpace }),\n };\n }\n\n /**\n * Geometry-only text extraction\n * ------------------------------------------\n * Returns every glyph on the requested page\n * in the logical order delivered by PDFium.\n *\n * The promise resolves to an array of objects:\n * {\n * idx: number; // glyph index on the page (0…n-1)\n * origin: { x: number; y: number };\n * size: { width: number; height: number };\n * angle: number; // degrees, counter-clock-wise\n * isSpace: boolean; // true → U+0020\n * }\n *\n * No Unicode is included; front-end decides whether to hydrate it.\n */\n public getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getPageGlyphs', doc, page);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'getPageGlyphs', 'Begin', doc.id);\n\n // ── 1) safety: document handle must be alive ───────────────\n const ctx = this.cache.getContext(doc.id);\n\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'getPageGlyphs', 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // ── 2) load page + text page handles ───────────────────────\n const pageCtx = ctx.acquirePage(page.index);\n const textPagePtr = pageCtx.getTextPage();\n\n // ── 3) iterate all glyphs in logical order ─────────────────\n const total = this.pdfiumModule.FPDFText_CountChars(textPagePtr);\n const glyphs = new Array(total);\n\n for (let i = 0; i < total; i++) {\n const g = this.readGlyphInfo(page, pageCtx.pagePtr, textPagePtr, i);\n\n if (g.isEmpty) {\n continue;\n }\n\n glyphs[i] = { ...g };\n }\n\n // ── 4) clean-up native handles ─────────────────────────────\n pageCtx.release();\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'getPageGlyphs', 'End', doc.id);\n\n return PdfTaskHelper.resolve(glyphs);\n }\n\n private readCharBox(\n page: PdfPageObject,\n pagePtr: number,\n textPagePtr: number,\n charIndex: number,\n ): Rect {\n const topPtr = this.memoryManager.malloc(8);\n const leftPtr = this.memoryManager.malloc(8);\n const bottomPtr = this.memoryManager.malloc(8);\n const rightPtr = this.memoryManager.malloc(8);\n let x = 0;\n let y = 0;\n let width = 0;\n let height = 0;\n if (\n this.pdfiumModule.FPDFText_GetCharBox(\n textPagePtr,\n charIndex,\n leftPtr,\n rightPtr,\n bottomPtr,\n topPtr,\n )\n ) {\n const top = this.pdfiumModule.pdfium.getValue(topPtr, 'double');\n const left = this.pdfiumModule.pdfium.getValue(leftPtr, 'double');\n const bottom = this.pdfiumModule.pdfium.getValue(bottomPtr, 'double');\n const right = this.pdfiumModule.pdfium.getValue(rightPtr, 'double');\n\n const deviceXPtr = this.memoryManager.malloc(4);\n const deviceYPtr = this.memoryManager.malloc(4);\n this.pdfiumModule.FPDF_PageToDevice(\n pagePtr,\n 0,\n 0,\n page.size.width,\n page.size.height,\n 0,\n left,\n top,\n deviceXPtr,\n deviceYPtr,\n );\n x = this.pdfiumModule.pdfium.getValue(deviceXPtr, 'i32');\n y = this.pdfiumModule.pdfium.getValue(deviceYPtr, 'i32');\n this.memoryManager.free(deviceXPtr);\n this.memoryManager.free(deviceYPtr);\n\n width = Math.ceil(Math.abs(right - left));\n height = Math.ceil(Math.abs(top - bottom));\n }\n this.memoryManager.free(topPtr);\n this.memoryManager.free(leftPtr);\n this.memoryManager.free(bottomPtr);\n this.memoryManager.free(rightPtr);\n\n return {\n origin: {\n x,\n y,\n },\n size: {\n width,\n height,\n },\n };\n }\n\n /**\n * Read page annotations\n *\n * @param ctx - document context\n * @param page - page info\n * @returns annotations on the pdf page\n *\n * @private\n */\n private readPageAnnotations(ctx: DocumentContext, page: PdfPageObject) {\n return ctx.borrowPage(page.index, (pageCtx) => {\n const annotationCount = this.pdfiumModule.FPDFPage_GetAnnotCount(pageCtx.pagePtr);\n\n const annotations: PdfAnnotationObject[] = [];\n for (let i = 0; i < annotationCount; i++) {\n pageCtx.withAnnotation(i, (annotPtr) => {\n const anno = this.readPageAnnotation(ctx.docPtr, page, annotPtr, pageCtx);\n if (anno) annotations.push(anno);\n });\n }\n return annotations;\n });\n }\n\n /**\n * Read page annotations without loading the page (raw approach)\n *\n * @param ctx - document context\n * @param page - page info\n * @returns annotations on the pdf page\n *\n * @private\n */\n private readPageAnnotationsRaw(ctx: DocumentContext, page: PdfPageObject): PdfAnnotationObject[] {\n const count = this.pdfiumModule.EPDFPage_GetAnnotCountRaw(ctx.docPtr, page.index);\n if (count <= 0) return [];\n\n const out: PdfAnnotationObject[] = [];\n\n for (let i = 0; i < count; ++i) {\n const annotPtr = this.pdfiumModule.EPDFPage_GetAnnotRaw(ctx.docPtr, page.index, i);\n if (!annotPtr) continue;\n\n try {\n const anno = this.readPageAnnotation(ctx.docPtr, page, annotPtr);\n if (anno) out.push(anno);\n } finally {\n this.pdfiumModule.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return out;\n }\n\n /**\n * Get page annotations (public API, returns Task)\n *\n * @param doc - pdf document\n * @param page - page info\n * @returns task with annotations on the pdf page\n *\n * @public\n */\n getPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfAnnotationObject[]> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getPageAnnotationsRaw', doc, page);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotationsRaw`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n const out = this.readPageAnnotationsRaw(ctx, page);\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `GetPageAnnotationsRaw`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'getPageAnnotationsRaw',\n `${doc.id}-${page.index}`,\n out,\n );\n return PdfTaskHelper.resolve(out);\n }\n\n /**\n * Read pdf annotation from pdf document\n *\n * @param docPtr - pointer to pdf document\n * @param page - page info\n * @param annotationPtr - pointer to pdf annotation\n * @param pageCtx - page context\n * @returns pdf annotation\n *\n * @private\n */\n private readPageAnnotation(\n docPtr: number,\n page: PdfPageObject,\n annotationPtr: number,\n pageCtx?: PageContext,\n ) {\n let index = this.getAnnotString(annotationPtr, 'NM');\n if (!index || !isUuidV4(index)) {\n index = uuidV4();\n this.setAnnotString(annotationPtr, 'NM', index);\n }\n const subType = this.pdfiumModule.FPDFAnnot_GetSubtype(\n annotationPtr,\n ) as PdfAnnotationObject['type'];\n let annotation: PdfAnnotationObject | undefined;\n switch (subType) {\n case PdfAnnotationSubtype.TEXT:\n {\n annotation = this.readPdfTextAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.FREETEXT:\n {\n annotation = this.readPdfFreeTextAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.LINK:\n {\n annotation = this.readPdfLinkAnno(page, docPtr, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.WIDGET:\n if (pageCtx) {\n return this.readPdfWidgetAnno(page, annotationPtr, pageCtx.getFormHandle(), index);\n }\n case PdfAnnotationSubtype.FILEATTACHMENT:\n {\n annotation = this.readPdfFileAttachmentAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.INK:\n {\n annotation = this.readPdfInkAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.POLYGON:\n {\n annotation = this.readPdfPolygonAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.POLYLINE:\n {\n annotation = this.readPdfPolylineAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.LINE:\n {\n annotation = this.readPdfLineAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.HIGHLIGHT:\n annotation = this.readPdfHighlightAnno(page, annotationPtr, index);\n break;\n case PdfAnnotationSubtype.STAMP:\n {\n annotation = this.readPdfStampAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.SQUARE:\n {\n annotation = this.readPdfSquareAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.CIRCLE:\n {\n annotation = this.readPdfCircleAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.UNDERLINE:\n {\n annotation = this.readPdfUnderlineAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.SQUIGGLY:\n {\n annotation = this.readPdfSquigglyAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.STRIKEOUT:\n {\n annotation = this.readPdfStrikeOutAnno(page, annotationPtr, index);\n }\n break;\n case PdfAnnotationSubtype.CARET:\n {\n annotation = this.readPdfCaretAnno(page, annotationPtr, index);\n }\n break;\n default:\n {\n annotation = this.readPdfAnno(page, subType, annotationPtr, index);\n }\n break;\n }\n\n return annotation;\n }\n\n /**\n * Return the colour stored directly in the annotation dictionary's `/C` entry.\n *\n * Most PDFs created by Acrobat, Microsoft Office, LaTeX, etc. include this entry.\n * When the key is absent (common in macOS Preview, Chrome, Drawboard) the call\n * fails and the function returns `undefined`.\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @returns An RGBA tuple (0-255 channels) or `undefined` if no `/C` entry exists\n *\n * @private\n */\n private readAnnotationColor(\n annotationPtr: number,\n colorType: PdfAnnotationColorType = PdfAnnotationColorType.Color,\n ): PdfColor | undefined {\n const rPtr = this.memoryManager.malloc(4);\n const gPtr = this.memoryManager.malloc(4);\n const bPtr = this.memoryManager.malloc(4);\n\n // colourType 0 = \"colour\" (stroke/fill); other types are interior/border\n const ok = this.pdfiumModule.EPDFAnnot_GetColor(annotationPtr, colorType, rPtr, gPtr, bPtr);\n\n let colour: PdfColor | undefined;\n\n if (ok) {\n colour = {\n red: this.pdfiumModule.pdfium.getValue(rPtr, 'i32') & 0xff,\n green: this.pdfiumModule.pdfium.getValue(gPtr, 'i32') & 0xff,\n blue: this.pdfiumModule.pdfium.getValue(bPtr, 'i32') & 0xff,\n };\n }\n\n this.memoryManager.free(rPtr);\n this.memoryManager.free(gPtr);\n this.memoryManager.free(bPtr);\n\n return colour;\n }\n\n /**\n * Get the fill/stroke colour annotation.\n *\n * @param annotationPtr - pointer to the annotation whose colour is being set\n * @param colorType - which colour to get (0 = fill, 1 = stroke)\n * @returns WebColor with hex color\n *\n * @private\n */\n private getAnnotationColor(\n annotationPtr: number,\n colorType: PdfAnnotationColorType = PdfAnnotationColorType.Color,\n ): WebColor | undefined {\n const annotationColor = this.readAnnotationColor(annotationPtr, colorType);\n\n return annotationColor ? pdfColorToWebColor(annotationColor) : undefined;\n }\n\n /**\n * Set the fill/stroke colour for a **Highlight / Underline / StrikeOut / Squiggly** markup annotation.\n *\n * @param annotationPtr - pointer to the annotation whose colour is being set\n * @param webAlphaColor - WebAlphaColor with hex color and opacity (0-1)\n * @param shouldClearAP - whether to clear the /AP entry\n * @param which - which colour to set (0 = fill, 1 = stroke)\n * @returns `true` if the operation was successful\n *\n * @private\n */\n private setAnnotationColor(\n annotationPtr: number,\n webColor: WebColor,\n colorType: PdfAnnotationColorType = PdfAnnotationColorType.Color,\n ): boolean {\n const pdfColor = webColorToPdfColor(webColor);\n\n return this.pdfiumModule.EPDFAnnot_SetColor(\n annotationPtr,\n colorType,\n pdfColor.red & 0xff,\n pdfColor.green & 0xff,\n pdfColor.blue & 0xff,\n );\n }\n\n /**\n * Get the opacity of the annotation.\n *\n * @param annotationPtr - pointer to the annotation whose opacity is being set\n * @returns opacity (0-1)\n *\n * @private\n */\n private getAnnotationOpacity(annotationPtr: number): number {\n const opacityPtr = this.memoryManager.malloc(4);\n const ok = this.pdfiumModule.EPDFAnnot_GetOpacity(annotationPtr, opacityPtr);\n const opacity = ok ? this.pdfiumModule.pdfium.getValue(opacityPtr, 'i32') : 255;\n this.memoryManager.free(opacityPtr);\n return pdfAlphaToWebOpacity(opacity);\n }\n\n /**\n * Set the opacity of the annotation.\n *\n * @param annotationPtr - pointer to the annotation whose opacity is being set\n * @param opacity - opacity (0-1)\n * @returns true on success\n *\n * @private\n */\n private setAnnotationOpacity(annotationPtr: number, opacity: number): boolean {\n const pdfOpacity = webOpacityToPdfAlpha(opacity);\n return this.pdfiumModule.EPDFAnnot_SetOpacity(annotationPtr, pdfOpacity & 0xff);\n }\n\n /**\n * Fetch the `/Q` text-alignment value from a **FreeText** annotation.\n *\n * @param annotationPtr pointer returned by `FPDFPage_GetAnnot`\n * @returns `PdfTextAlignment`\n */\n private getAnnotationTextAlignment(annotationPtr: number): PdfTextAlignment {\n return this.pdfiumModule.EPDFAnnot_GetTextAlignment(annotationPtr);\n }\n\n /**\n * Write the `/Q` text-alignment value into a **FreeText** annotation\n * and clear the existing appearance stream so it can be regenerated.\n *\n * @param annotationPtr pointer returned by `FPDFPage_GetAnnot`\n * @param alignment `PdfTextAlignment`\n * @returns `true` on success\n */\n private setAnnotationTextAlignment(annotationPtr: number, alignment: PdfTextAlignment): boolean {\n return !!this.pdfiumModule.EPDFAnnot_SetTextAlignment(annotationPtr, alignment);\n }\n\n /**\n * Fetch the `/EPDF:VerticalAlignment` vertical-alignment value from a **FreeText** annotation.\n *\n * @param annotationPtr pointer returned by `FPDFPage_GetAnnot`\n * @returns `PdfVerticalAlignment`\n */\n private getAnnotationVerticalAlignment(annotationPtr: number): PdfVerticalAlignment {\n return this.pdfiumModule.EPDFAnnot_GetVerticalAlignment(annotationPtr);\n }\n\n /**\n * Write the `/EPDF:VerticalAlignment` vertical-alignment value into a **FreeText** annotation\n * and clear the existing appearance stream so it can be regenerated.\n *\n * @param annotationPtr pointer returned by `FPDFPage_GetAnnot`\n * @param alignment `PdfVerticalAlignment`\n * @returns `true` on success\n */\n private setAnnotationVerticalAlignment(\n annotationPtr: number,\n alignment: PdfVerticalAlignment,\n ): boolean {\n return !!this.pdfiumModule.EPDFAnnot_SetVerticalAlignment(annotationPtr, alignment);\n }\n\n /**\n * Return the **default appearance** (font, size, colour) declared in the\n * `/DA` string of a **FreeText** annotation.\n *\n * @param annotationPtr pointer to `FPDF_ANNOTATION`\n * @returns `{ font, fontSize, color }` or `undefined` when PDFium returns false\n *\n * NOTE – `font` is the raw `FPDF_STANDARD_FONT` enum value that PDFium uses\n * (same range as the C API: 0 = Courier, 12 = ZapfDingbats, …).\n */\n private getAnnotationDefaultAppearance(\n annotationPtr: number,\n ): { fontFamily: PdfStandardFont; fontSize: number; fontColor: WebColor } | undefined {\n const fontPtr = this.memoryManager.malloc(4);\n const sizePtr = this.memoryManager.malloc(4);\n const rPtr = this.memoryManager.malloc(4);\n const gPtr = this.memoryManager.malloc(4);\n const bPtr = this.memoryManager.malloc(4);\n\n const ok = !!this.pdfiumModule.EPDFAnnot_GetDefaultAppearance(\n annotationPtr,\n fontPtr,\n sizePtr,\n rPtr,\n gPtr,\n bPtr,\n );\n\n if (!ok) {\n [fontPtr, sizePtr, rPtr, gPtr, bPtr].forEach((p) => this.memoryManager.free(p));\n return; // undefined – caller decides what to do\n }\n\n const pdf = this.pdfiumModule.pdfium;\n const font = pdf.getValue(fontPtr, 'i32');\n const fontSize = pdf.getValue(sizePtr, 'float');\n const red = pdf.getValue(rPtr, 'i32') & 0xff;\n const green = pdf.getValue(gPtr, 'i32') & 0xff;\n const blue = pdf.getValue(bPtr, 'i32') & 0xff;\n\n [fontPtr, sizePtr, rPtr, gPtr, bPtr].forEach((p) => this.memoryManager.free(p));\n\n return {\n fontFamily: font,\n fontSize,\n fontColor: pdfColorToWebColor({ red, green, blue }),\n };\n }\n\n /**\n * Write a **default appearance** (`/DA`) into a FreeText annotation.\n *\n * @param annotationPtr pointer to `FPDF_ANNOTATION`\n * @param font `FPDF_STANDARD_FONT` enum value\n * @param fontSize size in points (≥ 0)\n * @param color CSS-style `#rrggbb` string (alpha ignored)\n * @returns `true` on success\n */\n private setAnnotationDefaultAppearance(\n annotationPtr: number,\n font: PdfStandardFont,\n fontSize: number,\n color: WebColor,\n ): boolean {\n const { red, green, blue } = webColorToPdfColor(color); // 0-255 ints\n\n return !!this.pdfiumModule.EPDFAnnot_SetDefaultAppearance(\n annotationPtr,\n font,\n fontSize,\n red & 0xff,\n green & 0xff,\n blue & 0xff,\n );\n }\n\n /**\n * Border‐style + width helper\n *\n * Tries the new PDFium helper `EPDFAnnot_GetBorderStyle()` (patch series\n * 9 July 2025).\n *\n * @param annotationPtr pointer to an `FPDF_ANNOTATION`\n * @returns `{ ok, style, width }`\n * • `ok` – `true` when the call succeeded\n * • `style` – `PdfAnnotationBorderStyle` enum\n * • `width` – stroke-width in points (defaults to 0 pt)\n */\n private getBorderStyle(annotationPtr: number): {\n ok: boolean;\n style: PdfAnnotationBorderStyle;\n width: number;\n } {\n /* 1 ── allocate tmp storage for the returned width ─────────────── */\n const widthPtr = this.memoryManager.malloc(4);\n let width = 0;\n let style: PdfAnnotationBorderStyle = PdfAnnotationBorderStyle.UNKNOWN;\n let ok = false;\n\n style = this.pdfiumModule.EPDFAnnot_GetBorderStyle(annotationPtr, widthPtr);\n width = this.pdfiumModule.pdfium.getValue(widthPtr, 'float');\n ok = style !== PdfAnnotationBorderStyle.UNKNOWN;\n this.memoryManager.free(widthPtr);\n return { ok, style, width };\n }\n\n private setBorderStyle(\n annotationPtr: number,\n style: PdfAnnotationBorderStyle,\n width: number,\n ): boolean {\n return this.pdfiumModule.EPDFAnnot_SetBorderStyle(annotationPtr, style, width);\n }\n\n /**\n * Get the icon of the annotation\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @returns `PdfAnnotationIcon`\n */\n private getAnnotationIcon(annotationPtr: number): PdfAnnotationIcon {\n return this.pdfiumModule.EPDFAnnot_GetIcon(annotationPtr);\n }\n\n /**\n * Set the icon of the annotation\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param icon - `PdfAnnotationIcon`\n * @returns `true` on success\n */\n private setAnnotationIcon(annotationPtr: number, icon: PdfAnnotationIcon): boolean {\n return this.pdfiumModule.EPDFAnnot_SetIcon(annotationPtr, icon);\n }\n\n /**\n * Border-effect (“cloudy”) helper\n *\n * Calls the new PDFium function `EPDFAnnot_GetBorderEffect()` (July 2025).\n *\n * @param annotationPtr pointer to an `FPDF_ANNOTATION`\n * @returns `{ ok, intensity }`\n * • `ok` – `true` when the annotation *does* have a\n * valid cloudy-border effect\n * • `intensity` – radius/intensity value (0 when `ok` is false)\n */\n private getBorderEffect(annotationPtr: number): { ok: boolean; intensity: number } {\n const intensityPtr = this.memoryManager.malloc(4);\n\n const ok = !!this.pdfiumModule.EPDFAnnot_GetBorderEffect(annotationPtr, intensityPtr);\n\n const intensity = ok ? this.pdfiumModule.pdfium.getValue(intensityPtr, 'float') : 0;\n\n this.memoryManager.free(intensityPtr);\n return { ok, intensity };\n }\n\n /**\n * Rectangle-differences helper ( /RD array on Square / Circle annots )\n *\n * Calls `EPDFAnnot_GetRectangleDifferences()` introduced in July 2025.\n *\n * @param annotationPtr pointer to an `FPDF_ANNOTATION`\n * @returns `{ ok, left, top, right, bottom }`\n * • `ok` – `true` when the annotation *has* an /RD entry\n * • the four floats are 0 when `ok` is false\n */\n private getRectangleDifferences(annotationPtr: number): {\n ok: boolean;\n left: number;\n top: number;\n right: number;\n bottom: number;\n } {\n /* tmp storage ─────────────────────────────────────────── */\n const lPtr = this.memoryManager.malloc(4);\n const tPtr = this.memoryManager.malloc(4);\n const rPtr = this.memoryManager.malloc(4);\n const bPtr = this.memoryManager.malloc(4);\n\n const ok = !!this.pdfiumModule.EPDFAnnot_GetRectangleDifferences(\n annotationPtr,\n lPtr,\n tPtr,\n rPtr,\n bPtr,\n );\n\n const pdf = this.pdfiumModule.pdfium;\n const left = pdf.getValue(lPtr, 'float');\n const top = pdf.getValue(tPtr, 'float');\n const right = pdf.getValue(rPtr, 'float');\n const bottom = pdf.getValue(bPtr, 'float');\n\n /* cleanup ─────────────────────────────────────────────── */\n this.memoryManager.free(lPtr);\n this.memoryManager.free(tPtr);\n this.memoryManager.free(rPtr);\n this.memoryManager.free(bPtr);\n\n return { ok, left, top, right, bottom };\n }\n\n /**\n * Get the date of the annotation\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param key - 'M' for modified date, 'CreationDate' for creation date\n * @returns `Date` or `undefined` when PDFium can't read the date\n */\n private getAnnotationDate(annotationPtr: number, key: 'M' | 'CreationDate'): Date | undefined {\n const raw = this.getAnnotString(annotationPtr, key);\n return raw ? pdfDateToDate(raw) : undefined;\n }\n\n /**\n * Set the date of the annotation\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param key - 'M' for modified date, 'CreationDate' for creation date\n * @param date - `Date` to set\n * @returns `true` on success\n */\n private setAnnotationDate(annotationPtr: number, key: 'M' | 'CreationDate', date: Date): boolean {\n const raw = dateToPdfDate(date);\n return this.setAnnotString(annotationPtr, key, raw);\n }\n\n /**\n * Get the date of the attachment\n *\n * @param attachmentPtr - pointer to an `FPDF_ATTACHMENT`\n * @param key - 'ModDate' for modified date, 'CreationDate' for creation date\n * @returns `Date` or `undefined` when PDFium can't read the date\n */\n private getAttachmentDate(\n attachmentPtr: number,\n key: 'ModDate' | 'CreationDate',\n ): Date | undefined {\n const raw = this.getAttachmentString(attachmentPtr, key);\n return raw ? pdfDateToDate(raw) : undefined;\n }\n\n /**\n * Set the date of the attachment\n *\n * @param attachmentPtr - pointer to an `FPDF_ATTACHMENT`\n * @param key - 'ModDate' for modified date, 'CreationDate' for creation date\n * @param date - `Date` to set\n * @returns `true` on success\n */\n private setAttachmentDate(\n attachmentPtr: number,\n key: 'ModDate' | 'CreationDate',\n date: Date,\n ): boolean {\n const raw = dateToPdfDate(date);\n return this.setAttachmentString(attachmentPtr, key, raw);\n }\n\n /**\n * Dash-pattern helper ( /BS → /D array, dashed borders only )\n *\n * Uses the two new PDFium helpers:\n * • `EPDFAnnot_GetBorderDashPatternCount`\n * • `EPDFAnnot_GetBorderDashPattern`\n *\n * @param annotationPtr pointer to an `FPDF_ANNOTATION`\n * @returns `{ ok, pattern }`\n * • `ok` – `true` when the annot is dashed *and* the array\n * was retrieved successfully\n * • `pattern` – numeric array of dash/space lengths (empty when `ok` is false)\n */\n private getBorderDashPattern(annotationPtr: number): { ok: boolean; pattern: number[] } {\n const count = this.pdfiumModule.EPDFAnnot_GetBorderDashPatternCount(annotationPtr);\n if (count === 0) {\n return { ok: false, pattern: [] };\n }\n\n /* allocate `count` floats on the WASM heap */\n const arrPtr = this.memoryManager.malloc(4 * count);\n const okNative = !!this.pdfiumModule.EPDFAnnot_GetBorderDashPattern(\n annotationPtr,\n arrPtr,\n count,\n );\n\n /* copy out */\n const pattern: number[] = [];\n if (okNative) {\n const pdf = this.pdfiumModule.pdfium;\n for (let i = 0; i < count; i++) {\n pattern.push(pdf.getValue(arrPtr + 4 * i, 'float'));\n }\n }\n\n this.memoryManager.free(arrPtr);\n return { ok: okNative, pattern };\n }\n\n /**\n * Write the /BS /D dash pattern array for an annotation border.\n *\n * @param annotationPtr Pointer to FPDF_ANNOTATION\n * @param pattern Array of dash/space lengths in *points* (e.g. [3, 2])\n * Empty array clears the pattern (solid line).\n * @returns true on success\n *\n * @private\n */\n private setBorderDashPattern(annotationPtr: number, pattern: number[]): boolean {\n // Empty → clear the pattern (PDF spec: no /D = solid)\n if (!pattern || pattern.length === 0) {\n return this.pdfiumModule.EPDFAnnot_SetBorderDashPattern(annotationPtr, 0, 0);\n }\n\n // Validate and sanitize numbers (must be positive floats, spec allows 1–8 numbers typically)\n const clean = pattern.map((n) => (Number.isFinite(n) && n > 0 ? n : 0)).filter((n) => n > 0);\n if (clean.length === 0) {\n // nothing valid → treat as clear\n return this.pdfiumModule.EPDFAnnot_SetBorderDashPattern(annotationPtr, 0, 0);\n }\n\n const bytes = 4 * clean.length;\n const bufPtr = this.memoryManager.malloc(bytes);\n for (let i = 0; i < clean.length; i++) {\n this.pdfiumModule.pdfium.setValue(bufPtr + 4 * i, clean[i], 'float');\n }\n\n const ok = !!this.pdfiumModule.EPDFAnnot_SetBorderDashPattern(\n annotationPtr,\n bufPtr,\n clean.length,\n );\n\n this.memoryManager.free(bufPtr);\n return ok;\n }\n\n /**\n * Return the `/LE` array (start/end line-ending styles) for a LINE / POLYLINE annot.\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @returns `{ start, end }` or `undefined` when PDFium can't read them\n *\n * @private\n */\n private getLineEndings(annotationPtr: number): LineEndings | undefined {\n const startPtr = this.memoryManager.malloc(4);\n const endPtr = this.memoryManager.malloc(4);\n\n const ok = !!this.pdfiumModule.EPDFAnnot_GetLineEndings(annotationPtr, startPtr, endPtr);\n if (!ok) {\n this.memoryManager.free(startPtr);\n this.memoryManager.free(endPtr);\n return undefined;\n }\n\n const start = this.pdfiumModule.pdfium.getValue(startPtr, 'i32');\n const end = this.pdfiumModule.pdfium.getValue(endPtr, 'i32');\n\n this.memoryManager.free(startPtr);\n this.memoryManager.free(endPtr);\n\n return { start, end };\n }\n\n /**\n * Write the `/LE` array (start/end line-ending styles) for a LINE / POLYLINE annot.\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param start - start line ending style\n * @param end - end line ending style\n * @returns `true` on success\n */\n private setLineEndings(\n annotationPtr: number,\n start: PdfAnnotationLineEnding,\n end: PdfAnnotationLineEnding,\n ): boolean {\n return !!this.pdfiumModule.EPDFAnnot_SetLineEndings(annotationPtr, start, end);\n }\n\n /**\n * Get the start and end points of a LINE / POLYLINE annot.\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param page - logical page info object (`PdfPageObject`)\n * @returns `{ start, end }` or `undefined` when PDFium can't read them\n */\n private getLinePoints(page: PdfPageObject, annotationPtr: number): LinePoints | undefined {\n const startPtr = this.memoryManager.malloc(8); // FS_POINTF (x,y floats)\n const endPtr = this.memoryManager.malloc(8);\n\n const ok = this.pdfiumModule.FPDFAnnot_GetLine(annotationPtr, startPtr, endPtr);\n if (!ok) {\n this.memoryManager.free(startPtr);\n this.memoryManager.free(endPtr);\n return undefined;\n }\n\n const pdf = this.pdfiumModule.pdfium;\n\n const sx = pdf.getValue(startPtr + 0, 'float');\n const sy = pdf.getValue(startPtr + 4, 'float');\n const ex = pdf.getValue(endPtr + 0, 'float');\n const ey = pdf.getValue(endPtr + 4, 'float');\n\n this.memoryManager.free(startPtr);\n this.memoryManager.free(endPtr);\n\n // page -> device using the new helper (handles rotation/scale consistently)\n const start = this.convertPagePointToDevicePoint(page, { x: sx, y: sy });\n const end = this.convertPagePointToDevicePoint(page, { x: ex, y: ey });\n\n return { start, end };\n }\n\n /**\n * Set the two end‑points of a **Line** annotation\n * by writing a new /L array `[ x1 y1 x2 y2 ]`.\n * @param page - logical page info object (`PdfPageObject`)\n * @param annotPtr - pointer to the annotation whose line points are needed\n * @param start - start point\n * @param end - end point\n * @returns true on success\n */\n private setLinePoints(\n page: PdfPageObject,\n annotPtr: number,\n start: Position,\n end: Position,\n ): boolean {\n const p1 = this.convertDevicePointToPagePoint(page, start);\n const p2 = this.convertDevicePointToPagePoint(page, end);\n\n if (!p1 || !p2) return false;\n\n // pack as two FS_POINTF (x,y floats)\n const buf = this.memoryManager.malloc(16);\n const pdf = this.pdfiumModule.pdfium;\n pdf.setValue(buf + 0, p1.x, 'float');\n pdf.setValue(buf + 4, p1.y, 'float');\n pdf.setValue(buf + 8, p2.x, 'float');\n pdf.setValue(buf + 12, p2.y, 'float');\n\n const ok = this.pdfiumModule.EPDFAnnot_SetLine(annotPtr, buf, buf + 8);\n this.memoryManager.free(buf);\n return !!ok;\n }\n\n /**\n * Read `/QuadPoints` from any annotation and convert each quadrilateral to\n * device-space coordinates.\n *\n * The four points are returned in natural reading order:\n * `p1 → p2` (top edge) and `p4 → p3` (bottom edge).\n * This preserves the true shape for rotated / skewed text, whereas callers\n * that only need axis-aligned boxes can collapse each quad themselves.\n *\n * @param page - logical page info object (`PdfPageObject`)\n * @param annotationPtr - pointer to the annotation whose quads are needed\n * @returns Array of `Rect` objects (`[]` if the annotation has no quads)\n *\n * @private\n */\n private getQuadPointsAnno(page: PdfPageObject, annotationPtr: number): Rect[] {\n const quadCount = this.pdfiumModule.FPDFAnnot_CountAttachmentPoints(annotationPtr);\n if (quadCount === 0) return [];\n\n const FS_QUADPOINTSF_SIZE = 8 * 4; // eight floats, 32 bytes\n const quads: Quad[] = [];\n\n for (let qi = 0; qi < quadCount; qi++) {\n const quadPtr = this.memoryManager.malloc(FS_QUADPOINTSF_SIZE);\n\n const ok = this.pdfiumModule.FPDFAnnot_GetAttachmentPoints(annotationPtr, qi, quadPtr);\n\n if (ok) {\n // read the eight floats\n const xs: number[] = [];\n const ys: number[] = [];\n for (let i = 0; i < 4; i++) {\n const base = quadPtr + i * 8; // 8 bytes per point (x+y)\n xs.push(this.pdfiumModule.pdfium.getValue(base, 'float'));\n ys.push(this.pdfiumModule.pdfium.getValue(base + 4, 'float'));\n }\n\n // convert to device-space\n const p1 = this.convertPagePointToDevicePoint(page, { x: xs[0], y: ys[0] });\n const p2 = this.convertPagePointToDevicePoint(page, { x: xs[1], y: ys[1] });\n const p3 = this.convertPagePointToDevicePoint(page, { x: xs[2], y: ys[2] });\n const p4 = this.convertPagePointToDevicePoint(page, { x: xs[3], y: ys[3] });\n\n quads.push({ p1, p2, p3, p4 });\n }\n\n this.memoryManager.free(quadPtr);\n }\n\n return quads.map(quadToRect);\n }\n\n /**\n * Set the quadrilaterals for a **Highlight / Underline / StrikeOut / Squiggly** markup annotation.\n *\n * @param page - logical page info object (`PdfPageObject`)\n * @param annotationPtr - pointer to the annotation whose quads are needed\n * @param rects - array of `Rect` objects (`[]` if the annotation has no quads)\n * @returns `true` if the operation was successful\n *\n * @private\n */\n private syncQuadPointsAnno(page: PdfPageObject, annotPtr: number, rects: Rect[]): boolean {\n const FS_QUADPOINTSF_SIZE = 8 * 4; // eight floats, 32 bytes\n const pdf = this.pdfiumModule.pdfium;\n const count = this.pdfiumModule.FPDFAnnot_CountAttachmentPoints(annotPtr);\n const buf = this.memoryManager.malloc(FS_QUADPOINTSF_SIZE);\n\n /** write one quad into `buf` in annotation space */\n const writeQuad = (r: Rect) => {\n const q = rectToQuad(r); // TL, TR, BR, BL\n const p1 = this.convertDevicePointToPagePoint(page, q.p1);\n const p2 = this.convertDevicePointToPagePoint(page, q.p2);\n const p3 = this.convertDevicePointToPagePoint(page, q.p3); // BR\n const p4 = this.convertDevicePointToPagePoint(page, q.p4); // BL\n\n // PDF QuadPoints order: BL, BR, TL, TR (bottom-left, bottom-right, top-left, top-right)\n pdf.setValue(buf + 0, p1.x, 'float'); // BL (bottom-left)\n pdf.setValue(buf + 4, p1.y, 'float');\n\n pdf.setValue(buf + 8, p2.x, 'float'); // BR (bottom-right)\n pdf.setValue(buf + 12, p2.y, 'float');\n\n pdf.setValue(buf + 16, p4.x, 'float'); // TL (top-left)\n pdf.setValue(buf + 20, p4.y, 'float');\n\n pdf.setValue(buf + 24, p3.x, 'float'); // TR (top-right)\n pdf.setValue(buf + 28, p3.y, 'float');\n };\n\n /* ----------------------------------------------------------------------- */\n /* 1. overwrite the quads that already exist */\n const min = Math.min(count, rects.length);\n for (let i = 0; i < min; i++) {\n writeQuad(rects[i]);\n if (!this.pdfiumModule.FPDFAnnot_SetAttachmentPoints(annotPtr, i, buf)) {\n this.memoryManager.free(buf);\n return false;\n }\n }\n\n /* 2. append new quads if rects.length > count */\n for (let i = count; i < rects.length; i++) {\n writeQuad(rects[i]);\n if (!this.pdfiumModule.FPDFAnnot_AppendAttachmentPoints(annotPtr, buf)) {\n this.memoryManager.free(buf);\n return false;\n }\n }\n\n this.memoryManager.free(buf);\n return true;\n }\n\n /**\n * Redact text that intersects ANY of the provided **quads** (device-space).\n * Returns `true` if the page changed. Always regenerates the page stream.\n */\n public redactTextInRects(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ): Task<boolean, PdfErrorReason> {\n const { recurseForms = true, drawBlackBoxes = false } = options ?? {};\n\n this.logger.debug(\n 'PDFiumEngine',\n 'Engine',\n 'redactTextInQuads',\n doc.id,\n page.index,\n rects.length,\n );\n const label = 'RedactTextInQuads';\n this.logger.perf('PDFiumEngine', 'Engine', label, 'Begin', `${doc.id}-${page.index}`);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf('PDFiumEngine', 'Engine', label, 'End', `${doc.id}-${page.index}`);\n return PdfTaskHelper.reject<boolean>({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // sanitize inputs\n const clean = (rects ?? []).filter(\n (r) =>\n r &&\n Number.isFinite(r.origin?.x) &&\n Number.isFinite(r.origin?.y) &&\n Number.isFinite(r.size?.width) &&\n Number.isFinite(r.size?.height) &&\n r.size.width > 0 &&\n r.size.height > 0,\n );\n\n if (clean.length === 0) {\n this.logger.perf('PDFiumEngine', 'Engine', label, 'End', `${doc.id}-${page.index}`);\n return PdfTaskHelper.resolve<boolean>(false);\n }\n\n const pageCtx = ctx.acquirePage(page.index);\n\n // pack buffer → native call\n const { ptr, count } = this.allocFSQuadsBufferFromRects(page, clean);\n let ok = false;\n try {\n // If your wrapper exposes FPDFText_RedactInQuads, call that instead.\n ok = !!this.pdfiumModule.EPDFText_RedactInQuads(\n pageCtx.pagePtr,\n ptr,\n count,\n recurseForms ? true : false,\n drawBlackBoxes ? true : false,\n );\n } finally {\n this.memoryManager.free(ptr);\n }\n\n if (ok) {\n ok = !!this.pdfiumModule.FPDFPage_GenerateContent(pageCtx.pagePtr);\n }\n\n pageCtx.disposeImmediate();\n this.logger.perf('PDFiumEngine', 'Engine', label, 'End', `${doc.id}-${page.index}`);\n\n return PdfTaskHelper.resolve<boolean>(!!ok);\n }\n\n /** Pack device-space Rects into an FS_QUADPOINTSF[] buffer (page space). */\n private allocFSQuadsBufferFromRects(page: PdfPageObject, rects: Rect[]) {\n const STRIDE = 32; // 8 floats × 4 bytes\n const count = rects.length;\n const ptr = this.memoryManager.malloc(STRIDE * count);\n const pdf = this.pdfiumModule.pdfium;\n\n for (let i = 0; i < count; i++) {\n const r = rects[i];\n const q = rectToQuad(r); // TL, TR, BR, BL (device-space)\n\n // Convert into PAGE USER SPACE (native expects page coords)\n const p1 = this.convertDevicePointToPagePoint(page, q.p1); // TL\n const p2 = this.convertDevicePointToPagePoint(page, q.p2); // TR\n const p3 = this.convertDevicePointToPagePoint(page, q.p3); // BR\n const p4 = this.convertDevicePointToPagePoint(page, q.p4); // BL\n\n const base = ptr + i * STRIDE;\n\n // Keep the exact mapping you used in syncQuadPointsAnno:\n // PDF QuadPoints order comment says BL,BR,TL,TR – and you wrote:\n pdf.setValue(base + 0, p1.x, 'float');\n pdf.setValue(base + 4, p1.y, 'float');\n pdf.setValue(base + 8, p2.x, 'float');\n pdf.setValue(base + 12, p2.y, 'float');\n pdf.setValue(base + 16, p4.x, 'float');\n pdf.setValue(base + 20, p4.y, 'float');\n pdf.setValue(base + 24, p3.x, 'float');\n pdf.setValue(base + 28, p3.y, 'float');\n }\n\n return { ptr, count };\n }\n\n /**\n * Read ink list from annotation\n * @param page - logical page info object (`PdfPageObject`)\n * @param pagePtr - pointer to the page\n * @param annotationPtr - pointer to the annotation whose ink list is needed\n * @returns ink list\n */\n private getInkList(page: PdfPageObject, annotationPtr: number): PdfInkListObject[] {\n const inkList: PdfInkListObject[] = [];\n const pathCount = this.pdfiumModule.FPDFAnnot_GetInkListCount(annotationPtr);\n if (pathCount <= 0) return inkList;\n\n const pdf = this.pdfiumModule.pdfium;\n const POINT_STRIDE = 8; // FS_POINTF: 2 floats (x,y) => 8 bytes\n\n for (let i = 0; i < pathCount; i++) {\n const points: Position[] = [];\n\n const n = this.pdfiumModule.FPDFAnnot_GetInkListPath(annotationPtr, i, 0, 0);\n if (n > 0) {\n const buf = this.memoryManager.malloc(n * POINT_STRIDE);\n\n // load FS_POINTF array (page-space)\n this.pdfiumModule.FPDFAnnot_GetInkListPath(annotationPtr, i, buf, n);\n\n // convert each point to device-space using your helper\n for (let j = 0; j < n; j++) {\n const base = buf + j * POINT_STRIDE;\n const px = pdf.getValue(base + 0, 'float');\n const py = pdf.getValue(base + 4, 'float');\n const d = this.convertPagePointToDevicePoint(page, { x: px, y: py });\n points.push({ x: d.x, y: d.y });\n }\n\n this.memoryManager.free(buf);\n }\n\n inkList.push({ points });\n }\n\n return inkList;\n }\n\n /**\n * Add ink list to annotation\n * @param page - logical page info object (`PdfPageObject`)\n * @param pagePtr - pointer to the page\n * @param annotationPtr - pointer to the annotation whose ink list is needed\n * @param inkList - ink list array of `PdfInkListObject`\n * @returns `true` if the operation was successful\n */\n private setInkList(\n page: PdfPageObject,\n annotationPtr: number,\n inkList: PdfInkListObject[],\n ): boolean {\n const pdf = this.pdfiumModule.pdfium;\n const POINT_STRIDE = 8; // FS_POINTF: float x, float y\n\n for (const stroke of inkList) {\n const n = stroke.points.length;\n if (n === 0) continue;\n\n const buf = this.memoryManager.malloc(n * POINT_STRIDE);\n\n // device -> page for each vertex\n for (let i = 0; i < n; i++) {\n const pDev = stroke.points[i];\n const pPage = this.convertDevicePointToPagePoint(page, pDev);\n\n pdf.setValue(buf + i * POINT_STRIDE + 0, pPage.x, 'float');\n pdf.setValue(buf + i * POINT_STRIDE + 4, pPage.y, 'float');\n }\n\n const idx = this.pdfiumModule.FPDFAnnot_AddInkStroke(annotationPtr, buf, n);\n this.memoryManager.free(buf);\n\n if (idx === -1) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Read pdf text annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf text annotation\n *\n * @private\n */\n private readPdfTextAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfTextAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const annoRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, annoRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const state = this.getAnnotString(annotationPtr, 'State') as PdfAnnotationState;\n const stateModel = this.getAnnotString(annotationPtr, 'StateModel') as PdfAnnotationStateModel;\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const inReplyToId = this.getInReplyToId(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const icon = this.getAnnotationIcon(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.TEXT,\n flags,\n contents,\n color: color ?? '#FFFF00',\n opacity,\n rect,\n inReplyToId,\n author,\n modified,\n created,\n state,\n stateModel,\n icon,\n };\n }\n\n /**\n * Read pdf freetext annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf freetext annotation\n *\n * @private\n */\n private readPdfFreeTextAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfFreeTextAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const annoRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, annoRect);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const defaultStyle = this.getAnnotString(annotationPtr, 'DS');\n const da = this.getAnnotationDefaultAppearance(annotationPtr);\n const backgroundColor = this.getAnnotationColor(annotationPtr);\n const textAlign = this.getAnnotationTextAlignment(annotationPtr);\n const verticalAlign = this.getAnnotationVerticalAlignment(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const richContent = this.getAnnotRichContent(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.FREETEXT,\n fontFamily: da?.fontFamily ?? PdfStandardFont.Unknown,\n fontSize: da?.fontSize ?? 12,\n fontColor: da?.fontColor ?? '#000000',\n verticalAlign,\n backgroundColor,\n flags,\n opacity,\n textAlign,\n defaultStyle,\n richContent,\n contents,\n author,\n modified,\n created,\n rect,\n };\n }\n\n /**\n * Read pdf link annotation from pdf document\n * @param page - pdf page infor\n * @param docPtr - pointer to pdf document object\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf link annotation\n *\n * @private\n */\n private readPdfLinkAnno(\n page: PdfPageObject,\n docPtr: number,\n annotationPtr: number,\n index: string,\n ): PdfLinkAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const linkPtr = this.pdfiumModule.FPDFAnnot_GetLink(annotationPtr);\n if (!linkPtr) {\n return;\n }\n\n const annoRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, annoRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n\n const target = this.readPdfLinkAnnoTarget(\n docPtr,\n () => {\n return this.pdfiumModule.FPDFLink_GetAction(linkPtr);\n },\n () => {\n return this.pdfiumModule.FPDFLink_GetDest(docPtr, linkPtr);\n },\n );\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.LINK,\n flags,\n target,\n rect,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf widget annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param formHandle - form handle\n * @param index - index of annotation in the pdf page\n * @returns pdf widget annotation\n *\n * @private\n */\n private readPdfWidgetAnno(\n page: PdfPageObject,\n annotationPtr: number,\n formHandle: number,\n index: string,\n ): PdfWidgetAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n const field = this.readPdfWidgetAnnoField(formHandle, annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.WIDGET,\n flags,\n rect,\n field,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf file attachment annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf file attachment annotation\n *\n * @private\n */\n private readPdfFileAttachmentAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfFileAttachmentAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.FILEATTACHMENT,\n flags,\n rect,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf ink annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf ink annotation\n *\n * @private\n */\n private readPdfInkAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfInkAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const { width: strokeWidth } = this.getBorderStyle(annotationPtr);\n const inkList = this.getInkList(page, annotationPtr);\n const blendMode = this.pdfiumModule.EPDFAnnot_GetBlendMode(annotationPtr);\n const intent = this.getAnnotIntent(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.INK,\n ...(intent && { intent }),\n contents,\n blendMode,\n flags,\n color: color ?? '#FF0000',\n opacity,\n strokeWidth: strokeWidth === 0 ? 1 : strokeWidth,\n rect,\n inkList,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf polygon annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf polygon annotation\n *\n * @private\n */\n private readPdfPolygonAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfPolygonAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const vertices = this.readPdfAnnoVertices(page, annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const flags = this.getAnnotationFlags(annotationPtr);\n const strokeColor = this.getAnnotationColor(annotationPtr);\n const interiorColor = this.getAnnotationColor(\n annotationPtr,\n PdfAnnotationColorType.InteriorColor,\n );\n const opacity = this.getAnnotationOpacity(annotationPtr);\n let { style: strokeStyle, width: strokeWidth } = this.getBorderStyle(annotationPtr);\n\n let strokeDashArray: number[] | undefined;\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n const { ok, pattern } = this.getBorderDashPattern(annotationPtr);\n if (ok) {\n strokeDashArray = pattern;\n }\n }\n\n // ▼––– Remove redundant closing vertex for polygons ––––––––––––––––––––––\n if (vertices.length > 1) {\n const first = vertices[0];\n const last = vertices[vertices.length - 1];\n if (first.x === last.x && first.y === last.y) {\n vertices.pop();\n }\n }\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.POLYGON,\n contents,\n flags,\n strokeColor: strokeColor ?? '#FF0000',\n color: interiorColor ?? 'transparent',\n opacity,\n strokeWidth: strokeWidth === 0 ? 1 : strokeWidth,\n strokeStyle,\n strokeDashArray,\n rect,\n vertices,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf polyline annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf polyline annotation\n *\n * @private\n */\n private readPdfPolylineAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfPolylineAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const vertices = this.readPdfAnnoVertices(page, annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const strokeColor = this.getAnnotationColor(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const interiorColor = this.getAnnotationColor(\n annotationPtr,\n PdfAnnotationColorType.InteriorColor,\n );\n const opacity = this.getAnnotationOpacity(annotationPtr);\n let { style: strokeStyle, width: strokeWidth } = this.getBorderStyle(annotationPtr);\n\n let strokeDashArray: number[] | undefined;\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n const { ok, pattern } = this.getBorderDashPattern(annotationPtr);\n if (ok) {\n strokeDashArray = pattern;\n }\n }\n const lineEndings = this.getLineEndings(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.POLYLINE,\n contents,\n flags,\n strokeColor: strokeColor ?? '#FF0000',\n color: interiorColor ?? 'transparent',\n opacity,\n strokeWidth: strokeWidth === 0 ? 1 : strokeWidth,\n strokeStyle,\n strokeDashArray,\n lineEndings,\n rect,\n vertices,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf line annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf line annotation\n *\n * @private\n */\n private readPdfLineAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfLineAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const linePoints = this.getLinePoints(page, annotationPtr);\n const lineEndings = this.getLineEndings(annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const strokeColor = this.getAnnotationColor(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const interiorColor = this.getAnnotationColor(\n annotationPtr,\n PdfAnnotationColorType.InteriorColor,\n );\n const opacity = this.getAnnotationOpacity(annotationPtr);\n let { style: strokeStyle, width: strokeWidth } = this.getBorderStyle(annotationPtr);\n\n let strokeDashArray: number[] | undefined;\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n const { ok, pattern } = this.getBorderDashPattern(annotationPtr);\n if (ok) {\n strokeDashArray = pattern;\n }\n }\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.LINE,\n flags,\n rect,\n contents,\n strokeWidth: strokeWidth === 0 ? 1 : strokeWidth,\n strokeStyle,\n strokeDashArray,\n strokeColor: strokeColor ?? '#FF0000',\n color: interiorColor ?? 'transparent',\n opacity,\n linePoints: linePoints || { start: { x: 0, y: 0 }, end: { x: 0, y: 0 } },\n lineEndings: lineEndings || {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.None,\n },\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf highlight annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf highlight annotation\n *\n * @private\n */\n private readPdfHighlightAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfHighlightAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const segmentRects = this.getQuadPointsAnno(page, annotationPtr);\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const blendMode = this.pdfiumModule.EPDFAnnot_GetBlendMode(annotationPtr);\n\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n blendMode,\n type: PdfAnnotationSubtype.HIGHLIGHT,\n rect,\n flags,\n contents,\n segmentRects,\n color: color ?? '#FFFF00',\n opacity,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf underline annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf underline annotation\n *\n * @private\n */\n private readPdfUnderlineAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfUnderlineAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const segmentRects = this.getQuadPointsAnno(page, annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const blendMode = this.pdfiumModule.EPDFAnnot_GetBlendMode(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n blendMode,\n type: PdfAnnotationSubtype.UNDERLINE,\n rect,\n flags,\n contents,\n segmentRects,\n color: color ?? '#FF0000',\n opacity,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read strikeout annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf strikeout annotation\n *\n * @private\n */\n private readPdfStrikeOutAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfStrikeOutAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const segmentRects = this.getQuadPointsAnno(page, annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const blendMode = this.pdfiumModule.EPDFAnnot_GetBlendMode(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n blendMode,\n type: PdfAnnotationSubtype.STRIKEOUT,\n flags,\n rect,\n contents,\n segmentRects,\n color: color ?? '#FF0000',\n opacity,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf squiggly annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf squiggly annotation\n *\n * @private\n */\n private readPdfSquigglyAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfSquigglyAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const segmentRects = this.getQuadPointsAnno(page, annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const color = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n const blendMode = this.pdfiumModule.EPDFAnnot_GetBlendMode(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n blendMode,\n type: PdfAnnotationSubtype.SQUIGGLY,\n rect,\n flags,\n contents,\n segmentRects,\n color: color ?? '#FF0000',\n opacity,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf caret annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf caret annotation\n *\n * @private\n */\n private readPdfCaretAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfCaretAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.CARET,\n rect,\n flags,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Read pdf stamp annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf stamp annotation\n *\n * @private\n */\n private readPdfStampAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfStampAnnoObject | undefined {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.STAMP,\n contents,\n rect,\n author,\n modified,\n created,\n flags,\n };\n }\n\n /**\n * Read pdf object in pdf page\n * @param pageObjectPtr - pointer to pdf object in page\n * @returns pdf object in page\n *\n * @private\n */\n private readPdfPageObject(pageObjectPtr: number) {\n const type = this.pdfiumModule.FPDFPageObj_GetType(pageObjectPtr) as PdfPageObjectType;\n switch (type) {\n case PdfPageObjectType.PATH:\n return this.readPathObject(pageObjectPtr);\n case PdfPageObjectType.IMAGE:\n return this.readImageObject(pageObjectPtr);\n case PdfPageObjectType.FORM:\n return this.readFormObject(pageObjectPtr);\n }\n }\n\n /**\n * Read pdf path object\n * @param pathObjectPtr - pointer to pdf path object in page\n * @returns pdf path object\n *\n * @private\n */\n private readPathObject(pathObjectPtr: number): PdfPathObject {\n const segmentCount = this.pdfiumModule.FPDFPath_CountSegments(pathObjectPtr);\n\n const leftPtr = this.memoryManager.malloc(4);\n const bottomPtr = this.memoryManager.malloc(4);\n const rightPtr = this.memoryManager.malloc(4);\n const topPtr = this.memoryManager.malloc(4);\n this.pdfiumModule.FPDFPageObj_GetBounds(pathObjectPtr, leftPtr, bottomPtr, rightPtr, topPtr);\n const left = this.pdfiumModule.pdfium.getValue(leftPtr, 'float');\n const bottom = this.pdfiumModule.pdfium.getValue(bottomPtr, 'float');\n const right = this.pdfiumModule.pdfium.getValue(rightPtr, 'float');\n const top = this.pdfiumModule.pdfium.getValue(topPtr, 'float');\n const bounds = { left, bottom, right, top };\n this.memoryManager.free(leftPtr);\n this.memoryManager.free(bottomPtr);\n this.memoryManager.free(rightPtr);\n this.memoryManager.free(topPtr);\n const segments: PdfSegmentObject[] = [];\n for (let i = 0; i < segmentCount; i++) {\n const segment = this.readPdfSegment(pathObjectPtr, i);\n segments.push(segment);\n }\n\n const matrix = this.readPdfPageObjectTransformMatrix(pathObjectPtr);\n\n return {\n type: PdfPageObjectType.PATH,\n bounds,\n segments,\n matrix,\n };\n }\n\n /**\n * Read segment of pdf path object\n * @param annotationObjectPtr - pointer to pdf path object\n * @param segmentIndex - index of segment\n * @returns pdf segment in pdf path\n *\n * @private\n */\n private readPdfSegment(annotationObjectPtr: number, segmentIndex: number): PdfSegmentObject {\n const segmentPtr = this.pdfiumModule.FPDFPath_GetPathSegment(annotationObjectPtr, segmentIndex);\n const segmentType = this.pdfiumModule.FPDFPathSegment_GetType(segmentPtr);\n const isClosed = this.pdfiumModule.FPDFPathSegment_GetClose(segmentPtr);\n const pointXPtr = this.memoryManager.malloc(4);\n const pointYPtr = this.memoryManager.malloc(4);\n this.pdfiumModule.FPDFPathSegment_GetPoint(segmentPtr, pointXPtr, pointYPtr);\n const pointX = this.pdfiumModule.pdfium.getValue(pointXPtr, 'float');\n const pointY = this.pdfiumModule.pdfium.getValue(pointYPtr, 'float');\n this.memoryManager.free(pointXPtr);\n this.memoryManager.free(pointYPtr);\n\n return {\n type: segmentType,\n point: { x: pointX, y: pointY },\n isClosed,\n };\n }\n\n /**\n * Read pdf image object from pdf document\n * @param pageObjectPtr - pointer to pdf image object in page\n * @returns pdf image object\n *\n * @private\n */\n private readImageObject(imageObjectPtr: number): PdfImageObject {\n const bitmapPtr = this.pdfiumModule.FPDFImageObj_GetBitmap(imageObjectPtr);\n const bitmapBufferPtr = this.pdfiumModule.FPDFBitmap_GetBuffer(bitmapPtr);\n const bitmapWidth = this.pdfiumModule.FPDFBitmap_GetWidth(bitmapPtr);\n const bitmapHeight = this.pdfiumModule.FPDFBitmap_GetHeight(bitmapPtr);\n const format = this.pdfiumModule.FPDFBitmap_GetFormat(bitmapPtr) as BitmapFormat;\n\n const pixelCount = bitmapWidth * bitmapHeight;\n const bytesPerPixel = 4;\n const array = new Uint8ClampedArray(pixelCount * bytesPerPixel);\n for (let i = 0; i < pixelCount; i++) {\n switch (format) {\n case BitmapFormat.Bitmap_BGR:\n {\n const blue = this.pdfiumModule.pdfium.getValue(bitmapBufferPtr + i * 3, 'i8');\n const green = this.pdfiumModule.pdfium.getValue(bitmapBufferPtr + i * 3 + 1, 'i8');\n const red = this.pdfiumModule.pdfium.getValue(bitmapBufferPtr + i * 3 + 2, 'i8');\n array[i * bytesPerPixel] = red;\n array[i * bytesPerPixel + 1] = green;\n array[i * bytesPerPixel + 2] = blue;\n array[i * bytesPerPixel + 3] = 100;\n }\n break;\n }\n }\n\n // Return plain object (ImageDataLike) instead of browser-specific ImageData\n const imageDataLike: ImageDataLike = {\n data: array,\n width: bitmapWidth,\n height: bitmapHeight,\n };\n const matrix = this.readPdfPageObjectTransformMatrix(imageObjectPtr);\n\n return {\n type: PdfPageObjectType.IMAGE,\n imageData: imageDataLike,\n matrix,\n };\n }\n\n /**\n * Read form object from pdf document\n * @param formObjectPtr - pointer to pdf form object in page\n * @returns pdf form object\n *\n * @private\n */\n private readFormObject(formObjectPtr: number): PdfFormObject {\n const objectCount = this.pdfiumModule.FPDFFormObj_CountObjects(formObjectPtr);\n const objects: (PdfFormObject | PdfImageObject | PdfPathObject)[] = [];\n for (let i = 0; i < objectCount; i++) {\n const pageObjectPtr = this.pdfiumModule.FPDFFormObj_GetObject(formObjectPtr, i);\n const pageObj = this.readPdfPageObject(pageObjectPtr);\n if (pageObj) {\n objects.push(pageObj);\n }\n }\n const matrix = this.readPdfPageObjectTransformMatrix(formObjectPtr);\n\n return {\n type: PdfPageObjectType.FORM,\n objects,\n matrix,\n };\n }\n\n /**\n * Read pdf object in pdf page\n * @param pageObjectPtr - pointer to pdf object in page\n * @returns pdf object in page\n *\n * @private\n */\n private readPdfPageObjectTransformMatrix(pageObjectPtr: number): PdfTransformMatrix {\n const matrixPtr = this.memoryManager.malloc(4 * 6);\n if (this.pdfiumModule.FPDFPageObj_GetMatrix(pageObjectPtr, matrixPtr)) {\n const a = this.pdfiumModule.pdfium.getValue(matrixPtr, 'float');\n const b = this.pdfiumModule.pdfium.getValue(matrixPtr + 4, 'float');\n const c = this.pdfiumModule.pdfium.getValue(matrixPtr + 8, 'float');\n const d = this.pdfiumModule.pdfium.getValue(matrixPtr + 12, 'float');\n const e = this.pdfiumModule.pdfium.getValue(matrixPtr + 16, 'float');\n const f = this.pdfiumModule.pdfium.getValue(matrixPtr + 20, 'float');\n this.memoryManager.free(matrixPtr);\n\n return { a, b, c, d, e, f };\n }\n\n this.memoryManager.free(matrixPtr);\n\n return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n }\n\n /**\n * Read contents of a stamp annotation\n * @param annotationPtr - pointer to pdf annotation\n * @returns contents of the stamp annotation\n *\n * @private\n */\n private readStampAnnotationContents(annotationPtr: number): PdfStampAnnoObjectContents {\n const contents: PdfStampAnnoObjectContents = [];\n\n const objectCount = this.pdfiumModule.FPDFAnnot_GetObjectCount(annotationPtr);\n for (let i = 0; i < objectCount; i++) {\n const annotationObjectPtr = this.pdfiumModule.FPDFAnnot_GetObject(annotationPtr, i);\n\n const pageObj = this.readPdfPageObject(annotationObjectPtr);\n if (pageObj) {\n contents.push(pageObj);\n }\n }\n\n return contents;\n }\n\n /**\n * Return the stroke-width declared in the annotation’s /Border or /BS entry.\n * Falls back to 1 pt when nothing is defined.\n *\n * @param annotationPtr - pointer to pdf annotation\n * @returns stroke-width\n *\n * @private\n */\n private getStrokeWidth(annotationPtr: number): number {\n // FPDFAnnot_GetBorder(annot, &hRadius, &vRadius, &borderWidth)\n const hPtr = this.memoryManager.malloc(4);\n const vPtr = this.memoryManager.malloc(4);\n const wPtr = this.memoryManager.malloc(4);\n\n const ok = this.pdfiumModule.FPDFAnnot_GetBorder(annotationPtr, hPtr, vPtr, wPtr);\n const width = ok ? this.pdfiumModule.pdfium.getValue(wPtr, 'float') : 1; // default 1 pt\n\n this.memoryManager.free(hPtr);\n this.memoryManager.free(vPtr);\n this.memoryManager.free(wPtr);\n\n return width;\n }\n\n /**\n * Fetches the `/F` flag bit-field from an annotation.\n *\n * @param annotationPtr pointer to an `FPDF_ANNOTATION`\n * @returns `{ raw, flags }`\n * • `raw` – the 32-bit integer returned by PDFium\n * • `flags` – object with individual booleans\n */\n private getAnnotationFlags(annotationPtr: number): PdfAnnotationFlagName[] {\n const rawFlags = this.pdfiumModule.FPDFAnnot_GetFlags(annotationPtr); // number\n\n return flagsToNames(rawFlags);\n }\n\n private setAnnotationFlags(annotationPtr: number, flags: PdfAnnotationFlagName[]): boolean {\n const rawFlags = namesToFlags(flags);\n return this.pdfiumModule.FPDFAnnot_SetFlags(annotationPtr, rawFlags);\n }\n\n /**\n * Read circle annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf circle annotation\n *\n * @private\n */\n private readPdfCircleAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfCircleAnnoObject {\n const custom = this.getAnnotCustom(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const interiorColor = this.getAnnotationColor(\n annotationPtr,\n PdfAnnotationColorType.InteriorColor,\n );\n const strokeColor = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n let { style: strokeStyle, width: strokeWidth } = this.getBorderStyle(annotationPtr);\n\n let strokeDashArray: number[] | undefined;\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n const { ok, pattern } = this.getBorderDashPattern(annotationPtr);\n if (ok) {\n strokeDashArray = pattern;\n }\n }\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.CIRCLE,\n flags,\n color: interiorColor ?? 'transparent',\n opacity,\n contents,\n strokeWidth,\n strokeColor: strokeColor ?? '#FF0000',\n strokeStyle,\n rect,\n author,\n modified,\n created,\n ...(strokeDashArray !== undefined && { strokeDashArray }),\n };\n }\n\n /**\n * Read square annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf square annotation\n *\n * @private\n */\n private readPdfSquareAnno(\n page: PdfPageObject,\n annotationPtr: number,\n index: string,\n ): PdfSquareAnnoObject {\n const custom = this.getAnnotCustom(annotationPtr);\n const flags = this.getAnnotationFlags(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const contents = this.getAnnotString(annotationPtr, 'Contents') || '';\n const interiorColor = this.getAnnotationColor(\n annotationPtr,\n PdfAnnotationColorType.InteriorColor,\n );\n const strokeColor = this.getAnnotationColor(annotationPtr);\n const opacity = this.getAnnotationOpacity(annotationPtr);\n let { style: strokeStyle, width: strokeWidth } = this.getBorderStyle(annotationPtr);\n\n let strokeDashArray: number[] | undefined;\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n const { ok, pattern } = this.getBorderDashPattern(annotationPtr);\n if (ok) {\n strokeDashArray = pattern;\n }\n }\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n type: PdfAnnotationSubtype.SQUARE,\n flags,\n color: interiorColor ?? 'transparent',\n opacity,\n contents,\n strokeColor: strokeColor ?? '#FF0000',\n strokeWidth,\n strokeStyle,\n rect,\n author,\n modified,\n created,\n ...(strokeDashArray !== undefined && { strokeDashArray }),\n };\n }\n\n /**\n * Read basic info of unsupported pdf annotation\n * @param page - pdf page infor\n * @param type - type of annotation\n * @param annotationPtr - pointer to pdf annotation\n * @param index - index of annotation in the pdf page\n * @returns pdf annotation\n *\n * @private\n */\n private readPdfAnno(\n page: PdfPageObject,\n type: PdfUnsupportedAnnoObject['type'],\n annotationPtr: number,\n index: string,\n ): PdfUnsupportedAnnoObject {\n const custom = this.getAnnotCustom(annotationPtr);\n const pageRect = this.readPageAnnoRect(annotationPtr);\n const rect = this.convertPageRectToDeviceRect(page, pageRect);\n const author = this.getAnnotString(annotationPtr, 'T');\n const modified = this.getAnnotationDate(annotationPtr, 'M');\n const created = this.getAnnotationDate(annotationPtr, 'CreationDate');\n const flags = this.getAnnotationFlags(annotationPtr);\n\n return {\n pageIndex: page.index,\n custom,\n id: index,\n flags,\n type,\n rect,\n author,\n modified,\n created,\n };\n }\n\n /**\n * Resolve `/IRT` → parent-annotation index on the same page.\n *\n * @param pagePtr - pointer to FPDF_PAGE\n * @param annotationPtr - pointer to FPDF_ANNOTATION\n * @returns index (`0…count-1`) or `undefined` when the annotation is *not* a reply\n *\n * @private\n */\n private getInReplyToId(annotationPtr: number): string | undefined {\n const parentPtr = this.pdfiumModule.FPDFAnnot_GetLinkedAnnot(annotationPtr, 'IRT');\n if (!parentPtr) return;\n\n return this.getAnnotString(parentPtr, 'NM');\n }\n\n /**\n * Set the in reply to id of the annotation\n *\n * @param annotationPtr - pointer to an `FPDF_ANNOTATION`\n * @param id - the id of the parent annotation\n * @returns `true` on success\n */\n private setInReplyToId(pagePtr: number, annotationPtr: number, id: string): boolean {\n const parentPtr = this.getAnnotationByName(pagePtr, id);\n if (!parentPtr) return false;\n\n return this.pdfiumModule.EPDFAnnot_SetLinkedAnnot(annotationPtr, 'IRT', parentPtr);\n }\n\n /**\n * Fetch a string value (`/T`, `/M`, `/State`, …) from an annotation.\n *\n * @returns decoded UTF-8 string or `undefined` when the key is absent\n *\n * @private\n */\n private getAnnotString(annotationPtr: number, key: string): string | undefined {\n const len = this.pdfiumModule.FPDFAnnot_GetStringValue(annotationPtr, key, 0, 0);\n if (len === 0) return;\n\n const bytes = (len + 1) * 2;\n const ptr = this.memoryManager.malloc(bytes);\n\n this.pdfiumModule.FPDFAnnot_GetStringValue(annotationPtr, key, ptr, bytes);\n const value = this.pdfiumModule.pdfium.UTF16ToString(ptr);\n this.memoryManager.free(ptr);\n\n return value || undefined;\n }\n\n /**\n * Get a string value (`/T`, `/M`, `/State`, …) from an attachment.\n *\n * @returns decoded UTF-8 string or `undefined` when the key is absent\n *\n * @private\n */\n private getAttachmentString(attachmentPtr: number, key: string): string | undefined {\n const len = this.pdfiumModule.FPDFAttachment_GetStringValue(attachmentPtr, key, 0, 0);\n if (len === 0) return;\n\n const bytes = (len + 1) * 2;\n const ptr = this.memoryManager.malloc(bytes);\n\n this.pdfiumModule.FPDFAttachment_GetStringValue(attachmentPtr, key, ptr, bytes);\n const value = this.pdfiumModule.pdfium.UTF16ToString(ptr);\n this.memoryManager.free(ptr);\n\n return value || undefined;\n }\n\n /**\n * Get a number value (`/Size`) from an attachment.\n *\n * @returns number or `null` when the key is absent\n *\n * @private\n */\n private getAttachmentNumber(attachmentPtr: number, key: string): number | undefined {\n const outPtr = this.memoryManager.malloc(4); // int32\n try {\n const ok = this.pdfiumModule.EPDFAttachment_GetIntegerValue(\n attachmentPtr,\n key, // FPDF_BYTESTRING → ASCII JS string is fine in your glue\n outPtr,\n );\n if (!ok) return undefined;\n // Treat as unsigned to avoid negative values if >2GB (rare on wasm, but harmless)\n return this.pdfiumModule.pdfium.getValue(outPtr, 'i32') >>> 0;\n } finally {\n this.memoryManager.free(outPtr);\n }\n }\n\n /**\n * Get custom data of the annotation\n * @param annotationPtr - pointer to pdf annotation\n * @returns custom data of the annotation\n *\n * @private\n */\n private getAnnotCustom(annotationPtr: number): any {\n const custom = this.getAnnotString(annotationPtr, 'EPDFCustom');\n if (!custom) return;\n\n try {\n return JSON.parse(custom);\n } catch (error) {\n console.warn('Failed to parse annotation custom data as JSON:', error);\n console.warn('Invalid JSON string:', custom);\n return undefined;\n }\n }\n\n /**\n * Sets custom data for an annotation by safely stringifying and storing JSON\n * @private\n */\n private setAnnotCustom(annotationPtr: number, data: any): boolean {\n if (data === undefined || data === null) {\n // Clear the custom data by setting empty string\n return this.setAnnotString(annotationPtr, 'EPDFCustom', '');\n }\n\n try {\n const jsonString = JSON.stringify(data);\n return this.setAnnotString(annotationPtr, 'EPDFCustom', jsonString);\n } catch (error) {\n console.warn('Failed to stringify annotation custom data as JSON:', error);\n console.warn('Invalid data object:', data);\n return false;\n }\n }\n\n /**\n * Fetches the /IT (Intent) name from an annotation as a UTF-8 JS string.\n *\n * Mirrors getAnnotString(): calls EPDFAnnot_GetIntent twice (length probe + copy).\n * Returns `undefined` if no intent present.\n */\n private getAnnotIntent(annotationPtr: number): string | undefined {\n const len = this.pdfiumModule.EPDFAnnot_GetIntent(annotationPtr, 0, 0);\n if (len === 0) return;\n\n const codeUnits = len + 1;\n const bytes = codeUnits * 2;\n const ptr = this.memoryManager.malloc(bytes);\n\n this.pdfiumModule.EPDFAnnot_GetIntent(annotationPtr, ptr, bytes);\n const value = this.pdfiumModule.pdfium.UTF16ToString(ptr);\n\n this.memoryManager.free(ptr);\n\n return value && value !== 'undefined' ? value : undefined;\n }\n\n /**\n * Write the `/IT` (Intent) name into an annotation dictionary.\n *\n * Mirrors EPDFAnnot_SetIntent in PDFium (expects a UTF‑8 FPDF_BYTESTRING).\n *\n * @param annotationPtr Pointer returned by FPDFPage_GetAnnot\n * @param intent Name without leading slash, e.g. `\"PolygonCloud\"`\n * A leading “/” will be stripped for convenience.\n * @returns true on success, false otherwise\n */\n private setAnnotIntent(annotationPtr: number, intent: string): boolean {\n return this.pdfiumModule.EPDFAnnot_SetIntent(annotationPtr, intent);\n }\n\n /**\n * Returns the rich‑content string stored in the annotation’s `/RC` entry.\n *\n * Works like `getAnnotIntent()`: first probe for length, then copy.\n * `undefined` when the annotation has no rich content.\n */\n private getAnnotRichContent(annotationPtr: number): string | undefined {\n // First call → number of UTF‑16 code units (excluding NUL)\n const len = this.pdfiumModule.EPDFAnnot_GetRichContent(annotationPtr, 0, 0);\n if (len === 0) return;\n\n // +1 for the implicit NUL added by PDFium → bytes = 2 × code units\n const codeUnits = len + 1;\n const bytes = codeUnits * 2;\n const ptr = this.memoryManager.malloc(bytes);\n\n this.pdfiumModule.EPDFAnnot_GetRichContent(annotationPtr, ptr, bytes);\n const value = this.pdfiumModule.pdfium.UTF16ToString(ptr);\n\n this.memoryManager.free(ptr);\n\n return value || undefined;\n }\n\n /**\n * Get annotation by name\n * @param pagePtr - pointer to pdf page object\n * @param name - name of annotation\n * @returns pointer to pdf annotation\n *\n * @private\n */\n private getAnnotationByName(pagePtr: number, name: string): number | undefined {\n return this.withWString(name, (wNamePtr) => {\n return this.pdfiumModule.EPDFPage_GetAnnotByName(pagePtr, wNamePtr);\n });\n }\n\n /**\n * Remove annotation by name\n * @param pagePtr - pointer to pdf page object\n * @param name - name of annotation\n * @returns true on success\n *\n * @private\n */\n private removeAnnotationByName(pagePtr: number, name: string): boolean {\n return this.withWString(name, (wNamePtr) => {\n return this.pdfiumModule.EPDFPage_RemoveAnnotByName(pagePtr, wNamePtr);\n });\n }\n\n /**\n * Set a string value (`/T`, `/M`, `/State`, …) to an annotation.\n *\n * @returns `true` if the operation was successful\n *\n * @private\n */\n private setAnnotString(annotationPtr: number, key: string, value: string): boolean {\n return this.withWString(value, (wValPtr) => {\n return this.pdfiumModule.FPDFAnnot_SetStringValue(annotationPtr, key, wValPtr);\n });\n }\n\n /**\n * Set a string value (`/T`, `/M`, `/State`, …) to an attachment.\n *\n * @returns `true` if the operation was successful\n *\n * @private\n */\n private setAttachmentString(attachmentPtr: number, key: string, value: string): boolean {\n return this.withWString(value, (wValPtr) => {\n // FPDFAttachment_SetStringValue writes into /Params dictionary\n return this.pdfiumModule.FPDFAttachment_SetStringValue(attachmentPtr, key, wValPtr);\n });\n }\n\n /**\n * Read vertices of pdf annotation\n * @param page - pdf page infor\n * @param annotationPtr - pointer to pdf annotation\n * @returns vertices of pdf annotation\n *\n * @private\n */\n private readPdfAnnoVertices(page: PdfPageObject, annotationPtr: number): Position[] {\n const vertices: Position[] = [];\n const count = this.pdfiumModule.FPDFAnnot_GetVertices(annotationPtr, 0, 0);\n const pointMemorySize = 8;\n const pointsPtr = this.memoryManager.malloc(count * pointMemorySize);\n this.pdfiumModule.FPDFAnnot_GetVertices(annotationPtr, pointsPtr, count);\n for (let i = 0; i < count; i++) {\n const pointX = this.pdfiumModule.pdfium.getValue(pointsPtr + i * pointMemorySize, 'float');\n const pointY = this.pdfiumModule.pdfium.getValue(\n pointsPtr + i * pointMemorySize + 4,\n 'float',\n );\n\n const { x, y } = this.convertPagePointToDevicePoint(page, {\n x: pointX,\n y: pointY,\n });\n const last = vertices[vertices.length - 1];\n if (!last || last.x !== x || last.y !== y) {\n vertices.push({ x, y });\n }\n }\n this.memoryManager.free(pointsPtr);\n\n return vertices;\n }\n\n /**\n * Sync the vertices of a polygon or polyline annotation.\n *\n * @param page - pdf page infor\n * @param annotPtr - pointer to pdf annotation\n * @param vertices - the vertices to be set\n * @returns true on success\n *\n * @private\n */\n private setPdfAnnoVertices(page: PdfPageObject, annotPtr: number, vertices: Position[]): boolean {\n const pdf = this.pdfiumModule.pdfium;\n const FS_POINTF_SIZE = 8;\n\n const buf = this.memoryManager.malloc(FS_POINTF_SIZE * vertices.length);\n vertices.forEach((v, i) => {\n const pagePt = this.convertDevicePointToPagePoint(page, v);\n pdf.setValue(buf + i * FS_POINTF_SIZE + 0, pagePt.x, 'float');\n pdf.setValue(buf + i * FS_POINTF_SIZE + 4, pagePt.y, 'float');\n });\n\n const ok = this.pdfiumModule.EPDFAnnot_SetVertices(annotPtr, buf, vertices.length);\n this.memoryManager.free(buf);\n return ok;\n }\n\n /**\n * Read the target of pdf bookmark\n * @param docPtr - pointer to pdf document object\n * @param getActionPtr - callback function to retrive the pointer of action\n * @param getDestinationPtr - callback function to retrive the pointer of destination\n * @returns target of pdf bookmark\n *\n * @private\n */\n private readPdfBookmarkTarget(\n docPtr: number,\n getActionPtr: () => number,\n getDestinationPtr: () => number,\n ): PdfLinkTarget | undefined {\n const actionPtr = getActionPtr();\n if (actionPtr) {\n const action = this.readPdfAction(docPtr, actionPtr);\n\n return {\n type: 'action',\n action,\n };\n } else {\n const destinationPtr = getDestinationPtr();\n if (destinationPtr) {\n const destination = this.readPdfDestination(docPtr, destinationPtr);\n\n return {\n type: 'destination',\n destination,\n };\n }\n }\n }\n\n /**\n * Read field of pdf widget annotation\n * @param formHandle - form handle\n * @param annotationPtr - pointer to pdf annotation\n * @returns field of pdf widget annotation\n *\n * @private\n */\n private readPdfWidgetAnnoField(formHandle: number, annotationPtr: number): PdfWidgetAnnoField {\n const flag = this.pdfiumModule.FPDFAnnot_GetFormFieldFlags(\n formHandle,\n annotationPtr,\n ) as PDF_FORM_FIELD_FLAG;\n\n const type = this.pdfiumModule.FPDFAnnot_GetFormFieldType(\n formHandle,\n annotationPtr,\n ) as PDF_FORM_FIELD_TYPE;\n\n const name = readString(\n this.pdfiumModule.pdfium,\n (buffer: number, bufferLength) => {\n return this.pdfiumModule.FPDFAnnot_GetFormFieldName(\n formHandle,\n annotationPtr,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n\n const alternateName = readString(\n this.pdfiumModule.pdfium,\n (buffer: number, bufferLength) => {\n return this.pdfiumModule.FPDFAnnot_GetFormFieldAlternateName(\n formHandle,\n annotationPtr,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n\n const value = readString(\n this.pdfiumModule.pdfium,\n (buffer: number, bufferLength) => {\n return this.pdfiumModule.FPDFAnnot_GetFormFieldValue(\n formHandle,\n annotationPtr,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n\n const options: PdfWidgetAnnoOption[] = [];\n if (type === PDF_FORM_FIELD_TYPE.COMBOBOX || type === PDF_FORM_FIELD_TYPE.LISTBOX) {\n const count = this.pdfiumModule.FPDFAnnot_GetOptionCount(formHandle, annotationPtr);\n for (let i = 0; i < count; i++) {\n const label = readString(\n this.pdfiumModule.pdfium,\n (buffer: number, bufferLength) => {\n return this.pdfiumModule.FPDFAnnot_GetOptionLabel(\n formHandle,\n annotationPtr,\n i,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n const isSelected = this.pdfiumModule.FPDFAnnot_IsOptionSelected(\n formHandle,\n annotationPtr,\n i,\n );\n options.push({\n label,\n isSelected,\n });\n }\n }\n\n let isChecked = false;\n if (type === PDF_FORM_FIELD_TYPE.CHECKBOX || type === PDF_FORM_FIELD_TYPE.RADIOBUTTON) {\n isChecked = this.pdfiumModule.FPDFAnnot_IsChecked(formHandle, annotationPtr);\n }\n\n return {\n flag,\n type,\n name,\n alternateName,\n value,\n isChecked,\n options,\n };\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.renderAnnotation}\n *\n * @public\n */\n renderPageAnnotationRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<ImageDataLike> {\n const {\n scaleFactor = 1,\n rotation = Rotation.Degree0,\n dpr = 1,\n mode = AppearanceMode.Normal,\n } = options ?? {};\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'renderPageAnnotation',\n doc,\n page,\n annotation,\n options,\n );\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderPageAnnotation`,\n 'Begin',\n `${doc.id}-${page.index}-${annotation.id}`,\n );\n\n const task = new Task<ImageDataLike, PdfErrorReason>();\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderPageAnnotation`,\n 'End',\n `${doc.id}-${page.index}-${annotation.id}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // 1) native handles\n const pageCtx = ctx.acquirePage(page.index);\n const annotPtr = this.getAnnotationByName(pageCtx.pagePtr, annotation.id);\n if (!annotPtr) {\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderPageAnnotation`,\n 'End',\n `${doc.id}-${page.index}-${annotation.id}`,\n );\n pageCtx.release();\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'annotation not found' });\n }\n\n // 2) device size (rotation-aware) → integer pixels\n const finalScale = Math.max(0.01, scaleFactor * dpr);\n\n const rect = toIntRect(annotation.rect);\n const devRect = toIntRect(transformRect(page.size, rect, rotation, finalScale));\n\n const wDev = Math.max(1, devRect.size.width);\n const hDev = Math.max(1, devRect.size.height);\n const stride = wDev * 4;\n const bytes = stride * hDev;\n\n // 3) bitmap backing store in WASM\n const heapPtr = this.memoryManager.malloc(bytes);\n const bitmapPtr = this.pdfiumModule.FPDFBitmap_CreateEx(\n wDev,\n hDev,\n BitmapFormat.Bitmap_BGRA,\n heapPtr,\n stride,\n );\n this.pdfiumModule.FPDFBitmap_FillRect(bitmapPtr, 0, 0, wDev, hDev, 0x00000000);\n\n // 4) user matrix (no Y-flip; includes -origin translate)\n const M = buildUserToDeviceMatrix(\n rect, // {origin:{L,B}, size:{W,H}}\n rotation,\n wDev,\n hDev,\n );\n const mPtr = this.memoryManager.malloc(6 * 4);\n const mView = new Float32Array(this.pdfiumModule.pdfium.HEAPF32.buffer, mPtr, 6);\n mView.set([M.a, M.b, M.c, M.d, M.e, M.f]);\n\n // 5) render (DisplayMatrix is applied inside EPDF_RenderAnnotBitmap)\n const FLAGS = RenderFlag.REVERSE_BYTE_ORDER;\n let ok = false;\n try {\n ok = !!this.pdfiumModule.EPDF_RenderAnnotBitmap(\n bitmapPtr,\n pageCtx.pagePtr,\n annotPtr,\n mode,\n mPtr,\n FLAGS,\n );\n } finally {\n this.memoryManager.free(mPtr);\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr); // frees wrapper, not our heapPtr\n this.pdfiumModule.FPDFPage_CloseAnnot(annotPtr);\n pageCtx.release();\n }\n\n if (!ok) {\n this.memoryManager.free(heapPtr);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderPageAnnotation`,\n 'End',\n `${doc.id}-${page.index}-${annotation.id}`,\n );\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'EPDF_RenderAnnotBitmap failed',\n });\n }\n\n const data = this.pdfiumModule.pdfium.HEAPU8.subarray(heapPtr, heapPtr + bytes);\n // Return plain object (ImageDataLike) instead of browser-specific ImageData\n const imageDataLike: ImageDataLike = {\n data: new Uint8ClampedArray(data),\n width: wDev,\n height: hDev,\n };\n task.resolve(imageDataLike);\n this.memoryManager.free(heapPtr);\n return task;\n }\n\n private renderRectEncoded(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n const task = new Task<ImageDataLike, PdfErrorReason>();\n const rotation: Rotation = options?.rotation ?? Rotation.Degree0;\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document does not open',\n });\n }\n\n // ---- 1) decide device size (scale × dpr, swap for 90/270)\n const scale = Math.max(0.01, options?.scaleFactor ?? 1);\n const dpr = Math.max(1, options?.dpr ?? 1);\n const finalScale = scale * dpr;\n\n const baseW = rect.size.width;\n const baseH = rect.size.height;\n const swap = (rotation & 1) === 1; // 90 or 270\n\n const wDev = Math.max(1, Math.round((swap ? baseH : baseW) * finalScale));\n const hDev = Math.max(1, Math.round((swap ? baseW : baseH) * finalScale));\n const stride = wDev * 4;\n const bytes = stride * hDev;\n\n const pageCtx = ctx.acquirePage(page.index);\n const shouldRenderForms = options?.withForms ?? false;\n const formHandle = shouldRenderForms ? pageCtx.getFormHandle() : undefined;\n\n // ---- 2) allocate a BGRA bitmap in WASM\n const heapPtr = this.memoryManager.malloc(bytes);\n const bitmapPtr = this.pdfiumModule.FPDFBitmap_CreateEx(\n wDev,\n hDev,\n BitmapFormat.Bitmap_BGRA,\n heapPtr,\n stride,\n );\n // white background like page renderers typically do\n this.pdfiumModule.FPDFBitmap_FillRect(bitmapPtr, 0, 0, wDev, hDev, 0xffffffff);\n\n const M = buildUserToDeviceMatrix(rect, rotation, wDev, hDev);\n\n const mPtr = this.memoryManager.malloc(6 * 4); // FS_MATRIX\n const mView = new Float32Array(this.pdfiumModule.pdfium.HEAPF32.buffer, mPtr, 6);\n mView.set([M.a, M.b, M.c, M.d, M.e, M.f]);\n\n // Clip to the whole bitmap (device space)\n const clipPtr = this.memoryManager.malloc(4 * 4); // FS_RECTF {left,bottom,right,top}\n const clipView = new Float32Array(this.pdfiumModule.pdfium.HEAPF32.buffer, clipPtr, 4);\n clipView.set([0, 0, wDev, hDev]);\n\n // Rendering flags: swap byte order to present RGBA to JS; include LCD_TEXT and ANNOT if asked\n let flags = RenderFlag.REVERSE_BYTE_ORDER;\n if (options?.withAnnotations ?? false) flags |= RenderFlag.ANNOT;\n\n try {\n this.pdfiumModule.FPDF_RenderPageBitmapWithMatrix(\n bitmapPtr,\n pageCtx.pagePtr,\n mPtr,\n clipPtr,\n flags,\n );\n\n if (formHandle !== undefined) {\n const formParams = computeFormDrawParams(M, rect, page.size, rotation);\n const { startX, startY, formsWidth, formsHeight, scaleX, scaleY } = formParams;\n\n // Draw form elements using the same effective transform as the page bitmap.\n this.pdfiumModule.FPDF_FFLDraw(\n formHandle,\n bitmapPtr,\n pageCtx.pagePtr,\n startX,\n startY,\n formsWidth,\n formsHeight,\n rotation,\n flags,\n );\n }\n } finally {\n pageCtx.release();\n this.memoryManager.free(mPtr);\n this.memoryManager.free(clipPtr);\n }\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderRectEncodedData`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n const data = this.pdfiumModule.pdfium.HEAPU8.subarray(heapPtr, heapPtr + bytes);\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderRectEncodedData`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderRectEncodedImageData`,\n 'Begin',\n `${doc.id}-${page.index}`,\n );\n // Return plain object (ImageDataLike) instead of browser-specific ImageData\n // This ensures compatibility with Node.js and other non-browser environments\n const imageDataLike: ImageDataLike = {\n data: new Uint8ClampedArray(data),\n width: wDev,\n height: hDev,\n };\n this.logger.perf(\n LOG_SOURCE,\n LOG_CATEGORY,\n `RenderRectEncodedImageData`,\n 'End',\n `${doc.id}-${page.index}`,\n );\n task.resolve(imageDataLike);\n\n this.pdfiumModule.FPDFBitmap_Destroy(bitmapPtr);\n this.memoryManager.free(heapPtr);\n\n return task;\n }\n\n /**\n * Read the target of pdf link annotation\n * @param docPtr - pointer to pdf document object\n * @param getActionPtr - callback function to retrive the pointer of action\n * @param getDestinationPtr - callback function to retrive the pointer of destination\n * @returns target of link\n *\n * @private\n */\n private readPdfLinkAnnoTarget(\n docPtr: number,\n getActionPtr: () => number,\n getDestinationPtr: () => number,\n ): PdfLinkTarget | undefined {\n const destinationPtr = getDestinationPtr();\n if (destinationPtr) {\n const destination = this.readPdfDestination(docPtr, destinationPtr);\n\n return {\n type: 'destination',\n destination,\n };\n } else {\n const actionPtr = getActionPtr();\n if (actionPtr) {\n const action = this.readPdfAction(docPtr, actionPtr);\n\n return {\n type: 'action',\n action,\n };\n }\n }\n }\n\n private createLocalDestPtr(docPtr: number, dest: PdfDestinationObject): number {\n // Load page for local destinations.\n const pagePtr = this.pdfiumModule.FPDF_LoadPage(docPtr, dest.pageIndex);\n if (!pagePtr) return 0;\n\n try {\n if (dest.zoom.mode === PdfZoomMode.XYZ) {\n const { x, y, zoom } = dest.zoom.params;\n // We treat provided x/y/zoom as “specified”.\n return this.pdfiumModule.EPDFDest_CreateXYZ(\n pagePtr,\n /*has_left*/ true,\n x,\n /*has_top*/ true,\n y,\n /*has_zoom*/ true,\n zoom,\n );\n }\n\n // Map non-XYZ “view modes” to PDFDEST_VIEW_* and params.\n let viewEnum: PdfZoomMode;\n let params: number[] = [];\n\n switch (dest.zoom.mode) {\n case PdfZoomMode.FitPage:\n viewEnum = PdfZoomMode.FitPage; // no params\n break;\n case PdfZoomMode.FitHorizontal:\n // FitH needs top; use view[0] if provided, else 0\n viewEnum = PdfZoomMode.FitHorizontal;\n params = [dest.view?.[0] ?? 0];\n break;\n case PdfZoomMode.FitVertical:\n // FitV needs left; use view[0] if provided, else 0\n viewEnum = PdfZoomMode.FitVertical;\n params = [dest.view?.[0] ?? 0];\n break;\n case PdfZoomMode.FitRectangle:\n // FitR needs left, bottom, right, top (pad with zeros).\n {\n const v = dest.view ?? [];\n params = [v[0] ?? 0, v[1] ?? 0, v[2] ?? 0, v[3] ?? 0];\n viewEnum = PdfZoomMode.FitRectangle;\n }\n break;\n case PdfZoomMode.Unknown:\n default:\n // Unknown cannot be encoded as a valid explicit destination.\n return 0;\n }\n\n return this.withFloatArray(params, (ptr, count) =>\n this.pdfiumModule.EPDFDest_CreateView(pagePtr, viewEnum, ptr, count),\n );\n } finally {\n this.pdfiumModule.FPDF_ClosePage(pagePtr);\n }\n }\n\n private applyBookmarkTarget(docPtr: number, bmPtr: number, target: PdfLinkTarget): boolean {\n if (target.type === 'destination') {\n const destPtr = this.createLocalDestPtr(docPtr, target.destination);\n if (!destPtr) return false;\n const ok = this.pdfiumModule.EPDFBookmark_SetDest(docPtr, bmPtr, destPtr);\n return !!ok;\n }\n\n // target.type === 'action'\n const action = target.action;\n switch (action.type) {\n case PdfActionType.Goto: {\n const destPtr = this.createLocalDestPtr(docPtr, action.destination);\n if (!destPtr) return false;\n const actPtr = this.pdfiumModule.EPDFAction_CreateGoTo(docPtr, destPtr);\n if (!actPtr) return false;\n return !!this.pdfiumModule.EPDFBookmark_SetAction(docPtr, bmPtr, actPtr);\n }\n\n case PdfActionType.URI: {\n const actPtr = this.pdfiumModule.EPDFAction_CreateURI(docPtr, action.uri);\n if (!actPtr) return false;\n return !!this.pdfiumModule.EPDFBookmark_SetAction(docPtr, bmPtr, actPtr);\n }\n\n case PdfActionType.LaunchAppOrOpenFile: {\n const actPtr = this.withWString(action.path, (wptr) =>\n this.pdfiumModule.EPDFAction_CreateLaunch(docPtr, wptr),\n );\n if (!actPtr) return false;\n return !!this.pdfiumModule.EPDFBookmark_SetAction(docPtr, bmPtr, actPtr);\n }\n\n case PdfActionType.RemoteGoto:\n // We need a file path to build a GoToR action. Your Action shape\n // doesn’t carry a path, so we’ll reject for now.\n return false;\n\n case PdfActionType.Unsupported:\n default:\n return false;\n }\n }\n\n /**\n * Read pdf action from pdf document\n * @param docPtr - pointer to pdf document object\n * @param actionPtr - pointer to pdf action object\n * @returns pdf action object\n *\n * @private\n */\n private readPdfAction(docPtr: number, actionPtr: number): PdfActionObject {\n const actionType = this.pdfiumModule.FPDFAction_GetType(actionPtr) as PdfActionType;\n let action: PdfActionObject;\n switch (actionType) {\n case PdfActionType.Unsupported:\n action = {\n type: PdfActionType.Unsupported,\n };\n break;\n case PdfActionType.Goto:\n {\n const destinationPtr = this.pdfiumModule.FPDFAction_GetDest(docPtr, actionPtr);\n if (destinationPtr) {\n const destination = this.readPdfDestination(docPtr, destinationPtr);\n\n action = {\n type: PdfActionType.Goto,\n destination,\n };\n } else {\n action = {\n type: PdfActionType.Unsupported,\n };\n }\n }\n break;\n case PdfActionType.RemoteGoto:\n {\n // In case of remote goto action,\n // the application should first use FPDFAction_GetFilePath\n // to get file path, then load that particular document,\n // and use its document handle to call this\n action = {\n type: PdfActionType.Unsupported,\n };\n }\n break;\n case PdfActionType.URI:\n {\n const uri = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFAction_GetURIPath(\n docPtr,\n actionPtr,\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF8ToString,\n );\n\n action = {\n type: PdfActionType.URI,\n uri,\n };\n }\n break;\n case PdfActionType.LaunchAppOrOpenFile:\n {\n const path = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFAction_GetFilePath(actionPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF8ToString,\n );\n action = {\n type: PdfActionType.LaunchAppOrOpenFile,\n path,\n };\n }\n break;\n }\n\n return action;\n }\n\n /**\n * Read pdf destination object\n * @param docPtr - pointer to pdf document object\n * @param destinationPtr - pointer to pdf destination\n * @returns pdf destination object\n *\n * @private\n */\n private readPdfDestination(docPtr: number, destinationPtr: number): PdfDestinationObject {\n const pageIndex = this.pdfiumModule.FPDFDest_GetDestPageIndex(docPtr, destinationPtr);\n // Every params is a float value\n const maxParmamsCount = 4;\n const paramsCountPtr = this.memoryManager.malloc(maxParmamsCount);\n const paramsPtr = this.memoryManager.malloc(maxParmamsCount * 4);\n const zoomMode = this.pdfiumModule.FPDFDest_GetView(\n destinationPtr,\n paramsCountPtr,\n paramsPtr,\n ) as PdfZoomMode;\n const paramsCount = this.pdfiumModule.pdfium.getValue(paramsCountPtr, 'i32');\n const view: number[] = [];\n for (let i = 0; i < paramsCount; i++) {\n const paramPtr = paramsPtr + i * 4;\n view.push(this.pdfiumModule.pdfium.getValue(paramPtr, 'float'));\n }\n this.memoryManager.free(paramsCountPtr);\n this.memoryManager.free(paramsPtr);\n\n if (zoomMode === PdfZoomMode.XYZ) {\n const hasXPtr = this.memoryManager.malloc(1);\n const hasYPtr = this.memoryManager.malloc(1);\n const hasZPtr = this.memoryManager.malloc(1);\n const xPtr = this.memoryManager.malloc(4);\n const yPtr = this.memoryManager.malloc(4);\n const zPtr = this.memoryManager.malloc(4);\n\n const isSucceed = this.pdfiumModule.FPDFDest_GetLocationInPage(\n destinationPtr,\n hasXPtr,\n hasYPtr,\n hasZPtr,\n xPtr,\n yPtr,\n zPtr,\n );\n if (isSucceed) {\n const hasX = this.pdfiumModule.pdfium.getValue(hasXPtr, 'i8');\n const hasY = this.pdfiumModule.pdfium.getValue(hasYPtr, 'i8');\n const hasZ = this.pdfiumModule.pdfium.getValue(hasZPtr, 'i8');\n\n const x = hasX ? this.pdfiumModule.pdfium.getValue(xPtr, 'float') : 0;\n const y = hasY ? this.pdfiumModule.pdfium.getValue(yPtr, 'float') : 0;\n const zoom = hasZ ? this.pdfiumModule.pdfium.getValue(zPtr, 'float') : 0;\n\n this.memoryManager.free(hasXPtr);\n this.memoryManager.free(hasYPtr);\n this.memoryManager.free(hasZPtr);\n this.memoryManager.free(xPtr);\n this.memoryManager.free(yPtr);\n this.memoryManager.free(zPtr);\n\n return {\n pageIndex,\n zoom: {\n mode: zoomMode,\n params: {\n x,\n y,\n zoom,\n },\n },\n view,\n };\n }\n\n this.memoryManager.free(hasXPtr);\n this.memoryManager.free(hasYPtr);\n this.memoryManager.free(hasZPtr);\n this.memoryManager.free(xPtr);\n this.memoryManager.free(yPtr);\n this.memoryManager.free(zPtr);\n\n return {\n pageIndex,\n zoom: {\n mode: zoomMode,\n params: {\n x: 0,\n y: 0,\n zoom: 0,\n },\n },\n view,\n };\n }\n\n return {\n pageIndex,\n zoom: {\n mode: zoomMode,\n },\n view,\n };\n }\n\n /**\n * Read attachmet from pdf document\n * @param docPtr - pointer to pdf document object\n * @param index - index of attachment\n * @returns attachment content\n *\n * @private\n */\n private readPdfAttachment(docPtr: number, index: number): PdfAttachmentObject {\n const attachmentPtr = this.pdfiumModule.FPDFDoc_GetAttachment(docPtr, index);\n const name = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFAttachment_GetName(attachmentPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n const description = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.EPDFAttachment_GetDescription(attachmentPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n const mimeType = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFAttachment_GetSubtype(attachmentPtr, buffer, bufferLength);\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n const creationDate = this.getAttachmentDate(attachmentPtr, 'CreationDate');\n const checksum = readString(\n this.pdfiumModule.pdfium,\n (buffer, bufferLength) => {\n return this.pdfiumModule.FPDFAttachment_GetStringValue(\n attachmentPtr,\n 'Checksum',\n buffer,\n bufferLength,\n );\n },\n this.pdfiumModule.pdfium.UTF16ToString,\n );\n const size = this.getAttachmentNumber(attachmentPtr, 'Size');\n\n return {\n index,\n name,\n description,\n mimeType,\n size,\n creationDate,\n checksum,\n };\n }\n\n /**\n * Convert coordinate of point from device coordinate to page coordinate\n * @param page - pdf page infor\n * @param position - position of point\n * @returns converted position\n *\n * @private\n */\n private convertDevicePointToPagePoint(page: PdfPageObject, position: Position): Position {\n const DW = page.size.width;\n const DH = page.size.height;\n const r = page.rotation & 3;\n\n if (r === 0) {\n // 0°\n return { x: position.x, y: DH - position.y };\n }\n if (r === 1) {\n // 90° CW\n // x_d = sx*y, y_d = sy*x => x = y_d/sy, y = x_d/sx\n return { x: position.y, y: position.x };\n }\n if (r === 2) {\n // 180°\n return { x: DW - position.x, y: position.y };\n }\n {\n // 270° CW\n // x_d = DW - sx*y, y_d = DH - sy*x\n return { x: DH - position.y, y: DW - position.x };\n }\n }\n\n /**\n * Convert coordinate of point from page coordinate to device coordinate\n * @param page - pdf page infor\n * @param position - position of point\n * @returns converted position\n *\n * @private\n */\n private convertPagePointToDevicePoint(page: PdfPageObject, position: Position): Position {\n const DW = page.size.width;\n const DH = page.size.height;\n const r = page.rotation & 3;\n\n if (r === 0) {\n // 0°\n return { x: position.x, y: DH - position.y };\n }\n if (r === 1) {\n // 90° CW\n return { x: position.y, y: position.x };\n }\n if (r === 2) {\n // 180°\n return { x: DW - position.x, y: position.y };\n }\n {\n // 270° CW\n return { x: DW - position.y, y: DH - position.x };\n }\n }\n\n /**\n * Convert coordinate of rectangle from page coordinate to device coordinate\n * @param page - pdf page infor\n * @param pagePtr - pointer to pdf page object\n * @param pageRect - rectangle that needs to be converted\n * @returns converted rectangle\n *\n * @private\n */\n private convertPageRectToDeviceRect(\n page: PdfPageObject,\n pageRect: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n },\n ): Rect {\n const { x, y } = this.convertPagePointToDevicePoint(page, {\n x: pageRect.left,\n y: pageRect.top,\n });\n const rect = {\n origin: {\n x,\n y,\n },\n size: {\n width: Math.abs(pageRect.right - pageRect.left),\n height: Math.abs(pageRect.top - pageRect.bottom),\n },\n };\n\n return rect;\n }\n\n /**\n * Read the appearance stream of annotation\n * @param annotationPtr - pointer to pdf annotation\n * @param mode - appearance mode\n * @returns appearance stream\n *\n * @private\n */\n private readPageAnnoAppearanceStreams(annotationPtr: number) {\n return {\n normal: this.readPageAnnoAppearanceStream(annotationPtr, AppearanceMode.Normal),\n rollover: this.readPageAnnoAppearanceStream(annotationPtr, AppearanceMode.Rollover),\n down: this.readPageAnnoAppearanceStream(annotationPtr, AppearanceMode.Down),\n };\n }\n\n /**\n * Read the appearance stream of annotation\n * @param annotationPtr - pointer to pdf annotation\n * @param mode - appearance mode\n * @returns appearance stream\n *\n * @private\n */\n private readPageAnnoAppearanceStream(annotationPtr: number, mode = AppearanceMode.Normal) {\n const utf16Length = this.pdfiumModule.FPDFAnnot_GetAP(annotationPtr, mode, 0, 0);\n const bytesCount = (utf16Length + 1) * 2; // include NIL\n const bufferPtr = this.memoryManager.malloc(bytesCount);\n this.pdfiumModule.FPDFAnnot_GetAP(annotationPtr, mode, bufferPtr, bytesCount);\n const ap = this.pdfiumModule.pdfium.UTF16ToString(bufferPtr);\n this.memoryManager.free(bufferPtr);\n\n return ap;\n }\n\n /**\n * Set the appearance stream of annotation\n * @param annotationPtr - pointer to pdf annotation\n * @param mode - appearance mode\n * @param apContent - appearance stream content (null to remove)\n * @returns whether the appearance stream was set successfully\n *\n * @private\n */\n private setPageAnnoAppearanceStream(\n annotationPtr: number,\n mode: AppearanceMode = AppearanceMode.Normal,\n apContent: string,\n ): boolean {\n // UTF-16LE buffer (+2 bytes for NUL)\n const bytes = 2 * (apContent.length + 1);\n const ptr = this.memoryManager.malloc(bytes);\n try {\n this.pdfiumModule.pdfium.stringToUTF16(apContent, ptr, bytes);\n const ok = this.pdfiumModule.FPDFAnnot_SetAP(annotationPtr, mode, ptr);\n return !!ok;\n } finally {\n this.memoryManager.free(ptr);\n }\n }\n\n /**\n * Set the rect of specified annotation\n * @param page - page info that the annotation is belonged to\n * @param annotationPtr - pointer to annotation object\n * @param rect - target rectangle\n * @returns whether the rect is setted\n *\n * @private\n */\n private setPageAnnoRect(page: PdfPageObject, annotPtr: number, rect: Rect): boolean {\n // Snap device edges the same way FPDF_DeviceToPage(int,int,...) did (truncate → floor for ≥0)\n const x0d = Math.floor(rect.origin.x);\n const y0d = Math.floor(rect.origin.y);\n const x1d = Math.floor(rect.origin.x + rect.size.width);\n const y1d = Math.floor(rect.origin.y + rect.size.height);\n\n // Map all 4 integer corners to page space (handles any /Rotate)\n const TL = this.convertDevicePointToPagePoint(page, { x: x0d, y: y0d });\n const TR = this.convertDevicePointToPagePoint(page, { x: x1d, y: y0d });\n const BR = this.convertDevicePointToPagePoint(page, { x: x1d, y: y1d });\n const BL = this.convertDevicePointToPagePoint(page, { x: x0d, y: y1d });\n\n // Page-space AABB\n let left = Math.min(TL.x, TR.x, BR.x, BL.x);\n let right = Math.max(TL.x, TR.x, BR.x, BL.x);\n let bottom = Math.min(TL.y, TR.y, BR.y, BL.y);\n let top = Math.max(TL.y, TR.y, BR.y, BL.y);\n if (left > right) [left, right] = [right, left];\n if (bottom > top) [bottom, top] = [top, bottom];\n\n // Write FS_RECTF in memory order: L, T, R, B\n const ptr = this.memoryManager.malloc(16);\n const pdf = this.pdfiumModule.pdfium;\n pdf.setValue(ptr + 0, left, 'float'); // L\n pdf.setValue(ptr + 4, top, 'float'); // T\n pdf.setValue(ptr + 8, right, 'float'); // R\n pdf.setValue(ptr + 12, bottom, 'float'); // B\n\n const ok = this.pdfiumModule.FPDFAnnot_SetRect(annotPtr, ptr);\n this.memoryManager.free(ptr);\n return !!ok;\n }\n\n /**\n * Read the rectangle of annotation\n * @param annotationPtr - pointer to pdf annotation\n * @returns rectangle of annotation\n *\n * @private\n */\n private readPageAnnoRect(annotationPtr: number) {\n const pageRectPtr = this.memoryManager.malloc(4 * 4);\n const pageRect = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n if (this.pdfiumModule.FPDFAnnot_GetRect(annotationPtr, pageRectPtr)) {\n pageRect.left = this.pdfiumModule.pdfium.getValue(pageRectPtr, 'float');\n pageRect.top = this.pdfiumModule.pdfium.getValue(pageRectPtr + 4, 'float');\n pageRect.right = this.pdfiumModule.pdfium.getValue(pageRectPtr + 8, 'float');\n pageRect.bottom = this.pdfiumModule.pdfium.getValue(pageRectPtr + 12, 'float');\n }\n this.memoryManager.free(pageRectPtr);\n\n return pageRect;\n }\n\n /**\n * Get highlight rects for a specific character range (for search highlighting)\n * @param page - pdf page info\n * @param pagePtr - pointer to pdf page\n * @param textPagePtr - pointer to pdf text page\n * @param startIndex - starting character index\n * @param charCount - number of characters in the range\n * @returns array of rectangles for highlighting the specified character range\n *\n * @private\n */\n private getHighlightRects(\n page: PdfPageObject,\n textPagePtr: number,\n startIndex: number,\n charCount: number,\n ): Rect[] {\n const rectsCount = this.pdfiumModule.FPDFText_CountRects(textPagePtr, startIndex, charCount);\n const highlightRects: Rect[] = [];\n\n // scratch doubles for the page-space rect\n const l = this.memoryManager.malloc(8);\n const t = this.memoryManager.malloc(8);\n const r = this.memoryManager.malloc(8);\n const b = this.memoryManager.malloc(8);\n\n for (let i = 0; i < rectsCount; i++) {\n const ok = this.pdfiumModule.FPDFText_GetRect(textPagePtr, i, l, t, r, b);\n if (!ok) continue;\n\n const left = this.pdfiumModule.pdfium.getValue(l, 'double');\n const top = this.pdfiumModule.pdfium.getValue(t, 'double');\n const right = this.pdfiumModule.pdfium.getValue(r, 'double');\n const bottom = this.pdfiumModule.pdfium.getValue(b, 'double');\n\n // transform all four corners to device space\n const p1 = this.convertPagePointToDevicePoint(page, { x: left, y: top });\n const p2 = this.convertPagePointToDevicePoint(page, { x: right, y: top });\n const p3 = this.convertPagePointToDevicePoint(page, { x: right, y: bottom });\n const p4 = this.convertPagePointToDevicePoint(page, { x: left, y: bottom });\n\n const xs = [p1.x, p2.x, p3.x, p4.x];\n const ys = [p1.y, p2.y, p3.y, p4.y];\n\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n const width = Math.max(...xs) - x;\n const height = Math.max(...ys) - y;\n\n // ceil so highlights fully cover glyphs at integer pixels\n highlightRects.push({\n origin: { x, y },\n size: { width: Math.ceil(width), height: Math.ceil(height) },\n });\n }\n\n this.memoryManager.free(l);\n this.memoryManager.free(t);\n this.memoryManager.free(r);\n this.memoryManager.free(b);\n\n return highlightRects;\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.searchAllPages}\n *\n * Runs inside the worker.\n * Emits per-page progress: { page, results }\n *\n * @public\n */\n searchInPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n keyword: string,\n flags: number,\n ): PdfTask<SearchResult[]> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'searchInPage', doc, page, keyword, flags);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `SearchInPage`, 'Begin', `${doc.id}-${page.index}`);\n // Move keyword allocation inside here\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'Document is not open',\n });\n }\n const length = 2 * (keyword.length + 1);\n const keywordPtr = this.memoryManager.malloc(length);\n this.pdfiumModule.pdfium.stringToUTF16(keyword, keywordPtr, length);\n\n try {\n const results = this.searchAllInPage(ctx, page, keywordPtr, flags);\n return PdfTaskHelper.resolve(results);\n } finally {\n this.memoryManager.free(keywordPtr);\n }\n }\n\n /**\n * Get annotations for multiple pages in a single batch.\n * Emits progress per page for streaming updates.\n *\n * @param doc - PDF document\n * @param pages - Array of pages to process\n * @returns Task with results keyed by page index, with per-page progress\n *\n * @public\n */\n getAnnotationsBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n ): PdfTask<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'getAnnotationsBatch', doc.id, pages.length);\n\n const task = new Task<\n Record<number, PdfAnnotationObject[]>,\n PdfErrorReason,\n BatchProgress<PdfAnnotationObject[]>\n >();\n\n // Defer work to next microtask so caller can set up onProgress listener\n queueMicrotask(() => {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetAnnotationsBatch', 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n task.reject({ code: PdfErrorCode.DocNotOpen, message: 'Document is not open' });\n return;\n }\n\n const results: Record<number, PdfAnnotationObject[]> = {};\n const total = pages.length;\n\n // Process all pages in a tight loop - no queue overhead!\n for (let i = 0; i < pages.length; i++) {\n const page = pages[i];\n const annotations = this.readPageAnnotationsRaw(ctx, page);\n results[page.index] = annotations;\n\n // Stream progress per page\n task.progress({\n pageIndex: page.index,\n result: annotations,\n completed: i + 1,\n total,\n });\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'GetAnnotationsBatch', 'End', doc.id);\n task.resolve(results);\n });\n\n return task;\n }\n\n /**\n * Search across multiple pages in a single batch.\n * Emits progress per page for streaming updates.\n *\n * @param doc - PDF document\n * @param pages - Array of pages to search\n * @param keyword - Search keyword\n * @param flags - Search flags\n * @returns Task with results keyed by page index, with per-page progress\n *\n * @public\n */\n searchBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n keyword: string,\n flags: number,\n ): PdfTask<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>> {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'searchBatch', doc.id, pages.length, keyword);\n\n const task = new Task<\n Record<number, SearchResult[]>,\n PdfErrorReason,\n BatchProgress<SearchResult[]>\n >();\n\n // Defer work to next microtask so caller can set up onProgress listener\n queueMicrotask(() => {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'SearchBatch', 'Begin', doc.id);\n\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n task.reject({ code: PdfErrorCode.DocNotOpen, message: 'Document is not open' });\n return;\n }\n\n // Allocate keyword pointer once for all pages\n const length = 2 * (keyword.length + 1);\n const keywordPtr = this.memoryManager.malloc(length);\n this.pdfiumModule.pdfium.stringToUTF16(keyword, keywordPtr, length);\n\n try {\n const results: Record<number, SearchResult[]> = {};\n const total = pages.length;\n\n // Process all pages in a tight loop - no queue overhead!\n for (let i = 0; i < pages.length; i++) {\n const page = pages[i];\n const pageResults = this.searchAllInPage(ctx, page, keywordPtr, flags);\n results[page.index] = pageResults;\n\n // Stream progress per page\n task.progress({\n pageIndex: page.index,\n result: pageResults,\n completed: i + 1,\n total,\n });\n }\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, 'SearchBatch', 'End', doc.id);\n task.resolve(results);\n } finally {\n this.memoryManager.free(keywordPtr);\n }\n });\n\n return task;\n }\n\n /**\n * Extract word-aligned context for a search hit.\n *\n * @param fullText full UTF-16 page text (fetch this once per page!)\n * @param start index of 1st char that matched\n * @param count number of chars in the match\n * @param windowChars minimum context chars to keep left & right\n */\n private buildContext(\n fullText: string,\n start: number,\n count: number,\n windowChars = 30,\n ): TextContext {\n const WORD_BREAK = /[\\s\\u00A0.,;:!?()\\[\\]{}<>/\\\\\\-\"'`\"”\\u2013\\u2014]/;\n\n // Find the start of a word moving left\n const findWordStart = (index: number): number => {\n while (index > 0 && !WORD_BREAK.test(fullText[index - 1])) index--;\n return index;\n };\n\n // Find the end of a word moving right\n const findWordEnd = (index: number): number => {\n while (index < fullText.length && !WORD_BREAK.test(fullText[index])) index++;\n return index;\n };\n\n // Move left to build context\n let left = start;\n while (left > 0 && WORD_BREAK.test(fullText[left - 1])) left--; // Skip blanks\n let collected = 0;\n while (left > 0 && collected < windowChars) {\n left--;\n if (!WORD_BREAK.test(fullText[left])) collected++;\n }\n left = findWordStart(left);\n\n // Move right to build context\n let right = start + count;\n while (right < fullText.length && WORD_BREAK.test(fullText[right])) right++; // Skip blanks\n collected = 0;\n while (right < fullText.length && collected < windowChars) {\n if (!WORD_BREAK.test(fullText[right])) collected++;\n right++;\n }\n right = findWordEnd(right);\n\n // Compose the context\n const before = fullText.slice(left, start).replace(/\\s+/g, ' ').trimStart();\n const match = fullText.slice(start, start + count);\n const after = fullText\n .slice(start + count, right)\n .replace(/\\s+/g, ' ')\n .trimEnd();\n\n return {\n before: this.tidy(before),\n match: this.tidy(match),\n after: this.tidy(after),\n truncatedLeft: left > 0,\n truncatedRight: right < fullText.length,\n };\n }\n\n /**\n * Tidy the text to remove any non-printable characters and whitespace\n * @param s - text to tidy\n * @returns tidied text\n *\n * @private\n */\n private tidy(s: string): string {\n return (\n s\n /* 1️⃣ join words split by hyphen + U+FFFE + whitespace */\n .replace(/-\\uFFFE\\s*/g, '')\n\n /* 2️⃣ drop any remaining U+FFFE, soft-hyphen, zero-width chars */\n .replace(/[\\uFFFE\\u00AD\\u200B\\u2060\\uFEFF]/g, '')\n\n /* 3️⃣ collapse whitespace so we stay on one line */\n .replace(/\\s+/g, ' ')\n );\n }\n\n /**\n * Search for all occurrences of a keyword on a single page\n * This method efficiently loads the page only once and finds all matches\n *\n * @param docPtr - pointer to pdf document\n * @param page - pdf page object\n * @param pageIndex - index of the page\n * @param keywordPtr - pointer to the search keyword\n * @param flag - search flags\n * @returns array of search results on this page\n *\n * @private\n */\n private searchAllInPage(\n ctx: DocumentContext,\n page: PdfPageObject,\n keywordPtr: number,\n flag: number,\n ): SearchResult[] {\n return ctx.borrowPage(page.index, (pageCtx) => {\n const textPagePtr = pageCtx.getTextPage();\n\n // Load the full text of the page once\n const total = this.pdfiumModule.FPDFText_CountChars(textPagePtr);\n const bufPtr = this.memoryManager.malloc(2 * (total + 1));\n this.pdfiumModule.FPDFText_GetText(textPagePtr, 0, total, bufPtr);\n const fullText = this.pdfiumModule.pdfium.UTF16ToString(bufPtr);\n this.memoryManager.free(bufPtr);\n\n const pageResults: SearchResult[] = [];\n\n // Initialize search handle once for the page\n const searchHandle = this.pdfiumModule.FPDFText_FindStart(\n textPagePtr,\n keywordPtr,\n flag,\n 0, // Start from the beginning of the page\n );\n\n // Call FindNext repeatedly to get all matches on the page\n while (this.pdfiumModule.FPDFText_FindNext(searchHandle)) {\n const charIndex = this.pdfiumModule.FPDFText_GetSchResultIndex(searchHandle);\n const charCount = this.pdfiumModule.FPDFText_GetSchCount(searchHandle);\n\n const rects = this.getHighlightRects(page, textPagePtr, charIndex, charCount);\n\n const context = this.buildContext(fullText, charIndex, charCount);\n\n pageResults.push({\n pageIndex: page.index,\n charIndex,\n charCount,\n rects,\n context,\n });\n }\n\n // Close the search handle only once after finding all results\n this.pdfiumModule.FPDFText_FindClose(searchHandle);\n return pageResults;\n });\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.preparePrintDocument}\n *\n * Prepares a PDF document for printing with specified options.\n * Creates a new document with selected pages and optionally removes annotations\n * for optimal printing performance.\n *\n * @public\n */\n preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer> {\n const { includeAnnotations = true, pageRange = null } = options ?? {};\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'preparePrintDocument', doc, options);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'Begin', doc.id);\n\n // Verify document is open\n const ctx = this.cache.getContext(doc.id);\n if (!ctx) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'Document is not open',\n });\n }\n\n // Create new document for printing\n const printDocPtr = this.pdfiumModule.FPDF_CreateNewDocument();\n if (!printDocPtr) {\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantCreateNewDoc,\n message: 'Cannot create print document',\n });\n }\n\n try {\n // Validate and sanitize page range\n const sanitizedPageRange = this.sanitizePageRange(pageRange, doc.pageCount);\n\n // Import pages from source document\n // pageRange null means import all pages\n if (\n !this.pdfiumModule.FPDF_ImportPages(\n printDocPtr,\n ctx.docPtr,\n sanitizedPageRange ?? '',\n 0, // Insert at beginning\n )\n ) {\n this.pdfiumModule.FPDF_CloseDocument(printDocPtr);\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'Failed to import pages for printing');\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.CantImportPages,\n message: 'Failed to import pages for printing',\n });\n }\n\n // Remove annotations if requested\n if (!includeAnnotations) {\n const removalResult = this.removeAnnotationsFromPrintDocument(printDocPtr);\n\n if (!removalResult.success) {\n this.pdfiumModule.FPDF_CloseDocument(printDocPtr);\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Failed to remove annotations: ${removalResult.error}`,\n );\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: `Failed to prepare print document: ${removalResult.error}`,\n });\n }\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Removed ${removalResult.annotationsRemoved} annotations from ${removalResult.pagesProcessed} pages`,\n );\n }\n\n // Save the prepared document to buffer\n const buffer = this.saveDocument(printDocPtr);\n\n // Clean up\n this.pdfiumModule.FPDF_CloseDocument(printDocPtr);\n\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n return PdfTaskHelper.resolve(buffer);\n } catch (error) {\n // Ensure cleanup on any error\n if (printDocPtr) {\n this.pdfiumModule.FPDF_CloseDocument(printDocPtr);\n }\n\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'preparePrintDocument failed', error);\n this.logger.perf(LOG_SOURCE, LOG_CATEGORY, `PreparePrintDocument`, 'End', doc.id);\n\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: error instanceof Error ? error.message : 'Failed to prepare print document',\n });\n }\n }\n\n /**\n * Removes all annotations from a print document using fast raw annotation functions.\n * This method is optimized for performance by avoiding full page loading.\n *\n * @param printDocPtr - Pointer to the print document\n * @returns Result object with success status and statistics\n *\n * @private\n */\n private removeAnnotationsFromPrintDocument(printDocPtr: number): {\n success: boolean;\n annotationsRemoved: number;\n pagesProcessed: number;\n error?: string;\n } {\n let totalAnnotationsRemoved = 0;\n let pagesProcessed = 0;\n\n try {\n const pageCount = this.pdfiumModule.FPDF_GetPageCount(printDocPtr);\n\n // Process each page\n for (let pageIndex = 0; pageIndex < pageCount; pageIndex++) {\n // Get annotation count using the fast raw function\n const annotCount = this.pdfiumModule.EPDFPage_GetAnnotCountRaw(printDocPtr, pageIndex);\n\n if (annotCount <= 0) {\n pagesProcessed++;\n continue;\n }\n\n // Remove annotations in reverse order to maintain indices\n // This is important because removing an annotation shifts the indices of subsequent ones\n let annotationsRemovedFromPage = 0;\n\n for (let annotIndex = annotCount - 1; annotIndex >= 0; annotIndex--) {\n // Use the fast raw removal function\n const removed = this.pdfiumModule.EPDFPage_RemoveAnnotRaw(\n printDocPtr,\n pageIndex,\n annotIndex,\n );\n\n if (removed) {\n annotationsRemovedFromPage++;\n totalAnnotationsRemoved++;\n } else {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Failed to remove annotation ${annotIndex} from page ${pageIndex}`,\n );\n }\n }\n\n // Generate content for the page if annotations were removed\n if (annotationsRemovedFromPage > 0) {\n // We need to regenerate the page content after removing annotations\n const pagePtr = this.pdfiumModule.FPDF_LoadPage(printDocPtr, pageIndex);\n if (pagePtr) {\n this.pdfiumModule.FPDFPage_GenerateContent(pagePtr);\n this.pdfiumModule.FPDF_ClosePage(pagePtr);\n }\n }\n\n pagesProcessed++;\n }\n\n return {\n success: true,\n annotationsRemoved: totalAnnotationsRemoved,\n pagesProcessed: pagesProcessed,\n };\n } catch (error) {\n return {\n success: false,\n annotationsRemoved: totalAnnotationsRemoved,\n pagesProcessed: pagesProcessed,\n error: error instanceof Error ? error.message : 'Unknown error during annotation removal',\n };\n }\n }\n\n /**\n * Sanitizes and validates a page range string.\n * Ensures page numbers are within valid bounds and properly formatted.\n *\n * @param pageRange - Page range string (e.g., \"1,3,5-7\") or null for all pages\n * @param totalPages - Total number of pages in the document\n * @returns Sanitized page range string or null for all pages\n *\n * @private\n */\n private sanitizePageRange(\n pageRange: string | null | undefined,\n totalPages: number,\n ): string | null {\n // Null or empty means all pages\n if (!pageRange || pageRange.trim() === '') {\n return null;\n }\n\n try {\n const sanitized: number[] = [];\n const parts = pageRange.split(',');\n\n for (const part of parts) {\n const trimmed = part.trim();\n\n if (trimmed.includes('-')) {\n // Handle range (e.g., \"5-7\")\n const [startStr, endStr] = trimmed.split('-').map((s) => s.trim());\n const start = parseInt(startStr, 10);\n const end = parseInt(endStr, 10);\n\n if (isNaN(start) || isNaN(end)) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, `Invalid range: ${trimmed}`);\n continue;\n }\n\n // Clamp to valid bounds (1-based page numbers)\n const validStart = Math.max(1, Math.min(start, totalPages));\n const validEnd = Math.max(1, Math.min(end, totalPages));\n\n // Add all pages in range\n for (let i = validStart; i <= validEnd; i++) {\n if (!sanitized.includes(i)) {\n sanitized.push(i);\n }\n }\n } else {\n // Handle single page number\n const pageNum = parseInt(trimmed, 10);\n\n if (isNaN(pageNum)) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, `Invalid page number: ${trimmed}`);\n continue;\n }\n\n // Clamp to valid bounds\n const validPageNum = Math.max(1, Math.min(pageNum, totalPages));\n\n if (!sanitized.includes(validPageNum)) {\n sanitized.push(validPageNum);\n }\n }\n }\n\n // If no valid pages found, return null (all pages)\n if (sanitized.length === 0) {\n this.logger.warn(LOG_SOURCE, LOG_CATEGORY, 'No valid pages in range, using all pages');\n return null;\n }\n\n // Sort and convert back to range string\n sanitized.sort((a, b) => a - b);\n\n // Optimize consecutive pages into ranges\n const optimized: string[] = [];\n let rangeStart = sanitized[0];\n let rangeEnd = sanitized[0];\n\n for (let i = 1; i < sanitized.length; i++) {\n if (sanitized[i] === rangeEnd + 1) {\n rangeEnd = sanitized[i];\n } else {\n // End current range\n if (rangeStart === rangeEnd) {\n optimized.push(rangeStart.toString());\n } else if (rangeEnd - rangeStart === 1) {\n optimized.push(rangeStart.toString());\n optimized.push(rangeEnd.toString());\n } else {\n optimized.push(`${rangeStart}-${rangeEnd}`);\n }\n\n // Start new range\n rangeStart = sanitized[i];\n rangeEnd = sanitized[i];\n }\n }\n\n // Add final range\n if (rangeStart === rangeEnd) {\n optimized.push(rangeStart.toString());\n } else if (rangeEnd - rangeStart === 1) {\n optimized.push(rangeStart.toString());\n optimized.push(rangeEnd.toString());\n } else {\n optimized.push(`${rangeStart}-${rangeEnd}`);\n }\n\n const result = optimized.join(',');\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Sanitized page range: \"${pageRange}\" -> \"${result}\"`,\n );\n\n return result;\n } catch (error) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, `Error sanitizing page range: ${error}`);\n return null; // Fallback to all pages\n }\n }\n}\n","import { Logger } from '@embedpdf/models';\nimport { init } from '@embedpdf/pdfium';\nimport { PdfiumNative } from '../engine';\nimport { PdfEngine } from '../../orchestrator/pdf-engine';\nimport { browserImageDataToBlobConverter } from '../../converters/browser';\n\nexport interface CreatePdfiumEngineOptions {\n /**\n * Logger instance for debugging\n */\n logger?: Logger;\n /**\n * Number of workers in the image encoder pool (default: 0 - disabled)\n * Set to 2-4 for optimal performance with parallel encoding\n */\n encoderPoolSize?: number;\n}\n\n/**\n * Create a PDFium engine running directly in the main thread\n *\n * This is the \"direct\" mode where PDFium runs in the main thread.\n * The PdfEngine orchestrator still provides priority-based task scheduling.\n *\n * @param wasmUrl - URL to the pdfium.wasm file\n * @param options - Configuration options\n *\n * @example\n * // Basic usage\n * const engine = await createPdfiumEngine('/wasm/pdfium.wasm', { logger });\n *\n * @example\n * // With encoder pool for parallel image encoding\n * const engine = await createPdfiumEngine('/wasm/pdfium.wasm', {\n * logger,\n * encoderPoolSize: 2\n * });\n */\nexport async function createPdfiumEngine(\n wasmUrl: string,\n options?: CreatePdfiumEngineOptions,\n): Promise<PdfEngine<Blob>> {\n const response = await fetch(wasmUrl);\n const wasmBinary = await response.arrayBuffer();\n const wasmModule = await init({ wasmBinary });\n\n // Create the \"dumb\" executor (initializes PDFium in constructor)\n const native = new PdfiumNative(wasmModule, { logger: options?.logger });\n\n // Create the \"smart\" orchestrator\n return new PdfEngine<Blob>(native, {\n imageConverter: browserImageDataToBlobConverter,\n logger: options?.logger,\n });\n}\n"],"names":["LOG_SOURCE","LOG_CATEGORY","BitmapFormat","RenderFlag","PdfiumErrorCode","ok","text","file","bytesCount"],"mappings":"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"}