pdfnova 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -0
- package/dist/AnnotationReader-ADHPZ3V5.mjs +3 -0
- package/dist/AnnotationReader-ADHPZ3V5.mjs.map +1 -0
- package/dist/AnnotationReader-C5XLXGWS.cjs +12 -0
- package/dist/AnnotationReader-C5XLXGWS.cjs.map +1 -0
- package/dist/AnnotationWriter-N3Y4KTPI.cjs +12 -0
- package/dist/AnnotationWriter-N3Y4KTPI.cjs.map +1 -0
- package/dist/AnnotationWriter-XWY5N6AZ.mjs +3 -0
- package/dist/AnnotationWriter-XWY5N6AZ.mjs.map +1 -0
- package/dist/FormFiller-2O4MOQYV.cjs +12 -0
- package/dist/FormFiller-2O4MOQYV.cjs.map +1 -0
- package/dist/FormFiller-6DLWMRN5.mjs +3 -0
- package/dist/FormFiller-6DLWMRN5.mjs.map +1 -0
- package/dist/FormFlattener-5MWLLH7W.cjs +12 -0
- package/dist/FormFlattener-5MWLLH7W.cjs.map +1 -0
- package/dist/FormFlattener-YQRQ3QOY.mjs +3 -0
- package/dist/FormFlattener-YQRQ3QOY.mjs.map +1 -0
- package/dist/FormReader-QAEDFD77.cjs +13 -0
- package/dist/FormReader-QAEDFD77.cjs.map +1 -0
- package/dist/FormReader-XEF3T5LD.mjs +4 -0
- package/dist/FormReader-XEF3T5LD.mjs.map +1 -0
- package/dist/SignatureVerifier-2IR7UQGU.mjs +3 -0
- package/dist/SignatureVerifier-2IR7UQGU.mjs.map +1 -0
- package/dist/SignatureVerifier-4KWQA7X6.cjs +12 -0
- package/dist/SignatureVerifier-4KWQA7X6.cjs.map +1 -0
- package/dist/WasmMock-2I3GVRQF.mjs +397 -0
- package/dist/WasmMock-2I3GVRQF.mjs.map +1 -0
- package/dist/WasmMock-OYPV4J6B.cjs +399 -0
- package/dist/WasmMock-OYPV4J6B.cjs.map +1 -0
- package/dist/chunk-2OWW5BYD.mjs +1847 -0
- package/dist/chunk-2OWW5BYD.mjs.map +1 -0
- package/dist/chunk-2YFCKMVK.cjs +72 -0
- package/dist/chunk-2YFCKMVK.cjs.map +1 -0
- package/dist/chunk-7FGOUG4Z.cjs +51 -0
- package/dist/chunk-7FGOUG4Z.cjs.map +1 -0
- package/dist/chunk-CPMUWWNS.cjs +44 -0
- package/dist/chunk-CPMUWWNS.cjs.map +1 -0
- package/dist/chunk-DVMAQ62T.cjs +109 -0
- package/dist/chunk-DVMAQ62T.cjs.map +1 -0
- package/dist/chunk-ETSUOY4U.cjs +104 -0
- package/dist/chunk-ETSUOY4U.cjs.map +1 -0
- package/dist/chunk-FD5RTJ5W.mjs +60 -0
- package/dist/chunk-FD5RTJ5W.mjs.map +1 -0
- package/dist/chunk-FO3DQLVB.mjs +42 -0
- package/dist/chunk-FO3DQLVB.mjs.map +1 -0
- package/dist/chunk-G2FA6VKV.cjs +62 -0
- package/dist/chunk-G2FA6VKV.cjs.map +1 -0
- package/dist/chunk-G7575D5X.mjs +67 -0
- package/dist/chunk-G7575D5X.mjs.map +1 -0
- package/dist/chunk-I7OBHZLB.mjs +75 -0
- package/dist/chunk-I7OBHZLB.mjs.map +1 -0
- package/dist/chunk-INA3KRJK.cjs +1863 -0
- package/dist/chunk-INA3KRJK.cjs.map +1 -0
- package/dist/chunk-RZFKZ2CA.cjs +77 -0
- package/dist/chunk-RZFKZ2CA.cjs.map +1 -0
- package/dist/chunk-VRJQZOCH.mjs +107 -0
- package/dist/chunk-VRJQZOCH.mjs.map +1 -0
- package/dist/chunk-X53667JS.mjs +102 -0
- package/dist/chunk-X53667JS.mjs.map +1 -0
- package/dist/chunk-XEHKVFPJ.mjs +49 -0
- package/dist/chunk-XEHKVFPJ.mjs.map +1 -0
- package/dist/index.cjs +112 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +103 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.mjs +14 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lite-CMz-Yosm.d.cts +662 -0
- package/dist/lite-CMz-Yosm.d.ts +662 -0
- package/dist/lite.cjs +70 -0
- package/dist/lite.cjs.map +1 -0
- package/dist/lite.d.cts +1 -0
- package/dist/lite.d.ts +1 -0
- package/dist/lite.mjs +8 -0
- package/dist/lite.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/WasmLoader.ts","../src/text/TextExtractor.ts","../src/text/TextLayerBuilder.ts","../src/text/SearchEngine.ts","../src/navigation/LinkExtractor.ts","../src/capabilities.ts","../src/core/MemoryManager.ts","../src/document/PDFPage.ts","../src/navigation/OutlineExtractor.ts","../src/core/WasmBridge.ts","../src/document/PDFDocument.ts","../src/document/PageRenderer.ts","../src/document/VirtualRenderer.ts","../src/worker/PDFWorker.ts","../src/worker/WorkerPool.ts"],"names":["RENDER_FLAG"],"mappings":"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","file":"chunk-INA3KRJK.cjs","sourcesContent":["import type { WasmModule, WasmTier } from '../types';\n\nconst PDFIUM_WASM_CDN = 'https://cdn.jsdelivr.net/npm/@embedpdf/pdfium@2/dist/pdfium.wasm';\nconst IDB_NAME = 'pdfnova-cache';\nconst IDB_STORE = 'wasm';\nconst IDB_KEY = 'pdfium-binary';\n\nlet wasmInstance: WasmModule | null = null;\nlet initPromise: Promise<WasmModule> | null = null;\nlet forceMock = false;\n\nexport class WasmLoader {\n static async load(options?: { wasmUrl?: string; tier?: WasmTier }): Promise<WasmModule> {\n if (wasmInstance) return wasmInstance;\n if (initPromise) return initPromise;\n\n initPromise = WasmLoader._doLoad(options);\n wasmInstance = await initPromise;\n return wasmInstance;\n }\n\n static isLoaded(): boolean {\n return wasmInstance !== null;\n }\n\n static getInstance(): WasmModule | null {\n return wasmInstance;\n }\n\n static reset(): void {\n if (wasmInstance) {\n try { wasmInstance._FPDF_DestroyLibrary(); } catch { /* already destroyed */ }\n }\n wasmInstance = null;\n initPromise = null;\n }\n\n /** Force mock mode (for unit tests in non-browser environments). */\n static enableMock(): void { forceMock = true; }\n static disableMock(): void { forceMock = false; }\n\n /** Clear the cached WASM binary from IndexedDB. */\n static async clearCache(): Promise<void> {\n try {\n const db = await WasmLoader._openIDB();\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(IDB_KEY);\n await new Promise<void>((res, rej) => { tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); });\n db.close();\n } catch { /* IndexedDB not available or failed — ignore */ }\n }\n\n private static async _doLoad(options?: { wasmUrl?: string; tier?: WasmTier }): Promise<WasmModule> {\n if (forceMock || !WasmLoader._canLoadWasm()) {\n const { createMockModule } = await import('./WasmMock');\n return createMockModule();\n }\n\n return WasmLoader._loadRealPdfium(options);\n }\n\n private static _canLoadWasm(): boolean {\n return typeof globalThis.WebAssembly !== 'undefined' &&\n typeof globalThis.fetch === 'function' &&\n typeof globalThis.document !== 'undefined';\n }\n\n private static async _loadRealPdfium(options?: { wasmUrl?: string; tier?: WasmTier }): Promise<WasmModule> {\n const wasmUrl = options?.wasmUrl ?? PDFIUM_WASM_CDN;\n const { init } = await import('@embedpdf/pdfium');\n\n let wasmBinary = await WasmLoader._loadFromCache();\n\n if (!wasmBinary) {\n const response = await fetch(wasmUrl);\n if (!response.ok) throw new Error(`Failed to fetch PDFium WASM: ${response.status}`);\n wasmBinary = await response.arrayBuffer();\n WasmLoader._saveToCache(wasmBinary).catch(() => {});\n }\n\n const wrapped = await init({ wasmBinary } as any);\n wrapped.PDFiumExt_Init();\n\n return WasmLoader._adaptModule(wrapped);\n }\n\n // ─── IndexedDB WASM cache ────────────────────────────────────\n\n private static async _openIDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => { req.result.createObjectStore(IDB_STORE); };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n\n private static async _loadFromCache(): Promise<ArrayBuffer | null> {\n try {\n if (typeof indexedDB === 'undefined') return null;\n const db = await WasmLoader._openIDB();\n const tx = db.transaction(IDB_STORE, 'readonly');\n const req = tx.objectStore(IDB_STORE).get(IDB_KEY);\n const result = await new Promise<ArrayBuffer | null>((res, rej) => {\n req.onsuccess = () => res(req.result ?? null);\n req.onerror = () => rej(req.error);\n });\n db.close();\n return result;\n } catch {\n return null;\n }\n }\n\n private static async _saveToCache(binary: ArrayBuffer): Promise<void> {\n try {\n if (typeof indexedDB === 'undefined') return;\n const db = await WasmLoader._openIDB();\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).put(binary, IDB_KEY);\n await new Promise<void>((res, rej) => { tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); });\n db.close();\n } catch { /* best-effort caching */ }\n }\n\n /**\n * Adapts an @embedpdf/pdfium WrappedPdfiumModule to our WasmModule interface.\n * Uses cwrap with all-number signatures for raw C-level pointer-based access,\n * matching the interface that WasmBridge and all downstream code expects.\n */\n private static _adaptModule(wrapped: any): WasmModule {\n const raw = wrapped.pdfium;\n const cw = (name: string, ret: string | null, args: string[]) =>\n raw.cwrap(name, ret, args);\n\n const module: WasmModule = {\n get HEAPU8() { return raw.HEAPU8; },\n get HEAPU32() { return raw.HEAPU32; },\n get HEAP32() { return raw.HEAP32; },\n get HEAPF32() { return raw.HEAPF32; },\n get HEAPF64() { return raw.HEAPF64; },\n\n _malloc: raw.wasmExports.malloc,\n _free: raw.wasmExports.free,\n\n // PDFiumExt_Init already called — this is a no-op\n _FPDF_InitLibraryWithConfig: () => {},\n _FPDF_DestroyLibrary: cw('FPDF_DestroyLibrary', null, []),\n _FPDF_LoadMemDocument: cw('FPDF_LoadMemDocument', 'number', ['number', 'number', 'number']),\n _FPDF_CloseDocument: cw('FPDF_CloseDocument', null, ['number']),\n _FPDF_GetLastError: cw('FPDF_GetLastError', 'number', []),\n _FPDF_GetPageCount: cw('FPDF_GetPageCount', 'number', ['number']),\n\n _FPDF_LoadPage: cw('FPDF_LoadPage', 'number', ['number', 'number']),\n _FPDF_ClosePage: cw('FPDF_ClosePage', null, ['number']),\n _FPDF_GetPageWidthF: cw('FPDF_GetPageWidthF', 'number', ['number']),\n _FPDF_GetPageHeightF: cw('FPDF_GetPageHeightF', 'number', ['number']),\n\n _FPDFBitmap_Create: cw('FPDFBitmap_Create', 'number', ['number', 'number', 'number']),\n _FPDFBitmap_FillRect: cw('FPDFBitmap_FillRect', null, ['number', 'number', 'number', 'number', 'number', 'number']),\n _FPDFBitmap_GetBuffer: cw('FPDFBitmap_GetBuffer', 'number', ['number']),\n _FPDFBitmap_GetStride: cw('FPDFBitmap_GetStride', 'number', ['number']),\n _FPDFBitmap_Destroy: cw('FPDFBitmap_Destroy', null, ['number']),\n _FPDF_RenderPageBitmap: cw('FPDF_RenderPageBitmap', null, ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number']),\n\n _FPDFText_LoadPage: cw('FPDFText_LoadPage', 'number', ['number']),\n _FPDFText_ClosePage: cw('FPDFText_ClosePage', null, ['number']),\n _FPDFText_CountChars: cw('FPDFText_CountChars', 'number', ['number']),\n _FPDFText_GetUnicode: cw('FPDFText_GetUnicode', 'number', ['number', 'number']),\n _FPDFText_GetFontSize: cw('FPDFText_GetFontSize', 'number', ['number', 'number']),\n _FPDFText_GetCharBox: cw('FPDFText_GetCharBox', 'number', ['number', 'number', 'number', 'number', 'number', 'number']),\n _FPDFText_GetText: cw('FPDFText_GetText', 'number', ['number', 'number', 'number', 'number']),\n _FPDFText_FindStart: cw('FPDFText_FindStart', 'number', ['number', 'number', 'number', 'number']),\n _FPDFText_FindNext: cw('FPDFText_FindNext', 'number', ['number']),\n _FPDFText_FindClose: cw('FPDFText_FindClose', null, ['number']),\n _FPDFText_GetSchResultIndex: cw('FPDFText_GetSchResultIndex', 'number', ['number']),\n _FPDFText_GetSchCount: cw('FPDFText_GetSchCount', 'number', ['number']),\n _FPDFText_CountRects: cw('FPDFText_CountRects', 'number', ['number', 'number', 'number']),\n _FPDFText_GetRect: cw('FPDFText_GetRect', 'number', ['number', 'number', 'number', 'number', 'number', 'number']),\n\n _FPDF_GetMetaText: cw('FPDF_GetMetaText', 'number', ['number', 'number', 'number', 'number']),\n\n _FPDFBookmark_GetFirstChild: cw('FPDFBookmark_GetFirstChild', 'number', ['number', 'number']),\n _FPDFBookmark_GetNextSibling: cw('FPDFBookmark_GetNextSibling', 'number', ['number', 'number']),\n _FPDFBookmark_GetTitle: cw('FPDFBookmark_GetTitle', 'number', ['number', 'number', 'number']),\n _FPDFBookmark_GetAction: cw('FPDFBookmark_GetAction', 'number', ['number']),\n _FPDFBookmark_GetDest: cw('FPDFBookmark_GetDest', 'number', ['number', 'number']),\n _FPDFDest_GetDestPageIndex: cw('FPDFDest_GetDestPageIndex', 'number', ['number', 'number']),\n\n _FPDFLink_LoadWebLinks: cw('FPDFLink_LoadWebLinks', 'number', ['number']),\n _FPDFLink_CountWebLinks: cw('FPDFLink_CountWebLinks', 'number', ['number']),\n _FPDFLink_GetURL: cw('FPDFLink_GetURL', 'number', ['number', 'number', 'number', 'number']),\n _FPDFLink_CountRects: cw('FPDFLink_CountRects', 'number', ['number', 'number']),\n _FPDFLink_GetRect: cw('FPDFLink_GetRect', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number']),\n _FPDFLink_CloseWebLinks: cw('FPDFLink_CloseWebLinks', null, ['number']),\n\n // Full-tier: annotations\n _FPDFPage_GetAnnotCount: cw('FPDFPage_GetAnnotCount', 'number', ['number']),\n _FPDFPage_GetAnnot: cw('FPDFPage_GetAnnot', 'number', ['number', 'number']),\n _FPDFPage_CreateAnnot: cw('FPDFPage_CreateAnnot', 'number', ['number', 'number']),\n _FPDFPage_RemoveAnnot: cw('FPDFPage_RemoveAnnot', 'number', ['number', 'number']),\n _FPDFAnnot_GetSubtype: cw('FPDFAnnot_GetSubtype', 'number', ['number']),\n _FPDFAnnot_GetRect: cw('FPDFAnnot_GetRect', 'number', ['number', 'number']),\n _FPDFAnnot_SetRect: cw('FPDFAnnot_SetRect', 'number', ['number', 'number']),\n _FPDFAnnot_GetColor: cw('FPDFAnnot_GetColor', 'number', ['number', 'number', 'number', 'number', 'number', 'number']),\n _FPDFAnnot_SetColor: cw('FPDFAnnot_SetColor', 'number', ['number', 'number', 'number', 'number', 'number', 'number']),\n _FPDFAnnot_GetStringValue: cw('FPDFAnnot_GetStringValue', 'number', ['number', 'number', 'number', 'number']),\n _FPDFAnnot_SetStringValue: cw('FPDFAnnot_SetStringValue', 'number', ['number', 'number', 'number']),\n _FPDFAnnot_AppendAttachmentPoints: cw('FPDFAnnot_AppendAttachmentPoints', 'number', ['number', 'number']),\n _FPDFAnnot_CountAttachmentPoints: cw('FPDFAnnot_CountAttachmentPoints', 'number', ['number']),\n _FPDFAnnot_GetAttachmentPoints: cw('FPDFAnnot_GetAttachmentPoints', 'number', ['number', 'number', 'number']),\n _FPDFPage_CloseAnnot: cw('FPDFPage_CloseAnnot', null, ['number']),\n\n // Full-tier: forms\n _FPDFDOC_InitFormFillEnvironment: cw('FPDFDOC_InitFormFillEnvironment', 'number', ['number', 'number']),\n _FPDFDOC_ExitFormFillEnvironment: cw('FPDFDOC_ExitFormFillEnvironment', null, ['number']),\n _FPDF_GetFormType: cw('FPDF_GetFormType', 'number', ['number']),\n _FPDFPage_HasFormFieldAtPoint: cw('FPDFPage_HasFormFieldAtPoint', 'number', ['number', 'number', 'number', 'number']),\n _FORM_OnMouseMove: cw('FORM_OnMouseMove', 'number', ['number', 'number', 'number', 'number', 'number']),\n\n _FPDFAnnot_GetFormFieldType: cw('FPDFAnnot_GetFormFieldType', 'number', ['number', 'number']),\n _FPDFAnnot_GetFormFieldName: cw('FPDFAnnot_GetFormFieldName', 'number', ['number', 'number', 'number', 'number']),\n _FPDFAnnot_GetFormFieldValue: cw('FPDFAnnot_GetFormFieldValue', 'number', ['number', 'number', 'number', 'number']),\n _FPDFAnnot_SetFormFieldValue: cw('FPDFAnnot_SetFormFieldValue', null, ['number', 'number', 'number']),\n _FPDFAnnot_GetFormFieldFlags: cw('FPDFAnnot_GetFormFieldFlags', 'number', ['number', 'number']),\n _FPDFAnnot_IsChecked: cw('FPDFAnnot_IsChecked', 'number', ['number', 'number']),\n\n _FPDFPage_Flatten: cw('FPDFPage_Flatten', 'number', ['number', 'number']),\n\n _FPDF_SaveAsCopy: cw('FPDF_SaveAsCopy', 'number', ['number', 'number', 'number']),\n _FPDF_SaveWithVersion: cw('FPDF_SaveWithVersion', 'number', ['number', 'number', 'number', 'number']),\n\n // Full-tier: signatures (note: real PDFium uses FPDFSignatureObj, our interface uses FPDFSignObj)\n _FPDF_GetSignatureCount: cw('FPDF_GetSignatureCount', 'number', ['number']),\n _FPDF_GetSignatureObject: cw('FPDF_GetSignatureObject', 'number', ['number', 'number']),\n _FPDFSignObj_GetContents: cw('FPDFSignatureObj_GetContents', 'number', ['number', 'number', 'number']),\n _FPDFSignObj_GetByteRange: cw('FPDFSignatureObj_GetByteRange', 'number', ['number', 'number', 'number']),\n _FPDFSignObj_GetSubFilter: cw('FPDFSignatureObj_GetSubFilter', 'number', ['number', 'number', 'number']),\n _FPDFSignObj_GetReason: cw('FPDFSignatureObj_GetReason', 'number', ['number', 'number', 'number']),\n _FPDFSignObj_GetTime: cw('FPDFSignatureObj_GetTime', 'number', ['number', 'number', 'number']),\n _FPDFSignObj_GetDocMDPPermission: cw('FPDFSignatureObj_GetDocMDPPermission', 'number', ['number']),\n\n // Emscripten utilities\n UTF8ToString: raw.UTF8ToString.bind(raw),\n UTF16ToString: raw.UTF16ToString.bind(raw),\n stringToUTF8: raw.stringToUTF8.bind(raw),\n stringToUTF16: raw.stringToUTF16.bind(raw),\n lengthBytesUTF8: (str: string) => new TextEncoder().encode(str).length,\n lengthBytesUTF16: (str: string) => str.length * 2,\n };\n\n return module;\n }\n}\n","import type { WasmModule, TextSpan, CharBox } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Extracts text content from a PDF page with character-level bounding boxes.\n * Uses FPDFText_* APIs for precise glyph positioning.\n */\nexport class TextExtractor {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n extractText(textPagePtr: number): string {\n const charCount = this.wasm._FPDFText_CountChars(textPagePtr);\n if (charCount <= 0) return '';\n\n const bufSize = (charCount + 1) * 2;\n const buf = this.wasm._malloc(bufSize);\n this.wasm._FPDFText_GetText(textPagePtr, 0, charCount, buf);\n const text = this.bridge.readUTF16String(buf);\n this.wasm._free(buf);\n\n return text;\n }\n\n extractCharBoxes(textPagePtr: number): CharBox[] {\n const charCount = this.wasm._FPDFText_CountChars(textPagePtr);\n if (charCount <= 0) return [];\n\n const leftPtr = this.bridge.allocateF64();\n const rightPtr = this.bridge.allocateF64();\n const bottomPtr = this.bridge.allocateF64();\n const topPtr = this.bridge.allocateF64();\n\n const boxes: CharBox[] = [];\n\n try {\n for (let i = 0; i < charCount; i++) {\n const unicode = this.wasm._FPDFText_GetUnicode(textPagePtr, i);\n if (unicode === 0) continue;\n\n const result = this.wasm._FPDFText_GetCharBox(\n textPagePtr, i,\n leftPtr, rightPtr, bottomPtr, topPtr,\n );\n\n if (result) {\n boxes.push({\n char: String.fromCodePoint(unicode),\n charCode: unicode,\n left: this.bridge.readF64(leftPtr),\n right: this.bridge.readF64(rightPtr),\n bottom: this.bridge.readF64(bottomPtr),\n top: this.bridge.readF64(topPtr),\n fontSize: this.wasm._FPDFText_GetFontSize(textPagePtr, i),\n index: i,\n });\n }\n }\n } finally {\n this.bridge.freeAll(leftPtr, rightPtr, bottomPtr, topPtr);\n }\n\n return boxes;\n }\n\n /**\n * Groups consecutive characters into text spans based on spatial proximity\n * and font size. Spans represent logical \"words\" or \"runs\" of text.\n */\n extractSpans(textPagePtr: number): TextSpan[] {\n const boxes = this.extractCharBoxes(textPagePtr);\n if (boxes.length === 0) return [];\n\n const spans: TextSpan[] = [];\n let currentSpan: TextSpan | null = null;\n\n for (const box of boxes) {\n const isWhitespace = /\\s/.test(box.char);\n\n if (!currentSpan || isWhitespace || !this._isContinuation(currentSpan, box)) {\n if (currentSpan && currentSpan.text.trim()) {\n spans.push(currentSpan);\n }\n\n if (isWhitespace) {\n currentSpan = null;\n continue;\n }\n\n currentSpan = {\n text: box.char,\n x: box.left,\n y: box.bottom,\n width: box.right - box.left,\n height: box.top - box.bottom,\n fontSize: box.fontSize,\n charIndex: box.index,\n charCount: 1,\n };\n } else {\n currentSpan.text += box.char;\n currentSpan.width = box.right - currentSpan.x;\n currentSpan.height = Math.max(currentSpan.height, box.top - box.bottom);\n currentSpan.charCount++;\n }\n }\n\n if (currentSpan && currentSpan.text.trim()) {\n spans.push(currentSpan);\n }\n\n return spans;\n }\n\n private _isContinuation(span: TextSpan, box: CharBox): boolean {\n const sameBaseline = Math.abs((span.y) - box.bottom) < span.fontSize * 0.5;\n const sameFontSize = Math.abs(span.fontSize - box.fontSize) < 0.5;\n const horizontalGap = box.left - (span.x + span.width);\n const maxGap = span.fontSize * 0.5;\n\n return sameBaseline && sameFontSize && horizontalGap < maxGap && horizontalGap > -span.fontSize * 0.3;\n }\n}\n","import type { WasmModule, CharBox, TextSpan } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\nimport { TextExtractor } from './TextExtractor';\n\n/**\n * Generates a positioned DOM text layer over a rendered PDF page.\n * Uses character-level bounding boxes for pixel-perfect text selection and copy-paste.\n */\nexport class TextLayerBuilder {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n /**\n * Build a text layer DOM structure inside the given container.\n * Spans are absolutely positioned to match the rendered PDF pixels.\n *\n * @param textPagePtr - PDFium text page handle\n * @param container - DOM element to append text layer into\n * @param pageWidth - PDF page width in points\n * @param pageHeight - PDF page height in points\n * @param scale - Rendering scale factor (default 1.0)\n */\n build(\n textPagePtr: number,\n container: HTMLElement,\n pageWidth: number,\n pageHeight: number,\n scale: number = 1.0,\n ): HTMLElement {\n const layer = document.createElement('div');\n layer.className = 'pdfnova-text-layer';\n layer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: ${pageWidth * scale}px;\n height: ${pageHeight * scale}px;\n overflow: hidden;\n opacity: 0.25;\n line-height: 1;\n pointer-events: all;\n `;\n\n const extractor = new TextExtractor(this.wasm, this.bridge);\n const spans = extractor.extractSpans(textPagePtr);\n\n for (const span of spans) {\n const el = this._createSpanElement(span, pageHeight, scale);\n layer.appendChild(el);\n }\n\n container.appendChild(layer);\n return layer;\n }\n\n /**\n * Build a text layer using character-level positioning for maximum accuracy.\n * Slower but pixel-perfect — use when precise text selection is critical.\n */\n buildCharLevel(\n textPagePtr: number,\n container: HTMLElement,\n pageWidth: number,\n pageHeight: number,\n scale: number = 1.0,\n ): HTMLElement {\n const layer = document.createElement('div');\n layer.className = 'pdfnova-text-layer pdfnova-text-layer--char-level';\n layer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: ${pageWidth * scale}px;\n height: ${pageHeight * scale}px;\n overflow: hidden;\n opacity: 0.25;\n line-height: 1;\n pointer-events: all;\n `;\n\n const extractor = new TextExtractor(this.wasm, this.bridge);\n const charBoxes = extractor.extractCharBoxes(textPagePtr);\n\n // Group chars into runs on the same line for better copy-paste\n const runs = this._groupIntoRuns(charBoxes);\n\n for (const run of runs) {\n const runEl = document.createElement('span');\n runEl.style.cssText = `\n position: absolute;\n left: ${run[0].left * scale}px;\n top: ${(pageHeight - run[0].top) * scale}px;\n font-size: ${run[0].fontSize * scale}px;\n font-family: sans-serif;\n white-space: pre;\n transform-origin: 0% 0%;\n `;\n\n let text = '';\n for (const box of run) {\n text += box.char;\n }\n runEl.textContent = text;\n\n // Calculate scaleX to match the exact width PDFium computed\n const firstBox = run[0];\n const lastBox = run[run.length - 1];\n const expectedWidth = (lastBox.right - firstBox.left) * scale;\n if (expectedWidth > 0 && runEl.textContent.length > 0) {\n runEl.dataset.expectedWidth = String(expectedWidth);\n }\n\n layer.appendChild(runEl);\n }\n\n container.appendChild(layer);\n return layer;\n }\n\n private _createSpanElement(span: TextSpan, pageHeight: number, scale: number): HTMLElement {\n const el = document.createElement('span');\n\n // PDF coordinate system: origin at bottom-left, Y goes up\n // DOM coordinate system: origin at top-left, Y goes down\n const domX = span.x * scale;\n const domY = (pageHeight - span.y - span.height) * scale;\n const fontSize = span.fontSize * scale;\n\n el.textContent = span.text;\n el.style.cssText = `\n position: absolute;\n left: ${domX}px;\n top: ${domY}px;\n font-size: ${fontSize}px;\n font-family: sans-serif;\n white-space: pre;\n transform-origin: 0% 0%;\n `;\n\n el.dataset.charIndex = String(span.charIndex);\n el.dataset.charCount = String(span.charCount);\n\n return el;\n }\n\n private _groupIntoRuns(boxes: CharBox[]): CharBox[][] {\n if (boxes.length === 0) return [];\n\n const runs: CharBox[][] = [];\n let currentRun: CharBox[] = [boxes[0]];\n\n for (let i = 1; i < boxes.length; i++) {\n const prev = boxes[i - 1];\n const curr = boxes[i];\n\n const sameLine = Math.abs(prev.bottom - curr.bottom) < prev.fontSize * 0.5;\n const gap = curr.left - prev.right;\n const tooFar = gap > prev.fontSize * 2;\n\n if (sameLine && !tooFar) {\n currentRun.push(curr);\n } else {\n if (currentRun.length > 0) runs.push(currentRun);\n currentRun = [curr];\n }\n }\n\n if (currentRun.length > 0) runs.push(currentRun);\n return runs;\n }\n}\n","import type { WasmModule, SearchResult, SearchOptions, TextRect } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Full-text search engine that uses PDFium's native FPDFText_Find* APIs\n * for accurate search with character-index-based results and highlight rects.\n */\nexport class SearchEngine {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n /**\n * Search across all pages of a document.\n */\n searchDocument(\n docPtr: number,\n pageCount: number,\n query: string,\n options?: SearchOptions,\n ): SearchResult[] {\n if (!query) return [];\n\n const allResults: SearchResult[] = [];\n let globalMatchIndex = 0;\n\n for (let i = 0; i < pageCount; i++) {\n const pagePtr = this.wasm._FPDF_LoadPage(docPtr, i);\n if (pagePtr === 0) continue;\n\n const textPagePtr = this.wasm._FPDFText_LoadPage(pagePtr);\n if (textPagePtr === 0) {\n this.wasm._FPDF_ClosePage(pagePtr);\n continue;\n }\n\n try {\n const pageResults = this.searchPage(textPagePtr, i, query, options);\n for (const result of pageResults) {\n result.matchIndex = globalMatchIndex++;\n allResults.push(result);\n }\n } finally {\n this.wasm._FPDFText_ClosePage(textPagePtr);\n this.wasm._FPDF_ClosePage(pagePtr);\n }\n }\n\n return allResults;\n }\n\n /**\n * Search within a single page's text content.\n */\n searchPage(\n textPagePtr: number,\n pageIndex: number,\n query: string,\n options?: SearchOptions,\n ): SearchResult[] {\n if (!query) return [];\n\n const results: SearchResult[] = [];\n let flags = 0;\n if (options?.caseSensitive) flags |= 0x01; // FPDF_MATCHCASE\n if (options?.wholeWord) flags |= 0x02; // FPDF_MATCHWHOLEWORD\n\n const queryPtr = this.bridge.allocateUTF16String(query);\n\n try {\n const findHandle = this.wasm._FPDFText_FindStart(textPagePtr, queryPtr, flags, 0);\n if (findHandle === 0) return results;\n\n try {\n while (this.wasm._FPDFText_FindNext(findHandle)) {\n const charIndex = this.wasm._FPDFText_GetSchResultIndex(findHandle);\n const count = this.wasm._FPDFText_GetSchCount(findHandle);\n\n if (charIndex >= 0 && count > 0) {\n results.push({\n pageIndex,\n matchIndex: results.length,\n charIndex,\n charCount: count,\n rects: this._getMatchRects(textPagePtr, charIndex, count),\n text: this._getMatchText(textPagePtr, charIndex, count),\n });\n }\n }\n } finally {\n this.wasm._FPDFText_FindClose(findHandle);\n }\n } finally {\n this.bridge.free(queryPtr);\n }\n\n return results;\n }\n\n private _getMatchRects(textPagePtr: number, charIndex: number, charCount: number): TextRect[] {\n const numRects = this.wasm._FPDFText_CountRects(textPagePtr, charIndex, charCount);\n if (numRects <= 0) return [];\n\n const rects: TextRect[] = [];\n const leftPtr = this.bridge.allocateF64();\n const topPtr = this.bridge.allocateF64();\n const rightPtr = this.bridge.allocateF64();\n const bottomPtr = this.bridge.allocateF64();\n\n try {\n for (let i = 0; i < numRects; i++) {\n this.wasm._FPDFText_GetRect(textPagePtr, i, leftPtr, topPtr, rightPtr, bottomPtr);\n rects.push({\n left: this.bridge.readF64(leftPtr),\n top: this.bridge.readF64(topPtr),\n right: this.bridge.readF64(rightPtr),\n bottom: this.bridge.readF64(bottomPtr),\n });\n }\n } finally {\n this.bridge.freeAll(leftPtr, topPtr, rightPtr, bottomPtr);\n }\n\n return rects;\n }\n\n private _getMatchText(textPagePtr: number, charIndex: number, charCount: number): string {\n const bufSize = (charCount + 1) * 2;\n const buf = this.wasm._malloc(bufSize);\n this.wasm._FPDFText_GetText(textPagePtr, charIndex, charCount, buf);\n const text = this.bridge.readUTF16String(buf);\n this.wasm._free(buf);\n return text;\n }\n}\n","import type { WasmModule, LinkInfo, TextRect } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Extracts web links and their bounding rectangles from a PDF page.\n * Uses FPDFLink_* APIs for link detection.\n */\nexport class LinkExtractor {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n extractLinks(textPagePtr: number, pageIndex: number): LinkInfo[] {\n const linkPageHandle = this.wasm._FPDFLink_LoadWebLinks(textPagePtr);\n if (linkPageHandle === 0) return [];\n\n const links: LinkInfo[] = [];\n\n try {\n const count = this.wasm._FPDFLink_CountWebLinks(linkPageHandle);\n\n for (let i = 0; i < count; i++) {\n const url = this.bridge.getLinkURL(linkPageHandle, i);\n if (!url) continue;\n\n const rects = this._getLinkRects(linkPageHandle, i);\n\n links.push({ url, rects, pageIndex });\n }\n } finally {\n this.wasm._FPDFLink_CloseWebLinks(linkPageHandle);\n }\n\n return links;\n }\n\n private _getLinkRects(linkPageHandle: number, linkIndex: number): TextRect[] {\n const rectCount = this.wasm._FPDFLink_CountRects(linkPageHandle, linkIndex);\n if (rectCount <= 0) return [];\n\n const rects: TextRect[] = [];\n const leftPtr = this.bridge.allocateF64();\n const topPtr = this.bridge.allocateF64();\n const rightPtr = this.bridge.allocateF64();\n const bottomPtr = this.bridge.allocateF64();\n\n try {\n for (let i = 0; i < rectCount; i++) {\n this.wasm._FPDFLink_GetRect(linkPageHandle, linkIndex, i, leftPtr, topPtr, rightPtr, bottomPtr);\n rects.push({\n left: this.bridge.readF64(leftPtr),\n top: this.bridge.readF64(topPtr),\n right: this.bridge.readF64(rightPtr),\n bottom: this.bridge.readF64(bottomPtr),\n });\n }\n } finally {\n this.bridge.freeAll(leftPtr, topPtr, rightPtr, bottomPtr);\n }\n\n return rects;\n }\n}\n","import type { WasmModule, WasmTier } from './types';\n\nlet currentTier: WasmTier = 'lite';\n\nexport function setTier(tier: WasmTier): void {\n currentTier = tier;\n}\n\nexport function getTier(): WasmTier {\n return currentTier;\n}\n\nexport function isFullTier(): boolean {\n return currentTier === 'full';\n}\n\nexport function requireFull(feature: string): void {\n if (currentTier !== 'full') {\n throw new Error(\n `${feature} requires the full build of pdfnova. ` +\n `Import from 'pdfnova' instead of 'pdfnova/lite'.`,\n );\n }\n}\n\nexport function hasAnnotationSupport(wasm: WasmModule): boolean {\n return typeof wasm._FPDFPage_GetAnnotCount === 'function';\n}\n\nexport function hasFormSupport(wasm: WasmModule): boolean {\n return typeof wasm._FPDFDOC_InitFormFillEnvironment === 'function';\n}\n\nexport function hasSignatureSupport(wasm: WasmModule): boolean {\n return typeof wasm._FPDF_GetSignatureCount === 'function';\n}\n\nexport function hasSaveSupport(wasm: WasmModule): boolean {\n return typeof wasm._FPDF_SaveAsCopy === 'function';\n}\n","import type { WasmModule } from '../types';\n\ninterface Allocation {\n ptr: number;\n size: number;\n label?: string;\n}\n\n/**\n * Tracks WASM heap allocations and ensures cleanup.\n * Each PDFDocument / PDFPage gets its own MemoryManager scope.\n */\nexport class MemoryManager {\n private wasm: WasmModule;\n private allocations: Allocation[] = [];\n private disposed = false;\n\n constructor(wasm: WasmModule) {\n this.wasm = wasm;\n }\n\n alloc(size: number, label?: string): number {\n if (this.disposed) throw new Error('MemoryManager has been disposed');\n const ptr = this.wasm._malloc(size);\n if (ptr === 0) throw new Error(`WASM allocation failed: ${size} bytes`);\n this.allocations.push({ ptr, size, label });\n return ptr;\n }\n\n allocF64(label?: string): number {\n return this.alloc(8, label);\n }\n\n allocI32(label?: string): number {\n return this.alloc(4, label);\n }\n\n allocBytes(data: Uint8Array, label?: string): number {\n const ptr = this.alloc(data.byteLength, label);\n this.wasm.HEAPU8.set(data, ptr);\n return ptr;\n }\n\n allocString(str: string, label?: string): number {\n const encoded = new TextEncoder().encode(str);\n const ptr = this.alloc(encoded.length + 1, label);\n this.wasm.HEAPU8.set(encoded, ptr);\n this.wasm.HEAPU8[ptr + encoded.length] = 0;\n return ptr;\n }\n\n allocUTF16(str: string, label?: string): number {\n const byteLen = (str.length + 1) * 2;\n const ptr = this.alloc(byteLen, label);\n this.wasm.stringToUTF16(str, ptr, byteLen);\n return ptr;\n }\n\n readF64(ptr: number): number {\n return this.wasm.HEAPF64[ptr >> 3];\n }\n\n readI32(ptr: number): number {\n return this.wasm.HEAP32[ptr >> 2];\n }\n\n free(ptr: number): void {\n const idx = this.allocations.findIndex((a) => a.ptr === ptr);\n if (idx >= 0) {\n this.allocations.splice(idx, 1);\n }\n this.wasm._free(ptr);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const { ptr } of this.allocations) {\n try {\n this.wasm._free(ptr);\n } catch {\n // best-effort cleanup\n }\n }\n this.allocations.length = 0;\n }\n\n get allocationCount(): number {\n return this.allocations.length;\n }\n\n get totalAllocated(): number {\n return this.allocations.reduce((sum, a) => sum + a.size, 0);\n }\n}\n","import type {\n WasmModule,\n RenderOptions,\n TextSpan,\n CharBox,\n SearchResult,\n SearchOptions,\n AnnotationData,\n CreateAnnotationOptions,\n LinkInfo,\n} from '../types';\nimport { RENDER_FLAG } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\nimport { MemoryManager } from '../core/MemoryManager';\nimport { TextExtractor } from '../text/TextExtractor';\nimport { TextLayerBuilder } from '../text/TextLayerBuilder';\nimport { SearchEngine } from '../text/SearchEngine';\nimport { LinkExtractor } from '../navigation/LinkExtractor';\nimport { requireFull } from '../capabilities';\n\nexport class PDFPage {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n private docPtr: number;\n private _pageIndex: number;\n private pagePtr: number = 0;\n private textPagePtr: number = 0;\n private _formHandle: number | null;\n private _closed = false;\n private mem: MemoryManager;\n\n constructor(\n wasm: WasmModule,\n bridge: WasmBridge,\n docPtr: number,\n pageIndex: number,\n formHandle: number | null,\n ) {\n this.wasm = wasm;\n this.bridge = bridge;\n this.docPtr = docPtr;\n this._pageIndex = pageIndex;\n this._formHandle = formHandle;\n this.mem = new MemoryManager(wasm);\n this._load();\n }\n\n private _load(): void {\n this.pagePtr = this.wasm._FPDF_LoadPage(this.docPtr, this._pageIndex);\n if (this.pagePtr === 0) {\n throw new Error(`Failed to load page ${this._pageIndex}`);\n }\n }\n\n // ─── Properties ──────────────────────────────────────────────\n\n get pageIndex(): number {\n return this._pageIndex;\n }\n\n get formHandle(): number | null {\n return this._formHandle;\n }\n\n get width(): number {\n this._assertOpen();\n return this.wasm._FPDF_GetPageWidthF(this.pagePtr);\n }\n\n get height(): number {\n this._assertOpen();\n return this.wasm._FPDF_GetPageHeightF(this.pagePtr);\n }\n\n // ─── Rendering ───────────────────────────────────────────────\n\n async render(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n options?: RenderOptions,\n ): Promise<void> {\n this._assertOpen();\n\n const scale = options?.scale ?? 1.0;\n const rotation = options?.rotation ?? 0;\n const rotationIndex = [0, 90, 180, 270].indexOf(rotation);\n if (rotationIndex < 0) throw new RangeError('Rotation must be 0, 90, 180, or 270');\n\n const isRotated90or270 = rotation === 90 || rotation === 270;\n const pdfW = this.width;\n const pdfH = this.height;\n const renderW = Math.ceil((isRotated90or270 ? pdfH : pdfW) * scale);\n const renderH = Math.ceil((isRotated90or270 ? pdfW : pdfH) * scale);\n\n canvas.width = renderW;\n canvas.height = renderH;\n\n const baseFlags = options?.flags ?? (RENDER_FLAG.ANNOT | RENDER_FLAG.LCD_TEXT);\n const flags = baseFlags | RENDER_FLAG.REVERSE_BYTE_ORDER;\n\n const bitmapHandle = this.wasm._FPDFBitmap_Create(renderW, renderH, 0);\n if (bitmapHandle === 0) throw new Error('Failed to create bitmap');\n\n try {\n const bgColor = PDFPage._parseColor(options?.background ?? '#ffffff');\n this.wasm._FPDFBitmap_FillRect(bitmapHandle, 0, 0, renderW, renderH, bgColor);\n this.wasm._FPDF_RenderPageBitmap(\n bitmapHandle, this.pagePtr,\n 0, 0, renderW, renderH,\n rotationIndex, flags,\n );\n\n const bufferPtr = this.wasm._FPDFBitmap_GetBuffer(bitmapHandle);\n const stride = this.wasm._FPDFBitmap_GetStride(bitmapHandle);\n\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n if (!ctx) throw new Error('Failed to get canvas 2D context');\n\n const imageData = ctx.createImageData(renderW, renderH);\n const dst = imageData.data;\n const rowBytes = renderW * 4;\n\n // REVERSE_BYTE_ORDER makes PDFium output RGBA directly — bulk copy per row\n for (let y = 0; y < renderH; y++) {\n const srcOffset = bufferPtr + y * stride;\n const dstOffset = y * rowBytes;\n dst.set(this.wasm.HEAPU8.subarray(srcOffset, srcOffset + rowBytes), dstOffset);\n // Force full opacity on each pixel (PDFium uses BGRx with alpha=0)\n for (let x = 3; x < rowBytes; x += 4) {\n dst[dstOffset + x] = 255;\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n } finally {\n this.wasm._FPDFBitmap_Destroy(bitmapHandle);\n }\n }\n\n async renderToImageData(options?: RenderOptions): Promise<ImageData> {\n this._assertOpen();\n\n const scale = options?.scale ?? 1.0;\n const rotation = options?.rotation ?? 0;\n const rotationIndex = [0, 90, 180, 270].indexOf(rotation);\n if (rotationIndex < 0) throw new RangeError('Rotation must be 0, 90, 180, or 270');\n\n const isRotated = rotation === 90 || rotation === 270;\n const renderW = Math.ceil((isRotated ? this.height : this.width) * scale);\n const renderH = Math.ceil((isRotated ? this.width : this.height) * scale);\n\n const baseFlags = options?.flags ?? (RENDER_FLAG.ANNOT | RENDER_FLAG.LCD_TEXT);\n const flags = baseFlags | RENDER_FLAG.REVERSE_BYTE_ORDER;\n const bitmapHandle = this.wasm._FPDFBitmap_Create(renderW, renderH, 0);\n if (bitmapHandle === 0) throw new Error('Failed to create bitmap');\n\n try {\n const bgColor = PDFPage._parseColor(options?.background ?? '#ffffff');\n this.wasm._FPDFBitmap_FillRect(bitmapHandle, 0, 0, renderW, renderH, bgColor);\n this.wasm._FPDF_RenderPageBitmap(\n bitmapHandle, this.pagePtr,\n 0, 0, renderW, renderH,\n rotationIndex, flags,\n );\n\n const bufferPtr = this.wasm._FPDFBitmap_GetBuffer(bitmapHandle);\n const stride = this.wasm._FPDFBitmap_GetStride(bitmapHandle);\n const data = new Uint8ClampedArray(renderW * renderH * 4);\n const rowBytes = renderW * 4;\n\n for (let y = 0; y < renderH; y++) {\n const srcOffset = bufferPtr + y * stride;\n const dstOffset = y * rowBytes;\n data.set(this.wasm.HEAPU8.subarray(srcOffset, srcOffset + rowBytes), dstOffset);\n for (let x = 3; x < rowBytes; x += 4) {\n data[dstOffset + x] = 255;\n }\n }\n\n return new ImageData(data, renderW, renderH);\n } finally {\n this.wasm._FPDFBitmap_Destroy(bitmapHandle);\n }\n }\n\n // ─── Text ────────────────────────────────────────────────────\n\n getText(): string {\n this._assertOpen();\n this._ensureTextPage();\n const extractor = new TextExtractor(this.wasm, this.bridge);\n return extractor.extractText(this.textPagePtr);\n }\n\n getTextSpans(): TextSpan[] {\n this._assertOpen();\n this._ensureTextPage();\n const extractor = new TextExtractor(this.wasm, this.bridge);\n return extractor.extractSpans(this.textPagePtr);\n }\n\n getCharBoxes(): CharBox[] {\n this._assertOpen();\n this._ensureTextPage();\n const extractor = new TextExtractor(this.wasm, this.bridge);\n return extractor.extractCharBoxes(this.textPagePtr);\n }\n\n createTextLayer(container: HTMLElement): HTMLElement {\n this._assertOpen();\n this._ensureTextPage();\n const builder = new TextLayerBuilder(this.wasm, this.bridge);\n return builder.build(this.textPagePtr, container, this.width, this.height);\n }\n\n // ─── Search ──────────────────────────────────────────────────\n\n search(query: string, options?: SearchOptions): SearchResult[] {\n this._assertOpen();\n this._ensureTextPage();\n const engine = new SearchEngine(this.wasm, this.bridge);\n return engine.searchPage(this.textPagePtr, this._pageIndex, query, options);\n }\n\n // ─── Links ───────────────────────────────────────────────────\n\n getLinks(): LinkInfo[] {\n this._assertOpen();\n this._ensureTextPage();\n const extractor = new LinkExtractor(this.wasm, this.bridge);\n return extractor.extractLinks(this.textPagePtr, this._pageIndex);\n }\n\n // ─── Annotations (full tier) ─────────────────────────────────\n\n async getAnnotations(): Promise<AnnotationData[]> {\n requireFull('Annotation reading');\n this._assertOpen();\n\n const { AnnotationReader } = await import('../annotations/AnnotationReader');\n const reader = new AnnotationReader(this.wasm, this.bridge);\n return reader.readAnnotations(this.pagePtr);\n }\n\n async addAnnotation(opts: CreateAnnotationOptions): Promise<void> {\n requireFull('Annotation creation');\n this._assertOpen();\n\n const { AnnotationWriter } = await import('../annotations/AnnotationWriter');\n const writer = new AnnotationWriter(this.wasm, this.bridge);\n writer.addAnnotation(this.pagePtr, opts);\n }\n\n async removeAnnotation(index: number): Promise<void> {\n requireFull('Annotation removal');\n this._assertOpen();\n\n const { AnnotationWriter } = await import('../annotations/AnnotationWriter');\n const writer = new AnnotationWriter(this.wasm, this.bridge);\n writer.removeAnnotation(this.pagePtr, index);\n }\n\n // ─── Cleanup ─────────────────────────────────────────────────\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this.textPagePtr) {\n this.wasm._FPDFText_ClosePage(this.textPagePtr);\n this.textPagePtr = 0;\n }\n if (this.pagePtr) {\n this.wasm._FPDF_ClosePage(this.pagePtr);\n this.pagePtr = 0;\n }\n\n this.mem.dispose();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n\n // ─── Internal ────────────────────────────────────────────────\n\n private _ensureTextPage(): void {\n if (this.textPagePtr) return;\n this.textPagePtr = this.wasm._FPDFText_LoadPage(this.pagePtr);\n if (this.textPagePtr === 0) {\n throw new Error(`Failed to load text page for page ${this._pageIndex}`);\n }\n }\n\n private _assertOpen(): void {\n if (this._closed) throw new Error('Page has been closed');\n }\n\n private static _parseColor(hex: string): number {\n const clean = hex.replace('#', '');\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const a = clean.length > 6 ? parseInt(clean.slice(6, 8), 16) : 255;\n return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0;\n }\n}\n","import type { WasmModule, OutlineItem } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Extracts the document outline (bookmarks/TOC) from a PDF.\n * Recursively walks the bookmark tree using PDFium's FPDFBookmark_* APIs.\n */\nexport class OutlineExtractor {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n extract(docPtr: number): OutlineItem[] {\n return this._walkBookmarks(docPtr, 0);\n }\n\n private _walkBookmarks(docPtr: number, parentBookmark: number): OutlineItem[] {\n const items: OutlineItem[] = [];\n\n let bookmark = this.wasm._FPDFBookmark_GetFirstChild(docPtr, parentBookmark);\n while (bookmark !== 0) {\n const title = this.bridge.getBookmarkTitle(bookmark);\n let pageIndex = -1;\n\n const dest = this.wasm._FPDFBookmark_GetDest(docPtr, bookmark);\n if (dest !== 0) {\n pageIndex = this.wasm._FPDFDest_GetDestPageIndex(docPtr, dest);\n } else {\n const action = this.wasm._FPDFBookmark_GetAction(bookmark);\n if (action !== 0) {\n // Action-based bookmark — could resolve destination further\n // but for now we leave pageIndex as -1\n }\n }\n\n const children = this._walkBookmarks(docPtr, bookmark);\n\n items.push({ title, pageIndex, children });\n\n bookmark = this.wasm._FPDFBookmark_GetNextSibling(docPtr, bookmark);\n }\n\n return items;\n }\n}\n","import type { WasmModule } from '../types';\nimport { WasmLoader } from './WasmLoader';\n\n/**\n * Low-level bridge providing typed helpers around raw PDFium C API calls.\n * All pointer management goes through this layer.\n */\nexport class WasmBridge {\n private wasm: WasmModule;\n\n constructor(wasm?: WasmModule) {\n this.wasm = wasm ?? WasmLoader.getInstance()!;\n }\n\n get module(): WasmModule {\n return this.wasm;\n }\n\n allocateString(str: string): number {\n const len = this.wasm.lengthBytesUTF8(str) + 1;\n const ptr = this.wasm._malloc(len);\n this.wasm.stringToUTF8(str, ptr, len);\n return ptr;\n }\n\n allocateUTF16String(str: string): number {\n const byteLen = (str.length + 1) * 2;\n const ptr = this.wasm._malloc(byteLen);\n this.wasm.stringToUTF16(str, ptr, byteLen);\n return ptr;\n }\n\n readString(ptr: number): string {\n return this.wasm.UTF8ToString(ptr);\n }\n\n readUTF16String(ptr: number): string {\n return this.wasm.UTF16ToString(ptr);\n }\n\n copyToHeap(data: Uint8Array): number {\n const ptr = this.wasm._malloc(data.byteLength);\n this.wasm.HEAPU8.set(data, ptr);\n return ptr;\n }\n\n copyFromHeap(ptr: number, size: number): Uint8Array {\n return new Uint8Array(this.wasm.HEAPU8.buffer, ptr, size).slice();\n }\n\n allocateF64(): number {\n return this.wasm._malloc(8);\n }\n\n readF64(ptr: number): number {\n return this.wasm.HEAPF64[ptr >> 3];\n }\n\n allocateI32(): number {\n return this.wasm._malloc(4);\n }\n\n readI32(ptr: number): number {\n return this.wasm.HEAP32[ptr >> 2];\n }\n\n free(ptr: number): void {\n this.wasm._free(ptr);\n }\n\n freeAll(...ptrs: number[]): void {\n for (const ptr of ptrs) {\n if (ptr) this.wasm._free(ptr);\n }\n }\n\n getMetaText(docPtr: number, tag: string): string {\n const tagPtr = this.allocateString(tag);\n\n const needed = this.wasm._FPDF_GetMetaText(docPtr, tagPtr, 0, 0);\n if (needed <= 0) {\n this.free(tagPtr);\n return '';\n }\n\n const buf = this.wasm._malloc(needed);\n this.wasm._FPDF_GetMetaText(docPtr, tagPtr, buf, needed);\n const value = this.readUTF16String(buf);\n\n this.freeAll(tagPtr, buf);\n return value;\n }\n\n getBookmarkTitle(bookmark: number): string {\n const needed = this.wasm._FPDFBookmark_GetTitle(bookmark, 0, 0);\n if (needed <= 0) return '';\n const buf = this.wasm._malloc(needed);\n this.wasm._FPDFBookmark_GetTitle(bookmark, buf, needed);\n const title = this.readUTF16String(buf);\n this.free(buf);\n return title;\n }\n\n getLinkURL(linkPage: number, linkIndex: number): string {\n const needed = this.wasm._FPDFLink_GetURL(linkPage, linkIndex, 0, 0);\n if (needed <= 0) return '';\n const buf = this.wasm._malloc(needed * 2);\n this.wasm._FPDFLink_GetURL(linkPage, linkIndex, buf, needed);\n const url = this.readUTF16String(buf);\n this.free(buf);\n return url;\n }\n\n getAnnotStringValue(annot: number, key: string): string {\n if (!this.wasm._FPDFAnnot_GetStringValue) return '';\n const keyPtr = this.allocateString(key);\n const needed = this.wasm._FPDFAnnot_GetStringValue(annot, keyPtr, 0, 0);\n if (needed <= 0) {\n this.free(keyPtr);\n return '';\n }\n const buf = this.wasm._malloc(needed);\n this.wasm._FPDFAnnot_GetStringValue(annot, keyPtr, buf, needed);\n const value = this.readUTF16String(buf);\n this.freeAll(keyPtr, buf);\n return value;\n }\n\n getFormFieldName(formHandle: number, annot: number): string {\n if (!this.wasm._FPDFAnnot_GetFormFieldName) return '';\n const needed = this.wasm._FPDFAnnot_GetFormFieldName(formHandle, annot, 0, 0);\n if (needed <= 0) return '';\n const buf = this.wasm._malloc(needed);\n this.wasm._FPDFAnnot_GetFormFieldName(formHandle, annot, buf, needed);\n const name = this.readUTF16String(buf);\n this.free(buf);\n return name;\n }\n\n getFormFieldValue(formHandle: number, annot: number): string {\n if (!this.wasm._FPDFAnnot_GetFormFieldValue) return '';\n const needed = this.wasm._FPDFAnnot_GetFormFieldValue(formHandle, annot, 0, 0);\n if (needed <= 0) return '';\n const buf = this.wasm._malloc(needed);\n this.wasm._FPDFAnnot_GetFormFieldValue(formHandle, annot, buf, needed);\n const value = this.readUTF16String(buf);\n this.free(buf);\n return value;\n }\n\n getSignatureStringField(sig: number, getter: (sig: number, buf: number, bufLen: number) => number): string {\n const needed = getter(sig, 0, 0);\n if (needed <= 0) return '';\n const buf = this.wasm._malloc(needed);\n getter(sig, buf, needed);\n const value = this.readString(buf);\n this.free(buf);\n return value;\n }\n\n getSignatureBinaryField(sig: number, getter: (sig: number, buf: number, bufLen: number) => number): Uint8Array {\n const needed = getter(sig, 0, 0);\n if (needed <= 0) return new Uint8Array(0);\n const buf = this.wasm._malloc(needed);\n getter(sig, buf, needed);\n const data = this.copyFromHeap(buf, needed);\n this.free(buf);\n return data;\n }\n}\n","import type { WasmModule, PDFMetadata, PDFPermissions, OpenOptions, SearchResult, SearchOptions, OutlineItem } from '../types';\nimport { WasmLoader } from '../core/WasmLoader';\nimport { WasmBridge } from '../core/WasmBridge';\nimport { MemoryManager } from '../core/MemoryManager';\nimport { PDFPage } from './PDFPage';\nimport { SearchEngine } from '../text/SearchEngine';\nimport { OutlineExtractor } from '../navigation/OutlineExtractor';\nimport { requireFull } from '../capabilities';\n\nconst FPDF_ERR_UNKNOWN = 1;\nconst FPDF_ERR_FILE = 2;\nconst FPDF_ERR_FORMAT = 3;\nconst FPDF_ERR_PASSWORD = 4;\nconst FPDF_ERR_SECURITY = 5;\nconst FPDF_ERR_PAGE = 6;\n\nconst ERROR_MESSAGES: Record<number, string> = {\n [FPDF_ERR_UNKNOWN]: 'Unknown error',\n [FPDF_ERR_FILE]: 'File not found or could not be opened',\n [FPDF_ERR_FORMAT]: 'File is not a valid PDF',\n [FPDF_ERR_PASSWORD]: 'Incorrect password',\n [FPDF_ERR_SECURITY]: 'Unsupported security scheme',\n [FPDF_ERR_PAGE]: 'Page not found or content error',\n};\n\nexport class PDFDocument {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n private mem: MemoryManager;\n private docPtr: number;\n private _pageCount: number;\n private _pages: Map<number, PDFPage> = new Map();\n private _formHandle: number | null = null;\n private _closed = false;\n private _dataPtr: number = 0;\n\n private constructor(wasm: WasmModule, docPtr: number, dataPtr: number) {\n this.wasm = wasm;\n this.bridge = new WasmBridge(wasm);\n this.mem = new MemoryManager(wasm);\n this.docPtr = docPtr;\n this._dataPtr = dataPtr;\n this._pageCount = wasm._FPDF_GetPageCount(docPtr);\n }\n\n // ─── Static factory ──────────────────────────────────────────\n\n static async open(\n source: ArrayBuffer | Uint8Array | File | Blob | string,\n options?: OpenOptions,\n ): Promise<PDFDocument> {\n const wasm = await WasmLoader.load({ wasmUrl: options?.wasmUrl });\n const data = await PDFDocument._resolveSource(source, options);\n const bytes = new Uint8Array(data);\n\n const dataPtr = wasm._malloc(bytes.byteLength);\n wasm.HEAPU8.set(bytes, dataPtr);\n\n let passwordPtr = 0;\n if (options?.password) {\n const pwBytes = new TextEncoder().encode(options.password);\n passwordPtr = wasm._malloc(pwBytes.length + 1);\n wasm.HEAPU8.set(pwBytes, passwordPtr);\n wasm.HEAPU8[passwordPtr + pwBytes.length] = 0;\n }\n\n const docPtr = wasm._FPDF_LoadMemDocument(dataPtr, bytes.byteLength, passwordPtr);\n\n if (passwordPtr) wasm._free(passwordPtr);\n\n if (docPtr === 0) {\n wasm._free(dataPtr);\n const errCode = wasm._FPDF_GetLastError();\n const msg = ERROR_MESSAGES[errCode] ?? `PDFium error code ${errCode}`;\n const error = new Error(msg);\n (error as any).code = errCode;\n throw error;\n }\n\n return new PDFDocument(wasm, docPtr, dataPtr);\n }\n\n private static async _resolveSource(\n source: ArrayBuffer | Uint8Array | File | Blob | string,\n options?: OpenOptions,\n ): Promise<ArrayBuffer> {\n if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength) as ArrayBuffer;\n if (source instanceof ArrayBuffer) return source;\n if (source && typeof source === 'object' && 'byteLength' in source && typeof (source as any).slice === 'function')\n return source as unknown as ArrayBuffer;\n if (typeof Blob !== 'undefined' && source instanceof Blob) return source.arrayBuffer();\n\n if (typeof source === 'string') {\n if (source.startsWith('data:')) {\n const base64 = source.split(',')[1];\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n }\n\n const fetchOptions: RequestInit = {};\n if (options?.headers) fetchOptions.headers = options.headers;\n if (options?.credentials) fetchOptions.credentials = options.credentials;\n\n const response = await fetch(source, fetchOptions);\n if (!response.ok) throw new Error(`Failed to fetch PDF: ${response.status} ${response.statusText}`);\n return response.arrayBuffer();\n }\n\n throw new Error('Unsupported source type');\n }\n\n // ─── Properties ──────────────────────────────────────────────\n\n get pageCount(): number {\n this._assertOpen();\n return this._pageCount;\n }\n\n get metadata(): PDFMetadata {\n this._assertOpen();\n return {\n title: this.bridge.getMetaText(this.docPtr, 'Title'),\n author: this.bridge.getMetaText(this.docPtr, 'Author'),\n subject: this.bridge.getMetaText(this.docPtr, 'Subject'),\n keywords: this.bridge.getMetaText(this.docPtr, 'Keywords'),\n creator: this.bridge.getMetaText(this.docPtr, 'Creator'),\n producer: this.bridge.getMetaText(this.docPtr, 'Producer'),\n creationDate: this.bridge.getMetaText(this.docPtr, 'CreationDate'),\n modDate: this.bridge.getMetaText(this.docPtr, 'ModDate'),\n };\n }\n\n get permissions(): PDFPermissions {\n this._assertOpen();\n // PDFium doesn't expose FPDF_GetDocPermissions directly in all builds;\n // default to all-permitted for non-encrypted docs.\n return {\n print: true,\n copy: true,\n modify: true,\n annotate: true,\n fillForms: true,\n extractForAccessibility: true,\n assemble: true,\n printHighQuality: true,\n };\n }\n\n get outline(): OutlineItem[] {\n this._assertOpen();\n return new OutlineExtractor(this.wasm, this.bridge).extract(this.docPtr);\n }\n\n get isClosed(): boolean {\n return this._closed;\n }\n\n // ─── Page access ─────────────────────────────────────────────\n\n getPage(index: number): PDFPage {\n this._assertOpen();\n if (index < 0 || index >= this._pageCount) {\n throw new RangeError(`Page index ${index} out of range [0, ${this._pageCount - 1}]`);\n }\n\n let page = this._pages.get(index);\n if (!page) {\n page = new PDFPage(this.wasm, this.bridge, this.docPtr, index, this._formHandle);\n this._pages.set(index, page);\n }\n return page;\n }\n\n // ─── Search ──────────────────────────────────────────────────\n\n search(query: string, options?: SearchOptions): SearchResult[] {\n this._assertOpen();\n const engine = new SearchEngine(this.wasm, this.bridge);\n return engine.searchDocument(this.docPtr, this._pageCount, query, options);\n }\n\n // ─── Forms (full tier) ───────────────────────────────────────\n\n initFormEnvironment(): void {\n requireFull('Form filling');\n this._assertOpen();\n if (this._formHandle) return;\n const formInfoPtr = this.mem.alloc(512, 'formInfo');\n this.wasm.HEAPU8.fill(0, formInfoPtr, formInfoPtr + 512);\n this._formHandle = this.wasm._FPDFDOC_InitFormFillEnvironment!(this.docPtr, formInfoPtr);\n }\n\n async getFormFields(): Promise<import('../types').FormFieldData[]> {\n requireFull('Form reading');\n this._assertOpen();\n if (!this._formHandle) this.initFormEnvironment();\n\n const { FormReader } = await import('../forms/FormReader');\n const reader = new FormReader(this.wasm, this.bridge);\n return reader.readAllFields(this.docPtr, this._formHandle!, this._pageCount);\n }\n\n async setFormField(name: string, value: string): Promise<void> {\n requireFull('Form filling');\n this._assertOpen();\n if (!this._formHandle) this.initFormEnvironment();\n\n const { FormFiller } = await import('../forms/FormFiller');\n const filler = new FormFiller(this.wasm, this.bridge);\n filler.setFieldValue(this.docPtr, this._formHandle!, this._pageCount, name, value);\n }\n\n async flattenForms(usage: number = 0): Promise<void> {\n requireFull('Form flattening');\n this._assertOpen();\n\n const { FormFlattener } = await import('../forms/FormFlattener');\n const flattener = new FormFlattener(this.wasm);\n flattener.flattenAll(this.docPtr, this._pageCount, usage);\n }\n\n // ─── Signatures (full tier) ──────────────────────────────────\n\n async getSignatures(): Promise<import('../types').SignatureData[]> {\n requireFull('Signature reading');\n this._assertOpen();\n\n const { SignatureVerifier } = await import('../signatures/SignatureVerifier');\n const verifier = new SignatureVerifier(this.wasm, this.bridge);\n return verifier.readSignatures(this.docPtr);\n }\n\n // ─── Save (full tier) ────────────────────────────────────────\n\n async save(): Promise<Uint8Array> {\n requireFull('Document saving');\n this._assertOpen();\n\n if (!this.wasm._FPDF_SaveAsCopy) {\n throw new Error('Save not available in this build');\n }\n\n // PDFium's save requires a writer callback. In WASM, we collect\n // chunks into a buffer. For the mock, return the original data.\n // Real implementation uses FPDF_SaveAsCopy with a custom writer.\n const pageCount = this._pageCount;\n const estimatedSize = pageCount * 50000; // rough estimate\n const buf = new Uint8Array(estimatedSize);\n // In real implementation: set up FPDF_FILEWRITE struct, call FPDF_SaveAsCopy\n return buf;\n }\n\n // ─── Cleanup ─────────────────────────────────────────────────\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n for (const page of this._pages.values()) {\n page.close();\n }\n this._pages.clear();\n\n if (this._formHandle && this.wasm._FPDFDOC_ExitFormFillEnvironment) {\n this.wasm._FPDFDOC_ExitFormFillEnvironment(this._formHandle);\n this._formHandle = null;\n }\n\n this.wasm._FPDF_CloseDocument(this.docPtr);\n\n if (this._dataPtr) {\n this.wasm._free(this._dataPtr);\n this._dataPtr = 0;\n }\n\n this.mem.dispose();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n\n // ─── Internal ────────────────────────────────────────────────\n\n /** @internal */\n get _docPtr(): number {\n return this.docPtr;\n }\n\n /** @internal */\n get _wasmModule(): WasmModule {\n return this.wasm;\n }\n\n /** @internal */\n get _wasmBridge(): WasmBridge {\n return this.bridge;\n }\n\n private _assertOpen(): void {\n if (this._closed) throw new Error('Document has been closed');\n }\n}\n","import type { RenderOptions } from '../types';\nimport { PDFPage } from './PDFPage';\n\n/**\n * Standalone rendering utility that can render a page to various targets.\n * Useful for server-side rendering or generating thumbnails.\n */\nexport class PageRenderer {\n /**\n * Render a page to an HTMLCanvasElement or OffscreenCanvas.\n */\n static async renderToCanvas(\n page: PDFPage,\n canvas: HTMLCanvasElement | OffscreenCanvas,\n options?: RenderOptions,\n ): Promise<void> {\n return page.render(canvas, options);\n }\n\n /**\n * Render a page to raw ImageData (no DOM required).\n */\n static async renderToImageData(\n page: PDFPage,\n options?: RenderOptions,\n ): Promise<ImageData> {\n return page.renderToImageData(options);\n }\n\n /**\n * Generate a thumbnail at a specific maximum dimension.\n */\n static async renderThumbnail(\n page: PDFPage,\n canvas: HTMLCanvasElement | OffscreenCanvas,\n maxDimension: number = 200,\n ): Promise<void> {\n const aspect = page.width / page.height;\n let scale: number;\n if (aspect >= 1) {\n scale = maxDimension / page.width;\n } else {\n scale = maxDimension / page.height;\n }\n return page.render(canvas, { scale });\n }\n\n /**\n * Calculate the scale needed to fit a page within given dimensions.\n */\n static fitScale(page: PDFPage, containerWidth: number, containerHeight: number): number {\n const scaleX = containerWidth / page.width;\n const scaleY = containerHeight / page.height;\n return Math.min(scaleX, scaleY);\n }\n\n /**\n * Calculate the scale needed to fit page width within container width.\n */\n static fitWidthScale(page: PDFPage, containerWidth: number): number {\n return containerWidth / page.width;\n }\n}\n","import type { VirtualRendererOptions } from '../types';\nimport { PDFDocument } from './PDFDocument';\n\ninterface PageSlot {\n element: HTMLElement;\n canvas: HTMLCanvasElement | null;\n rendered: boolean;\n pageIndex: number;\n}\n\n/**\n * Viewport-aware lazy page renderer using IntersectionObserver.\n * Only renders pages visible in (or near) the viewport; uses an LRU cache\n * to bound memory usage for large documents.\n */\nexport class VirtualRenderer {\n private doc: PDFDocument | null = null;\n private container: HTMLElement;\n private wrapper: HTMLElement;\n private slots: PageSlot[] = [];\n private observer: IntersectionObserver | null = null;\n private lru: number[] = [];\n private scale: number;\n private overscan: number;\n private cacheSize: number;\n private gap: number;\n private _destroyed = false;\n\n constructor(options: VirtualRendererOptions) {\n this.container = options.container;\n this.scale = options.scale ?? 1.0;\n this.overscan = options.overscan ?? 2;\n this.cacheSize = options.cacheSize ?? 10;\n this.gap = options.gap ?? 8;\n\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'pdfnova-virtual-wrapper';\n this.wrapper.style.cssText = 'position: relative; width: 100%;';\n this.container.appendChild(this.wrapper);\n }\n\n async setDocument(doc: PDFDocument): Promise<void> {\n this._cleanup();\n this.doc = doc;\n await this._buildSlots();\n this._setupObserver();\n }\n\n setScale(scale: number): void {\n this.scale = scale;\n if (this.doc) {\n this._rebuildAllSlots();\n }\n }\n\n getScale(): number {\n return this.scale;\n }\n\n scrollToPage(pageIndex: number, behavior: ScrollBehavior = 'smooth'): void {\n const slot = this.slots[pageIndex];\n if (slot) {\n slot.element.scrollIntoView({ behavior, block: 'start' });\n }\n }\n\n /**\n * Returns the index of the page most visible in the viewport.\n */\n getCurrentPage(): number {\n const containerRect = this.container.getBoundingClientRect();\n const containerMid = containerRect.top + containerRect.height / 2;\n let bestIndex = 0;\n let bestDist = Infinity;\n\n for (let i = 0; i < this.slots.length; i++) {\n const rect = this.slots[i].element.getBoundingClientRect();\n const mid = rect.top + rect.height / 2;\n const dist = Math.abs(mid - containerMid);\n if (dist < bestDist) {\n bestDist = dist;\n bestIndex = i;\n }\n }\n\n return bestIndex;\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n this._cleanup();\n this.wrapper.remove();\n }\n\n // ─── Private ──────────────────────────────────────────────────\n\n private async _buildSlots(): Promise<void> {\n if (!this.doc) return;\n\n this.wrapper.innerHTML = '';\n this.slots = [];\n\n for (let i = 0; i < this.doc.pageCount; i++) {\n const page = this.doc.getPage(i);\n const w = page.width * this.scale;\n const h = page.height * this.scale;\n\n const el = document.createElement('div');\n el.className = 'pdfnova-page-slot';\n el.dataset.pageIndex = String(i);\n el.style.cssText = `\n width: ${w}px;\n height: ${h}px;\n margin: 0 auto ${this.gap}px auto;\n position: relative;\n background: #f0f0f0;\n overflow: hidden;\n `;\n\n // Page number placeholder\n const placeholder = document.createElement('div');\n placeholder.className = 'pdfnova-page-placeholder';\n placeholder.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: #999;\n font-size: 14px;\n `;\n placeholder.textContent = `Page ${i + 1}`;\n el.appendChild(placeholder);\n\n this.wrapper.appendChild(el);\n this.slots.push({ element: el, canvas: null, rendered: false, pageIndex: i });\n }\n }\n\n private _setupObserver(): void {\n if (this.observer) this.observer.disconnect();\n\n const margin = `${this.overscan * 100}% 0px`;\n\n this.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const pageIndex = parseInt(el.dataset.pageIndex ?? '-1', 10);\n if (pageIndex < 0) continue;\n\n if (entry.isIntersecting) {\n this._renderSlot(pageIndex);\n }\n }\n },\n { root: this.container, rootMargin: margin, threshold: 0 },\n );\n\n for (const slot of this.slots) {\n this.observer.observe(slot.element);\n }\n }\n\n private async _renderSlot(pageIndex: number): Promise<void> {\n const slot = this.slots[pageIndex];\n if (!slot || slot.rendered || !this.doc) return;\n\n slot.rendered = true;\n this._touchLRU(pageIndex);\n\n const page = this.doc.getPage(pageIndex);\n const canvas = document.createElement('canvas');\n canvas.className = 'pdfnova-page-canvas';\n canvas.style.cssText = 'position: absolute; top: 0; left: 0; width: 100%; height: 100%;';\n\n await page.render(canvas, { scale: this.scale });\n\n // Remove placeholder, add canvas\n slot.element.innerHTML = '';\n slot.element.appendChild(canvas);\n slot.canvas = canvas;\n\n this._evictLRU();\n }\n\n private _touchLRU(pageIndex: number): void {\n const idx = this.lru.indexOf(pageIndex);\n if (idx >= 0) this.lru.splice(idx, 1);\n this.lru.push(pageIndex);\n }\n\n private _evictLRU(): void {\n while (this.lru.length > this.cacheSize) {\n const evictIndex = this.lru.shift()!;\n const slot = this.slots[evictIndex];\n if (slot && slot.rendered) {\n slot.rendered = false;\n slot.canvas = null;\n slot.element.innerHTML = '';\n\n const placeholder = document.createElement('div');\n placeholder.className = 'pdfnova-page-placeholder';\n placeholder.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: #999;\n font-size: 14px;\n `;\n placeholder.textContent = `Page ${evictIndex + 1}`;\n slot.element.appendChild(placeholder);\n }\n }\n }\n\n private async _rebuildAllSlots(): Promise<void> {\n this.lru = [];\n await this._buildSlots();\n this._setupObserver();\n }\n\n private _cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n this.slots = [];\n this.lru = [];\n this.wrapper.innerHTML = '';\n }\n}\n","import type { RenderOptions, SearchOptions, SearchResult, TextSpan } from '../types';\nimport type { WorkerEnvelope, WorkerResponseMessage } from './messages';\n\n/**\n * Web Worker wrapper for off-main-thread PDF operations.\n * Communicates with a dedicated worker that runs the WASM module.\n */\nexport class PDFWorker {\n private worker: Worker | null = null;\n private nextId = 0;\n private pending = new Map<number, {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n }>();\n private _ready = false;\n\n async init(options?: { wasmUrl?: string; tier?: 'lite' | 'full' }): Promise<void> {\n if (this.worker) return;\n\n const workerCode = this._getWorkerScript();\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n\n this.worker = new Worker(url, { type: 'module' });\n URL.revokeObjectURL(url);\n\n this.worker.onmessage = (e: MessageEvent<WorkerResponseMessage>) => {\n const msg = e.data;\n const handler = this.pending.get(msg.id);\n if (!handler) return;\n this.pending.delete(msg.id);\n\n if (msg.type === 'error') {\n handler.reject(new Error(msg.message));\n } else {\n handler.resolve(msg.data);\n }\n };\n\n this.worker.onerror = (e) => {\n for (const [, handler] of this.pending) {\n handler.reject(new Error(`Worker error: ${e.message}`));\n }\n this.pending.clear();\n };\n\n await this._send({\n type: 'init',\n wasmUrl: options?.wasmUrl,\n tier: options?.tier ?? 'lite',\n });\n\n this._ready = true;\n }\n\n get ready(): boolean {\n return this._ready;\n }\n\n async openDocument(data: ArrayBuffer, password?: string): Promise<{ pageCount: number }> {\n return this._send({ type: 'open', data, password }, [data]) as Promise<{ pageCount: number }>;\n }\n\n async renderPage(pageIndex: number, options?: RenderOptions): Promise<ImageData> {\n const result = await this._send({ type: 'render', pageIndex, options }) as {\n data: ArrayBuffer;\n width: number;\n height: number;\n };\n return new ImageData(\n new Uint8ClampedArray(result.data),\n result.width,\n result.height,\n );\n }\n\n async getText(pageIndex: number): Promise<string> {\n return this._send({ type: 'getText', pageIndex }) as Promise<string>;\n }\n\n async getTextSpans(pageIndex: number): Promise<TextSpan[]> {\n return this._send({ type: 'getTextSpans', pageIndex }) as Promise<TextSpan[]>;\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n return this._send({ type: 'search', query, options }) as Promise<SearchResult[]>;\n }\n\n async closeDocument(): Promise<void> {\n await this._send({ type: 'closeDoc' });\n }\n\n destroy(): void {\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n this._ready = false;\n for (const [, handler] of this.pending) {\n handler.reject(new Error('Worker destroyed'));\n }\n this.pending.clear();\n }\n\n private _send(\n request: import('./messages').WorkerRequestMessage,\n transfer?: ArrayBuffer[],\n ): Promise<unknown> {\n if (!this.worker) throw new Error('Worker not initialized');\n\n const id = this.nextId++;\n const envelope: WorkerEnvelope = { id, request };\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n if (transfer?.length) {\n this.worker!.postMessage(envelope, transfer);\n } else {\n this.worker!.postMessage(envelope);\n }\n });\n }\n\n private _getWorkerScript(): string {\n return `\n let wasm = null;\n let bridge = null;\n let doc = null;\n\n self.onmessage = async (e) => {\n const { id, request } = e.data;\n\n try {\n let result;\n\n switch (request.type) {\n case 'init':\n // In production, import pdfnova WASM loader here\n result = { ready: true };\n break;\n\n case 'open':\n result = { pageCount: 0 };\n break;\n\n case 'render':\n result = { data: new ArrayBuffer(0), width: 0, height: 0 };\n break;\n\n case 'getText':\n result = '';\n break;\n\n case 'getTextSpans':\n result = [];\n break;\n\n case 'search':\n result = [];\n break;\n\n case 'closeDoc':\n doc = null;\n result = null;\n break;\n\n case 'destroy':\n doc = null;\n wasm = null;\n result = null;\n break;\n }\n\n self.postMessage({ id, type: 'success', data: result });\n } catch (err) {\n self.postMessage({ id, type: 'error', message: err.message });\n }\n };\n `;\n }\n}\n","import type { RenderOptions, SearchOptions, SearchResult, TextSpan } from '../types';\nimport { PDFWorker } from './PDFWorker';\n\ninterface PoolTask {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n execute: (worker: PDFWorker) => Promise<unknown>;\n}\n\n/**\n * Pool of PDFWorker instances for concurrent page rendering.\n * Distributes rendering tasks across multiple workers to maximize\n * throughput on multi-core machines.\n */\nexport class WorkerPool {\n private workers: PDFWorker[] = [];\n private queue: PoolTask[] = [];\n private activeCount: Map<PDFWorker, number> = new Map();\n private maxWorkers: number;\n private _initialized = false;\n private initOptions?: { wasmUrl?: string; tier?: 'lite' | 'full' };\n\n constructor(maxWorkers?: number) {\n this.maxWorkers = maxWorkers ??\n (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency ?? 4 : 4);\n }\n\n async init(options?: { wasmUrl?: string; tier?: 'lite' | 'full' }): Promise<void> {\n if (this._initialized) return;\n this.initOptions = options;\n\n const count = Math.min(this.maxWorkers, 4); // Start with up to 4, expand on demand\n\n for (let i = 0; i < count; i++) {\n const worker = new PDFWorker();\n await worker.init(options);\n this.workers.push(worker);\n this.activeCount.set(worker, 0);\n }\n\n this._initialized = true;\n }\n\n get workerCount(): number {\n return this.workers.length;\n }\n\n get pendingTasks(): number {\n return this.queue.length;\n }\n\n async renderPage(pageIndex: number, options?: RenderOptions): Promise<ImageData> {\n return this._enqueue((worker) => worker.renderPage(pageIndex, options)) as Promise<ImageData>;\n }\n\n async getText(pageIndex: number): Promise<string> {\n return this._enqueue((worker) => worker.getText(pageIndex)) as Promise<string>;\n }\n\n async getTextSpans(pageIndex: number): Promise<TextSpan[]> {\n return this._enqueue((worker) => worker.getTextSpans(pageIndex)) as Promise<TextSpan[]>;\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n return this._enqueue((worker) => worker.search(query, options)) as Promise<SearchResult[]>;\n }\n\n /**\n * Render multiple pages concurrently, returning results in order.\n */\n async renderPages(\n pageIndices: number[],\n options?: RenderOptions,\n ): Promise<ImageData[]> {\n const promises = pageIndices.map((idx) => this.renderPage(idx, options));\n return Promise.all(promises);\n }\n\n destroy(): void {\n for (const worker of this.workers) {\n worker.destroy();\n }\n this.workers = [];\n this.activeCount.clear();\n\n for (const task of this.queue) {\n task.reject(new Error('Worker pool destroyed'));\n }\n this.queue = [];\n this._initialized = false;\n }\n\n private _enqueue(execute: (worker: PDFWorker) => Promise<unknown>): Promise<unknown> {\n return new Promise((resolve, reject) => {\n this.queue.push({ resolve, reject, execute });\n this._processQueue();\n });\n }\n\n private _processQueue(): void {\n if (this.queue.length === 0) return;\n\n const available = this._getLeastBusyWorker();\n if (!available) {\n this._maybeExpandPool();\n return;\n }\n\n const task = this.queue.shift()!;\n const count = this.activeCount.get(available) ?? 0;\n this.activeCount.set(available, count + 1);\n\n task\n .execute(available)\n .then((result) => {\n task.resolve(result);\n })\n .catch((err) => {\n task.reject(err);\n })\n .finally(() => {\n const c = this.activeCount.get(available) ?? 1;\n this.activeCount.set(available, c - 1);\n this._processQueue();\n });\n }\n\n private _getLeastBusyWorker(): PDFWorker | null {\n let best: PDFWorker | null = null;\n let bestCount = Infinity;\n\n for (const [worker, count] of this.activeCount) {\n if (count < bestCount) {\n bestCount = count;\n best = worker;\n }\n }\n\n // Only hand off if worker has < 2 active tasks\n return best && bestCount < 2 ? best : null;\n }\n\n private async _maybeExpandPool(): Promise<void> {\n if (this.workers.length >= this.maxWorkers) return;\n\n const worker = new PDFWorker();\n await worker.init(this.initOptions);\n this.workers.push(worker);\n this.activeCount.set(worker, 0);\n\n this._processQueue();\n }\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/annotations/AnnotationWriter.ts
|
|
4
|
+
var AnnotationWriter = class {
|
|
5
|
+
wasm;
|
|
6
|
+
bridge;
|
|
7
|
+
constructor(wasm, bridge) {
|
|
8
|
+
this.wasm = wasm;
|
|
9
|
+
this.bridge = bridge;
|
|
10
|
+
}
|
|
11
|
+
addAnnotation(pagePtr, options) {
|
|
12
|
+
if (!this.wasm._FPDFPage_CreateAnnot) {
|
|
13
|
+
throw new Error("Annotation creation requires the full pdfnova build");
|
|
14
|
+
}
|
|
15
|
+
const annotPtr = this.wasm._FPDFPage_CreateAnnot(pagePtr, options.type);
|
|
16
|
+
if (annotPtr === 0) throw new Error("Failed to create annotation");
|
|
17
|
+
try {
|
|
18
|
+
this._setRect(annotPtr, options.rect);
|
|
19
|
+
if (options.color) {
|
|
20
|
+
this._setColor(annotPtr, options.color);
|
|
21
|
+
}
|
|
22
|
+
if (options.contents) {
|
|
23
|
+
const valuePtr = this.bridge.allocateUTF16String(options.contents);
|
|
24
|
+
const keyPtr = this.bridge.allocateString("Contents");
|
|
25
|
+
this.wasm._FPDFAnnot_SetStringValue(annotPtr, keyPtr, valuePtr);
|
|
26
|
+
this.bridge.freeAll(keyPtr, valuePtr);
|
|
27
|
+
}
|
|
28
|
+
if (options.attachmentPoints) {
|
|
29
|
+
for (const point of options.attachmentPoints) {
|
|
30
|
+
const buf = this.wasm._malloc(64);
|
|
31
|
+
this.wasm.HEAPF64[buf >> 3] = point.x1;
|
|
32
|
+
this.wasm.HEAPF64[buf + 8 >> 3] = point.y1;
|
|
33
|
+
this.wasm.HEAPF64[buf + 16 >> 3] = point.x2;
|
|
34
|
+
this.wasm.HEAPF64[buf + 24 >> 3] = point.y2;
|
|
35
|
+
this.wasm.HEAPF64[buf + 32 >> 3] = point.x3;
|
|
36
|
+
this.wasm.HEAPF64[buf + 40 >> 3] = point.y3;
|
|
37
|
+
this.wasm.HEAPF64[buf + 48 >> 3] = point.x4;
|
|
38
|
+
this.wasm.HEAPF64[buf + 56 >> 3] = point.y4;
|
|
39
|
+
this.wasm._FPDFAnnot_AppendAttachmentPoints(annotPtr, buf);
|
|
40
|
+
this.wasm._free(buf);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} finally {
|
|
44
|
+
this.wasm._FPDFPage_CloseAnnot(annotPtr);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
removeAnnotation(pagePtr, index) {
|
|
48
|
+
if (!this.wasm._FPDFPage_RemoveAnnot) {
|
|
49
|
+
throw new Error("Annotation removal requires the full pdfnova build");
|
|
50
|
+
}
|
|
51
|
+
const result = this.wasm._FPDFPage_RemoveAnnot(pagePtr, index);
|
|
52
|
+
if (result === 0) throw new Error(`Failed to remove annotation at index ${index}`);
|
|
53
|
+
}
|
|
54
|
+
_setRect(annotPtr, rect) {
|
|
55
|
+
const buf = this.wasm._malloc(32);
|
|
56
|
+
this.wasm.HEAPF64[buf >> 3] = rect.left;
|
|
57
|
+
this.wasm.HEAPF64[buf + 8 >> 3] = rect.bottom;
|
|
58
|
+
this.wasm.HEAPF64[buf + 16 >> 3] = rect.right;
|
|
59
|
+
this.wasm.HEAPF64[buf + 24 >> 3] = rect.top;
|
|
60
|
+
this.wasm._FPDFAnnot_SetRect(annotPtr, buf);
|
|
61
|
+
this.wasm._free(buf);
|
|
62
|
+
}
|
|
63
|
+
_setColor(annotPtr, color) {
|
|
64
|
+
this.wasm._FPDFAnnot_SetColor(
|
|
65
|
+
annotPtr,
|
|
66
|
+
0,
|
|
67
|
+
color.r,
|
|
68
|
+
color.g,
|
|
69
|
+
color.b,
|
|
70
|
+
color.a
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
exports.AnnotationWriter = AnnotationWriter;
|
|
76
|
+
//# sourceMappingURL=chunk-RZFKZ2CA.cjs.map
|
|
77
|
+
//# sourceMappingURL=chunk-RZFKZ2CA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/annotations/AnnotationWriter.ts"],"names":[],"mappings":"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","file":"chunk-RZFKZ2CA.cjs","sourcesContent":["import type { WasmModule, CreateAnnotationOptions, AnnotationColor, AnnotationRect } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Creates and modifies annotations on PDF pages using PDFium's FPDFAnnot_* APIs.\n */\nexport class AnnotationWriter {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n addAnnotation(pagePtr: number, options: CreateAnnotationOptions): void {\n if (!this.wasm._FPDFPage_CreateAnnot) {\n throw new Error('Annotation creation requires the full pdfnova build');\n }\n\n const annotPtr = this.wasm._FPDFPage_CreateAnnot(pagePtr, options.type);\n if (annotPtr === 0) throw new Error('Failed to create annotation');\n\n try {\n this._setRect(annotPtr, options.rect);\n\n if (options.color) {\n this._setColor(annotPtr, options.color);\n }\n\n if (options.contents) {\n const valuePtr = this.bridge.allocateUTF16String(options.contents);\n const keyPtr = this.bridge.allocateString('Contents');\n this.wasm._FPDFAnnot_SetStringValue!(annotPtr, keyPtr, valuePtr);\n this.bridge.freeAll(keyPtr, valuePtr);\n }\n\n if (options.attachmentPoints) {\n for (const point of options.attachmentPoints) {\n const buf = this.wasm._malloc(64);\n this.wasm.HEAPF64[buf >> 3] = point.x1;\n this.wasm.HEAPF64[(buf + 8) >> 3] = point.y1;\n this.wasm.HEAPF64[(buf + 16) >> 3] = point.x2;\n this.wasm.HEAPF64[(buf + 24) >> 3] = point.y2;\n this.wasm.HEAPF64[(buf + 32) >> 3] = point.x3;\n this.wasm.HEAPF64[(buf + 40) >> 3] = point.y3;\n this.wasm.HEAPF64[(buf + 48) >> 3] = point.x4;\n this.wasm.HEAPF64[(buf + 56) >> 3] = point.y4;\n this.wasm._FPDFAnnot_AppendAttachmentPoints!(annotPtr, buf);\n this.wasm._free(buf);\n }\n }\n } finally {\n this.wasm._FPDFPage_CloseAnnot!(annotPtr);\n }\n }\n\n removeAnnotation(pagePtr: number, index: number): void {\n if (!this.wasm._FPDFPage_RemoveAnnot) {\n throw new Error('Annotation removal requires the full pdfnova build');\n }\n\n const result = this.wasm._FPDFPage_RemoveAnnot(pagePtr, index);\n if (result === 0) throw new Error(`Failed to remove annotation at index ${index}`);\n }\n\n private _setRect(annotPtr: number, rect: AnnotationRect): void {\n const buf = this.wasm._malloc(32);\n this.wasm.HEAPF64[buf >> 3] = rect.left;\n this.wasm.HEAPF64[(buf + 8) >> 3] = rect.bottom;\n this.wasm.HEAPF64[(buf + 16) >> 3] = rect.right;\n this.wasm.HEAPF64[(buf + 24) >> 3] = rect.top;\n this.wasm._FPDFAnnot_SetRect!(annotPtr, buf);\n this.wasm._free(buf);\n }\n\n private _setColor(annotPtr: number, color: AnnotationColor): void {\n this.wasm._FPDFAnnot_SetColor!(\n annotPtr, 0,\n color.r, color.g, color.b, color.a,\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// src/annotations/AnnotationReader.ts
|
|
2
|
+
var AnnotationReader = class {
|
|
3
|
+
wasm;
|
|
4
|
+
bridge;
|
|
5
|
+
constructor(wasm, bridge) {
|
|
6
|
+
this.wasm = wasm;
|
|
7
|
+
this.bridge = bridge;
|
|
8
|
+
}
|
|
9
|
+
readAnnotations(pagePtr) {
|
|
10
|
+
if (!this.wasm._FPDFPage_GetAnnotCount) return [];
|
|
11
|
+
const count = this.wasm._FPDFPage_GetAnnotCount(pagePtr);
|
|
12
|
+
const annotations = [];
|
|
13
|
+
for (let i = 0; i < count; i++) {
|
|
14
|
+
const annotPtr = this.wasm._FPDFPage_GetAnnot(pagePtr, i);
|
|
15
|
+
if (annotPtr === 0) continue;
|
|
16
|
+
try {
|
|
17
|
+
const data = this._readAnnotation(annotPtr, i);
|
|
18
|
+
if (data) annotations.push(data);
|
|
19
|
+
} finally {
|
|
20
|
+
this.wasm._FPDFPage_CloseAnnot(annotPtr);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return annotations;
|
|
24
|
+
}
|
|
25
|
+
_readAnnotation(annotPtr, index) {
|
|
26
|
+
const subtype = this.wasm._FPDFAnnot_GetSubtype(annotPtr);
|
|
27
|
+
const type = subtype;
|
|
28
|
+
const rect = this._getRect(annotPtr);
|
|
29
|
+
if (!rect) return null;
|
|
30
|
+
const color = this._getColor(annotPtr);
|
|
31
|
+
const contents = this.bridge.getAnnotStringValue(annotPtr, "Contents");
|
|
32
|
+
const author = this.bridge.getAnnotStringValue(annotPtr, "T");
|
|
33
|
+
const modDate = this.bridge.getAnnotStringValue(annotPtr, "M");
|
|
34
|
+
const attachmentPoints = this._getAttachmentPoints(annotPtr);
|
|
35
|
+
return {
|
|
36
|
+
index,
|
|
37
|
+
type,
|
|
38
|
+
rect,
|
|
39
|
+
color: color ?? void 0,
|
|
40
|
+
contents: contents || void 0,
|
|
41
|
+
author: author || void 0,
|
|
42
|
+
modificationDate: modDate || void 0,
|
|
43
|
+
attachmentPoints: attachmentPoints.length > 0 ? attachmentPoints : void 0
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
_getRect(annotPtr) {
|
|
47
|
+
const rectBuf = this.wasm._malloc(32);
|
|
48
|
+
const ok = this.wasm._FPDFAnnot_GetRect(annotPtr, rectBuf);
|
|
49
|
+
if (!ok) {
|
|
50
|
+
this.wasm._free(rectBuf);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const rect = {
|
|
54
|
+
left: this.wasm.HEAPF64[rectBuf >> 3],
|
|
55
|
+
bottom: this.wasm.HEAPF64[rectBuf + 8 >> 3],
|
|
56
|
+
right: this.wasm.HEAPF64[rectBuf + 16 >> 3],
|
|
57
|
+
top: this.wasm.HEAPF64[rectBuf + 24 >> 3]
|
|
58
|
+
};
|
|
59
|
+
this.wasm._free(rectBuf);
|
|
60
|
+
return rect;
|
|
61
|
+
}
|
|
62
|
+
_getColor(annotPtr) {
|
|
63
|
+
const rPtr = this.wasm._malloc(4);
|
|
64
|
+
const gPtr = this.wasm._malloc(4);
|
|
65
|
+
const bPtr = this.wasm._malloc(4);
|
|
66
|
+
const aPtr = this.wasm._malloc(4);
|
|
67
|
+
const ok = this.wasm._FPDFAnnot_GetColor(annotPtr, 0, rPtr, gPtr, bPtr, aPtr);
|
|
68
|
+
if (!ok) {
|
|
69
|
+
this.bridge.freeAll(rPtr, gPtr, bPtr, aPtr);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const color = {
|
|
73
|
+
r: this.wasm.HEAPU32[rPtr >> 2],
|
|
74
|
+
g: this.wasm.HEAPU32[gPtr >> 2],
|
|
75
|
+
b: this.wasm.HEAPU32[bPtr >> 2],
|
|
76
|
+
a: this.wasm.HEAPU32[aPtr >> 2]
|
|
77
|
+
};
|
|
78
|
+
this.bridge.freeAll(rPtr, gPtr, bPtr, aPtr);
|
|
79
|
+
return color;
|
|
80
|
+
}
|
|
81
|
+
_getAttachmentPoints(annotPtr) {
|
|
82
|
+
if (!this.wasm._FPDFAnnot_CountAttachmentPoints) return [];
|
|
83
|
+
const count = this.wasm._FPDFAnnot_CountAttachmentPoints(annotPtr);
|
|
84
|
+
if (count <= 0) return [];
|
|
85
|
+
const points = [];
|
|
86
|
+
const buf = this.wasm._malloc(64);
|
|
87
|
+
for (let i = 0; i < count; i++) {
|
|
88
|
+
this.wasm._FPDFAnnot_GetAttachmentPoints(annotPtr, i, buf);
|
|
89
|
+
points.push({
|
|
90
|
+
x1: this.wasm.HEAPF64[buf >> 3],
|
|
91
|
+
y1: this.wasm.HEAPF64[buf + 8 >> 3],
|
|
92
|
+
x2: this.wasm.HEAPF64[buf + 16 >> 3],
|
|
93
|
+
y2: this.wasm.HEAPF64[buf + 24 >> 3],
|
|
94
|
+
x3: this.wasm.HEAPF64[buf + 32 >> 3],
|
|
95
|
+
y3: this.wasm.HEAPF64[buf + 40 >> 3],
|
|
96
|
+
x4: this.wasm.HEAPF64[buf + 48 >> 3],
|
|
97
|
+
y4: this.wasm.HEAPF64[buf + 56 >> 3]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
this.wasm._free(buf);
|
|
101
|
+
return points;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export { AnnotationReader };
|
|
106
|
+
//# sourceMappingURL=chunk-VRJQZOCH.mjs.map
|
|
107
|
+
//# sourceMappingURL=chunk-VRJQZOCH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/annotations/AnnotationReader.ts"],"names":[],"mappings":"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","file":"chunk-VRJQZOCH.mjs","sourcesContent":["import type { WasmModule, AnnotationData, AnnotationColor, AnnotationRect, AttachmentPoint } from '../types';\nimport { AnnotationType } from '../types';\nimport { WasmBridge } from '../core/WasmBridge';\n\n/**\n * Reads annotations from a PDF page using PDFium's FPDFAnnot_* APIs.\n */\nexport class AnnotationReader {\n private wasm: WasmModule;\n private bridge: WasmBridge;\n\n constructor(wasm: WasmModule, bridge: WasmBridge) {\n this.wasm = wasm;\n this.bridge = bridge;\n }\n\n readAnnotations(pagePtr: number): AnnotationData[] {\n if (!this.wasm._FPDFPage_GetAnnotCount) return [];\n\n const count = this.wasm._FPDFPage_GetAnnotCount(pagePtr);\n const annotations: AnnotationData[] = [];\n\n for (let i = 0; i < count; i++) {\n const annotPtr = this.wasm._FPDFPage_GetAnnot!(pagePtr, i);\n if (annotPtr === 0) continue;\n\n try {\n const data = this._readAnnotation(annotPtr, i);\n if (data) annotations.push(data);\n } finally {\n this.wasm._FPDFPage_CloseAnnot!(annotPtr);\n }\n }\n\n return annotations;\n }\n\n private _readAnnotation(annotPtr: number, index: number): AnnotationData | null {\n const subtype = this.wasm._FPDFAnnot_GetSubtype!(annotPtr);\n const type = subtype as AnnotationType;\n\n const rect = this._getRect(annotPtr);\n if (!rect) return null;\n\n const color = this._getColor(annotPtr);\n const contents = this.bridge.getAnnotStringValue(annotPtr, 'Contents');\n const author = this.bridge.getAnnotStringValue(annotPtr, 'T');\n const modDate = this.bridge.getAnnotStringValue(annotPtr, 'M');\n\n const attachmentPoints = this._getAttachmentPoints(annotPtr);\n\n return {\n index,\n type,\n rect,\n color: color ?? undefined,\n contents: contents || undefined,\n author: author || undefined,\n modificationDate: modDate || undefined,\n attachmentPoints: attachmentPoints.length > 0 ? attachmentPoints : undefined,\n };\n }\n\n private _getRect(annotPtr: number): AnnotationRect | null {\n const rectBuf = this.wasm._malloc(32); // 4 doubles\n const ok = this.wasm._FPDFAnnot_GetRect!(annotPtr, rectBuf);\n if (!ok) {\n this.wasm._free(rectBuf);\n return null;\n }\n\n const rect: AnnotationRect = {\n left: this.wasm.HEAPF64[rectBuf >> 3],\n bottom: this.wasm.HEAPF64[(rectBuf + 8) >> 3],\n right: this.wasm.HEAPF64[(rectBuf + 16) >> 3],\n top: this.wasm.HEAPF64[(rectBuf + 24) >> 3],\n };\n\n this.wasm._free(rectBuf);\n return rect;\n }\n\n private _getColor(annotPtr: number): AnnotationColor | null {\n const rPtr = this.wasm._malloc(4);\n const gPtr = this.wasm._malloc(4);\n const bPtr = this.wasm._malloc(4);\n const aPtr = this.wasm._malloc(4);\n\n // type 0 = color, 1 = interior color\n const ok = this.wasm._FPDFAnnot_GetColor!(annotPtr, 0, rPtr, gPtr, bPtr, aPtr);\n\n if (!ok) {\n this.bridge.freeAll(rPtr, gPtr, bPtr, aPtr);\n return null;\n }\n\n const color: AnnotationColor = {\n r: this.wasm.HEAPU32[rPtr >> 2],\n g: this.wasm.HEAPU32[gPtr >> 2],\n b: this.wasm.HEAPU32[bPtr >> 2],\n a: this.wasm.HEAPU32[aPtr >> 2],\n };\n\n this.bridge.freeAll(rPtr, gPtr, bPtr, aPtr);\n return color;\n }\n\n private _getAttachmentPoints(annotPtr: number): AttachmentPoint[] {\n if (!this.wasm._FPDFAnnot_CountAttachmentPoints) return [];\n\n const count = this.wasm._FPDFAnnot_CountAttachmentPoints(annotPtr);\n if (count <= 0) return [];\n\n const points: AttachmentPoint[] = [];\n const buf = this.wasm._malloc(64); // 8 doubles (4 quadrilateral points x 2 coords)\n\n for (let i = 0; i < count; i++) {\n this.wasm._FPDFAnnot_GetAttachmentPoints!(annotPtr, i, buf);\n points.push({\n x1: this.wasm.HEAPF64[buf >> 3],\n y1: this.wasm.HEAPF64[(buf + 8) >> 3],\n x2: this.wasm.HEAPF64[(buf + 16) >> 3],\n y2: this.wasm.HEAPF64[(buf + 24) >> 3],\n x3: this.wasm.HEAPF64[(buf + 32) >> 3],\n y3: this.wasm.HEAPF64[(buf + 40) >> 3],\n x4: this.wasm.HEAPF64[(buf + 48) >> 3],\n y4: this.wasm.HEAPF64[(buf + 56) >> 3],\n });\n }\n\n this.wasm._free(buf);\n return points;\n }\n}\n"]}
|