@embedpdf/models 2.0.0-next.2 → 2.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/dist/compound-task.d.ts +95 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +199 -11
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/pdf.d.ts +83 -8
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/geometry.ts","../src/logger.ts","../src/task.ts","../src/pdf.ts","../src/color.ts","../src/date.ts","../src/helpers/text-alignment.ts","../src/helpers/font.ts","../src/helpers/blend-mode.ts","../src/helpers/logger.ts","../src/uuid.ts","../src/index.ts"],"sourcesContent":["/**\n * Clockwise direction\n * @public\n */\nexport enum Rotation {\n Degree0 = 0,\n Degree90 = 1,\n Degree180 = 2,\n Degree270 = 3,\n}\n\n/** Clamp a Position to device-pixel integers (floor) */\nexport function toIntPos(p: Position): Position {\n return { x: Math.floor(p.x), y: Math.floor(p.y) };\n}\n\n/** Clamp a Size so it never truncates right / bottom (ceil) */\nexport function toIntSize(s: Size): Size {\n return { width: Math.ceil(s.width), height: Math.ceil(s.height) };\n}\n\n/** Apply both rules to a Rect */\nexport function toIntRect(r: Rect): Rect {\n return {\n origin: toIntPos(r.origin),\n size: toIntSize(r.size),\n };\n}\n\n/**\n * Calculate degree that match the rotation type\n * @param rotation - type of rotation\n * @returns rotated degree\n *\n * @public\n */\nexport function calculateDegree(rotation: Rotation) {\n switch (rotation) {\n case Rotation.Degree0:\n return 0;\n case Rotation.Degree90:\n return 90;\n case Rotation.Degree180:\n return 180;\n case Rotation.Degree270:\n return 270;\n }\n}\n\n/**\n * Calculate angle that match the rotation type\n * @param rotation - type of rotation\n * @returns rotated angle\n *\n * @public\n */\nexport function calculateAngle(rotation: Rotation) {\n return (calculateDegree(rotation) * Math.PI) / 180;\n}\n\n/**\n * Represent the size of object\n *\n * @public\n */\nexport interface Size {\n /**\n * width of the object\n */\n width: number;\n\n /**\n * height of the object\n */\n height: number;\n}\n\n/**\n * Represents a rectangle defined by its left, top, right, and bottom edges\n *\n * @public\n */\nexport interface Box {\n /**\n * The x-coordinate of the left edge\n */\n left: number;\n\n /**\n * The y-coordinate of the top edge\n */\n top: number;\n\n /**\n * The x-coordinate of the right edge\n */\n right: number;\n\n /**\n * The y-coordinate of the bottom edge\n */\n bottom: number;\n}\n\n/**\n * Swap the width and height of the size object\n * @param size - the original size\n * @returns swapped size\n *\n * @public\n */\nexport function swap(size: Size): Size {\n const { width, height } = size;\n\n return {\n width: height,\n height: width,\n };\n}\n\n/**\n * Transform size with specified rotation angle and scale factor\n * @param size - orignal size of rect\n * @param rotation - rotation angle\n * @param scaleFactor - - scale factor\n * @returns size that has been transformed\n *\n * @public\n */\nexport function transformSize(size: Size, rotation: Rotation, scaleFactor: number): Size {\n size = rotation % 2 === 0 ? size : swap(size);\n\n return {\n width: size.width * scaleFactor,\n height: size.height * scaleFactor,\n };\n}\n\n/**\n * position of point\n *\n * @public\n */\nexport interface Position {\n /**\n * x coordinate\n */\n x: number;\n\n /**\n * y coordinate\n */\n y: number;\n}\n\n/**\n * Quadrilateral\n *\n * @public\n */\nexport interface Quad {\n p1: Position;\n p2: Position;\n p3: Position;\n p4: Position;\n}\n\n/**\n * Convert quadrilateral to rectangle\n * @param q - quadrilateral\n * @returns rectangle\n *\n * @public\n */\nexport function quadToRect(q: Quad): Rect {\n const xs = [q.p1.x, q.p2.x, q.p3.x, q.p4.x];\n const ys = [q.p1.y, q.p2.y, q.p3.y, q.p4.y];\n\n return {\n origin: { x: Math.min(...xs), y: Math.min(...ys) },\n size: {\n width: Math.max(...xs) - Math.min(...xs),\n height: Math.max(...ys) - Math.min(...ys),\n },\n };\n}\n\n/**\n * Convert rectangle to quadrilateral\n * @param r - rectangle\n * @returns quadrilateral\n *\n * @public\n */\nexport function rectToQuad(r: Rect): Quad {\n return {\n p1: { x: r.origin.x, y: r.origin.y },\n p2: { x: r.origin.x + r.size.width, y: r.origin.y },\n p3: { x: r.origin.x + r.size.width, y: r.origin.y + r.size.height },\n p4: { x: r.origin.x, y: r.origin.y + r.size.height },\n };\n}\n\n/**\n * Rotate the container and calculate the new position for a point\n * in specified position\n * @param containerSize - size of the container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @returns new position of the point\n *\n * @public\n */\nexport function rotatePosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n): Position {\n let x = position.x;\n let y = position.y;\n\n switch (rotation) {\n case Rotation.Degree0:\n x = position.x;\n y = position.y;\n break;\n case Rotation.Degree90:\n x = containerSize.height - position.y;\n y = position.x;\n break;\n case Rotation.Degree180:\n x = containerSize.width - position.x;\n y = containerSize.height - position.y;\n break;\n case Rotation.Degree270:\n x = position.y;\n y = containerSize.width - position.x;\n break;\n }\n\n return {\n x,\n y,\n };\n}\n\n/**\n * Calculate the position of point by scaling the container\n * @param position - position of the point\n * @param scaleFactor - factor of scaling\n * @returns new position of point\n *\n * @public\n */\nexport function scalePosition(position: Position, scaleFactor: number): Position {\n return {\n x: position.x * scaleFactor,\n y: position.y * scaleFactor,\n };\n}\n\n/**\n * Calculate the position of the point by applying the specified transformation\n * @param containerSize - size of container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns new position of point\n *\n * @public\n */\nexport function transformPosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n scaleFactor: number,\n): Position {\n return scalePosition(rotatePosition(containerSize, position, rotation), scaleFactor);\n}\n\n/**\n * Restore the position in a transformed cotainer\n * @param containerSize - size of the container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns the original position of the point\n *\n * @public\n */\nexport function restorePosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n scaleFactor: number,\n): Position {\n return scalePosition(\n rotatePosition(containerSize, position, (4 - rotation) % 4),\n 1 / scaleFactor,\n );\n}\n\n/**\n * representation of rectangle\n *\n * @public\n */\nexport interface Rect {\n /**\n * origin of the rectangle\n */\n origin: Position;\n\n /**\n * size of the rectangle\n */\n size: Size;\n}\n\n/**\n * Check if two rectangles are equal\n * @param a - first rectangle\n * @param b - second rectangle\n * @returns true if the rectangles are equal, false otherwise\n *\n * @public\n */\nexport function rectEquals(a: Rect, b: Rect): boolean {\n return (\n a.origin.x === b.origin.x &&\n a.origin.y === b.origin.y &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height\n );\n}\n\n/**\n * Calculate the rect from the given points\n * @param pts - points\n * @returns rect\n *\n * @public\n */\nexport function rectFromPoints(positions: Position[]): Rect {\n if (positions.length === 0) {\n return { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } };\n }\n const xs = positions.map((p) => p.x);\n const ys = positions.map((p) => p.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return {\n origin: { x: minX, y: minY },\n size: {\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n },\n };\n}\n\n/**\n * Transform the point by the given angle and translation\n * @param pos - point\n * @param angleRad - angle in radians\n * @param translate - translation\n * @returns transformed point\n *\n * @public\n */\nexport function rotateAndTranslatePoint(\n pos: Position,\n angleRad: number,\n translate: Position,\n): Position {\n const cos = Math.cos(angleRad);\n const sin = Math.sin(angleRad);\n const newX = pos.x * cos - pos.y * sin;\n const newY = pos.x * sin + pos.y * cos;\n return {\n x: newX + translate.x,\n y: newY + translate.y,\n };\n}\n\n/**\n * Expand the rect by the given padding\n * @param rect - rectangle\n * @param padding - padding\n * @returns expanded rect\n *\n * @public\n */\nexport function expandRect(rect: Rect, padding: number): Rect {\n return {\n origin: { x: rect.origin.x - padding, y: rect.origin.y - padding },\n size: { width: rect.size.width + padding * 2, height: rect.size.height + padding * 2 },\n };\n}\n\n/**\n * Calculate the rect after rotated the container\n * @param containerSize - size of container\n * @param rect - target rect\n * @param rotation - rotation angle\n * @returns rotated rect\n *\n * @public\n */\nexport function rotateRect(containerSize: Size, rect: Rect, rotation: Rotation): Rect {\n let x = rect.origin.x;\n let y = rect.origin.y;\n let size = rect.size;\n\n switch (rotation) {\n case Rotation.Degree0:\n break;\n case Rotation.Degree90:\n x = containerSize.height - rect.origin.y - rect.size.height;\n y = rect.origin.x;\n size = swap(rect.size);\n break;\n case Rotation.Degree180:\n x = containerSize.width - rect.origin.x - rect.size.width;\n y = containerSize.height - rect.origin.y - rect.size.height;\n break;\n case Rotation.Degree270:\n x = rect.origin.y;\n y = containerSize.width - rect.origin.x - rect.size.width;\n size = swap(rect.size);\n break;\n }\n\n return {\n origin: {\n x,\n y,\n },\n size: {\n width: size.width,\n height: size.height,\n },\n };\n}\n\n/**\n * Scale the rectangle\n * @param rect - rectangle\n * @param scaleFactor - factor of scaling\n * @returns new rectangle\n *\n * @public\n */\nexport function scaleRect(rect: Rect, scaleFactor: number): Rect {\n return {\n origin: {\n x: rect.origin.x * scaleFactor,\n y: rect.origin.y * scaleFactor,\n },\n size: {\n width: rect.size.width * scaleFactor,\n height: rect.size.height * scaleFactor,\n },\n };\n}\n\n/**\n * Calculate new rectangle after transforming the container\n * @param containerSize - size of the container\n * @param rect - the target rectangle\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns new rectangle after transformation\n *\n * @public\n */\nexport function transformRect(\n containerSize: Size,\n rect: Rect,\n rotation: Rotation,\n scaleFactor: number,\n): Rect {\n return scaleRect(rotateRect(containerSize, rect, rotation), scaleFactor);\n}\n\n/**\n * Calculate new rectangle before transforming the container\n * @param containerSize - size of the container\n * @param rect - the target rectangle\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns original rectangle before transformation\n *\n * @public\n */\nexport function restoreRect(\n containerSize: Size,\n rect: Rect,\n rotation: Rotation,\n scaleFactor: number,\n): Rect {\n return scaleRect(rotateRect(containerSize, rect, (4 - rotation) % 4), 1 / scaleFactor);\n}\n\n/**\n * Calculate the original offset in a transformed container\n * @param offset - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns original position of the point\n *\n * @public\n */\nexport function restoreOffset(offset: Position, rotation: Rotation, scaleFactor: number): Position {\n let offsetX = offset.x;\n let offsetY = offset.y;\n switch (rotation) {\n case Rotation.Degree0:\n offsetX = offset.x / scaleFactor;\n offsetY = offset.y / scaleFactor;\n break;\n case Rotation.Degree90:\n offsetX = offset.y / scaleFactor;\n offsetY = -offset.x / scaleFactor;\n break;\n case Rotation.Degree180:\n offsetX = -offset.x / scaleFactor;\n offsetY = -offset.y / scaleFactor;\n break;\n case Rotation.Degree270:\n offsetX = -offset.y / scaleFactor;\n offsetY = offset.x / scaleFactor;\n break;\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n}\n\n/**\n * Return the smallest rectangle that encloses *all* `rects`.\n * If the array is empty, returns `null`.\n *\n * @param rects - array of rectangles\n * @returns smallest rectangle that encloses all the rectangles\n *\n * @public\n */\nexport function boundingRect(rects: Rect[]): Rect | null {\n if (rects.length === 0) return null;\n\n let minX = rects[0].origin.x,\n minY = rects[0].origin.y,\n maxX = rects[0].origin.x + rects[0].size.width,\n maxY = rects[0].origin.y + rects[0].size.height;\n\n for (const r of rects) {\n minX = Math.min(minX, r.origin.x);\n minY = Math.min(minY, r.origin.y);\n maxX = Math.max(maxX, r.origin.x + r.size.width);\n maxY = Math.max(maxY, r.origin.y + r.size.height);\n }\n\n return {\n origin: {\n x: minX,\n y: minY,\n },\n size: {\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n}\n\nexport interface Matrix {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport function buildUserToDeviceMatrix(\n rect: Rect,\n rotation: Rotation,\n outW: number,\n outH: number,\n): Matrix {\n const L = rect.origin.x;\n const B = rect.origin.y;\n const W = rect.size.width;\n const H = rect.size.height;\n\n // Non-uniform scales chosen to hit the integer device bounds exactly.\n const sx0 = outW / W; // 0°/180°: x scale from W -> outW\n const sy0 = outH / H; // 0°/180°: y scale from H -> outH\n const sx90 = outW / H; // 90°/270°: x depends on H -> outW\n const sy90 = outH / W; // 90°/270°: y depends on W -> outH\n\n switch (rotation) {\n case Rotation.Degree0:\n // x' = sx0*(x-L), y' = sy0*(y-B)\n return { a: sx0, b: 0, c: 0, d: sy0, e: -sx0 * L, f: -sy0 * B };\n\n case Rotation.Degree270:\n // x' = sx90*(y-B)\n // y' = -sy90*(x-L) + sy90*W\n return { a: 0, b: -sy90, c: sx90, d: 0, e: -sx90 * B, f: sy90 * (L + W) };\n\n case Rotation.Degree180:\n // x' = -sx0*(x-L) + sx0*W\n // y' = -sy0*(y-B) + sy0*H\n return { a: -sx0, b: 0, c: 0, d: -sy0, e: sx0 * (L + W), f: sy0 * (B + H) };\n\n case Rotation.Degree90: // clockwise (i.e. 90° CCW)\n // x' = -sx90*(y-B) + sx90*H\n // y' = sy90*(x-L)\n return { a: 0, b: sy90, c: -sx90, d: 0, e: sx90 * (B + H), f: -sy90 * L };\n }\n}\n","/**\n * logger for logging\n *\n * @public\n */\nexport interface Logger {\n /**\n * Check if a log level is enabled\n * @param level - log level to check\n * @returns true if the level is enabled\n *\n * @public\n */\n isEnabled: (level: 'debug' | 'info' | 'warn' | 'error') => boolean;\n\n /**\n * Log debug message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n debug: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log infor message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n info: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log warning message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n warn: (source: string, category: string, ...args: any) => void;\n /**\n * Log error message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n error: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log performance log\n * @param source - source of log\n * @param category - category of log\n * @param event - event of log\n * @param phase - event phase of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n perf: (\n source: string,\n category: string,\n event: string,\n phase: 'Begin' | 'End',\n ...args: any\n ) => void;\n}\n\n/**\n * Logger that log nothing, it will ignore all the logs\n *\n * @public\n */\nexport class NoopLogger implements Logger {\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return false;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug() {}\n /** {@inheritDoc Logger.info} */\n info() {}\n /** {@inheritDoc Logger.warn} */\n warn() {}\n /** {@inheritDoc Logger.error} */\n error() {}\n /** {@inheritDoc Logger.perf} */\n perf() {}\n}\n\n/**\n * Logger that use console as the output\n *\n * @public\n */\nexport class ConsoleLogger implements Logger {\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return true;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n console.debug(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n console.info(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n console.warn(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n console.error(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n console.info(`${source}.${category}.${event}.${phase}`, ...args);\n }\n}\n\n/**\n * Level of log\n *\n * @public\n */\nexport enum LogLevel {\n Debug = 0,\n Info,\n Warn,\n Error,\n}\n\n/**\n * Logger that support filtering by log level\n *\n * @public\n */\nexport class LevelLogger implements Logger {\n /**\n * create new LevelLogger\n * @param logger - the original logger\n * @param level - log level that used for filtering, all logs lower than this level will be filtered out\n */\n constructor(\n private logger: Logger,\n private level: LogLevel,\n ) {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n const levelMap = {\n debug: LogLevel.Debug,\n info: LogLevel.Info,\n warn: LogLevel.Warn,\n error: LogLevel.Error,\n };\n return this.level <= levelMap[level];\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Debug) {\n this.logger.debug(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Info) {\n this.logger.info(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Warn) {\n this.logger.warn(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Error) {\n this.logger.error(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n this.logger.perf(source, category, event, phase, ...args);\n }\n}\n\n/**\n * Logger for performance tracking\n *\n * @public\n */\nexport class PerfLogger implements Logger {\n /**\n * create new PerfLogger\n */\n constructor() {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return false;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.perf} */\n perf(\n source: string,\n category: string,\n event: string,\n phase: 'Begin' | 'End',\n identifier: string,\n ...args: any\n ) {\n switch (phase) {\n case 'Begin':\n globalThis.performance.mark(`${source}.${category}.${event}.${phase}.${identifier}`, {\n detail: args,\n });\n break;\n case 'End':\n globalThis.performance.mark(`${source}.${category}.${event}.${phase}.${identifier}`, {\n detail: args,\n });\n globalThis.performance.measure(\n `${source}.${category}.${event}.Measure.${identifier}`,\n `${source}.${category}.${event}.Begin.${identifier}`,\n `${source}.${category}.${event}.End.${identifier}`,\n );\n break;\n }\n }\n}\n\n/**\n * Logger that will track and call child loggers\n *\n * @public\n */\nexport class AllLogger implements Logger {\n /**\n * create new PerfLogger\n */\n constructor(private loggers: Logger[]) {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n return this.loggers.some((logger) => logger.isEnabled(level));\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.debug(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.info(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.warn(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.error(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n for (const logger of this.loggers) {\n logger.perf(source, category, event, phase, ...args);\n }\n }\n}\n","/**\n * Stage of task\n *\n * @public\n */\nexport enum TaskStage {\n /**\n * Task is pending, means it just start executing\n */\n Pending = 0,\n /**\n * Task is succeed\n */\n Resolved = 1,\n /**\n * Task is failed\n */\n Rejected = 2,\n /**\n * Task is aborted\n */\n Aborted = 3,\n}\n\nexport interface TaskError<D> {\n /**\n * task error type\n */\n type: 'reject' | 'abort';\n /**\n * task error\n */\n reason: D;\n}\n\n/**\n * callback that will be called when task is resolved\n *\n * @public\n */\nexport type ResolvedCallback<R> = (r: R) => void;\n\n/**\n * callback that will be called when task is rejected\n *\n * @public\n */\nexport type RejectedCallback<D> = (e: TaskError<D>) => void;\n\n/**\n * callback that will be called when task is progressing\n *\n * @public\n */\nexport type ProgressCallback<P> = (p: P) => void;\n\n/**\n * Task state in different stage\n *\n * @public\n */\nexport type TaskState<R, D> =\n | {\n stage: TaskStage.Pending;\n }\n | {\n stage: TaskStage.Resolved;\n result: R;\n }\n | {\n stage: TaskStage.Rejected;\n reason: D;\n }\n | {\n stage: TaskStage.Aborted;\n reason: D;\n };\n\n/**\n * Result type for allSettled\n *\n * @public\n */\nexport type TaskSettledResult<R, D> =\n | { status: 'resolved'; value: R }\n | { status: 'rejected'; reason: D }\n | { status: 'aborted'; reason: D };\n\nexport class TaskAbortedError<D> extends Error {\n public readonly reason: D;\n\n constructor(reason: D) {\n super(`Task aborted: ${JSON.stringify(reason)}`);\n this.name = 'TaskAbortedError';\n this.reason = reason;\n }\n}\n\nexport class TaskRejectedError<D> extends Error {\n public readonly reason: D;\n\n constructor(reason: D) {\n super(`Task rejected: ${JSON.stringify(reason)}`);\n this.name = 'TaskRejectedError';\n this.reason = reason;\n }\n}\n\n/**\n * Base class of task\n *\n * @public\n */\nexport class Task<R, D, P = unknown> {\n state: TaskState<R, D> = {\n stage: TaskStage.Pending,\n };\n /**\n * callbacks that will be executed when task is resolved\n */\n resolvedCallbacks: ResolvedCallback<R>[] = [];\n /**\n * callbacks that will be executed when task is rejected\n */\n rejectedCallbacks: RejectedCallback<D>[] = [];\n\n /**\n * Promise that will be resolved when task is settled\n */\n private _promise: Promise<R> | null = null;\n\n /**\n * callbacks that will be executed when task is progressing\n */\n private progressCbs: ProgressCallback<P>[] = [];\n\n /**\n * Convert task to promise\n * @returns promise that will be resolved when task is settled\n */\n toPromise(): Promise<R> {\n if (!this._promise) {\n this._promise = new Promise((resolve, reject) => {\n this.wait(\n (result) => resolve(result),\n (error) => {\n if (error.type === 'abort') {\n reject(new TaskAbortedError(error.reason));\n } else {\n reject(new TaskRejectedError(error.reason));\n }\n },\n );\n });\n }\n return this._promise;\n }\n\n /**\n * wait for task to be settled\n * @param resolvedCallback - callback for resolved value\n * @param rejectedCallback - callback for rejected value\n */\n wait(resolvedCallback: ResolvedCallback<R>, rejectedCallback: RejectedCallback<D>) {\n switch (this.state.stage) {\n case TaskStage.Pending:\n this.resolvedCallbacks.push(resolvedCallback);\n this.rejectedCallbacks.push(rejectedCallback);\n break;\n case TaskStage.Resolved:\n resolvedCallback(this.state.result);\n break;\n case TaskStage.Rejected:\n rejectedCallback({\n type: 'reject',\n reason: this.state.reason,\n });\n break;\n case TaskStage.Aborted:\n rejectedCallback({\n type: 'abort',\n reason: this.state.reason,\n });\n break;\n }\n }\n\n /**\n * resolve task with specific result\n * @param result - result value\n */\n resolve(result: R) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Resolved,\n result,\n };\n for (const resolvedCallback of this.resolvedCallbacks) {\n try {\n resolvedCallback(result);\n } catch (e) {\n /* ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * reject task with specific reason\n * @param reason - abort reason\n *\n */\n reject(reason: D) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Rejected,\n reason,\n };\n for (const rejectedCallback of this.rejectedCallbacks) {\n try {\n rejectedCallback({\n type: 'reject',\n reason,\n });\n } catch (e) {\n /*ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * abort task with specific reason\n * @param reason - abort reason\n */\n abort(reason: D) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Aborted,\n reason,\n };\n for (const rejectedCallback of this.rejectedCallbacks) {\n try {\n rejectedCallback({\n type: 'abort',\n reason,\n });\n } catch (e) {\n /* ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * fail task with a TaskError from another task\n * This is a convenience method for error propagation between tasks\n * @param error - TaskError from another task\n */\n fail(error: TaskError<D>) {\n if (error.type === 'abort') {\n this.abort(error.reason);\n } else {\n this.reject(error.reason);\n }\n }\n\n /**\n * add a progress callback\n * @param cb - progress callback\n */\n onProgress(cb: ProgressCallback<P>) {\n this.progressCbs.push(cb);\n }\n\n /**\n * call progress callback\n * @param p - progress value\n */\n progress(p: P) {\n for (const cb of this.progressCbs) cb(p);\n }\n\n /**\n * Static method to wait for all tasks to resolve\n * Returns a new task that resolves with an array of all results\n * Rejects immediately if any task fails\n *\n * @param tasks - array of tasks to wait for\n * @returns new task that resolves when all input tasks resolve\n * @public\n */\n static all<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<{ [K in keyof R]: R[K] extends Task<infer U, any> ? U : never }, any> {\n type ResultType = { [K in keyof R]: R[K] extends Task<infer U, any> ? U : never };\n\n const combinedTask = new Task<ResultType, any>();\n\n if (tasks.length === 0) {\n combinedTask.resolve([] as any);\n return combinedTask;\n }\n\n const results: any[] = new Array(tasks.length);\n let resolvedCount = 0;\n let isSettled = false;\n\n tasks.forEach((task, index) => {\n task.wait(\n (result) => {\n if (isSettled) return;\n\n results[index] = result;\n resolvedCount++;\n\n if (resolvedCount === tasks.length) {\n isSettled = true;\n combinedTask.resolve(results as ResultType);\n }\n },\n (error) => {\n if (isSettled) return;\n\n isSettled = true;\n if (error.type === 'abort') {\n combinedTask.abort(error.reason);\n } else {\n combinedTask.reject(error.reason);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Static method to wait for all tasks to settle (resolve, reject, or abort)\n * Always resolves with an array of settlement results\n *\n * @param tasks - array of tasks to wait for\n * @returns new task that resolves when all input tasks settle\n * @public\n */\n static allSettled<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<\n { [K in keyof R]: R[K] extends Task<infer U, infer E> ? TaskSettledResult<U, E> : never },\n never\n > {\n type ResultType = {\n [K in keyof R]: R[K] extends Task<infer U, infer E> ? TaskSettledResult<U, E> : never;\n };\n\n const combinedTask = new Task<ResultType, never>();\n\n if (tasks.length === 0) {\n combinedTask.resolve([] as any);\n return combinedTask;\n }\n\n const results: any[] = new Array(tasks.length);\n let settledCount = 0;\n\n tasks.forEach((task, index) => {\n task.wait(\n (result) => {\n results[index] = { status: 'resolved', value: result };\n settledCount++;\n\n if (settledCount === tasks.length) {\n combinedTask.resolve(results as ResultType);\n }\n },\n (error) => {\n results[index] = {\n status: error.type === 'abort' ? 'aborted' : 'rejected',\n reason: error.reason,\n };\n settledCount++;\n\n if (settledCount === tasks.length) {\n combinedTask.resolve(results as ResultType);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Static method that resolves/rejects with the first task that settles\n *\n * @param tasks - array of tasks to race\n * @returns new task that settles with the first input task that settles\n * @public\n */\n static race<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<\n R[number] extends Task<infer U, any> ? U : never,\n R[number] extends Task<any, infer E> ? E : never\n > {\n type ResultType = R[number] extends Task<infer U, any> ? U : never;\n type ErrorType = R[number] extends Task<any, infer E> ? E : never;\n\n const combinedTask = new Task<ResultType, ErrorType>();\n\n if (tasks.length === 0) {\n combinedTask.reject('No tasks provided' as ErrorType);\n return combinedTask;\n }\n\n let isSettled = false;\n\n tasks.forEach((task) => {\n task.wait(\n (result) => {\n if (isSettled) return;\n isSettled = true;\n combinedTask.resolve(result);\n },\n (error) => {\n if (isSettled) return;\n isSettled = true;\n if (error.type === 'abort') {\n combinedTask.abort(error.reason);\n } else {\n combinedTask.reject(error.reason);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Utility to track progress of multiple tasks\n *\n * @param tasks - array of tasks to track\n * @param onProgress - callback called when any task completes\n * @returns new task that resolves when all input tasks resolve\n * @public\n */\n static withProgress<R extends readonly Task<any, any>[]>(\n tasks: R,\n onProgress?: (completed: number, total: number) => void,\n ): Task<{ [K in keyof R]: R[K] extends Task<infer U, any> ? U : never }, any> {\n const combinedTask = Task.all(tasks);\n\n if (onProgress) {\n let completedCount = 0;\n tasks.forEach((task) => {\n task.wait(\n () => {\n completedCount++;\n onProgress(completedCount, tasks.length);\n },\n () => {\n completedCount++;\n onProgress(completedCount, tasks.length);\n },\n );\n });\n }\n\n return combinedTask;\n }\n}\n\n/**\n * Type that represent the result of executing task\n */\nexport type TaskReturn<T extends Task<any, any>> =\n T extends Task<infer R, infer E>\n ? { type: 'result'; value: R } | { type: 'error'; value: TaskError<E> }\n : never;\n","import { Size, Rect, Position, Rotation } from './geometry';\nimport { Task, TaskError } from './task';\n\n/**\n * Representation of pdf page\n *\n * @public\n */\nexport interface PdfPageObject {\n /**\n * Index of this page, starts from 0\n */\n index: number;\n\n /**\n * Orignal size of this page\n */\n size: Size;\n\n /**\n * Rotation of this page\n */\n rotation: Rotation;\n}\n\n/**\n * Representation of pdf page with rotated size\n *\n * @public\n */\nexport interface PdfPageObjectWithRotatedSize extends PdfPageObject {\n /**\n * Rotated size of this page\n */\n rotatedSize: Size;\n}\n\n/**\n * Representation of pdf document\n *\n * @public\n */\nexport interface PdfDocumentObject {\n /**\n * Identity of document\n */\n id: string;\n\n /**\n * Count of pages in this document\n */\n pageCount: number;\n\n /**\n * Pages in this document\n */\n pages: PdfPageObject[];\n}\n\n/**\n * metadata of pdf document\n *\n * @public\n */\nexport interface PdfMetadataObject {\n /**\n * title of the document\n */\n title: string | null;\n /**\n * author of the document\n */\n author: string | null;\n /**\n * subject of the document\n */\n subject: string | null;\n /**\n * keywords of the document\n */\n keywords: string | null;\n /**\n * producer of the document\n */\n producer: string | null;\n /**\n * creator of the document\n */\n creator: string | null;\n /**\n * creation date of the document\n */\n creationDate: Date | null;\n /**\n * modification date of the document\n */\n modificationDate: Date | null;\n /**\n * trapped status of the document\n */\n trapped: PdfTrappedStatus | null;\n\n /**\n * Non-predefined Info dictionary entries.\n */\n custom?: Record<string, string | null>;\n}\n\n/**\n * Unicode **soft-hyphen** marker (`U+00AD`).\n * Often embedded by PDF generators as discretionary hyphens.\n *\n * @public\n */\nexport const PdfSoftHyphenMarker = '\\u00AD';\n\n/**\n * Unicode **zero-width space** (`U+200B`).\n *\n * @public\n */\nexport const PdfZeroWidthSpace = '\\u200B';\n\n/**\n * Unicode **word-joiner** (`U+2060`) – zero-width no-break.\n *\n * @public\n */\nexport const PdfWordJoiner = '\\u2060';\n\n/**\n * Unicode **byte-order mark / zero-width no-break space** (`U+FEFF`).\n *\n * @public\n */\nexport const PdfBomOrZwnbsp = '\\uFEFF';\n\n/**\n * Unicode non-character `U+FFFE`.\n *\n * @public\n */\nexport const PdfNonCharacterFFFE = '\\uFFFE';\n\n/**\n * Unicode non-character `U+FFFF`.\n *\n * @public\n */\nexport const PdfNonCharacterFFFF = '\\uFFFF';\n\n/**\n * **Frozen list** of all unwanted markers in canonical order.\n *\n * @public\n */\nexport const PdfUnwantedTextMarkers = Object.freeze([\n PdfSoftHyphenMarker,\n PdfZeroWidthSpace,\n PdfWordJoiner,\n PdfBomOrZwnbsp,\n PdfNonCharacterFFFE,\n PdfNonCharacterFFFF,\n] as const);\n\n/**\n * Compiled regular expression that matches any unwanted marker.\n *\n * @public\n */\nexport const PdfUnwantedTextRegex = new RegExp(`[${PdfUnwantedTextMarkers.join('')}]`, 'g');\n\n/**\n * Remove all {@link PdfUnwantedTextMarkers | unwanted markers} from *text*.\n *\n * @param text - raw text extracted from PDF\n * @returns cleaned text\n *\n * @public\n */\nexport function stripPdfUnwantedMarkers(text: string): string {\n return text.replace(PdfUnwantedTextRegex, '');\n}\n\n/**\n * Zoom mode\n *\n * @public\n */\nexport enum PdfZoomMode {\n Unknown = 0,\n /**\n * Zoom level with specified offset.\n */\n XYZ = 1,\n /**\n * Fit both the width and height of the page (whichever smaller).\n */\n FitPage = 2,\n /**\n * Fit the entire page width to the window.\n */\n FitHorizontal = 3,\n /**\n * Fit the entire page height to the window.\n */\n FitVertical = 4,\n /**\n * Fit a specific rectangle area within the window.\n */\n FitRectangle = 5,\n /**\n * Fit bounding box of the entire page (including annotations).\n */\n FitBoundingBox = 6,\n /**\n * Fit the bounding box width of the page.\n */\n FitBoundingBoxHorizontal = 7,\n /**\n * Fit the bounding box height of the page.\n */\n FitBoundingBoxVertical = 8,\n}\n\n/**\n * Trapped status of the document.\n *\n * @public\n */\nexport enum PdfTrappedStatus {\n /**\n * No /Trapped key\n */\n NotSet = 0,\n /**\n * Explicitly /Trapped /True\n */\n True = 1,\n /**\n * Explicitly /Trapped /False\n */\n False = 2,\n /**\n * Explicitly /Trapped /Unknown or invalid\n */\n Unknown = 3,\n}\n\n/**\n * 12 default fonts for PDF\n */\nexport enum PdfStandardFont {\n Unknown = -1,\n Courier = 0,\n Courier_Bold = 1,\n Courier_BoldOblique = 2,\n Courier_Oblique = 3,\n Helvetica = 4,\n Helvetica_Bold = 5,\n Helvetica_BoldOblique = 6,\n Helvetica_Oblique = 7,\n Times_Roman = 8,\n Times_Bold = 9,\n Times_BoldItalic = 10,\n Times_Italic = 11,\n Symbol = 12,\n ZapfDingbats = 13,\n}\n\n/**\n * Text alignment\n */\nexport enum PdfTextAlignment {\n Left = 0,\n Center = 1,\n Right = 2,\n}\n\n/**\n * Vertical alignment\n */\nexport enum PdfVerticalAlignment {\n Top = 0,\n Middle = 1,\n Bottom = 2,\n}\n\n/**\n * Blend mode\n *\n * @public\n */\nexport enum PdfBlendMode {\n Normal = 0,\n Multiply = 1,\n Screen = 2,\n Overlay = 3,\n Darken = 4,\n Lighten = 5,\n ColorDodge = 6,\n ColorBurn = 7,\n HardLight = 8,\n SoftLight = 9,\n Difference = 10,\n Exclusion = 11,\n Hue = 12,\n Saturation = 13,\n Color = 14,\n Luminosity = 15,\n}\n\n/**\n * Stamp fit\n */\nexport enum PdfStampFit {\n Contain = 0,\n Cover = 1,\n Stretch = 2,\n}\n\n/**\n * Representation of the linked destination\n *\n * @public\n */\nexport interface PdfDestinationObject {\n /**\n * Index of target page\n */\n pageIndex: number;\n /**\n * zoom config for target destination\n */\n zoom:\n | {\n mode: PdfZoomMode.Unknown;\n }\n | { mode: PdfZoomMode.XYZ; params: { x: number; y: number; zoom: number } }\n | {\n mode: PdfZoomMode.FitPage;\n }\n | {\n mode: PdfZoomMode.FitHorizontal;\n }\n | {\n mode: PdfZoomMode.FitVertical;\n }\n | {\n mode: PdfZoomMode.FitRectangle;\n }\n | {\n mode: PdfZoomMode.FitBoundingBox;\n }\n | {\n mode: PdfZoomMode.FitBoundingBoxHorizontal;\n }\n | {\n mode: PdfZoomMode.FitBoundingBoxVertical;\n };\n view: number[];\n}\n\n/**\n * Type of pdf action\n *\n * @public\n */\nexport enum PdfActionType {\n Unsupported = 0,\n /**\n * Goto specified position in this document\n */\n Goto = 1,\n /**\n * Goto specified position in another document\n */\n RemoteGoto = 2,\n /**\n * Goto specified URI\n */\n URI = 3,\n /**\n * Launch specifed application\n */\n LaunchAppOrOpenFile = 4,\n}\n\nexport type PdfImage = {\n data: Uint8ClampedArray<ArrayBuffer>;\n width: number;\n height: number;\n};\n\n/**\n * Representation of pdf action\n *\n * @public\n */\nexport type PdfActionObject =\n | {\n type: PdfActionType.Unsupported;\n }\n | {\n type: PdfActionType.Goto;\n destination: PdfDestinationObject;\n }\n | {\n type: PdfActionType.RemoteGoto;\n destination: PdfDestinationObject;\n }\n | {\n type: PdfActionType.URI;\n uri: string;\n }\n | {\n type: PdfActionType.LaunchAppOrOpenFile;\n path: string;\n };\n\n/**\n * target of pdf link\n *\n * @public\n */\nexport type PdfLinkTarget =\n | {\n type: 'action';\n action: PdfActionObject;\n }\n | {\n type: 'destination';\n destination: PdfDestinationObject;\n };\n\n/**\n * PDF bookmark\n *\n * @public\n */\nexport interface PdfBookmarkObject {\n /**\n * title of bookmark\n */\n title: string;\n\n /**\n * target of bookmark\n */\n target?: PdfLinkTarget | undefined;\n\n /**\n * bookmarks in the next level\n */\n children?: PdfBookmarkObject[];\n}\n\n/**\n * Pdf Signature\n *\n * @public\n */\nexport interface PdfSignatureObject {\n /**\n * contents of signature\n */\n contents: ArrayBuffer;\n\n /**\n * byte range of signature\n */\n byteRange: ArrayBuffer;\n\n /**\n * sub filters of signature\n */\n subFilter: ArrayBuffer;\n\n /**\n * reason of signature\n */\n reason: string;\n\n /**\n * creation time of signature\n */\n time: string;\n\n /**\n * MDP\n */\n docMDP: number;\n}\n\n/**\n * Bookmark tree of pdf\n *\n * @public\n */\nexport interface PdfBookmarksObject {\n bookmarks: PdfBookmarkObject[];\n}\n\n/**\n * Text rectangle in pdf page\n *\n * @public\n */\nexport interface PdfTextRectObject {\n /**\n * Font of the text\n */\n font: {\n /**\n * font family\n */\n family: string;\n\n /**\n * font size\n */\n size: number;\n };\n\n /**\n * content in this rectangle area\n */\n content: string;\n\n /**\n * rectangle of the text\n */\n rect: Rect;\n}\n\n/**\n * Color\n *\n * @public\n */\nexport interface PdfAlphaColor {\n /**\n * red\n */\n red: number;\n /**\n * green\n */\n green: number;\n /**\n * blue\n */\n blue: number;\n /**\n * alpha\n */\n alpha: number;\n}\n\n/**\n * Color\n *\n * @public\n */\nexport interface PdfColor {\n red: number;\n green: number;\n blue: number;\n}\n\n/**\n * Annotation type\n *\n * @public\n */\nexport enum PdfAnnotationSubtype {\n UNKNOWN = 0,\n TEXT,\n LINK,\n FREETEXT,\n LINE,\n SQUARE,\n CIRCLE,\n POLYGON,\n POLYLINE,\n HIGHLIGHT,\n UNDERLINE,\n SQUIGGLY,\n STRIKEOUT,\n STAMP,\n CARET,\n INK,\n POPUP,\n FILEATTACHMENT,\n SOUND,\n MOVIE,\n WIDGET,\n SCREEN,\n PRINTERMARK,\n TRAPNET,\n WATERMARK,\n THREED,\n RICHMEDIA,\n XFAWIDGET,\n REDACT,\n}\n\n/**\n * Name of annotation type\n *\n * @public\n */\nexport const PdfAnnotationSubtypeName: Record<PdfAnnotationSubtype, string> = {\n [PdfAnnotationSubtype.UNKNOWN]: 'unknow',\n [PdfAnnotationSubtype.TEXT]: 'text',\n [PdfAnnotationSubtype.LINK]: 'link',\n [PdfAnnotationSubtype.FREETEXT]: 'freetext',\n [PdfAnnotationSubtype.LINE]: 'line',\n [PdfAnnotationSubtype.SQUARE]: 'square',\n [PdfAnnotationSubtype.CIRCLE]: 'circle',\n [PdfAnnotationSubtype.POLYGON]: 'polygon',\n [PdfAnnotationSubtype.POLYLINE]: 'polyline',\n [PdfAnnotationSubtype.HIGHLIGHT]: 'highlight',\n [PdfAnnotationSubtype.UNDERLINE]: 'underline',\n [PdfAnnotationSubtype.SQUIGGLY]: 'squiggly',\n [PdfAnnotationSubtype.STRIKEOUT]: 'strikeout',\n [PdfAnnotationSubtype.STAMP]: 'stamp',\n [PdfAnnotationSubtype.CARET]: 'caret',\n [PdfAnnotationSubtype.INK]: 'ink',\n [PdfAnnotationSubtype.POPUP]: 'popup',\n [PdfAnnotationSubtype.FILEATTACHMENT]: 'fileattachment',\n [PdfAnnotationSubtype.SOUND]: 'sound',\n [PdfAnnotationSubtype.MOVIE]: 'movie',\n [PdfAnnotationSubtype.WIDGET]: 'widget',\n [PdfAnnotationSubtype.SCREEN]: 'screen',\n [PdfAnnotationSubtype.PRINTERMARK]: 'printermark',\n [PdfAnnotationSubtype.TRAPNET]: 'trapnet',\n [PdfAnnotationSubtype.WATERMARK]: 'watermark',\n [PdfAnnotationSubtype.THREED]: 'threed',\n [PdfAnnotationSubtype.RICHMEDIA]: 'richmedia',\n [PdfAnnotationSubtype.XFAWIDGET]: 'xfawidget',\n [PdfAnnotationSubtype.REDACT]: 'redact',\n};\n\n/**\n * Context map for annotation subtypes\n *\n * @public\n */\nexport interface AnnotationContextMap {\n [PdfAnnotationSubtype.STAMP]: { imageData: ImageData };\n // add more sub-types here if they ever need extra data\n}\n\n/**\n * Context type for annotation subtypes\n *\n * @public\n */\nexport type AnnotationCreateContext<A extends PdfAnnotationObject> =\n A['type'] extends keyof AnnotationContextMap ? AnnotationContextMap[A['type']] : undefined;\n\n/**\n * Status of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationObjectStatus {\n /**\n * Annotation is created\n */\n Created,\n /**\n * Annotation is committed to PDF file\n */\n Committed,\n}\n\n/**\n * Appearance mode\n *\n * @public\n */\nexport enum AppearanceMode {\n Normal = 0,\n Rollover = 1,\n Down = 2,\n}\n\n/**\n * State of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationState {\n /**\n * Annotation is active\n */\n Marked = 'Marked',\n /**\n * Annotation is unmarked\n */\n Unmarked = 'Unmarked',\n /**\n * Annotation is ink\n */\n Accepted = 'Accepted',\n /**\n * Annotation is rejected\n */\n Rejected = 'Rejected',\n /**\n * Annotation is complete\n */\n Completed = 'Completed',\n /**\n * Annotation is cancelled\n */\n Cancelled = 'Cancelled',\n /**\n * Annotation is none\n */\n None = 'None',\n}\n\n/**\n * State model of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationStateModel {\n /**\n * Annotation is marked\n */\n Marked = 'Marked',\n /**\n * Annotation is reviewed\n */\n Review = 'Review',\n}\n\n/**\n * Icon of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationIcon {\n /**\n * Unknown icon\n */\n Unknown = -1,\n /**\n * Comment icon\n */\n Comment = 0,\n /**\n * Key icon\n */\n Key = 1,\n /**\n * Note icon\n */\n Note = 2,\n /**\n * Help icon\n */\n Help = 3,\n /**\n * New paragraph icon\n */\n NewParagraph = 4,\n /**\n * Paragraph icon\n */\n Paragraph = 5,\n /**\n * Insert icon\n */\n Insert = 6,\n /**\n * Graph icon\n */\n Graph = 7,\n /**\n * Push pin icon\n */\n PushPin = 8,\n /**\n * Paperclip icon\n */\n Paperclip = 9,\n /**\n * Tag icon\n */\n Tag = 10,\n /**\n * Speaker icon\n */\n Speaker = 11,\n /**\n * Mic icon\n */\n Mic = 12,\n /**\n * Approved icon\n */\n Approved = 13,\n /**\n * Experimental icon\n */\n Experimental = 14,\n /**\n * Not approved icon\n */\n NotApproved = 15,\n /**\n * As is icon\n */\n AsIs = 16,\n /**\n * Expired icon\n */\n Expired = 17,\n /**\n * Not for public release icon\n */\n NotForPublicRelease = 18,\n /**\n * Confidential icon\n */\n Confidential = 19,\n /**\n * Final icon\n */\n Final = 20,\n /**\n * Sold icon\n */\n Sold = 21,\n /**\n * Departmental icon\n */\n Departmental = 22,\n /**\n * For comment icon\n */\n ForComment = 23,\n /**\n * Top secret icon\n */\n TopSecret = 24,\n /**\n * Draft icon\n */\n Draft = 25,\n /**\n * For public release icon\n */\n ForPublicRelease = 26,\n}\n\n/**\n * Line ending of annotation\n */\nexport enum PdfAnnotationLineEnding {\n /**\n * No line ending\n */\n None = 0,\n /**\n * Square line ending\n */\n Square = 1,\n /**\n * Circle line ending\n */\n Circle = 2,\n /**\n * Diamond line ending\n */\n Diamond = 3,\n /**\n * Open arrow line ending\n */\n OpenArrow = 4,\n /**\n * Closed arrow line ending\n */\n ClosedArrow = 5,\n /**\n * Butt line ending\n */\n Butt = 6,\n /**\n * Right open arrow line ending\n */\n ROpenArrow = 7,\n /**\n * Right closed arrow line ending\n */\n RClosedArrow = 8,\n /**\n * Slash line ending\n */\n Slash = 9,\n /**\n * Unknown line ending\n */\n Unknown = 10,\n}\n\n/**\n * Basic information of pdf annotation\n *\n * @public\n */\nexport interface PdfAnnotationObjectBase {\n /**\n * Author of the annotation\n */\n author?: string;\n\n /**\n * Modified date of the annotation\n */\n modified?: Date;\n\n /**\n * Created date of the annotation\n */\n created?: Date;\n\n /**\n * blend mode of annotation\n */\n blendMode?: PdfBlendMode;\n\n /**\n * intent of annotation\n */\n intent?: string;\n\n /**\n * Sub type of annotation\n */\n type: PdfAnnotationSubtype;\n\n /**\n * flags of the annotation\n */\n flags?: PdfAnnotationFlagName[];\n\n /**\n * The index of page that this annotation belong to\n */\n pageIndex: number;\n\n /**\n * contents of the annotation\n */\n contents?: string;\n\n /**\n * id of the annotation\n */\n id: string;\n\n /**\n * Rectangle of the annotation\n */\n rect: Rect;\n\n /**\n * Custom data of the annotation\n */\n custom?: any;\n}\n\n/**\n * Popup annotation\n *\n * @public\n */\nexport interface PdfPopupAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POPUP;\n /**\n * Contents of the popup\n */\n contents: string;\n\n /**\n * Whether the popup is opened or not\n */\n open: boolean;\n\n /**\n * In reply to id\n */\n inReplyToId?: string;\n}\n\n/**\n * Pdf Link annotation\n *\n * @public\n */\nexport interface PdfLinkAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.LINK;\n /**\n * target of the link\n */\n target: PdfLinkTarget | undefined;\n}\n\n/**\n * Pdf Text annotation\n *\n * @public\n */\nexport interface PdfTextAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.TEXT;\n /**\n * Text contents of the annotation\n */\n contents: string;\n\n /**\n * color of text annotation\n */\n color?: string;\n\n /**\n * opacity of text annotation\n */\n opacity?: number;\n\n /**\n * In reply to id\n */\n inReplyToId?: string;\n\n /**\n * State of the text annotation\n */\n state?: PdfAnnotationState;\n\n /**\n * State model of the text annotation\n */\n stateModel?: PdfAnnotationStateModel;\n\n /**\n * Icon of the text annotation\n */\n icon?: PdfAnnotationIcon;\n}\n\n/**\n * Type of form field\n *\n * @public\n */\nexport enum PDF_FORM_FIELD_TYPE {\n /**\n * Unknow\n */\n UNKNOWN = 0,\n /**\n * push button type\n */\n PUSHBUTTON = 1,\n /**\n * check box type.\n */\n CHECKBOX = 2,\n /**\n * radio button type.\n */\n RADIOBUTTON = 3,\n /**\n * combo box type.\n */\n COMBOBOX = 4,\n /**\n * list box type.\n */\n LISTBOX = 5,\n /**\n * text field type\n */\n TEXTFIELD = 6,\n /**\n * signature field type.\n */\n SIGNATURE = 7,\n /**\n * Generic XFA type.\n */\n XFA = 8,\n /**\n * XFA check box type.\n */\n XFA_CHECKBOX = 9,\n /**\n * XFA combo box type.\n */\n XFA_COMBOBOX = 10,\n /**\n * XFA image field type.\n */\n XFA_IMAGEFIELD = 11,\n /**\n * XFA list box type.\n */\n XFA_LISTBOX = 12,\n /**\n * XFA push button type.\n */\n XFA_PUSHBUTTON = 13,\n /**\n * XFA signture field type.\n */\n XFA_SIGNATURE = 14,\n /**\n * XFA text field type.\n */\n XFA_TEXTFIELD = 15,\n}\n\nexport enum PdfAnnotationColorType {\n Color = 0,\n InteriorColor = 1,\n}\n\n/**\n * Border style of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationBorderStyle {\n UNKNOWN = 0,\n SOLID = 1,\n DASHED = 2,\n BEVELED = 3,\n INSET = 4,\n UNDERLINE = 5,\n CLOUDY = 6,\n}\n\n/**\n * Flag of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationFlags {\n NONE = 0,\n INVISIBLE = 1 << 0,\n HIDDEN = 1 << 1,\n PRINT = 1 << 2,\n NO_ZOOM = 1 << 3,\n NO_ROTATE = 1 << 4,\n NO_VIEW = 1 << 5,\n READ_ONLY = 1 << 6,\n LOCKED = 1 << 7,\n TOGGLE_NOVIEW = 1 << 8,\n}\n\n/**\n * Flag of form field\n *\n * @public\n */\nexport enum PDF_FORM_FIELD_FLAG {\n NONE = 0,\n READONLY = 1 << 0,\n REQUIRED = 1 << 1,\n NOEXPORT = 1 << 2,\n TEXT_MULTIPLINE = 1 << 12,\n TEXT_PASSWORD = 1 << 13,\n CHOICE_COMBO = 1 << 17,\n CHOICE_EDIT = 1 << 18,\n CHOICE_MULTL_SELECT = 1 << 21,\n}\n\n/**\n * Type of pdf object\n *\n * @public\n */\nexport enum PdfPageObjectType {\n UNKNOWN = 0,\n TEXT = 1,\n PATH = 2,\n IMAGE = 3,\n SHADING = 4,\n FORM = 5,\n}\n\n/**\n * Line points\n *\n * @public\n */\nexport interface LinePoints {\n start: Position;\n end: Position;\n}\n\n/**\n * Line endings\n *\n * @public\n */\nexport interface LineEndings {\n start: PdfAnnotationLineEnding;\n end: PdfAnnotationLineEnding;\n}\n\n/**\n * Options of pdf widget annotation\n *\n * @public\n */\nexport interface PdfWidgetAnnoOption {\n label: string;\n isSelected: boolean;\n}\n\nexport type PdfAnnotationFlagName =\n | 'invisible'\n | 'hidden'\n | 'print'\n | 'noZoom'\n | 'noRotate'\n | 'noView'\n | 'readOnly'\n | 'locked'\n | 'toggleNoView';\n\ntype FlagMap = Partial<\n Record<Exclude<PdfAnnotationFlags, PdfAnnotationFlags.NONE>, PdfAnnotationFlagName>\n>;\n\nexport const PdfAnnotationFlagName: Readonly<FlagMap> = Object.freeze({\n [PdfAnnotationFlags.INVISIBLE]: 'invisible',\n [PdfAnnotationFlags.HIDDEN]: 'hidden',\n [PdfAnnotationFlags.PRINT]: 'print',\n [PdfAnnotationFlags.NO_ZOOM]: 'noZoom',\n [PdfAnnotationFlags.NO_ROTATE]: 'noRotate',\n [PdfAnnotationFlags.NO_VIEW]: 'noView',\n [PdfAnnotationFlags.READ_ONLY]: 'readOnly',\n [PdfAnnotationFlags.LOCKED]: 'locked',\n [PdfAnnotationFlags.TOGGLE_NOVIEW]: 'toggleNoView',\n} as const);\n\n/** Build a reverse map once so look-ups are O(1) */\nconst PdfAnnotationFlagValue: Record<PdfAnnotationFlagName, PdfAnnotationFlags> = Object.entries(\n PdfAnnotationFlagName,\n).reduce(\n (acc, [bit, name]) => {\n acc[name as PdfAnnotationFlagName] = Number(bit) as PdfAnnotationFlags;\n return acc;\n },\n {} as Record<PdfAnnotationFlagName, PdfAnnotationFlags>,\n);\n\n/**\n * Convert the raw bit-mask coming from `FPDFAnnot_GetFlags()` into\n * an array of human-readable flag names (“invisible”, “print”…).\n */\nexport function flagsToNames(raw: number): PdfAnnotationFlagName[] {\n return (\n Object.keys(PdfAnnotationFlagName) as unknown as Exclude<\n PdfAnnotationFlags,\n PdfAnnotationFlags.NONE\n >[]\n )\n .filter((flag) => (raw & flag) !== 0)\n .map((flag) => PdfAnnotationFlagName[flag]!);\n}\n\n/**\n * Convert an array of flag-names back into the numeric mask that\n * PDFium expects for `FPDFAnnot_SetFlags()`.\n */\nexport function namesToFlags(names: readonly PdfAnnotationFlagName[]): PdfAnnotationFlags {\n return names.reduce<PdfAnnotationFlags>(\n (mask, name) => mask | PdfAnnotationFlagValue[name],\n PdfAnnotationFlags.NONE,\n );\n}\n\n/**\n * Field of PDF widget annotation\n *\n * @public\n */\nexport interface PdfWidgetAnnoField {\n /**\n * flag of field\n */\n flag: PDF_FORM_FIELD_FLAG;\n /**\n * name of field\n */\n name: string;\n /**\n * alternate name of field\n */\n alternateName: string;\n /**\n * type of field\n */\n type: PDF_FORM_FIELD_TYPE;\n /**\n * value of field\n */\n value: string;\n /**\n * whether field is checked\n */\n isChecked: boolean;\n /**\n * options of field\n */\n options: PdfWidgetAnnoOption[];\n}\n\n/**\n * PDF widget object\n *\n * @public\n */\nexport interface PdfWidgetAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.WIDGET;\n /**\n * Field of pdf widget object\n */\n field: PdfWidgetAnnoField;\n}\n\n/**\n * Pdf file attachments annotation\n *\n * @public\n */\nexport interface PdfFileAttachmentAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.FILEATTACHMENT;\n}\n\n/**\n * ink list in pdf ink annotation\n *\n * @public\n */\nexport interface PdfInkListObject {\n points: Position[];\n}\n\n/**\n * Pdf ink annotation\n *\n * @public\n */\nexport interface PdfInkAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.INK;\n /**\n * ink list of annotation\n */\n inkList: PdfInkListObject[];\n /**\n * color of ink annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n}\n\n/**\n * Pdf polygon annotation\n *\n * @public\n */\nexport interface PdfPolygonAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POLYGON;\n\n /**\n * contents of polygon annotation\n */\n contents?: string;\n\n /**\n * vertices of annotation\n */\n vertices: Position[];\n\n /**\n * color of ink annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of polygon annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of polygon annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of polygon annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF polyline annotation\n *\n * @public\n */\nexport interface PdfPolylineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POLYLINE;\n\n /**\n * contents of polyline annotation\n */\n contents?: string;\n\n /**\n * start and end line endings of polyline\n */\n lineEndings?: LineEndings;\n\n /**\n * vertices of annotation\n */\n vertices: Position[];\n\n /**\n * interior color of line annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of line annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of polyline annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of polyline annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF line annotation\n *\n * @public\n */\nexport interface PdfLineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.LINE;\n\n /**\n * contents of line annotation\n */\n contents?: string;\n\n /**\n * start and end points of line\n */\n linePoints: LinePoints;\n\n /**\n * start and end line endings of line\n */\n lineEndings?: LineEndings;\n\n /**\n * interior color of line annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of line annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of line annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of line annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF highlight annotation\n *\n * @public\n */\nexport interface PdfHighlightAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.HIGHLIGHT;\n\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n\n /**\n * color of highlight annotation\n */\n color: string;\n\n /**\n * opacity of highlight annotation\n */\n opacity: number;\n\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Matrix for transformation, in the form [a b c d e f], equivalent to:\n * | a b 0 |\n * | c d 0 |\n * | e f 1 |\n *\n * Translation is performed with [1 0 0 1 tx ty].\n * Scaling is performed with [sx 0 0 sy 0 0].\n * See PDF Reference 1.7, 4.2.2 Common Transformations for more.\n */\nexport interface PdfTransformMatrix {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\n/**\n * type of segment type in pdf path object\n *\n * @public\n */\nexport enum PdfSegmentObjectType {\n UNKNOWN = -1,\n LINETO = 0,\n BEZIERTO = 1,\n MOVETO = 2,\n}\n\n/**\n * segment of path object\n *\n * @public\n */\nexport interface PdfSegmentObject {\n type: PdfSegmentObjectType;\n /**\n * point of the segment\n */\n point: Position;\n /**\n * whether this segment close the path\n */\n isClosed: boolean;\n}\n\n/**\n * Pdf path object\n *\n * @public\n */\nexport interface PdfPathObject {\n type: PdfPageObjectType.PATH;\n /**\n * bound that contains the path\n */\n bounds: { left: number; bottom: number; right: number; top: number };\n /**\n * segments of the path\n */\n segments: PdfSegmentObject[];\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Pdf image object\n *\n * @public\n */\nexport interface PdfImageObject {\n type: PdfPageObjectType.IMAGE;\n /**\n * data of the image\n */\n imageData: ImageData;\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Pdf form object\n *\n * @public\n */\nexport interface PdfFormObject {\n type: PdfPageObjectType.FORM;\n /**\n * objects that in this form object\n */\n objects: (PdfImageObject | PdfPathObject | PdfFormObject)[];\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Contents type of pdf stamp annotation\n *\n * @public\n */\nexport type PdfStampAnnoObjectContents = Array<PdfPathObject | PdfImageObject | PdfFormObject>;\n\n/**\n * Pdf stamp annotation\n *\n * @public\n */\nexport interface PdfStampAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.STAMP;\n /**\n * Icon of the stamp annotation\n */\n icon?: PdfAnnotationIcon;\n /**\n * Subject of the stamp annotation\n */\n subject?: string;\n}\n\n/**\n * Pdf circle annotation\n *\n * @public\n */\nexport interface PdfCircleAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.CIRCLE;\n /**\n * flags of circle annotation\n */\n flags: PdfAnnotationFlagName[];\n /**\n * Text contents of the circle annotation\n */\n contents?: string;\n /**\n * color of circle annotation\n */\n color: string;\n /**\n * opacity of circle annotation\n */\n opacity: number;\n /**\n * stroke-width of circle annotation\n */\n strokeWidth: number;\n /**\n * stroke color of circle annotation\n */\n strokeColor: string;\n /**\n * stroke style of circle annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n /**\n * stroke dash array of circle annotation\n */\n strokeDashArray?: number[];\n /**\n * cloudy border intensity of circle annotation\n */\n cloudyBorderIntensity?: number;\n /**\n * cloudy border inset of circle annotation\n */\n cloudyBorderInset?: number[];\n}\n\n/**\n * Pdf square annotation\n *\n * @public\n */\nexport interface PdfSquareAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.SQUARE;\n /**\n * Text contents of the square annotation\n */\n contents?: string;\n /**\n * flags of square annotation\n */\n flags: PdfAnnotationFlagName[];\n /**\n * color of square annotation\n */\n color: string;\n /**\n * opacity of square annotation\n */\n opacity: number;\n /**\n * stroke-width of square annotation\n */\n strokeWidth: number;\n /**\n * stroke color of square annotation\n */\n strokeColor: string;\n /**\n * stroke style of square annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n /**\n * stroke dash array of square annotation\n */\n strokeDashArray?: number[];\n /**\n * cloudy border intensity of circle annotation\n */\n cloudyBorderIntensity?: number;\n /**\n * cloudy border inset of circle annotation\n */\n cloudyBorderInset?: number[];\n}\n\n/**\n * Pdf squiggly annotation\n *\n * @public\n */\nexport interface PdfSquigglyAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.SQUIGGLY;\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf underline annotation\n *\n * @public\n */\nexport interface PdfUnderlineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.UNDERLINE;\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf strike out annotation\n *\n * @public\n */\nexport interface PdfStrikeOutAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.STRIKEOUT;\n /**\n * Text contents of the strike out annotation\n */\n contents?: string;\n\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf caret annotation\n *\n * @public\n */\nexport interface PdfCaretAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.CARET;\n}\n\n/**\n * Pdf free text annotation\n *\n * @public\n */\nexport interface PdfFreeTextAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.FREETEXT;\n /**\n * Text contents of the free text annotation\n */\n contents: string;\n /**\n * Font family of the free text annotation\n */\n fontFamily: PdfStandardFont;\n /**\n * Font size of the free text annotation\n */\n fontSize: number;\n /**\n * Font color of the free text annotation\n */\n fontColor: string;\n /**\n * Text alignment of the free text annotation\n */\n textAlign: PdfTextAlignment;\n /**\n * Vertical alignment of the free text annotation\n */\n verticalAlign: PdfVerticalAlignment;\n /**\n * Opacity of the free text annotation\n */\n opacity: number;\n /**\n * Background color of the free text annotation\n */\n backgroundColor?: string;\n /**\n * Default style of the free text annotation\n */\n defaultStyle?: string;\n /**\n * Rich content of the free text annotation\n */\n richContent?: string;\n}\n\n/**\n * All annotation that support\n *\n * @public\n */\nexport type PdfSupportedAnnoObject =\n | PdfInkAnnoObject\n | PdfTextAnnoObject\n | PdfLinkAnnoObject\n | PdfPolygonAnnoObject\n | PdfPolylineAnnoObject\n | PdfHighlightAnnoObject\n | PdfLineAnnoObject\n | PdfWidgetAnnoObject\n | PdfFileAttachmentAnnoObject\n | PdfStampAnnoObject\n | PdfSquareAnnoObject\n | PdfCircleAnnoObject\n | PdfSquigglyAnnoObject\n | PdfUnderlineAnnoObject\n | PdfStrikeOutAnnoObject\n | PdfCaretAnnoObject\n | PdfFreeTextAnnoObject;\n\n/**\n * Pdf annotation that does not support\n *\n * @public\n */\nexport interface PdfUnsupportedAnnoObject extends PdfAnnotationObjectBase {\n type: Exclude<PdfAnnotationSubtype, PdfSupportedAnnoObject['type']>;\n}\n\n/**\n * all annotations\n *\n * @public\n */\nexport type PdfAnnotationObject = PdfSupportedAnnoObject | PdfUnsupportedAnnoObject;\n\n/**\n * Pdf attachment\n *\n * @public\n */\nexport interface PdfAttachmentObject {\n index: number;\n name: string;\n description: string;\n mimeType: string;\n size?: number;\n creationDate?: Date;\n checksum: string;\n}\n\n/**\n * Pdf engine features\n *\n * @public\n */\nexport enum PdfEngineFeature {\n RenderPage,\n RenderPageRect,\n Thumbnails,\n Bookmarks,\n Annotations,\n}\n\n/**\n * All operations for this engine\n *\n * @public\n */\nexport enum PdfEngineOperation {\n Create,\n Read,\n Update,\n Delete,\n}\n\n/**\n * flags to match the text during searching\n *\n * @public\n */\nexport enum MatchFlag {\n None = 0,\n MatchCase = 1,\n MatchWholeWord = 2,\n MatchConsecutive = 4,\n}\n\n/**\n * Union all the flags\n * @param flags - all the flags\n * @returns union of flags\n *\n * @public\n */\nexport function unionFlags(flags: MatchFlag[]) {\n return flags.reduce((flag, currFlag) => {\n return flag | currFlag;\n }, MatchFlag.None);\n}\n\n/**\n * Image conversion types\n *\n * @public\n */\nexport type ImageConversionTypes = 'image/webp' | 'image/png' | 'image/jpeg';\n\n/**\n * Targe for searching\n *\n * @public\n */\nexport interface SearchTarget {\n keyword: string;\n flags: MatchFlag[];\n}\n\n/**\n * compare 2 search target\n * @param targetA - first target for search\n * @param targetB - second target for search\n * @returns whether 2 search target are the same\n *\n * @public\n */\nexport function compareSearchTarget(targetA: SearchTarget, targetB: SearchTarget) {\n const flagA = unionFlags(targetA.flags);\n const flagB = unionFlags(targetB.flags);\n\n return flagA === flagB && targetA.keyword === targetB.keyword;\n}\n\n/** Context of one hit */\nexport interface TextContext {\n /** Complete words that come *before* the hit (no ellipsis) */\n before: string;\n /** Exactly the text that matched (case-preserved) */\n match: string;\n /** Complete words that come *after* the hit (no ellipsis) */\n after: string;\n /** `true` ⇢ there were more words on the left that we cut off */\n truncatedLeft: boolean;\n /** `true` ⇢ there were more words on the right that we cut off */\n truncatedRight: boolean;\n}\n\n/**\n * Text slice\n *\n * @public\n */\nexport interface PageTextSlice {\n /**\n * Index of the pdf page\n */\n pageIndex: number;\n /**\n * Index of the first character\n */\n charIndex: number;\n /**\n * Count of the characters\n */\n charCount: number;\n}\n\n/**\n * search result\n *\n * @public\n */\nexport interface SearchResult {\n /**\n * Index of the pdf page\n */\n pageIndex: number;\n /**\n * index of the first character\n */\n charIndex: number;\n /**\n * count of the characters\n */\n charCount: number;\n /**\n * highlight rects\n */\n rects: Rect[];\n /**\n * context of the hit\n */\n context: TextContext;\n}\n\n/**\n * Results of searching through the entire document\n */\nexport interface SearchAllPagesResult {\n /**\n * Array of all search results across all pages\n */\n results: SearchResult[];\n\n /**\n * Total number of results found\n */\n total: number;\n}\n\n/**\n * Glyph object\n *\n * @public\n */\nexport interface PdfGlyphObject {\n /**\n * Origin of the glyph\n */\n origin: { x: number; y: number };\n /**\n * Size of the glyph\n */\n size: { width: number; height: number };\n /**\n * Whether the glyph is a space\n */\n isSpace?: boolean;\n /**\n * Whether the glyph is a empty\n */\n isEmpty?: boolean;\n}\n\n/**\n * Glyph object\n *\n * @public\n */\nexport interface PdfGlyphSlim {\n /**\n * X coordinate of the glyph\n */\n x: number;\n /**\n * Y coordinate of the glyph\n */\n y: number;\n /**\n * Width of the glyph\n */\n width: number;\n /**\n * Height of the glyph\n */\n height: number;\n /**\n * Flags of the glyph\n */\n flags: number;\n}\n\n/**\n * Run object\n *\n * @public\n */\nexport interface PdfRun {\n /**\n * Rectangle of the run\n */\n rect: { x: number; y: number; width: number; height: number };\n /**\n * Start index of the run\n */\n charStart: number;\n /**\n * Glyphs of the run\n */\n glyphs: PdfGlyphSlim[];\n}\n\n/**\n * Page geometry\n *\n * @public\n */\nexport interface PdfPageGeometry {\n /**\n * Runs of the page\n */\n runs: PdfRun[];\n}\n\n/**\n * form field value\n * @public\n */\nexport type FormFieldValue =\n | { kind: 'text'; text: string }\n | { kind: 'selection'; index: number; isSelected: boolean }\n | { kind: 'checked'; isChecked: boolean };\n\n/**\n * Transformation that will be applied to annotation\n *\n * @public\n */\nexport interface PdfAnnotationTransformation {\n /**\n * Translated offset\n */\n offset: Position;\n /**\n * Scaled factors\n */\n scale: Size;\n}\n\n/**\n * source can be byte array contains pdf content\n *\n * @public\n */\nexport type PdfFileContent = ArrayBuffer;\n\nexport enum PdfPermission {\n PrintDocument = 2 ** 3,\n ModifyContent = 2 ** 4,\n CopyOrExtract = 2 ** 5,\n AddOrModifyTextAnnot = 2 ** 6,\n FillInExistingForm = 2 ** 9,\n ExtractTextOrGraphics = 2 ** 10,\n AssembleDocument = 2 ** 11,\n PrintHighQuality = 2 ** 12,\n}\n\nexport enum PdfPageFlattenFlag {\n Display = 0,\n Print = 1,\n}\n\nexport enum PdfPageFlattenResult {\n Fail = 0,\n Success = 1,\n NothingToDo = 2,\n}\n\n/**\n * Pdf File without content\n *\n * @public\n */\nexport interface PdfFileWithoutContent {\n /**\n * id of file\n */\n id: string;\n}\n\nexport interface PdfFileLoader extends PdfFileWithoutContent {\n /**\n * length of file\n */\n fileLength: number;\n /**\n * read block of file\n * @param offset - offset of file\n * @param length - length of file\n * @returns block of file\n */\n callback: (offset: number, length: number) => Uint8Array;\n}\n\nexport interface PdfAnnotationsProgress {\n page: number;\n annotations: PdfAnnotationObject[];\n}\n\n/**\n * Progress of search all pages\n *\n * @public\n */\nexport type PdfPageSearchProgress = { page: number; results: SearchResult[] };\n\n/**\n * Pdf File\n *\n * @public\n */\nexport interface PdfFile extends PdfFileWithoutContent {\n /**\n * content of file\n */\n content: PdfFileContent;\n}\n\nexport interface PdfFileUrl extends PdfFileWithoutContent {\n url: string;\n}\n\nexport enum PdfErrorCode {\n // ═══════════════════════════════════════════════════════\n // PDFium Error Codes (MUST NOT CHANGE ORDER - maps to C defines)\n // ═══════════════════════════════════════════════════════\n Ok = 0, // #define FPDF_ERR_SUCCESS 0\n Unknown = 1, // #define FPDF_ERR_UNKNOWN 1\n NotFound = 2, // #define FPDF_ERR_FILE 2\n WrongFormat = 3, // #define FPDF_ERR_FORMAT 3\n Password = 4, // #define FPDF_ERR_PASSWORD 4 - Password required or incorrect\n Security = 5, // #define FPDF_ERR_SECURITY 5\n PageError = 6, // #define FPDF_ERR_PAGE 6\n XFALoad = 7, // #define FPDF_ERR_XFALOAD 7\n XFALayout = 8, // #define FPDF_ERR_XFALAYOUT 8\n\n // ═══════════════════════════════════════════════════════\n // Custom Error Codes (Can add/modify freely)\n // ═══════════════════════════════════════════════════════\n Cancelled = 9,\n Initialization = 10,\n NotReady = 11,\n NotSupport = 12,\n LoadDoc = 13,\n DocNotOpen = 14,\n CantCloseDoc = 15,\n CantCreateNewDoc = 16,\n CantImportPages = 17,\n CantCreateAnnot = 18,\n CantSetAnnotRect = 19,\n CantSetAnnotContent = 20,\n CantRemoveInkList = 21,\n CantAddInkStoke = 22,\n CantReadAttachmentSize = 23,\n CantReadAttachmentContent = 24,\n CantFocusAnnot = 25,\n CantSelectText = 26,\n CantSelectOption = 27,\n CantCheckField = 28,\n CantSetAnnotString = 29,\n}\n\nexport interface PdfErrorReason {\n code: PdfErrorCode;\n message: string;\n}\n\nexport type PdfEngineError = TaskError<PdfErrorReason>;\n\nexport type PdfTask<R, P = unknown> = Task<R, PdfErrorReason, P>;\n\nexport class PdfTaskHelper {\n /**\n * Create a task\n * @returns new task\n */\n static create<R, P = unknown>(): Task<R, PdfErrorReason, P> {\n return new Task<R, PdfErrorReason, P>();\n }\n\n /**\n * Create a task that has been resolved with value\n * @param result - resolved value\n * @returns resolved task\n */\n static resolve<R, P = unknown>(result: R): Task<R, PdfErrorReason, P> {\n const task = new Task<R, PdfErrorReason, P>();\n task.resolve(result);\n\n return task;\n }\n\n /**\n * Create a task that has been rejected with error\n * @param reason - rejected error\n * @returns rejected task\n */\n static reject<T = any, P = unknown>(reason: PdfErrorReason): Task<T, PdfErrorReason, P> {\n const task = new Task<T, PdfErrorReason, P>();\n task.reject(reason);\n\n return task;\n }\n\n /**\n * Create a task that has been aborted with error\n * @param reason - aborted error\n * @returns aborted task\n */\n static abort<T = any, P = unknown>(reason: PdfErrorReason): Task<T, PdfErrorReason, P> {\n const task = new Task<T, PdfErrorReason, P>();\n task.reject(reason);\n\n return task;\n }\n}\n\nexport interface PdfOpenDocumentBufferOptions {\n /**\n * Password for the document\n */\n password?: string;\n}\n\nexport interface PdfRequestOptions {\n /**\n * Custom HTTP headers to include in all requests (HEAD, GET, range requests)\n * Example: { 'Authorization': 'Bearer token', 'X-Custom-Header': 'value' }\n */\n headers?: Record<string, string>;\n /**\n * Controls whether cookies are sent with requests\n * - 'omit': Never send cookies (default)\n * - 'same-origin': Send cookies for same-origin requests\n * - 'include': Always send cookies (requires CORS)\n */\n credentials?: RequestCredentials;\n}\n\nexport interface PdfOpenDocumentUrlOptions {\n /**\n * Password for the document\n */\n password?: string;\n /**\n * Loading mode\n */\n mode?: 'auto' | 'range-request' | 'full-fetch';\n /**\n * HTTP request options for fetching the PDF\n */\n requestOptions?: PdfRequestOptions;\n}\n\nexport interface PdfRenderOptions {\n /**\n * Scale factor\n */\n scaleFactor?: number;\n /**\n * Rotation\n */\n rotation?: Rotation;\n /**\n * Device pixel ratio\n */\n dpr?: number;\n /**\n * Image type\n */\n imageType?: ImageConversionTypes;\n /**\n * Image quality (0-1) for jpeg and png\n */\n imageQuality?: number;\n}\n\nexport interface ConvertToBlobOptions {\n /**\n * Image type\n */\n type: ImageConversionTypes;\n /**\n * Image quality (0-1) for webp and jpeg and png\n */\n quality?: number;\n}\n\nexport interface PdfRenderPageOptions extends PdfRenderOptions {\n /**\n * Whether to render annotations\n */\n withAnnotations?: boolean;\n /**\n * Whether to render interactive form widgets\n */\n withForms?: boolean;\n}\n\nexport interface PdfRenderPageAnnotationOptions extends PdfRenderOptions {\n /**\n * Appearance mode normal down or rollover\n */\n mode?: AppearanceMode;\n}\n\nexport interface PdfRenderThumbnailOptions extends PdfRenderOptions {\n /**\n * Whether to render annotations\n */\n withAnnotations?: boolean;\n}\n\nexport interface PdfSearchAllPagesOptions {\n /**\n * Search flags\n */\n flags?: MatchFlag[];\n}\n\nexport interface PdfRedactTextOptions {\n /**\n * Whether to recurse forms\n */\n recurseForms?: boolean;\n /**\n * Whether to draw black boxes\n */\n drawBlackBoxes?: boolean;\n}\n\nexport interface PdfFlattenPageOptions {\n /**\n * Flatten flag\n */\n flag?: PdfPageFlattenFlag;\n}\n\n/**\n * Options for preparing a PDF document for printing\n */\nexport interface PdfPrintOptions {\n /**\n * Whether to include annotations in the printed document\n * @default true\n */\n includeAnnotations?: boolean;\n\n /**\n * Page range string defining which pages to include\n * Examples: \"1,3,5-7\" or \"1-10,15,20-25\"\n * If not specified, all pages are included\n * @default null (all pages)\n */\n pageRange?: string;\n}\n\n/**\n * Parameters for adding an attachment to a PDF document\n */\nexport interface PdfAddAttachmentParams {\n /**\n * Name of the attachment\n */\n name: string;\n /**\n * Description of the attachment\n */\n description: string;\n /**\n * MIME type of the attachment\n */\n mimeType: string;\n /**\n * Data of the attachment\n */\n data: ArrayBuffer | Uint8Array;\n}\n\n/**\n * Pdf engine\n *\n * @public\n */\nexport interface PdfEngine<T = Blob> {\n /**\n * Check whether pdf engine supports this feature\n * @param feature - which feature want to check\n * @returns support or not\n */\n isSupport?: (feature: PdfEngineFeature) => PdfTask<PdfEngineOperation[]>;\n /**\n * Initialize the engine\n * @returns task that indicate whether initialization is successful\n */\n initialize?: () => PdfTask<boolean>;\n /**\n * Destroy the engine\n * @returns task that indicate whether destroy is successful\n */\n destroy?: () => PdfTask<boolean>;\n /**\n * Open a PDF from a URL with specified mode\n * @param url - The PDF file URL\n * @param options - Additional options including mode (auto, range-request, full-fetch) and password\n * @returns Task that resolves with the PdfDocumentObject or an error\n */\n openDocumentUrl: (\n file: PdfFileUrl,\n options?: PdfOpenDocumentUrlOptions,\n ) => PdfTask<PdfDocumentObject>;\n /**\n * Open pdf document from buffer\n * @param file - pdf file\n * @param options - Additional options including password\n * @returns task that contains the file or error\n */\n openDocumentBuffer: (\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ) => PdfTask<PdfDocumentObject>;\n /**\n * Get the metadata of the file\n * @param doc - pdf document\n * @returns task that contains the metadata or error\n */\n getMetadata: (doc: PdfDocumentObject) => PdfTask<PdfMetadataObject>;\n /**\n * Set the metadata of the file\n * @param doc - pdf document\n * @param metadata - metadata to set\n * @returns task that contains the metadata or error\n */\n setMetadata: (doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>) => PdfTask<boolean>;\n /**\n * Get permissions of the file\n * @param doc - pdf document\n * @returns task that contains a 32-bit integer indicating permission flags\n */\n getDocPermissions: (doc: PdfDocumentObject) => PdfTask<number>;\n /**\n * Get the user permissions of the file\n * @param doc - pdf document\n * @returns task that contains a 32-bit integer indicating permission flags\n */\n getDocUserPermissions: (doc: PdfDocumentObject) => PdfTask<number>;\n /**\n * Get the signatures of the file\n * @param doc - pdf document\n * @returns task that contains the signatures or error\n */\n getSignatures: (doc: PdfDocumentObject) => PdfTask<PdfSignatureObject[]>;\n /**\n * Get the bookmarks of the file\n * @param doc - pdf document\n * @returns task that contains the bookmarks or error\n */\n getBookmarks: (doc: PdfDocumentObject) => PdfTask<PdfBookmarksObject>;\n /**\n * Set the bookmarks of the file\n * @param doc - pdf document\n * @param payload - bookmarks to set\n * @returns task that contains whether the bookmarks are set successfully or not\n */\n setBookmarks: (doc: PdfDocumentObject, payload: PdfBookmarkObject[]) => PdfTask<boolean>;\n /**\n * Remove all bookmarks from the document.\n * @param doc - pdf document\n * @returns task that contains whether the bookmarks are removed successfully or not\n */\n deleteBookmarks: (doc: PdfDocumentObject) => PdfTask<boolean>;\n /**\n * Render the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderPage: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ) => PdfTask<T>;\n /**\n * Render the specified rect of pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param rect - target rect\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderPageRect: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ) => PdfTask<T>;\n /**\n * Render the thumbnail of specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderThumbnail: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ) => PdfTask<T>;\n /**\n * Render a single annotation into an ImageData blob.\n *\n * Note: • honours Display-Matrix, page rotation & DPR\n * • you decide whether to include the page background\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - the annotation to render\n * @param options - render options\n */\n renderPageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<T>;\n /**\n * Get annotations of pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the annotations or error\n */\n getPageAnnotations: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ) => PdfTask<PdfAnnotationObject[]>;\n /**\n * Create a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @param context - context of the annotation\n * @returns task whether the annotations is created successfully\n */\n createPageAnnotation: <A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ) => PdfTask<string>;\n /**\n * Update a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @returns task that indicates whether the operation succeeded\n */\n updatePageAnnotation: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ) => PdfTask<boolean>;\n /**\n * Remove a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @returns task whether the annotations is removed successfully\n */\n removePageAnnotation: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ) => PdfTask<boolean>;\n /**\n * get all text rects in pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - get page text rects options\n * @returns task contains the text rects or error\n */\n getPageTextRects: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfTextRectObject[]>;\n /**\n * Search across all pages in the document\n * @param doc - pdf document\n * @param keyword - search keyword\n * @param options - search all pages options\n * @returns Task contains all search results throughout the document\n */\n searchAllPages: (\n doc: PdfDocumentObject,\n keyword: string,\n options?: PdfSearchAllPagesOptions,\n ) => PdfTask<SearchAllPagesResult, PdfPageSearchProgress>;\n /**\n * Get all annotations in this file\n * @param doc - pdf document\n * @returns task that contains the annotations or error\n */\n getAllAnnotations: (\n doc: PdfDocumentObject,\n ) => PdfTask<Record<number, PdfAnnotationObject[]>, PdfAnnotationsProgress>;\n /**\n * Get all attachments in this file\n * @param doc - pdf document\n * @returns task that contains the attachments or error\n */\n getAttachments: (doc: PdfDocumentObject) => PdfTask<PdfAttachmentObject[]>;\n /**\n * Add a attachment to the file\n /**\n * @param doc - pdf document\n * @param attachment - pdf attachment\n * @returns task that contains the attachment or error\n */\n addAttachment: (doc: PdfDocumentObject, params: PdfAddAttachmentParams) => PdfTask<boolean>;\n /**\n * Remove a attachment from the file\n /**\n * @param doc - pdf document\n * @param attachment - pdf attachment\n * @returns task that contains the attachment or error\n */\n removeAttachment: (doc: PdfDocumentObject, attachment: PdfAttachmentObject) => PdfTask<boolean>;\n /**\n * Read content of pdf attachment\n * @param doc - pdf document\n * @param attachment - pdf attachments\n * @returns task that contains the content of specified attachment or error\n */\n readAttachmentContent: (\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ) => PdfTask<ArrayBuffer>;\n /**\n * Set form field value\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - pdf annotation\n * @param text - text value\n */\n setFormFieldValue: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ) => PdfTask<boolean>;\n /**\n * Flatten annotations and form fields into the page contents.\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - flatten page options\n */\n flattenPage: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ) => PdfTask<PdfPageFlattenResult>;\n /**\n * Extract pdf pages to a new file\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the new pdf file content\n */\n extractPages: (doc: PdfDocumentObject, pageIndexes: number[]) => PdfTask<ArrayBuffer>;\n /**\n * Extract text on specified pdf pages\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the text\n */\n extractText: (doc: PdfDocumentObject, pageIndexes: number[]) => PdfTask<string>;\n /**\n * Redact text by run slices\n * @param doc - pdf document\n * @param page - pdf page\n * @param rects - rects to redact\n * @param options - redact text options\n * @returns task contains the result\n */\n redactTextInRects: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ) => PdfTask<boolean>;\n /**\n * Extract text on specified pdf pages\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the text\n */\n getTextSlices: (doc: PdfDocumentObject, slices: PageTextSlice[]) => PdfTask<string[]>;\n /**\n * Get all glyphs in the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the glyphs\n */\n getPageGlyphs: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfGlyphObject[]>;\n /**\n * Get the geometry of the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the geometry\n */\n getPageGeometry: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfPageGeometry>;\n /**\n * Merge multiple pdf documents\n * @param files - all the pdf files\n * @returns task contains the merged pdf file\n */\n merge: (files: PdfFile[]) => PdfTask<PdfFile>;\n /**\n * Merge specific pages from multiple PDF documents in a custom order\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[] }>) => PdfTask<PdfFile>;\n /**\n * Prepare a PDF document for printing\n * @param doc - pdf document\n * @param options - options for preparing the document for printing\n * @returns task contains the prepared pdf file content\n */\n preparePrintDocument: (doc: PdfDocumentObject, options?: PdfPrintOptions) => PdfTask<ArrayBuffer>;\n /**\n * Save a copy of pdf document\n * @param doc - pdf document\n * @returns task contains the new pdf file content\n */\n saveAsCopy: (doc: PdfDocumentObject) => PdfTask<ArrayBuffer>;\n /**\n * Close pdf document\n * @param doc - pdf document\n * @returns task that file is closed or not\n */\n closeDocument: (doc: PdfDocumentObject) => PdfTask<boolean>;\n /**\n * Close all documents\n * @returns task that all documents are closed or not\n */\n closeAllDocuments: () => PdfTask<boolean>;\n}\n\n/**\n * Method name of PdfEngine interface\n *\n * @public\n */\nexport type PdfEngineMethodName = keyof Required<PdfEngine>;\n\n/**\n * Arguments of PdfEngine method\n *\n * @public\n */\nexport type PdfEngineMethodArgs<P extends PdfEngineMethodName> = Readonly<\n Parameters<Required<PdfEngine>[P]>\n>;\n\n/**\n * Return type of PdfEngine method\n *\n * @public\n */\nexport type PdfEngineMethodReturnType<P extends PdfEngineMethodName> = ReturnType<\n Required<PdfEngine>[P]\n>;\n","import { PdfAlphaColor, PdfColor } from './pdf';\n\n/**\n * Web color as hex string (no opacity)\n */\nexport type WebColor = string;\n\n// === Alpha-aware types (existing) ===\n\nexport interface WebAlphaColor {\n color: string;\n opacity: number;\n}\n\n// === Color-only conversion functions ===\n\n/**\n * Convert a {@link PdfColor} to a CSS hex color string.\n *\n * @param c - the RGB color from PDFium (0-255 per channel)\n * @returns hex color string in format #RRGGBB\n */\nexport function pdfColorToWebColor(c: PdfColor): WebColor {\n const clamp = (n: number) => Math.max(0, Math.min(255, n));\n const toHex = (n: number) => clamp(n).toString(16).padStart(2, '0');\n\n return `#${toHex(c.red)}${toHex(c.green)}${toHex(c.blue)}`;\n}\n\n/**\n * Convert a CSS hex color back to {@link PdfColor}\n *\n * @param color - #RGB, #RRGGBB, or #rrggbb\n */\nexport function webColorToPdfColor(color: WebColor): PdfColor {\n // Normalise: #abc → #aabbcc\n if (/^#?[0-9a-f]{3}$/i.test(color)) {\n color = color.replace(/^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i, '#$1$1$2$2$3$3').toLowerCase();\n }\n\n const [, r, g, b] =\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color) ??\n (() => {\n throw new Error(`Invalid hex colour: \"${color}\"`);\n })();\n\n return {\n red: parseInt(r, 16),\n green: parseInt(g, 16),\n blue: parseInt(b, 16),\n };\n}\n\n// === Alpha utility functions ===\n\n/**\n * Convert PDF alpha (0-255) to web opacity (0-1)\n */\nexport function pdfAlphaToWebOpacity(alpha: number): number {\n const clamp = (n: number) => Math.max(0, Math.min(255, n));\n return clamp(alpha) / 255;\n}\n\n/**\n * Convert web opacity (0-1) to PDF alpha (0-255)\n */\nexport function webOpacityToPdfAlpha(opacity: number): number {\n const clamp = (n: number, hi = 255) => Math.max(0, Math.min(hi, n));\n return clamp(Math.round(opacity * 255));\n}\n\n/**\n * Extract color part from {@link PdfAlphaColor}\n */\nexport function extractPdfColor(c: PdfAlphaColor): PdfColor {\n return { red: c.red, green: c.green, blue: c.blue };\n}\n\n/**\n * Extract alpha from {@link PdfAlphaColor} as web opacity\n */\nexport function extractWebOpacity(c: PdfAlphaColor): number {\n return pdfAlphaToWebOpacity(c.alpha);\n}\n\n/**\n * Combine {@link PdfColor} and alpha to create {@link PdfAlphaColor}\n */\nexport function combinePdfColorWithAlpha(color: PdfColor, alpha: number): PdfAlphaColor {\n return { ...color, alpha };\n}\n\n/**\n * Combine {@link WebColor} and opacity to create {@link WebAlphaColor}\n */\nexport function combineWebColorWithOpacity(color: WebColor, opacity: number): WebAlphaColor {\n return { color, opacity };\n}\n\n// === Existing alpha-aware functions (kept for backward compatibility) ===\n\n/**\n * Convert a {@link PdfAlphaColor} to a CSS-style colour definition.\n *\n * @param c - the colour coming from PDFium (0-255 per channel)\n * @returns\n * hex – #RRGGBB (no alpha channel)\n * opacity – 0-1 float suitable for CSS `opacity`/`rgba()`\n */\nexport function pdfAlphaColorToWebAlphaColor(c: PdfAlphaColor): WebAlphaColor {\n const color = pdfColorToWebColor(extractPdfColor(c));\n const opacity = extractWebOpacity(c);\n return { color, opacity };\n}\n\n/**\n * Convert a CSS hex colour + opacity back into {@link PdfAlphaColor}\n *\n * @param hex - #RGB, #RRGGBB, or #rrggbb\n * @param opacity - 0-1 float (values outside clamp automatically)\n */\nexport function webAlphaColorToPdfAlphaColor({ color, opacity }: WebAlphaColor): PdfAlphaColor {\n const pdfColor = webColorToPdfColor(color);\n const alpha = webOpacityToPdfAlpha(opacity);\n return combinePdfColorWithAlpha(pdfColor, alpha);\n}\n","/**\n * Parse a PDF date string **D:YYYYMMDDHHmmSSOHH'mm'** to ISO-8601.\n *\n * Returns `undefined` if the input is malformed.\n *\n * @public\n */\nexport function pdfDateToDate(pdf?: string): Date | undefined {\n if (!pdf?.startsWith('D:') || pdf.length < 16) return;\n\n const y = +pdf.slice(2, 6);\n const mo = +pdf.slice(6, 8) - 1; // JS months: 0-based\n const d = +pdf.slice(8, 10);\n const H = +pdf.slice(10, 12);\n const M = +pdf.slice(12, 14);\n const S = +pdf.slice(14, 16);\n\n return new Date(Date.UTC(y, mo, d, H, M, S));\n}\n\n/**\n * Convert a date to a PDF date string\n * @param date - date to convert\n * @returns PDF date string\n *\n * @public\n */\nexport function dateToPdfDate(date: Date = new Date()): string {\n const z = (n: number, len = 2) => n.toString().padStart(len, '0');\n\n const YYYY = date.getUTCFullYear();\n const MM = z(date.getUTCMonth() + 1);\n const DD = z(date.getUTCDate());\n const HH = z(date.getUTCHours());\n const mm = z(date.getUTCMinutes());\n const SS = z(date.getUTCSeconds());\n\n return `D:${YYYY}${MM}${DD}${HH}${mm}${SS}`;\n}\n","import { PdfTextAlignment } from '../pdf';\n\n/** Extra UI sentinel for “mixed values”. */\nexport const MixedTextAlignment = Symbol('mixed');\nexport type UiTextAlignmentValue = PdfTextAlignment | typeof MixedTextAlignment;\n\nexport type CssTextAlign = 'left' | 'center' | 'right';\n\ninterface TextAlignmentInfo {\n id: PdfTextAlignment;\n label: string;\n css: CssTextAlign;\n}\n\nconst TEXT_ALIGNMENT_INFOS: readonly TextAlignmentInfo[] = Object.freeze([\n { id: PdfTextAlignment.Left, label: 'Left', css: 'left' },\n { id: PdfTextAlignment.Center, label: 'Center', css: 'center' },\n { id: PdfTextAlignment.Right, label: 'Right', css: 'right' },\n]);\n\n/* Build O(1) maps */\nconst enumToTextInfo: Record<PdfTextAlignment, TextAlignmentInfo> = TEXT_ALIGNMENT_INFOS.reduce(\n (m, info) => {\n m[info.id] = info;\n return m;\n },\n {} as Record<PdfTextAlignment, TextAlignmentInfo>,\n);\n\nconst cssToTextEnum = TEXT_ALIGNMENT_INFOS.reduce<Record<CssTextAlign, PdfTextAlignment>>(\n (m, info) => {\n m[info.css] = info.id;\n return m;\n },\n {} as Record<CssTextAlign, PdfTextAlignment>,\n);\n\n/** Get descriptor (falls back to Left if unknown). */\nexport function getTextAlignmentInfo(alignment: PdfTextAlignment): TextAlignmentInfo {\n return enumToTextInfo[alignment] ?? enumToTextInfo[PdfTextAlignment.Left];\n}\n\nexport function textAlignmentToCss(alignment: PdfTextAlignment): CssTextAlign {\n return getTextAlignmentInfo(alignment).css;\n}\n\nexport function cssToTextAlignment(value: CssTextAlign): PdfTextAlignment | undefined {\n return cssToTextEnum[value];\n}\n\nexport function textAlignmentLabel(alignment: PdfTextAlignment): string {\n return getTextAlignmentInfo(alignment).label;\n}\n\nexport function reduceTextAlignments(values: readonly PdfTextAlignment[]): UiTextAlignmentValue {\n if (!values.length) return PdfTextAlignment.Left;\n const first = values[0];\n return values.every((a) => a === first) ? first : MixedTextAlignment;\n}\n\nexport const textAlignmentSelectOptions = TEXT_ALIGNMENT_INFOS.map((info) => ({\n value: info.id,\n label: info.label,\n}));\n","// ────────────────────────────────────────────────────────────────────────────\n// 🅰 Font Families & style flags\n// ────────────────────────────────────────────────────────────────────────────\n\nimport { PdfStandardFont } from '../pdf';\n\n/**\n * Logical families of the 14 “Standard PDF” fonts.\n */\nexport enum PdfStandardFontFamily {\n Courier = 'Courier',\n Helvetica = 'Helvetica',\n Times = 'Times',\n Symbol = 'Symbol',\n ZapfDingbats = 'ZapfDingbats',\n Unknown = 'Unknown',\n}\n\nconst DEFAULT_FALLBACK_FONT = PdfStandardFont.Helvetica;\n\n/** UI sentinel when multiple different fonts are selected at once. */\nexport const MixedStandardFont = Symbol('mixed');\nexport type UiStandardFontValue = PdfStandardFont | typeof MixedStandardFont;\n\ninterface StandardFontDescriptor {\n /** Enum value as returned by PDFium. */\n id: PdfStandardFont;\n /** Logical family (for the left dropdown). */\n family: PdfStandardFontFamily;\n /** `true` ⇢ weight ≥ 700. */\n bold: boolean;\n /** `true` ⇢ italic / oblique. */\n italic: boolean;\n /** Human-readable label (“Helvetica Bold”). */\n label: string;\n /** CSS `font-family` fallback list. */\n css: string;\n}\n\nconst HELVETICA_DESC: StandardFontDescriptor = {\n id: PdfStandardFont.Helvetica,\n family: PdfStandardFontFamily.Helvetica,\n bold: false,\n italic: false,\n label: 'Helvetica',\n css: 'Helvetica, Arial, sans-serif',\n} as const;\n\n/* Canonical table – order follows enum values */\nconst STANDARD_FONT_DESCRIPTORS: readonly StandardFontDescriptor[] = Object.freeze([\n {\n id: PdfStandardFont.Courier,\n family: PdfStandardFontFamily.Courier,\n bold: false,\n italic: false,\n label: 'Courier',\n css: 'Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_Bold,\n family: PdfStandardFontFamily.Courier,\n bold: true,\n italic: false,\n label: 'Courier Bold',\n css: '\"Courier-Bold\", Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_BoldOblique,\n family: PdfStandardFontFamily.Courier,\n bold: true,\n italic: true,\n label: 'Courier Bold Oblique',\n css: '\"Courier-BoldOblique\", Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_Oblique,\n family: PdfStandardFontFamily.Courier,\n bold: false,\n italic: true,\n label: 'Courier Oblique',\n css: '\"Courier-Oblique\", Courier, monospace',\n },\n HELVETICA_DESC,\n {\n id: PdfStandardFont.Helvetica_Bold,\n family: PdfStandardFontFamily.Helvetica,\n bold: true,\n italic: false,\n label: 'Helvetica Bold',\n css: '\"Helvetica-Bold\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Helvetica_BoldOblique,\n family: PdfStandardFontFamily.Helvetica,\n bold: true,\n italic: true,\n label: 'Helvetica Bold Oblique',\n css: '\"Helvetica-BoldOblique\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Helvetica_Oblique,\n family: PdfStandardFontFamily.Helvetica,\n bold: false,\n italic: true,\n label: 'Helvetica Oblique',\n css: '\"Helvetica-Oblique\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Times_Roman,\n family: PdfStandardFontFamily.Times,\n bold: false,\n italic: false,\n label: 'Times Roman',\n css: '\"Times New Roman\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_Bold,\n family: PdfStandardFontFamily.Times,\n bold: true,\n italic: false,\n label: 'Times Bold',\n css: '\"Times New Roman Bold\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_BoldItalic,\n family: PdfStandardFontFamily.Times,\n bold: true,\n italic: true,\n label: 'Times Bold Italic',\n css: '\"Times New Roman Bold Italic\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_Italic,\n family: PdfStandardFontFamily.Times,\n bold: false,\n italic: true,\n label: 'Times Italic',\n css: '\"Times New Roman Italic\", Times, serif',\n },\n {\n id: PdfStandardFont.Symbol,\n family: PdfStandardFontFamily.Symbol,\n bold: false,\n italic: false,\n label: 'Symbol',\n css: 'Symbol',\n },\n {\n id: PdfStandardFont.ZapfDingbats,\n family: PdfStandardFontFamily.ZapfDingbats,\n bold: false,\n italic: false,\n label: 'Zapf Dingbats',\n css: 'ZapfDingbats',\n },\n]);\n\n/* Fast lookup maps */\nconst idToDescriptor: Record<PdfStandardFont, StandardFontDescriptor> =\n STANDARD_FONT_DESCRIPTORS.reduce((m, d) => ((m[d.id] = d), m), {} as any);\n\nconst familyStyleToId = new Map<\n `${PdfStandardFontFamily}_${boolean}_${boolean}`,\n PdfStandardFont\n>();\nfor (const d of STANDARD_FONT_DESCRIPTORS) {\n familyStyleToId.set(`${d.family}_${d.bold}_${d.italic}`, d.id);\n}\n\nfunction unknownDescriptor(): StandardFontDescriptor {\n return HELVETICA_DESC;\n}\n\n/* ───────────────────────── Queries ────────────────────────── */\n\n/** Get the descriptor for a given enum (falls back to Unknown). */\nexport function getStandardFontDescriptor(font: PdfStandardFont): StandardFontDescriptor {\n return idToDescriptor[font] ?? unknownDescriptor();\n}\n\n/** Convert enum → family. */\nexport function standardFontFamily(font: PdfStandardFont): PdfStandardFontFamily {\n return getStandardFontDescriptor(font).family;\n}\n\n/** Is font bold? */\nexport function standardFontIsBold(font: PdfStandardFont): boolean {\n return getStandardFontDescriptor(font).bold;\n}\n\n/** Is font italic / oblique? */\nexport function standardFontIsItalic(font: PdfStandardFont): boolean {\n return getStandardFontDescriptor(font).italic;\n}\n\n/**\n * Convert **family + (bold, italic)** back to the enum.\n * Returns `undefined` when the combination doesn’t exist\n * (e.g. “Symbol + bold” is not a valid Standard-14 face).\n */\nexport function makeStandardFont(\n family: PdfStandardFontFamily,\n { bold, italic }: { bold: boolean; italic: boolean },\n): PdfStandardFont {\n return familyStyleToId.get(`${family}_${bold}_${italic}`) ?? DEFAULT_FALLBACK_FONT;\n}\n\n/** Keep the helpers you already added: */\nexport function standardFontLabel(font: PdfStandardFont): string {\n return getStandardFontDescriptor(font).label;\n}\nexport function standardFontCss(font: PdfStandardFont): string {\n return getStandardFontDescriptor(font).css;\n}\n\n/* ───────────────────────── UI helpers ────────────────────────── */\n\n/** Family dropdown options (“Helvetica”, “Times”…). */\nexport const standardFontFamilySelectOptions = (\n Object.values(PdfStandardFontFamily) as PdfStandardFontFamily[]\n)\n .filter((f) => f !== PdfStandardFontFamily.Unknown)\n .map((family) => ({ value: family, label: family }));\n\n/**\n * Reduce multiple enums → single value or Mixed sentinel\n * (handy for multi-selection editing UIs).\n */\nexport function reduceStandardFonts(fonts: readonly PdfStandardFont[]): UiStandardFontValue {\n if (!fonts.length) return PdfStandardFont.Unknown;\n const first = fonts[0];\n return fonts.every((f) => f === first) ? first : MixedStandardFont;\n}\n\n/* UNIQUE families in canonical order, driven by STANDARD_FONT_DESCRIPTORS */\nexport const STANDARD_FONT_FAMILIES: readonly PdfStandardFontFamily[] = [\n ...new Set(STANDARD_FONT_DESCRIPTORS.map((d) => d.family)),\n];\n\n/** Friendly label for each family (could also live in the descriptor list) */\nexport function standardFontFamilyLabel(fam: PdfStandardFontFamily): string {\n switch (fam) {\n case PdfStandardFontFamily.Courier:\n return 'Courier';\n case PdfStandardFontFamily.Helvetica:\n return 'Helvetica';\n case PdfStandardFontFamily.Times:\n return 'Times';\n case PdfStandardFontFamily.Symbol:\n return 'Symbol';\n case PdfStandardFontFamily.ZapfDingbats:\n return 'ZapfDingbats';\n /* fallback */\n default:\n return 'Helvetica';\n }\n}\n","import { PdfBlendMode } from '../pdf';\n\n/** Extra UI sentinel for “multiple different values selected”. */\nexport const MixedBlendMode = Symbol('mixed');\nexport type UiBlendModeValue = PdfBlendMode | typeof MixedBlendMode;\n\nexport type CssBlendMode =\n | 'normal'\n | 'multiply'\n | 'screen'\n | 'overlay'\n | 'darken'\n | 'lighten'\n | 'color-dodge'\n | 'color-burn'\n | 'hard-light'\n | 'soft-light'\n | 'difference'\n | 'exclusion'\n | 'hue'\n | 'saturation'\n | 'color'\n | 'luminosity';\n\ninterface BlendModeInfo {\n /** Pdf enum value */\n id: PdfBlendMode;\n /** Human label for UI */\n label: string;\n /** CSS mix-blend-mode token */\n css: CssBlendMode;\n}\n\n/** Canonical ordered descriptor list (matches enum numeric order). */\nconst BLEND_MODE_INFOS: readonly BlendModeInfo[] = Object.freeze([\n { id: PdfBlendMode.Normal, label: 'Normal', css: 'normal' },\n { id: PdfBlendMode.Multiply, label: 'Multiply', css: 'multiply' },\n { id: PdfBlendMode.Screen, label: 'Screen', css: 'screen' },\n { id: PdfBlendMode.Overlay, label: 'Overlay', css: 'overlay' },\n { id: PdfBlendMode.Darken, label: 'Darken', css: 'darken' },\n { id: PdfBlendMode.Lighten, label: 'Lighten', css: 'lighten' },\n { id: PdfBlendMode.ColorDodge, label: 'Color Dodge', css: 'color-dodge' },\n { id: PdfBlendMode.ColorBurn, label: 'Color Burn', css: 'color-burn' },\n { id: PdfBlendMode.HardLight, label: 'Hard Light', css: 'hard-light' },\n { id: PdfBlendMode.SoftLight, label: 'Soft Light', css: 'soft-light' },\n { id: PdfBlendMode.Difference, label: 'Difference', css: 'difference' },\n { id: PdfBlendMode.Exclusion, label: 'Exclusion', css: 'exclusion' },\n { id: PdfBlendMode.Hue, label: 'Hue', css: 'hue' },\n { id: PdfBlendMode.Saturation, label: 'Saturation', css: 'saturation' },\n { id: PdfBlendMode.Color, label: 'Color', css: 'color' },\n { id: PdfBlendMode.Luminosity, label: 'Luminosity', css: 'luminosity' },\n]);\n\n/* Build O(1) maps once */\nconst enumToInfo: Record<PdfBlendMode, BlendModeInfo> = BLEND_MODE_INFOS.reduce(\n (m, info) => {\n m[info.id] = info;\n return m;\n },\n {} as Record<PdfBlendMode, BlendModeInfo>,\n);\n\nconst cssToEnum = BLEND_MODE_INFOS.reduce<Record<CssBlendMode, PdfBlendMode>>(\n (m, info) => {\n m[info.css] = info.id;\n return m;\n },\n {} as Record<CssBlendMode, PdfBlendMode>,\n);\n\n/** Get descriptor (falls back to Normal if unknown number sneaks in).\n *\n * @public\n */\nexport function getBlendModeInfo(mode: PdfBlendMode): BlendModeInfo {\n return enumToInfo[mode] ?? enumToInfo[PdfBlendMode.Normal];\n}\n\n/** Convert enum → CSS value for `mix-blend-mode`.\n *\n * @public\n */\nexport function blendModeToCss(mode: PdfBlendMode): CssBlendMode {\n return getBlendModeInfo(mode).css;\n}\n\n/** Convert CSS token → enum (returns undefined if not recognized).\n *\n * @public\n */\nexport function cssToBlendMode(value: CssBlendMode): PdfBlendMode | undefined {\n return cssToEnum[value];\n}\n\n/** Enum → UI label.\n *\n * @public\n */\nexport function blendModeLabel(mode: PdfBlendMode): string {\n return getBlendModeInfo(mode).label;\n}\n\n/**\n * For a selection of annotations: returns the common enum value, or Mixed sentinel.\n *\n * @public\n */\nexport function reduceBlendModes(modes: readonly PdfBlendMode[]): UiBlendModeValue {\n if (!modes.length) return PdfBlendMode.Normal;\n const first = modes[0];\n return modes.every((m) => m === first) ? first : MixedBlendMode;\n}\n\n/** Options for a <select> (with English labels - for quick prototyping).\n * For i18n, use `blendModeValues` and translate labels in your UI layer.\n *\n * @public\n */\nexport const blendModeSelectOptions = BLEND_MODE_INFOS.map((info) => ({\n value: info.id,\n label: info.label,\n}));\n\n/**\n * All blend mode enum values in canonical order.\n * Use this to build translated select options in your UI layer.\n *\n * @public\n */\nexport const blendModeValues: readonly PdfBlendMode[] = BLEND_MODE_INFOS.map((info) => info.id);\n\n/** Provide a label when Mixed sentinel used (UI convenience).\n *\n * @public\n */\nexport function uiBlendModeDisplay(value: UiBlendModeValue): string {\n return value === MixedBlendMode ? '(mixed)' : blendModeLabel(value);\n}\n","import {\n AllLogger,\n ConsoleLogger,\n LevelLogger,\n Logger,\n LogLevel,\n NoopLogger,\n PerfLogger,\n} from '../logger';\n\n/**\n * Serializable representation of a logger\n */\nexport type SerializedLogger = {\n type: 'noop' | 'console' | 'level' | 'perf' | 'all';\n config?: {\n level?: LogLevel; // for LevelLogger\n logger?: SerializedLogger; // for LevelLogger (wrapped logger)\n loggers?: SerializedLogger[]; // for AllLogger (child loggers)\n };\n};\n\n/**\n * Convert a Logger instance to a serializable JSON object\n * @param logger - The logger instance to serialize\n * @returns Serialized logger object\n */\nexport function serializeLogger(logger: Logger): SerializedLogger {\n if (logger instanceof NoopLogger) {\n return { type: 'noop' };\n }\n\n if (logger instanceof ConsoleLogger) {\n return { type: 'console' };\n }\n\n if (logger instanceof PerfLogger) {\n return { type: 'perf' };\n }\n\n if (logger instanceof LevelLogger) {\n // Access private properties using type assertion\n const levelLogger = logger as any;\n return {\n type: 'level',\n config: {\n level: levelLogger.level,\n logger: serializeLogger(levelLogger.logger),\n },\n };\n }\n\n if (logger instanceof AllLogger) {\n // Access private properties using type assertion\n const allLogger = logger as any;\n return {\n type: 'all',\n config: {\n loggers: allLogger.loggers.map(serializeLogger),\n },\n };\n }\n\n // Fallback to noop if unknown type\n return { type: 'noop' };\n}\n\n/**\n * Convert a serialized logger object back to a Logger instance\n * @param serialized - The serialized logger object\n * @returns Logger instance\n */\nexport function deserializeLogger(serialized: SerializedLogger): Logger {\n switch (serialized.type) {\n case 'noop':\n return new NoopLogger();\n\n case 'console':\n return new ConsoleLogger();\n\n case 'perf':\n return new PerfLogger();\n\n case 'level':\n if (!serialized.config?.logger || serialized.config?.level === undefined) {\n throw new Error('LevelLogger requires logger and level in config');\n }\n return new LevelLogger(deserializeLogger(serialized.config.logger), serialized.config.level);\n\n case 'all':\n if (!serialized.config?.loggers) {\n throw new Error('AllLogger requires loggers array in config');\n }\n return new AllLogger(serialized.config.loggers.map(deserializeLogger));\n\n default:\n // Fallback to noop for unknown types\n return new NoopLogger();\n }\n}\n","/*─────────────────────────────────────────────────────────────────────────────\n 🆔 UUID helpers – no external deps\n──────────────────────────────────────────────────────────────────────────────*/\n/**\n * Canonical RFC‑4122 **version‑4** UUID format:\n * 8-4-4-4-12 hexadecimal digits with\n * – the version nibble fixed to **4**\n * – the variant nibble in the range **8‑b** (binary 10xx)\n */\nconst V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check whether the supplied string is a **valid RFC‑4122 v4 UUID**.\n * Works in every runtime (browser / Node / Deno) because it is just\n * string validation – no crypto required.\n */\nexport function isUuidV4(str: string): boolean {\n return V4_REGEX.test(str);\n}\n\n/*──────────────────────────── rng helpers ───────────────────────────────*/\nfunction getRandomBytes(len: number): Uint8Array {\n // Modern browsers & Node ≥ 15 expose Web Crypto\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n return globalThis.crypto.getRandomValues(new Uint8Array(len));\n }\n\n // Fallback for old Node versions (< 15) – use node:crypto.randomBytes\n if (typeof require === 'function') {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { randomBytes } = require('crypto') as typeof import('crypto');\n return randomBytes(len);\n } catch {\n /* ignore – continue to final fallback */\n }\n }\n\n // ⚠️ LAST‑RESORT non‑cryptographic RNG – should never be used in prod\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/*──────────────────────────── main API ───────────────────────────────────*/\n/**\n * Generate a **version‑4 UUID** (random).\n *\n * • Uses the native `crypto.randomUUID()` when available (all modern\n * browsers, Deno, Node ≥ 16.9).\n * • Falls back to a tiny, standards‑compliant implementation that uses\n * `crypto.getRandomValues` / `crypto.randomBytes` for entropy.\n *\n * @example\n * ```ts\n * import { uuidV4 } from \"@embedpdf/models\";\n * const id = uuidV4();\n * // → \"36b8f84d-df4e-4d49-b662-bcde71a8764f\"\n * ```\n */\nexport function uuidV4(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n\n const bytes = getRandomBytes(16);\n\n // Per RFC 4122 §4.4: set version (0100) and variant (10xx)\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * Library contains the common definitions of data types and logic\n *\n * @remarks\n * The `@embedpdf/models` defines the interface and classes which are used to\n * handling PDF files.\n *\n * @packageDocumentation\n */\nexport * from './geometry';\nexport * from './logger';\nexport * from './pdf';\nexport * from './task';\nexport * from './color';\nexport * from './date';\nexport * from './helpers';\nexport * from './uuid';\n\n/**\n * ignore will do nothing when called.\n *\n * @public\n */\nexport function ignore() {}\n"],"names":["Rotation","LogLevel","TaskStage","PdfZoomMode","PdfTrappedStatus","PdfStandardFont","PdfTextAlignment","PdfVerticalAlignment","PdfBlendMode","PdfStampFit","PdfActionType","PdfAnnotationSubtype","PdfAnnotationObjectStatus","AppearanceMode","PdfAnnotationState","PdfAnnotationStateModel","PdfAnnotationIcon","PdfAnnotationLineEnding","PDF_FORM_FIELD_TYPE","PdfAnnotationColorType","PdfAnnotationBorderStyle","PdfAnnotationFlags","PDF_FORM_FIELD_FLAG","PdfPageObjectType","PdfSegmentObjectType","PdfEngineFeature","PdfEngineOperation","MatchFlag","PdfPermission","PdfPageFlattenFlag","PdfPageFlattenResult","PdfErrorCode","PdfStandardFontFamily"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/geometry.ts","../src/logger.ts","../src/task.ts","../src/pdf.ts","../src/color.ts","../src/date.ts","../src/helpers/text-alignment.ts","../src/helpers/font.ts","../src/helpers/blend-mode.ts","../src/helpers/logger.ts","../src/uuid.ts","../src/compound-task.ts","../src/index.ts"],"sourcesContent":["/**\n * Clockwise direction\n * @public\n */\nexport enum Rotation {\n Degree0 = 0,\n Degree90 = 1,\n Degree180 = 2,\n Degree270 = 3,\n}\n\n/** Clamp a Position to device-pixel integers (floor) */\nexport function toIntPos(p: Position): Position {\n return { x: Math.floor(p.x), y: Math.floor(p.y) };\n}\n\n/** Clamp a Size so it never truncates right / bottom (ceil) */\nexport function toIntSize(s: Size): Size {\n return { width: Math.ceil(s.width), height: Math.ceil(s.height) };\n}\n\n/** Apply both rules to a Rect */\nexport function toIntRect(r: Rect): Rect {\n return {\n origin: toIntPos(r.origin),\n size: toIntSize(r.size),\n };\n}\n\n/**\n * Calculate degree that match the rotation type\n * @param rotation - type of rotation\n * @returns rotated degree\n *\n * @public\n */\nexport function calculateDegree(rotation: Rotation) {\n switch (rotation) {\n case Rotation.Degree0:\n return 0;\n case Rotation.Degree90:\n return 90;\n case Rotation.Degree180:\n return 180;\n case Rotation.Degree270:\n return 270;\n }\n}\n\n/**\n * Calculate angle that match the rotation type\n * @param rotation - type of rotation\n * @returns rotated angle\n *\n * @public\n */\nexport function calculateAngle(rotation: Rotation) {\n return (calculateDegree(rotation) * Math.PI) / 180;\n}\n\n/**\n * Represent the size of object\n *\n * @public\n */\nexport interface Size {\n /**\n * width of the object\n */\n width: number;\n\n /**\n * height of the object\n */\n height: number;\n}\n\n/**\n * Represents a rectangle defined by its left, top, right, and bottom edges\n *\n * @public\n */\nexport interface Box {\n /**\n * The x-coordinate of the left edge\n */\n left: number;\n\n /**\n * The y-coordinate of the top edge\n */\n top: number;\n\n /**\n * The x-coordinate of the right edge\n */\n right: number;\n\n /**\n * The y-coordinate of the bottom edge\n */\n bottom: number;\n}\n\n/**\n * Swap the width and height of the size object\n * @param size - the original size\n * @returns swapped size\n *\n * @public\n */\nexport function swap(size: Size): Size {\n const { width, height } = size;\n\n return {\n width: height,\n height: width,\n };\n}\n\n/**\n * Transform size with specified rotation angle and scale factor\n * @param size - orignal size of rect\n * @param rotation - rotation angle\n * @param scaleFactor - - scale factor\n * @returns size that has been transformed\n *\n * @public\n */\nexport function transformSize(size: Size, rotation: Rotation, scaleFactor: number): Size {\n size = rotation % 2 === 0 ? size : swap(size);\n\n return {\n width: size.width * scaleFactor,\n height: size.height * scaleFactor,\n };\n}\n\n/**\n * position of point\n *\n * @public\n */\nexport interface Position {\n /**\n * x coordinate\n */\n x: number;\n\n /**\n * y coordinate\n */\n y: number;\n}\n\n/**\n * Quadrilateral\n *\n * @public\n */\nexport interface Quad {\n p1: Position;\n p2: Position;\n p3: Position;\n p4: Position;\n}\n\n/**\n * Convert quadrilateral to rectangle\n * @param q - quadrilateral\n * @returns rectangle\n *\n * @public\n */\nexport function quadToRect(q: Quad): Rect {\n const xs = [q.p1.x, q.p2.x, q.p3.x, q.p4.x];\n const ys = [q.p1.y, q.p2.y, q.p3.y, q.p4.y];\n\n return {\n origin: { x: Math.min(...xs), y: Math.min(...ys) },\n size: {\n width: Math.max(...xs) - Math.min(...xs),\n height: Math.max(...ys) - Math.min(...ys),\n },\n };\n}\n\n/**\n * Convert rectangle to quadrilateral\n * @param r - rectangle\n * @returns quadrilateral\n *\n * @public\n */\nexport function rectToQuad(r: Rect): Quad {\n return {\n p1: { x: r.origin.x, y: r.origin.y },\n p2: { x: r.origin.x + r.size.width, y: r.origin.y },\n p3: { x: r.origin.x + r.size.width, y: r.origin.y + r.size.height },\n p4: { x: r.origin.x, y: r.origin.y + r.size.height },\n };\n}\n\n/**\n * Rotate the container and calculate the new position for a point\n * in specified position\n * @param containerSize - size of the container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @returns new position of the point\n *\n * @public\n */\nexport function rotatePosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n): Position {\n let x = position.x;\n let y = position.y;\n\n switch (rotation) {\n case Rotation.Degree0:\n x = position.x;\n y = position.y;\n break;\n case Rotation.Degree90:\n x = containerSize.height - position.y;\n y = position.x;\n break;\n case Rotation.Degree180:\n x = containerSize.width - position.x;\n y = containerSize.height - position.y;\n break;\n case Rotation.Degree270:\n x = position.y;\n y = containerSize.width - position.x;\n break;\n }\n\n return {\n x,\n y,\n };\n}\n\n/**\n * Calculate the position of point by scaling the container\n * @param position - position of the point\n * @param scaleFactor - factor of scaling\n * @returns new position of point\n *\n * @public\n */\nexport function scalePosition(position: Position, scaleFactor: number): Position {\n return {\n x: position.x * scaleFactor,\n y: position.y * scaleFactor,\n };\n}\n\n/**\n * Calculate the position of the point by applying the specified transformation\n * @param containerSize - size of container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns new position of point\n *\n * @public\n */\nexport function transformPosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n scaleFactor: number,\n): Position {\n return scalePosition(rotatePosition(containerSize, position, rotation), scaleFactor);\n}\n\n/**\n * Restore the position in a transformed cotainer\n * @param containerSize - size of the container\n * @param position - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns the original position of the point\n *\n * @public\n */\nexport function restorePosition(\n containerSize: Size,\n position: Position,\n rotation: Rotation,\n scaleFactor: number,\n): Position {\n return scalePosition(\n rotatePosition(containerSize, position, (4 - rotation) % 4),\n 1 / scaleFactor,\n );\n}\n\n/**\n * representation of rectangle\n *\n * @public\n */\nexport interface Rect {\n /**\n * origin of the rectangle\n */\n origin: Position;\n\n /**\n * size of the rectangle\n */\n size: Size;\n}\n\n/**\n * Check if two rectangles are equal\n * @param a - first rectangle\n * @param b - second rectangle\n * @returns true if the rectangles are equal, false otherwise\n *\n * @public\n */\nexport function rectEquals(a: Rect, b: Rect): boolean {\n return (\n a.origin.x === b.origin.x &&\n a.origin.y === b.origin.y &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height\n );\n}\n\n/**\n * Calculate the rect from the given points\n * @param pts - points\n * @returns rect\n *\n * @public\n */\nexport function rectFromPoints(positions: Position[]): Rect {\n if (positions.length === 0) {\n return { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } };\n }\n const xs = positions.map((p) => p.x);\n const ys = positions.map((p) => p.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return {\n origin: { x: minX, y: minY },\n size: {\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n },\n };\n}\n\n/**\n * Transform the point by the given angle and translation\n * @param pos - point\n * @param angleRad - angle in radians\n * @param translate - translation\n * @returns transformed point\n *\n * @public\n */\nexport function rotateAndTranslatePoint(\n pos: Position,\n angleRad: number,\n translate: Position,\n): Position {\n const cos = Math.cos(angleRad);\n const sin = Math.sin(angleRad);\n const newX = pos.x * cos - pos.y * sin;\n const newY = pos.x * sin + pos.y * cos;\n return {\n x: newX + translate.x,\n y: newY + translate.y,\n };\n}\n\n/**\n * Expand the rect by the given padding\n * @param rect - rectangle\n * @param padding - padding\n * @returns expanded rect\n *\n * @public\n */\nexport function expandRect(rect: Rect, padding: number): Rect {\n return {\n origin: { x: rect.origin.x - padding, y: rect.origin.y - padding },\n size: { width: rect.size.width + padding * 2, height: rect.size.height + padding * 2 },\n };\n}\n\n/**\n * Calculate the rect after rotated the container\n * @param containerSize - size of container\n * @param rect - target rect\n * @param rotation - rotation angle\n * @returns rotated rect\n *\n * @public\n */\nexport function rotateRect(containerSize: Size, rect: Rect, rotation: Rotation): Rect {\n let x = rect.origin.x;\n let y = rect.origin.y;\n let size = rect.size;\n\n switch (rotation) {\n case Rotation.Degree0:\n break;\n case Rotation.Degree90:\n x = containerSize.height - rect.origin.y - rect.size.height;\n y = rect.origin.x;\n size = swap(rect.size);\n break;\n case Rotation.Degree180:\n x = containerSize.width - rect.origin.x - rect.size.width;\n y = containerSize.height - rect.origin.y - rect.size.height;\n break;\n case Rotation.Degree270:\n x = rect.origin.y;\n y = containerSize.width - rect.origin.x - rect.size.width;\n size = swap(rect.size);\n break;\n }\n\n return {\n origin: {\n x,\n y,\n },\n size: {\n width: size.width,\n height: size.height,\n },\n };\n}\n\n/**\n * Scale the rectangle\n * @param rect - rectangle\n * @param scaleFactor - factor of scaling\n * @returns new rectangle\n *\n * @public\n */\nexport function scaleRect(rect: Rect, scaleFactor: number): Rect {\n return {\n origin: {\n x: rect.origin.x * scaleFactor,\n y: rect.origin.y * scaleFactor,\n },\n size: {\n width: rect.size.width * scaleFactor,\n height: rect.size.height * scaleFactor,\n },\n };\n}\n\n/**\n * Calculate new rectangle after transforming the container\n * @param containerSize - size of the container\n * @param rect - the target rectangle\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns new rectangle after transformation\n *\n * @public\n */\nexport function transformRect(\n containerSize: Size,\n rect: Rect,\n rotation: Rotation,\n scaleFactor: number,\n): Rect {\n return scaleRect(rotateRect(containerSize, rect, rotation), scaleFactor);\n}\n\n/**\n * Calculate new rectangle before transforming the container\n * @param containerSize - size of the container\n * @param rect - the target rectangle\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns original rectangle before transformation\n *\n * @public\n */\nexport function restoreRect(\n containerSize: Size,\n rect: Rect,\n rotation: Rotation,\n scaleFactor: number,\n): Rect {\n return scaleRect(rotateRect(containerSize, rect, (4 - rotation) % 4), 1 / scaleFactor);\n}\n\n/**\n * Calculate the original offset in a transformed container\n * @param offset - position of the point\n * @param rotation - rotated angle\n * @param scaleFactor - factor of scaling\n * @returns original position of the point\n *\n * @public\n */\nexport function restoreOffset(offset: Position, rotation: Rotation, scaleFactor: number): Position {\n let offsetX = offset.x;\n let offsetY = offset.y;\n switch (rotation) {\n case Rotation.Degree0:\n offsetX = offset.x / scaleFactor;\n offsetY = offset.y / scaleFactor;\n break;\n case Rotation.Degree90:\n offsetX = offset.y / scaleFactor;\n offsetY = -offset.x / scaleFactor;\n break;\n case Rotation.Degree180:\n offsetX = -offset.x / scaleFactor;\n offsetY = -offset.y / scaleFactor;\n break;\n case Rotation.Degree270:\n offsetX = -offset.y / scaleFactor;\n offsetY = offset.x / scaleFactor;\n break;\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n}\n\n/**\n * Return the smallest rectangle that encloses *all* `rects`.\n * If the array is empty, returns `null`.\n *\n * @param rects - array of rectangles\n * @returns smallest rectangle that encloses all the rectangles\n *\n * @public\n */\nexport function boundingRect(rects: Rect[]): Rect | null {\n if (rects.length === 0) return null;\n\n let minX = rects[0].origin.x,\n minY = rects[0].origin.y,\n maxX = rects[0].origin.x + rects[0].size.width,\n maxY = rects[0].origin.y + rects[0].size.height;\n\n for (const r of rects) {\n minX = Math.min(minX, r.origin.x);\n minY = Math.min(minY, r.origin.y);\n maxX = Math.max(maxX, r.origin.x + r.size.width);\n maxY = Math.max(maxY, r.origin.y + r.size.height);\n }\n\n return {\n origin: {\n x: minX,\n y: minY,\n },\n size: {\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n}\n\nexport interface Matrix {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport function buildUserToDeviceMatrix(\n rect: Rect,\n rotation: Rotation,\n outW: number,\n outH: number,\n): Matrix {\n const L = rect.origin.x;\n const B = rect.origin.y;\n const W = rect.size.width;\n const H = rect.size.height;\n\n // Non-uniform scales chosen to hit the integer device bounds exactly.\n const sx0 = outW / W; // 0°/180°: x scale from W -> outW\n const sy0 = outH / H; // 0°/180°: y scale from H -> outH\n const sx90 = outW / H; // 90°/270°: x depends on H -> outW\n const sy90 = outH / W; // 90°/270°: y depends on W -> outH\n\n switch (rotation) {\n case Rotation.Degree0:\n // x' = sx0*(x-L), y' = sy0*(y-B)\n return { a: sx0, b: 0, c: 0, d: sy0, e: -sx0 * L, f: -sy0 * B };\n\n case Rotation.Degree270:\n // x' = sx90*(y-B)\n // y' = -sy90*(x-L) + sy90*W\n return { a: 0, b: -sy90, c: sx90, d: 0, e: -sx90 * B, f: sy90 * (L + W) };\n\n case Rotation.Degree180:\n // x' = -sx0*(x-L) + sx0*W\n // y' = -sy0*(y-B) + sy0*H\n return { a: -sx0, b: 0, c: 0, d: -sy0, e: sx0 * (L + W), f: sy0 * (B + H) };\n\n case Rotation.Degree90: // clockwise (i.e. 90° CCW)\n // x' = -sx90*(y-B) + sx90*H\n // y' = sy90*(x-L)\n return { a: 0, b: sy90, c: -sx90, d: 0, e: sx90 * (B + H), f: -sy90 * L };\n }\n}\n","/**\n * logger for logging\n *\n * @public\n */\nexport interface Logger {\n /**\n * Check if a log level is enabled\n * @param level - log level to check\n * @returns true if the level is enabled\n *\n * @public\n */\n isEnabled: (level: 'debug' | 'info' | 'warn' | 'error') => boolean;\n\n /**\n * Log debug message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n debug: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log infor message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n info: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log warning message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n warn: (source: string, category: string, ...args: any) => void;\n /**\n * Log error message\n * @param source - source of log\n * @param category - category of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n error: (source: string, category: string, ...args: any) => void;\n\n /**\n * Log performance log\n * @param source - source of log\n * @param category - category of log\n * @param event - event of log\n * @param phase - event phase of log\n * @param args - parameters of log\n * @returns\n *\n * @public\n */\n perf: (\n source: string,\n category: string,\n event: string,\n phase: 'Begin' | 'End',\n ...args: any\n ) => void;\n}\n\n/**\n * Logger that log nothing, it will ignore all the logs\n *\n * @public\n */\nexport class NoopLogger implements Logger {\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return false;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug() {}\n /** {@inheritDoc Logger.info} */\n info() {}\n /** {@inheritDoc Logger.warn} */\n warn() {}\n /** {@inheritDoc Logger.error} */\n error() {}\n /** {@inheritDoc Logger.perf} */\n perf() {}\n}\n\n/**\n * Logger that use console as the output\n *\n * @public\n */\nexport class ConsoleLogger implements Logger {\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return true;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n console.debug(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n console.info(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n console.warn(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n console.error(`${source}.${category}`, ...args);\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n console.info(`${source}.${category}.${event}.${phase}`, ...args);\n }\n}\n\n/**\n * Level of log\n *\n * @public\n */\nexport enum LogLevel {\n Debug = 0,\n Info,\n Warn,\n Error,\n}\n\n/**\n * Logger that support filtering by log level\n *\n * @public\n */\nexport class LevelLogger implements Logger {\n /**\n * create new LevelLogger\n * @param logger - the original logger\n * @param level - log level that used for filtering, all logs lower than this level will be filtered out\n */\n constructor(\n private logger: Logger,\n private level: LogLevel,\n ) {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n const levelMap = {\n debug: LogLevel.Debug,\n info: LogLevel.Info,\n warn: LogLevel.Warn,\n error: LogLevel.Error,\n };\n return this.level <= levelMap[level];\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Debug) {\n this.logger.debug(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Info) {\n this.logger.info(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Warn) {\n this.logger.warn(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n if (this.level <= LogLevel.Error) {\n this.logger.error(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n this.logger.perf(source, category, event, phase, ...args);\n }\n}\n\n/**\n * Logger for performance tracking\n *\n * @public\n */\nexport class PerfLogger implements Logger {\n private marks: Map<string, number> = new Map();\n\n /**\n * create new PerfLogger\n */\n constructor() {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(): boolean {\n return false;\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {}\n\n /** {@inheritDoc Logger.perf} */\n perf(\n source: string,\n category: string,\n event: string,\n phase: 'Begin' | 'End',\n identifier: string,\n ...args: any\n ) {\n const markName = `${source}.${category}.${event}.${phase}.${identifier}`;\n\n switch (phase) {\n case 'Begin':\n globalThis.performance.mark(markName, { detail: args });\n this.marks.set(`${source}.${category}.${event}.${identifier}`, Date.now());\n break;\n case 'End':\n globalThis.performance.mark(markName, { detail: args });\n const measureName = `${source}.${category}.${event}.Measure.${identifier}`;\n const beginMark = `${source}.${category}.${event}.Begin.${identifier}`;\n\n globalThis.performance.measure(measureName, beginMark, markName);\n\n // Log duration to console\n const startTime = this.marks.get(`${source}.${category}.${event}.${identifier}`);\n if (startTime) {\n const duration = Date.now() - startTime;\n console.info(`⏱️ ${source}.${category}.${event}.${identifier}: ${duration}ms`);\n this.marks.delete(`${source}.${category}.${event}.${identifier}`);\n }\n break;\n }\n }\n}\n\n/**\n * Logger that will track and call child loggers\n *\n * @public\n */\nexport class AllLogger implements Logger {\n /**\n * create new PerfLogger\n */\n constructor(private loggers: Logger[]) {}\n\n /** {@inheritDoc Logger.isEnabled} */\n isEnabled(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n return this.loggers.some((logger) => logger.isEnabled(level));\n }\n\n /** {@inheritDoc Logger.debug} */\n debug(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.debug(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.info} */\n info(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.info(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.warn} */\n warn(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.warn(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.error} */\n error(source: string, category: string, ...args: any) {\n for (const logger of this.loggers) {\n logger.error(source, category, ...args);\n }\n }\n\n /** {@inheritDoc Logger.perf} */\n perf(source: string, category: string, event: string, phase: 'Begin' | 'End', ...args: any) {\n for (const logger of this.loggers) {\n logger.perf(source, category, event, phase, ...args);\n }\n }\n}\n","/**\n * Stage of task\n *\n * @public\n */\nexport enum TaskStage {\n /**\n * Task is pending, means it just start executing\n */\n Pending = 0,\n /**\n * Task is succeed\n */\n Resolved = 1,\n /**\n * Task is failed\n */\n Rejected = 2,\n /**\n * Task is aborted\n */\n Aborted = 3,\n}\n\nexport interface TaskError<D> {\n /**\n * task error type\n */\n type: 'reject' | 'abort';\n /**\n * task error\n */\n reason: D;\n}\n\n/**\n * callback that will be called when task is resolved\n *\n * @public\n */\nexport type ResolvedCallback<R> = (r: R) => void;\n\n/**\n * callback that will be called when task is rejected\n *\n * @public\n */\nexport type RejectedCallback<D> = (e: TaskError<D>) => void;\n\n/**\n * callback that will be called when task is progressing\n *\n * @public\n */\nexport type ProgressCallback<P> = (p: P) => void;\n\n/**\n * Task state in different stage\n *\n * @public\n */\nexport type TaskState<R, D> =\n | {\n stage: TaskStage.Pending;\n }\n | {\n stage: TaskStage.Resolved;\n result: R;\n }\n | {\n stage: TaskStage.Rejected;\n reason: D;\n }\n | {\n stage: TaskStage.Aborted;\n reason: D;\n };\n\n/**\n * Result type for allSettled\n *\n * @public\n */\nexport type TaskSettledResult<R, D> =\n | { status: 'resolved'; value: R }\n | { status: 'rejected'; reason: D }\n | { status: 'aborted'; reason: D };\n\nexport class TaskAbortedError<D> extends Error {\n public readonly reason: D;\n\n constructor(reason: D) {\n super(`Task aborted: ${JSON.stringify(reason)}`);\n this.name = 'TaskAbortedError';\n this.reason = reason;\n }\n}\n\nexport class TaskRejectedError<D> extends Error {\n public readonly reason: D;\n\n constructor(reason: D) {\n super(`Task rejected: ${JSON.stringify(reason)}`);\n this.name = 'TaskRejectedError';\n this.reason = reason;\n }\n}\n\n/**\n * Base class of task\n *\n * @public\n */\nexport class Task<R, D, P = unknown> {\n state: TaskState<R, D> = {\n stage: TaskStage.Pending,\n };\n /**\n * callbacks that will be executed when task is resolved\n */\n resolvedCallbacks: ResolvedCallback<R>[] = [];\n /**\n * callbacks that will be executed when task is rejected\n */\n rejectedCallbacks: RejectedCallback<D>[] = [];\n\n /**\n * Promise that will be resolved when task is settled\n */\n private _promise: Promise<R> | null = null;\n\n /**\n * callbacks that will be executed when task is progressing\n */\n private progressCbs: ProgressCallback<P>[] = [];\n\n /**\n * Convert task to promise\n * @returns promise that will be resolved when task is settled\n */\n toPromise(): Promise<R> {\n if (!this._promise) {\n this._promise = new Promise((resolve, reject) => {\n this.wait(\n (result) => resolve(result),\n (error) => {\n if (error.type === 'abort') {\n reject(new TaskAbortedError(error.reason));\n } else {\n reject(new TaskRejectedError(error.reason));\n }\n },\n );\n });\n }\n return this._promise;\n }\n\n /**\n * wait for task to be settled\n * @param resolvedCallback - callback for resolved value\n * @param rejectedCallback - callback for rejected value\n */\n wait(resolvedCallback: ResolvedCallback<R>, rejectedCallback: RejectedCallback<D>) {\n switch (this.state.stage) {\n case TaskStage.Pending:\n this.resolvedCallbacks.push(resolvedCallback);\n this.rejectedCallbacks.push(rejectedCallback);\n break;\n case TaskStage.Resolved:\n resolvedCallback(this.state.result);\n break;\n case TaskStage.Rejected:\n rejectedCallback({\n type: 'reject',\n reason: this.state.reason,\n });\n break;\n case TaskStage.Aborted:\n rejectedCallback({\n type: 'abort',\n reason: this.state.reason,\n });\n break;\n }\n }\n\n /**\n * resolve task with specific result\n * @param result - result value\n */\n resolve(result: R) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Resolved,\n result,\n };\n for (const resolvedCallback of this.resolvedCallbacks) {\n try {\n resolvedCallback(result);\n } catch (e) {\n /* ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * reject task with specific reason\n * @param reason - abort reason\n *\n */\n reject(reason: D) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Rejected,\n reason,\n };\n for (const rejectedCallback of this.rejectedCallbacks) {\n try {\n rejectedCallback({\n type: 'reject',\n reason,\n });\n } catch (e) {\n /*ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * abort task with specific reason\n * @param reason - abort reason\n */\n abort(reason: D) {\n if (this.state.stage === TaskStage.Pending) {\n this.state = {\n stage: TaskStage.Aborted,\n reason,\n };\n for (const rejectedCallback of this.rejectedCallbacks) {\n try {\n rejectedCallback({\n type: 'abort',\n reason,\n });\n } catch (e) {\n /* ignore */\n }\n }\n this.resolvedCallbacks = [];\n this.rejectedCallbacks = [];\n }\n }\n\n /**\n * fail task with a TaskError from another task\n * This is a convenience method for error propagation between tasks\n * @param error - TaskError from another task\n */\n fail(error: TaskError<D>) {\n if (error.type === 'abort') {\n this.abort(error.reason);\n } else {\n this.reject(error.reason);\n }\n }\n\n /**\n * add a progress callback\n * @param cb - progress callback\n */\n onProgress(cb: ProgressCallback<P>) {\n this.progressCbs.push(cb);\n }\n\n /**\n * call progress callback\n * @param p - progress value\n */\n progress(p: P) {\n for (const cb of this.progressCbs) cb(p);\n }\n\n /**\n * Static method to wait for all tasks to resolve\n * Returns a new task that resolves with an array of all results\n * Rejects immediately if any task fails\n *\n * @param tasks - array of tasks to wait for\n * @returns new task that resolves when all input tasks resolve\n * @public\n */\n static all<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<{ [K in keyof R]: R[K] extends Task<infer U, any> ? U : never }, any> {\n type ResultType = { [K in keyof R]: R[K] extends Task<infer U, any> ? U : never };\n\n const combinedTask = new Task<ResultType, any>();\n\n if (tasks.length === 0) {\n combinedTask.resolve([] as any);\n return combinedTask;\n }\n\n const results: any[] = new Array(tasks.length);\n let resolvedCount = 0;\n let isSettled = false;\n\n tasks.forEach((task, index) => {\n task.wait(\n (result) => {\n if (isSettled) return;\n\n results[index] = result;\n resolvedCount++;\n\n if (resolvedCount === tasks.length) {\n isSettled = true;\n combinedTask.resolve(results as ResultType);\n }\n },\n (error) => {\n if (isSettled) return;\n\n isSettled = true;\n if (error.type === 'abort') {\n combinedTask.abort(error.reason);\n } else {\n combinedTask.reject(error.reason);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Static method to wait for all tasks to settle (resolve, reject, or abort)\n * Always resolves with an array of settlement results\n *\n * @param tasks - array of tasks to wait for\n * @returns new task that resolves when all input tasks settle\n * @public\n */\n static allSettled<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<\n { [K in keyof R]: R[K] extends Task<infer U, infer E> ? TaskSettledResult<U, E> : never },\n never\n > {\n type ResultType = {\n [K in keyof R]: R[K] extends Task<infer U, infer E> ? TaskSettledResult<U, E> : never;\n };\n\n const combinedTask = new Task<ResultType, never>();\n\n if (tasks.length === 0) {\n combinedTask.resolve([] as any);\n return combinedTask;\n }\n\n const results: any[] = new Array(tasks.length);\n let settledCount = 0;\n\n tasks.forEach((task, index) => {\n task.wait(\n (result) => {\n results[index] = { status: 'resolved', value: result };\n settledCount++;\n\n if (settledCount === tasks.length) {\n combinedTask.resolve(results as ResultType);\n }\n },\n (error) => {\n results[index] = {\n status: error.type === 'abort' ? 'aborted' : 'rejected',\n reason: error.reason,\n };\n settledCount++;\n\n if (settledCount === tasks.length) {\n combinedTask.resolve(results as ResultType);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Static method that resolves/rejects with the first task that settles\n *\n * @param tasks - array of tasks to race\n * @returns new task that settles with the first input task that settles\n * @public\n */\n static race<R extends readonly Task<any, any>[]>(\n tasks: R,\n ): Task<\n R[number] extends Task<infer U, any> ? U : never,\n R[number] extends Task<any, infer E> ? E : never\n > {\n type ResultType = R[number] extends Task<infer U, any> ? U : never;\n type ErrorType = R[number] extends Task<any, infer E> ? E : never;\n\n const combinedTask = new Task<ResultType, ErrorType>();\n\n if (tasks.length === 0) {\n combinedTask.reject('No tasks provided' as ErrorType);\n return combinedTask;\n }\n\n let isSettled = false;\n\n tasks.forEach((task) => {\n task.wait(\n (result) => {\n if (isSettled) return;\n isSettled = true;\n combinedTask.resolve(result);\n },\n (error) => {\n if (isSettled) return;\n isSettled = true;\n if (error.type === 'abort') {\n combinedTask.abort(error.reason);\n } else {\n combinedTask.reject(error.reason);\n }\n },\n );\n });\n\n return combinedTask;\n }\n\n /**\n * Utility to track progress of multiple tasks\n *\n * @param tasks - array of tasks to track\n * @param onProgress - callback called when any task completes\n * @returns new task that resolves when all input tasks resolve\n * @public\n */\n static withProgress<R extends readonly Task<any, any>[]>(\n tasks: R,\n onProgress?: (completed: number, total: number) => void,\n ): Task<{ [K in keyof R]: R[K] extends Task<infer U, any> ? U : never }, any> {\n const combinedTask = Task.all(tasks);\n\n if (onProgress) {\n let completedCount = 0;\n tasks.forEach((task) => {\n task.wait(\n () => {\n completedCount++;\n onProgress(completedCount, tasks.length);\n },\n () => {\n completedCount++;\n onProgress(completedCount, tasks.length);\n },\n );\n });\n }\n\n return combinedTask;\n }\n}\n\n/**\n * Type that represent the result of executing task\n */\nexport type TaskReturn<T extends Task<any, any>> =\n T extends Task<infer R, infer E>\n ? { type: 'result'; value: R } | { type: 'error'; value: TaskError<E> }\n : never;\n","import { Size, Rect, Position, Rotation } from './geometry';\nimport { Task, TaskError } from './task';\n\n/**\n * Representation of pdf page\n *\n * @public\n */\nexport interface PdfPageObject {\n /**\n * Index of this page, starts from 0\n */\n index: number;\n\n /**\n * Orignal size of this page\n */\n size: Size;\n\n /**\n * Rotation of this page\n */\n rotation: Rotation;\n}\n\n/**\n * Representation of pdf page with rotated size\n *\n * @public\n */\nexport interface PdfPageObjectWithRotatedSize extends PdfPageObject {\n /**\n * Rotated size of this page\n */\n rotatedSize: Size;\n}\n\n/**\n * Representation of pdf document\n *\n * @public\n */\nexport interface PdfDocumentObject {\n /**\n * Identity of document\n */\n id: string;\n\n /**\n * Count of pages in this document\n */\n pageCount: number;\n\n /**\n * Pages in this document\n */\n pages: PdfPageObject[];\n}\n\n/**\n * metadata of pdf document\n *\n * @public\n */\nexport interface PdfMetadataObject {\n /**\n * title of the document\n */\n title: string | null;\n /**\n * author of the document\n */\n author: string | null;\n /**\n * subject of the document\n */\n subject: string | null;\n /**\n * keywords of the document\n */\n keywords: string | null;\n /**\n * producer of the document\n */\n producer: string | null;\n /**\n * creator of the document\n */\n creator: string | null;\n /**\n * creation date of the document\n */\n creationDate: Date | null;\n /**\n * modification date of the document\n */\n modificationDate: Date | null;\n /**\n * trapped status of the document\n */\n trapped: PdfTrappedStatus | null;\n\n /**\n * Non-predefined Info dictionary entries.\n */\n custom?: Record<string, string | null>;\n}\n\n/**\n * Unicode **soft-hyphen** marker (`U+00AD`).\n * Often embedded by PDF generators as discretionary hyphens.\n *\n * @public\n */\nexport const PdfSoftHyphenMarker = '\\u00AD';\n\n/**\n * Unicode **zero-width space** (`U+200B`).\n *\n * @public\n */\nexport const PdfZeroWidthSpace = '\\u200B';\n\n/**\n * Unicode **word-joiner** (`U+2060`) – zero-width no-break.\n *\n * @public\n */\nexport const PdfWordJoiner = '\\u2060';\n\n/**\n * Unicode **byte-order mark / zero-width no-break space** (`U+FEFF`).\n *\n * @public\n */\nexport const PdfBomOrZwnbsp = '\\uFEFF';\n\n/**\n * Unicode non-character `U+FFFE`.\n *\n * @public\n */\nexport const PdfNonCharacterFFFE = '\\uFFFE';\n\n/**\n * Unicode non-character `U+FFFF`.\n *\n * @public\n */\nexport const PdfNonCharacterFFFF = '\\uFFFF';\n\n/**\n * **Frozen list** of all unwanted markers in canonical order.\n *\n * @public\n */\nexport const PdfUnwantedTextMarkers = Object.freeze([\n PdfSoftHyphenMarker,\n PdfZeroWidthSpace,\n PdfWordJoiner,\n PdfBomOrZwnbsp,\n PdfNonCharacterFFFE,\n PdfNonCharacterFFFF,\n] as const);\n\n/**\n * Compiled regular expression that matches any unwanted marker.\n *\n * @public\n */\nexport const PdfUnwantedTextRegex = new RegExp(`[${PdfUnwantedTextMarkers.join('')}]`, 'g');\n\n/**\n * Remove all {@link PdfUnwantedTextMarkers | unwanted markers} from *text*.\n *\n * @param text - raw text extracted from PDF\n * @returns cleaned text\n *\n * @public\n */\nexport function stripPdfUnwantedMarkers(text: string): string {\n return text.replace(PdfUnwantedTextRegex, '');\n}\n\n/**\n * Zoom mode\n *\n * @public\n */\nexport enum PdfZoomMode {\n Unknown = 0,\n /**\n * Zoom level with specified offset.\n */\n XYZ = 1,\n /**\n * Fit both the width and height of the page (whichever smaller).\n */\n FitPage = 2,\n /**\n * Fit the entire page width to the window.\n */\n FitHorizontal = 3,\n /**\n * Fit the entire page height to the window.\n */\n FitVertical = 4,\n /**\n * Fit a specific rectangle area within the window.\n */\n FitRectangle = 5,\n /**\n * Fit bounding box of the entire page (including annotations).\n */\n FitBoundingBox = 6,\n /**\n * Fit the bounding box width of the page.\n */\n FitBoundingBoxHorizontal = 7,\n /**\n * Fit the bounding box height of the page.\n */\n FitBoundingBoxVertical = 8,\n}\n\n/**\n * Trapped status of the document.\n *\n * @public\n */\nexport enum PdfTrappedStatus {\n /**\n * No /Trapped key\n */\n NotSet = 0,\n /**\n * Explicitly /Trapped /True\n */\n True = 1,\n /**\n * Explicitly /Trapped /False\n */\n False = 2,\n /**\n * Explicitly /Trapped /Unknown or invalid\n */\n Unknown = 3,\n}\n\n/**\n * 12 default fonts for PDF\n */\nexport enum PdfStandardFont {\n Unknown = -1,\n Courier = 0,\n Courier_Bold = 1,\n Courier_BoldOblique = 2,\n Courier_Oblique = 3,\n Helvetica = 4,\n Helvetica_Bold = 5,\n Helvetica_BoldOblique = 6,\n Helvetica_Oblique = 7,\n Times_Roman = 8,\n Times_Bold = 9,\n Times_BoldItalic = 10,\n Times_Italic = 11,\n Symbol = 12,\n ZapfDingbats = 13,\n}\n\n/**\n * Text alignment\n */\nexport enum PdfTextAlignment {\n Left = 0,\n Center = 1,\n Right = 2,\n}\n\n/**\n * Vertical alignment\n */\nexport enum PdfVerticalAlignment {\n Top = 0,\n Middle = 1,\n Bottom = 2,\n}\n\n/**\n * Blend mode\n *\n * @public\n */\nexport enum PdfBlendMode {\n Normal = 0,\n Multiply = 1,\n Screen = 2,\n Overlay = 3,\n Darken = 4,\n Lighten = 5,\n ColorDodge = 6,\n ColorBurn = 7,\n HardLight = 8,\n SoftLight = 9,\n Difference = 10,\n Exclusion = 11,\n Hue = 12,\n Saturation = 13,\n Color = 14,\n Luminosity = 15,\n}\n\n/**\n * Stamp fit\n */\nexport enum PdfStampFit {\n Contain = 0,\n Cover = 1,\n Stretch = 2,\n}\n\n/**\n * Representation of the linked destination\n *\n * @public\n */\nexport interface PdfDestinationObject {\n /**\n * Index of target page\n */\n pageIndex: number;\n /**\n * zoom config for target destination\n */\n zoom:\n | {\n mode: PdfZoomMode.Unknown;\n }\n | { mode: PdfZoomMode.XYZ; params: { x: number; y: number; zoom: number } }\n | {\n mode: PdfZoomMode.FitPage;\n }\n | {\n mode: PdfZoomMode.FitHorizontal;\n }\n | {\n mode: PdfZoomMode.FitVertical;\n }\n | {\n mode: PdfZoomMode.FitRectangle;\n }\n | {\n mode: PdfZoomMode.FitBoundingBox;\n }\n | {\n mode: PdfZoomMode.FitBoundingBoxHorizontal;\n }\n | {\n mode: PdfZoomMode.FitBoundingBoxVertical;\n };\n view: number[];\n}\n\n/**\n * Type of pdf action\n *\n * @public\n */\nexport enum PdfActionType {\n Unsupported = 0,\n /**\n * Goto specified position in this document\n */\n Goto = 1,\n /**\n * Goto specified position in another document\n */\n RemoteGoto = 2,\n /**\n * Goto specified URI\n */\n URI = 3,\n /**\n * Launch specifed application\n */\n LaunchAppOrOpenFile = 4,\n}\n\nexport type PdfImage = {\n data: Uint8ClampedArray<ArrayBuffer>;\n width: number;\n height: number;\n};\n\n/**\n * Image data type that matches both browser's ImageData and plain objects.\n * Used for raw rendering output that may include colorSpace from browser APIs.\n *\n * @public\n */\nexport type ImageDataLike = {\n data: Uint8ClampedArray<ArrayBuffer>;\n width: number;\n height: number;\n colorSpace?: PredefinedColorSpace;\n};\n\n/**\n * Representation of pdf action\n *\n * @public\n */\nexport type PdfActionObject =\n | {\n type: PdfActionType.Unsupported;\n }\n | {\n type: PdfActionType.Goto;\n destination: PdfDestinationObject;\n }\n | {\n type: PdfActionType.RemoteGoto;\n destination: PdfDestinationObject;\n }\n | {\n type: PdfActionType.URI;\n uri: string;\n }\n | {\n type: PdfActionType.LaunchAppOrOpenFile;\n path: string;\n };\n\n/**\n * target of pdf link\n *\n * @public\n */\nexport type PdfLinkTarget =\n | {\n type: 'action';\n action: PdfActionObject;\n }\n | {\n type: 'destination';\n destination: PdfDestinationObject;\n };\n\n/**\n * PDF bookmark\n *\n * @public\n */\nexport interface PdfBookmarkObject {\n /**\n * title of bookmark\n */\n title: string;\n\n /**\n * target of bookmark\n */\n target?: PdfLinkTarget | undefined;\n\n /**\n * bookmarks in the next level\n */\n children?: PdfBookmarkObject[];\n}\n\n/**\n * Pdf Signature\n *\n * @public\n */\nexport interface PdfSignatureObject {\n /**\n * contents of signature\n */\n contents: ArrayBuffer;\n\n /**\n * byte range of signature\n */\n byteRange: ArrayBuffer;\n\n /**\n * sub filters of signature\n */\n subFilter: ArrayBuffer;\n\n /**\n * reason of signature\n */\n reason: string;\n\n /**\n * creation time of signature\n */\n time: string;\n\n /**\n * MDP\n */\n docMDP: number;\n}\n\n/**\n * Bookmark tree of pdf\n *\n * @public\n */\nexport interface PdfBookmarksObject {\n bookmarks: PdfBookmarkObject[];\n}\n\n/**\n * Text rectangle in pdf page\n *\n * @public\n */\nexport interface PdfTextRectObject {\n /**\n * Font of the text\n */\n font: {\n /**\n * font family\n */\n family: string;\n\n /**\n * font size\n */\n size: number;\n };\n\n /**\n * content in this rectangle area\n */\n content: string;\n\n /**\n * rectangle of the text\n */\n rect: Rect;\n}\n\n/**\n * Color\n *\n * @public\n */\nexport interface PdfAlphaColor {\n /**\n * red\n */\n red: number;\n /**\n * green\n */\n green: number;\n /**\n * blue\n */\n blue: number;\n /**\n * alpha\n */\n alpha: number;\n}\n\n/**\n * Color\n *\n * @public\n */\nexport interface PdfColor {\n red: number;\n green: number;\n blue: number;\n}\n\n/**\n * Annotation type\n *\n * @public\n */\nexport enum PdfAnnotationSubtype {\n UNKNOWN = 0,\n TEXT,\n LINK,\n FREETEXT,\n LINE,\n SQUARE,\n CIRCLE,\n POLYGON,\n POLYLINE,\n HIGHLIGHT,\n UNDERLINE,\n SQUIGGLY,\n STRIKEOUT,\n STAMP,\n CARET,\n INK,\n POPUP,\n FILEATTACHMENT,\n SOUND,\n MOVIE,\n WIDGET,\n SCREEN,\n PRINTERMARK,\n TRAPNET,\n WATERMARK,\n THREED,\n RICHMEDIA,\n XFAWIDGET,\n REDACT,\n}\n\n/**\n * Name of annotation type\n *\n * @public\n */\nexport const PdfAnnotationSubtypeName: Record<PdfAnnotationSubtype, string> = {\n [PdfAnnotationSubtype.UNKNOWN]: 'unknow',\n [PdfAnnotationSubtype.TEXT]: 'text',\n [PdfAnnotationSubtype.LINK]: 'link',\n [PdfAnnotationSubtype.FREETEXT]: 'freetext',\n [PdfAnnotationSubtype.LINE]: 'line',\n [PdfAnnotationSubtype.SQUARE]: 'square',\n [PdfAnnotationSubtype.CIRCLE]: 'circle',\n [PdfAnnotationSubtype.POLYGON]: 'polygon',\n [PdfAnnotationSubtype.POLYLINE]: 'polyline',\n [PdfAnnotationSubtype.HIGHLIGHT]: 'highlight',\n [PdfAnnotationSubtype.UNDERLINE]: 'underline',\n [PdfAnnotationSubtype.SQUIGGLY]: 'squiggly',\n [PdfAnnotationSubtype.STRIKEOUT]: 'strikeout',\n [PdfAnnotationSubtype.STAMP]: 'stamp',\n [PdfAnnotationSubtype.CARET]: 'caret',\n [PdfAnnotationSubtype.INK]: 'ink',\n [PdfAnnotationSubtype.POPUP]: 'popup',\n [PdfAnnotationSubtype.FILEATTACHMENT]: 'fileattachment',\n [PdfAnnotationSubtype.SOUND]: 'sound',\n [PdfAnnotationSubtype.MOVIE]: 'movie',\n [PdfAnnotationSubtype.WIDGET]: 'widget',\n [PdfAnnotationSubtype.SCREEN]: 'screen',\n [PdfAnnotationSubtype.PRINTERMARK]: 'printermark',\n [PdfAnnotationSubtype.TRAPNET]: 'trapnet',\n [PdfAnnotationSubtype.WATERMARK]: 'watermark',\n [PdfAnnotationSubtype.THREED]: 'threed',\n [PdfAnnotationSubtype.RICHMEDIA]: 'richmedia',\n [PdfAnnotationSubtype.XFAWIDGET]: 'xfawidget',\n [PdfAnnotationSubtype.REDACT]: 'redact',\n};\n\n/**\n * Context map for annotation subtypes\n *\n * @public\n */\nexport interface AnnotationContextMap {\n [PdfAnnotationSubtype.STAMP]: { imageData: ImageData };\n // add more sub-types here if they ever need extra data\n}\n\n/**\n * Context type for annotation subtypes\n *\n * @public\n */\nexport type AnnotationCreateContext<A extends PdfAnnotationObject> =\n A['type'] extends keyof AnnotationContextMap ? AnnotationContextMap[A['type']] : undefined;\n\n/**\n * Status of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationObjectStatus {\n /**\n * Annotation is created\n */\n Created,\n /**\n * Annotation is committed to PDF file\n */\n Committed,\n}\n\n/**\n * Appearance mode\n *\n * @public\n */\nexport enum AppearanceMode {\n Normal = 0,\n Rollover = 1,\n Down = 2,\n}\n\n/**\n * State of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationState {\n /**\n * Annotation is active\n */\n Marked = 'Marked',\n /**\n * Annotation is unmarked\n */\n Unmarked = 'Unmarked',\n /**\n * Annotation is ink\n */\n Accepted = 'Accepted',\n /**\n * Annotation is rejected\n */\n Rejected = 'Rejected',\n /**\n * Annotation is complete\n */\n Completed = 'Completed',\n /**\n * Annotation is cancelled\n */\n Cancelled = 'Cancelled',\n /**\n * Annotation is none\n */\n None = 'None',\n}\n\n/**\n * State model of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationStateModel {\n /**\n * Annotation is marked\n */\n Marked = 'Marked',\n /**\n * Annotation is reviewed\n */\n Review = 'Review',\n}\n\n/**\n * Icon of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationIcon {\n /**\n * Unknown icon\n */\n Unknown = -1,\n /**\n * Comment icon\n */\n Comment = 0,\n /**\n * Key icon\n */\n Key = 1,\n /**\n * Note icon\n */\n Note = 2,\n /**\n * Help icon\n */\n Help = 3,\n /**\n * New paragraph icon\n */\n NewParagraph = 4,\n /**\n * Paragraph icon\n */\n Paragraph = 5,\n /**\n * Insert icon\n */\n Insert = 6,\n /**\n * Graph icon\n */\n Graph = 7,\n /**\n * Push pin icon\n */\n PushPin = 8,\n /**\n * Paperclip icon\n */\n Paperclip = 9,\n /**\n * Tag icon\n */\n Tag = 10,\n /**\n * Speaker icon\n */\n Speaker = 11,\n /**\n * Mic icon\n */\n Mic = 12,\n /**\n * Approved icon\n */\n Approved = 13,\n /**\n * Experimental icon\n */\n Experimental = 14,\n /**\n * Not approved icon\n */\n NotApproved = 15,\n /**\n * As is icon\n */\n AsIs = 16,\n /**\n * Expired icon\n */\n Expired = 17,\n /**\n * Not for public release icon\n */\n NotForPublicRelease = 18,\n /**\n * Confidential icon\n */\n Confidential = 19,\n /**\n * Final icon\n */\n Final = 20,\n /**\n * Sold icon\n */\n Sold = 21,\n /**\n * Departmental icon\n */\n Departmental = 22,\n /**\n * For comment icon\n */\n ForComment = 23,\n /**\n * Top secret icon\n */\n TopSecret = 24,\n /**\n * Draft icon\n */\n Draft = 25,\n /**\n * For public release icon\n */\n ForPublicRelease = 26,\n}\n\n/**\n * Line ending of annotation\n */\nexport enum PdfAnnotationLineEnding {\n /**\n * No line ending\n */\n None = 0,\n /**\n * Square line ending\n */\n Square = 1,\n /**\n * Circle line ending\n */\n Circle = 2,\n /**\n * Diamond line ending\n */\n Diamond = 3,\n /**\n * Open arrow line ending\n */\n OpenArrow = 4,\n /**\n * Closed arrow line ending\n */\n ClosedArrow = 5,\n /**\n * Butt line ending\n */\n Butt = 6,\n /**\n * Right open arrow line ending\n */\n ROpenArrow = 7,\n /**\n * Right closed arrow line ending\n */\n RClosedArrow = 8,\n /**\n * Slash line ending\n */\n Slash = 9,\n /**\n * Unknown line ending\n */\n Unknown = 10,\n}\n\n/**\n * Basic information of pdf annotation\n *\n * @public\n */\nexport interface PdfAnnotationObjectBase {\n /**\n * Author of the annotation\n */\n author?: string;\n\n /**\n * Modified date of the annotation\n */\n modified?: Date;\n\n /**\n * Created date of the annotation\n */\n created?: Date;\n\n /**\n * blend mode of annotation\n */\n blendMode?: PdfBlendMode;\n\n /**\n * intent of annotation\n */\n intent?: string;\n\n /**\n * Sub type of annotation\n */\n type: PdfAnnotationSubtype;\n\n /**\n * flags of the annotation\n */\n flags?: PdfAnnotationFlagName[];\n\n /**\n * The index of page that this annotation belong to\n */\n pageIndex: number;\n\n /**\n * contents of the annotation\n */\n contents?: string;\n\n /**\n * id of the annotation\n */\n id: string;\n\n /**\n * Rectangle of the annotation\n */\n rect: Rect;\n\n /**\n * Custom data of the annotation\n */\n custom?: any;\n}\n\n/**\n * Popup annotation\n *\n * @public\n */\nexport interface PdfPopupAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POPUP;\n /**\n * Contents of the popup\n */\n contents: string;\n\n /**\n * Whether the popup is opened or not\n */\n open: boolean;\n\n /**\n * In reply to id\n */\n inReplyToId?: string;\n}\n\n/**\n * Pdf Link annotation\n *\n * @public\n */\nexport interface PdfLinkAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.LINK;\n /**\n * target of the link\n */\n target: PdfLinkTarget | undefined;\n}\n\n/**\n * Pdf Text annotation\n *\n * @public\n */\nexport interface PdfTextAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.TEXT;\n /**\n * Text contents of the annotation\n */\n contents: string;\n\n /**\n * color of text annotation\n */\n color?: string;\n\n /**\n * opacity of text annotation\n */\n opacity?: number;\n\n /**\n * In reply to id\n */\n inReplyToId?: string;\n\n /**\n * State of the text annotation\n */\n state?: PdfAnnotationState;\n\n /**\n * State model of the text annotation\n */\n stateModel?: PdfAnnotationStateModel;\n\n /**\n * Icon of the text annotation\n */\n icon?: PdfAnnotationIcon;\n}\n\n/**\n * Type of form field\n *\n * @public\n */\nexport enum PDF_FORM_FIELD_TYPE {\n /**\n * Unknow\n */\n UNKNOWN = 0,\n /**\n * push button type\n */\n PUSHBUTTON = 1,\n /**\n * check box type.\n */\n CHECKBOX = 2,\n /**\n * radio button type.\n */\n RADIOBUTTON = 3,\n /**\n * combo box type.\n */\n COMBOBOX = 4,\n /**\n * list box type.\n */\n LISTBOX = 5,\n /**\n * text field type\n */\n TEXTFIELD = 6,\n /**\n * signature field type.\n */\n SIGNATURE = 7,\n /**\n * Generic XFA type.\n */\n XFA = 8,\n /**\n * XFA check box type.\n */\n XFA_CHECKBOX = 9,\n /**\n * XFA combo box type.\n */\n XFA_COMBOBOX = 10,\n /**\n * XFA image field type.\n */\n XFA_IMAGEFIELD = 11,\n /**\n * XFA list box type.\n */\n XFA_LISTBOX = 12,\n /**\n * XFA push button type.\n */\n XFA_PUSHBUTTON = 13,\n /**\n * XFA signture field type.\n */\n XFA_SIGNATURE = 14,\n /**\n * XFA text field type.\n */\n XFA_TEXTFIELD = 15,\n}\n\nexport enum PdfAnnotationColorType {\n Color = 0,\n InteriorColor = 1,\n}\n\n/**\n * Border style of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationBorderStyle {\n UNKNOWN = 0,\n SOLID = 1,\n DASHED = 2,\n BEVELED = 3,\n INSET = 4,\n UNDERLINE = 5,\n CLOUDY = 6,\n}\n\n/**\n * Flag of pdf annotation\n *\n * @public\n */\nexport enum PdfAnnotationFlags {\n NONE = 0,\n INVISIBLE = 1 << 0,\n HIDDEN = 1 << 1,\n PRINT = 1 << 2,\n NO_ZOOM = 1 << 3,\n NO_ROTATE = 1 << 4,\n NO_VIEW = 1 << 5,\n READ_ONLY = 1 << 6,\n LOCKED = 1 << 7,\n TOGGLE_NOVIEW = 1 << 8,\n}\n\n/**\n * Flag of form field\n *\n * @public\n */\nexport enum PDF_FORM_FIELD_FLAG {\n NONE = 0,\n READONLY = 1 << 0,\n REQUIRED = 1 << 1,\n NOEXPORT = 1 << 2,\n TEXT_MULTIPLINE = 1 << 12,\n TEXT_PASSWORD = 1 << 13,\n CHOICE_COMBO = 1 << 17,\n CHOICE_EDIT = 1 << 18,\n CHOICE_MULTL_SELECT = 1 << 21,\n}\n\n/**\n * Type of pdf object\n *\n * @public\n */\nexport enum PdfPageObjectType {\n UNKNOWN = 0,\n TEXT = 1,\n PATH = 2,\n IMAGE = 3,\n SHADING = 4,\n FORM = 5,\n}\n\n/**\n * Line points\n *\n * @public\n */\nexport interface LinePoints {\n start: Position;\n end: Position;\n}\n\n/**\n * Line endings\n *\n * @public\n */\nexport interface LineEndings {\n start: PdfAnnotationLineEnding;\n end: PdfAnnotationLineEnding;\n}\n\n/**\n * Options of pdf widget annotation\n *\n * @public\n */\nexport interface PdfWidgetAnnoOption {\n label: string;\n isSelected: boolean;\n}\n\nexport type PdfAnnotationFlagName =\n | 'invisible'\n | 'hidden'\n | 'print'\n | 'noZoom'\n | 'noRotate'\n | 'noView'\n | 'readOnly'\n | 'locked'\n | 'toggleNoView';\n\ntype FlagMap = Partial<\n Record<Exclude<PdfAnnotationFlags, PdfAnnotationFlags.NONE>, PdfAnnotationFlagName>\n>;\n\nexport const PdfAnnotationFlagName: Readonly<FlagMap> = Object.freeze({\n [PdfAnnotationFlags.INVISIBLE]: 'invisible',\n [PdfAnnotationFlags.HIDDEN]: 'hidden',\n [PdfAnnotationFlags.PRINT]: 'print',\n [PdfAnnotationFlags.NO_ZOOM]: 'noZoom',\n [PdfAnnotationFlags.NO_ROTATE]: 'noRotate',\n [PdfAnnotationFlags.NO_VIEW]: 'noView',\n [PdfAnnotationFlags.READ_ONLY]: 'readOnly',\n [PdfAnnotationFlags.LOCKED]: 'locked',\n [PdfAnnotationFlags.TOGGLE_NOVIEW]: 'toggleNoView',\n} as const);\n\n/** Build a reverse map once so look-ups are O(1) */\nconst PdfAnnotationFlagValue: Record<PdfAnnotationFlagName, PdfAnnotationFlags> = Object.entries(\n PdfAnnotationFlagName,\n).reduce(\n (acc, [bit, name]) => {\n acc[name as PdfAnnotationFlagName] = Number(bit) as PdfAnnotationFlags;\n return acc;\n },\n {} as Record<PdfAnnotationFlagName, PdfAnnotationFlags>,\n);\n\n/**\n * Convert the raw bit-mask coming from `FPDFAnnot_GetFlags()` into\n * an array of human-readable flag names (“invisible”, “print”…).\n */\nexport function flagsToNames(raw: number): PdfAnnotationFlagName[] {\n return (\n Object.keys(PdfAnnotationFlagName) as unknown as Exclude<\n PdfAnnotationFlags,\n PdfAnnotationFlags.NONE\n >[]\n )\n .filter((flag) => (raw & flag) !== 0)\n .map((flag) => PdfAnnotationFlagName[flag]!);\n}\n\n/**\n * Convert an array of flag-names back into the numeric mask that\n * PDFium expects for `FPDFAnnot_SetFlags()`.\n */\nexport function namesToFlags(names: readonly PdfAnnotationFlagName[]): PdfAnnotationFlags {\n return names.reduce<PdfAnnotationFlags>(\n (mask, name) => mask | PdfAnnotationFlagValue[name],\n PdfAnnotationFlags.NONE,\n );\n}\n\n/**\n * Field of PDF widget annotation\n *\n * @public\n */\nexport interface PdfWidgetAnnoField {\n /**\n * flag of field\n */\n flag: PDF_FORM_FIELD_FLAG;\n /**\n * name of field\n */\n name: string;\n /**\n * alternate name of field\n */\n alternateName: string;\n /**\n * type of field\n */\n type: PDF_FORM_FIELD_TYPE;\n /**\n * value of field\n */\n value: string;\n /**\n * whether field is checked\n */\n isChecked: boolean;\n /**\n * options of field\n */\n options: PdfWidgetAnnoOption[];\n}\n\n/**\n * PDF widget object\n *\n * @public\n */\nexport interface PdfWidgetAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.WIDGET;\n /**\n * Field of pdf widget object\n */\n field: PdfWidgetAnnoField;\n}\n\n/**\n * Pdf file attachments annotation\n *\n * @public\n */\nexport interface PdfFileAttachmentAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.FILEATTACHMENT;\n}\n\n/**\n * ink list in pdf ink annotation\n *\n * @public\n */\nexport interface PdfInkListObject {\n points: Position[];\n}\n\n/**\n * Pdf ink annotation\n *\n * @public\n */\nexport interface PdfInkAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.INK;\n /**\n * ink list of annotation\n */\n inkList: PdfInkListObject[];\n /**\n * color of ink annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n}\n\n/**\n * Pdf polygon annotation\n *\n * @public\n */\nexport interface PdfPolygonAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POLYGON;\n\n /**\n * contents of polygon annotation\n */\n contents?: string;\n\n /**\n * vertices of annotation\n */\n vertices: Position[];\n\n /**\n * color of ink annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of polygon annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of polygon annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of polygon annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF polyline annotation\n *\n * @public\n */\nexport interface PdfPolylineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.POLYLINE;\n\n /**\n * contents of polyline annotation\n */\n contents?: string;\n\n /**\n * start and end line endings of polyline\n */\n lineEndings?: LineEndings;\n\n /**\n * vertices of annotation\n */\n vertices: Position[];\n\n /**\n * interior color of line annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of line annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of polyline annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of polyline annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF line annotation\n *\n * @public\n */\nexport interface PdfLineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.LINE;\n\n /**\n * contents of line annotation\n */\n contents?: string;\n\n /**\n * start and end points of line\n */\n linePoints: LinePoints;\n\n /**\n * start and end line endings of line\n */\n lineEndings?: LineEndings;\n\n /**\n * interior color of line annotation\n */\n color: string;\n\n /**\n * opacity of ink annotation\n */\n opacity: number;\n\n /**\n * stroke-width of ink annotation\n */\n strokeWidth: number;\n\n /**\n * stroke color of line annotation\n */\n strokeColor: string;\n\n /**\n * stroke style of line annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n\n /**\n * stroke dash array of line annotation\n */\n strokeDashArray?: number[];\n}\n\n/**\n * PDF highlight annotation\n *\n * @public\n */\nexport interface PdfHighlightAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.HIGHLIGHT;\n\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n\n /**\n * color of highlight annotation\n */\n color: string;\n\n /**\n * opacity of highlight annotation\n */\n opacity: number;\n\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Matrix for transformation, in the form [a b c d e f], equivalent to:\n * | a b 0 |\n * | c d 0 |\n * | e f 1 |\n *\n * Translation is performed with [1 0 0 1 tx ty].\n * Scaling is performed with [sx 0 0 sy 0 0].\n * See PDF Reference 1.7, 4.2.2 Common Transformations for more.\n */\nexport interface PdfTransformMatrix {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\n/**\n * type of segment type in pdf path object\n *\n * @public\n */\nexport enum PdfSegmentObjectType {\n UNKNOWN = -1,\n LINETO = 0,\n BEZIERTO = 1,\n MOVETO = 2,\n}\n\n/**\n * segment of path object\n *\n * @public\n */\nexport interface PdfSegmentObject {\n type: PdfSegmentObjectType;\n /**\n * point of the segment\n */\n point: Position;\n /**\n * whether this segment close the path\n */\n isClosed: boolean;\n}\n\n/**\n * Pdf path object\n *\n * @public\n */\nexport interface PdfPathObject {\n type: PdfPageObjectType.PATH;\n /**\n * bound that contains the path\n */\n bounds: { left: number; bottom: number; right: number; top: number };\n /**\n * segments of the path\n */\n segments: PdfSegmentObject[];\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Pdf image object\n *\n * @public\n */\nexport interface PdfImageObject {\n type: PdfPageObjectType.IMAGE;\n /**\n * data of the image (cross-platform compatible, works in Node.js and browsers)\n */\n imageData: ImageDataLike;\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Pdf form object\n *\n * @public\n */\nexport interface PdfFormObject {\n type: PdfPageObjectType.FORM;\n /**\n * objects that in this form object\n */\n objects: (PdfImageObject | PdfPathObject | PdfFormObject)[];\n /**\n * transform matrix\n */\n matrix: PdfTransformMatrix;\n}\n\n/**\n * Contents type of pdf stamp annotation\n *\n * @public\n */\nexport type PdfStampAnnoObjectContents = Array<PdfPathObject | PdfImageObject | PdfFormObject>;\n\n/**\n * Pdf stamp annotation\n *\n * @public\n */\nexport interface PdfStampAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.STAMP;\n /**\n * Icon of the stamp annotation\n */\n icon?: PdfAnnotationIcon;\n /**\n * Subject of the stamp annotation\n */\n subject?: string;\n}\n\n/**\n * Pdf circle annotation\n *\n * @public\n */\nexport interface PdfCircleAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.CIRCLE;\n /**\n * flags of circle annotation\n */\n flags: PdfAnnotationFlagName[];\n /**\n * Text contents of the circle annotation\n */\n contents?: string;\n /**\n * color of circle annotation\n */\n color: string;\n /**\n * opacity of circle annotation\n */\n opacity: number;\n /**\n * stroke-width of circle annotation\n */\n strokeWidth: number;\n /**\n * stroke color of circle annotation\n */\n strokeColor: string;\n /**\n * stroke style of circle annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n /**\n * stroke dash array of circle annotation\n */\n strokeDashArray?: number[];\n /**\n * cloudy border intensity of circle annotation\n */\n cloudyBorderIntensity?: number;\n /**\n * cloudy border inset of circle annotation\n */\n cloudyBorderInset?: number[];\n}\n\n/**\n * Pdf square annotation\n *\n * @public\n */\nexport interface PdfSquareAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.SQUARE;\n /**\n * Text contents of the square annotation\n */\n contents?: string;\n /**\n * flags of square annotation\n */\n flags: PdfAnnotationFlagName[];\n /**\n * color of square annotation\n */\n color: string;\n /**\n * opacity of square annotation\n */\n opacity: number;\n /**\n * stroke-width of square annotation\n */\n strokeWidth: number;\n /**\n * stroke color of square annotation\n */\n strokeColor: string;\n /**\n * stroke style of square annotation\n */\n strokeStyle: PdfAnnotationBorderStyle;\n /**\n * stroke dash array of square annotation\n */\n strokeDashArray?: number[];\n /**\n * cloudy border intensity of circle annotation\n */\n cloudyBorderIntensity?: number;\n /**\n * cloudy border inset of circle annotation\n */\n cloudyBorderInset?: number[];\n}\n\n/**\n * Pdf squiggly annotation\n *\n * @public\n */\nexport interface PdfSquigglyAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.SQUIGGLY;\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf underline annotation\n *\n * @public\n */\nexport interface PdfUnderlineAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.UNDERLINE;\n /**\n * Text contents of the highlight annotation\n */\n contents?: string;\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf strike out annotation\n *\n * @public\n */\nexport interface PdfStrikeOutAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.STRIKEOUT;\n /**\n * Text contents of the strike out annotation\n */\n contents?: string;\n\n /**\n * color of strike out annotation\n */\n color: string;\n\n /**\n * opacity of strike out annotation\n */\n opacity: number;\n\n /**\n * quads of highlight area\n */\n segmentRects: Rect[];\n}\n\n/**\n * Pdf caret annotation\n *\n * @public\n */\nexport interface PdfCaretAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.CARET;\n}\n\n/**\n * Pdf free text annotation\n *\n * @public\n */\nexport interface PdfFreeTextAnnoObject extends PdfAnnotationObjectBase {\n /** {@inheritDoc PdfAnnotationObjectBase.type} */\n type: PdfAnnotationSubtype.FREETEXT;\n /**\n * Text contents of the free text annotation\n */\n contents: string;\n /**\n * Font family of the free text annotation\n */\n fontFamily: PdfStandardFont;\n /**\n * Font size of the free text annotation\n */\n fontSize: number;\n /**\n * Font color of the free text annotation\n */\n fontColor: string;\n /**\n * Text alignment of the free text annotation\n */\n textAlign: PdfTextAlignment;\n /**\n * Vertical alignment of the free text annotation\n */\n verticalAlign: PdfVerticalAlignment;\n /**\n * Opacity of the free text annotation\n */\n opacity: number;\n /**\n * Background color of the free text annotation\n */\n backgroundColor?: string;\n /**\n * Default style of the free text annotation\n */\n defaultStyle?: string;\n /**\n * Rich content of the free text annotation\n */\n richContent?: string;\n}\n\n/**\n * All annotation that support\n *\n * @public\n */\nexport type PdfSupportedAnnoObject =\n | PdfInkAnnoObject\n | PdfTextAnnoObject\n | PdfLinkAnnoObject\n | PdfPolygonAnnoObject\n | PdfPolylineAnnoObject\n | PdfHighlightAnnoObject\n | PdfLineAnnoObject\n | PdfWidgetAnnoObject\n | PdfFileAttachmentAnnoObject\n | PdfStampAnnoObject\n | PdfSquareAnnoObject\n | PdfCircleAnnoObject\n | PdfSquigglyAnnoObject\n | PdfUnderlineAnnoObject\n | PdfStrikeOutAnnoObject\n | PdfCaretAnnoObject\n | PdfFreeTextAnnoObject;\n\n/**\n * Pdf annotation that does not support\n *\n * @public\n */\nexport interface PdfUnsupportedAnnoObject extends PdfAnnotationObjectBase {\n type: Exclude<PdfAnnotationSubtype, PdfSupportedAnnoObject['type']>;\n}\n\n/**\n * all annotations\n *\n * @public\n */\nexport type PdfAnnotationObject = PdfSupportedAnnoObject | PdfUnsupportedAnnoObject;\n\n/**\n * Pdf attachment\n *\n * @public\n */\nexport interface PdfAttachmentObject {\n index: number;\n name: string;\n description: string;\n mimeType: string;\n size?: number;\n creationDate?: Date;\n checksum: string;\n}\n\n/**\n * Pdf engine features\n *\n * @public\n */\nexport enum PdfEngineFeature {\n RenderPage,\n RenderPageRect,\n Thumbnails,\n Bookmarks,\n Annotations,\n}\n\n/**\n * All operations for this engine\n *\n * @public\n */\nexport enum PdfEngineOperation {\n Create,\n Read,\n Update,\n Delete,\n}\n\n/**\n * flags to match the text during searching\n *\n * @public\n */\nexport enum MatchFlag {\n None = 0,\n MatchCase = 1,\n MatchWholeWord = 2,\n MatchConsecutive = 4,\n}\n\n/**\n * Union all the flags\n * @param flags - all the flags\n * @returns union of flags\n *\n * @public\n */\nexport function unionFlags(flags: MatchFlag[]) {\n return flags.reduce((flag, currFlag) => {\n return flag | currFlag;\n }, MatchFlag.None);\n}\n\n/**\n * Image conversion types\n *\n * @public\n */\nexport type ImageConversionTypes = 'image/webp' | 'image/png' | 'image/jpeg';\n\n/**\n * Targe for searching\n *\n * @public\n */\nexport interface SearchTarget {\n keyword: string;\n flags: MatchFlag[];\n}\n\n/**\n * compare 2 search target\n * @param targetA - first target for search\n * @param targetB - second target for search\n * @returns whether 2 search target are the same\n *\n * @public\n */\nexport function compareSearchTarget(targetA: SearchTarget, targetB: SearchTarget) {\n const flagA = unionFlags(targetA.flags);\n const flagB = unionFlags(targetB.flags);\n\n return flagA === flagB && targetA.keyword === targetB.keyword;\n}\n\n/** Context of one hit */\nexport interface TextContext {\n /** Complete words that come *before* the hit (no ellipsis) */\n before: string;\n /** Exactly the text that matched (case-preserved) */\n match: string;\n /** Complete words that come *after* the hit (no ellipsis) */\n after: string;\n /** `true` ⇢ there were more words on the left that we cut off */\n truncatedLeft: boolean;\n /** `true` ⇢ there were more words on the right that we cut off */\n truncatedRight: boolean;\n}\n\n/**\n * Text slice\n *\n * @public\n */\nexport interface PageTextSlice {\n /**\n * Index of the pdf page\n */\n pageIndex: number;\n /**\n * Index of the first character\n */\n charIndex: number;\n /**\n * Count of the characters\n */\n charCount: number;\n}\n\n/**\n * search result\n *\n * @public\n */\nexport interface SearchResult {\n /**\n * Index of the pdf page\n */\n pageIndex: number;\n /**\n * index of the first character\n */\n charIndex: number;\n /**\n * count of the characters\n */\n charCount: number;\n /**\n * highlight rects\n */\n rects: Rect[];\n /**\n * context of the hit\n */\n context: TextContext;\n}\n\n/**\n * Results of searching through the entire document\n */\nexport interface SearchAllPagesResult {\n /**\n * Array of all search results across all pages\n */\n results: SearchResult[];\n\n /**\n * Total number of results found\n */\n total: number;\n}\n\n/**\n * Glyph object\n *\n * @public\n */\nexport interface PdfGlyphObject {\n /**\n * Origin of the glyph\n */\n origin: { x: number; y: number };\n /**\n * Size of the glyph\n */\n size: { width: number; height: number };\n /**\n * Whether the glyph is a space\n */\n isSpace?: boolean;\n /**\n * Whether the glyph is a empty\n */\n isEmpty?: boolean;\n}\n\n/**\n * Glyph object\n *\n * @public\n */\nexport interface PdfGlyphSlim {\n /**\n * X coordinate of the glyph\n */\n x: number;\n /**\n * Y coordinate of the glyph\n */\n y: number;\n /**\n * Width of the glyph\n */\n width: number;\n /**\n * Height of the glyph\n */\n height: number;\n /**\n * Flags of the glyph\n */\n flags: number;\n}\n\n/**\n * Run object\n *\n * @public\n */\nexport interface PdfRun {\n /**\n * Rectangle of the run\n */\n rect: { x: number; y: number; width: number; height: number };\n /**\n * Start index of the run\n */\n charStart: number;\n /**\n * Glyphs of the run\n */\n glyphs: PdfGlyphSlim[];\n}\n\n/**\n * Page geometry\n *\n * @public\n */\nexport interface PdfPageGeometry {\n /**\n * Runs of the page\n */\n runs: PdfRun[];\n}\n\n/**\n * form field value\n * @public\n */\nexport type FormFieldValue =\n | { kind: 'text'; text: string }\n | { kind: 'selection'; index: number; isSelected: boolean }\n | { kind: 'checked'; isChecked: boolean };\n\n/**\n * Transformation that will be applied to annotation\n *\n * @public\n */\nexport interface PdfAnnotationTransformation {\n /**\n * Translated offset\n */\n offset: Position;\n /**\n * Scaled factors\n */\n scale: Size;\n}\n\n/**\n * source can be byte array contains pdf content\n *\n * @public\n */\nexport type PdfFileContent = ArrayBuffer;\n\nexport enum PdfPermission {\n PrintDocument = 2 ** 3,\n ModifyContent = 2 ** 4,\n CopyOrExtract = 2 ** 5,\n AddOrModifyTextAnnot = 2 ** 6,\n FillInExistingForm = 2 ** 9,\n ExtractTextOrGraphics = 2 ** 10,\n AssembleDocument = 2 ** 11,\n PrintHighQuality = 2 ** 12,\n}\n\nexport enum PdfPageFlattenFlag {\n Display = 0,\n Print = 1,\n}\n\nexport enum PdfPageFlattenResult {\n Fail = 0,\n Success = 1,\n NothingToDo = 2,\n}\n\n/**\n * Pdf File without content\n *\n * @public\n */\nexport interface PdfFileWithoutContent {\n /**\n * id of file\n */\n id: string;\n}\n\nexport interface PdfFileLoader extends PdfFileWithoutContent {\n /**\n * length of file\n */\n fileLength: number;\n /**\n * read block of file\n * @param offset - offset of file\n * @param length - length of file\n * @returns block of file\n */\n callback: (offset: number, length: number) => Uint8Array;\n}\n\nexport interface PdfAnnotationsProgress {\n page: number;\n result: PdfAnnotationObject[];\n}\n\n/**\n * Progress of search all pages\n *\n * @public\n */\nexport type PdfPageSearchProgress = { page: number; results: SearchResult[] };\n\n/**\n * Pdf File\n *\n * @public\n */\nexport interface PdfFile extends PdfFileWithoutContent {\n /**\n * content of file\n */\n content: PdfFileContent;\n}\n\nexport interface PdfFileUrl extends PdfFileWithoutContent {\n url: string;\n}\n\nexport enum PdfErrorCode {\n // ═══════════════════════════════════════════════════════\n // PDFium Error Codes (MUST NOT CHANGE ORDER - maps to C defines)\n // ═══════════════════════════════════════════════════════\n Ok = 0, // #define FPDF_ERR_SUCCESS 0\n Unknown = 1, // #define FPDF_ERR_UNKNOWN 1\n NotFound = 2, // #define FPDF_ERR_FILE 2\n WrongFormat = 3, // #define FPDF_ERR_FORMAT 3\n Password = 4, // #define FPDF_ERR_PASSWORD 4 - Password required or incorrect\n Security = 5, // #define FPDF_ERR_SECURITY 5\n PageError = 6, // #define FPDF_ERR_PAGE 6\n XFALoad = 7, // #define FPDF_ERR_XFALOAD 7\n XFALayout = 8, // #define FPDF_ERR_XFALAYOUT 8\n\n // ═══════════════════════════════════════════════════════\n // Custom Error Codes (Can add/modify freely)\n // ═══════════════════════════════════════════════════════\n Cancelled = 9,\n Initialization = 10,\n NotReady = 11,\n NotSupport = 12,\n LoadDoc = 13,\n DocNotOpen = 14,\n CantCloseDoc = 15,\n CantCreateNewDoc = 16,\n CantImportPages = 17,\n CantCreateAnnot = 18,\n CantSetAnnotRect = 19,\n CantSetAnnotContent = 20,\n CantRemoveInkList = 21,\n CantAddInkStoke = 22,\n CantReadAttachmentSize = 23,\n CantReadAttachmentContent = 24,\n CantFocusAnnot = 25,\n CantSelectText = 26,\n CantSelectOption = 27,\n CantCheckField = 28,\n CantSetAnnotString = 29,\n}\n\nexport interface PdfErrorReason {\n code: PdfErrorCode;\n message: string;\n}\n\nexport type PdfEngineError = TaskError<PdfErrorReason>;\n\nexport type PdfTask<R, P = unknown> = Task<R, PdfErrorReason, P>;\n\nexport class PdfTaskHelper {\n /**\n * Create a task\n * @returns new task\n */\n static create<R, P = unknown>(): Task<R, PdfErrorReason, P> {\n return new Task<R, PdfErrorReason, P>();\n }\n\n /**\n * Create a task that has been resolved with value\n * @param result - resolved value\n * @returns resolved task\n */\n static resolve<R, P = unknown>(result: R): Task<R, PdfErrorReason, P> {\n const task = new Task<R, PdfErrorReason, P>();\n task.resolve(result);\n\n return task;\n }\n\n /**\n * Create a task that has been rejected with error\n * @param reason - rejected error\n * @returns rejected task\n */\n static reject<T = any, P = unknown>(reason: PdfErrorReason): Task<T, PdfErrorReason, P> {\n const task = new Task<T, PdfErrorReason, P>();\n task.reject(reason);\n\n return task;\n }\n\n /**\n * Create a task that has been aborted with error\n * @param reason - aborted error\n * @returns aborted task\n */\n static abort<T = any, P = unknown>(reason: PdfErrorReason): Task<T, PdfErrorReason, P> {\n const task = new Task<T, PdfErrorReason, P>();\n task.reject(reason);\n\n return task;\n }\n}\n\nexport interface PdfOpenDocumentBufferOptions {\n /**\n * Password for the document\n */\n password?: string;\n}\n\nexport interface PdfRequestOptions {\n /**\n * Custom HTTP headers to include in all requests (HEAD, GET, range requests)\n * Example: { 'Authorization': 'Bearer token', 'X-Custom-Header': 'value' }\n */\n headers?: Record<string, string>;\n /**\n * Controls whether cookies are sent with requests\n * - 'omit': Never send cookies (default)\n * - 'same-origin': Send cookies for same-origin requests\n * - 'include': Always send cookies (requires CORS)\n */\n credentials?: RequestCredentials;\n}\n\nexport interface PdfOpenDocumentUrlOptions {\n /**\n * Password for the document\n */\n password?: string;\n /**\n * Loading mode\n */\n mode?: 'auto' | 'range-request' | 'full-fetch';\n /**\n * HTTP request options for fetching the PDF\n */\n requestOptions?: PdfRequestOptions;\n}\n\nexport interface PdfRenderOptions {\n /**\n * Scale factor\n */\n scaleFactor?: number;\n /**\n * Rotation\n */\n rotation?: Rotation;\n /**\n * Device pixel ratio\n */\n dpr?: number;\n /**\n * Image type\n */\n imageType?: ImageConversionTypes;\n /**\n * Image quality (0-1) for jpeg and png\n */\n imageQuality?: number;\n}\n\nexport interface ConvertToBlobOptions {\n /**\n * Image type\n */\n type: ImageConversionTypes;\n /**\n * Image quality (0-1) for webp and jpeg and png\n */\n quality?: number;\n}\n\nexport interface PdfRenderPageOptions extends PdfRenderOptions {\n /**\n * Whether to render annotations\n */\n withAnnotations?: boolean;\n /**\n * Whether to render interactive form widgets\n */\n withForms?: boolean;\n}\n\nexport interface PdfRenderPageAnnotationOptions extends PdfRenderOptions {\n /**\n * Appearance mode normal down or rollover\n */\n mode?: AppearanceMode;\n}\n\nexport interface PdfRenderThumbnailOptions extends PdfRenderOptions {\n /**\n * Whether to render annotations\n */\n withAnnotations?: boolean;\n}\n\nexport interface PdfSearchAllPagesOptions {\n /**\n * Search flags\n */\n flags?: MatchFlag[];\n}\n\nexport interface PdfRedactTextOptions {\n /**\n * Whether to recurse forms\n */\n recurseForms?: boolean;\n /**\n * Whether to draw black boxes\n */\n drawBlackBoxes?: boolean;\n}\n\nexport interface PdfFlattenPageOptions {\n /**\n * Flatten flag\n */\n flag?: PdfPageFlattenFlag;\n}\n\n/**\n * Options for preparing a PDF document for printing\n */\nexport interface PdfPrintOptions {\n /**\n * Whether to include annotations in the printed document\n * @default true\n */\n includeAnnotations?: boolean;\n\n /**\n * Page range string defining which pages to include\n * Examples: \"1,3,5-7\" or \"1-10,15,20-25\"\n * If not specified, all pages are included\n * @default null (all pages)\n */\n pageRange?: string;\n}\n\n/**\n * Parameters for adding an attachment to a PDF document\n */\nexport interface PdfAddAttachmentParams {\n /**\n * Name of the attachment\n */\n name: string;\n /**\n * Description of the attachment\n */\n description: string;\n /**\n * MIME type of the attachment\n */\n mimeType: string;\n /**\n * Data of the attachment\n */\n data: ArrayBuffer | Uint8Array;\n}\n\n/**\n * Pdf engine\n *\n * @public\n */\nexport interface PdfEngine<T = Blob> {\n /**\n * Check whether pdf engine supports this feature\n * @param feature - which feature want to check\n * @returns support or not\n */\n isSupport?: (feature: PdfEngineFeature) => PdfTask<PdfEngineOperation[]>;\n /**\n * Destroy the engine\n * @returns task that indicate whether destroy is successful\n */\n destroy?: () => PdfTask<boolean>;\n /**\n * Open a PDF from a URL with specified mode\n * @param url - The PDF file URL\n * @param options - Additional options including mode (auto, range-request, full-fetch) and password\n * @returns Task that resolves with the PdfDocumentObject or an error\n */\n openDocumentUrl: (\n file: PdfFileUrl,\n options?: PdfOpenDocumentUrlOptions,\n ) => PdfTask<PdfDocumentObject>;\n /**\n * Open pdf document from buffer\n * @param file - pdf file\n * @param options - Additional options including password\n * @returns task that contains the file or error\n */\n openDocumentBuffer: (\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ) => PdfTask<PdfDocumentObject>;\n /**\n * Get the metadata of the file\n * @param doc - pdf document\n * @returns task that contains the metadata or error\n */\n getMetadata: (doc: PdfDocumentObject) => PdfTask<PdfMetadataObject>;\n /**\n * Set the metadata of the file\n * @param doc - pdf document\n * @param metadata - metadata to set\n * @returns task that contains the metadata or error\n */\n setMetadata: (doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>) => PdfTask<boolean>;\n /**\n * Get permissions of the file\n * @param doc - pdf document\n * @returns task that contains a 32-bit integer indicating permission flags\n */\n getDocPermissions: (doc: PdfDocumentObject) => PdfTask<number>;\n /**\n * Get the user permissions of the file\n * @param doc - pdf document\n * @returns task that contains a 32-bit integer indicating permission flags\n */\n getDocUserPermissions: (doc: PdfDocumentObject) => PdfTask<number>;\n /**\n * Get the signatures of the file\n * @param doc - pdf document\n * @returns task that contains the signatures or error\n */\n getSignatures: (doc: PdfDocumentObject) => PdfTask<PdfSignatureObject[]>;\n /**\n * Get the bookmarks of the file\n * @param doc - pdf document\n * @returns task that contains the bookmarks or error\n */\n getBookmarks: (doc: PdfDocumentObject) => PdfTask<PdfBookmarksObject>;\n /**\n * Set the bookmarks of the file\n * @param doc - pdf document\n * @param payload - bookmarks to set\n * @returns task that contains whether the bookmarks are set successfully or not\n */\n setBookmarks: (doc: PdfDocumentObject, payload: PdfBookmarkObject[]) => PdfTask<boolean>;\n /**\n * Remove all bookmarks from the document.\n * @param doc - pdf document\n * @returns task that contains whether the bookmarks are removed successfully or not\n */\n deleteBookmarks: (doc: PdfDocumentObject) => PdfTask<boolean>;\n /**\n * Render the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderPage: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ) => PdfTask<T>;\n /**\n * Render the specified rect of pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param rect - target rect\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderPageRect: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ) => PdfTask<T>;\n /**\n * Render the thumbnail of specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - render options\n * @returns task contains the rendered image or error\n */\n renderThumbnail: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ) => PdfTask<T>;\n /**\n * Render a single annotation into an ImageData blob.\n *\n * Note: • honours Display-Matrix, page rotation & DPR\n * • you decide whether to include the page background\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - the annotation to render\n * @param options - render options\n */\n renderPageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<T>;\n /**\n * Get annotations of pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the annotations or error\n */\n getPageAnnotations: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ) => PdfTask<PdfAnnotationObject[]>;\n /**\n * Create a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @param context - context of the annotation\n * @returns task whether the annotations is created successfully\n */\n createPageAnnotation: <A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ) => PdfTask<string>;\n /**\n * Update a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @returns task that indicates whether the operation succeeded\n */\n updatePageAnnotation: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ) => PdfTask<boolean>;\n /**\n * Remove a annotation on specified page\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - new annotations\n * @returns task whether the annotations is removed successfully\n */\n removePageAnnotation: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ) => PdfTask<boolean>;\n /**\n * get all text rects in pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - get page text rects options\n * @returns task contains the text rects or error\n */\n getPageTextRects: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfTextRectObject[]>;\n /**\n * Search across all pages in the document\n * @param doc - pdf document\n * @param keyword - search keyword\n * @param options - search all pages options\n * @returns Task contains all search results throughout the document\n */\n searchAllPages: (\n doc: PdfDocumentObject,\n keyword: string,\n options?: PdfSearchAllPagesOptions,\n ) => PdfTask<SearchAllPagesResult, PdfPageSearchProgress>;\n /**\n * Get all annotations in this file\n * @param doc - pdf document\n * @returns task that contains the annotations or error\n */\n getAllAnnotations: (\n doc: PdfDocumentObject,\n ) => PdfTask<Record<number, PdfAnnotationObject[]>, PdfAnnotationsProgress>;\n /**\n * Get all attachments in this file\n * @param doc - pdf document\n * @returns task that contains the attachments or error\n */\n getAttachments: (doc: PdfDocumentObject) => PdfTask<PdfAttachmentObject[]>;\n /**\n * Add a attachment to the file\n /**\n * @param doc - pdf document\n * @param attachment - pdf attachment\n * @returns task that contains the attachment or error\n */\n addAttachment: (doc: PdfDocumentObject, params: PdfAddAttachmentParams) => PdfTask<boolean>;\n /**\n * Remove a attachment from the file\n /**\n * @param doc - pdf document\n * @param attachment - pdf attachment\n * @returns task that contains the attachment or error\n */\n removeAttachment: (doc: PdfDocumentObject, attachment: PdfAttachmentObject) => PdfTask<boolean>;\n /**\n * Read content of pdf attachment\n * @param doc - pdf document\n * @param attachment - pdf attachments\n * @returns task that contains the content of specified attachment or error\n */\n readAttachmentContent: (\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ) => PdfTask<ArrayBuffer>;\n /**\n * Set form field value\n * @param doc - pdf document\n * @param page - pdf page\n * @param annotation - pdf annotation\n * @param text - text value\n */\n setFormFieldValue: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ) => PdfTask<boolean>;\n /**\n * Flatten annotations and form fields into the page contents.\n * @param doc - pdf document\n * @param page - pdf page\n * @param options - flatten page options\n */\n flattenPage: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ) => PdfTask<PdfPageFlattenResult>;\n /**\n * Extract pdf pages to a new file\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the new pdf file content\n */\n extractPages: (doc: PdfDocumentObject, pageIndexes: number[]) => PdfTask<ArrayBuffer>;\n /**\n * Extract text on specified pdf pages\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the text\n */\n extractText: (doc: PdfDocumentObject, pageIndexes: number[]) => PdfTask<string>;\n /**\n * Redact text by run slices\n * @param doc - pdf document\n * @param page - pdf page\n * @param rects - rects to redact\n * @param options - redact text options\n * @returns task contains the result\n */\n redactTextInRects: (\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ) => PdfTask<boolean>;\n /**\n * Extract text on specified pdf pages\n * @param doc - pdf document\n * @param pageIndexes - indexes of pdf pages\n * @returns task contains the text\n */\n getTextSlices: (doc: PdfDocumentObject, slices: PageTextSlice[]) => PdfTask<string[]>;\n /**\n * Get all glyphs in the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the glyphs\n */\n getPageGlyphs: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfGlyphObject[]>;\n /**\n * Get the geometry of the specified pdf page\n * @param doc - pdf document\n * @param page - pdf page\n * @returns task contains the geometry\n */\n getPageGeometry: (doc: PdfDocumentObject, page: PdfPageObject) => PdfTask<PdfPageGeometry>;\n /**\n * Merge multiple pdf documents\n * @param files - all the pdf files\n * @returns task contains the merged pdf file\n */\n merge: (files: PdfFile[]) => PdfTask<PdfFile>;\n /**\n * Merge specific pages from multiple PDF documents in a custom order\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[] }>) => PdfTask<PdfFile>;\n /**\n * Prepare a PDF document for printing\n * @param doc - pdf document\n * @param options - options for preparing the document for printing\n * @returns task contains the prepared pdf file content\n */\n preparePrintDocument: (doc: PdfDocumentObject, options?: PdfPrintOptions) => PdfTask<ArrayBuffer>;\n /**\n * Save a copy of pdf document\n * @param doc - pdf document\n * @returns task contains the new pdf file content\n */\n saveAsCopy: (doc: PdfDocumentObject) => PdfTask<ArrayBuffer>;\n /**\n * Close pdf document\n * @param doc - pdf document\n * @returns task that file is closed or not\n */\n closeDocument: (doc: PdfDocumentObject) => PdfTask<boolean>;\n /**\n * Close all documents\n * @returns task that all documents are closed or not\n */\n closeAllDocuments: () => PdfTask<boolean>;\n}\n\n/**\n * Method name of PdfEngine interface\n *\n * @public\n */\nexport type PdfEngineMethodName = keyof Required<PdfEngine>;\n\n/**\n * Progress info for batch operations\n * Emitted per-page as the batch is processed\n *\n * @public\n */\nexport interface BatchProgress<T> {\n /** Index of the page that was just processed */\n pageIndex: number;\n /** Result for this page */\n result: T;\n /** Number of pages completed so far */\n completed: number;\n /** Total number of pages in this batch */\n total: number;\n}\n\n/**\n * Executor interface for PDFium implementations.\n * Can be either PdfiumNative (direct) or RemoteExecutor (worker proxy).\n *\n * @public\n */\nexport interface IPdfiumExecutor {\n // Core operations\n destroy(): void;\n openDocumentBuffer(\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ): PdfTask<PdfDocumentObject>;\n getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject>;\n setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean>;\n getDocPermissions(doc: PdfDocumentObject): PdfTask<number>;\n getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number>;\n getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]>;\n getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject>;\n setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean>;\n deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean>;\n\n // Raw rendering (returns ImageDataLike, not Blob)\n renderPageRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike>;\n renderPageRect(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike>;\n renderThumbnailRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ): PdfTask<ImageDataLike>;\n renderPageAnnotationRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<ImageDataLike>;\n\n // Single page operations\n getPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfAnnotationObject[]>;\n getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;\n createPageAnnotation<A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ): PdfTask<string>;\n updatePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean>;\n removePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean>;\n getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]>;\n\n // Single page search\n searchInPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n keyword: string,\n flags: number,\n ): PdfTask<SearchResult[]>;\n\n // Batch operations (process multiple pages in one call for performance)\n getAnnotationsBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n ): PdfTask<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>>;\n\n searchBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n keyword: string,\n flags: number,\n ): PdfTask<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>>;\n\n // Other operations\n getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]>;\n addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean>;\n removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean>;\n readAttachmentContent(\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ): PdfTask<ArrayBuffer>;\n setFormFieldValue(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ): PdfTask<boolean>;\n flattenPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ): PdfTask<PdfPageFlattenResult>;\n extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer>;\n extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string>;\n redactTextInRects(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ): PdfTask<boolean>;\n getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]>;\n getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]>;\n getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry>;\n merge(files: PdfFile[]): PdfTask<PdfFile>;\n mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile>;\n preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer>;\n saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer>;\n closeDocument(doc: PdfDocumentObject): PdfTask<boolean>;\n closeAllDocuments(): PdfTask<boolean>;\n}\n\n/**\n * Arguments of PdfEngine method\n *\n * @public\n */\nexport type PdfEngineMethodArgs<P extends PdfEngineMethodName> = Readonly<\n Parameters<Required<PdfEngine>[P]>\n>;\n\n/**\n * Return type of PdfEngine method\n *\n * @public\n */\nexport type PdfEngineMethodReturnType<P extends PdfEngineMethodName> = ReturnType<\n Required<PdfEngine>[P]\n>;\n","import { PdfAlphaColor, PdfColor } from './pdf';\n\n/**\n * Web color as hex string (no opacity)\n */\nexport type WebColor = string;\n\n// === Alpha-aware types (existing) ===\n\nexport interface WebAlphaColor {\n color: string;\n opacity: number;\n}\n\n// === Color-only conversion functions ===\n\n/**\n * Convert a {@link PdfColor} to a CSS hex color string.\n *\n * @param c - the RGB color from PDFium (0-255 per channel)\n * @returns hex color string in format #RRGGBB\n */\nexport function pdfColorToWebColor(c: PdfColor): WebColor {\n const clamp = (n: number) => Math.max(0, Math.min(255, n));\n const toHex = (n: number) => clamp(n).toString(16).padStart(2, '0');\n\n return `#${toHex(c.red)}${toHex(c.green)}${toHex(c.blue)}`;\n}\n\n/**\n * Convert a CSS hex color back to {@link PdfColor}\n *\n * @param color - #RGB, #RRGGBB, or #rrggbb\n */\nexport function webColorToPdfColor(color: WebColor): PdfColor {\n // Normalise: #abc → #aabbcc\n if (/^#?[0-9a-f]{3}$/i.test(color)) {\n color = color.replace(/^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i, '#$1$1$2$2$3$3').toLowerCase();\n }\n\n const [, r, g, b] =\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color) ??\n (() => {\n throw new Error(`Invalid hex colour: \"${color}\"`);\n })();\n\n return {\n red: parseInt(r, 16),\n green: parseInt(g, 16),\n blue: parseInt(b, 16),\n };\n}\n\n// === Alpha utility functions ===\n\n/**\n * Convert PDF alpha (0-255) to web opacity (0-1)\n */\nexport function pdfAlphaToWebOpacity(alpha: number): number {\n const clamp = (n: number) => Math.max(0, Math.min(255, n));\n return clamp(alpha) / 255;\n}\n\n/**\n * Convert web opacity (0-1) to PDF alpha (0-255)\n */\nexport function webOpacityToPdfAlpha(opacity: number): number {\n const clamp = (n: number, hi = 255) => Math.max(0, Math.min(hi, n));\n return clamp(Math.round(opacity * 255));\n}\n\n/**\n * Extract color part from {@link PdfAlphaColor}\n */\nexport function extractPdfColor(c: PdfAlphaColor): PdfColor {\n return { red: c.red, green: c.green, blue: c.blue };\n}\n\n/**\n * Extract alpha from {@link PdfAlphaColor} as web opacity\n */\nexport function extractWebOpacity(c: PdfAlphaColor): number {\n return pdfAlphaToWebOpacity(c.alpha);\n}\n\n/**\n * Combine {@link PdfColor} and alpha to create {@link PdfAlphaColor}\n */\nexport function combinePdfColorWithAlpha(color: PdfColor, alpha: number): PdfAlphaColor {\n return { ...color, alpha };\n}\n\n/**\n * Combine {@link WebColor} and opacity to create {@link WebAlphaColor}\n */\nexport function combineWebColorWithOpacity(color: WebColor, opacity: number): WebAlphaColor {\n return { color, opacity };\n}\n\n// === Existing alpha-aware functions (kept for backward compatibility) ===\n\n/**\n * Convert a {@link PdfAlphaColor} to a CSS-style colour definition.\n *\n * @param c - the colour coming from PDFium (0-255 per channel)\n * @returns\n * hex – #RRGGBB (no alpha channel)\n * opacity – 0-1 float suitable for CSS `opacity`/`rgba()`\n */\nexport function pdfAlphaColorToWebAlphaColor(c: PdfAlphaColor): WebAlphaColor {\n const color = pdfColorToWebColor(extractPdfColor(c));\n const opacity = extractWebOpacity(c);\n return { color, opacity };\n}\n\n/**\n * Convert a CSS hex colour + opacity back into {@link PdfAlphaColor}\n *\n * @param hex - #RGB, #RRGGBB, or #rrggbb\n * @param opacity - 0-1 float (values outside clamp automatically)\n */\nexport function webAlphaColorToPdfAlphaColor({ color, opacity }: WebAlphaColor): PdfAlphaColor {\n const pdfColor = webColorToPdfColor(color);\n const alpha = webOpacityToPdfAlpha(opacity);\n return combinePdfColorWithAlpha(pdfColor, alpha);\n}\n","/**\n * Parse a PDF date string **D:YYYYMMDDHHmmSSOHH'mm'** to ISO-8601.\n *\n * Returns `undefined` if the input is malformed.\n *\n * @public\n */\nexport function pdfDateToDate(pdf?: string): Date | undefined {\n if (!pdf?.startsWith('D:') || pdf.length < 16) return;\n\n const y = +pdf.slice(2, 6);\n const mo = +pdf.slice(6, 8) - 1; // JS months: 0-based\n const d = +pdf.slice(8, 10);\n const H = +pdf.slice(10, 12);\n const M = +pdf.slice(12, 14);\n const S = +pdf.slice(14, 16);\n\n return new Date(Date.UTC(y, mo, d, H, M, S));\n}\n\n/**\n * Convert a date to a PDF date string\n * @param date - date to convert\n * @returns PDF date string\n *\n * @public\n */\nexport function dateToPdfDate(date: Date = new Date()): string {\n const z = (n: number, len = 2) => n.toString().padStart(len, '0');\n\n const YYYY = date.getUTCFullYear();\n const MM = z(date.getUTCMonth() + 1);\n const DD = z(date.getUTCDate());\n const HH = z(date.getUTCHours());\n const mm = z(date.getUTCMinutes());\n const SS = z(date.getUTCSeconds());\n\n return `D:${YYYY}${MM}${DD}${HH}${mm}${SS}`;\n}\n","import { PdfTextAlignment } from '../pdf';\n\n/** Extra UI sentinel for “mixed values”. */\nexport const MixedTextAlignment = Symbol('mixed');\nexport type UiTextAlignmentValue = PdfTextAlignment | typeof MixedTextAlignment;\n\nexport type CssTextAlign = 'left' | 'center' | 'right';\n\ninterface TextAlignmentInfo {\n id: PdfTextAlignment;\n label: string;\n css: CssTextAlign;\n}\n\nconst TEXT_ALIGNMENT_INFOS: readonly TextAlignmentInfo[] = Object.freeze([\n { id: PdfTextAlignment.Left, label: 'Left', css: 'left' },\n { id: PdfTextAlignment.Center, label: 'Center', css: 'center' },\n { id: PdfTextAlignment.Right, label: 'Right', css: 'right' },\n]);\n\n/* Build O(1) maps */\nconst enumToTextInfo: Record<PdfTextAlignment, TextAlignmentInfo> = TEXT_ALIGNMENT_INFOS.reduce(\n (m, info) => {\n m[info.id] = info;\n return m;\n },\n {} as Record<PdfTextAlignment, TextAlignmentInfo>,\n);\n\nconst cssToTextEnum = TEXT_ALIGNMENT_INFOS.reduce<Record<CssTextAlign, PdfTextAlignment>>(\n (m, info) => {\n m[info.css] = info.id;\n return m;\n },\n {} as Record<CssTextAlign, PdfTextAlignment>,\n);\n\n/** Get descriptor (falls back to Left if unknown). */\nexport function getTextAlignmentInfo(alignment: PdfTextAlignment): TextAlignmentInfo {\n return enumToTextInfo[alignment] ?? enumToTextInfo[PdfTextAlignment.Left];\n}\n\nexport function textAlignmentToCss(alignment: PdfTextAlignment): CssTextAlign {\n return getTextAlignmentInfo(alignment).css;\n}\n\nexport function cssToTextAlignment(value: CssTextAlign): PdfTextAlignment | undefined {\n return cssToTextEnum[value];\n}\n\nexport function textAlignmentLabel(alignment: PdfTextAlignment): string {\n return getTextAlignmentInfo(alignment).label;\n}\n\nexport function reduceTextAlignments(values: readonly PdfTextAlignment[]): UiTextAlignmentValue {\n if (!values.length) return PdfTextAlignment.Left;\n const first = values[0];\n return values.every((a) => a === first) ? first : MixedTextAlignment;\n}\n\nexport const textAlignmentSelectOptions = TEXT_ALIGNMENT_INFOS.map((info) => ({\n value: info.id,\n label: info.label,\n}));\n","// ────────────────────────────────────────────────────────────────────────────\n// 🅰 Font Families & style flags\n// ────────────────────────────────────────────────────────────────────────────\n\nimport { PdfStandardFont } from '../pdf';\n\n/**\n * Logical families of the 14 “Standard PDF” fonts.\n */\nexport enum PdfStandardFontFamily {\n Courier = 'Courier',\n Helvetica = 'Helvetica',\n Times = 'Times',\n Symbol = 'Symbol',\n ZapfDingbats = 'ZapfDingbats',\n Unknown = 'Unknown',\n}\n\nconst DEFAULT_FALLBACK_FONT = PdfStandardFont.Helvetica;\n\n/** UI sentinel when multiple different fonts are selected at once. */\nexport const MixedStandardFont = Symbol('mixed');\nexport type UiStandardFontValue = PdfStandardFont | typeof MixedStandardFont;\n\ninterface StandardFontDescriptor {\n /** Enum value as returned by PDFium. */\n id: PdfStandardFont;\n /** Logical family (for the left dropdown). */\n family: PdfStandardFontFamily;\n /** `true` ⇢ weight ≥ 700. */\n bold: boolean;\n /** `true` ⇢ italic / oblique. */\n italic: boolean;\n /** Human-readable label (“Helvetica Bold”). */\n label: string;\n /** CSS `font-family` fallback list. */\n css: string;\n}\n\nconst HELVETICA_DESC: StandardFontDescriptor = {\n id: PdfStandardFont.Helvetica,\n family: PdfStandardFontFamily.Helvetica,\n bold: false,\n italic: false,\n label: 'Helvetica',\n css: 'Helvetica, Arial, sans-serif',\n} as const;\n\n/* Canonical table – order follows enum values */\nconst STANDARD_FONT_DESCRIPTORS: readonly StandardFontDescriptor[] = Object.freeze([\n {\n id: PdfStandardFont.Courier,\n family: PdfStandardFontFamily.Courier,\n bold: false,\n italic: false,\n label: 'Courier',\n css: 'Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_Bold,\n family: PdfStandardFontFamily.Courier,\n bold: true,\n italic: false,\n label: 'Courier Bold',\n css: '\"Courier-Bold\", Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_BoldOblique,\n family: PdfStandardFontFamily.Courier,\n bold: true,\n italic: true,\n label: 'Courier Bold Oblique',\n css: '\"Courier-BoldOblique\", Courier, monospace',\n },\n {\n id: PdfStandardFont.Courier_Oblique,\n family: PdfStandardFontFamily.Courier,\n bold: false,\n italic: true,\n label: 'Courier Oblique',\n css: '\"Courier-Oblique\", Courier, monospace',\n },\n HELVETICA_DESC,\n {\n id: PdfStandardFont.Helvetica_Bold,\n family: PdfStandardFontFamily.Helvetica,\n bold: true,\n italic: false,\n label: 'Helvetica Bold',\n css: '\"Helvetica-Bold\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Helvetica_BoldOblique,\n family: PdfStandardFontFamily.Helvetica,\n bold: true,\n italic: true,\n label: 'Helvetica Bold Oblique',\n css: '\"Helvetica-BoldOblique\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Helvetica_Oblique,\n family: PdfStandardFontFamily.Helvetica,\n bold: false,\n italic: true,\n label: 'Helvetica Oblique',\n css: '\"Helvetica-Oblique\", Arial, sans-serif',\n },\n {\n id: PdfStandardFont.Times_Roman,\n family: PdfStandardFontFamily.Times,\n bold: false,\n italic: false,\n label: 'Times Roman',\n css: '\"Times New Roman\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_Bold,\n family: PdfStandardFontFamily.Times,\n bold: true,\n italic: false,\n label: 'Times Bold',\n css: '\"Times New Roman Bold\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_BoldItalic,\n family: PdfStandardFontFamily.Times,\n bold: true,\n italic: true,\n label: 'Times Bold Italic',\n css: '\"Times New Roman Bold Italic\", Times, serif',\n },\n {\n id: PdfStandardFont.Times_Italic,\n family: PdfStandardFontFamily.Times,\n bold: false,\n italic: true,\n label: 'Times Italic',\n css: '\"Times New Roman Italic\", Times, serif',\n },\n {\n id: PdfStandardFont.Symbol,\n family: PdfStandardFontFamily.Symbol,\n bold: false,\n italic: false,\n label: 'Symbol',\n css: 'Symbol',\n },\n {\n id: PdfStandardFont.ZapfDingbats,\n family: PdfStandardFontFamily.ZapfDingbats,\n bold: false,\n italic: false,\n label: 'Zapf Dingbats',\n css: 'ZapfDingbats',\n },\n]);\n\n/* Fast lookup maps */\nconst idToDescriptor: Record<PdfStandardFont, StandardFontDescriptor> =\n STANDARD_FONT_DESCRIPTORS.reduce((m, d) => ((m[d.id] = d), m), {} as any);\n\nconst familyStyleToId = new Map<\n `${PdfStandardFontFamily}_${boolean}_${boolean}`,\n PdfStandardFont\n>();\nfor (const d of STANDARD_FONT_DESCRIPTORS) {\n familyStyleToId.set(`${d.family}_${d.bold}_${d.italic}`, d.id);\n}\n\nfunction unknownDescriptor(): StandardFontDescriptor {\n return HELVETICA_DESC;\n}\n\n/* ───────────────────────── Queries ────────────────────────── */\n\n/** Get the descriptor for a given enum (falls back to Unknown). */\nexport function getStandardFontDescriptor(font: PdfStandardFont): StandardFontDescriptor {\n return idToDescriptor[font] ?? unknownDescriptor();\n}\n\n/** Convert enum → family. */\nexport function standardFontFamily(font: PdfStandardFont): PdfStandardFontFamily {\n return getStandardFontDescriptor(font).family;\n}\n\n/** Is font bold? */\nexport function standardFontIsBold(font: PdfStandardFont): boolean {\n return getStandardFontDescriptor(font).bold;\n}\n\n/** Is font italic / oblique? */\nexport function standardFontIsItalic(font: PdfStandardFont): boolean {\n return getStandardFontDescriptor(font).italic;\n}\n\n/**\n * Convert **family + (bold, italic)** back to the enum.\n * Returns `undefined` when the combination doesn’t exist\n * (e.g. “Symbol + bold” is not a valid Standard-14 face).\n */\nexport function makeStandardFont(\n family: PdfStandardFontFamily,\n { bold, italic }: { bold: boolean; italic: boolean },\n): PdfStandardFont {\n return familyStyleToId.get(`${family}_${bold}_${italic}`) ?? DEFAULT_FALLBACK_FONT;\n}\n\n/** Keep the helpers you already added: */\nexport function standardFontLabel(font: PdfStandardFont): string {\n return getStandardFontDescriptor(font).label;\n}\nexport function standardFontCss(font: PdfStandardFont): string {\n return getStandardFontDescriptor(font).css;\n}\n\n/* ───────────────────────── UI helpers ────────────────────────── */\n\n/** Family dropdown options (“Helvetica”, “Times”…). */\nexport const standardFontFamilySelectOptions = (\n Object.values(PdfStandardFontFamily) as PdfStandardFontFamily[]\n)\n .filter((f) => f !== PdfStandardFontFamily.Unknown)\n .map((family) => ({ value: family, label: family }));\n\n/**\n * Reduce multiple enums → single value or Mixed sentinel\n * (handy for multi-selection editing UIs).\n */\nexport function reduceStandardFonts(fonts: readonly PdfStandardFont[]): UiStandardFontValue {\n if (!fonts.length) return PdfStandardFont.Unknown;\n const first = fonts[0];\n return fonts.every((f) => f === first) ? first : MixedStandardFont;\n}\n\n/* UNIQUE families in canonical order, driven by STANDARD_FONT_DESCRIPTORS */\nexport const STANDARD_FONT_FAMILIES: readonly PdfStandardFontFamily[] = [\n ...new Set(STANDARD_FONT_DESCRIPTORS.map((d) => d.family)),\n];\n\n/** Friendly label for each family (could also live in the descriptor list) */\nexport function standardFontFamilyLabel(fam: PdfStandardFontFamily): string {\n switch (fam) {\n case PdfStandardFontFamily.Courier:\n return 'Courier';\n case PdfStandardFontFamily.Helvetica:\n return 'Helvetica';\n case PdfStandardFontFamily.Times:\n return 'Times';\n case PdfStandardFontFamily.Symbol:\n return 'Symbol';\n case PdfStandardFontFamily.ZapfDingbats:\n return 'ZapfDingbats';\n /* fallback */\n default:\n return 'Helvetica';\n }\n}\n","import { PdfBlendMode } from '../pdf';\n\n/** Extra UI sentinel for “multiple different values selected”. */\nexport const MixedBlendMode = Symbol('mixed');\nexport type UiBlendModeValue = PdfBlendMode | typeof MixedBlendMode;\n\nexport type CssBlendMode =\n | 'normal'\n | 'multiply'\n | 'screen'\n | 'overlay'\n | 'darken'\n | 'lighten'\n | 'color-dodge'\n | 'color-burn'\n | 'hard-light'\n | 'soft-light'\n | 'difference'\n | 'exclusion'\n | 'hue'\n | 'saturation'\n | 'color'\n | 'luminosity';\n\ninterface BlendModeInfo {\n /** Pdf enum value */\n id: PdfBlendMode;\n /** Human label for UI */\n label: string;\n /** CSS mix-blend-mode token */\n css: CssBlendMode;\n}\n\n/** Canonical ordered descriptor list (matches enum numeric order). */\nconst BLEND_MODE_INFOS: readonly BlendModeInfo[] = Object.freeze([\n { id: PdfBlendMode.Normal, label: 'Normal', css: 'normal' },\n { id: PdfBlendMode.Multiply, label: 'Multiply', css: 'multiply' },\n { id: PdfBlendMode.Screen, label: 'Screen', css: 'screen' },\n { id: PdfBlendMode.Overlay, label: 'Overlay', css: 'overlay' },\n { id: PdfBlendMode.Darken, label: 'Darken', css: 'darken' },\n { id: PdfBlendMode.Lighten, label: 'Lighten', css: 'lighten' },\n { id: PdfBlendMode.ColorDodge, label: 'Color Dodge', css: 'color-dodge' },\n { id: PdfBlendMode.ColorBurn, label: 'Color Burn', css: 'color-burn' },\n { id: PdfBlendMode.HardLight, label: 'Hard Light', css: 'hard-light' },\n { id: PdfBlendMode.SoftLight, label: 'Soft Light', css: 'soft-light' },\n { id: PdfBlendMode.Difference, label: 'Difference', css: 'difference' },\n { id: PdfBlendMode.Exclusion, label: 'Exclusion', css: 'exclusion' },\n { id: PdfBlendMode.Hue, label: 'Hue', css: 'hue' },\n { id: PdfBlendMode.Saturation, label: 'Saturation', css: 'saturation' },\n { id: PdfBlendMode.Color, label: 'Color', css: 'color' },\n { id: PdfBlendMode.Luminosity, label: 'Luminosity', css: 'luminosity' },\n]);\n\n/* Build O(1) maps once */\nconst enumToInfo: Record<PdfBlendMode, BlendModeInfo> = BLEND_MODE_INFOS.reduce(\n (m, info) => {\n m[info.id] = info;\n return m;\n },\n {} as Record<PdfBlendMode, BlendModeInfo>,\n);\n\nconst cssToEnum = BLEND_MODE_INFOS.reduce<Record<CssBlendMode, PdfBlendMode>>(\n (m, info) => {\n m[info.css] = info.id;\n return m;\n },\n {} as Record<CssBlendMode, PdfBlendMode>,\n);\n\n/** Get descriptor (falls back to Normal if unknown number sneaks in).\n *\n * @public\n */\nexport function getBlendModeInfo(mode: PdfBlendMode): BlendModeInfo {\n return enumToInfo[mode] ?? enumToInfo[PdfBlendMode.Normal];\n}\n\n/** Convert enum → CSS value for `mix-blend-mode`.\n *\n * @public\n */\nexport function blendModeToCss(mode: PdfBlendMode): CssBlendMode {\n return getBlendModeInfo(mode).css;\n}\n\n/** Convert CSS token → enum (returns undefined if not recognized).\n *\n * @public\n */\nexport function cssToBlendMode(value: CssBlendMode): PdfBlendMode | undefined {\n return cssToEnum[value];\n}\n\n/** Enum → UI label.\n *\n * @public\n */\nexport function blendModeLabel(mode: PdfBlendMode): string {\n return getBlendModeInfo(mode).label;\n}\n\n/**\n * For a selection of annotations: returns the common enum value, or Mixed sentinel.\n *\n * @public\n */\nexport function reduceBlendModes(modes: readonly PdfBlendMode[]): UiBlendModeValue {\n if (!modes.length) return PdfBlendMode.Normal;\n const first = modes[0];\n return modes.every((m) => m === first) ? first : MixedBlendMode;\n}\n\n/** Options for a <select> (with English labels - for quick prototyping).\n * For i18n, use `blendModeValues` and translate labels in your UI layer.\n *\n * @public\n */\nexport const blendModeSelectOptions = BLEND_MODE_INFOS.map((info) => ({\n value: info.id,\n label: info.label,\n}));\n\n/**\n * All blend mode enum values in canonical order.\n * Use this to build translated select options in your UI layer.\n *\n * @public\n */\nexport const blendModeValues: readonly PdfBlendMode[] = BLEND_MODE_INFOS.map((info) => info.id);\n\n/** Provide a label when Mixed sentinel used (UI convenience).\n *\n * @public\n */\nexport function uiBlendModeDisplay(value: UiBlendModeValue): string {\n return value === MixedBlendMode ? '(mixed)' : blendModeLabel(value);\n}\n","import {\n AllLogger,\n ConsoleLogger,\n LevelLogger,\n Logger,\n LogLevel,\n NoopLogger,\n PerfLogger,\n} from '../logger';\n\n/**\n * Serializable representation of a logger\n */\nexport type SerializedLogger = {\n type: 'noop' | 'console' | 'level' | 'perf' | 'all';\n config?: {\n level?: LogLevel; // for LevelLogger\n logger?: SerializedLogger; // for LevelLogger (wrapped logger)\n loggers?: SerializedLogger[]; // for AllLogger (child loggers)\n };\n};\n\n/**\n * Convert a Logger instance to a serializable JSON object\n * @param logger - The logger instance to serialize\n * @returns Serialized logger object\n */\nexport function serializeLogger(logger: Logger): SerializedLogger {\n if (logger instanceof NoopLogger) {\n return { type: 'noop' };\n }\n\n if (logger instanceof ConsoleLogger) {\n return { type: 'console' };\n }\n\n if (logger instanceof PerfLogger) {\n return { type: 'perf' };\n }\n\n if (logger instanceof LevelLogger) {\n // Access private properties using type assertion\n const levelLogger = logger as any;\n return {\n type: 'level',\n config: {\n level: levelLogger.level,\n logger: serializeLogger(levelLogger.logger),\n },\n };\n }\n\n if (logger instanceof AllLogger) {\n // Access private properties using type assertion\n const allLogger = logger as any;\n return {\n type: 'all',\n config: {\n loggers: allLogger.loggers.map(serializeLogger),\n },\n };\n }\n\n // Fallback to noop if unknown type\n return { type: 'noop' };\n}\n\n/**\n * Convert a serialized logger object back to a Logger instance\n * @param serialized - The serialized logger object\n * @returns Logger instance\n */\nexport function deserializeLogger(serialized: SerializedLogger): Logger {\n switch (serialized.type) {\n case 'noop':\n return new NoopLogger();\n\n case 'console':\n return new ConsoleLogger();\n\n case 'perf':\n return new PerfLogger();\n\n case 'level':\n if (!serialized.config?.logger || serialized.config?.level === undefined) {\n throw new Error('LevelLogger requires logger and level in config');\n }\n return new LevelLogger(deserializeLogger(serialized.config.logger), serialized.config.level);\n\n case 'all':\n if (!serialized.config?.loggers) {\n throw new Error('AllLogger requires loggers array in config');\n }\n return new AllLogger(serialized.config.loggers.map(deserializeLogger));\n\n default:\n // Fallback to noop for unknown types\n return new NoopLogger();\n }\n}\n","/*─────────────────────────────────────────────────────────────────────────────\n 🆔 UUID helpers – no external deps\n──────────────────────────────────────────────────────────────────────────────*/\n/**\n * Canonical RFC‑4122 **version‑4** UUID format:\n * 8-4-4-4-12 hexadecimal digits with\n * – the version nibble fixed to **4**\n * – the variant nibble in the range **8‑b** (binary 10xx)\n */\nconst V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check whether the supplied string is a **valid RFC‑4122 v4 UUID**.\n * Works in every runtime (browser / Node / Deno) because it is just\n * string validation – no crypto required.\n */\nexport function isUuidV4(str: string): boolean {\n return V4_REGEX.test(str);\n}\n\n/*──────────────────────────── rng helpers ───────────────────────────────*/\nfunction getRandomBytes(len: number): Uint8Array {\n // Modern browsers & Node ≥ 15 expose Web Crypto\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n return globalThis.crypto.getRandomValues(new Uint8Array(len));\n }\n\n // Fallback for old Node versions (< 15) – use node:crypto.randomBytes\n if (typeof require === 'function') {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { randomBytes } = require('crypto') as typeof import('crypto');\n return randomBytes(len);\n } catch {\n /* ignore – continue to final fallback */\n }\n }\n\n // ⚠️ LAST‑RESORT non‑cryptographic RNG – should never be used in prod\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/*──────────────────────────── main API ───────────────────────────────────*/\n/**\n * Generate a **version‑4 UUID** (random).\n *\n * • Uses the native `crypto.randomUUID()` when available (all modern\n * browsers, Deno, Node ≥ 16.9).\n * • Falls back to a tiny, standards‑compliant implementation that uses\n * `crypto.getRandomValues` / `crypto.randomBytes` for entropy.\n *\n * @example\n * ```ts\n * import { uuidV4 } from \"@embedpdf/models\";\n * const id = uuidV4();\n * // → \"36b8f84d-df4e-4d49-b662-bcde71a8764f\"\n * ```\n */\nexport function uuidV4(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n\n const bytes = getRandomBytes(16);\n\n // Per RFC 4122 §4.4: set version (0100) and variant (10xx)\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import { Task, TaskError, TaskStage } from './task';\n\n// ============================================================================\n// CompoundTask - IMPROVED with Automatic Completion\n// ============================================================================\n\n/**\n * Configuration for how CompoundTask should aggregate results\n */\nexport interface CompoundTaskConfig<R, CR, P> {\n /**\n * How to aggregate child results into final result\n * Default: returns array of child results\n */\n aggregate?: (childResults: CR[]) => R;\n\n /**\n * Called when each child completes (for progress tracking)\n * Return progress value to emit\n */\n onChildComplete?: (completed: number, total: number, result: CR, index: number) => P | void;\n\n /**\n * Whether to fail immediately on first error\n * Default: true (like Promise.all)\n */\n failFast?: boolean;\n}\n\n/**\n * A task that manages multiple child tasks with automatic completion.\n *\n * Key features:\n * - Auto-resolves when all children complete\n * - Auto-aggregates results\n * - Auto-tracks progress\n * - Auto-cleans up completed children\n * - Propagates abort to all children\n */\nexport class CompoundTask<R, D, P = unknown> extends Task<R, D, P> {\n private children = new Map<Task<any, any, any>, number>(); // task -> index\n private childResults: any[] = [];\n private completedCount = 0;\n private expectedCount = 0;\n private config: Required<CompoundTaskConfig<R, any, P>>;\n private isFinalized = false;\n\n constructor(config: CompoundTaskConfig<R, any, P> = {}) {\n super();\n\n this.config = {\n aggregate: config.aggregate ?? ((results) => results as any),\n onChildComplete: config.onChildComplete ?? (() => {}),\n failFast: config.failFast ?? true,\n };\n }\n\n /**\n * Add a child task - automatically wires up completion handling\n */\n addChild<CR>(child: Task<CR, any, any>, index?: number): this {\n // If already settled, abort the child\n if (this.state.stage !== TaskStage.Pending) {\n if (this.state.stage === TaskStage.Aborted) {\n child.abort(this.state.reason as any);\n }\n return this;\n }\n\n const childIndex = index ?? this.expectedCount;\n this.expectedCount = Math.max(this.expectedCount, childIndex + 1);\n\n this.children.set(child, childIndex);\n\n // Wire up automatic completion handling\n child.wait(\n (result) => this.handleChildSuccess(child, result, childIndex),\n (error) => this.handleChildError(child, error, childIndex),\n );\n\n return this; // Fluent API\n }\n\n /**\n * Finalize - signals that no more children will be added\n * If no children were added, resolves immediately\n */\n finalize(): this {\n if (this.isFinalized) return this;\n this.isFinalized = true;\n\n // If no children, resolve immediately with empty result\n if (this.expectedCount === 0) {\n this.resolve(this.config.aggregate([]) as R);\n }\n\n return this;\n }\n\n private handleChildSuccess(child: Task<any, any, any>, result: any, index: number): void {\n if (this.state.stage !== TaskStage.Pending) return;\n\n // Store result\n this.childResults[index] = result;\n this.completedCount++;\n\n // Clean up child reference\n this.children.delete(child);\n\n // Emit progress\n const progressValue = this.config.onChildComplete(\n this.completedCount,\n this.expectedCount,\n result,\n index,\n );\n if (progressValue !== undefined) {\n this.progress(progressValue as P);\n }\n\n // Check if all complete\n if (this.completedCount === this.expectedCount) {\n const finalResult = this.config.aggregate(this.childResults);\n this.resolve(finalResult as R);\n }\n }\n\n private handleChildError(child: Task<any, any, any>, error: TaskError<any>, index: number): void {\n if (this.state.stage !== TaskStage.Pending) return;\n\n this.children.delete(child);\n\n if (this.config.failFast) {\n // Abort all other children\n for (const [otherChild] of this.children) {\n otherChild.abort('Sibling task failed' as any);\n }\n this.children.clear();\n\n // Fail the compound task\n this.fail(error as TaskError<D>);\n } else {\n // Continue, treating error as undefined result\n this.childResults[index] = undefined;\n this.completedCount++;\n\n // Check if all complete (including failures)\n if (this.completedCount === this.expectedCount) {\n const finalResult = this.config.aggregate(this.childResults);\n this.resolve(finalResult as R);\n }\n }\n }\n\n /**\n * Override abort to propagate to all children\n */\n override abort(reason: D): void {\n for (const [child] of this.children) {\n child.abort(reason as any);\n }\n this.children.clear();\n super.abort(reason);\n }\n\n /**\n * Override reject to abort all children\n */\n override reject(reason: D): void {\n for (const [child] of this.children) {\n child.abort(reason as any);\n }\n this.children.clear();\n super.reject(reason);\n }\n\n /**\n * Get count of pending children\n */\n getPendingCount(): number {\n return this.children.size;\n }\n\n /**\n * Get count of completed children\n */\n getCompletedCount(): number {\n return this.completedCount;\n }\n\n // ============================================================================\n // Static Factory Methods\n // ============================================================================\n\n /**\n * Gather results from an array of tasks (progress-friendly).\n * (Formerly: all)\n */\n static gather<T extends Task<any, any, any>>(\n tasks: T[],\n ): CompoundTask<\n { [K in keyof T]: T[K] extends Task<infer R, any, any> ? R : never }[],\n any,\n { completed: number; total: number }\n > {\n type ResultType = { [K in keyof T]: T[K] extends Task<infer R, any, any> ? R : never }[];\n\n const compound = new CompoundTask<ResultType, any, { completed: number; total: number }>({\n aggregate: (results) => results as ResultType,\n onChildComplete: (completed, total) => ({ completed, total }),\n });\n\n tasks.forEach((task, index) => compound.addChild(task, index));\n compound.finalize();\n return compound;\n }\n\n /**\n * Gather into a Record indexed by number.\n * (Formerly: allIndexed)\n */\n static gatherIndexed<R, D>(\n tasks: Task<R, D, any>[],\n ): CompoundTask<Record<number, R>, D, { page: number; result: R }> {\n const compound = new CompoundTask<Record<number, R>, D, { page: number; result: R }>({\n aggregate: (results) => {\n const record: Record<number, R> = {};\n results.forEach((result, index) => {\n record[index] = result;\n });\n return record;\n },\n onChildComplete: (_completed, _total, result, index) => ({ page: index, result }),\n });\n\n tasks.forEach((task, index) => compound.addChild(task, index));\n compound.finalize();\n return compound;\n }\n\n /**\n * Gather with custom aggregation config.\n * (Formerly: from)\n */\n static gatherFrom<R, CR, D, P>(\n tasks: Task<CR, D, any>[],\n config: CompoundTaskConfig<R, CR, P>,\n ): CompoundTask<R, D, P> {\n const compound = new CompoundTask<R, D, P>(config);\n tasks.forEach((task, index) => compound.addChild(task, index));\n compound.finalize();\n return compound;\n }\n\n /**\n * Resolve with the first successful child; abort the rest.\n * (Formerly: race)\n */\n static first<T extends Task<any, any, any>>(\n tasks: T[],\n ): CompoundTask<\n T extends Task<infer R, any, any> ? R : never,\n T extends Task<any, infer D, any> ? D : never,\n unknown\n > {\n type ResultType = T extends Task<infer R, any, any> ? R : never;\n type ErrorType = T extends Task<any, infer D, any> ? D : never;\n\n let resolved = false;\n\n const compound = new CompoundTask<ResultType, ErrorType, unknown>({\n aggregate: (results) => results[0] as ResultType,\n failFast: false,\n });\n\n // Resolve immediately on first success; abort siblings\n compound['handleChildSuccess'] = (child: Task<any, any, any>, result: any) => {\n if (!resolved) {\n resolved = true;\n for (const [otherChild] of (compound as any)['children']) {\n if (otherChild !== child) otherChild.abort('Race won by sibling' as any);\n }\n compound.resolve(result as ResultType);\n }\n };\n\n tasks.forEach((task, index) => compound.addChild(task, index));\n compound.finalize();\n return compound;\n }\n}\n","/**\n * Library contains the common definitions of data types and logic\n *\n * @remarks\n * The `@embedpdf/models` defines the interface and classes which are used to\n * handling PDF files.\n *\n * @packageDocumentation\n */\nexport * from './geometry';\nexport * from './logger';\nexport * from './pdf';\nexport * from './task';\nexport * from './color';\nexport * from './date';\nexport * from './helpers';\nexport * from './uuid';\nexport * from './compound-task';\n\n/**\n * ignore will do nothing when called.\n *\n * @public\n */\nexport function ignore() {}\n"],"names":["Rotation","LogLevel","TaskStage","PdfZoomMode","PdfTrappedStatus","PdfStandardFont","PdfTextAlignment","PdfVerticalAlignment","PdfBlendMode","PdfStampFit","PdfActionType","PdfAnnotationSubtype","PdfAnnotationObjectStatus","AppearanceMode","PdfAnnotationState","PdfAnnotationStateModel","PdfAnnotationIcon","PdfAnnotationLineEnding","PDF_FORM_FIELD_TYPE","PdfAnnotationColorType","PdfAnnotationBorderStyle","PdfAnnotationFlags","PDF_FORM_FIELD_FLAG","PdfPageObjectType","PdfSegmentObjectType","PdfEngineFeature","PdfEngineOperation","MatchFlag","PdfPermission","PdfPageFlattenFlag","PdfPageFlattenResult","PdfErrorCode","PdfStandardFontFamily"],"mappings":"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"}
|