@arbidocs/react 0.5.71 → 0.5.72
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/annotations/freeze/index.cjs +14 -14
- package/dist/annotations/freeze/index.js +3 -3
- package/dist/artifacts/index.cjs +36 -36
- package/dist/artifacts/index.js +7 -7
- package/dist/bundle-IC65W2AO.cjs +14 -0
- package/dist/{bundle-DCWPYNGD.cjs.map → bundle-IC65W2AO.cjs.map} +1 -1
- package/dist/bundle-YNOX7VIL.js +5 -0
- package/dist/{bundle-JCKKGEJE.js.map → bundle-YNOX7VIL.js.map} +1 -1
- package/dist/calls/livekit/index.cjs +46 -46
- package/dist/calls/livekit/index.js +7 -7
- package/dist/{chunk-H3HYKAS5.cjs → chunk-3BFSALPC.cjs} +3 -3
- package/dist/{chunk-H3HYKAS5.cjs.map → chunk-3BFSALPC.cjs.map} +1 -1
- package/dist/{chunk-2NFUEC5O.js → chunk-3NBPMR3X.js} +3 -3
- package/dist/{chunk-2NFUEC5O.js.map → chunk-3NBPMR3X.js.map} +1 -1
- package/dist/{chunk-QL6CHRQ5.js → chunk-4DTTEUVY.js} +4 -4
- package/dist/{chunk-QL6CHRQ5.js.map → chunk-4DTTEUVY.js.map} +1 -1
- package/dist/{chunk-XFF66SHT.cjs → chunk-GOJHU7RZ.cjs} +26 -26
- package/dist/{chunk-XFF66SHT.cjs.map → chunk-GOJHU7RZ.cjs.map} +1 -1
- package/dist/{chunk-C55HTTQH.cjs → chunk-HXITD6DN.cjs} +7 -7
- package/dist/{chunk-C55HTTQH.cjs.map → chunk-HXITD6DN.cjs.map} +1 -1
- package/dist/{chunk-73BX6XSX.cjs → chunk-LMW46NBD.cjs} +6 -6
- package/dist/{chunk-73BX6XSX.cjs.map → chunk-LMW46NBD.cjs.map} +1 -1
- package/dist/{chunk-D6CQI24G.js → chunk-M3SB5TZB.js} +5 -5
- package/dist/{chunk-D6CQI24G.js.map → chunk-M3SB5TZB.js.map} +1 -1
- package/dist/{chunk-A2XSLTIP.js → chunk-NIKPG4PW.js} +3 -3
- package/dist/{chunk-A2XSLTIP.js.map → chunk-NIKPG4PW.js.map} +1 -1
- package/dist/{chunk-MZ7EYCGH.js → chunk-NNWMHMEC.js} +3 -3
- package/dist/{chunk-MZ7EYCGH.js.map → chunk-NNWMHMEC.js.map} +1 -1
- package/dist/{chunk-B6I2HRRF.cjs → chunk-PC4O3JDV.cjs} +3 -3
- package/dist/{chunk-B6I2HRRF.cjs.map → chunk-PC4O3JDV.cjs.map} +1 -1
- package/dist/{chunk-IXKD5JLF.js → chunk-QGOYIYLI.js} +4 -4
- package/dist/{chunk-IXKD5JLF.js.map → chunk-QGOYIYLI.js.map} +1 -1
- package/dist/{chunk-ZP5DBHUY.cjs → chunk-RS6UUPD2.cjs} +6 -6
- package/dist/{chunk-ZP5DBHUY.cjs.map → chunk-RS6UUPD2.cjs.map} +1 -1
- package/dist/{chunk-CHLDCP3J.js → chunk-SI7DJWBT.js} +3 -3
- package/dist/{chunk-CHLDCP3J.js.map → chunk-SI7DJWBT.js.map} +1 -1
- package/dist/{chunk-2PMH4DTL.cjs → chunk-TGSEQGM3.cjs} +4 -4
- package/dist/{chunk-2PMH4DTL.cjs.map → chunk-TGSEQGM3.cjs.map} +1 -1
- package/dist/{chunk-SOIOQBZZ.js → chunk-ZTPJNKF2.js} +5 -5
- package/dist/{chunk-SOIOQBZZ.js.map → chunk-ZTPJNKF2.js.map} +1 -1
- package/dist/{chunk-WEJHHBA2.cjs → chunk-ZWFMFOGP.cjs} +3 -3
- package/dist/{chunk-WEJHHBA2.cjs.map → chunk-ZWFMFOGP.cjs.map} +1 -1
- package/dist/document-tools/core.cjs +103 -103
- package/dist/document-tools/core.js +7 -7
- package/dist/document-tools/index.cjs +106 -106
- package/dist/document-tools/index.js +9 -9
- package/dist/index.cjs +1422 -1422
- package/dist/index.js +22 -22
- package/dist/shell/index.cjs +36 -36
- package/dist/shell/index.js +5 -5
- package/dist/ui/index.cjs +149 -149
- package/dist/ui/index.js +2 -2
- package/package.json +3 -3
- package/dist/bundle-DCWPYNGD.cjs +0 -14
- package/dist/bundle-JCKKGEJE.js +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/annotations/freeze/coords.ts","../src/annotations/freeze/hash.ts","../src/annotations/freeze/types.ts","../src/annotations/freeze/vector.ts","../src/annotations/freeze/raster.ts","../src/annotations/freeze/freeze.ts","../src/annotations/freeze/stamp.ts","../src/annotations/freeze/index-page.ts","../src/annotations/freeze/bundle.ts"],"names":["rgb","StandardFonts","BlendMode","degrees","u","pageSize","canvas","ctx","installPdfjsPolyfills","isEffectiveRedaction","parseLayer","PDFDocument","EncryptedPDFError","PDFName","PDFHexString","qrcode","checkAborted","first","indexPages"],"mappings":"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","file":"chunk-B6I2HRRF.cjs","sourcesContent":["/**\n * Mapping between the DISPLAYED page (what a viewer shows: crop box, then /Rotate) and the PDF's\n * unrotated user space (origin bottom-left of the media box, points). Marks are stored in the\n * displayed frame; this is the only place that knows how to leave it.\n */\n\nimport type { NormRect } from '../model'\n\nexport type PageRotation = 0 | 90 | 180 | 270\n\n/** The visible box of a page in user space, plus its /Rotate. */\nexport interface PageGeometry {\n /** Crop box origin and size in user-space points. */\n x: number\n y: number\n width: number\n height: number\n rotation: PageRotation\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport interface UserRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport function normaliseRotation(angle: number): PageRotation {\n const a = (((Math.round(angle / 90) * 90) % 360) + 360) % 360\n return a as PageRotation\n}\n\n/** Size of the page as displayed, in points (width and height swap at 90/270). */\nexport function displayedSize(g: PageGeometry): { width: number; height: number } {\n return g.rotation === 90 || g.rotation === 270\n ? { width: g.height, height: g.width }\n : { width: g.width, height: g.height }\n}\n\n/** A point given in displayed points from the top-left, as a user-space point. */\nexport function displayedToUser(g: PageGeometry, dx: number, dy: number): Point {\n switch (g.rotation) {\n case 0:\n return { x: g.x + dx, y: g.y + g.height - dy }\n case 90:\n return { x: g.x + dy, y: g.y + dx }\n case 180:\n return { x: g.x + g.width - dx, y: g.y + dy }\n case 270:\n return { x: g.x + g.width - dy, y: g.y + g.height - dx }\n }\n}\n\n/** The user-space bounding box of a normalised displayed rectangle. */\nexport function normToUserRect(g: PageGeometry, r: NormRect): UserRect {\n const size = displayedSize(g)\n const a = displayedToUser(g, r.x * size.width, r.y * size.height)\n const b = displayedToUser(g, (r.x + r.w) * size.width, (r.y + r.h) * size.height)\n return {\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n width: Math.abs(b.x - a.x),\n height: Math.abs(b.y - a.y),\n }\n}\n","import type { AnnotationLayer } from '../model'\n\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n // Copy into a plain ArrayBuffer: `bytes` may be a view over a larger or shared buffer.\n const copy = new Uint8Array(bytes.byteLength)\n copy.set(bytes)\n const digest = await globalThis.crypto.subtle.digest('SHA-256', copy.buffer)\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/** JSON with object keys sorted, so equal data always hashes equally. */\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`\n }\n return JSON.stringify(value)\n}\n\n/** The layer as hashed for provenance: the text under redactions is dropped first. */\nfunction layerFingerprint(layer: AnnotationLayer): unknown {\n return {\n ...layer,\n annotations: layer.annotations.map((a) => {\n // `text: undefined` is dropped by canonicalJson, so the text never reaches the hash.\n return a.kind === 'redaction' ? { ...a, text: undefined } : a\n }),\n }\n}\n\nexport const hashLayer = (layer: AnnotationLayer) =>\n sha256Hex(new TextEncoder().encode(canonicalJson(layerFingerprint(layer))))\n","import type { AnnotationKind } from '../model'\n\n/**\n * `vector` draws marks into the original pages and keeps the text. `image` rasterises every page\n * with the marks burned in, so nothing sits behind a redaction. A layer with redactions is always\n * frozen as `image`.\n */\nexport type FreezeMode = 'vector' | 'image'\n\n/** What happens to comments: leave them out, draw numbered markers, or markers plus a listing. */\nexport type CommentOutput = 'omit' | 'markers' | 'appendix'\n\n/** A word recognised on a burned page, in fractions of the displayed page (top-left origin). */\nexport interface OcrWord {\n text: string\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface OcrInput {\n pageNumber: number\n bytes: Uint8Array\n format: 'jpeg' | 'png'\n widthPx: number\n heightPx: number\n}\n\n/** One page drawn on a canvas, ready for marks to be burned in and the result encoded. */\nexport interface RenderedPage {\n widthPt: number\n heightPt: number\n widthPx: number\n heightPx: number\n /** Resolution actually used; lower than requested when the page was too large. */\n dpi: number\n ctx: CanvasRenderingContext2D\n encode(format: 'jpeg' | 'png', quality: number): Promise<Uint8Array>\n release(): void\n}\n\nexport interface PageRasterizer {\n numPages: number\n /** Render `pageNumber` (1-based) at `dpi`. The caller must `release()` the result. */\n renderPage(pageNumber: number, dpi: number): Promise<RenderedPage>\n destroy(): Promise<void> | void\n}\n\nexport interface FreezeOptions {\n mode: FreezeMode\n /** Who is freezing; recorded in the provenance. */\n author: string\n /** ISO timestamp; defaults to now. Injectable for deterministic tests. */\n now?: string\n /**\n * Redaction marks nobody has approved or rejected. `error` (default) refuses to freeze, so an\n * unreviewed mark cannot slip through; `burn` redacts them anyway (the safe direction).\n */\n pendingRedactions?: 'error' | 'burn'\n comments?: CommentOutput\n /** Image mode only. Default 200. Lowered automatically for very large pages. */\n dpi?: number\n imageFormat?: 'jpeg' | 'png'\n jpegQuality?: number\n /** Extra margin burned around each redaction rectangle, in points. Default 1.5. */\n redactionPaddingPt?: number\n /** Print the reason on each redaction box. Default true. */\n redactionLabels?: boolean\n /** Required for image mode: renders pages onto canvases. */\n rasterizer?: PageRasterizer\n /** Optional: recognise text on the burned pages and add it as an invisible layer. */\n ocr?: (input: OcrInput) => Promise<OcrWord[]>\n onProgress?: (done: number, total: number) => void\n signal?: AbortSignal\n}\n\nexport interface FreezeProvenance {\n schema: 1\n /** External id of the immutable original this copy was derived from. */\n derivedFrom: string\n originalSha256: string\n /** Hash of the layer snapshot, computed WITHOUT the text under redactions. */\n layerSha256: string\n modeRequested: FreezeMode\n modeApplied: FreezeMode\n modeChangedBecause?: 'redactions-present'\n frozenAt: string\n frozenBy: string\n pages: number\n dpi?: number\n counts: Record<AnnotationKind, number>\n /** Counts and reasons only. The redacted text is never recorded here. */\n redactions: { count: number; pages: number[]; reasons: Record<string, number> }\n}\n\nexport interface FreezeResult {\n bytes: Uint8Array\n provenance: FreezeProvenance\n /** Things the caller should surface, e.g. characters a built-in font could not draw. */\n warnings: string[]\n}\n\nexport type FreezeErrorCode =\n | 'pending-redactions'\n | 'rasterizer-required'\n | 'page-out-of-range'\n | 'unsupported-text'\n | 'invalid-pdf'\n | 'encrypted'\n | 'invalid-option'\n\n/** Said identically wherever a password-protected source is met, so the user sees one message. */\nexport const ENCRYPTED_MESSAGE =\n 'This PDF is password-protected, so a copy cannot be frozen from it. Remove the protection first.'\n\nexport class FreezeError extends Error {\n readonly code: FreezeErrorCode\n constructor(code: FreezeErrorCode, message: string) {\n super(message)\n this.name = 'FreezeError'\n this.code = code\n }\n}\n","/**\n * Vector freeze: draw marks into the original pages with pdf-lib. Text, fonts and structure stay,\n * so the result is still searchable. Never used for redactions (see `freeze.ts`).\n */\n\nimport {\n BlendMode,\n PDFDocument,\n PDFFont,\n PDFPage,\n type PDFImage,\n StandardFonts,\n degrees,\n rgb,\n type Color,\n} from 'pdf-lib'\nimport type {\n Annotation,\n BoxAnnotation,\n CommentAnnotation,\n HighlightAnnotation,\n StampAnnotation,\n} from '../model'\nimport {\n displayedSize,\n displayedToUser,\n normToUserRect,\n normaliseRotation,\n type PageGeometry,\n} from './coords'\nimport { FreezeError } from './types'\n\nexport const HIGHLIGHT_OPACITY = 0.7\nexport const MARKER_SIZE_PT = 12\nconst MARKER_COLOR = '#ffd43b'\nconst MARKER_BORDER = '#7a5c00'\nconst CAP_HEIGHT = 0.72\n\nexport function hexToRgb(hex: string): Color {\n const n = parseInt(hex.slice(1), 16)\n return rgb(((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255)\n}\n\n/** The page as a viewer displays it: crop box clipped to the media box, then /Rotate. */\nexport function pageGeometry(page: PDFPage): PageGeometry {\n const media = page.getMediaBox()\n const crop = page.getCropBox()\n const x1 = Math.max(media.x, crop.x)\n const y1 = Math.max(media.y, crop.y)\n const x2 = Math.min(media.x + media.width, crop.x + crop.width)\n const y2 = Math.min(media.y + media.height, crop.y + crop.height)\n const usable = x2 > x1 && y2 > y1\n return {\n x: usable ? x1 : media.x,\n y: usable ? y1 : media.y,\n width: usable ? x2 - x1 : media.width,\n height: usable ? y2 - y1 : media.height,\n rotation: normaliseRotation(page.getRotation().angle),\n }\n}\n\n/** Number comments in reading order (page, then top to bottom, then left to right). */\nexport function numberComments(marks: Annotation[]): Map<string, number> {\n const comments = marks\n .filter((a): a is CommentAnnotation => a.kind === 'comment')\n .sort(\n (a, b) =>\n a.page - b.page || a.rect.y - b.rect.y || a.rect.x - b.rect.x || (a.id < b.id ? -1 : 1)\n )\n return new Map(comments.map((c, i) => [c.id, i + 1]))\n}\n\n/** Characters a standard font can draw. Anything else is replaced and reported. */\nexport class TextSanitiser {\n private readonly supported: Set<number>\n readonly replaced = new Set<string>()\n constructor(font: PDFFont) {\n this.supported = new Set(font.getCharacterSet())\n }\n clean(text: string): string {\n let out = ''\n for (const ch of text) {\n const cp = ch.codePointAt(0)!\n if (this.supported.has(cp)) out += ch\n else {\n out += '?'\n this.replaced.add(ch)\n }\n }\n return out\n }\n supports(text: string): boolean {\n for (const ch of text) if (!this.supported.has(ch.codePointAt(0)!)) return false\n return true\n }\n}\n\nexport interface VectorContext {\n doc: PDFDocument\n regular: PDFFont\n bold: PDFFont\n numbers: Map<string, number>\n comments: 'omit' | 'markers' | 'appendix'\n sanitiser: TextSanitiser\n /** The picture stamps' images, embedded once, by mark id. */\n images: Map<string, PDFImage>\n}\n\nexport async function createVectorContext(\n doc: PDFDocument,\n marks: Annotation[],\n comments: VectorContext['comments']\n): Promise<VectorContext> {\n const regular = await doc.embedFont(StandardFonts.Helvetica)\n const bold = await doc.embedFont(StandardFonts.HelveticaBold)\n const images = new Map<string, PDFImage>()\n for (const a of marks)\n if (a.kind === 'stamp' && a.image) images.set(a.id, await doc.embedPng(a.image))\n return {\n doc,\n images,\n regular,\n bold,\n numbers: numberComments(marks),\n comments,\n sanitiser: new TextSanitiser(regular),\n }\n}\n\nfunction drawHighlight(page: PDFPage, g: PageGeometry, a: HighlightAnnotation) {\n for (const r of a.rects) {\n const u = normToUserRect(g, r)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: hexToRgb(a.color),\n opacity: HIGHLIGHT_OPACITY,\n blendMode: BlendMode.Multiply,\n })\n }\n}\n\nfunction drawBox(page: PDFPage, g: PageGeometry, a: BoxAnnotation) {\n const u = normToUserRect(g, a.rect)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n borderColor: hexToRgb(a.color),\n borderWidth: a.strokeWidth,\n borderOpacity: 1,\n opacity: 0,\n })\n}\n\n/** Font size that fits `text` inside a displayed box, capped by the box height. */\nfunction fitFontSize(font: PDFFont, text: string, widthPt: number, heightPt: number): number {\n const probe = font.widthOfTextAtSize(text || ' ', 100)\n const byWidth = probe > 0 ? (widthPt * 0.9 * 100) / probe : heightPt\n return Math.max(1, Math.min(heightPt * 0.6, byWidth))\n}\n\nfunction drawCentredText(\n page: PDFPage,\n g: PageGeometry,\n font: PDFFont,\n text: string,\n box: { x: number; y: number; w: number; h: number },\n size: number,\n color: Color\n) {\n const textWidth = font.widthOfTextAtSize(text, size)\n const dx = box.x + (box.w - textWidth) / 2\n const dy = box.y + box.h / 2 + (size * CAP_HEIGHT) / 2\n const origin = displayedToUser(g, dx, dy)\n page.drawText(text, { x: origin.x, y: origin.y, size, font, color, rotate: degrees(g.rotation) })\n}\n\nfunction drawStamp(page: PDFPage, g: PageGeometry, a: StampAnnotation, ctx: VectorContext) {\n const picture = ctx.images.get(a.id)\n if (picture) {\n // The picture as large as fits the box, in its proportions, centred.\n const u = normToUserRect(g, a.rect)\n const scale = Math.min(u.width / picture.width, u.height / picture.height)\n const w = picture.width * scale\n const h = picture.height * scale\n page.drawImage(picture, {\n x: u.x + (u.width - w) / 2,\n y: u.y + (u.height - h) / 2,\n width: w,\n height: h,\n })\n return\n }\n if (!ctx.sanitiser.supports(a.label)) {\n throw new FreezeError(\n 'unsupported-text',\n `Stamp \"${a.label}\" uses characters a vector stamp cannot draw; freeze as an image instead`\n )\n }\n const u = normToUserRect(g, a.rect)\n const color = hexToRgb(a.color)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n borderColor: color,\n borderWidth: 2,\n opacity: 0,\n borderOpacity: 1,\n })\n const size = displayedSize(g)\n const box = {\n x: a.rect.x * size.width,\n y: a.rect.y * size.height,\n w: a.rect.w * size.width,\n h: a.rect.h * size.height,\n }\n const fontSize = fitFontSize(ctx.bold, a.label, box.w, box.h)\n drawCentredText(page, g, ctx.bold, a.label, box, fontSize, color)\n}\n\nfunction drawCommentMarker(\n page: PDFPage,\n g: PageGeometry,\n a: CommentAnnotation,\n ctx: VectorContext\n) {\n const n = ctx.numbers.get(a.id)\n if (n === undefined) return\n const size = displayedSize(g)\n const box = {\n x: Math.min(a.rect.x * size.width, size.width - MARKER_SIZE_PT),\n y: Math.min(a.rect.y * size.height, size.height - MARKER_SIZE_PT),\n w: MARKER_SIZE_PT,\n h: MARKER_SIZE_PT,\n }\n const u = normToUserRect(g, {\n x: box.x / size.width,\n y: box.y / size.height,\n w: box.w / size.width,\n h: box.h / size.height,\n })\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: hexToRgb(MARKER_COLOR),\n borderColor: hexToRgb(MARKER_BORDER),\n borderWidth: 0.75,\n })\n drawCentredText(page, g, ctx.bold, String(n), box, 7, hexToRgb(MARKER_BORDER))\n}\n\n/** Draw one non-redaction mark onto its page. */\nexport function drawVectorMark(page: PDFPage, a: Annotation, ctx: VectorContext) {\n const g = pageGeometry(page)\n switch (a.kind) {\n case 'highlight':\n return drawHighlight(page, g, a)\n case 'box':\n return drawBox(page, g, a)\n case 'stamp':\n return drawStamp(page, g, a, ctx)\n case 'comment':\n return ctx.comments === 'omit' ? undefined : drawCommentMarker(page, g, a, ctx)\n case 'redaction':\n throw new Error('redactions are never drawn as vectors')\n }\n}\n\nexport function wrap(font: PDFFont, text: string, size: number, maxWidth: number): string[] {\n const lines: string[] = []\n for (const paragraph of text.split(/\\r?\\n/)) {\n let line = ''\n for (const word of paragraph.split(/\\s+/).filter(Boolean)) {\n const candidate = line ? `${line} ${word}` : word\n if (font.widthOfTextAtSize(candidate, size) <= maxWidth || !line) line = candidate\n else {\n lines.push(line)\n line = word\n }\n }\n lines.push(line)\n }\n return lines\n}\n\n/** Append pages listing every comment and reply, numbered to match the markers. */\nexport function appendCommentAppendix(\n ctx: VectorContext,\n comments: CommentAnnotation[],\n pageSize: [number, number]\n) {\n if (comments.length === 0) return\n const { doc, regular, bold, sanitiser } = ctx\n const margin = 54\n const lineHeight = 13\n const maxWidth = pageSize[0] - margin * 2\n let page = doc.addPage(pageSize)\n let y = pageSize[1] - margin\n const ensure = (needed: number) => {\n if (y - needed < margin) {\n page = doc.addPage(pageSize)\n y = pageSize[1] - margin\n }\n }\n const line = (text: string, font: PDFFont, size: number, indent = 0) => {\n ensure(lineHeight)\n page.drawText(sanitiser.clean(text), {\n x: margin + indent,\n y: y - size,\n size,\n font,\n color: rgb(0.1, 0.1, 0.1),\n })\n y -= lineHeight\n }\n\n line('Comments', bold, 14)\n y -= 6\n const ordered = [...comments].sort(\n (a, b) => (ctx.numbers.get(a.id) ?? 0) - (ctx.numbers.get(b.id) ?? 0)\n )\n for (const c of ordered) {\n ensure(lineHeight * 3)\n line(\n `[${ctx.numbers.get(c.id)}] Page ${c.page} - ${c.author}${c.resolved ? ' (resolved)' : ''}`,\n bold,\n 10\n )\n for (const l of wrap(regular, sanitiser.clean(c.body), 10, maxWidth - 12))\n line(l, regular, 10, 12)\n for (const r of c.replies) {\n line(`${r.author}:`, bold, 9, 24)\n for (const l of wrap(regular, sanitiser.clean(r.body), 9, maxWidth - 36))\n line(l, regular, 9, 36)\n }\n y -= 8\n }\n}\n","/**\n * Image-only freeze: render each page onto a canvas, burn the marks into the pixels, and encode.\n * Once a redaction rectangle is painted black the original pixels are gone, and the rebuilt PDF\n * has no text layer, so nothing sits behind the box.\n */\n\nimport type { Annotation, CommentAnnotation } from '../model'\nimport { isEffectiveRedaction } from '../model'\nimport { installPdfjsPolyfills } from '../../viewers/pdfjs-polyfills'\nimport { HIGHLIGHT_OPACITY, MARKER_SIZE_PT } from './vector'\nimport {\n ENCRYPTED_MESSAGE,\n FreezeError,\n type CommentOutput,\n type PageRasterizer,\n type RenderedPage,\n} from './types'\n\n/** A canvas the freeze code can draw on, produced by the host's environment. */\nexport interface CanvasHandle {\n canvas: unknown\n ctx: CanvasRenderingContext2D\n encode(format: 'jpeg' | 'png', quality: number): Promise<Uint8Array>\n release(): void\n}\nexport type CanvasFactory = (width: number, height: number) => CanvasHandle\n\n/** Pages beyond this many pixels are rendered at a lower DPI (mobile Safari fails near 16.7M). */\nexport const MAX_PAGE_PIXELS = 36_000_000\nconst MARKER_FILL = '#ffd43b'\nconst MARKER_INK = '#7a5c00'\n\nexport function browserCanvasFactory(): CanvasFactory {\n return (width, height) => {\n if (typeof OffscreenCanvas !== 'undefined') {\n const canvas = new OffscreenCanvas(width, height)\n const ctx = canvas.getContext('2d') as unknown as CanvasRenderingContext2D\n return {\n canvas,\n ctx,\n async encode(format, quality) {\n const blob = await canvas.convertToBlob({ type: `image/${format}`, quality })\n return new Uint8Array(await blob.arrayBuffer())\n },\n release() {\n canvas.width = 0\n canvas.height = 0\n },\n }\n }\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D\n return {\n canvas,\n ctx,\n encode(format, quality) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) return reject(new Error('canvas could not be encoded'))\n void blob.arrayBuffer().then((buf) => resolve(new Uint8Array(buf)), reject)\n },\n `image/${format}`,\n quality\n )\n })\n },\n release() {\n canvas.width = 0\n canvas.height = 0\n },\n }\n }\n}\n\ninterface PdfJsViewport {\n width: number\n height: number\n}\ninterface PdfJsPage {\n getViewport(options: { scale: number }): PdfJsViewport\n render(params: {\n canvasContext: CanvasRenderingContext2D\n canvas: unknown\n viewport: PdfJsViewport\n }): { promise: Promise<void> }\n cleanup(): void\n}\ninterface PdfJsDocument {\n numPages: number\n getPage(n: number): Promise<PdfJsPage>\n}\ninterface PdfJsLoadingTask {\n promise: Promise<PdfJsDocument>\n /** pdf.js 6 removed `PDFDocumentProxy.destroy()`; the loading task owns teardown. */\n destroy(): Promise<void>\n}\n/** The slice of `pdfjs-dist` the rasteriser needs, so the host decides which build to pass. */\nexport interface PdfJsModule {\n getDocument(source: Record<string, unknown>): PdfJsLoadingTask\n}\n\nexport interface PdfJsRasterizerOptions {\n password?: string\n /** Extra `getDocument` options: cMapUrl, standardFontDataUrl, wasmUrl... */\n documentOptions?: Record<string, unknown>\n}\n\nexport async function createPdfJsRasterizer(\n pdfjs: PdfJsModule,\n data: Uint8Array,\n canvases: CanvasFactory,\n options: PdfJsRasterizerOptions = {}\n): Promise<PageRasterizer> {\n installPdfjsPolyfills()\n // pdf.js takes ownership of the buffer, so hand it a copy and keep the caller's bytes intact.\n const task = pdfjs.getDocument({\n data: data.slice(),\n password: options.password,\n ...options.documentOptions,\n })\n let doc: PdfJsDocument\n try {\n doc = await task.promise\n } catch (error) {\n await task.destroy().catch(() => {})\n if ((error as { name?: string })?.name === 'PasswordException') {\n throw new FreezeError('encrypted', ENCRYPTED_MESSAGE)\n }\n throw error\n }\n\n return {\n numPages: doc.numPages,\n async renderPage(pageNumber, dpi): Promise<RenderedPage> {\n const page = await doc.getPage(pageNumber)\n try {\n const base = page.getViewport({ scale: 1 })\n let scale = dpi / 72\n const pixels = base.width * scale * (base.height * scale)\n if (pixels > MAX_PAGE_PIXELS) scale *= Math.sqrt(MAX_PAGE_PIXELS / pixels)\n const viewport = page.getViewport({ scale })\n const widthPx = Math.max(1, Math.ceil(viewport.width))\n const heightPx = Math.max(1, Math.ceil(viewport.height))\n const handle = canvases(widthPx, heightPx)\n handle.ctx.fillStyle = '#ffffff'\n handle.ctx.fillRect(0, 0, widthPx, heightPx)\n await page.render({ canvasContext: handle.ctx, canvas: handle.canvas, viewport }).promise\n return {\n widthPt: base.width,\n heightPt: base.height,\n widthPx,\n heightPx,\n dpi: scale * 72,\n ctx: handle.ctx,\n encode: handle.encode,\n release: handle.release,\n }\n } finally {\n page.cleanup()\n }\n },\n destroy: () => task.destroy(),\n }\n}\n\nexport interface BurnOptions {\n /** Margin added around each redaction rectangle, in points. */\n paddingPt: number\n labels: boolean\n comments: CommentOutput\n numbers: Map<string, number>\n /** Picture stamps' images, decoded, by mark id (a stamp without one draws its label). */\n images?: Map<string, CanvasImageSource & { width: number; height: number }>\n}\n\n/** Paint every mark for one page onto its rendered pixels. Redactions go last, on top. */\nexport function burnMarks(page: RenderedPage, marks: Annotation[], options: BurnOptions) {\n const { ctx } = page\n const w = page.widthPx\n const h = page.heightPx\n const pxPerPt = page.widthPx / page.widthPt\n\n ctx.save()\n for (const a of marks) {\n if (a.kind === 'highlight') {\n ctx.globalCompositeOperation = 'multiply'\n ctx.globalAlpha = HIGHLIGHT_OPACITY\n ctx.fillStyle = a.color\n for (const r of a.rects) ctx.fillRect(r.x * w, r.y * h, r.w * w, r.h * h)\n ctx.globalCompositeOperation = 'source-over'\n ctx.globalAlpha = 1\n }\n }\n for (const a of marks) {\n if (a.kind === 'box') {\n ctx.strokeStyle = a.color\n ctx.lineWidth = a.strokeWidth * pxPerPt\n ctx.strokeRect(a.rect.x * w, a.rect.y * h, a.rect.w * w, a.rect.h * h)\n } else if (a.kind === 'stamp' && options.images?.get(a.id)) {\n const picture = options.images.get(a.id)!\n const box = { x: a.rect.x * w, y: a.rect.y * h, w: a.rect.w * w, h: a.rect.h * h }\n const scale = Math.min(box.w / picture.width, box.h / picture.height)\n const dw = picture.width * scale\n const dh = picture.height * scale\n ctx.drawImage(picture, box.x + (box.w - dw) / 2, box.y + (box.h - dh) / 2, dw, dh)\n } else if (a.kind === 'stamp') {\n drawStampOnCanvas(\n ctx,\n a.label,\n a.color,\n { x: a.rect.x * w, y: a.rect.y * h, w: a.rect.w * w, h: a.rect.h * h },\n pxPerPt\n )\n } else if (a.kind === 'comment' && options.comments !== 'omit') {\n drawMarkerOnCanvas(ctx, a, options.numbers.get(a.id), w, h, pxPerPt)\n }\n }\n for (const a of marks) {\n if (!isEffectiveRedaction(a)) continue\n const pad = options.paddingPt * pxPerPt\n a.rects.forEach((r, i) => {\n // Floor/ceil so anti-aliased edge pixels are covered rather than left half-grey.\n const x0 = Math.max(0, Math.floor(r.x * w - pad))\n const y0 = Math.max(0, Math.floor(r.y * h - pad))\n const x1 = Math.min(w, Math.ceil((r.x + r.w) * w + pad))\n const y1 = Math.min(h, Math.ceil((r.y + r.h) * h + pad))\n ctx.fillStyle = '#000000'\n ctx.fillRect(x0, y0, x1 - x0, y1 - y0)\n if (options.labels && i === 0)\n drawLabel(ctx, '[REDACTED]', { x: x0, y: y0, w: x1 - x0, h: y1 - y0 })\n })\n }\n ctx.restore()\n}\n\nfunction drawStampOnCanvas(\n ctx: CanvasRenderingContext2D,\n label: string,\n color: string,\n box: { x: number; y: number; w: number; h: number },\n pxPerPt: number\n) {\n ctx.strokeStyle = color\n ctx.lineWidth = 2 * pxPerPt\n ctx.strokeRect(box.x, box.y, box.w, box.h)\n ctx.fillStyle = color\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = 'bold 100px Helvetica, Arial, sans-serif'\n const probe = ctx.measureText(label).width\n const size = Math.max(1, Math.min(box.h * 0.6, probe > 0 ? (box.w * 0.9 * 100) / probe : box.h))\n ctx.font = `bold ${size}px Helvetica, Arial, sans-serif`\n ctx.fillText(label, box.x + box.w / 2, box.y + box.h / 2)\n}\n\nfunction drawMarkerOnCanvas(\n ctx: CanvasRenderingContext2D,\n a: CommentAnnotation,\n n: number | undefined,\n w: number,\n h: number,\n pxPerPt: number\n) {\n if (n === undefined) return\n const size = MARKER_SIZE_PT * pxPerPt\n const x = Math.min(a.rect.x * w, w - size)\n const y = Math.min(a.rect.y * h, h - size)\n ctx.fillStyle = MARKER_FILL\n ctx.fillRect(x, y, size, size)\n ctx.strokeStyle = MARKER_INK\n ctx.lineWidth = 0.75 * pxPerPt\n ctx.strokeRect(x, y, size, size)\n ctx.fillStyle = MARKER_INK\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = `bold ${7 * pxPerPt}px Helvetica, Arial, sans-serif`\n ctx.fillText(String(n), x + size / 2, y + size / 2)\n}\n\n/** Print the redaction reason in white on the black box, only when it fits legibly. */\nfunction drawLabel(\n ctx: CanvasRenderingContext2D,\n text: string,\n box: { x: number; y: number; w: number; h: number }\n) {\n const size = Math.min(box.h * 0.7, 14)\n if (size < 6) return\n ctx.font = `${size}px Helvetica, Arial, sans-serif`\n const width = ctx.measureText(text).width\n if (width > box.w - 4) return\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, box.x + box.w / 2, box.y + box.h / 2)\n}\n","/**\n * Freeze: derive a NEW document from an immutable original plus its annotation layer.\n *\n * - `vector`: marks are drawn into the original pages; text stays searchable.\n * - `image`: every page is rasterised with the marks burned in and the PDF is rebuilt from the\n * images alone. Required whenever a redaction applies, because only a rebuild leaves nothing\n * behind the box: no text, no metadata, no annotations, no attachments, no old revisions.\n *\n * The layer itself is never embedded. The output carries a provenance record (counts and reasons,\n * never the redacted text).\n */\n\nimport { EncryptedPDFError, PDFDocument, PDFHexString, PDFName, StandardFonts, rgb } from 'pdf-lib'\nimport {\n isEffectiveRedaction,\n parseLayer,\n type Annotation,\n type AnnotationKind,\n type AnnotationLayer,\n type CommentAnnotation,\n} from '../model'\nimport { displayedSize } from './coords'\nimport { hashLayer, sha256Hex } from './hash'\nimport { burnMarks } from './raster'\nimport {\n ENCRYPTED_MESSAGE,\n FreezeError,\n type FreezeMode,\n type FreezeOptions,\n type FreezeProvenance,\n type FreezeResult,\n type OcrWord,\n} from './types'\nimport {\n TextSanitiser,\n appendCommentAppendix,\n createVectorContext,\n drawVectorMark,\n numberComments,\n pageGeometry,\n} from './vector'\n\nexport const DEFAULT_DPI = 200\nconst DEFAULT_JPEG_QUALITY = 0.92\nconst DEFAULT_REDACTION_PADDING_PT = 1.5\nconst MIN_DPI = 72\nconst MAX_DPI = 600\nconst FALLBACK_PAGE: [number, number] = [595.28, 841.89]\nconst PROVENANCE_KEY = 'ArbiProvenance'\n\nconst KINDS: AnnotationKind[] = ['highlight', 'box', 'comment', 'stamp', 'redaction']\n\nexport async function freezePdf(\n original: Uint8Array,\n rawLayer: AnnotationLayer,\n options: FreezeOptions\n): Promise<FreezeResult> {\n // The layer may have come from storage or an agent: validate before anything is drawn.\n const layer = parseLayer(rawLayer)\n const now = options.now ?? new Date().toISOString()\n const comments = options.comments ?? 'omit'\n const dpi = options.dpi ?? DEFAULT_DPI\n if (!(dpi >= MIN_DPI && dpi <= MAX_DPI)) {\n throw new FreezeError('invalid-option', `dpi must be between ${MIN_DPI} and ${MAX_DPI}`)\n }\n\n const redactions = layer.annotations.filter(isEffectiveRedaction)\n const pending = redactions.filter((r) => r.status === 'pending')\n if (pending.length > 0 && (options.pendingRedactions ?? 'error') === 'error') {\n throw new FreezeError(\n 'pending-redactions',\n `${pending.length} redaction mark(s) have not been approved or rejected`\n )\n }\n\n // Rejected redactions are dropped; every other mark is applied.\n const marks = layer.annotations.filter((a) => a.kind !== 'redaction' || isEffectiveRedaction(a))\n const modeApplied: FreezeMode = redactions.length > 0 ? 'image' : options.mode\n\n const [originalSha256, layerSha256] = await Promise.all([sha256Hex(original), hashLayer(layer)])\n const warnings: string[] = []\n if (redactions.length > 0 && comments !== 'omit' && marks.some((a) => a.kind === 'comment')) {\n warnings.push(\n 'Comments are included in a document with redactions and may repeat redacted text'\n )\n }\n\n let built: { doc: PDFDocument; pages: number; dpi?: number }\n if (modeApplied === 'image') {\n built = await freezeAsImage(marks, options, comments, dpi, now, warnings)\n } else {\n built = await freezeAsVector(original, marks, comments, now, warnings)\n }\n\n const provenance: FreezeProvenance = {\n schema: 1,\n derivedFrom: layer.documentId,\n originalSha256,\n layerSha256,\n modeRequested: options.mode,\n modeApplied,\n ...(modeApplied !== options.mode ? { modeChangedBecause: 'redactions-present' as const } : {}),\n frozenAt: now,\n frozenBy: options.author,\n pages: built.pages,\n ...(built.dpi === undefined ? {} : { dpi: built.dpi }),\n counts: countKinds(marks),\n redactions: summariseRedactions(redactions),\n }\n\n setProvenance(built.doc, provenance)\n return { bytes: await built.doc.save(), provenance, warnings }\n}\n\nfunction countKinds(marks: Annotation[]): Record<AnnotationKind, number> {\n const counts = Object.fromEntries(KINDS.map((k) => [k, 0])) as Record<AnnotationKind, number>\n for (const a of marks) counts[a.kind]++\n return counts\n}\n\nfunction summariseRedactions(redactions: Annotation[]): FreezeProvenance['redactions'] {\n const reasons: Record<string, number> = {}\n const pages = new Set<number>()\n for (const r of redactions) {\n if (r.kind !== 'redaction') continue\n pages.add(r.page)\n reasons[r.reason] = (reasons[r.reason] ?? 0) + 1\n }\n return { count: redactions.length, pages: [...pages].sort((a, b) => a - b), reasons }\n}\n\nfunction checkPages(marks: Annotation[], pages: number) {\n for (const a of marks) {\n if (a.page > pages) {\n throw new FreezeError(\n 'page-out-of-range',\n `mark ${a.id} is on page ${a.page}; the document has ${pages}`\n )\n }\n }\n}\n\nfunction checkAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Freeze aborted', 'AbortError')\n}\n\n/** Load a PDF for editing, turning pdf-lib's failures into the one FreezeError the UI shows. */\nexport async function loadPdfDocument(bytes: Uint8Array): Promise<PDFDocument> {\n try {\n return await PDFDocument.load(bytes)\n } catch (error) {\n // pdf-lib is compiled to ES5, where a subclass of Error loses its prototype, so `instanceof`\n // can be false for its own EncryptedPDFError; its message is the dependable signal.\n if (\n error instanceof EncryptedPDFError ||\n /is encrypted/i.test((error as Error)?.message ?? '')\n ) {\n throw new FreezeError('encrypted', ENCRYPTED_MESSAGE)\n }\n throw new FreezeError('invalid-pdf', `The PDF could not be read: ${(error as Error).message}`)\n }\n}\n\nasync function freezeAsVector(\n original: Uint8Array,\n marks: Annotation[],\n comments: NonNullable<FreezeOptions['comments']>,\n now: string,\n warnings: string[]\n) {\n const doc = await loadPdfDocument(original)\n const pages = doc.getPages()\n checkPages(marks, pages.length)\n\n const ctx = await createVectorContext(doc, marks, comments)\n for (const a of marks) drawVectorMark(pages[a.page - 1], a, ctx)\n\n if (comments === 'appendix') {\n const first = pages[0] ? displayedSize(pageGeometry(pages[0])) : undefined\n const size: [number, number] = first ? [first.width, first.height] : FALLBACK_PAGE\n appendCommentAppendix(\n ctx,\n marks.filter((a): a is CommentAnnotation => a.kind === 'comment'),\n size\n )\n }\n reportReplaced(ctx.sanitiser, warnings)\n doc.setProducer('ARBI')\n doc.setModificationDate(new Date(now))\n return { doc, pages: pages.length }\n}\n\nasync function freezeAsImage(\n marks: Annotation[],\n options: FreezeOptions,\n comments: NonNullable<FreezeOptions['comments']>,\n dpi: number,\n now: string,\n warnings: string[]\n) {\n const rasterizer = options.rasterizer\n if (!rasterizer) {\n throw new FreezeError('rasterizer-required', 'Image freeze needs a page rasterizer')\n }\n try {\n checkPages(marks, rasterizer.numPages)\n const out = await PDFDocument.create()\n // A fresh document: nothing from the original (title, author, XMP, attachments) is carried over.\n out.setProducer('ARBI')\n out.setCreator('ARBI')\n out.setCreationDate(new Date(now))\n out.setModificationDate(new Date(now))\n\n const numbers = numberComments(marks)\n const format = options.imageFormat ?? 'jpeg'\n const quality = options.jpegQuality ?? DEFAULT_JPEG_QUALITY\n const burn = {\n paddingPt: options.redactionPaddingPt ?? DEFAULT_REDACTION_PADDING_PT,\n labels: options.redactionLabels ?? true,\n comments,\n numbers,\n images: await stampImages(marks),\n }\n const ocrFont = options.ocr ? await out.embedFont(StandardFonts.Helvetica) : undefined\n const ocrSanitiser = ocrFont ? new TextSanitiser(ocrFont) : undefined\n\n let lowestDpi = dpi\n let firstSize: [number, number] | undefined\n for (let n = 1; n <= rasterizer.numPages; n++) {\n checkAborted(options.signal)\n const page = await rasterizer.renderPage(n, dpi)\n try {\n burnMarks(\n page,\n marks.filter((a) => a.page === n),\n burn\n )\n const bytes = await page.encode(format, quality)\n const image = format === 'png' ? await out.embedPng(bytes) : await out.embedJpg(bytes)\n const outPage = out.addPage([page.widthPt, page.heightPt])\n outPage.drawImage(image, { x: 0, y: 0, width: page.widthPt, height: page.heightPt })\n lowestDpi = Math.min(lowestDpi, page.dpi)\n firstSize ??= [page.widthPt, page.heightPt]\n\n if (options.ocr && ocrFont && ocrSanitiser) {\n const words = await options.ocr({\n pageNumber: n,\n bytes,\n format,\n widthPx: page.widthPx,\n heightPx: page.heightPx,\n })\n drawInvisibleText(outPage, words, page.widthPt, page.heightPt, ocrFont, ocrSanitiser)\n }\n } finally {\n page.release()\n }\n options.onProgress?.(n, rasterizer.numPages)\n }\n\n if (comments === 'appendix') {\n const ctx = await createVectorContext(out, marks, comments)\n appendCommentAppendix(\n ctx,\n marks.filter((a): a is CommentAnnotation => a.kind === 'comment'),\n firstSize ?? FALLBACK_PAGE\n )\n reportReplaced(ctx.sanitiser, warnings)\n }\n return { doc: out, pages: rasterizer.numPages, dpi: Math.round(lowestDpi) }\n } finally {\n await rasterizer.destroy()\n }\n}\n\n/** Invisible words over the burned image, so the page is searchable without the redacted text. */\nfunction drawInvisibleText(\n page: ReturnType<PDFDocument['addPage']>,\n words: OcrWord[],\n widthPt: number,\n heightPt: number,\n font: Awaited<ReturnType<PDFDocument['embedFont']>>,\n sanitiser: TextSanitiser\n) {\n for (const w of words) {\n if (!w.text || !sanitiser.supports(w.text)) continue\n const size = Math.max(1, w.h * heightPt * 0.8)\n page.drawText(w.text, {\n x: w.x * widthPt,\n y: heightPt - (w.y + w.h) * heightPt,\n size,\n font,\n color: rgb(0, 0, 0),\n opacity: 0,\n })\n }\n}\n\nfunction reportReplaced(sanitiser: TextSanitiser, warnings: string[]) {\n if (sanitiser.replaced.size > 0) {\n warnings.push(\n `${sanitiser.replaced.size} character(s) in comments cannot be drawn by the built-in font and were replaced with \"?\"`\n )\n }\n}\n\nfunction setProvenance(doc: PDFDocument, provenance: FreezeProvenance) {\n // The info dictionary exists once any metadata setter has run (both builders call one).\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('set' in info)) throw new Error('document has no info dictionary')\n ;(info as unknown as { set(k: PDFName, v: PDFHexString): void }).set(\n PDFName.of(PROVENANCE_KEY),\n PDFHexString.fromText(JSON.stringify(provenance))\n )\n}\n\n/** Read the provenance record back out of a frozen PDF, or null if it has none. */\nexport async function readProvenance(bytes: Uint8Array): Promise<FreezeProvenance | null> {\n const doc = await PDFDocument.load(bytes)\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('get' in info)) return null\n const value = (info as unknown as { get(k: PDFName): unknown }).get(PDFName.of(PROVENANCE_KEY))\n if (!(value instanceof PDFHexString)) return null\n return JSON.parse(value.decodeText()) as FreezeProvenance\n}\n\n/** The picture stamps' images, decoded for drawing onto rendered pages (none where unsupported). */\nasync function stampImages(marks: Annotation[]) {\n const out = new Map<string, ImageBitmap>()\n if (typeof createImageBitmap !== 'function') return out\n for (const a of marks) {\n if (a.kind !== 'stamp' || !a.image) continue\n const raw = atob(a.image)\n const bytes = new Uint8Array(raw.length)\n for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i)\n out.set(a.id, await createImageBitmap(new Blob([bytes], { type: 'image/png' })))\n }\n return out\n}\n","/**\n * Page stamps for a production set: a Bates label and an optional QR code. Both are drawn as\n * plain vector content on a white plate, in the DISPLAYED frame, so cropped and rotated pages come\n * out upright. They are added to a document that is already frozen: nothing here can bring back\n * content a redaction removed.\n */\n\nimport qrcode from 'qrcode-generator'\nimport { PDFFont, PDFPage, degrees, rgb } from 'pdf-lib'\nimport { displayedSize, displayedToUser, normToUserRect, type PageGeometry } from './coords'\nimport { pageGeometry } from './vector'\nimport { FreezeError } from './types'\n\nexport type StampCorner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\nexport interface BatesOptions {\n /** Text before the number, e.g. `ACME-`. Plain characters a standard font can draw. */\n prefix?: string\n /** First number. Default 1. */\n start?: number\n /** Zero-pad the number to this many digits. Default 6. */\n digits?: number\n corner?: StampCorner\n}\n\nexport const EDGE_MARGIN_PT = 18\nconst BATES_FONT_SIZE_PT = 9\nexport const QR_SIZE_PT = 56\nconst QR_QUIET_MODULES = 2\nconst PLATE_PADDING_PT = 2\n\nexport function batesLabel(options: BatesOptions, index: number): string {\n const digits = options.digits ?? 6\n const number = String(Math.floor((options.start ?? 1) + index)).padStart(digits, '0')\n return `${options.prefix ?? ''}${number}`\n}\n\nexport function validateBates(options: BatesOptions) {\n const { start = 1, digits = 6 } = options\n if (!Number.isInteger(start) || start < 0) {\n throw new FreezeError('invalid-option', 'Bates start must be a whole number, 0 or more')\n }\n if (!Number.isInteger(digits) || digits < 1 || digits > 12) {\n throw new FreezeError('invalid-option', 'Bates digits must be a whole number from 1 to 12')\n }\n}\n\n/** Top-left of a `w` x `h` plate in displayed points for a corner. */\nfunction plateOrigin(\n g: PageGeometry,\n corner: StampCorner,\n w: number,\n h: number\n): { x: number; y: number } {\n const size = displayedSize(g)\n return {\n x: corner.endsWith('left') ? EDGE_MARGIN_PT : size.width - EDGE_MARGIN_PT - w,\n y: corner.startsWith('top') ? EDGE_MARGIN_PT : size.height - EDGE_MARGIN_PT - h,\n }\n}\n\nfunction drawPlate(\n page: PDFPage,\n g: PageGeometry,\n box: { x: number; y: number; w: number; h: number }\n) {\n const size = displayedSize(g)\n const u = normToUserRect(g, {\n x: box.x / size.width,\n y: box.y / size.height,\n w: box.w / size.width,\n h: box.h / size.height,\n })\n page.drawRectangle({ x: u.x, y: u.y, width: u.width, height: u.height, color: rgb(1, 1, 1) })\n}\n\n/** Draw `label` in `corner` of the displayed page. */\nexport function drawBatesLabel(\n page: PDFPage,\n label: string,\n font: PDFFont,\n corner: StampCorner\n): void {\n const g = pageGeometry(page)\n const textWidth = font.widthOfTextAtSize(label, BATES_FONT_SIZE_PT)\n const w = textWidth + PLATE_PADDING_PT * 2\n const h = BATES_FONT_SIZE_PT + PLATE_PADDING_PT * 2\n const { x, y } = plateOrigin(g, corner, w, h)\n drawPlate(page, g, { x, y, w, h })\n const origin = displayedToUser(\n g,\n x + PLATE_PADDING_PT,\n y + PLATE_PADDING_PT + BATES_FONT_SIZE_PT * 0.8\n )\n page.drawText(label, {\n x: origin.x,\n y: origin.y,\n size: BATES_FONT_SIZE_PT,\n font,\n color: rgb(0, 0, 0),\n rotate: degrees(g.rotation),\n })\n}\n\nexport interface QrMatrix {\n modules: number\n isDark(row: number, col: number): boolean\n}\n\n/** Encode `text` as a QR code (byte mode, error correction M). */\nexport function buildQr(text: string): QrMatrix {\n try {\n const qr = qrcode(0, 'M')\n qr.addData(text, 'Byte')\n qr.make()\n return { modules: qr.getModuleCount(), isDark: (r, c) => qr.isDark(r, c) }\n } catch (error) {\n throw new FreezeError(\n 'invalid-option',\n `The QR link could not be encoded: ${(error as Error).message}`\n )\n }\n}\n\n/** Draw `qr` as filled squares (one per run of dark modules) on a white plate in `corner`. */\nexport function drawQr(page: PDFPage, qr: QrMatrix, corner: StampCorner): void {\n const g = pageGeometry(page)\n const total = qr.modules + QR_QUIET_MODULES * 2\n const module = QR_SIZE_PT / total\n const { x, y } = plateOrigin(g, corner, QR_SIZE_PT, QR_SIZE_PT)\n drawPlate(page, g, { x, y, w: QR_SIZE_PT, h: QR_SIZE_PT })\n const size = displayedSize(g)\n for (let row = 0; row < qr.modules; row++) {\n let col = 0\n while (col < qr.modules) {\n if (!qr.isDark(row, col)) {\n col++\n continue\n }\n const startCol = col\n while (col < qr.modules && qr.isDark(row, col)) col++\n const u = normToUserRect(g, {\n x: (x + (QR_QUIET_MODULES + startCol) * module) / size.width,\n y: (y + (QR_QUIET_MODULES + row) * module) / size.height,\n w: ((col - startCol) * module) / size.width,\n h: module / size.height,\n })\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: rgb(0, 0, 0),\n })\n }\n }\n}\n","/**\n * The index (cover) page of a production: every document in numbering order with its Bates range\n * and page count. Plain vector text, so it is searchable; it carries no Bates label of its own.\n */\n\nimport { PDFDocument, StandardFonts, rgb, type PDFFont, type PDFPage } from 'pdf-lib'\nimport { TextSanitiser, wrap } from './vector'\n\nexport interface IndexEntry {\n name: string\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface IndexPageOptions {\n /** Page size in points; defaults to A4. */\n size?: [number, number]\n /** ISO timestamp printed as the production date. */\n producedAt: string\n producedBy?: string\n}\n\nconst A4: [number, number] = [595.28, 841.89]\nconst MARGIN = 54\nconst LINE = 13\nconst TEXT = rgb(0.1, 0.1, 0.1)\nconst MUTED = rgb(0.4, 0.4, 0.4)\n\n/**\n * Insert the index as the first page(s) of `doc` (more than one when the list is long). Returns the\n * number of pages inserted.\n */\nexport async function insertIndexPages(\n doc: PDFDocument,\n entries: IndexEntry[],\n options: IndexPageOptions\n): Promise<number> {\n const regular = await doc.embedFont(StandardFonts.Helvetica)\n const bold = await doc.embedFont(StandardFonts.HelveticaBold)\n const sanitiser = new TextSanitiser(regular)\n const [width, height] = options.size ?? A4\n const columns = {\n number: MARGIN,\n name: MARGIN + 28,\n range: width - MARGIN - 190,\n pages: width - MARGIN - 30,\n }\n const nameWidth = columns.range - columns.name - 12\n\n let inserted = 0\n let page: PDFPage\n let y = 0\n const newPage = () => {\n page = doc.insertPage(inserted++, [width, height])\n y = height - MARGIN\n }\n const text = (value: string, x: number, font: PDFFont, size: number, color = TEXT) =>\n page.drawText(sanitiser.clean(value), { x, y: y - size, size, font, color })\n const header = () => {\n text('#', columns.number, bold, 9, MUTED)\n text('Document', columns.name, bold, 9, MUTED)\n text('Bates range', columns.range, bold, 9, MUTED)\n text('Pages', columns.pages, bold, 9, MUTED)\n y -= LINE + 4\n }\n\n newPage()\n text('Production index', MARGIN, bold, 16)\n y -= 24\n const first = entries[0]?.firstLabel\n const last = entries[entries.length - 1]?.lastLabel\n const total = entries.reduce((n, e) => n + e.pages, 0)\n const summary = [\n `${entries.length} document${entries.length === 1 ? '' : 's'}, ${total} page${total === 1 ? '' : 's'}`,\n first && last ? `${first} to ${last}` : '',\n `produced ${options.producedAt.slice(0, 10)}`,\n options.producedBy ? `by ${options.producedBy}` : '',\n ]\n .filter(Boolean)\n .join(', ')\n text(summary, MARGIN, regular, 10, MUTED)\n y -= LINE + 10\n header()\n\n const rangeWidth = columns.pages - columns.range - 8\n entries.forEach((entry, i) => {\n const lines = wrap(regular, sanitiser.clean(entry.name), 10, nameWidth)\n const single =\n entry.firstLabel === entry.lastLabel\n ? entry.firstLabel\n : `${entry.firstLabel} - ${entry.lastLabel}`\n // A long prefix does not fit on one line: first label, then the last below it.\n const range =\n regular.widthOfTextAtSize(sanitiser.clean(single), 10) <= rangeWidth\n ? [single]\n : [`${entry.firstLabel} -`, entry.lastLabel]\n const rows = Math.max(lines.length, range.length)\n if (y - rows * LINE < MARGIN) {\n newPage()\n header()\n }\n const top = y\n text(String(i + 1), columns.number, regular, 10)\n text(String(entry.pages), columns.pages, regular, 10)\n range.forEach((line, n) => {\n y = top - n * LINE\n text(line, columns.range, regular, 10)\n })\n lines.forEach((line, n) => {\n y = top - n * LINE\n text(line, columns.name, regular, 10)\n })\n y = top - rows * LINE - 4\n })\n return inserted\n}\n","/**\n * Production bundle: take documents that are ALREADY frozen (or never needed freezing) and number\n * them consecutively with a Bates label, optionally adding a QR code that links back to the\n * document in ARBI.\n *\n * `merged` joins the documents into one PDF; `per-document` keeps one PDF each. Either way the\n * numbering runs on across the whole set in the order given, so a label is unique within the\n * production. Splitting a document is deliberately not part of this.\n *\n * `indexPage` adds an index first (every document with its Bates range): the first page(s) of a\n * merged file, or an `index.pdf` of its own ahead of the per-document files. It is not numbered.\n */\n\nimport { PDFDocument, PDFHexString, PDFName, StandardFonts } from 'pdf-lib'\nimport { loadPdfDocument, readProvenance } from './freeze'\nimport {\n batesLabel,\n buildQr,\n drawBatesLabel,\n drawQr,\n validateBates,\n type BatesOptions,\n type StampCorner,\n} from './stamp'\nimport { insertIndexPages } from './index-page'\nimport { FreezeError, type FreezeProvenance } from './types'\nimport { TextSanitiser } from './vector'\n\nconst BUNDLE_KEY = 'ArbiBundle'\nconst DEFAULT_QR_CORNER: StampCorner = 'bottom-left'\nconst DEFAULT_BATES_CORNER: StampCorner = 'bottom-right'\n\nexport type BundleLayout = 'merged' | 'per-document'\n\nexport interface BundleItem {\n /** Shown in the index and used to name the output file. */\n name: string\n /** External id of the document this PDF represents. */\n documentId: string\n /** PDF bytes, normally the output of `freezePdf`. */\n bytes: Uint8Array\n /** What the QR code opens. Required for every item when `qr` is on. */\n qrUrl?: string\n}\n\nexport interface BundleOptions {\n layout: BundleLayout\n bates: BatesOptions\n /** Add a QR code (to each item's `qrUrl`) on every page. Default false. */\n qr?: boolean\n qrCorner?: StampCorner\n /** Name of the merged file. Default `production.pdf`. */\n mergedName?: string\n /** Put an index page (documents and Bates ranges) at the start. Default false. */\n indexPage?: boolean\n /** ISO timestamp; defaults to now. Injectable for deterministic tests. */\n now?: string\n /** Who produced the set; recorded in a merged file's metadata. */\n author?: string\n onProgress?: (done: number, total: number) => void\n signal?: AbortSignal\n}\n\nexport interface BundleIndexEntry {\n documentId: string\n name: string\n /** The output file that holds this document. */\n file: string\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleFile {\n name: string\n bytes: Uint8Array\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleResult {\n files: BundleFile[]\n index: BundleIndexEntry[]\n /** Index pages added at the start (0 without `indexPage`). */\n indexPages: number\n}\n\nfunction checkAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Bundle aborted', 'AbortError')\n}\n\nfunction outputName(name: string, used: Set<string>): string {\n const base =\n (name\n .replace(/\\.pdf$/i, '')\n .replace(/[\\\\/:*?\"<>|]+/g, '_')\n .trim() || 'document') + '.pdf'\n let candidate = base\n for (let n = 2; used.has(candidate); n++) candidate = base.replace(/\\.pdf$/, `-${n}.pdf`)\n used.add(candidate)\n return candidate\n}\n\nfunction validate(items: BundleItem[], options: BundleOptions) {\n if (items.length === 0)\n throw new FreezeError('invalid-option', 'A bundle needs at least one document')\n validateBates(options.bates)\n if (options.qr) {\n const missing = items.find((i) => !i.qrUrl)\n if (missing) {\n throw new FreezeError('invalid-option', `\"${missing.name}\" has no link for its QR code`)\n }\n }\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n if (options.qr && (options.qrCorner ?? DEFAULT_QR_CORNER) === corner) {\n throw new FreezeError(\n 'invalid-option',\n 'The Bates label and the QR code need different corners'\n )\n }\n}\n\n/** Stamp the pages of `doc`, item by item, numbering from `firstIndex`. */\nasync function stampPages(\n doc: PDFDocument,\n items: { pages: number; qrUrl?: string }[],\n firstIndex: number,\n options: BundleOptions\n): Promise<void> {\n const font = await doc.embedFont(StandardFonts.Helvetica)\n const sanitiser = new TextSanitiser(font)\n const label = batesLabel(options.bates, firstIndex)\n if (!sanitiser.supports(label)) {\n throw new FreezeError(\n 'unsupported-text',\n `Bates prefix \"${options.bates.prefix}\" uses characters the built-in font cannot draw`\n )\n }\n const pages = doc.getPages()\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n let at = 0\n for (const item of items) {\n const qr = options.qr && item.qrUrl ? buildQr(item.qrUrl) : undefined\n for (let p = 0; p < item.pages; p++, at++) {\n const page = pages[at]\n drawBatesLabel(page, batesLabel(options.bates, firstIndex + at), font, corner)\n if (qr) drawQr(page, qr, options.qrCorner ?? DEFAULT_QR_CORNER)\n }\n }\n}\n\nfunction setBundleRecord(doc: PDFDocument, record: unknown) {\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('set' in info)) return\n ;(info as unknown as { set(k: PDFName, v: PDFHexString): void }).set(\n PDFName.of(BUNDLE_KEY),\n PDFHexString.fromText(JSON.stringify(record))\n )\n}\n\nexport async function buildBundle(\n items: BundleItem[],\n options: BundleOptions\n): Promise<BundleResult> {\n validate(items, options)\n const now = options.now ?? new Date().toISOString()\n const used = new Set<string>()\n const files: BundleFile[] = []\n const index: BundleIndexEntry[] = []\n\n // Load everything first: a bad PDF fails the whole set before any output exists.\n const loaded: { item: BundleItem; doc: PDFDocument; pages: number }[] = []\n for (const item of items) {\n checkAborted(options.signal)\n const doc = await loadPdfDocument(item.bytes)\n loaded.push({ item, doc, pages: doc.getPageCount() })\n }\n\n if (options.layout === 'merged') {\n const out = await PDFDocument.create()\n out.setProducer('ARBI')\n out.setCreator('ARBI')\n out.setCreationDate(new Date(now))\n out.setModificationDate(new Date(now))\n const provenance: Record<string, FreezeProvenance | null> = {}\n for (const { item, doc } of loaded) {\n checkAborted(options.signal)\n for (const page of await out.copyPages(doc, doc.getPageIndices())) out.addPage(page)\n provenance[item.documentId] = await readProvenance(item.bytes).catch(() => null)\n }\n await stampPages(\n out,\n loaded.map(({ item, pages }) => ({ pages, qrUrl: item.qrUrl })),\n 0,\n options\n )\n\n const file = outputName(options.mergedName ?? 'production.pdf', used)\n let first = 0\n for (const { item, pages } of loaded) {\n index.push({\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n })\n first += pages\n }\n const indexPages = options.indexPage\n ? await insertIndexPages(out, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n : 0\n setBundleRecord(out, {\n schema: 1,\n producedAt: now,\n ...(indexPages ? { indexPages } : {}),\n ...(options.author ? { producedBy: options.author } : {}),\n layout: 'merged',\n items: index.map((e) => ({\n documentId: e.documentId,\n name: e.name,\n pages: e.pages,\n firstLabel: e.firstLabel,\n lastLabel: e.lastLabel,\n frozen: provenance[e.documentId] ?? null,\n })),\n })\n const total = first\n files.push({\n name: file,\n bytes: await out.save(),\n pages: total + indexPages,\n firstLabel: batesLabel(options.bates, 0),\n lastLabel: batesLabel(options.bates, total - 1),\n })\n options.onProgress?.(loaded.length, loaded.length)\n return { files, index, indexPages }\n }\n\n let first = 0\n for (const [n, { item, doc, pages }] of loaded.entries()) {\n checkAborted(options.signal)\n await stampPages(doc, [{ pages, qrUrl: item.qrUrl }], first, options)\n doc.setModificationDate(new Date(now))\n const file = outputName(item.name, used)\n const entry: BundleIndexEntry = {\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n }\n index.push(entry)\n files.push({\n name: file,\n bytes: await doc.save(),\n pages,\n firstLabel: entry.firstLabel,\n lastLabel: entry.lastLabel,\n })\n first += pages\n options.onProgress?.(n + 1, loaded.length)\n }\n if (!options.indexPage) return { files, index, indexPages: 0 }\n const cover = await PDFDocument.create()\n cover.setProducer('ARBI')\n cover.setCreator('ARBI')\n cover.setCreationDate(new Date(now))\n const indexPages = await insertIndexPages(cover, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n files.unshift({\n name: outputName('index.pdf', used),\n bytes: await cover.save(),\n pages: indexPages,\n firstLabel: '',\n lastLabel: '',\n })\n return { files, index, indexPages }\n}\n\n/** The displayed size of a document's first page, for an index page that matches it. */\nfunction pageSize(doc: PDFDocument): [number, number] {\n const page = doc.getPage(0)\n const { width, height } = page.getSize()\n const turned = page.getRotation().angle % 180 !== 0\n return turned ? [height, width] : [width, height]\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/annotations/freeze/coords.ts","../src/annotations/freeze/hash.ts","../src/annotations/freeze/types.ts","../src/annotations/freeze/vector.ts","../src/annotations/freeze/raster.ts","../src/annotations/freeze/freeze.ts","../src/annotations/freeze/stamp.ts","../src/annotations/freeze/index-page.ts","../src/annotations/freeze/bundle.ts"],"names":["rgb","StandardFonts","BlendMode","degrees","u","pageSize","canvas","ctx","installPdfjsPolyfills","isEffectiveRedaction","parseLayer","PDFDocument","EncryptedPDFError","PDFName","PDFHexString","qrcode","checkAborted","first","indexPages"],"mappings":"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","file":"chunk-PC4O3JDV.cjs","sourcesContent":["/**\n * Mapping between the DISPLAYED page (what a viewer shows: crop box, then /Rotate) and the PDF's\n * unrotated user space (origin bottom-left of the media box, points). Marks are stored in the\n * displayed frame; this is the only place that knows how to leave it.\n */\n\nimport type { NormRect } from '../model'\n\nexport type PageRotation = 0 | 90 | 180 | 270\n\n/** The visible box of a page in user space, plus its /Rotate. */\nexport interface PageGeometry {\n /** Crop box origin and size in user-space points. */\n x: number\n y: number\n width: number\n height: number\n rotation: PageRotation\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport interface UserRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport function normaliseRotation(angle: number): PageRotation {\n const a = (((Math.round(angle / 90) * 90) % 360) + 360) % 360\n return a as PageRotation\n}\n\n/** Size of the page as displayed, in points (width and height swap at 90/270). */\nexport function displayedSize(g: PageGeometry): { width: number; height: number } {\n return g.rotation === 90 || g.rotation === 270\n ? { width: g.height, height: g.width }\n : { width: g.width, height: g.height }\n}\n\n/** A point given in displayed points from the top-left, as a user-space point. */\nexport function displayedToUser(g: PageGeometry, dx: number, dy: number): Point {\n switch (g.rotation) {\n case 0:\n return { x: g.x + dx, y: g.y + g.height - dy }\n case 90:\n return { x: g.x + dy, y: g.y + dx }\n case 180:\n return { x: g.x + g.width - dx, y: g.y + dy }\n case 270:\n return { x: g.x + g.width - dy, y: g.y + g.height - dx }\n }\n}\n\n/** The user-space bounding box of a normalised displayed rectangle. */\nexport function normToUserRect(g: PageGeometry, r: NormRect): UserRect {\n const size = displayedSize(g)\n const a = displayedToUser(g, r.x * size.width, r.y * size.height)\n const b = displayedToUser(g, (r.x + r.w) * size.width, (r.y + r.h) * size.height)\n return {\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n width: Math.abs(b.x - a.x),\n height: Math.abs(b.y - a.y),\n }\n}\n","import type { AnnotationLayer } from '../model'\n\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n // Copy into a plain ArrayBuffer: `bytes` may be a view over a larger or shared buffer.\n const copy = new Uint8Array(bytes.byteLength)\n copy.set(bytes)\n const digest = await globalThis.crypto.subtle.digest('SHA-256', copy.buffer)\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/** JSON with object keys sorted, so equal data always hashes equally. */\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`\n }\n return JSON.stringify(value)\n}\n\n/** The layer as hashed for provenance: the text under redactions is dropped first. */\nfunction layerFingerprint(layer: AnnotationLayer): unknown {\n return {\n ...layer,\n annotations: layer.annotations.map((a) => {\n // `text: undefined` is dropped by canonicalJson, so the text never reaches the hash.\n return a.kind === 'redaction' ? { ...a, text: undefined } : a\n }),\n }\n}\n\nexport const hashLayer = (layer: AnnotationLayer) =>\n sha256Hex(new TextEncoder().encode(canonicalJson(layerFingerprint(layer))))\n","import type { AnnotationKind } from '../model'\n\n/**\n * `vector` draws marks into the original pages and keeps the text. `image` rasterises every page\n * with the marks burned in, so nothing sits behind a redaction. A layer with redactions is always\n * frozen as `image`.\n */\nexport type FreezeMode = 'vector' | 'image'\n\n/** What happens to comments: leave them out, draw numbered markers, or markers plus a listing. */\nexport type CommentOutput = 'omit' | 'markers' | 'appendix'\n\n/** A word recognised on a burned page, in fractions of the displayed page (top-left origin). */\nexport interface OcrWord {\n text: string\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface OcrInput {\n pageNumber: number\n bytes: Uint8Array\n format: 'jpeg' | 'png'\n widthPx: number\n heightPx: number\n}\n\n/** One page drawn on a canvas, ready for marks to be burned in and the result encoded. */\nexport interface RenderedPage {\n widthPt: number\n heightPt: number\n widthPx: number\n heightPx: number\n /** Resolution actually used; lower than requested when the page was too large. */\n dpi: number\n ctx: CanvasRenderingContext2D\n encode(format: 'jpeg' | 'png', quality: number): Promise<Uint8Array>\n release(): void\n}\n\nexport interface PageRasterizer {\n numPages: number\n /** Render `pageNumber` (1-based) at `dpi`. The caller must `release()` the result. */\n renderPage(pageNumber: number, dpi: number): Promise<RenderedPage>\n destroy(): Promise<void> | void\n}\n\nexport interface FreezeOptions {\n mode: FreezeMode\n /** Who is freezing; recorded in the provenance. */\n author: string\n /** ISO timestamp; defaults to now. Injectable for deterministic tests. */\n now?: string\n /**\n * Redaction marks nobody has approved or rejected. `error` (default) refuses to freeze, so an\n * unreviewed mark cannot slip through; `burn` redacts them anyway (the safe direction).\n */\n pendingRedactions?: 'error' | 'burn'\n comments?: CommentOutput\n /** Image mode only. Default 200. Lowered automatically for very large pages. */\n dpi?: number\n imageFormat?: 'jpeg' | 'png'\n jpegQuality?: number\n /** Extra margin burned around each redaction rectangle, in points. Default 1.5. */\n redactionPaddingPt?: number\n /** Print the reason on each redaction box. Default true. */\n redactionLabels?: boolean\n /** Required for image mode: renders pages onto canvases. */\n rasterizer?: PageRasterizer\n /** Optional: recognise text on the burned pages and add it as an invisible layer. */\n ocr?: (input: OcrInput) => Promise<OcrWord[]>\n onProgress?: (done: number, total: number) => void\n signal?: AbortSignal\n}\n\nexport interface FreezeProvenance {\n schema: 1\n /** External id of the immutable original this copy was derived from. */\n derivedFrom: string\n originalSha256: string\n /** Hash of the layer snapshot, computed WITHOUT the text under redactions. */\n layerSha256: string\n modeRequested: FreezeMode\n modeApplied: FreezeMode\n modeChangedBecause?: 'redactions-present'\n frozenAt: string\n frozenBy: string\n pages: number\n dpi?: number\n counts: Record<AnnotationKind, number>\n /** Counts and reasons only. The redacted text is never recorded here. */\n redactions: { count: number; pages: number[]; reasons: Record<string, number> }\n}\n\nexport interface FreezeResult {\n bytes: Uint8Array\n provenance: FreezeProvenance\n /** Things the caller should surface, e.g. characters a built-in font could not draw. */\n warnings: string[]\n}\n\nexport type FreezeErrorCode =\n | 'pending-redactions'\n | 'rasterizer-required'\n | 'page-out-of-range'\n | 'unsupported-text'\n | 'invalid-pdf'\n | 'encrypted'\n | 'invalid-option'\n\n/** Said identically wherever a password-protected source is met, so the user sees one message. */\nexport const ENCRYPTED_MESSAGE =\n 'This PDF is password-protected, so a copy cannot be frozen from it. Remove the protection first.'\n\nexport class FreezeError extends Error {\n readonly code: FreezeErrorCode\n constructor(code: FreezeErrorCode, message: string) {\n super(message)\n this.name = 'FreezeError'\n this.code = code\n }\n}\n","/**\n * Vector freeze: draw marks into the original pages with pdf-lib. Text, fonts and structure stay,\n * so the result is still searchable. Never used for redactions (see `freeze.ts`).\n */\n\nimport {\n BlendMode,\n PDFDocument,\n PDFFont,\n PDFPage,\n type PDFImage,\n StandardFonts,\n degrees,\n rgb,\n type Color,\n} from 'pdf-lib'\nimport type {\n Annotation,\n BoxAnnotation,\n CommentAnnotation,\n HighlightAnnotation,\n StampAnnotation,\n} from '../model'\nimport {\n displayedSize,\n displayedToUser,\n normToUserRect,\n normaliseRotation,\n type PageGeometry,\n} from './coords'\nimport { FreezeError } from './types'\n\nexport const HIGHLIGHT_OPACITY = 0.7\nexport const MARKER_SIZE_PT = 12\nconst MARKER_COLOR = '#ffd43b'\nconst MARKER_BORDER = '#7a5c00'\nconst CAP_HEIGHT = 0.72\n\nexport function hexToRgb(hex: string): Color {\n const n = parseInt(hex.slice(1), 16)\n return rgb(((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255)\n}\n\n/** The page as a viewer displays it: crop box clipped to the media box, then /Rotate. */\nexport function pageGeometry(page: PDFPage): PageGeometry {\n const media = page.getMediaBox()\n const crop = page.getCropBox()\n const x1 = Math.max(media.x, crop.x)\n const y1 = Math.max(media.y, crop.y)\n const x2 = Math.min(media.x + media.width, crop.x + crop.width)\n const y2 = Math.min(media.y + media.height, crop.y + crop.height)\n const usable = x2 > x1 && y2 > y1\n return {\n x: usable ? x1 : media.x,\n y: usable ? y1 : media.y,\n width: usable ? x2 - x1 : media.width,\n height: usable ? y2 - y1 : media.height,\n rotation: normaliseRotation(page.getRotation().angle),\n }\n}\n\n/** Number comments in reading order (page, then top to bottom, then left to right). */\nexport function numberComments(marks: Annotation[]): Map<string, number> {\n const comments = marks\n .filter((a): a is CommentAnnotation => a.kind === 'comment')\n .sort(\n (a, b) =>\n a.page - b.page || a.rect.y - b.rect.y || a.rect.x - b.rect.x || (a.id < b.id ? -1 : 1)\n )\n return new Map(comments.map((c, i) => [c.id, i + 1]))\n}\n\n/** Characters a standard font can draw. Anything else is replaced and reported. */\nexport class TextSanitiser {\n private readonly supported: Set<number>\n readonly replaced = new Set<string>()\n constructor(font: PDFFont) {\n this.supported = new Set(font.getCharacterSet())\n }\n clean(text: string): string {\n let out = ''\n for (const ch of text) {\n const cp = ch.codePointAt(0)!\n if (this.supported.has(cp)) out += ch\n else {\n out += '?'\n this.replaced.add(ch)\n }\n }\n return out\n }\n supports(text: string): boolean {\n for (const ch of text) if (!this.supported.has(ch.codePointAt(0)!)) return false\n return true\n }\n}\n\nexport interface VectorContext {\n doc: PDFDocument\n regular: PDFFont\n bold: PDFFont\n numbers: Map<string, number>\n comments: 'omit' | 'markers' | 'appendix'\n sanitiser: TextSanitiser\n /** The picture stamps' images, embedded once, by mark id. */\n images: Map<string, PDFImage>\n}\n\nexport async function createVectorContext(\n doc: PDFDocument,\n marks: Annotation[],\n comments: VectorContext['comments']\n): Promise<VectorContext> {\n const regular = await doc.embedFont(StandardFonts.Helvetica)\n const bold = await doc.embedFont(StandardFonts.HelveticaBold)\n const images = new Map<string, PDFImage>()\n for (const a of marks)\n if (a.kind === 'stamp' && a.image) images.set(a.id, await doc.embedPng(a.image))\n return {\n doc,\n images,\n regular,\n bold,\n numbers: numberComments(marks),\n comments,\n sanitiser: new TextSanitiser(regular),\n }\n}\n\nfunction drawHighlight(page: PDFPage, g: PageGeometry, a: HighlightAnnotation) {\n for (const r of a.rects) {\n const u = normToUserRect(g, r)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: hexToRgb(a.color),\n opacity: HIGHLIGHT_OPACITY,\n blendMode: BlendMode.Multiply,\n })\n }\n}\n\nfunction drawBox(page: PDFPage, g: PageGeometry, a: BoxAnnotation) {\n const u = normToUserRect(g, a.rect)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n borderColor: hexToRgb(a.color),\n borderWidth: a.strokeWidth,\n borderOpacity: 1,\n opacity: 0,\n })\n}\n\n/** Font size that fits `text` inside a displayed box, capped by the box height. */\nfunction fitFontSize(font: PDFFont, text: string, widthPt: number, heightPt: number): number {\n const probe = font.widthOfTextAtSize(text || ' ', 100)\n const byWidth = probe > 0 ? (widthPt * 0.9 * 100) / probe : heightPt\n return Math.max(1, Math.min(heightPt * 0.6, byWidth))\n}\n\nfunction drawCentredText(\n page: PDFPage,\n g: PageGeometry,\n font: PDFFont,\n text: string,\n box: { x: number; y: number; w: number; h: number },\n size: number,\n color: Color\n) {\n const textWidth = font.widthOfTextAtSize(text, size)\n const dx = box.x + (box.w - textWidth) / 2\n const dy = box.y + box.h / 2 + (size * CAP_HEIGHT) / 2\n const origin = displayedToUser(g, dx, dy)\n page.drawText(text, { x: origin.x, y: origin.y, size, font, color, rotate: degrees(g.rotation) })\n}\n\nfunction drawStamp(page: PDFPage, g: PageGeometry, a: StampAnnotation, ctx: VectorContext) {\n const picture = ctx.images.get(a.id)\n if (picture) {\n // The picture as large as fits the box, in its proportions, centred.\n const u = normToUserRect(g, a.rect)\n const scale = Math.min(u.width / picture.width, u.height / picture.height)\n const w = picture.width * scale\n const h = picture.height * scale\n page.drawImage(picture, {\n x: u.x + (u.width - w) / 2,\n y: u.y + (u.height - h) / 2,\n width: w,\n height: h,\n })\n return\n }\n if (!ctx.sanitiser.supports(a.label)) {\n throw new FreezeError(\n 'unsupported-text',\n `Stamp \"${a.label}\" uses characters a vector stamp cannot draw; freeze as an image instead`\n )\n }\n const u = normToUserRect(g, a.rect)\n const color = hexToRgb(a.color)\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n borderColor: color,\n borderWidth: 2,\n opacity: 0,\n borderOpacity: 1,\n })\n const size = displayedSize(g)\n const box = {\n x: a.rect.x * size.width,\n y: a.rect.y * size.height,\n w: a.rect.w * size.width,\n h: a.rect.h * size.height,\n }\n const fontSize = fitFontSize(ctx.bold, a.label, box.w, box.h)\n drawCentredText(page, g, ctx.bold, a.label, box, fontSize, color)\n}\n\nfunction drawCommentMarker(\n page: PDFPage,\n g: PageGeometry,\n a: CommentAnnotation,\n ctx: VectorContext\n) {\n const n = ctx.numbers.get(a.id)\n if (n === undefined) return\n const size = displayedSize(g)\n const box = {\n x: Math.min(a.rect.x * size.width, size.width - MARKER_SIZE_PT),\n y: Math.min(a.rect.y * size.height, size.height - MARKER_SIZE_PT),\n w: MARKER_SIZE_PT,\n h: MARKER_SIZE_PT,\n }\n const u = normToUserRect(g, {\n x: box.x / size.width,\n y: box.y / size.height,\n w: box.w / size.width,\n h: box.h / size.height,\n })\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: hexToRgb(MARKER_COLOR),\n borderColor: hexToRgb(MARKER_BORDER),\n borderWidth: 0.75,\n })\n drawCentredText(page, g, ctx.bold, String(n), box, 7, hexToRgb(MARKER_BORDER))\n}\n\n/** Draw one non-redaction mark onto its page. */\nexport function drawVectorMark(page: PDFPage, a: Annotation, ctx: VectorContext) {\n const g = pageGeometry(page)\n switch (a.kind) {\n case 'highlight':\n return drawHighlight(page, g, a)\n case 'box':\n return drawBox(page, g, a)\n case 'stamp':\n return drawStamp(page, g, a, ctx)\n case 'comment':\n return ctx.comments === 'omit' ? undefined : drawCommentMarker(page, g, a, ctx)\n case 'redaction':\n throw new Error('redactions are never drawn as vectors')\n }\n}\n\nexport function wrap(font: PDFFont, text: string, size: number, maxWidth: number): string[] {\n const lines: string[] = []\n for (const paragraph of text.split(/\\r?\\n/)) {\n let line = ''\n for (const word of paragraph.split(/\\s+/).filter(Boolean)) {\n const candidate = line ? `${line} ${word}` : word\n if (font.widthOfTextAtSize(candidate, size) <= maxWidth || !line) line = candidate\n else {\n lines.push(line)\n line = word\n }\n }\n lines.push(line)\n }\n return lines\n}\n\n/** Append pages listing every comment and reply, numbered to match the markers. */\nexport function appendCommentAppendix(\n ctx: VectorContext,\n comments: CommentAnnotation[],\n pageSize: [number, number]\n) {\n if (comments.length === 0) return\n const { doc, regular, bold, sanitiser } = ctx\n const margin = 54\n const lineHeight = 13\n const maxWidth = pageSize[0] - margin * 2\n let page = doc.addPage(pageSize)\n let y = pageSize[1] - margin\n const ensure = (needed: number) => {\n if (y - needed < margin) {\n page = doc.addPage(pageSize)\n y = pageSize[1] - margin\n }\n }\n const line = (text: string, font: PDFFont, size: number, indent = 0) => {\n ensure(lineHeight)\n page.drawText(sanitiser.clean(text), {\n x: margin + indent,\n y: y - size,\n size,\n font,\n color: rgb(0.1, 0.1, 0.1),\n })\n y -= lineHeight\n }\n\n line('Comments', bold, 14)\n y -= 6\n const ordered = [...comments].sort(\n (a, b) => (ctx.numbers.get(a.id) ?? 0) - (ctx.numbers.get(b.id) ?? 0)\n )\n for (const c of ordered) {\n ensure(lineHeight * 3)\n line(\n `[${ctx.numbers.get(c.id)}] Page ${c.page} - ${c.author}${c.resolved ? ' (resolved)' : ''}`,\n bold,\n 10\n )\n for (const l of wrap(regular, sanitiser.clean(c.body), 10, maxWidth - 12))\n line(l, regular, 10, 12)\n for (const r of c.replies) {\n line(`${r.author}:`, bold, 9, 24)\n for (const l of wrap(regular, sanitiser.clean(r.body), 9, maxWidth - 36))\n line(l, regular, 9, 36)\n }\n y -= 8\n }\n}\n","/**\n * Image-only freeze: render each page onto a canvas, burn the marks into the pixels, and encode.\n * Once a redaction rectangle is painted black the original pixels are gone, and the rebuilt PDF\n * has no text layer, so nothing sits behind the box.\n */\n\nimport type { Annotation, CommentAnnotation } from '../model'\nimport { isEffectiveRedaction } from '../model'\nimport { installPdfjsPolyfills } from '../../viewers/pdfjs-polyfills'\nimport { HIGHLIGHT_OPACITY, MARKER_SIZE_PT } from './vector'\nimport {\n ENCRYPTED_MESSAGE,\n FreezeError,\n type CommentOutput,\n type PageRasterizer,\n type RenderedPage,\n} from './types'\n\n/** A canvas the freeze code can draw on, produced by the host's environment. */\nexport interface CanvasHandle {\n canvas: unknown\n ctx: CanvasRenderingContext2D\n encode(format: 'jpeg' | 'png', quality: number): Promise<Uint8Array>\n release(): void\n}\nexport type CanvasFactory = (width: number, height: number) => CanvasHandle\n\n/** Pages beyond this many pixels are rendered at a lower DPI (mobile Safari fails near 16.7M). */\nexport const MAX_PAGE_PIXELS = 36_000_000\nconst MARKER_FILL = '#ffd43b'\nconst MARKER_INK = '#7a5c00'\n\nexport function browserCanvasFactory(): CanvasFactory {\n return (width, height) => {\n if (typeof OffscreenCanvas !== 'undefined') {\n const canvas = new OffscreenCanvas(width, height)\n const ctx = canvas.getContext('2d') as unknown as CanvasRenderingContext2D\n return {\n canvas,\n ctx,\n async encode(format, quality) {\n const blob = await canvas.convertToBlob({ type: `image/${format}`, quality })\n return new Uint8Array(await blob.arrayBuffer())\n },\n release() {\n canvas.width = 0\n canvas.height = 0\n },\n }\n }\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D\n return {\n canvas,\n ctx,\n encode(format, quality) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) return reject(new Error('canvas could not be encoded'))\n void blob.arrayBuffer().then((buf) => resolve(new Uint8Array(buf)), reject)\n },\n `image/${format}`,\n quality\n )\n })\n },\n release() {\n canvas.width = 0\n canvas.height = 0\n },\n }\n }\n}\n\ninterface PdfJsViewport {\n width: number\n height: number\n}\ninterface PdfJsPage {\n getViewport(options: { scale: number }): PdfJsViewport\n render(params: {\n canvasContext: CanvasRenderingContext2D\n canvas: unknown\n viewport: PdfJsViewport\n }): { promise: Promise<void> }\n cleanup(): void\n}\ninterface PdfJsDocument {\n numPages: number\n getPage(n: number): Promise<PdfJsPage>\n}\ninterface PdfJsLoadingTask {\n promise: Promise<PdfJsDocument>\n /** pdf.js 6 removed `PDFDocumentProxy.destroy()`; the loading task owns teardown. */\n destroy(): Promise<void>\n}\n/** The slice of `pdfjs-dist` the rasteriser needs, so the host decides which build to pass. */\nexport interface PdfJsModule {\n getDocument(source: Record<string, unknown>): PdfJsLoadingTask\n}\n\nexport interface PdfJsRasterizerOptions {\n password?: string\n /** Extra `getDocument` options: cMapUrl, standardFontDataUrl, wasmUrl... */\n documentOptions?: Record<string, unknown>\n}\n\nexport async function createPdfJsRasterizer(\n pdfjs: PdfJsModule,\n data: Uint8Array,\n canvases: CanvasFactory,\n options: PdfJsRasterizerOptions = {}\n): Promise<PageRasterizer> {\n installPdfjsPolyfills()\n // pdf.js takes ownership of the buffer, so hand it a copy and keep the caller's bytes intact.\n const task = pdfjs.getDocument({\n data: data.slice(),\n password: options.password,\n ...options.documentOptions,\n })\n let doc: PdfJsDocument\n try {\n doc = await task.promise\n } catch (error) {\n await task.destroy().catch(() => {})\n if ((error as { name?: string })?.name === 'PasswordException') {\n throw new FreezeError('encrypted', ENCRYPTED_MESSAGE)\n }\n throw error\n }\n\n return {\n numPages: doc.numPages,\n async renderPage(pageNumber, dpi): Promise<RenderedPage> {\n const page = await doc.getPage(pageNumber)\n try {\n const base = page.getViewport({ scale: 1 })\n let scale = dpi / 72\n const pixels = base.width * scale * (base.height * scale)\n if (pixels > MAX_PAGE_PIXELS) scale *= Math.sqrt(MAX_PAGE_PIXELS / pixels)\n const viewport = page.getViewport({ scale })\n const widthPx = Math.max(1, Math.ceil(viewport.width))\n const heightPx = Math.max(1, Math.ceil(viewport.height))\n const handle = canvases(widthPx, heightPx)\n handle.ctx.fillStyle = '#ffffff'\n handle.ctx.fillRect(0, 0, widthPx, heightPx)\n await page.render({ canvasContext: handle.ctx, canvas: handle.canvas, viewport }).promise\n return {\n widthPt: base.width,\n heightPt: base.height,\n widthPx,\n heightPx,\n dpi: scale * 72,\n ctx: handle.ctx,\n encode: handle.encode,\n release: handle.release,\n }\n } finally {\n page.cleanup()\n }\n },\n destroy: () => task.destroy(),\n }\n}\n\nexport interface BurnOptions {\n /** Margin added around each redaction rectangle, in points. */\n paddingPt: number\n labels: boolean\n comments: CommentOutput\n numbers: Map<string, number>\n /** Picture stamps' images, decoded, by mark id (a stamp without one draws its label). */\n images?: Map<string, CanvasImageSource & { width: number; height: number }>\n}\n\n/** Paint every mark for one page onto its rendered pixels. Redactions go last, on top. */\nexport function burnMarks(page: RenderedPage, marks: Annotation[], options: BurnOptions) {\n const { ctx } = page\n const w = page.widthPx\n const h = page.heightPx\n const pxPerPt = page.widthPx / page.widthPt\n\n ctx.save()\n for (const a of marks) {\n if (a.kind === 'highlight') {\n ctx.globalCompositeOperation = 'multiply'\n ctx.globalAlpha = HIGHLIGHT_OPACITY\n ctx.fillStyle = a.color\n for (const r of a.rects) ctx.fillRect(r.x * w, r.y * h, r.w * w, r.h * h)\n ctx.globalCompositeOperation = 'source-over'\n ctx.globalAlpha = 1\n }\n }\n for (const a of marks) {\n if (a.kind === 'box') {\n ctx.strokeStyle = a.color\n ctx.lineWidth = a.strokeWidth * pxPerPt\n ctx.strokeRect(a.rect.x * w, a.rect.y * h, a.rect.w * w, a.rect.h * h)\n } else if (a.kind === 'stamp' && options.images?.get(a.id)) {\n const picture = options.images.get(a.id)!\n const box = { x: a.rect.x * w, y: a.rect.y * h, w: a.rect.w * w, h: a.rect.h * h }\n const scale = Math.min(box.w / picture.width, box.h / picture.height)\n const dw = picture.width * scale\n const dh = picture.height * scale\n ctx.drawImage(picture, box.x + (box.w - dw) / 2, box.y + (box.h - dh) / 2, dw, dh)\n } else if (a.kind === 'stamp') {\n drawStampOnCanvas(\n ctx,\n a.label,\n a.color,\n { x: a.rect.x * w, y: a.rect.y * h, w: a.rect.w * w, h: a.rect.h * h },\n pxPerPt\n )\n } else if (a.kind === 'comment' && options.comments !== 'omit') {\n drawMarkerOnCanvas(ctx, a, options.numbers.get(a.id), w, h, pxPerPt)\n }\n }\n for (const a of marks) {\n if (!isEffectiveRedaction(a)) continue\n const pad = options.paddingPt * pxPerPt\n a.rects.forEach((r, i) => {\n // Floor/ceil so anti-aliased edge pixels are covered rather than left half-grey.\n const x0 = Math.max(0, Math.floor(r.x * w - pad))\n const y0 = Math.max(0, Math.floor(r.y * h - pad))\n const x1 = Math.min(w, Math.ceil((r.x + r.w) * w + pad))\n const y1 = Math.min(h, Math.ceil((r.y + r.h) * h + pad))\n ctx.fillStyle = '#000000'\n ctx.fillRect(x0, y0, x1 - x0, y1 - y0)\n if (options.labels && i === 0)\n drawLabel(ctx, '[REDACTED]', { x: x0, y: y0, w: x1 - x0, h: y1 - y0 })\n })\n }\n ctx.restore()\n}\n\nfunction drawStampOnCanvas(\n ctx: CanvasRenderingContext2D,\n label: string,\n color: string,\n box: { x: number; y: number; w: number; h: number },\n pxPerPt: number\n) {\n ctx.strokeStyle = color\n ctx.lineWidth = 2 * pxPerPt\n ctx.strokeRect(box.x, box.y, box.w, box.h)\n ctx.fillStyle = color\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = 'bold 100px Helvetica, Arial, sans-serif'\n const probe = ctx.measureText(label).width\n const size = Math.max(1, Math.min(box.h * 0.6, probe > 0 ? (box.w * 0.9 * 100) / probe : box.h))\n ctx.font = `bold ${size}px Helvetica, Arial, sans-serif`\n ctx.fillText(label, box.x + box.w / 2, box.y + box.h / 2)\n}\n\nfunction drawMarkerOnCanvas(\n ctx: CanvasRenderingContext2D,\n a: CommentAnnotation,\n n: number | undefined,\n w: number,\n h: number,\n pxPerPt: number\n) {\n if (n === undefined) return\n const size = MARKER_SIZE_PT * pxPerPt\n const x = Math.min(a.rect.x * w, w - size)\n const y = Math.min(a.rect.y * h, h - size)\n ctx.fillStyle = MARKER_FILL\n ctx.fillRect(x, y, size, size)\n ctx.strokeStyle = MARKER_INK\n ctx.lineWidth = 0.75 * pxPerPt\n ctx.strokeRect(x, y, size, size)\n ctx.fillStyle = MARKER_INK\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = `bold ${7 * pxPerPt}px Helvetica, Arial, sans-serif`\n ctx.fillText(String(n), x + size / 2, y + size / 2)\n}\n\n/** Print the redaction reason in white on the black box, only when it fits legibly. */\nfunction drawLabel(\n ctx: CanvasRenderingContext2D,\n text: string,\n box: { x: number; y: number; w: number; h: number }\n) {\n const size = Math.min(box.h * 0.7, 14)\n if (size < 6) return\n ctx.font = `${size}px Helvetica, Arial, sans-serif`\n const width = ctx.measureText(text).width\n if (width > box.w - 4) return\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, box.x + box.w / 2, box.y + box.h / 2)\n}\n","/**\n * Freeze: derive a NEW document from an immutable original plus its annotation layer.\n *\n * - `vector`: marks are drawn into the original pages; text stays searchable.\n * - `image`: every page is rasterised with the marks burned in and the PDF is rebuilt from the\n * images alone. Required whenever a redaction applies, because only a rebuild leaves nothing\n * behind the box: no text, no metadata, no annotations, no attachments, no old revisions.\n *\n * The layer itself is never embedded. The output carries a provenance record (counts and reasons,\n * never the redacted text).\n */\n\nimport { EncryptedPDFError, PDFDocument, PDFHexString, PDFName, StandardFonts, rgb } from 'pdf-lib'\nimport {\n isEffectiveRedaction,\n parseLayer,\n type Annotation,\n type AnnotationKind,\n type AnnotationLayer,\n type CommentAnnotation,\n} from '../model'\nimport { displayedSize } from './coords'\nimport { hashLayer, sha256Hex } from './hash'\nimport { burnMarks } from './raster'\nimport {\n ENCRYPTED_MESSAGE,\n FreezeError,\n type FreezeMode,\n type FreezeOptions,\n type FreezeProvenance,\n type FreezeResult,\n type OcrWord,\n} from './types'\nimport {\n TextSanitiser,\n appendCommentAppendix,\n createVectorContext,\n drawVectorMark,\n numberComments,\n pageGeometry,\n} from './vector'\n\nexport const DEFAULT_DPI = 200\nconst DEFAULT_JPEG_QUALITY = 0.92\nconst DEFAULT_REDACTION_PADDING_PT = 1.5\nconst MIN_DPI = 72\nconst MAX_DPI = 600\nconst FALLBACK_PAGE: [number, number] = [595.28, 841.89]\nconst PROVENANCE_KEY = 'ArbiProvenance'\n\nconst KINDS: AnnotationKind[] = ['highlight', 'box', 'comment', 'stamp', 'redaction']\n\nexport async function freezePdf(\n original: Uint8Array,\n rawLayer: AnnotationLayer,\n options: FreezeOptions\n): Promise<FreezeResult> {\n // The layer may have come from storage or an agent: validate before anything is drawn.\n const layer = parseLayer(rawLayer)\n const now = options.now ?? new Date().toISOString()\n const comments = options.comments ?? 'omit'\n const dpi = options.dpi ?? DEFAULT_DPI\n if (!(dpi >= MIN_DPI && dpi <= MAX_DPI)) {\n throw new FreezeError('invalid-option', `dpi must be between ${MIN_DPI} and ${MAX_DPI}`)\n }\n\n const redactions = layer.annotations.filter(isEffectiveRedaction)\n const pending = redactions.filter((r) => r.status === 'pending')\n if (pending.length > 0 && (options.pendingRedactions ?? 'error') === 'error') {\n throw new FreezeError(\n 'pending-redactions',\n `${pending.length} redaction mark(s) have not been approved or rejected`\n )\n }\n\n // Rejected redactions are dropped; every other mark is applied.\n const marks = layer.annotations.filter((a) => a.kind !== 'redaction' || isEffectiveRedaction(a))\n const modeApplied: FreezeMode = redactions.length > 0 ? 'image' : options.mode\n\n const [originalSha256, layerSha256] = await Promise.all([sha256Hex(original), hashLayer(layer)])\n const warnings: string[] = []\n if (redactions.length > 0 && comments !== 'omit' && marks.some((a) => a.kind === 'comment')) {\n warnings.push(\n 'Comments are included in a document with redactions and may repeat redacted text'\n )\n }\n\n let built: { doc: PDFDocument; pages: number; dpi?: number }\n if (modeApplied === 'image') {\n built = await freezeAsImage(marks, options, comments, dpi, now, warnings)\n } else {\n built = await freezeAsVector(original, marks, comments, now, warnings)\n }\n\n const provenance: FreezeProvenance = {\n schema: 1,\n derivedFrom: layer.documentId,\n originalSha256,\n layerSha256,\n modeRequested: options.mode,\n modeApplied,\n ...(modeApplied !== options.mode ? { modeChangedBecause: 'redactions-present' as const } : {}),\n frozenAt: now,\n frozenBy: options.author,\n pages: built.pages,\n ...(built.dpi === undefined ? {} : { dpi: built.dpi }),\n counts: countKinds(marks),\n redactions: summariseRedactions(redactions),\n }\n\n setProvenance(built.doc, provenance)\n return { bytes: await built.doc.save(), provenance, warnings }\n}\n\nfunction countKinds(marks: Annotation[]): Record<AnnotationKind, number> {\n const counts = Object.fromEntries(KINDS.map((k) => [k, 0])) as Record<AnnotationKind, number>\n for (const a of marks) counts[a.kind]++\n return counts\n}\n\nfunction summariseRedactions(redactions: Annotation[]): FreezeProvenance['redactions'] {\n const reasons: Record<string, number> = {}\n const pages = new Set<number>()\n for (const r of redactions) {\n if (r.kind !== 'redaction') continue\n pages.add(r.page)\n reasons[r.reason] = (reasons[r.reason] ?? 0) + 1\n }\n return { count: redactions.length, pages: [...pages].sort((a, b) => a - b), reasons }\n}\n\nfunction checkPages(marks: Annotation[], pages: number) {\n for (const a of marks) {\n if (a.page > pages) {\n throw new FreezeError(\n 'page-out-of-range',\n `mark ${a.id} is on page ${a.page}; the document has ${pages}`\n )\n }\n }\n}\n\nfunction checkAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Freeze aborted', 'AbortError')\n}\n\n/** Load a PDF for editing, turning pdf-lib's failures into the one FreezeError the UI shows. */\nexport async function loadPdfDocument(bytes: Uint8Array): Promise<PDFDocument> {\n try {\n return await PDFDocument.load(bytes)\n } catch (error) {\n // pdf-lib is compiled to ES5, where a subclass of Error loses its prototype, so `instanceof`\n // can be false for its own EncryptedPDFError; its message is the dependable signal.\n if (\n error instanceof EncryptedPDFError ||\n /is encrypted/i.test((error as Error)?.message ?? '')\n ) {\n throw new FreezeError('encrypted', ENCRYPTED_MESSAGE)\n }\n throw new FreezeError('invalid-pdf', `The PDF could not be read: ${(error as Error).message}`)\n }\n}\n\nasync function freezeAsVector(\n original: Uint8Array,\n marks: Annotation[],\n comments: NonNullable<FreezeOptions['comments']>,\n now: string,\n warnings: string[]\n) {\n const doc = await loadPdfDocument(original)\n const pages = doc.getPages()\n checkPages(marks, pages.length)\n\n const ctx = await createVectorContext(doc, marks, comments)\n for (const a of marks) drawVectorMark(pages[a.page - 1], a, ctx)\n\n if (comments === 'appendix') {\n const first = pages[0] ? displayedSize(pageGeometry(pages[0])) : undefined\n const size: [number, number] = first ? [first.width, first.height] : FALLBACK_PAGE\n appendCommentAppendix(\n ctx,\n marks.filter((a): a is CommentAnnotation => a.kind === 'comment'),\n size\n )\n }\n reportReplaced(ctx.sanitiser, warnings)\n doc.setProducer('ARBI')\n doc.setModificationDate(new Date(now))\n return { doc, pages: pages.length }\n}\n\nasync function freezeAsImage(\n marks: Annotation[],\n options: FreezeOptions,\n comments: NonNullable<FreezeOptions['comments']>,\n dpi: number,\n now: string,\n warnings: string[]\n) {\n const rasterizer = options.rasterizer\n if (!rasterizer) {\n throw new FreezeError('rasterizer-required', 'Image freeze needs a page rasterizer')\n }\n try {\n checkPages(marks, rasterizer.numPages)\n const out = await PDFDocument.create()\n // A fresh document: nothing from the original (title, author, XMP, attachments) is carried over.\n out.setProducer('ARBI')\n out.setCreator('ARBI')\n out.setCreationDate(new Date(now))\n out.setModificationDate(new Date(now))\n\n const numbers = numberComments(marks)\n const format = options.imageFormat ?? 'jpeg'\n const quality = options.jpegQuality ?? DEFAULT_JPEG_QUALITY\n const burn = {\n paddingPt: options.redactionPaddingPt ?? DEFAULT_REDACTION_PADDING_PT,\n labels: options.redactionLabels ?? true,\n comments,\n numbers,\n images: await stampImages(marks),\n }\n const ocrFont = options.ocr ? await out.embedFont(StandardFonts.Helvetica) : undefined\n const ocrSanitiser = ocrFont ? new TextSanitiser(ocrFont) : undefined\n\n let lowestDpi = dpi\n let firstSize: [number, number] | undefined\n for (let n = 1; n <= rasterizer.numPages; n++) {\n checkAborted(options.signal)\n const page = await rasterizer.renderPage(n, dpi)\n try {\n burnMarks(\n page,\n marks.filter((a) => a.page === n),\n burn\n )\n const bytes = await page.encode(format, quality)\n const image = format === 'png' ? await out.embedPng(bytes) : await out.embedJpg(bytes)\n const outPage = out.addPage([page.widthPt, page.heightPt])\n outPage.drawImage(image, { x: 0, y: 0, width: page.widthPt, height: page.heightPt })\n lowestDpi = Math.min(lowestDpi, page.dpi)\n firstSize ??= [page.widthPt, page.heightPt]\n\n if (options.ocr && ocrFont && ocrSanitiser) {\n const words = await options.ocr({\n pageNumber: n,\n bytes,\n format,\n widthPx: page.widthPx,\n heightPx: page.heightPx,\n })\n drawInvisibleText(outPage, words, page.widthPt, page.heightPt, ocrFont, ocrSanitiser)\n }\n } finally {\n page.release()\n }\n options.onProgress?.(n, rasterizer.numPages)\n }\n\n if (comments === 'appendix') {\n const ctx = await createVectorContext(out, marks, comments)\n appendCommentAppendix(\n ctx,\n marks.filter((a): a is CommentAnnotation => a.kind === 'comment'),\n firstSize ?? FALLBACK_PAGE\n )\n reportReplaced(ctx.sanitiser, warnings)\n }\n return { doc: out, pages: rasterizer.numPages, dpi: Math.round(lowestDpi) }\n } finally {\n await rasterizer.destroy()\n }\n}\n\n/** Invisible words over the burned image, so the page is searchable without the redacted text. */\nfunction drawInvisibleText(\n page: ReturnType<PDFDocument['addPage']>,\n words: OcrWord[],\n widthPt: number,\n heightPt: number,\n font: Awaited<ReturnType<PDFDocument['embedFont']>>,\n sanitiser: TextSanitiser\n) {\n for (const w of words) {\n if (!w.text || !sanitiser.supports(w.text)) continue\n const size = Math.max(1, w.h * heightPt * 0.8)\n page.drawText(w.text, {\n x: w.x * widthPt,\n y: heightPt - (w.y + w.h) * heightPt,\n size,\n font,\n color: rgb(0, 0, 0),\n opacity: 0,\n })\n }\n}\n\nfunction reportReplaced(sanitiser: TextSanitiser, warnings: string[]) {\n if (sanitiser.replaced.size > 0) {\n warnings.push(\n `${sanitiser.replaced.size} character(s) in comments cannot be drawn by the built-in font and were replaced with \"?\"`\n )\n }\n}\n\nfunction setProvenance(doc: PDFDocument, provenance: FreezeProvenance) {\n // The info dictionary exists once any metadata setter has run (both builders call one).\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('set' in info)) throw new Error('document has no info dictionary')\n ;(info as unknown as { set(k: PDFName, v: PDFHexString): void }).set(\n PDFName.of(PROVENANCE_KEY),\n PDFHexString.fromText(JSON.stringify(provenance))\n )\n}\n\n/** Read the provenance record back out of a frozen PDF, or null if it has none. */\nexport async function readProvenance(bytes: Uint8Array): Promise<FreezeProvenance | null> {\n const doc = await PDFDocument.load(bytes)\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('get' in info)) return null\n const value = (info as unknown as { get(k: PDFName): unknown }).get(PDFName.of(PROVENANCE_KEY))\n if (!(value instanceof PDFHexString)) return null\n return JSON.parse(value.decodeText()) as FreezeProvenance\n}\n\n/** The picture stamps' images, decoded for drawing onto rendered pages (none where unsupported). */\nasync function stampImages(marks: Annotation[]) {\n const out = new Map<string, ImageBitmap>()\n if (typeof createImageBitmap !== 'function') return out\n for (const a of marks) {\n if (a.kind !== 'stamp' || !a.image) continue\n const raw = atob(a.image)\n const bytes = new Uint8Array(raw.length)\n for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i)\n out.set(a.id, await createImageBitmap(new Blob([bytes], { type: 'image/png' })))\n }\n return out\n}\n","/**\n * Page stamps for a production set: a Bates label and an optional QR code. Both are drawn as\n * plain vector content on a white plate, in the DISPLAYED frame, so cropped and rotated pages come\n * out upright. They are added to a document that is already frozen: nothing here can bring back\n * content a redaction removed.\n */\n\nimport qrcode from 'qrcode-generator'\nimport { PDFFont, PDFPage, degrees, rgb } from 'pdf-lib'\nimport { displayedSize, displayedToUser, normToUserRect, type PageGeometry } from './coords'\nimport { pageGeometry } from './vector'\nimport { FreezeError } from './types'\n\nexport type StampCorner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\nexport interface BatesOptions {\n /** Text before the number, e.g. `ACME-`. Plain characters a standard font can draw. */\n prefix?: string\n /** First number. Default 1. */\n start?: number\n /** Zero-pad the number to this many digits. Default 6. */\n digits?: number\n corner?: StampCorner\n}\n\nexport const EDGE_MARGIN_PT = 18\nconst BATES_FONT_SIZE_PT = 9\nexport const QR_SIZE_PT = 56\nconst QR_QUIET_MODULES = 2\nconst PLATE_PADDING_PT = 2\n\nexport function batesLabel(options: BatesOptions, index: number): string {\n const digits = options.digits ?? 6\n const number = String(Math.floor((options.start ?? 1) + index)).padStart(digits, '0')\n return `${options.prefix ?? ''}${number}`\n}\n\nexport function validateBates(options: BatesOptions) {\n const { start = 1, digits = 6 } = options\n if (!Number.isInteger(start) || start < 0) {\n throw new FreezeError('invalid-option', 'Bates start must be a whole number, 0 or more')\n }\n if (!Number.isInteger(digits) || digits < 1 || digits > 12) {\n throw new FreezeError('invalid-option', 'Bates digits must be a whole number from 1 to 12')\n }\n}\n\n/** Top-left of a `w` x `h` plate in displayed points for a corner. */\nfunction plateOrigin(\n g: PageGeometry,\n corner: StampCorner,\n w: number,\n h: number\n): { x: number; y: number } {\n const size = displayedSize(g)\n return {\n x: corner.endsWith('left') ? EDGE_MARGIN_PT : size.width - EDGE_MARGIN_PT - w,\n y: corner.startsWith('top') ? EDGE_MARGIN_PT : size.height - EDGE_MARGIN_PT - h,\n }\n}\n\nfunction drawPlate(\n page: PDFPage,\n g: PageGeometry,\n box: { x: number; y: number; w: number; h: number }\n) {\n const size = displayedSize(g)\n const u = normToUserRect(g, {\n x: box.x / size.width,\n y: box.y / size.height,\n w: box.w / size.width,\n h: box.h / size.height,\n })\n page.drawRectangle({ x: u.x, y: u.y, width: u.width, height: u.height, color: rgb(1, 1, 1) })\n}\n\n/** Draw `label` in `corner` of the displayed page. */\nexport function drawBatesLabel(\n page: PDFPage,\n label: string,\n font: PDFFont,\n corner: StampCorner\n): void {\n const g = pageGeometry(page)\n const textWidth = font.widthOfTextAtSize(label, BATES_FONT_SIZE_PT)\n const w = textWidth + PLATE_PADDING_PT * 2\n const h = BATES_FONT_SIZE_PT + PLATE_PADDING_PT * 2\n const { x, y } = plateOrigin(g, corner, w, h)\n drawPlate(page, g, { x, y, w, h })\n const origin = displayedToUser(\n g,\n x + PLATE_PADDING_PT,\n y + PLATE_PADDING_PT + BATES_FONT_SIZE_PT * 0.8\n )\n page.drawText(label, {\n x: origin.x,\n y: origin.y,\n size: BATES_FONT_SIZE_PT,\n font,\n color: rgb(0, 0, 0),\n rotate: degrees(g.rotation),\n })\n}\n\nexport interface QrMatrix {\n modules: number\n isDark(row: number, col: number): boolean\n}\n\n/** Encode `text` as a QR code (byte mode, error correction M). */\nexport function buildQr(text: string): QrMatrix {\n try {\n const qr = qrcode(0, 'M')\n qr.addData(text, 'Byte')\n qr.make()\n return { modules: qr.getModuleCount(), isDark: (r, c) => qr.isDark(r, c) }\n } catch (error) {\n throw new FreezeError(\n 'invalid-option',\n `The QR link could not be encoded: ${(error as Error).message}`\n )\n }\n}\n\n/** Draw `qr` as filled squares (one per run of dark modules) on a white plate in `corner`. */\nexport function drawQr(page: PDFPage, qr: QrMatrix, corner: StampCorner): void {\n const g = pageGeometry(page)\n const total = qr.modules + QR_QUIET_MODULES * 2\n const module = QR_SIZE_PT / total\n const { x, y } = plateOrigin(g, corner, QR_SIZE_PT, QR_SIZE_PT)\n drawPlate(page, g, { x, y, w: QR_SIZE_PT, h: QR_SIZE_PT })\n const size = displayedSize(g)\n for (let row = 0; row < qr.modules; row++) {\n let col = 0\n while (col < qr.modules) {\n if (!qr.isDark(row, col)) {\n col++\n continue\n }\n const startCol = col\n while (col < qr.modules && qr.isDark(row, col)) col++\n const u = normToUserRect(g, {\n x: (x + (QR_QUIET_MODULES + startCol) * module) / size.width,\n y: (y + (QR_QUIET_MODULES + row) * module) / size.height,\n w: ((col - startCol) * module) / size.width,\n h: module / size.height,\n })\n page.drawRectangle({\n x: u.x,\n y: u.y,\n width: u.width,\n height: u.height,\n color: rgb(0, 0, 0),\n })\n }\n }\n}\n","/**\n * The index (cover) page of a production: every document in numbering order with its Bates range\n * and page count. Plain vector text, so it is searchable; it carries no Bates label of its own.\n */\n\nimport { PDFDocument, StandardFonts, rgb, type PDFFont, type PDFPage } from 'pdf-lib'\nimport { TextSanitiser, wrap } from './vector'\n\nexport interface IndexEntry {\n name: string\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface IndexPageOptions {\n /** Page size in points; defaults to A4. */\n size?: [number, number]\n /** ISO timestamp printed as the production date. */\n producedAt: string\n producedBy?: string\n}\n\nconst A4: [number, number] = [595.28, 841.89]\nconst MARGIN = 54\nconst LINE = 13\nconst TEXT = rgb(0.1, 0.1, 0.1)\nconst MUTED = rgb(0.4, 0.4, 0.4)\n\n/**\n * Insert the index as the first page(s) of `doc` (more than one when the list is long). Returns the\n * number of pages inserted.\n */\nexport async function insertIndexPages(\n doc: PDFDocument,\n entries: IndexEntry[],\n options: IndexPageOptions\n): Promise<number> {\n const regular = await doc.embedFont(StandardFonts.Helvetica)\n const bold = await doc.embedFont(StandardFonts.HelveticaBold)\n const sanitiser = new TextSanitiser(regular)\n const [width, height] = options.size ?? A4\n const columns = {\n number: MARGIN,\n name: MARGIN + 28,\n range: width - MARGIN - 190,\n pages: width - MARGIN - 30,\n }\n const nameWidth = columns.range - columns.name - 12\n\n let inserted = 0\n let page: PDFPage\n let y = 0\n const newPage = () => {\n page = doc.insertPage(inserted++, [width, height])\n y = height - MARGIN\n }\n const text = (value: string, x: number, font: PDFFont, size: number, color = TEXT) =>\n page.drawText(sanitiser.clean(value), { x, y: y - size, size, font, color })\n const header = () => {\n text('#', columns.number, bold, 9, MUTED)\n text('Document', columns.name, bold, 9, MUTED)\n text('Bates range', columns.range, bold, 9, MUTED)\n text('Pages', columns.pages, bold, 9, MUTED)\n y -= LINE + 4\n }\n\n newPage()\n text('Production index', MARGIN, bold, 16)\n y -= 24\n const first = entries[0]?.firstLabel\n const last = entries[entries.length - 1]?.lastLabel\n const total = entries.reduce((n, e) => n + e.pages, 0)\n const summary = [\n `${entries.length} document${entries.length === 1 ? '' : 's'}, ${total} page${total === 1 ? '' : 's'}`,\n first && last ? `${first} to ${last}` : '',\n `produced ${options.producedAt.slice(0, 10)}`,\n options.producedBy ? `by ${options.producedBy}` : '',\n ]\n .filter(Boolean)\n .join(', ')\n text(summary, MARGIN, regular, 10, MUTED)\n y -= LINE + 10\n header()\n\n const rangeWidth = columns.pages - columns.range - 8\n entries.forEach((entry, i) => {\n const lines = wrap(regular, sanitiser.clean(entry.name), 10, nameWidth)\n const single =\n entry.firstLabel === entry.lastLabel\n ? entry.firstLabel\n : `${entry.firstLabel} - ${entry.lastLabel}`\n // A long prefix does not fit on one line: first label, then the last below it.\n const range =\n regular.widthOfTextAtSize(sanitiser.clean(single), 10) <= rangeWidth\n ? [single]\n : [`${entry.firstLabel} -`, entry.lastLabel]\n const rows = Math.max(lines.length, range.length)\n if (y - rows * LINE < MARGIN) {\n newPage()\n header()\n }\n const top = y\n text(String(i + 1), columns.number, regular, 10)\n text(String(entry.pages), columns.pages, regular, 10)\n range.forEach((line, n) => {\n y = top - n * LINE\n text(line, columns.range, regular, 10)\n })\n lines.forEach((line, n) => {\n y = top - n * LINE\n text(line, columns.name, regular, 10)\n })\n y = top - rows * LINE - 4\n })\n return inserted\n}\n","/**\n * Production bundle: take documents that are ALREADY frozen (or never needed freezing) and number\n * them consecutively with a Bates label, optionally adding a QR code that links back to the\n * document in ARBI.\n *\n * `merged` joins the documents into one PDF; `per-document` keeps one PDF each. Either way the\n * numbering runs on across the whole set in the order given, so a label is unique within the\n * production. Splitting a document is deliberately not part of this.\n *\n * `indexPage` adds an index first (every document with its Bates range): the first page(s) of a\n * merged file, or an `index.pdf` of its own ahead of the per-document files. It is not numbered.\n */\n\nimport { PDFDocument, PDFHexString, PDFName, StandardFonts } from 'pdf-lib'\nimport { loadPdfDocument, readProvenance } from './freeze'\nimport {\n batesLabel,\n buildQr,\n drawBatesLabel,\n drawQr,\n validateBates,\n type BatesOptions,\n type StampCorner,\n} from './stamp'\nimport { insertIndexPages } from './index-page'\nimport { FreezeError, type FreezeProvenance } from './types'\nimport { TextSanitiser } from './vector'\n\nconst BUNDLE_KEY = 'ArbiBundle'\nconst DEFAULT_QR_CORNER: StampCorner = 'bottom-left'\nconst DEFAULT_BATES_CORNER: StampCorner = 'bottom-right'\n\nexport type BundleLayout = 'merged' | 'per-document'\n\nexport interface BundleItem {\n /** Shown in the index and used to name the output file. */\n name: string\n /** External id of the document this PDF represents. */\n documentId: string\n /** PDF bytes, normally the output of `freezePdf`. */\n bytes: Uint8Array\n /** What the QR code opens. Required for every item when `qr` is on. */\n qrUrl?: string\n}\n\nexport interface BundleOptions {\n layout: BundleLayout\n bates: BatesOptions\n /** Add a QR code (to each item's `qrUrl`) on every page. Default false. */\n qr?: boolean\n qrCorner?: StampCorner\n /** Name of the merged file. Default `production.pdf`. */\n mergedName?: string\n /** Put an index page (documents and Bates ranges) at the start. Default false. */\n indexPage?: boolean\n /** ISO timestamp; defaults to now. Injectable for deterministic tests. */\n now?: string\n /** Who produced the set; recorded in a merged file's metadata. */\n author?: string\n onProgress?: (done: number, total: number) => void\n signal?: AbortSignal\n}\n\nexport interface BundleIndexEntry {\n documentId: string\n name: string\n /** The output file that holds this document. */\n file: string\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleFile {\n name: string\n bytes: Uint8Array\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleResult {\n files: BundleFile[]\n index: BundleIndexEntry[]\n /** Index pages added at the start (0 without `indexPage`). */\n indexPages: number\n}\n\nfunction checkAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Bundle aborted', 'AbortError')\n}\n\nfunction outputName(name: string, used: Set<string>): string {\n const base =\n (name\n .replace(/\\.pdf$/i, '')\n .replace(/[\\\\/:*?\"<>|]+/g, '_')\n .trim() || 'document') + '.pdf'\n let candidate = base\n for (let n = 2; used.has(candidate); n++) candidate = base.replace(/\\.pdf$/, `-${n}.pdf`)\n used.add(candidate)\n return candidate\n}\n\nfunction validate(items: BundleItem[], options: BundleOptions) {\n if (items.length === 0)\n throw new FreezeError('invalid-option', 'A bundle needs at least one document')\n validateBates(options.bates)\n if (options.qr) {\n const missing = items.find((i) => !i.qrUrl)\n if (missing) {\n throw new FreezeError('invalid-option', `\"${missing.name}\" has no link for its QR code`)\n }\n }\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n if (options.qr && (options.qrCorner ?? DEFAULT_QR_CORNER) === corner) {\n throw new FreezeError(\n 'invalid-option',\n 'The Bates label and the QR code need different corners'\n )\n }\n}\n\n/** Stamp the pages of `doc`, item by item, numbering from `firstIndex`. */\nasync function stampPages(\n doc: PDFDocument,\n items: { pages: number; qrUrl?: string }[],\n firstIndex: number,\n options: BundleOptions\n): Promise<void> {\n const font = await doc.embedFont(StandardFonts.Helvetica)\n const sanitiser = new TextSanitiser(font)\n const label = batesLabel(options.bates, firstIndex)\n if (!sanitiser.supports(label)) {\n throw new FreezeError(\n 'unsupported-text',\n `Bates prefix \"${options.bates.prefix}\" uses characters the built-in font cannot draw`\n )\n }\n const pages = doc.getPages()\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n let at = 0\n for (const item of items) {\n const qr = options.qr && item.qrUrl ? buildQr(item.qrUrl) : undefined\n for (let p = 0; p < item.pages; p++, at++) {\n const page = pages[at]\n drawBatesLabel(page, batesLabel(options.bates, firstIndex + at), font, corner)\n if (qr) drawQr(page, qr, options.qrCorner ?? DEFAULT_QR_CORNER)\n }\n }\n}\n\nfunction setBundleRecord(doc: PDFDocument, record: unknown) {\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('set' in info)) return\n ;(info as unknown as { set(k: PDFName, v: PDFHexString): void }).set(\n PDFName.of(BUNDLE_KEY),\n PDFHexString.fromText(JSON.stringify(record))\n )\n}\n\nexport async function buildBundle(\n items: BundleItem[],\n options: BundleOptions\n): Promise<BundleResult> {\n validate(items, options)\n const now = options.now ?? new Date().toISOString()\n const used = new Set<string>()\n const files: BundleFile[] = []\n const index: BundleIndexEntry[] = []\n\n // Load everything first: a bad PDF fails the whole set before any output exists.\n const loaded: { item: BundleItem; doc: PDFDocument; pages: number }[] = []\n for (const item of items) {\n checkAborted(options.signal)\n const doc = await loadPdfDocument(item.bytes)\n loaded.push({ item, doc, pages: doc.getPageCount() })\n }\n\n if (options.layout === 'merged') {\n const out = await PDFDocument.create()\n out.setProducer('ARBI')\n out.setCreator('ARBI')\n out.setCreationDate(new Date(now))\n out.setModificationDate(new Date(now))\n const provenance: Record<string, FreezeProvenance | null> = {}\n for (const { item, doc } of loaded) {\n checkAborted(options.signal)\n for (const page of await out.copyPages(doc, doc.getPageIndices())) out.addPage(page)\n provenance[item.documentId] = await readProvenance(item.bytes).catch(() => null)\n }\n await stampPages(\n out,\n loaded.map(({ item, pages }) => ({ pages, qrUrl: item.qrUrl })),\n 0,\n options\n )\n\n const file = outputName(options.mergedName ?? 'production.pdf', used)\n let first = 0\n for (const { item, pages } of loaded) {\n index.push({\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n })\n first += pages\n }\n const indexPages = options.indexPage\n ? await insertIndexPages(out, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n : 0\n setBundleRecord(out, {\n schema: 1,\n producedAt: now,\n ...(indexPages ? { indexPages } : {}),\n ...(options.author ? { producedBy: options.author } : {}),\n layout: 'merged',\n items: index.map((e) => ({\n documentId: e.documentId,\n name: e.name,\n pages: e.pages,\n firstLabel: e.firstLabel,\n lastLabel: e.lastLabel,\n frozen: provenance[e.documentId] ?? null,\n })),\n })\n const total = first\n files.push({\n name: file,\n bytes: await out.save(),\n pages: total + indexPages,\n firstLabel: batesLabel(options.bates, 0),\n lastLabel: batesLabel(options.bates, total - 1),\n })\n options.onProgress?.(loaded.length, loaded.length)\n return { files, index, indexPages }\n }\n\n let first = 0\n for (const [n, { item, doc, pages }] of loaded.entries()) {\n checkAborted(options.signal)\n await stampPages(doc, [{ pages, qrUrl: item.qrUrl }], first, options)\n doc.setModificationDate(new Date(now))\n const file = outputName(item.name, used)\n const entry: BundleIndexEntry = {\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n }\n index.push(entry)\n files.push({\n name: file,\n bytes: await doc.save(),\n pages,\n firstLabel: entry.firstLabel,\n lastLabel: entry.lastLabel,\n })\n first += pages\n options.onProgress?.(n + 1, loaded.length)\n }\n if (!options.indexPage) return { files, index, indexPages: 0 }\n const cover = await PDFDocument.create()\n cover.setProducer('ARBI')\n cover.setCreator('ARBI')\n cover.setCreationDate(new Date(now))\n const indexPages = await insertIndexPages(cover, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n files.unshift({\n name: outputName('index.pdf', used),\n bytes: await cover.save(),\n pages: indexPages,\n firstLabel: '',\n lastLabel: '',\n })\n return { files, index, indexPages }\n}\n\n/** The displayed size of a document's first page, for an index page that matches it. */\nfunction pageSize(doc: PDFDocument): [number, number] {\n const page = doc.getPage(0)\n const { width, height } = page.getSize()\n const turned = page.getRotation().angle % 180 !== 0\n return turned ? [height, width] : [width, height]\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { arbiQueryKeys } from './chunk-AOEJ744V.js';
|
|
2
|
-
import { OWN_SESSION_SLOT } from './chunk-DPYBZDJB.js';
|
|
3
|
-
import { parseVersionRef } from './chunk-MZ7EYCGH.js';
|
|
4
2
|
import { useArbiHost, useArbi } from './chunk-R7YNABZY.js';
|
|
3
|
+
import { OWN_SESSION_SLOT } from './chunk-DPYBZDJB.js';
|
|
4
|
+
import { parseVersionRef } from './chunk-NNWMHMEC.js';
|
|
5
5
|
import { getUserEncryptionKeypair, sealedBoxDecrypt, sealedBoxEncrypt } from '@arbidocs/client';
|
|
6
6
|
import { useSyncExternalStore, useCallback, useMemo, useRef, useEffect } from 'react';
|
|
7
7
|
import { useQuery, useMutation, useQueryClient, useInfiniteQuery, useQueries } from '@tanstack/react-query';
|
|
@@ -1664,5 +1664,5 @@ function useUserUsageToday(options) {
|
|
|
1664
1664
|
}
|
|
1665
1665
|
|
|
1666
1666
|
export { DEFAULT_DOCUMENT_VIEWER_STATE, EMPTY_SESSION_STATE, MAX_THREAD_TABS, MIN_QUEUED_MESSAGE_VISIBILITY_MS, PROJECT_CREATION_DENIED_REASON, WORKSPACE_LAST_OPENED_KEY, WORKSPACE_STORAGE_KEY, agentControl, browserWorkspaceStorage, clearSealedDrafts, closePanelIn, conversationKey, createArbiLayoutStore, createArbiSessionStore, createArbiWorkspaceStore, createDebouncedWriter, createSealedDraftStorage, createStoragePersist, defaultLayoutState, dmTabId, flushOnPageExit, isPanelOpen, isUsageMetered, layoutActionsOf, nextViewingDocument, openPanelIn, panelPlace, parseSavedLayout, queuedMessages, readWorkspaceLastOpened, restoreLayout, savedLayoutOf, selectDraft, selectIsGenerating, selectViewingDocumentId, threadTabId, useActivity, useAgents, useArbiSession, useArbiSessionState, useArbiSessionStore, useAssistantQuery, useAvailableModels, useBoxRole, useBuiltinCommands, useCanCreateProjects, useConfig, useConfigs, useConversationThreads, useConversations, useCurrentUser, useDeleteAgents, useDocumentVersionList, useFirmPool, useHealth, useMessageDetails, useParsedDocument, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, useSessionPageTab, useSessionView, useSignedInSession, useTags, useThumbnails, useTopUpFirmPool, useTransientView, useUserUsageToday, useWorkspaceActivity, useWorkspaces };
|
|
1667
|
-
//# sourceMappingURL=chunk-
|
|
1668
|
-
//# sourceMappingURL=chunk-
|
|
1667
|
+
//# sourceMappingURL=chunk-QGOYIYLI.js.map
|
|
1668
|
+
//# sourceMappingURL=chunk-QGOYIYLI.js.map
|