nuvra 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-import-Cu3c_cO5.js","names":[],"sources":["../src/core/pdf-import/encodings.ts","../src/core/pdf-import/objects.ts","../src/core/pdf-import/fonts.ts","../src/core/pdf-import/images.ts","../src/core/pdf-import/content.ts","../src/core/pdf-import/inflate.ts","../src/core/pdf-import/filters.ts","../src/core/pdf-import/document.ts","../src/core/pdf-import/layout.ts","../src/core/pdf-import/index.ts"],"sourcesContent":["/**\n * Character encodings of simple PDF fonts: the predefined encodings, glyph names from `/Differences` mapped to\n * Unicode, and the glyph widths of the standard fonts, which PDF files may use without embedding or measuring them.\n */\n\n/** Unicode text of each code 0..255 of a simple font encoding; `''` for unused codes. */\nexport type Encoding = readonly string[];\n\n/** Decodes single bytes with a legacy code page; Latin-1 stands in where the runtime lacks the code page. */\nconst fromCodePage = (label: string): Encoding => {\n let decoder: TextDecoder | undefined;\n try {\n decoder = new TextDecoder(label);\n } catch {\n decoder = undefined;\n }\n return Array.from({ length: 256 }, (_, code) => {\n if (code < 0x20) return '';\n return decoder ? decoder.decode(Uint8Array.of(code)) : String.fromCharCode(code);\n });\n};\n\nexport const WIN_ANSI: Encoding = fromCodePage('windows-1252');\nexport const MAC_ROMAN: Encoding = fromCodePage('macintosh');\n\n/** Adobe StandardEncoding: ASCII with curly quotes, plus its own upper half. */\nexport const STANDARD: Encoding = (() => {\n const table = Array.from({ length: 256 }, (_, code) =>\n code >= 0x20 && code < 0x7f ? String.fromCharCode(code) : ''\n );\n table[0x27] = '’';\n table[0x60] = '‘';\n const upper = \"¡¢£⁄¥ƒ§¤'“«‹›fifl\\u0000–†‡·\\u0000¶•‚„”»…‰\\u0000¿\\u0000`´ˆ˜¯˘˙¨\\u0000˚¸\\u0000˝˛ˇ—\";\n for (let index = 0; index < upper.length; index += 1) {\n const character = upper[index] as string;\n if (character !== '\\u0000') table[0xa1 + index] = character;\n }\n const rest: Record<number, string> = {\n 225: 'Æ',\n 227: 'ª',\n 232: 'Ł',\n 233: 'Ø',\n 234: 'Œ',\n 235: 'º',\n 241: 'æ',\n 245: 'ı',\n 248: 'ł',\n 249: 'ø',\n 250: 'œ',\n 251: 'ß'\n };\n for (const [code, character] of Object.entries(rest)) table[Number(code)] = character;\n return table;\n})();\n\n/** Glyph names that are neither letters with accents nor `uniXXXX` forms. */\nconst NAMED_GLYPHS: Record<string, string> = {\n space: ' ',\n nbspace: ' ',\n nonbreakingspace: ' ',\n exclam: '!',\n quotedbl: '\"',\n numbersign: '#',\n dollar: '$',\n percent: '%',\n ampersand: '&',\n quotesingle: \"'\",\n parenleft: '(',\n parenright: ')',\n asterisk: '*',\n plus: '+',\n comma: ',',\n hyphen: '-',\n sfthyphen: '­',\n minus: '−',\n period: '.',\n slash: '/',\n zero: '0',\n one: '1',\n two: '2',\n three: '3',\n four: '4',\n five: '5',\n six: '6',\n seven: '7',\n eight: '8',\n nine: '9',\n colon: ':',\n semicolon: ';',\n less: '<',\n equal: '=',\n greater: '>',\n question: '?',\n at: '@',\n bracketleft: '[',\n backslash: '\\\\',\n bracketright: ']',\n asciicircum: '^',\n underscore: '_',\n grave: '`',\n braceleft: '{',\n bar: '|',\n braceright: '}',\n asciitilde: '~',\n quoteleft: '‘',\n quoteright: '’',\n quotedblleft: '“',\n quotedblright: '”',\n quotesinglbase: '‚',\n quotedblbase: '„',\n guillemotleft: '«',\n guillemotright: '»',\n guilsinglleft: '‹',\n guilsinglright: '›',\n endash: '–',\n emdash: '—',\n bullet: '•',\n ellipsis: '…',\n dagger: '†',\n daggerdbl: '‡',\n perthousand: '‰',\n trademark: '™',\n copyright: '©',\n registered: '®',\n degree: '°',\n plusminus: '±',\n multiply: '×',\n divide: '÷',\n section: '§',\n paragraph: '¶',\n periodcentered: '·',\n middot: '·',\n cent: '¢',\n sterling: '£',\n yen: '¥',\n Euro: '€',\n currency: '¤',\n brokenbar: '¦',\n dieresis: '¨',\n ordfeminine: 'ª',\n ordmasculine: 'º',\n logicalnot: '¬',\n macron: '¯',\n acute: '´',\n mu: 'µ',\n cedilla: '¸',\n onesuperior: '¹',\n twosuperior: '²',\n threesuperior: '³',\n onequarter: '¼',\n onehalf: '½',\n threequarters: '¾',\n questiondown: '¿',\n exclamdown: '¡',\n florin: 'ƒ',\n circumflex: 'ˆ',\n tilde: '˜',\n fi: 'fi',\n fl: 'fl',\n AE: 'Æ',\n ae: 'æ',\n OE: 'Œ',\n oe: 'œ',\n Oslash: 'Ø',\n oslash: 'ø',\n germandbls: 'ß',\n Eth: 'Ð',\n eth: 'ð',\n Thorn: 'Þ',\n thorn: 'þ',\n dotlessi: 'ı',\n Lslash: 'Ł',\n lslash: 'ł',\n numero: '№',\n afii61352: '№',\n // Apostrophes of Uzbek Latin (oʻ, gʻ) and their Adobe names.\n commaturnedmod: 'ʻ',\n afii57929: 'ʼ',\n afii64937: 'ʽ',\n apostrophemod: 'ʼ'\n};\n\n/** Combining marks named in accented glyph names such as `Aacute` or `gbreve`. */\nconst ACCENTS: Record<string, string> = {\n grave: '̀',\n acute: '́',\n circumflex: '̂',\n tilde: '̃',\n macron: '̄',\n breve: '̆',\n dotaccent: '̇',\n dieresis: '̈',\n ring: '̊',\n hungarumlaut: '̋',\n caron: '̌',\n commaaccent: '̦',\n cedilla: '̧',\n ogonek: '̨'\n};\n\n/** Cyrillic glyph names `afii100NN`, which do not follow Unicode order around Ё. */\nconst cyrillic = (code: number): string | undefined => {\n if (code >= 10_017 && code <= 10_049) {\n if (code === 10_023) return 'Ё';\n return String.fromCharCode(0x4_10 + code - (code < 10_023 ? 10_017 : 10_018));\n }\n if (code >= 10_065 && code <= 10_097) {\n if (code === 10_071) return 'ё';\n return String.fromCharCode(0x4_30 + code - (code < 10_071 ? 10_065 : 10_066));\n }\n if (code === 10_050) return 'Ґ';\n if (code >= 10_051 && code <= 10_061) return String.fromCharCode(0x4_02 + code - 10_051);\n if (code === 10_062) return 'Ў';\n if (code === 10_098) return 'ґ';\n if (code >= 10_099 && code <= 10_109) return String.fromCharCode(0x4_52 + code - 10_099);\n if (code === 10_110) return 'ў';\n if (code === 10_145) return 'Џ';\n if (code === 10_193) return 'џ';\n return undefined;\n};\n\nconst glyphCache = new Map<string, string | undefined>();\n\n/** Unicode text of a glyph name, or `undefined` for names that carry no meaning, such as `g42`. */\nexport const glyphToUnicode = (name: string): string | undefined => {\n if (glyphCache.has(name)) return glyphCache.get(name);\n const result = readGlyphName(name);\n glyphCache.set(name, result);\n return result;\n};\n\nconst readGlyphName = (name: string): string | undefined => {\n // Variants such as `a.sc` or `one.oldstyle` read as their base glyph; ligatures such as `f_f_i` as their parts.\n const base = name.split('.')[0] ?? '';\n if (base.includes('_')) {\n const parts = base.split('_').map(part => readGlyphName(part));\n return parts.every(Boolean) ? parts.join('') : undefined;\n }\n if (NAMED_GLYPHS[base] !== undefined) return NAMED_GLYPHS[base];\n if (/^[A-Za-z]$/.test(base)) return base;\n const uni = /^uni((?:[\\dA-F]{4})+)$/.exec(base);\n if (uni?.[1]) return (uni[1].match(/.{4}/g) ?? []).map(hex => String.fromCharCode(Number.parseInt(hex, 16))).join('');\n const u = /^u([\\dA-F]{4,6})$/.exec(base);\n if (u?.[1]) {\n const code = Number.parseInt(u[1], 16);\n return code <= 0x10_ff_ff ? String.fromCodePoint(code) : undefined;\n }\n const afii = /^afii(\\d{5})$/.exec(base);\n if (afii?.[1]) return cyrillic(Number(afii[1]));\n const accented =\n /^([A-Za-z])(grave|acute|circumflex|tilde|macron|breve|dotaccent|dieresis|ring|hungarumlaut|caron|commaaccent|cedilla|ogonek)$/.exec(\n base\n );\n if (accented?.[1] && accented[2]) return `${accented[1]}${ACCENTS[accented[2]]}`.normalize('NFC');\n return undefined;\n};\n\n/** Widths of the printable ASCII glyphs 32..126 of standard fonts, in thousandths of the font size. */\n// biome-ignore format: compact width tables.\nconst HELVETICA_WIDTHS = [\n 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556,\n 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833,\n 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556,\n 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334,\n 260, 334, 584\n];\n// biome-ignore format: compact width tables.\nconst TIMES_WIDTHS = [\n 250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500,\n 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889,\n 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500,\n 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480,\n 200, 480, 541\n];\n\n/**\n * Width of a character in a standard font that the file does not measure, in thousandths of the font size. Only the\n * ASCII range is tabulated; other characters take the font's average width.\n */\nexport const standardWidth = (fontName: string, text: string): number => {\n if (/courier|mono/i.test(fontName)) return 600;\n const table = /times|serif|roman/i.test(fontName) ? TIMES_WIDTHS : HELVETICA_WIDTHS;\n const code = text.charCodeAt(0);\n return table[code - 32] ?? (table === TIMES_WIDTHS ? 480 : 530);\n};\n","/**\n * The PDF object model and its parser. Strings stay bytes, because their meaning depends on the font that shows them;\n * names are interned, so they compare by identity. The same lexer reads file objects and content streams, where it\n * also yields operators.\n */\n\n/** A PDF name such as `/Type`; one instance per spelling. */\nexport class PdfName {\n private static readonly cache = new Map<string, PdfName>();\n\n private constructor(readonly value: string) {}\n\n static of(value: string): PdfName {\n let name = PdfName.cache.get(value);\n if (!name) {\n name = new PdfName(value);\n PdfName.cache.set(value, name);\n }\n return name;\n }\n}\n\n/** An indirect reference `num gen R`. */\nexport class PdfRef {\n constructor(\n readonly num: number,\n readonly gen: number\n ) {}\n}\n\n/** A content stream operator such as `Tj`. */\nexport class PdfOperator {\n constructor(readonly name: string) {}\n}\n\n/** A dictionary; keys are name values without the slash. */\nexport class PdfDict {\n readonly entries = new Map<string, PdfObject>();\n\n get(key: string): PdfObject | undefined {\n return this.entries.get(key);\n }\n\n has(key: string): boolean {\n return this.entries.has(key);\n }\n}\n\n/** A stream: its dictionary and the still encoded bytes. */\nexport class PdfStream {\n constructor(\n readonly dict: PdfDict,\n readonly raw: Uint8Array\n ) {}\n}\n\nexport type PdfObject = null | boolean | number | PdfName | Uint8Array | PdfObject[] | PdfDict | PdfRef | PdfStream;\n\n/** Reads the value of a `/Length` entry, which may be an indirect reference in file objects. */\nexport type LengthResolver = (value: PdfObject | undefined) => number | undefined;\n\nconst WHITESPACE = new Uint8Array(256);\nfor (const byte of [0x00, 0x09, 0x0a, 0x0c, 0x0d, 0x20]) WHITESPACE[byte] = 1;\nconst DELIMITER = new Uint8Array(256);\nfor (const character of '()<>[]{}/%') DELIMITER[character.charCodeAt(0)] = 1;\n\nconst isRegular = (byte: number) => !WHITESPACE[byte] && !DELIMITER[byte];\n\n/** Escape sequences of literal strings. */\nconst STRING_ESCAPES: Record<number, number> = {\n 110: 0x0a,\n 114: 0x0d,\n 116: 0x09,\n 98: 0x08,\n 102: 0x0c,\n 40: 0x28,\n 41: 0x29,\n 92: 0x5c\n};\n\n/** Structural tokens that are not values. */\ntype Token = PdfObject | PdfOperator | typeof ARRAY_END | typeof DICT_END | typeof DICT_START | typeof ARRAY_START;\nconst ARRAY_START = Symbol('[');\nconst ARRAY_END = Symbol(']');\nconst DICT_START = Symbol('<<');\nconst DICT_END = Symbol('>>');\n/** Returned at the end of the data. */\nexport const EOF = Symbol('EOF');\n\nconst latin1 = (data: Uint8Array, start: number, end: number): string => {\n let text = '';\n for (let index = start; index < end; index += 1) text += String.fromCharCode(data[index] as number);\n return text;\n};\n\n/** Tokenises PDF syntax. */\nexport class Lexer {\n constructor(\n readonly data: Uint8Array,\n public position = 0\n ) {}\n\n private skipWhitespace() {\n const { data } = this;\n while (this.position < data.length) {\n const byte = data[this.position] as number;\n if (WHITESPACE[byte]) this.position += 1;\n else if (byte === 0x25) {\n // A comment runs to the end of the line.\n while (this.position < data.length && data[this.position] !== 0x0a && data[this.position] !== 0x0d) {\n this.position += 1;\n }\n } else return;\n }\n }\n\n /** Next token, or {@link EOF}. */\n next(): Token | typeof EOF {\n this.skipWhitespace();\n const { data } = this;\n if (this.position >= data.length) return EOF;\n const byte = data[this.position] as number;\n switch (byte) {\n case 0x5b:\n this.position += 1;\n return ARRAY_START;\n case 0x5d:\n this.position += 1;\n return ARRAY_END;\n case 0x28:\n return this.literalString();\n case 0x2f:\n return this.name();\n case 0x3c:\n if (data[this.position + 1] === 0x3c) {\n this.position += 2;\n return DICT_START;\n }\n return this.hexString();\n case 0x3e:\n this.position += data[this.position + 1] === 0x3e ? 2 : 1;\n return DICT_END;\n case 0x7b:\n case 0x7d:\n // Braces only appear in PostScript calculator functions, which carry no text.\n this.position += 1;\n return this.next();\n default:\n return this.word();\n }\n }\n\n private word(): Token {\n const { data } = this;\n const start = this.position;\n while (this.position < data.length && isRegular(data[this.position] as number)) this.position += 1;\n if (this.position === start) {\n // A stray delimiter such as `)`; skipped so a damaged object cannot stall the lexer.\n this.position += 1;\n return this.next() as Token;\n }\n const text = latin1(data, start, this.position);\n const first = text.charCodeAt(0);\n if ((first >= 0x30 && first <= 0x39) || first === 0x2b || first === 0x2d || first === 0x2e) {\n const number = Number(text);\n // Writers occasionally emit `--5` or `4.-2`; a broken number reads as 0 rather than failing the page.\n return Number.isFinite(number) ? number : 0;\n }\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null') return null;\n return new PdfOperator(text);\n }\n\n private name(): PdfName {\n const { data } = this;\n this.position += 1;\n let value = '';\n while (this.position < data.length && isRegular(data[this.position] as number)) {\n const byte = data[this.position] as number;\n if (byte === 0x23) {\n const code = Number.parseInt(latin1(data, this.position + 1, this.position + 3), 16);\n if (Number.isFinite(code)) {\n value += String.fromCharCode(code);\n this.position += 3;\n continue;\n }\n }\n value += String.fromCharCode(byte);\n this.position += 1;\n }\n return PdfName.of(value);\n }\n\n private literalString(): Uint8Array {\n const { data } = this;\n this.position += 1;\n const output: number[] = [];\n let depth = 1;\n while (this.position < data.length) {\n const byte = data[this.position++] as number;\n if (byte === 0x28) depth += 1;\n else if (byte === 0x29) {\n depth -= 1;\n if (depth === 0) break;\n } else if (byte === 0x5c) {\n const next = data[this.position++] as number;\n const escaped = STRING_ESCAPES[next];\n if (escaped !== undefined) output.push(escaped);\n else if (next >= 0x30 && next <= 0x37) {\n let code = next - 0x30;\n for (let digits = 1; digits < 3; digits += 1) {\n const digit = data[this.position] as number;\n if (digit < 0x30 || digit > 0x37) break;\n code = code * 8 + (digit - 0x30);\n this.position += 1;\n }\n output.push(code & 0xff);\n } else if (next === 0x0d) {\n // A backslash before a line break continues the string on the next line.\n if (data[this.position] === 0x0a) this.position += 1;\n } else if (next !== 0x0a) output.push(next);\n continue;\n }\n output.push(byte);\n }\n return Uint8Array.from(output);\n }\n\n private hexString(): Uint8Array {\n const { data } = this;\n const start = this.position + 1;\n let end = start;\n while (end < data.length && data[end] !== 0x3e) end += 1;\n this.position = end + 1;\n const digits: number[] = [];\n for (let index = start; index < end; index += 1) {\n const byte = data[index] as number;\n const value =\n byte >= 0x30 && byte <= 0x39\n ? byte - 0x30\n : byte >= 0x41 && byte <= 0x46\n ? byte - 0x37\n : byte >= 0x61 && byte <= 0x66\n ? byte - 0x57\n : -1;\n if (value >= 0) digits.push(value);\n }\n if (digits.length % 2) digits.push(0);\n const bytes = new Uint8Array(digits.length / 2);\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = ((digits[index * 2] as number) << 4) | (digits[index * 2 + 1] as number);\n }\n return bytes;\n }\n\n /** Moves past the end of line that follows the `stream` keyword. */\n skipStreamEol() {\n if (this.data[this.position] === 0x0d) this.position += 1;\n if (this.data[this.position] === 0x0a) this.position += 1;\n }\n\n /** Whether `needle` is found at `position`. */\n matchesAt(position: number, needle: string): boolean {\n for (let offset = 0; offset < needle.length; offset += 1) {\n if (this.data[position + offset] !== needle.charCodeAt(offset)) return false;\n }\n return true;\n }\n\n /** Position of the next occurrence of `needle` at or after `from`, or -1. */\n indexOf(needle: string, from = this.position): number {\n const { data } = this;\n const first = needle.charCodeAt(0);\n for (let index = data.indexOf(first, from); index >= 0; index = data.indexOf(first, index + 1)) {\n if (this.matchesAt(index, needle)) return index;\n }\n return -1;\n }\n}\n\n/** Whether a token is a given operator or keyword. */\nexport const isOperator = (token: unknown, name?: string): token is PdfOperator =>\n token instanceof PdfOperator && (name === undefined || token.name === name);\n\n/** Builds objects from tokens; resolves `num gen R` with a two-token look-ahead. */\nexport class Parser {\n private readonly buffer: Array<Token | typeof EOF> = [];\n\n constructor(\n readonly lexer: Lexer,\n private readonly resolveLength: LengthResolver = value => (typeof value === 'number' ? value : undefined)\n ) {}\n\n private shift(): Token | typeof EOF {\n return this.buffer.length ? (this.buffer.shift() as Token | typeof EOF) : this.lexer.next();\n }\n\n private peek(index: number): Token | typeof EOF {\n while (this.buffer.length <= index) this.buffer.push(this.lexer.next());\n return this.buffer[index] as Token | typeof EOF;\n }\n\n /** Next object or operator, or {@link EOF}. Streams are recognised only in file objects. */\n next(): PdfObject | PdfOperator | typeof EOF {\n const token = this.shift();\n if (token === EOF) return EOF;\n if (token === ARRAY_START) return this.array();\n if (token === DICT_START) return this.dictOrStream();\n if (token === ARRAY_END || token === DICT_END) return this.next();\n if (typeof token === 'number' && Number.isInteger(token) && token >= 0) {\n const gen = this.peek(0);\n if (typeof gen === 'number' && Number.isInteger(gen) && isOperator(this.peek(1), 'R')) {\n this.buffer.splice(0, 2);\n return new PdfRef(token, gen);\n }\n }\n return token as PdfObject | PdfOperator;\n }\n\n /** Next value; operators and the end of data read as `null`. */\n value(): PdfObject {\n const value = this.next();\n return value === EOF || value instanceof PdfOperator ? null : value;\n }\n\n private array(): PdfObject[] {\n const items: PdfObject[] = [];\n for (;;) {\n const token = this.peek(0);\n if (token === EOF) return items;\n if (token === ARRAY_END) {\n this.shift();\n return items;\n }\n const value = this.next();\n if (value !== EOF && !(value instanceof PdfOperator)) items.push(value);\n }\n }\n\n private dictOrStream(): PdfDict | PdfStream {\n const dict = new PdfDict();\n for (;;) {\n const token = this.peek(0);\n if (token === EOF) return dict;\n if (token === DICT_END) {\n this.shift();\n break;\n }\n const key = this.next();\n if (!(key instanceof PdfName)) continue;\n const next = this.peek(0);\n if (next === DICT_END) break;\n const value = this.next();\n if (value !== EOF && !(value instanceof PdfOperator)) dict.entries.set(key.value, value);\n }\n // A stream keyword can only follow directly; the look-ahead buffer is empty unless something else did.\n if (this.buffer.length === 0 && this.isStreamAhead()) return this.stream(dict);\n return dict;\n }\n\n private isStreamAhead(): boolean {\n const { lexer } = this;\n const saved = lexer.position;\n const token = lexer.next();\n if (isOperator(token, 'stream')) return true;\n lexer.position = saved;\n return false;\n }\n\n private stream(dict: PdfDict): PdfStream {\n const { lexer } = this;\n lexer.skipStreamEol();\n const start = lexer.position;\n const declared = this.resolveLength(dict.get('Length'));\n let end = declared !== undefined ? start + declared : -1;\n // A wrong /Length is common; the stream then ends at the first `endstream`.\n if (end < start || end > lexer.data.length || !this.endsStreamAt(end)) {\n const found = lexer.indexOf('endstream', start);\n end = found < 0 ? lexer.data.length : found;\n while (end > start && (lexer.data[end - 1] === 0x0a || lexer.data[end - 1] === 0x0d)) end -= 1;\n }\n const raw = lexer.data.subarray(start, end);\n const after = lexer.indexOf('endstream', end);\n lexer.position = after < 0 ? lexer.data.length : after + 'endstream'.length;\n return new PdfStream(dict, raw);\n }\n\n /** Whether `endstream` follows `end`, allowing for the end-of-line markers in between. */\n private endsStreamAt(end: number): boolean {\n const { data } = this.lexer;\n let position = end;\n while (position < end + 4 && WHITESPACE[data[position] ?? 0]) position += 1;\n return this.lexer.matchesAt(position, 'endstream');\n }\n}\n\n/** Latin-1 text of a byte range, for keywords and header scans. */\nexport const bytesToLatin1 = (data: Uint8Array, start = 0, end = data.length): string => latin1(data, start, end);\n","/**\n * Fonts as the text extractor needs them: how a string splits into character codes, the Unicode text and advance\n * width of every code, and the style the font name and descriptor imply. Composite (Type0) fonts are read through\n * their CMaps; simple fonts through `/ToUnicode`, their encoding and `/Differences`.\n */\nimport type { PdfDocument } from './document';\nimport { type Encoding, MAC_ROMAN, STANDARD, WIN_ANSI, glyphToUnicode, standardWidth } from './encodings';\nimport { EOF, Lexer, Parser, type PdfDict, PdfName, type PdfObject, PdfOperator } from './objects';\n\n/** One shown character code. */\nexport interface Glyph {\n /** Unicode text; empty for codes without a known meaning. */\n text: string;\n /** Advance width in thousandths of the font size. */\n width: number;\n /** Whether word spacing applies: single-byte code 32. */\n wordSpace: boolean;\n}\n\n/** A range of valid codes of one byte length. */\ninterface CodespaceRange {\n length: number;\n low: number;\n high: number;\n}\n\n/** What a CMap stream maps codes to. */\ninterface CMap {\n codespaces: CodespaceRange[];\n /** Unicode text per code (ToUnicode CMaps). */\n unicode: Map<number, string>;\n /** CID per code (encoding CMaps of composite fonts). */\n cids: Map<number, number>;\n}\n\nconst readCode = (bytes: Uint8Array): number => bytes.reduce((code, byte) => code * 256 + byte, 0);\n\n/** UTF-16BE bytes as text; ToUnicode destinations are written that way. */\nconst utf16 = (bytes: Uint8Array): string => {\n let text = '';\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n text += String.fromCharCode(((bytes[index] as number) << 8) | (bytes[index + 1] as number));\n }\n return text;\n};\n\n/** Increments the last UTF-16 unit of a text, as consecutive codes of a `bfrange` do. */\nconst offsetText = (text: string, offset: number): string =>\n offset === 0 || !text ? text : text.slice(0, -1) + String.fromCharCode(text.charCodeAt(text.length - 1) + offset);\n\n/** Largest range of a `bfrange` or `cidrange` expanded into single entries; wider ranges are clipped. */\nconst MAX_RANGE = 0x1_00_00;\n\n/** Parses a CMap stream: code space, `bfchar`/`bfrange` to Unicode and `cidchar`/`cidrange` to CIDs. */\nexport const parseCMap = (data: Uint8Array): CMap => {\n const cmap: CMap = { codespaces: [], unicode: new Map(), cids: new Map() };\n const parser = new Parser(new Lexer(data));\n const operands: PdfObject[] = [];\n for (let token = parser.next(); token !== EOF; token = parser.next()) {\n if (!(token instanceof PdfOperator)) {\n operands.push(token);\n continue;\n }\n switch (token.name) {\n case 'endcodespacerange':\n for (let index = 0; index + 1 < operands.length; index += 2) {\n const low = operands[index];\n const high = operands[index + 1];\n if (low instanceof Uint8Array && high instanceof Uint8Array) {\n cmap.codespaces.push({ length: low.length, low: readCode(low), high: readCode(high) });\n }\n }\n break;\n case 'endbfchar':\n for (let index = 0; index + 1 < operands.length; index += 2) {\n const source = operands[index];\n const target = operands[index + 1];\n if (source instanceof Uint8Array && target instanceof Uint8Array) {\n cmap.unicode.set(readCode(source), utf16(target));\n } else if (source instanceof Uint8Array && target instanceof PdfName) {\n const text = glyphToUnicode(target.value);\n if (text) cmap.unicode.set(readCode(source), text);\n }\n }\n break;\n case 'endbfrange':\n for (let index = 0; index + 2 < operands.length; index += 3) {\n const low = operands[index];\n const high = operands[index + 1];\n const target = operands[index + 2];\n if (!(low instanceof Uint8Array) || !(high instanceof Uint8Array)) continue;\n const first = readCode(low);\n const last = Math.min(readCode(high), first + MAX_RANGE);\n for (let code = first; code <= last; code += 1) {\n const offset = code - first;\n if (target instanceof Uint8Array) cmap.unicode.set(code, offsetText(utf16(target), offset));\n else if (Array.isArray(target) && target[offset] instanceof Uint8Array) {\n cmap.unicode.set(code, utf16(target[offset] as Uint8Array));\n }\n }\n }\n break;\n case 'endcidchar':\n for (let index = 0; index + 1 < operands.length; index += 2) {\n const source = operands[index];\n const cid = operands[index + 1];\n if (source instanceof Uint8Array && typeof cid === 'number') cmap.cids.set(readCode(source), cid);\n }\n break;\n case 'endcidrange':\n for (let index = 0; index + 2 < operands.length; index += 3) {\n const low = operands[index];\n const high = operands[index + 1];\n const cid = operands[index + 2];\n if (!(low instanceof Uint8Array) || !(high instanceof Uint8Array) || typeof cid !== 'number') continue;\n const first = readCode(low);\n const last = Math.min(readCode(high), first + MAX_RANGE);\n for (let code = first; code <= last; code += 1) cmap.cids.set(code, cid + code - first);\n }\n break;\n default:\n break;\n }\n // Every `begin…` operator starts a new operand list; the counts in front of them are not needed.\n operands.length = 0;\n }\n return cmap;\n};\n\n/** Font families the editor offers, recognised in PDF font names. */\nconst FAMILIES: Array<[RegExp, string]> = [\n [/times/i, 'Times New Roman'],\n [/arial|helvetica|liberationsans|arimo/i, 'Arial'],\n [/courier|liberationmono|cousine/i, 'Courier New'],\n [/calibri|carlito/i, 'Calibri'],\n [/cambria|caladea/i, 'Cambria'],\n [/georgia/i, 'Georgia'],\n [/tahoma/i, 'Tahoma'],\n [/verdana/i, 'Verdana']\n];\n\n/** FontDescriptor flags. */\nconst FLAG_SYMBOLIC = 1 << 2;\nconst FLAG_ITALIC = 1 << 6;\nconst FLAG_FORCE_BOLD = 1 << 18;\n\n/** Default advance of a CID font glyph without a `/W` entry. */\nconst DEFAULT_CID_WIDTH = 1000;\n\nexport class PdfFont {\n /** Font name without the subset prefix, such as `TimesNewRomanPS-BoldMT`. */\n readonly name: string;\n readonly bold: boolean;\n readonly italic: boolean;\n /** CSS family of the editor's font list, when the font is one of them. */\n readonly family: string | undefined;\n /** Factor from the text space size to the displayed size; Type3 fonts scale glyphs by their own matrix. */\n readonly sizeScale: number;\n /** Whether the font is a composite (Type0) font with multibyte codes. */\n private readonly composite: boolean;\n private readonly codespaces: CodespaceRange[];\n private readonly toUnicode: Map<number, string> | undefined;\n private readonly cids: Map<number, number> | undefined;\n private readonly encoding: Encoding | undefined;\n private readonly differences = new Map<number, string>();\n private readonly widths = new Map<number, number>();\n private readonly defaultWidth: number | undefined;\n /** Scale of widths into thousandths of the font size; Type3 fonts have their own glyph space. */\n private readonly widthScale: number;\n /** Whether the font carries no widths, as unembedded standard fonts may. */\n private readonly measuredByName: boolean;\n private readonly glyphCache = new Map<number, Glyph>();\n\n constructor(doc: PdfDocument, dict: PdfDict) {\n const subtype = doc.name(dict.get('Subtype'));\n this.composite = subtype === 'Type0';\n const descendant = this.composite ? doc.dict(doc.array(dict.get('DescendantFonts'))?.[0]) : undefined;\n const descriptor = doc.dict((descendant ?? dict).get('FontDescriptor'));\n this.name = (doc.name(dict.get('BaseFont')) ?? doc.name(descendant?.get('BaseFont')) ?? '').replace(\n /^[A-Z]{6}\\+/,\n ''\n );\n const flags = doc.number(descriptor?.get('Flags')) ?? 0;\n const weight = doc.number(descriptor?.get('FontWeight')) ?? 0;\n this.bold = /bold|black|heavy|semibold|demi/i.test(this.name) || weight >= 600 || (flags & FLAG_FORCE_BOLD) !== 0;\n this.italic =\n /italic|oblique|kursiv/i.test(this.name) ||\n (flags & FLAG_ITALIC) !== 0 ||\n (doc.number(descriptor?.get('ItalicAngle')) ?? 0) !== 0;\n this.family = FAMILIES.find(([pattern]) => pattern.test(this.name))?.[1];\n\n const toUnicode = doc.stream(dict.get('ToUnicode'));\n this.toUnicode = toUnicode ? parseCMap(doc.bytes(toUnicode)).unicode : undefined;\n\n if (this.composite) {\n const encoding = doc.get(dict.get('Encoding'));\n const embedded = doc.stream(encoding);\n const cmap = embedded ? parseCMap(doc.bytes(embedded)) : undefined;\n this.cids = cmap?.cids.size ? cmap.cids : undefined;\n // Predefined CMaps other than Identity are treated as two-byte codes, which all the common ones are.\n this.codespaces = cmap?.codespaces.length ? cmap.codespaces : [{ length: 2, low: 0, high: 0xff_ff }];\n this.encoding = undefined;\n this.defaultWidth = doc.number(descendant?.get('DW')) ?? DEFAULT_CID_WIDTH;\n this.readCidWidths(doc, doc.array(descendant?.get('W')) ?? []);\n this.widthScale = 1;\n this.sizeScale = 1;\n this.measuredByName = false;\n } else {\n this.codespaces = [{ length: 1, low: 0, high: 0xff }];\n this.cids = undefined;\n this.encoding = this.readEncoding(doc, dict, subtype, flags);\n const first = doc.number(dict.get('FirstChar')) ?? 0;\n const widths = doc.numbers(dict.get('Widths'));\n widths?.forEach((width, index) => {\n this.widths.set(first + index, width);\n });\n this.defaultWidth = doc.number(descriptor?.get('MissingWidth'));\n const matrix = subtype === 'Type3' ? doc.numbers(dict.get('FontMatrix')) : undefined;\n this.widthScale = matrix?.[0] ? Math.abs(matrix[0]) * 1000 : 1;\n this.sizeScale = matrix?.[3] ? Math.abs(matrix[3]) * 1000 : 1;\n this.measuredByName = !widths?.length;\n }\n }\n\n private readEncoding(doc: PdfDocument, dict: PdfDict, subtype: string | undefined, flags: number) {\n const value = doc.get(dict.get('Encoding'));\n const baseName = value instanceof PdfName ? value.value : doc.name(doc.dict(value)?.get('BaseEncoding'));\n const differences = doc.array(doc.dict(value)?.get('Differences')) ?? [];\n let code = 0;\n for (const item of differences) {\n const resolved = doc.get(item);\n if (typeof resolved === 'number') code = resolved;\n else if (resolved instanceof PdfName) {\n this.differences.set(code, resolved.value);\n code += 1;\n }\n }\n if (baseName === 'WinAnsiEncoding') return WIN_ANSI;\n if (baseName === 'MacRomanEncoding') return MAC_ROMAN;\n if (baseName === 'StandardEncoding' || baseName === 'MacExpertEncoding') return STANDARD;\n // Symbolic fonts without an encoding use their codes directly.\n if (flags & FLAG_SYMBOLIC && !differences.length) return undefined;\n return subtype === 'TrueType' ? WIN_ANSI : STANDARD;\n }\n\n private readCidWidths(doc: PdfDocument, entries: PdfObject[]) {\n for (let index = 0; index < entries.length; ) {\n const first = doc.number(entries[index]);\n const next = doc.get(entries[index + 1]);\n if (first === undefined) break;\n if (Array.isArray(next)) {\n next.forEach((width, offset) => {\n this.widths.set(first + offset, doc.number(width) ?? 0);\n });\n index += 2;\n } else {\n const last = doc.number(next) ?? first;\n const width = doc.number(entries[index + 2]) ?? 0;\n for (let cid = first; cid <= Math.min(last, first + MAX_RANGE); cid += 1) this.widths.set(cid, width);\n index += 3;\n }\n }\n }\n\n /** Splits a shown string into its character codes and describes each one. */\n decode(bytes: Uint8Array): Glyph[] {\n const glyphs: Glyph[] = [];\n for (let position = 0; position < bytes.length; ) {\n const length = this.codeLength(bytes, position);\n const code = readCode(bytes.subarray(position, position + length));\n position += length;\n let glyph = this.glyphCache.get(code);\n if (!glyph) {\n glyph = this.describe(code, length);\n this.glyphCache.set(code, glyph);\n }\n glyphs.push(glyph);\n }\n return glyphs;\n }\n\n private codeLength(bytes: Uint8Array, position: number): number {\n if (!this.composite) return 1;\n for (let length = 1; length <= 4 && position + length <= bytes.length; length += 1) {\n const code = readCode(bytes.subarray(position, position + length));\n if (this.codespaces.some(range => range.length === length && code >= range.low && code <= range.high)) {\n return length;\n }\n }\n // A code outside every range takes the shortest length, as the specification asks.\n return Math.min(...this.codespaces.map(range => range.length), bytes.length - position);\n }\n\n private describe(code: number, length: number): Glyph {\n const text = this.unicodeOf(code);\n return { text, width: this.widthOf(code, text), wordSpace: length === 1 && code === 32 };\n }\n\n private unicodeOf(code: number): string {\n const mapped = this.toUnicode?.get(code);\n // Some writers map codes to NUL or to nothing; those fall through to the encoding.\n if (mapped && mapped !== '\\u0000') return mapped;\n if (this.composite) return '';\n const name = this.differences.get(code);\n if (name) {\n const text = glyphToUnicode(name);\n if (text !== undefined) return text;\n }\n if (this.encoding) return this.encoding[code] ?? '';\n // A symbolic font's codes: printable ones read as themselves, and TrueType symbol codes live at U+Fix.\n return code >= 0x20 ? String.fromCharCode(code) : '';\n }\n\n private widthOf(code: number, text: string): number {\n if (this.composite) {\n const cid = this.cids?.get(code) ?? code;\n return this.widths.get(cid) ?? this.defaultWidth ?? DEFAULT_CID_WIDTH;\n }\n const width = this.widths.get(code);\n if (width !== undefined) return width * this.widthScale;\n if (this.measuredByName) return standardWidth(this.name, text || ' ');\n return (this.defaultWidth ?? 0) * this.widthScale;\n }\n}\n","/**\n * Pictures of a PDF as `data:` URLs: JPEG data is embedded as it is, and decoded pixel data (gray, RGB, CMYK, ICC\n * based and indexed color, 1 to 16 bits per component, with a soft mask) is painted into a canvas and saved as PNG.\n * Without a DOM canvas, as in tests or workers, only JPEG pictures come through.\n */\nimport type { PdfDocument } from './document';\nimport { PdfName, type PdfObject, PdfStream } from './objects';\n\n/** Pictures larger than this many pixels are skipped rather than blowing up memory. */\nconst MAX_PIXELS = 25_000_000;\n\n/** How color components are read. */\ninterface ColorSpace {\n components: number;\n /** Palette of an indexed space: RGB triplets. */\n palette?: Uint8Array;\n cmyk?: boolean;\n}\n\nconst toBase64 = (data: Uint8Array): string => {\n let binary = '';\n const chunk = 0x80_00;\n for (let index = 0; index < data.length; index += chunk) {\n binary += String.fromCharCode(...data.subarray(index, index + chunk));\n }\n return btoa(binary);\n};\n\nconst readColorSpace = (doc: PdfDocument, value: PdfObject | undefined, depth = 0): ColorSpace | undefined => {\n const resolved = doc.get(value);\n const name = resolved instanceof PdfName ? resolved.value : doc.name(doc.array(resolved)?.[0]);\n const parts = doc.array(resolved) ?? [];\n switch (name) {\n case 'DeviceGray':\n case 'CalGray':\n case 'G':\n return { components: 1 };\n case 'DeviceRGB':\n case 'CalRGB':\n case 'RGB':\n return { components: 3 };\n case 'DeviceCMYK':\n case 'CMYK':\n return { components: 4, cmyk: true };\n case 'ICCBased': {\n const components = doc.number(doc.dict(parts[1])?.get('N')) ?? 3;\n return { components, cmyk: components === 4 };\n }\n case 'Indexed':\n case 'I': {\n if (depth > 2) return undefined;\n const base = readColorSpace(doc, parts[1], depth + 1);\n const lookup = doc.get(parts[3]);\n const table = lookup instanceof Uint8Array ? lookup : lookup instanceof PdfStream ? doc.bytes(lookup) : undefined;\n if (!base || !table) return undefined;\n const colors = (doc.number(parts[2]) ?? 0) + 1;\n const palette = new Uint8Array(colors * 3);\n for (let index = 0; index < colors; index += 1) {\n const entry = Array.from(\n table.subarray(index * base.components, (index + 1) * base.components),\n byte => byte / 255\n );\n palette.set(toRgb(entry, base), index * 3);\n }\n return { components: 1, palette };\n }\n default:\n return undefined;\n }\n};\n\n/** RGB bytes of one color given as 0..1 components. */\nconst toRgb = (components: number[], space: ColorSpace): [number, number, number] => {\n if (space.components === 1) {\n const gray = Math.round((components[0] ?? 0) * 255);\n return [gray, gray, gray];\n }\n if (space.cmyk) {\n const [c = 0, m = 0, y = 0, k = 0] = components;\n return [\n Math.round(255 * (1 - c) * (1 - k)),\n Math.round(255 * (1 - m) * (1 - k)),\n Math.round(255 * (1 - y) * (1 - k))\n ];\n }\n return [\n Math.round((components[0] ?? 0) * 255),\n Math.round((components[1] ?? 0) * 255),\n Math.round((components[2] ?? 0) * 255)\n ];\n};\n\n/** Reads packed samples of 1, 2, 4, 8 or 16 bits, rows padded to whole bytes. */\nconst sampleReader = (data: Uint8Array, bits: number, perRow: number) => {\n const rowBytes = Math.ceil((perRow * bits) / 8);\n const max = (1 << Math.min(bits, 16)) - 1;\n return (row: number, index: number): number => {\n const bitOffset = index * bits;\n const offset = row * rowBytes + (bitOffset >> 3);\n if (bits === 8) return data[offset] ?? 0;\n // Sixteen-bit samples keep their high byte.\n if (bits === 16) return data[offset] ?? 0;\n const shift = 8 - (bitOffset & 7) - bits;\n return (((data[offset] ?? 0) >> shift) & max) * (255 / max);\n };\n};\n\n/** RGBA pixels of decoded image samples, with the soft mask as alpha. */\nconst toRgba = (\n data: Uint8Array,\n width: number,\n height: number,\n bits: number,\n space: ColorSpace,\n alpha: ((row: number, index: number) => number) | undefined\n): Uint8ClampedArray => {\n const pixels = new Uint8ClampedArray(width * height * 4);\n const sample = sampleReader(data, bits, width * space.components);\n const component: number[] = new Array(space.components);\n for (let row = 0; row < height; row += 1) {\n for (let column = 0; column < width; column += 1) {\n const target = (row * width + column) * 4;\n if (space.palette) {\n // Indexed samples are palette positions, not intensities.\n const bitOffset = column * bits;\n const byte = data[row * Math.ceil((width * bits) / 8) + (bitOffset >> 3)] ?? 0;\n const entry = bits === 8 ? byte : (byte >> (8 - (bitOffset & 7) - bits)) & ((1 << bits) - 1);\n pixels[target] = space.palette[entry * 3] ?? 0;\n pixels[target + 1] = space.palette[entry * 3 + 1] ?? 0;\n pixels[target + 2] = space.palette[entry * 3 + 2] ?? 0;\n } else {\n for (let index = 0; index < space.components; index += 1) {\n component[index] = sample(row, column * space.components + index) / 255;\n }\n const [red, green, blue] = toRgb(component, space);\n pixels[target] = red;\n pixels[target + 1] = green;\n pixels[target + 2] = blue;\n }\n pixels[target + 3] = alpha ? alpha(row, column) : 255;\n }\n }\n return pixels;\n};\n\n/** Encodes RGBA pixels as a PNG `data:` URL through a canvas; `null` without a DOM. */\nconst toPng = (pixels: Uint8ClampedArray, width: number, height: number): string | null => {\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context || typeof ImageData === 'undefined') return null;\n canvas.width = width;\n canvas.height = height;\n context.putImageData(new ImageData(pixels as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);\n return canvas.toDataURL('image/png');\n};\n\n/** `data:` URL of an image XObject, or `null` when it cannot be shown. */\nexport const imageSource = (doc: PdfDocument, stream: PdfStream): string | null => {\n const { dict } = stream;\n if (dict.get('ImageMask') === true) return null;\n try {\n const { data, imageFilter } = doc.decode(stream);\n if (imageFilter === 'DCTDecode' || imageFilter === 'DCT') return `data:image/jpeg;base64,${toBase64(data)}`;\n if (imageFilter) return null;\n const width = doc.number(dict.get('Width')) ?? 0;\n const height = doc.number(dict.get('Height')) ?? 0;\n const bits = doc.number(dict.get('BitsPerComponent')) ?? 8;\n const space = readColorSpace(doc, dict.get('ColorSpace'));\n if (!space || width <= 0 || height <= 0 || width * height > MAX_PIXELS) return null;\n const mask = doc.stream(dict.get('SMask'));\n let alpha: ((row: number, index: number) => number) | undefined;\n if (mask && doc.number(mask.dict.get('Width')) === width && doc.number(mask.dict.get('Height')) === height) {\n alpha = sampleReader(doc.bytes(mask), doc.number(mask.dict.get('BitsPerComponent')) ?? 8, width);\n }\n return toPng(toRgba(data, width, height, bits, space, alpha), width, height);\n } catch {\n return null;\n }\n};\n","/**\n * Runs page content streams far enough to know where text and pictures land: the graphics and text state, font\n * changes, form XObjects and the page rotation. Glyphs that continue each other merge into text spans, so the layout\n * step works with words and phrases instead of single characters. Coordinates are page points from the top-left\n * corner of the page as it is displayed.\n */\nimport type { PdfDocument, PdfPage } from './document';\nimport { PdfFont } from './fonts';\nimport { imageSource } from './images';\nimport { EOF, Lexer, Parser, type PdfDict, PdfName, type PdfObject, PdfOperator, type PdfStream } from './objects';\n\n/** A run of text in one style on one baseline. */\nexport interface TextSpan {\n text: string;\n /** Left edge and baseline, in points from the top-left corner. */\n x: number;\n y: number;\n width: number;\n /** Font size in points as displayed. */\n size: number;\n bold: boolean;\n italic: boolean;\n family: string | undefined;\n /** Fill colour as `#rrggbb`. */\n color: string;\n}\n\n/** A picture placed on the page. */\nexport interface PageImage {\n src: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** A painted rectangle, such as a table border or a rule, in page points from the top-left corner. */\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** What one page shows. */\nexport interface PageContent {\n width: number;\n height: number;\n spans: TextSpan[];\n images: PageImage[];\n /** Thin painted lines: table borders, underlines and separators. */\n rules: Box[];\n}\n\n/** `[a b c d e f]` of the PDF specification. */\ntype Matrix = [number, number, number, number, number, number];\n\nconst IDENTITY: Matrix = [1, 0, 0, 1, 0, 0];\n\n/** `m × n`: applies `m` first, then `n`. */\nconst multiply = (m: Matrix, n: Matrix): Matrix => [\n m[0] * n[0] + m[1] * n[2],\n m[0] * n[1] + m[1] * n[3],\n m[2] * n[0] + m[3] * n[2],\n m[2] * n[1] + m[3] * n[3],\n m[4] * n[0] + m[5] * n[2] + n[4],\n m[4] * n[1] + m[5] * n[3] + n[5]\n];\n\nconst apply = (m: Matrix, x: number, y: number): [number, number] => [\n m[0] * x + m[2] * y + m[4],\n m[1] * x + m[3] * y + m[5]\n];\n\n/** Maps default user space to the displayed page: origin top-left, y down, the page rotation applied. */\nconst viewMatrix = (page: PdfPage): Matrix => {\n const [x0, y0, x1, y1] = page.box;\n switch (page.rotate) {\n case 90:\n return [0, 1, 1, 0, -y0, -x0];\n case 180:\n return [-1, 0, 0, 1, x1, -y0];\n case 270:\n return [0, -1, -1, 0, y1, x1];\n default:\n return [1, 0, 0, -1, -x0, y1];\n }\n};\n\nconst toHex = (value: number) =>\n Math.round(Math.min(1, Math.max(0, value)) * 255)\n .toString(16)\n .padStart(2, '0');\n\n/** Fill colour from gray, RGB or CMYK components. */\nconst colorOf = (components: number[]): string => {\n if (components.length === 1) {\n const gray = components[0] as number;\n return `#${toHex(gray)}${toHex(gray)}${toHex(gray)}`;\n }\n if (components.length === 3) return `#${components.map(toHex).join('')}`;\n if (components.length === 4) {\n const [c, m, y, k] = components as [number, number, number, number];\n return `#${toHex((1 - c) * (1 - k))}${toHex((1 - m) * (1 - k))}${toHex((1 - y) * (1 - k))}`;\n }\n return '#000000';\n};\n\ninterface GraphicsState {\n ctm: Matrix;\n color: string;\n font: PdfFont | undefined;\n fontSize: number;\n charSpacing: number;\n wordSpacing: number;\n /** Horizontal scaling as a factor. */\n scale: number;\n leading: number;\n rise: number;\n renderMode: number;\n}\n\n/** Form XObjects nested deeper than this are not entered. */\nconst MAX_FORM_DEPTH = 12;\n/** Glyphs closer than this share a span, in fractions of the font size. */\nconst JOIN_TOLERANCE = 0.12;\n/** Pictures smaller than this, in points, are rules and dots rather than content. */\nconst MIN_IMAGE_SIZE = 12;\n/** Painted shapes at most this thick, in points, are rules. */\nconst MAX_RULE_THICKNESS = 3;\n/** Operators that paint the current path. */\nconst PAINT_OPERATORS = new Set(['S', 's', 'f', 'F', 'f*', 'B', 'B*', 'b', 'b*']);\n\n/** Bounding box of points. */\nconst boundsOf = (points: Array<[number, number]>): Box => {\n const xs = points.map(([x]) => x);\n const ys = points.map(([, y]) => y);\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };\n};\n\n/** Reads the text spans and pictures of pages; fonts and pictures are shared across pages. */\nexport class ContentReader {\n private readonly fonts = new Map<PdfDict, PdfFont>();\n private readonly images = new Map<PdfStream, string | null>();\n\n constructor(private readonly doc: PdfDocument) {}\n\n read(page: PdfPage): PageContent {\n const [x0, y0, x1, y1] = page.box;\n const turned = page.rotate === 90 || page.rotate === 270;\n const content: PageContent = {\n width: turned ? y1 - y0 : x1 - x0,\n height: turned ? x1 - x0 : y1 - y0,\n spans: [],\n images: [],\n rules: []\n };\n const run = new ContentRun(this, content, page.resources, viewMatrix(page));\n run.execute(this.doc.contents(page), 0);\n run.flush();\n return content;\n }\n\n get document(): PdfDocument {\n return this.doc;\n }\n\n font(dict: PdfDict): PdfFont {\n let font = this.fonts.get(dict);\n if (!font) {\n font = new PdfFont(this.doc, dict);\n this.fonts.set(dict, font);\n }\n return font;\n }\n\n image(stream: PdfStream): string | null {\n if (!this.images.has(stream)) this.images.set(stream, imageSource(this.doc, stream));\n return this.images.get(stream) ?? null;\n }\n}\n\n/** The execution of one page, with the span being built. */\nclass ContentRun {\n private state: GraphicsState;\n private readonly stack: GraphicsState[] = [];\n private textMatrix: Matrix = IDENTITY;\n private lineMatrix: Matrix = IDENTITY;\n private span: TextSpan | null = null;\n /** Where the next glyph of the current span is expected, in page coordinates. */\n private spanEnd = 0;\n /** Straight pieces of the path being built, in page coordinates; curves are not needed for rules. */\n private path: Box[] = [];\n private point: [number, number] = [0, 0];\n\n constructor(\n private readonly reader: ContentReader,\n private readonly content: PageContent,\n private resources: PdfDict,\n ctm: Matrix\n ) {\n this.state = {\n ctm,\n color: '#000000',\n font: undefined,\n fontSize: 0,\n charSpacing: 0,\n wordSpacing: 0,\n scale: 1,\n leading: 0,\n rise: 0,\n renderMode: 0\n };\n }\n\n private get doc() {\n return this.reader.document;\n }\n\n execute(data: Uint8Array, depth: number) {\n const parser = new Parser(new Lexer(data));\n const operands: Array<PdfObject> = [];\n for (let token = parser.next(); token !== EOF; token = parser.next()) {\n if (!(token instanceof PdfOperator)) {\n operands.push(token);\n continue;\n }\n if (token.name === 'BI') skipInlineImage(parser.lexer);\n else this.operator(token.name, operands, depth);\n operands.length = 0;\n }\n }\n\n private number(operands: PdfObject[], index: number): number {\n const value = operands[index];\n return typeof value === 'number' ? value : 0;\n }\n\n private operator(name: string, operands: PdfObject[], depth: number) {\n const state = this.state;\n const number = (index: number) => this.number(operands, index);\n switch (name) {\n case 'q':\n this.stack.push({ ...state });\n break;\n case 'Q':\n this.state = this.stack.pop() ?? state;\n break;\n case 'cm':\n state.ctm = multiply([number(0), number(1), number(2), number(3), number(4), number(5)], state.ctm);\n break;\n case 'BT':\n this.textMatrix = IDENTITY;\n this.lineMatrix = IDENTITY;\n break;\n case 'ET':\n break;\n case 'Tf': {\n const key = operands[0];\n const fonts = this.doc.dict(this.resources.get('Font'));\n const dict = key instanceof PdfName ? this.doc.dict(fonts?.get(key.value)) : undefined;\n state.font = dict ? this.reader.font(dict) : undefined;\n state.fontSize = number(1);\n break;\n }\n case 'Tc':\n state.charSpacing = number(0);\n break;\n case 'Tw':\n state.wordSpacing = number(0);\n break;\n case 'Tz':\n state.scale = number(0) / 100;\n break;\n case 'TL':\n state.leading = number(0);\n break;\n case 'Ts':\n state.rise = number(0);\n break;\n case 'Tr':\n state.renderMode = number(0);\n break;\n case 'Td':\n this.moveLine(number(0), number(1));\n break;\n case 'TD':\n state.leading = -number(1);\n this.moveLine(number(0), number(1));\n break;\n case 'Tm':\n this.lineMatrix = [number(0), number(1), number(2), number(3), number(4), number(5)];\n this.textMatrix = this.lineMatrix;\n break;\n case 'T*':\n this.moveLine(0, -state.leading);\n break;\n case 'Tj':\n this.show(operands[0]);\n break;\n case \"'\":\n this.moveLine(0, -state.leading);\n this.show(operands[0]);\n break;\n case '\"':\n state.wordSpacing = number(0);\n state.charSpacing = number(1);\n this.moveLine(0, -state.leading);\n this.show(operands[2]);\n break;\n case 'TJ':\n for (const item of Array.isArray(operands[0]) ? operands[0] : []) {\n if (typeof item === 'number') this.advance((-item / 1000) * state.fontSize * state.scale);\n else this.show(item);\n }\n break;\n case 'g':\n case 'rg':\n case 'k':\n state.color = colorOf(operands.filter((value): value is number => typeof value === 'number'));\n break;\n case 'sc':\n case 'scn': {\n const components = operands.filter((value): value is number => typeof value === 'number');\n if (components.length === 1 || components.length === 3 || components.length === 4) {\n state.color = colorOf(components);\n }\n break;\n }\n case 'Do':\n this.drawXObject(operands[0], depth);\n break;\n case 're': {\n const [x, y, width, height] = [number(0), number(1), number(2), number(3)];\n const corners: Array<[number, number]> = [\n [x, y],\n [x + width, y],\n [x, y + height],\n [x + width, y + height]\n ];\n this.path.push(boundsOf(corners.map(([px, py]) => apply(state.ctm, px, py))));\n break;\n }\n case 'm':\n this.point = apply(state.ctm, number(0), number(1));\n break;\n case 'l': {\n const next = apply(state.ctm, number(0), number(1));\n this.path.push(boundsOf([this.point, next]));\n this.point = next;\n break;\n }\n case 'c':\n this.point = apply(state.ctm, number(4), number(5));\n break;\n case 'v':\n case 'y':\n this.point = apply(state.ctm, number(2), number(3));\n break;\n case 'n':\n this.path = [];\n break;\n default:\n if (PAINT_OPERATORS.has(name)) this.paintPath(name);\n break;\n }\n }\n\n /** Keeps the thin pieces of a painted path as rules; fills and strokes both draw table borders. */\n private paintPath(operator: string) {\n const stroked = operator !== 'f' && operator !== 'F' && operator !== 'f*';\n for (const box of this.path) {\n const thin = Math.min(box.width, box.height) <= MAX_RULE_THICKNESS;\n if ((thin || stroked) && Math.max(box.width, box.height) >= MIN_IMAGE_SIZE / 2) {\n if (thin) this.content.rules.push(box);\n else {\n // A stroked rectangle is four rules.\n const { x, y, width, height } = box;\n this.content.rules.push(\n { x, y, width, height: 0 },\n { x, y: y + height, width, height: 0 },\n { x, y, width: 0, height },\n { x: x + width, y, width: 0, height }\n );\n }\n }\n }\n this.path = [];\n }\n\n private moveLine(tx: number, ty: number) {\n this.lineMatrix = multiply([1, 0, 0, 1, tx, ty], this.lineMatrix);\n this.textMatrix = this.lineMatrix;\n }\n\n private advance(tx: number) {\n this.textMatrix = multiply([1, 0, 0, 1, tx, 0], this.textMatrix);\n }\n\n /** Shows a string: each glyph is placed, joined to the current span or starts a new one, and advances the pen. */\n private show(value: PdfObject | undefined) {\n const { state } = this;\n const font = state.font;\n if (!font || !(value instanceof Uint8Array)) return;\n for (const glyph of font.decode(value)) {\n const text = multiply(this.textMatrix, state.ctm);\n const rendering = multiply([state.fontSize * state.scale, 0, 0, state.fontSize, 0, state.rise], text);\n const [x, y] = apply(rendering, 0, 0);\n // The displayed size is the length of the text space's vertical unit on the page.\n const size = Math.hypot(rendering[2], rendering[3]) * font.sizeScale;\n // Rotated text, such as a vertical margin note, is not part of the reading flow.\n const upright = rendering[0] > 0 && Math.abs(rendering[1]) < rendering[0] * 0.1;\n const advance =\n ((glyph.width / 1000) * state.fontSize + state.charSpacing + (glyph.wordSpace ? state.wordSpacing : 0)) *\n state.scale;\n if (glyph.text && upright && size > 0.5) {\n this.addGlyph(glyph.text, x, y, advance * Math.hypot(text[0], text[1]), size, font);\n }\n this.advance(advance);\n }\n }\n\n private addGlyph(text: string, x: number, y: number, width: number, size: number, font: PdfFont) {\n const { state } = this;\n const span = this.span;\n const continues =\n span &&\n Math.abs(span.y - y) < size * 0.2 &&\n Math.abs(span.size - size) < 0.5 &&\n Math.abs(this.spanEnd - x) < size * JOIN_TOLERANCE &&\n span.bold === (font.bold || state.renderMode === 2) &&\n span.italic === font.italic &&\n span.color === state.color;\n if (span && continues) {\n span.text += text;\n span.width = x + width - span.x;\n } else {\n this.flush();\n this.span = {\n text,\n x,\n y,\n width,\n size,\n // Text filled and stroked at once is how writers fake bold for fonts without a bold face.\n bold: font.bold || state.renderMode === 2,\n italic: font.italic,\n family: font.family,\n color: state.color\n };\n }\n this.spanEnd = x + width;\n }\n\n /** Ends the span being built. */\n flush() {\n if (this.span?.text.trim()) this.content.spans.push(this.span);\n this.span = null;\n }\n\n private drawXObject(nameValue: PdfObject | undefined, depth: number) {\n const { doc } = this;\n if (!(nameValue instanceof PdfName)) return;\n const stream = doc.stream(doc.dict(this.resources.get('XObject'))?.get(nameValue.value));\n if (!stream) return;\n const subtype = doc.name(stream.dict.get('Subtype'));\n if (subtype === 'Image') this.placeImage(stream);\n else if (subtype === 'Form' && depth < MAX_FORM_DEPTH) this.runForm(stream, depth);\n }\n\n private runForm(stream: PdfStream, depth: number) {\n const { doc } = this;\n const saved = { ...this.state };\n const savedResources = this.resources;\n const savedText: [Matrix, Matrix] = [this.textMatrix, this.lineMatrix];\n const matrix = doc.numbers(stream.dict.get('Matrix'));\n if (matrix?.length === 6) this.state.ctm = multiply(matrix as Matrix, this.state.ctm);\n this.resources = doc.dict(stream.dict.get('Resources')) ?? this.resources;\n this.execute(doc.bytes(stream), depth + 1);\n this.state = saved;\n this.resources = savedResources;\n [this.textMatrix, this.lineMatrix] = savedText;\n }\n\n private placeImage(stream: PdfStream) {\n const { ctm } = this.state;\n const corners = [apply(ctm, 0, 0), apply(ctm, 1, 0), apply(ctm, 0, 1), apply(ctm, 1, 1)];\n const xs = corners.map(([x]) => x);\n const ys = corners.map(([, y]) => y);\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n const width = Math.max(...xs) - x;\n const height = Math.max(...ys) - y;\n if (width < MIN_IMAGE_SIZE || height < MIN_IMAGE_SIZE) return;\n const src = this.reader.image(stream);\n if (src) this.content.images.push({ src, x, y, width, height });\n }\n}\n\nconst isSpace = (byte: number | undefined) =>\n byte === undefined || byte === 0x20 || byte === 0x0a || byte === 0x0d || byte === 0x09;\n\n/** Next occurrence of a two-letter keyword that stands alone, since image bytes may spell it too. */\nconst findKeyword = (lexer: Lexer, keyword: string, from: number): number => {\n let position = lexer.indexOf(keyword, from);\n while (position >= 0 && !(isSpace(lexer.data[position - 1]) && isSpace(lexer.data[position + 2]))) {\n position = lexer.indexOf(keyword, position + 2);\n }\n return position;\n};\n\n/**\n * Moves past an inline image, `BI … ID data EI`, found by scanning the bytes; its data is not PDF syntax. Inline\n * images are small marks rather than document pictures, so they are not placed.\n */\nconst skipInlineImage = (lexer: Lexer) => {\n const data = findKeyword(lexer, 'ID', lexer.position);\n const end = data < 0 ? -1 : findKeyword(lexer, 'EI', data + 3);\n lexer.position = end < 0 ? lexer.data.length : end + 2;\n};\n","/**\n * Synchronous zlib/DEFLATE decoder (RFC 1950/1951). PDF streams are decoded while objects are resolved, which keeps\n * the whole reader synchronous; the browser's `DecompressionStream` is asynchronous and rejects the truncated or\n * checksum-less streams that many PDF writers produce. Decoding is lenient: a damaged stream yields the bytes read so\n * far instead of an error.\n */\n\n/** Largest code length of DEFLATE Huffman codes. */\nconst MAX_BITS = 15;\n\n/** Base lengths and extra bits of length codes 257..285. */\nconst LENGTH_BASE = [\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258\n];\nconst LENGTH_EXTRA = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\n/** Base distances and extra bits of distance codes 0..29. */\nconst DISTANCE_BASE = [\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12_289, 16_385, 24_577\n];\nconst DISTANCE_EXTRA = [\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13\n];\n/** Order in which the code length code lengths of a dynamic block are stored. */\nconst CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n\n/**\n * A canonical Huffman code as counts per length and symbols sorted by code: decoding walks the lengths, which needs\n * no lookup tables and stays fast enough for the streams of office documents.\n */\ninterface Huffman {\n counts: Uint16Array;\n symbols: Uint16Array;\n}\n\nconst buildHuffman = (lengths: ArrayLike<number>): Huffman => {\n const counts = new Uint16Array(MAX_BITS + 1);\n for (let index = 0; index < lengths.length; index += 1) {\n const length = lengths[index] as number;\n counts[length] = (counts[length] as number) + 1;\n }\n counts[0] = 0;\n const offsets = new Uint16Array(MAX_BITS + 1);\n for (let length = 1; length < MAX_BITS; length += 1) {\n offsets[length + 1] = (offsets[length] as number) + (counts[length] as number);\n }\n const symbols = new Uint16Array(lengths.length);\n for (let symbol = 0; symbol < lengths.length; symbol += 1) {\n const length = lengths[symbol] as number;\n if (!length) continue;\n const offset = offsets[length] as number;\n symbols[offset] = symbol;\n offsets[length] = offset + 1;\n }\n return { counts, symbols };\n};\n\nconst FIXED_LITERALS = buildHuffman(\n Array.from({ length: 288 }, (_, symbol) => (symbol < 144 ? 8 : symbol < 256 ? 9 : symbol < 280 ? 7 : 8))\n);\nconst FIXED_DISTANCES = buildHuffman(new Array(30).fill(5));\n\n/** Raised when the input ends or holds an invalid code; the decoder then returns what it has. */\nclass EndOfData extends Error {}\n\nclass Inflater {\n private position: number;\n private bitBuffer = 0;\n private bitCount = 0;\n private output: Uint8Array;\n private length = 0;\n\n constructor(\n private readonly input: Uint8Array,\n start: number\n ) {\n this.position = start;\n // Office streams usually compress three to six times; the buffer doubles when that guess is short.\n this.output = new Uint8Array(Math.max(1024, input.length * 4));\n }\n\n run(): Uint8Array {\n try {\n let last = 0;\n while (!last) {\n last = this.bits(1);\n const type = this.bits(2);\n if (type === 0) this.stored();\n else if (type === 1) this.codes(FIXED_LITERALS, FIXED_DISTANCES);\n else if (type === 2) this.dynamic();\n else throw new EndOfData();\n }\n } catch (error) {\n if (!(error instanceof EndOfData)) throw error;\n }\n return this.output.subarray(0, this.length);\n }\n\n private bits(count: number): number {\n while (this.bitCount < count) {\n if (this.position >= this.input.length) throw new EndOfData();\n this.bitBuffer |= (this.input[this.position++] as number) << this.bitCount;\n this.bitCount += 8;\n }\n const value = this.bitBuffer & ((1 << count) - 1);\n this.bitBuffer >>>= count;\n this.bitCount -= count;\n return value;\n }\n\n private ensure(extra: number) {\n if (this.length + extra <= this.output.length) return;\n let size = this.output.length * 2;\n while (size < this.length + extra) size *= 2;\n const grown = new Uint8Array(size);\n grown.set(this.output.subarray(0, this.length));\n this.output = grown;\n }\n\n private stored() {\n this.bitBuffer = 0;\n this.bitCount = 0;\n if (this.position + 4 > this.input.length) throw new EndOfData();\n const size = (this.input[this.position] as number) | ((this.input[this.position + 1] as number) << 8);\n this.position += 4;\n const available = Math.min(size, this.input.length - this.position);\n this.ensure(available);\n this.output.set(this.input.subarray(this.position, this.position + available), this.length);\n this.length += available;\n this.position += available;\n if (available < size) throw new EndOfData();\n }\n\n private decode(huffman: Huffman): number {\n let code = 0;\n let first = 0;\n let index = 0;\n for (let length = 1; length <= MAX_BITS; length += 1) {\n code |= this.bits(1);\n const count = huffman.counts[length] as number;\n if (code - count < first) return huffman.symbols[index + (code - first)] as number;\n index += count;\n first = (first + count) << 1;\n code <<= 1;\n }\n throw new EndOfData();\n }\n\n private codes(literals: Huffman, distances: Huffman) {\n for (;;) {\n const symbol = this.decode(literals);\n if (symbol < 256) {\n this.ensure(1);\n this.output[this.length++] = symbol;\n continue;\n }\n if (symbol === 256) return;\n const lengthCode = symbol - 257;\n if (lengthCode >= 29) throw new EndOfData();\n const size = (LENGTH_BASE[lengthCode] as number) + this.bits(LENGTH_EXTRA[lengthCode] as number);\n const distanceCode = this.decode(distances);\n if (distanceCode >= 30) throw new EndOfData();\n const distance = (DISTANCE_BASE[distanceCode] as number) + this.bits(DISTANCE_EXTRA[distanceCode] as number);\n if (distance > this.length) throw new EndOfData();\n this.ensure(size);\n // Copies byte by byte, because a match may overlap the bytes it produces.\n for (let copied = 0; copied < size; copied += 1) {\n this.output[this.length] = this.output[this.length - distance] as number;\n this.length += 1;\n }\n }\n }\n\n private dynamic() {\n const literalCount = this.bits(5) + 257;\n const distanceCount = this.bits(5) + 1;\n const codeLengthCount = this.bits(4) + 4;\n const codeLengths = new Uint8Array(19);\n for (let index = 0; index < codeLengthCount; index += 1) {\n codeLengths[CODE_LENGTH_ORDER[index] as number] = this.bits(3);\n }\n const codeLengthCode = buildHuffman(codeLengths);\n const lengths = new Uint8Array(literalCount + distanceCount);\n for (let index = 0; index < lengths.length; ) {\n const symbol = this.decode(codeLengthCode);\n if (symbol < 16) {\n lengths[index++] = symbol;\n continue;\n }\n let repeat: number;\n let value = 0;\n if (symbol === 16) {\n if (index === 0) throw new EndOfData();\n value = lengths[index - 1] as number;\n repeat = 3 + this.bits(2);\n } else if (symbol === 17) {\n repeat = 3 + this.bits(3);\n } else {\n repeat = 11 + this.bits(7);\n }\n if (index + repeat > lengths.length) throw new EndOfData();\n lengths.fill(value, index, index + repeat);\n index += repeat;\n }\n this.codes(buildHuffman(lengths.subarray(0, literalCount)), buildHuffman(lengths.subarray(literalCount)));\n }\n}\n\n/** Whether two bytes form a valid zlib header with the DEFLATE method. */\nconst hasZlibHeader = (data: Uint8Array): boolean => {\n const method = data[0] ?? 0;\n const flags = data[1] ?? 0;\n return (method & 0x0f) === 8 && ((method << 8) | flags) % 31 === 0;\n};\n\n/**\n * Decodes zlib data, or raw DEFLATE data when the zlib header is missing. The Adler-32 checksum is not verified:\n * PDF writers get it wrong often enough that checking it would only lose content.\n */\nexport const inflate = (data: Uint8Array): Uint8Array => new Inflater(data, hasZlibHeader(data) ? 2 : 0).run();\n","/**\n * Stream filters of the PDF specification that carry text and structure: Flate (with PNG and TIFF predictors), LZW,\n * ASCIIHex, ASCII85 and RunLength. Image codecs (DCT, JPX, CCITT, JBIG2) stop the chain: their data is handed on as\n * it is, so JPEG pictures can be embedded without re-encoding.\n */\nimport { inflate } from './inflate';\n\n/** Filters whose output is an image format; decoding stops in front of them. */\nexport const IMAGE_FILTERS = new Set(['DCTDecode', 'DCT', 'JPXDecode', 'CCITTFaxDecode', 'CCF', 'JBIG2Decode']);\n\n/** Predictor settings from a filter's `DecodeParms`. */\nexport interface PredictorParams {\n predictor: number;\n colors: number;\n bitsPerComponent: number;\n columns: number;\n /** LZW only: whether code widths grow one code early, as the specification's default. */\n earlyChange: number;\n}\n\nexport const DEFAULT_PREDICTOR: PredictorParams = {\n predictor: 1,\n colors: 1,\n bitsPerComponent: 8,\n columns: 1,\n earlyChange: 1\n};\n\nconst isWhitespace = (byte: number) =>\n byte === 0x20 || byte === 0x0a || byte === 0x0d || byte === 0x09 || byte === 0x0c || byte === 0x00;\n\nconst hexValue = (byte: number): number => {\n if (byte >= 0x30 && byte <= 0x39) return byte - 0x30;\n if (byte >= 0x41 && byte <= 0x46) return byte - 0x37;\n if (byte >= 0x61 && byte <= 0x66) return byte - 0x57;\n return -1;\n};\n\nconst asciiHex = (data: Uint8Array): Uint8Array => {\n const output = new Uint8Array((data.length + 1) >> 1);\n let length = 0;\n let high = -1;\n for (const byte of data) {\n if (byte === 0x3e) break;\n const value = hexValue(byte);\n if (value < 0) continue;\n if (high < 0) high = value;\n else {\n output[length++] = (high << 4) | value;\n high = -1;\n }\n }\n // An odd final digit is followed by an implied zero.\n if (high >= 0) output[length++] = high << 4;\n return output.subarray(0, length);\n};\n\nconst ascii85 = (data: Uint8Array): Uint8Array => {\n const output = new Uint8Array(Math.ceil((data.length * 4) / 5) + 4);\n let length = 0;\n let group = 0;\n let count = 0;\n const flush = (bytes: number) => {\n for (let shift = 3; shift >= 4 - bytes; shift -= 1) output[length++] = (group >>> (shift * 8)) & 0xff;\n };\n for (let index = 0; index < data.length; index += 1) {\n const byte = data[index] as number;\n if (byte === 0x7e) break;\n if (isWhitespace(byte)) continue;\n if (byte === 0x7a && count === 0) {\n output.fill(0, length, length + 4);\n length += 4;\n continue;\n }\n if (byte < 0x21 || byte > 0x75) continue;\n group = group * 85 + (byte - 0x21);\n count += 1;\n if (count === 5) {\n flush(4);\n group = 0;\n count = 0;\n }\n }\n if (count > 1) {\n // A partial group is padded with the highest digit and yields one byte less than its digits.\n for (let pad = count; pad < 5; pad += 1) group = group * 85 + 84;\n flush(count - 1);\n }\n return output.subarray(0, length);\n};\n\nconst runLength = (data: Uint8Array): Uint8Array => {\n const chunks: number[] = [];\n for (let index = 0; index < data.length; ) {\n const control = data[index++] as number;\n if (control === 128) break;\n if (control < 128) {\n for (let copied = 0; copied <= control && index < data.length; copied += 1) chunks.push(data[index++] as number);\n } else {\n const value = data[index++] ?? 0;\n for (let repeat = 0; repeat < 257 - control; repeat += 1) chunks.push(value);\n }\n }\n return Uint8Array.from(chunks);\n};\n\nconst lzw = (data: Uint8Array, earlyChange: number): Uint8Array => {\n const output: number[] = [];\n let dictionary: number[][] = [];\n const reset = () => {\n dictionary = Array.from({ length: 258 }, (_, code) => (code < 256 ? [code] : []));\n };\n reset();\n let width = 9;\n let buffer = 0;\n let bits = 0;\n let previous: number[] | null = null;\n for (const byte of data) {\n buffer = (buffer << 8) | byte;\n bits += 8;\n while (bits >= width) {\n const code = (buffer >>> (bits - width)) & ((1 << width) - 1);\n bits -= width;\n if (code === 256) {\n reset();\n width = 9;\n previous = null;\n continue;\n }\n if (code === 257) return Uint8Array.from(output);\n const entry: number[] | undefined =\n dictionary[code] ?? (previous && code === dictionary.length ? [...previous, previous[0] as number] : undefined);\n if (!entry) return Uint8Array.from(output);\n for (const value of entry) output.push(value);\n if (previous) dictionary.push([...previous, entry[0] as number]);\n previous = entry;\n const limit = dictionary.length + earlyChange;\n if (limit >= 1 << width && width < 12) width += 1;\n }\n }\n return Uint8Array.from(output);\n};\n\n/** Paeth predictor of the PNG specification. */\nconst paeth = (left: number, up: number, upLeft: number) => {\n const estimate = left + up - upLeft;\n const toLeft = Math.abs(estimate - left);\n const toUp = Math.abs(estimate - up);\n const toUpLeft = Math.abs(estimate - upLeft);\n if (toLeft <= toUp && toLeft <= toUpLeft) return left;\n return toUp <= toUpLeft ? up : upLeft;\n};\n\n/** Undoes a PNG (10..15) or TIFF (2) predictor. */\nconst unpredict = (data: Uint8Array, params: PredictorParams): Uint8Array => {\n const { predictor, colors, bitsPerComponent, columns } = params;\n if (predictor < 2) return data;\n const pixelBytes = Math.max(1, Math.ceil((colors * bitsPerComponent) / 8));\n const rowBytes = Math.ceil((colors * bitsPerComponent * columns) / 8);\n if (predictor === 2) {\n // TIFF predictor: only the common 8-bit case, which is what PDF writers use.\n if (bitsPerComponent !== 8) return data;\n const output = data.slice();\n for (let row = 0; row + rowBytes <= output.length; row += rowBytes) {\n for (let index = pixelBytes; index < rowBytes; index += 1) {\n output[row + index] = ((output[row + index] as number) + (output[row + index - pixelBytes] as number)) & 0xff;\n }\n }\n return output;\n }\n const rows = Math.floor(data.length / (rowBytes + 1));\n const output = new Uint8Array(rows * rowBytes);\n for (let row = 0; row < rows; row += 1) {\n const source = row * (rowBytes + 1);\n const target = row * rowBytes;\n const filter = data[source] as number;\n for (let index = 0; index < rowBytes; index += 1) {\n const raw = data[source + 1 + index] as number;\n const left = index >= pixelBytes ? (output[target + index - pixelBytes] as number) : 0;\n const up = row > 0 ? (output[target - rowBytes + index] as number) : 0;\n const upLeft = row > 0 && index >= pixelBytes ? (output[target - rowBytes + index - pixelBytes] as number) : 0;\n let value = raw;\n if (filter === 1) value = raw + left;\n else if (filter === 2) value = raw + up;\n else if (filter === 3) value = raw + ((left + up) >> 1);\n else if (filter === 4) value = raw + paeth(left, up, upLeft);\n output[target + index] = value & 0xff;\n }\n }\n return output;\n};\n\n/**\n * Applies one decoding filter.\n *\n * @throws Error for a filter this reader does not implement.\n */\nexport const applyFilter = (name: string, data: Uint8Array, params: PredictorParams): Uint8Array => {\n switch (name) {\n case 'FlateDecode':\n case 'Fl':\n return unpredict(inflate(data), params);\n case 'LZWDecode':\n case 'LZW':\n return unpredict(lzw(data, params.earlyChange), params);\n case 'ASCIIHexDecode':\n case 'AHx':\n return asciiHex(data);\n case 'ASCII85Decode':\n case 'A85':\n return ascii85(data);\n case 'RunLengthDecode':\n case 'RL':\n return runLength(data);\n default:\n throw new Error(`Unsupported PDF filter: ${name}`);\n }\n};\n","/**\n * Random access to the objects of a PDF file: cross-reference tables and streams (with their update chain), object\n * streams, and a full scan of the file when the cross-references are broken. Objects are parsed on first use and\n * cached, and stream data is decoded on demand.\n */\nimport { PdfImportError } from './errors';\nimport { DEFAULT_PREDICTOR, IMAGE_FILTERS, type PredictorParams, applyFilter } from './filters';\nimport {\n EOF,\n Lexer,\n Parser,\n PdfDict,\n PdfName,\n type PdfObject,\n PdfRef,\n PdfStream,\n bytesToLatin1,\n isOperator\n} from './objects';\n\n/** Where an object is stored. */\ntype XrefEntry = { kind: 'offset'; offset: number } | { kind: 'compressed'; stream: number; index: number };\n\n/** A page with the attributes it inherits from the page tree. */\nexport interface PdfPage {\n dict: PdfDict;\n resources: PdfDict;\n /** Visible area in default user space: `[x0, y0, x1, y1]`. */\n box: [number, number, number, number];\n /** Clockwise rotation in degrees: 0, 90, 180 or 270. */\n rotate: number;\n}\n\n/** Page tree nodes deeper than this are treated as a loop. */\nconst MAX_TREE_DEPTH = 64;\n/** How far from the end of the file `startxref` is looked for. */\nconst STARTXREF_WINDOW = 2048;\n\nexport class PdfDocument {\n private readonly xref = new Map<number, XrefEntry>();\n private readonly cache = new Map<number, PdfObject>();\n /** Objects being loaded, to stop reference loops such as a `/Length` pointing back at its stream. */\n private readonly loading = new Set<number>();\n private readonly objectStreams = new Map<number, { offsets: number[]; data: Uint8Array; first: number }>();\n private trailer = new PdfDict();\n /** Whether the cross-references were rebuilt by scanning, which is done at most once. */\n private repaired = false;\n\n constructor(readonly data: Uint8Array) {\n if (bytesToLatin1(data, 0, Math.min(1024, data.length)).indexOf('%PDF-') < 0) {\n throw new PdfImportError('invalid');\n }\n try {\n this.readXrefChain();\n } catch {\n this.xref.clear();\n }\n if (!(this.get(this.trailer.get('Root')) instanceof PdfDict)) this.rebuildXref();\n if (!(this.get(this.trailer.get('Root')) instanceof PdfDict)) throw new PdfImportError('invalid');\n if (this.trailer.has('Encrypt')) throw new PdfImportError('encrypted');\n }\n\n // ---------------------------------------------------------------------------------------------------------------\n // Typed access\n\n /** Resolves a reference; other values are returned as they are. */\n get(value: PdfObject | undefined): PdfObject | undefined {\n return value instanceof PdfRef ? this.object(value.num) : value;\n }\n\n dict(value: PdfObject | undefined): PdfDict | undefined {\n const resolved = this.get(value);\n if (resolved instanceof PdfDict) return resolved;\n return resolved instanceof PdfStream ? resolved.dict : undefined;\n }\n\n number(value: PdfObject | undefined): number | undefined {\n const resolved = this.get(value);\n return typeof resolved === 'number' ? resolved : undefined;\n }\n\n name(value: PdfObject | undefined): string | undefined {\n const resolved = this.get(value);\n return resolved instanceof PdfName ? resolved.value : undefined;\n }\n\n array(value: PdfObject | undefined): PdfObject[] | undefined {\n const resolved = this.get(value);\n return Array.isArray(resolved) ? resolved : undefined;\n }\n\n numbers(value: PdfObject | undefined): number[] | undefined {\n return this.array(value)?.map(item => this.number(item) ?? 0);\n }\n\n stream(value: PdfObject | undefined): PdfStream | undefined {\n const resolved = this.get(value);\n return resolved instanceof PdfStream ? resolved : undefined;\n }\n\n // ---------------------------------------------------------------------------------------------------------------\n // Streams\n\n /** Filter names of a stream, in the order they are applied. */\n filters(stream: PdfStream): string[] {\n const filter = this.get(stream.dict.get('Filter'));\n const list = Array.isArray(filter) ? filter : filter ? [filter] : [];\n return list.map(item => this.name(item) ?? '').filter(Boolean);\n }\n\n /**\n * Decoded stream data. Decoding stops in front of an image codec, so a JPEG picture comes back as its JPEG bytes;\n * `imageFilter` then names that codec.\n */\n decode(stream: PdfStream): { data: Uint8Array; imageFilter?: string } {\n const filters = this.filters(stream);\n const parms = this.get(stream.dict.get('DecodeParms') ?? stream.dict.get('DP'));\n const parmsList = Array.isArray(parms) ? parms : [parms];\n let data = stream.raw;\n for (let index = 0; index < filters.length; index += 1) {\n const filter = filters[index] as string;\n if (IMAGE_FILTERS.has(filter)) return { data, imageFilter: filter };\n data = applyFilter(filter, data, this.predictor(parmsList[index] ?? parmsList[0]));\n }\n return { data };\n }\n\n /** Decoded data of a stream, or an empty array when it cannot be decoded. */\n bytes(value: PdfObject | undefined): Uint8Array {\n const stream = this.stream(value);\n if (!stream) return new Uint8Array(0);\n try {\n return this.decode(stream).data;\n } catch {\n return new Uint8Array(0);\n }\n }\n\n private predictor(value: PdfObject | undefined): PredictorParams {\n const dict = this.dict(value);\n if (!dict) return DEFAULT_PREDICTOR;\n const read = (key: string, fallback: number) => this.number(dict.get(key)) ?? fallback;\n return {\n predictor: read('Predictor', 1),\n colors: read('Colors', 1),\n bitsPerComponent: read('BitsPerComponent', 8),\n columns: read('Columns', 1),\n earlyChange: read('EarlyChange', 1)\n };\n }\n\n // ---------------------------------------------------------------------------------------------------------------\n // Pages\n\n /** The pages in order, with inherited resources, boxes and rotation applied. */\n pages(): PdfPage[] {\n const pages: PdfPage[] = [];\n const root = this.dict(this.trailer.get('Root'));\n const visited = new Set<PdfDict>();\n const walk = (node: PdfDict | undefined, inherited: Partial<PdfPage>, depth: number) => {\n if (!node || visited.has(node) || depth > MAX_TREE_DEPTH) return;\n visited.add(node);\n const resources = this.dict(node.get('Resources')) ?? inherited.resources;\n const box = this.box(node.get('CropBox')) ?? this.box(node.get('MediaBox')) ?? inherited.box;\n const rotate = this.number(node.get('Rotate')) ?? inherited.rotate;\n const kids = this.array(node.get('Kids'));\n if (kids && this.name(node.get('Type')) !== 'Page') {\n for (const kid of kids) walk(this.dict(kid), { resources, box, rotate }, depth + 1);\n return;\n }\n pages.push({\n dict: node,\n resources: resources ?? new PdfDict(),\n box: box ?? [0, 0, 595.28, 841.89],\n rotate: (((rotate ?? 0) % 360) + 360) % 360\n });\n };\n walk(this.dict(root?.get('Pages')), {}, 0);\n return pages;\n }\n\n private box(value: PdfObject | undefined): [number, number, number, number] | undefined {\n const numbers = this.numbers(value);\n if (!numbers || numbers.length < 4) return undefined;\n const [x0, y0, x1, y1] = numbers as [number, number, number, number];\n if (x0 === x1 || y0 === y1) return undefined;\n return [Math.min(x0, x1), Math.min(y0, y1), Math.max(x0, x1), Math.max(y0, y1)];\n }\n\n /** Concatenated, decoded content streams of a page. */\n contents(page: PdfPage): Uint8Array {\n const contents = this.get(page.dict.get('Contents'));\n const parts = (Array.isArray(contents) ? contents : [contents]).map(part => this.bytes(part));\n const size = parts.reduce((sum, part) => sum + part.length + 1, 0);\n const joined = new Uint8Array(size);\n let offset = 0;\n for (const part of parts) {\n joined.set(part, offset);\n // Streams are split at arbitrary points, but never inside a token; a newline keeps them apart.\n joined[offset + part.length] = 0x0a;\n offset += part.length + 1;\n }\n return joined;\n }\n\n // ---------------------------------------------------------------------------------------------------------------\n // Objects\n\n private object(num: number): PdfObject {\n if (this.cache.has(num)) return this.cache.get(num) as PdfObject;\n const entry = this.xref.get(num);\n if (!entry || this.loading.has(num)) return null;\n this.loading.add(num);\n let value: PdfObject | undefined;\n try {\n value = entry.kind === 'offset' ? this.objectAt(entry.offset, num) : this.compressedObject(entry);\n } catch {\n value = null;\n } finally {\n this.loading.delete(num);\n }\n // An offset that misses its object means stale cross-references; a scan of the file finds the object.\n if (value === undefined && !this.repaired) {\n this.rebuildXref();\n return this.object(num);\n }\n this.cache.set(num, value ?? null);\n return value ?? null;\n }\n\n private parserAt(offset: number): Parser {\n return new Parser(new Lexer(this.data, offset), length => this.number(length));\n }\n\n /** Parses `num gen obj … endobj` at an offset; `undefined` when the offset does not hold that object. */\n private objectAt(offset: number, expected?: number): PdfObject | undefined {\n const parser = this.parserAt(offset);\n const num = parser.next();\n const gen = parser.next();\n const keyword = parser.next();\n if (typeof num !== 'number' || typeof gen !== 'number' || !isOperator(keyword, 'obj')) return undefined;\n if (expected !== undefined && num !== expected) return undefined;\n return parser.value();\n }\n\n private compressedObject(entry: { stream: number; index: number }): PdfObject {\n let container = this.objectStreams.get(entry.stream);\n if (!container) {\n const stream = this.stream(this.object(entry.stream));\n if (!stream) return null;\n const data = this.decode(stream).data;\n const count = this.number(stream.dict.get('N')) ?? 0;\n const first = this.number(stream.dict.get('First')) ?? 0;\n const header = new Parser(new Lexer(data));\n const offsets: number[] = [];\n for (let index = 0; index < count; index += 1) {\n header.next();\n offsets.push(Number(header.next()));\n }\n container = { offsets, data, first };\n this.objectStreams.set(entry.stream, container);\n }\n const offset = container.offsets[entry.index];\n if (offset === undefined) return null;\n return new Parser(new Lexer(container.data, container.first + offset)).value();\n }\n\n // ---------------------------------------------------------------------------------------------------------------\n // Cross-references\n\n /** Follows `startxref` and every `/Prev`; entries of newer sections win. */\n private readXrefChain() {\n const tail = bytesToLatin1(this.data, Math.max(0, this.data.length - STARTXREF_WINDOW));\n const match = /startxref\\s+(\\d+)/g;\n let offset: number | undefined;\n for (let found = match.exec(tail); found; found = match.exec(tail)) offset = Number(found[1]);\n const seen = new Set<number>();\n let first = true;\n while (offset !== undefined && !seen.has(offset) && offset < this.data.length) {\n seen.add(offset);\n const trailer = this.readXrefSection(offset);\n if (!trailer) break;\n if (first) this.trailer = trailer;\n first = false;\n // A hybrid file also lists its compressed objects in a cross-reference stream.\n const hybrid = this.number(trailer.get('XRefStm'));\n if (hybrid !== undefined && !seen.has(hybrid)) this.readXrefSection(hybrid);\n offset = this.number(trailer.get('Prev'));\n }\n }\n\n private readXrefSection(offset: number): PdfDict | undefined {\n const lexer = new Lexer(this.data, offset);\n const saved = lexer.position;\n if (isOperator(lexer.next(), 'xref')) return this.readXrefTable(lexer);\n lexer.position = saved;\n const stream = this.stream(this.objectAt(offset));\n return stream ? this.readXrefStream(stream) : undefined;\n }\n\n private readXrefTable(lexer: Lexer): PdfDict | undefined {\n const parser = new Parser(lexer);\n for (;;) {\n const start = parser.next();\n if (isOperator(start, 'trailer')) break;\n const count = parser.next();\n if (typeof start !== 'number' || typeof count !== 'number') return undefined;\n for (let index = 0; index < count; index += 1) {\n const position = parser.next();\n parser.next();\n const type = parser.next();\n const num = start + index;\n if (typeof position !== 'number' || this.xref.has(num)) continue;\n if (isOperator(type, 'n') && position > 0) this.xref.set(num, { kind: 'offset', offset: position });\n }\n }\n const trailer = parser.value();\n return trailer instanceof PdfDict ? trailer : undefined;\n }\n\n private readXrefStream(stream: PdfStream): PdfDict {\n const widths = this.numbers(stream.dict.get('W')) ?? [1, 2, 1];\n const size = this.number(stream.dict.get('Size')) ?? 0;\n const index = this.numbers(stream.dict.get('Index')) ?? [0, size];\n const data = this.decode(stream).data;\n const rowSize = widths.reduce((sum, width) => sum + width, 0);\n const field = (row: number, column: number, fallback: number) => {\n const width = widths[column] ?? 0;\n if (!width) return fallback;\n let start = row * rowSize;\n for (let before = 0; before < column; before += 1) start += widths[before] ?? 0;\n let value = 0;\n for (let byte = 0; byte < width; byte += 1) value = value * 256 + (data[start + byte] ?? 0);\n return value;\n };\n let row = 0;\n for (let range = 0; range + 1 < index.length; range += 2) {\n const first = index[range] as number;\n const count = index[range + 1] as number;\n for (let offset = 0; offset < count && (row + 1) * rowSize <= data.length; offset += 1, row += 1) {\n const num = first + offset;\n if (this.xref.has(num)) continue;\n const type = field(row, 0, 1);\n if (type === 1) this.xref.set(num, { kind: 'offset', offset: field(row, 1, 0) });\n else if (type === 2)\n this.xref.set(num, { kind: 'compressed', stream: field(row, 1, 0), index: field(row, 2, 0) });\n }\n }\n return stream.dict;\n }\n\n /** Rebuilds the cross-references by scanning the file for `num gen obj`; later definitions win. */\n private rebuildXref() {\n this.repaired = true;\n this.xref.clear();\n this.cache.clear();\n this.objectStreams.clear();\n const text = new TextDecoder('latin1').decode(this.data);\n const pattern = /(\\d+)\\s+(\\d+)\\s+obj\\b/g;\n for (let match = pattern.exec(text); match; match = pattern.exec(text)) {\n this.xref.set(Number(match[1]), { kind: 'offset', offset: match.index });\n }\n let trailer: PdfDict | undefined;\n for (const [num, entry] of this.xref) {\n if (entry.kind !== 'offset') continue;\n const value = this.object(num);\n if (!(value instanceof PdfStream)) continue;\n const type = this.name(value.dict.get('Type'));\n // Object streams hold objects the scan cannot see; their entries come from the streams themselves.\n if (type === 'ObjStm') this.indexObjectStream(num, value);\n if (type === 'XRef' && value.dict.has('Root')) trailer = value.dict;\n }\n // A classic trailer wins over cross-reference streams; the last one describes the newest revision.\n for (\n let position = text.lastIndexOf('trailer');\n position >= 0;\n position = text.lastIndexOf('trailer', position - 1)\n ) {\n const value = this.parserAt(position + 'trailer'.length).value();\n if (value instanceof PdfDict && value.has('Root')) {\n trailer = value;\n break;\n }\n }\n if (!trailer) {\n // No trailer at all: the catalog is found by its type.\n for (const num of this.xref.keys()) {\n const value = this.object(num);\n if (value instanceof PdfDict && this.name(value.get('Type')) === 'Catalog') {\n trailer = new PdfDict();\n trailer.entries.set('Root', new PdfRef(num, 0));\n }\n }\n }\n this.trailer = trailer ?? new PdfDict();\n }\n\n private indexObjectStream(num: number, stream: PdfStream) {\n const count = this.number(stream.dict.get('N')) ?? 0;\n const header = new Parser(new Lexer(this.bytes(stream)));\n for (let index = 0; index < count; index += 1) {\n const inner = header.next();\n header.next();\n if (inner === EOF) return;\n if (typeof inner === 'number' && !this.xref.has(inner)) {\n this.xref.set(inner, { kind: 'compressed', stream: num, index });\n }\n }\n }\n}\n","/**\n * Rebuilds document structure from positioned text: spans become lines, repeated lines at the page edges become the\n * header and footer, aligned columns become tables, and lines become paragraphs, headings and lists with their\n * alignment, indents and spacing. The result is editor HTML and the page setup the text was laid out on.\n */\nimport { MARGIN_PRESETS, PAGE_SIZES, type PageHeaderFooter, type PageSettings, type PageSizeKey } from '../page';\nimport type { Box, PageContent, PageImage, TextSpan } from './content';\n\n/** CSS pixels per PDF point. */\nconst PX_PER_PT = 96 / 72;\nconst MM_PER_PT = 25.4 / 72;\n/** Font size of the editor's paragraphs; runs of that size need no size of their own. */\nconst EDITOR_FONT_SIZE = 12;\n/** Font family of the editor's paragraphs. */\nconst EDITOR_FONT_FAMILY = 'Times New Roman';\n/** Paper sizes that differ by less than this many millimetres count as the same format. */\nconst PAPER_TOLERANCE_MM = 3;\n/** Share of the page height at the top and bottom where running headers and footers live. */\nconst RUNNING_ZONE = 0.12;\n/** A gap wider than this many font sizes separates table cells rather than words. */\nconst CELL_GAP_EM = 1.6;\n/** Cell edges within this many points belong to the same column. */\nconst COLUMN_TOLERANCE = 8;\n/** A page whose text ends above this share of its height ends with a page break. */\nconst PAGE_FULL = 0.75;\n\n/** A styled piece of a line. */\ninterface Run {\n text: string;\n size: number;\n bold: boolean;\n italic: boolean;\n family: string | undefined;\n color: string;\n}\n\n/** Text of one line of a table cell or a paragraph, with its horizontal extent. */\ninterface Segment {\n left: number;\n right: number;\n runs: Run[];\n text: string;\n}\n\ninterface Line {\n page: number;\n /** Baseline, in points from the page top. */\n baseline: number;\n left: number;\n right: number;\n /** Size of most of the line's text. */\n size: number;\n /** Whether most of the line's text is bold. */\n bold: boolean;\n /** The line split at wide gaps: one segment for running text, several for table rows. */\n cells: Segment[];\n text: string;\n}\n\n/** Measures of the page area that holds the running text. */\ninterface TextArea {\n left: number;\n right: number;\n}\n\ntype Block =\n | { kind: 'lines'; lines: Line[] }\n | { kind: 'table'; rows: Segment[][][]; columns: number[]; right: number; bordered: boolean }\n | { kind: 'image'; image: PageImage; area: TextArea }\n | { kind: 'break' };\n\n/** What the layout step produces. */\nexport interface LayoutResult {\n html: string;\n page: PageSettings;\n /** Number of text characters read, to tell a scanned document from an empty one. */\n characters: number;\n}\n\nconst escapeHtml = (value: string): string =>\n value.replace(\n /[&<>\"]/g,\n character => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[character] ?? character\n );\n\nconst round = (value: number, step = 1) => Math.round(value / step) * step;\n\nconst median = (values: number[]): number | undefined => {\n if (!values.length) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.floor(sorted.length / 2)];\n};\n\nconst percentile = (values: number[], share: number): number | undefined => {\n if (!values.length) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * share))];\n};\n\n/** The value that carries the most weight, such as the font size of most characters. */\nconst weightedMode = (entries: Array<[number, number]>): number | undefined => {\n const weights = new Map<number, number>();\n for (const [value, weight] of entries) weights.set(value, (weights.get(value) ?? 0) + weight);\n let best: number | undefined;\n for (const [value, weight] of weights) if (best === undefined || weight > (weights.get(best) ?? 0)) best = value;\n return best;\n};\n\nconst isSameStyle = (a: Run, b: Run) =>\n a.size === b.size && a.bold === b.bold && a.italic === b.italic && a.family === b.family && a.color === b.color;\n\n/** Appends text to a run list, merging it into the last run when the style matches. */\nconst pushRun = (runs: Run[], run: Run) => {\n const last = runs.at(-1);\n if (last && isSameStyle(last, run)) last.text += run.text;\n else runs.push({ ...run });\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// Lines\n\nconst runOf = (span: TextSpan): Run => ({\n text: span.text,\n size: round(span.size, 0.5),\n bold: span.bold,\n italic: span.italic,\n family: span.family,\n // Near-black text reads as the default colour.\n color: /^#[0-2][\\da-f][0-2][\\da-f][0-2][\\da-f]$/i.test(span.color) ? '#000000' : span.color.toLowerCase()\n});\n\n/** Joins the spans of one baseline into segments, adding the spaces the gaps stand for. */\nconst segmentsOf = (spans: TextSpan[], size: number): Segment[] => {\n const segments: Segment[] = [];\n let current: Segment | undefined;\n let end = Number.NEGATIVE_INFINITY;\n for (const span of spans) {\n const gap = span.x - end;\n const afterMarker = current !== undefined && MARKER_ONLY.test(current.text.trim());\n if (!current || (gap > Math.max(CELL_GAP_EM * size, 12) && !afterMarker)) {\n current = { left: span.x, right: span.x + span.width, runs: [], text: '' };\n segments.push(current);\n } else if (gap > size * 0.18 && !current.text.endsWith(' ') && !span.text.startsWith(' ')) {\n pushRun(current.runs, { ...runOf(span), text: ' ' });\n current.text += ' ';\n }\n pushRun(current.runs, runOf(span));\n current.text += span.text;\n current.right = Math.max(current.right, span.x + span.width);\n end = Math.max(end, span.x + span.width);\n }\n for (const segment of segments) {\n segment.text = segment.text.replace(/\\s+/g, ' ').trim();\n trimRuns(segment.runs);\n }\n return segments.filter(segment => segment.text);\n};\n\n/** Collapses white space inside runs and trims the ends of the run list. */\nconst trimRuns = (runs: Run[]) => {\n for (const run of runs) run.text = run.text.replace(/\\s+/g, ' ');\n const first = runs[0];\n if (first) first.text = first.text.replace(/^\\s+/, '');\n const last = runs.at(-1);\n if (last) last.text = last.text.replace(/\\s+$/, '');\n for (let index = runs.length - 1; index >= 0; index -= 1) if (!runs[index]?.text) runs.splice(index, 1);\n};\n\n/** Groups the spans of a page into lines, top to bottom. */\nconst buildLines = (content: PageContent, page: number): Line[] => {\n const spans = [...content.spans].sort((a, b) => a.y - b.y || a.x - b.x);\n const groups: TextSpan[][] = [];\n for (const span of spans) {\n const group = groups.at(-1);\n const first = group?.[0];\n // Spans on one baseline, allowing for superscripts and slightly uneven baselines.\n if (group && first && Math.abs(span.y - first.y) < Math.min(span.size, first.size) * 0.45) group.push(span);\n else groups.push([span]);\n }\n return groups\n .map(group => {\n group.sort((a, b) => a.x - b.x);\n const size = weightedMode(group.map(span => [round(span.size, 0.5), span.text.length])) ?? 12;\n const boldCharacters = group.reduce((sum, span) => sum + (span.bold ? span.text.trim().length : 0), 0);\n const characters = group.reduce((sum, span) => sum + span.text.trim().length, 0);\n const cells = segmentsOf(group, size);\n return {\n page,\n baseline: weightedMode(group.map(span => [round(span.y, 0.5), span.text.length])) ?? (group[0] as TextSpan).y,\n left: Math.min(...cells.map(cell => cell.left)),\n right: Math.max(...cells.map(cell => cell.right)),\n size,\n bold: boldCharacters > characters / 2,\n cells,\n text: cells.map(cell => cell.text).join(' ')\n };\n })\n .filter(line => line.cells.length);\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// Running headers and footers\n\nconst runningKey = (line: Line) => line.text.toLowerCase().replace(/\\d+/g, '#').replace(/\\s+/g, ' ');\n\n/** Header or footer text with its page numbers turned into fields. */\nconst runningText = (line: Line, pageNumber: number, pageCount: number, width: number): PageHeaderFooter => {\n let text = line.text.replace(/\\d+/g, digits => {\n const value = Number(digits);\n if (value === pageNumber) return '{page}';\n if (value === pageCount && pageCount > 1) return '{pages}';\n return digits;\n });\n // A lone number that is not the page's own is still a page number, offset by a title page or a start number.\n if (/^\\d+$/.test(text)) text = '{page}';\n const center = (line.left + line.right) / 2;\n if (Math.abs(center - width / 2) < width * 0.1) return { left: '', center: text, right: '' };\n return center < width / 2 ? { left: text, center: '', right: '' } : { left: '', center: '', right: text };\n};\n\n/**\n * Removes lines repeated at the same place near the top or bottom of most pages, and page numbers, returning them as\n * the running header and footer.\n */\nconst extractRunning = (\n pages: Line[][],\n contents: PageContent[]\n): { header?: PageHeaderFooter; footer?: PageHeaderFooter } => {\n const result: { header?: PageHeaderFooter; footer?: PageHeaderFooter } = {};\n for (const zone of ['header', 'footer'] as const) {\n const candidates = pages.map((lines, index) => {\n const height = contents[index]?.height ?? 842;\n const inZone = (line: Line) =>\n zone === 'header' ? line.baseline < height * RUNNING_ZONE : line.baseline > height * (1 - RUNNING_ZONE);\n return (zone === 'header' ? lines.slice(0, 2) : lines.slice(-2)).filter(inZone);\n });\n const counts = new Map<string, number>();\n for (const lines of candidates) {\n for (const key of new Set(lines.map(runningKey))) counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n const needed = pages.length > 1 ? Math.max(2, Math.ceil(pages.length / 2)) : 1;\n const repeated = new Set(\n [...counts]\n // On a single page only a bare page number counts as running text.\n .filter(([key, count]) => count >= needed && (pages.length > 1 || /^[\\s#\\-–—.]*#[\\s#\\-–—.]*$/.test(key)))\n .map(([key]) => key)\n );\n if (!repeated.size) continue;\n pages.forEach((lines, index) => {\n const found = candidates[index]?.filter(line => repeated.has(runningKey(line))) ?? [];\n if (found.length && !result[zone]) {\n const line = found[0] as Line;\n result[zone] = runningText(line, index + 1, pages.length, contents[index]?.width ?? 595);\n }\n pages[index] = lines.filter(line => !found.includes(line));\n });\n }\n return result;\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// Tables\n\n/** Index of the column a cell starts in, or -1. */\nconst columnOf = (columns: number[], cell: Segment) =>\n columns.findIndex(left => Math.abs(left - cell.left) <= COLUMN_TOLERANCE);\n\n/** Whether a line's cells each start in a column and stay inside it. */\nconst fitsColumns = (line: Line, columns: number[]) =>\n line.cells.every(cell => {\n const index = columnOf(columns, cell);\n const next = columns[index + 1];\n return index >= 0 && (next === undefined || cell.right <= next + COLUMN_TOLERANCE);\n });\n\n/** Whether a row's cells stand apart by more than a tab would put words, spreading the row across the page. */\nconst isSpreadRow = (line: Line) =>\n line.cells.slice(1).every((cell, index) => cell.left - (line.cells[index] as Segment).right > line.size * 4);\n\n/**\n * Reads a table starting at a line: rows of two or more cells whose columns line up. Lines that fill only some\n * columns and sit close to the row above continue its cells, as wrapped cell text does.\n */\nconst readTable = (\n lines: Line[],\n start: number,\n rules: Box[]\n): { block: Block & { kind: 'table' }; end: number } | undefined => {\n const first = lines[start];\n if (!first || first.cells.length < 2) return undefined;\n const columns = first.cells.map(cell => cell.left);\n const rows: Segment[][][] = [first.cells.map(cell => [cell])];\n let previous = first;\n let index = start + 1;\n for (; index < lines.length; index += 1) {\n const line = lines[index] as Line;\n const gap = line.baseline - previous.baseline;\n if (line.page !== first.page || gap > line.size * 3 || !fitsColumns(line, columns)) break;\n const row = rows.at(-1) as Segment[][];\n // Wrapped text continues the row; a new row starts after the cell padding or with every column filled.\n const continues = gap < line.size * 1.5 && line.cells.length < columns.length;\n const target = continues ? row : columns.map(() => [] as Segment[]);\n for (const cell of line.cells) target[columnOf(columns, cell)]?.push(cell);\n if (!continues) {\n if (line.cells.length < 2 && rows.length >= 1 && gap >= line.size * 1.5) break;\n rows.push(target);\n }\n previous = line;\n }\n // A single row is a table only when its cells stand far apart, as in signature lines.\n if (rows.length < 2 && !isSpreadRow(first)) return undefined;\n const top = first.baseline - first.size;\n const bottom = previous.baseline + previous.size * 0.4;\n const left = Math.min(...columns);\n const right = Math.max(...lines.slice(start, index).map(line => line.right));\n const bordered =\n rules.filter(rule => bordersBox(rule, { x: left, y: top, width: right - left, height: bottom - top })).length >= 3;\n return { block: { kind: 'table', rows, columns, right, bordered }, end: index };\n};\n\n/** Room between a table's text and its borders: the cell padding. */\nconst BORDER_REACH = 8;\n\n/**\n * Whether a rule borders a table's text box: a horizontal rule just above, inside or just below it, or a vertical rule\n * running along most of it. Borders of a neighbouring table end short of the box, so they do not count; a table\n * without borders of its own is a layout table, such as signature lines.\n */\nconst bordersBox = (rule: Box, box: Box): boolean => {\n const acrossX = rule.x <= box.x + box.width + BORDER_REACH && rule.x + rule.width >= box.x - BORDER_REACH;\n if (!acrossX) return false;\n if (rule.width >= rule.height) {\n return rule.y >= box.y - BORDER_REACH && rule.y <= box.y + box.height + BORDER_REACH;\n }\n const overlap = Math.min(rule.y + rule.height, box.y + box.height) - Math.max(rule.y, box.y);\n return overlap > box.height / 2;\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// Paragraphs\n\n/** Bullet characters, including the private-use codes Symbol and Wingdings fonts draw bullets with. */\nconst BULLETS =\n '\\\\u2022\\\\u25cf\\\\u25aa\\\\u25a0\\\\u25e6\\\\u25cb\\\\u2023\\\\u2219\\\\u00b7\\\\uf0b7\\\\uf0a7\\\\uf076\\\\uf0d8\\\\uf0fc\\\\u2013\\\\u2014-';\n/** Bullets and numbering that start list items. */\nconst BULLET = new RegExp(`^[${BULLETS}]\\\\s+`, 'u');\nconst NUMBERED = /^(\\d{1,3})[.)]\\s+/;\n/** A list marker on its own, which a tab may separate from the item text. */\nconst MARKER_ONLY = new RegExp(`^(?:[${BULLETS}]|\\\\d{1,3}[.)])$`, 'u');\n\n/** Whether a line looks like a heading next to body text of the given size. */\nconst isHeadingLine = (line: Line, bodySize: number) =>\n line.size >= bodySize * 1.15 || (line.bold && line.size >= bodySize + 0.75);\n\ntype Alignment = 'left' | 'center' | 'right' | 'justify';\n\ninterface Paragraph {\n lines: Line[];\n alignment: Alignment;\n list?: { ordered: boolean; start: number };\n /** Extra space above the paragraph beyond the line spacing, in points. */\n spaceBefore: number;\n}\n\nclass ParagraphBuilder {\n constructor(\n private readonly area: (page: number) => TextArea,\n private readonly lineGap: (size: number) => number\n ) {}\n\n private alignmentOf(line: Line): Alignment {\n const { left, right } = this.area(line.page);\n const width = right - left;\n const before = line.left - left;\n const after = right - line.right;\n // A line that reaches the right edge is flowing text, perhaps with an indented first line, or right-aligned.\n if (after < line.size * 0.8) return before > width * 0.25 ? 'right' : 'left';\n const centred = Math.abs(before - after) < Math.max(width * 0.04, line.size);\n return centred && before > Math.max(line.size * 2, width * 0.06) ? 'center' : 'left';\n }\n\n /** Whether a line starts a new paragraph after the lines collected so far. */\n private startsNew(paragraph: Paragraph, line: Line): boolean {\n const previous = paragraph.lines.at(-1) as Line;\n const { left, right } = this.area(line.page);\n if (BULLET.test(line.text) || NUMBERED.test(line.text)) return true;\n if (Math.abs(line.size - previous.size) > 0.75 || line.bold !== previous.bold) return true;\n const alignment = this.alignmentOf(line);\n const flowing = paragraph.alignment === 'left' || paragraph.alignment === 'justify';\n if ((alignment === 'left') !== flowing || (!flowing && alignment !== paragraph.alignment)) return true;\n const ended = previous.right < right - Math.max(line.size * 3, (right - left) * 0.12);\n if (flowing && ended) return true;\n if (line.page !== previous.page) {\n // Across a page break only a line that takes up an unfinished paragraph without an indent continues it.\n return line.left > left + line.size * 0.5;\n }\n if (line.baseline - previous.baseline > this.lineGap(line.size) * 1.35) return true;\n if (!flowing) return false;\n // A list item's wrapped lines may sit under its text rather than under its marker.\n if (paragraph.list) return line.left < (paragraph.lines[0] as Line).left - 2;\n const restLeft = paragraph.lines.length > 1 ? previous.left : undefined;\n return restLeft !== undefined ? Math.abs(line.left - restLeft) > line.size : line.left > previous.left + line.size;\n }\n\n build(lines: Line[]): Paragraph[] {\n const paragraphs: Paragraph[] = [];\n let previous: Line | undefined;\n for (const line of lines) {\n const current = paragraphs.at(-1);\n if (current && previous && !this.startsNew(current, line)) {\n current.lines.push(line);\n } else {\n const gap = previous && previous.page === line.page ? line.baseline - previous.baseline : 0;\n paragraphs.push({\n lines: [line],\n alignment: this.alignmentOf(line),\n list: listOf(line.text),\n spaceBefore: Math.max(0, gap - this.lineGap(line.size))\n });\n }\n previous = line;\n }\n for (const paragraph of paragraphs) this.refineAlignment(paragraph);\n return paragraphs;\n }\n\n /** Flowing paragraphs whose lines all reach the right edge, except the last, are justified. */\n private refineAlignment(paragraph: Paragraph) {\n if (paragraph.alignment !== 'left' || paragraph.lines.length < 2) return;\n const { right } = this.area((paragraph.lines[0] as Line).page);\n const full = paragraph.lines.slice(0, -1).every(line => right - line.right < line.size * 0.6);\n if (full) paragraph.alignment = 'justify';\n }\n}\n\nconst listOf = (text: string): Paragraph['list'] => {\n const numbered = NUMBERED.exec(text);\n if (numbered) return { ordered: true, start: Number(numbered[1]) };\n return BULLET.test(text) ? { ordered: false, start: 1 } : undefined;\n};\n\n/** Runs of a paragraph's lines, joined with spaces, or directly after a hyphen that breaks a word. */\nconst paragraphRuns = (lines: Line[]): Run[] => {\n const runs: Run[] = [];\n for (const line of lines) {\n const lineRuns = line.cells.flatMap((cell, index) =>\n index === 0 ? cell.runs : [{ ...(cell.runs[0] as Run), text: ' ' }, ...cell.runs]\n );\n const last = runs.at(-1);\n if (last) {\n if (last.text.endsWith('­')) last.text = last.text.slice(0, -1);\n else if (!last.text.endsWith('-') && !last.text.endsWith(' ')) {\n pushRun(runs, { ...(lineRuns[0] ?? last), text: ' ' });\n }\n }\n for (const run of lineRuns) pushRun(runs, run);\n }\n return runs;\n};\n\n/** Removes the list marker from the front of a run list. */\nconst stripMarker = (runs: Run[]): Run[] => {\n const result = runs.map(run => ({ ...run }));\n const first = result[0];\n if (first) first.text = first.text.replace(NUMBERED, '').replace(BULLET, '');\n return result.filter(run => run.text);\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// HTML\n\nconst runHtml = (run: Run, plain: boolean): string => {\n let html = escapeHtml(run.text);\n if (!plain) {\n const styles: string[] = [];\n if (Math.abs(run.size - EDITOR_FONT_SIZE) > 0.25) styles.push(`font-size: ${run.size}pt`);\n if (run.family && run.family !== EDITOR_FONT_FAMILY) {\n styles.push(`font-family: ${run.family.includes(' ') ? `'${run.family}'` : run.family}`);\n }\n if (styles.length) html = `<span style=\"${escapeHtml(styles.join('; '))}\">${html}</span>`;\n if (run.bold) html = `<strong>${html}</strong>`;\n }\n if (run.color !== '#000000') html = `<span style=\"color: ${run.color}\">${html}</span>`;\n if (run.italic) html = `<em>${html}</em>`;\n return html;\n};\n\nconst runsHtml = (runs: Run[], plain = false) => runs.map(run => runHtml(run, plain)).join('');\n\nconst pxOf = (points: number) => Math.round(points * PX_PER_PT);\n\nclass HtmlWriter {\n /** Heading level per font size, largest first. */\n private readonly headingLevels = new Map<number, number>();\n\n /**\n * @param area - Left and right edge of the running text of a page.\n * @param bodySize - Font size of most of the text; clearly larger sizes are headings.\n * @param lineGaps - Usual baseline distance per font size.\n */\n constructor(\n private readonly area: (page: number) => TextArea,\n private readonly bodySize: number,\n lines: Line[],\n private readonly lineGaps: Map<number, number>\n ) {\n const sizes = lines.filter(line => isHeadingLine(line, bodySize)).map(line => line.size);\n [...new Set(sizes)]\n .sort((a, b) => b - a)\n .slice(0, 3)\n .forEach((size, index) => {\n this.headingLevels.set(size, index + 1);\n });\n }\n\n private lineGapOf(size: number): number {\n return this.lineGaps.get(size) ?? size * 1.2;\n }\n\n write(blocks: Block[]): string {\n const output: string[] = [];\n for (const block of blocks) {\n if (block.kind === 'break') output.push('<div data-type=\"page-break\"></div>');\n else if (block.kind === 'image') output.push(this.image(block.image, block.area));\n else if (block.kind === 'table') output.push(this.table(block));\n else output.push(this.paragraphs(block.lines));\n }\n return output.join('');\n }\n\n private paragraphs(lines: Line[]): string {\n const paragraphs = new ParagraphBuilder(this.area, size => this.lineGapOf(size)).build(lines);\n let html = '';\n let list: { ordered: boolean; items: string[]; start: number } | undefined;\n const closeList = () => {\n if (!list) return;\n const tag = list.ordered ? 'ol' : 'ul';\n const start = list.ordered && list.start > 1 ? ` start=\"${list.start}\"` : '';\n html += `<${tag}${start}>${list.items.map(item => `<li>${item}</li>`).join('')}</${tag}>`;\n list = undefined;\n };\n for (const paragraph of paragraphs) {\n const heading = this.headingLevel(paragraph);\n if (paragraph.list && !heading) {\n if (!list || list.ordered !== paragraph.list.ordered) {\n closeList();\n list = { ordered: paragraph.list.ordered, items: [], start: paragraph.list.start };\n }\n list.items.push(`<p>${runsHtml(stripMarker(paragraphRuns(paragraph.lines)))}</p>`);\n continue;\n }\n closeList();\n html += this.paragraph(paragraph, heading);\n }\n closeList();\n return html;\n }\n\n private headingLevel(paragraph: Paragraph): number | undefined {\n const text = paragraph.lines.map(line => line.text).join(' ');\n if (paragraph.lines.length > 3 || text.length > 200) return undefined;\n if (!paragraph.lines.every(line => isHeadingLine(line, this.bodySize))) return undefined;\n return this.headingLevels.get((paragraph.lines[0] as Line).size);\n }\n\n private paragraph(paragraph: Paragraph, heading: number | undefined): string {\n const first = paragraph.lines[0] as Line;\n const { left } = this.area(first.page);\n const styles: string[] = [];\n const attributes: string[] = [];\n if (paragraph.alignment !== 'left') styles.push(`text-align: ${paragraph.alignment}`);\n if (paragraph.alignment === 'left' || paragraph.alignment === 'justify') {\n const rest =\n paragraph.lines.length > 1 ? Math.min(...paragraph.lines.slice(1).map(line => line.left)) : first.left;\n const margin = rest - left;\n const indent = first.left - rest;\n if (margin > 2) styles.push(`margin-left: ${pxOf(margin)}px`);\n if (Math.abs(indent) > 2) styles.push(`text-indent: ${pxOf(indent)}px`);\n }\n if (paragraph.spaceBefore >= 4) attributes.push(`data-space-before=\"${round(paragraph.spaceBefore)}\"`);\n if (styles.length) attributes.push(`style=\"${styles.join('; ')}\"`);\n const tag = heading ? `h${heading}` : 'p';\n const content = runsHtml(paragraphRuns(paragraph.lines), heading !== undefined);\n return `<${tag}${attributes.length ? ` ${attributes.join(' ')}` : ''}>${content}</${tag}>`;\n }\n\n private table(table: Block & { kind: 'table' }): string {\n const widths = table.columns.map((left, index) => (table.columns[index + 1] ?? table.right) - left);\n const colgroup = `<colgroup>${widths.map(width => `<col style=\"width: ${pxOf(width)}px\">`).join('')}</colgroup>`;\n const body = table.rows\n .map(row => {\n const cells = row.map(segments => {\n const runs = segments.flatMap((segment, index) =>\n index === 0 ? segment.runs : [{ ...(segment.runs[0] as Run), text: ' ' }, ...segment.runs]\n );\n return `<td><p>${runsHtml(runs)}</p></td>`;\n });\n return `<tr>${cells.join('')}</tr>`;\n })\n .join('');\n return `<table${table.bordered ? '' : ' data-type=\"signature\"'}>${colgroup}<tbody>${body}</tbody></table>`;\n }\n\n private image(image: PageImage, area: TextArea): string {\n const maxWidth = area.right - area.left;\n const scale = image.width > maxWidth ? maxWidth / image.width : 1;\n const center = image.x + image.width / 2;\n const centered = Math.abs(center - (area.left + area.right) / 2) < (area.right - area.left) * 0.1;\n const style = centered ? ' style=\"text-align: center\"' : '';\n return `<p${style}><img src=\"${image.src}\" alt=\"\" width=\"${pxOf(image.width * scale)}\" height=\"${pxOf(image.height * scale)}\"></p>`;\n }\n}\n\n// -------------------------------------------------------------------------------------------------------------------\n// Page setup\n\nconst pageSettings = (\n contents: PageContent[],\n pages: Line[][],\n area: TextArea,\n running: { header?: PageHeaderFooter; footer?: PageHeaderFooter }\n): PageSettings => {\n const first = contents[0] as PageContent;\n const widthMm = first.width * MM_PER_PT;\n const heightMm = first.height * MM_PER_PT;\n const portrait = [Math.min(widthMm, heightMm), Math.max(widthMm, heightMm)] as const;\n const size =\n (Object.keys(PAGE_SIZES) as PageSizeKey[]).find(\n key =>\n Math.abs(PAGE_SIZES[key].width - portrait[0]) < PAPER_TOLERANCE_MM &&\n Math.abs(PAGE_SIZES[key].height - portrait[1]) < PAPER_TOLERANCE_MM\n ) ?? 'a4';\n const fallback = MARGIN_PRESETS[0].margins;\n const lines = pages.flat();\n const clamp = (points: number | undefined, fallbackMm: number) =>\n points === undefined ? fallbackMm : Math.min(60, Math.max(5, round(points * MM_PER_PT, 0.5)));\n const tops = pages.map(page => page[0]).filter((line): line is Line => Boolean(line));\n const top = median(tops.map(line => line.baseline - line.size));\n // The bottom margin shows on full pages only; a short last page says nothing about it.\n const fullPages = pages.filter((page, index) => {\n const last = page.at(-1);\n return last !== undefined && last.baseline > (contents[index]?.height ?? 842) * PAGE_FULL;\n });\n const bottom = percentile(\n fullPages.map(page => (page.at(-1) as Line).baseline),\n 0.9\n );\n const settings: PageSettings = {\n size,\n orientation: widthMm > heightMm ? 'landscape' : 'portrait',\n margins: lines.length\n ? {\n top: clamp(top, fallback.top),\n right: clamp(first.width - area.right, fallback.right),\n bottom: clamp(bottom === undefined ? undefined : first.height - bottom - 4, fallback.bottom),\n left: clamp(area.left, fallback.left)\n }\n : { ...fallback }\n };\n if (running.header) settings.header = running.header;\n if (running.footer) settings.footer = running.footer;\n return settings;\n};\n\n// -------------------------------------------------------------------------------------------------------------------\n// Entry point\n\n/** Turns the content of every page into editor HTML and page settings. */\nexport const layoutPages = (contents: PageContent[]): LayoutResult => {\n const pages = contents.map(buildLines);\n const running = extractRunning(pages, contents);\n const lines = pages.flat();\n const characters = lines.reduce((sum, line) => sum + line.text.length, 0);\n\n const bodySize = weightedMode(lines.map(line => [line.size, line.text.length])) ?? EDITOR_FONT_SIZE;\n const bodyLines = lines.filter(line => Math.abs(line.size - bodySize) < 0.75);\n const globalArea: TextArea = {\n left:\n percentile(\n bodyLines.map(line => line.left),\n 0.05\n ) ?? 72,\n right:\n percentile(\n bodyLines.map(line => line.right),\n 0.95\n ) ?? (contents[0]?.width ?? 595) - 72\n };\n const areas = pages.map(page => {\n const body = page.filter(line => Math.abs(line.size - bodySize) < 0.75);\n if (body.length < 5) return globalArea;\n return {\n left:\n percentile(\n body.map(line => line.left),\n 0.05\n ) ?? globalArea.left,\n right:\n percentile(\n body.map(line => line.right),\n 0.95\n ) ?? globalArea.right\n };\n });\n const area = (page: number) => areas[page] ?? globalArea;\n\n // Line spacing per font size: the usual distance between consecutive baselines of that size.\n const gapSamples = new Map<number, number[]>();\n for (const page of pages) {\n page.forEach((line, index) => {\n const gap = line.baseline - (page[index - 1]?.baseline ?? Number.NEGATIVE_INFINITY);\n if (gap > 0 && gap < line.size * 2.2) gapSamples.set(line.size, [...(gapSamples.get(line.size) ?? []), gap]);\n });\n }\n const lineGaps = new Map([...gapSamples].map(([size, values]) => [size, percentile(values, 0.3) ?? size * 1.2]));\n const writer = new HtmlWriter(area, bodySize, lines, lineGaps);\n\n const blocks: Block[] = [];\n const addLine = (line: Line) => {\n const last = blocks.at(-1);\n if (last?.kind === 'lines') last.lines.push(line);\n else blocks.push({ kind: 'lines', lines: [line] });\n };\n pages.forEach((pageLines, pageIndex) => {\n const content = contents[pageIndex] as PageContent;\n // Pictures take their place in the reading order by their top edge.\n const images = [...content.images].sort((a, b) => a.y - b.y);\n let nextImage = 0;\n const placeImagesAbove = (top: number) => {\n for (; nextImage < images.length && (images[nextImage] as PageImage).y <= top; nextImage += 1) {\n blocks.push({ kind: 'image', image: images[nextImage] as PageImage, area: area(pageIndex) });\n }\n };\n for (let index = 0; index < pageLines.length; ) {\n const line = pageLines[index] as Line;\n placeImagesAbove(line.baseline - line.size);\n const table = readTable(pageLines, index, content.rules);\n if (table) {\n blocks.push(table.block);\n index = table.end;\n } else {\n addLine(line);\n index += 1;\n }\n }\n placeImagesAbove(Number.POSITIVE_INFINITY);\n // A page that ends well above its bottom ended on purpose, so the break is kept.\n const end = Math.max(pageLines.at(-1)?.baseline ?? 0, ...content.images.map(image => image.y + image.height));\n if (pageIndex < pages.length - 1 && end < content.height * PAGE_FULL) blocks.push({ kind: 'break' });\n });\n\n return {\n html: writer.write(blocks),\n page: pageSettings(contents, pages, areas[0] ?? globalArea, running),\n characters\n };\n};\n","/**\n * Opens a PDF document as editable content: text with its formatting, headings, lists, tables and pictures, plus the\n * page setup. PDF stores positioned glyphs rather than paragraphs, so the structure is reconstructed from the layout;\n * text drawn as pictures (scanned pages) comes through as the pictures themselves. Encrypted files are refused.\n */\nimport type { PageSettings } from '../page';\nimport { ContentReader, type PageContent } from './content';\nimport { PdfDocument } from './document';\nimport { PdfImportError } from './errors';\nimport { layoutPages } from './layout';\n\nexport { PdfImportError };\n\nexport type { PdfImportErrorReason } from './errors';\n\n/** What was read from a PDF document. */\nexport interface PdfImport {\n /** Document content as HTML; the editor's sanitiser still runs over it. */\n html: string;\n /** Paper size, orientation, margins and running header and footer of the document. */\n page: PageSettings;\n}\n\n/** Hands control back to the browser between pages, so a long document does not freeze the page. */\nconst yieldToBrowser = () => new Promise<void>(resolve => setTimeout(resolve, 0));\n\n/**\n * Reads a `.pdf` file into editor HTML and page settings.\n *\n * @throws PdfImportError when the file is not a PDF, is encrypted, or shows neither text nor pictures.\n */\nexport const readPdf = async (data: ArrayBuffer | Uint8Array): Promise<PdfImport> => {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n const doc = new PdfDocument(bytes);\n const reader = new ContentReader(doc);\n const contents: PageContent[] = [];\n for (const page of doc.pages()) {\n contents.push(reader.read(page));\n await yieldToBrowser();\n }\n if (!contents.length) throw new PdfImportError('empty');\n const { html, page, characters } = layoutPages(contents);\n if (!characters && !contents.some(content => content.images.length)) throw new PdfImportError('empty');\n return { html, page };\n};\n"],"mappings":"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"}