@f-o-t/pdf 0.3.3 → 0.3.4
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.
|
@@ -485,17 +485,30 @@ class PdfDocumentImpl {
|
|
|
485
485
|
streamData: img.idatData
|
|
486
486
|
});
|
|
487
487
|
}
|
|
488
|
+
const wrapperStreamMap = new Map;
|
|
488
489
|
const contentStreamMap = new Map;
|
|
489
490
|
for (const page of this.pages) {
|
|
490
491
|
if (!page.dirty)
|
|
491
492
|
continue;
|
|
493
|
+
const wrapperObjNum = currentNextObj++;
|
|
494
|
+
wrapperStreamMap.set(page.pageObjNum, wrapperObjNum);
|
|
495
|
+
const wrapperData = latin1Encoder.encode("q");
|
|
496
|
+
objects.push({
|
|
497
|
+
objNum: wrapperObjNum,
|
|
498
|
+
content: `<< /Length ${wrapperData.length} >>`,
|
|
499
|
+
streamData: wrapperData
|
|
500
|
+
});
|
|
492
501
|
const contentObjNum = currentNextObj++;
|
|
493
502
|
contentStreamMap.set(page.pageObjNum, contentObjNum);
|
|
494
|
-
const
|
|
503
|
+
const pageStreamData = page.buildContentStream();
|
|
504
|
+
const prefixedData = new Uint8Array(2 + pageStreamData.length);
|
|
505
|
+
prefixedData[0] = 81;
|
|
506
|
+
prefixedData[1] = 10;
|
|
507
|
+
prefixedData.set(pageStreamData, 2);
|
|
495
508
|
objects.push({
|
|
496
509
|
objNum: contentObjNum,
|
|
497
|
-
content: `<< /Length ${
|
|
498
|
-
streamData
|
|
510
|
+
content: `<< /Length ${prefixedData.length} >>`,
|
|
511
|
+
streamData: prefixedData
|
|
499
512
|
});
|
|
500
513
|
}
|
|
501
514
|
for (const page of this.pages) {
|
|
@@ -504,12 +517,13 @@ class PdfDocumentImpl {
|
|
|
504
517
|
let pageContent = page.originalDictContent;
|
|
505
518
|
if (page.dirty) {
|
|
506
519
|
const contentObjNum = contentStreamMap.get(page.pageObjNum);
|
|
520
|
+
const wrapperObjNum = wrapperStreamMap.get(page.pageObjNum);
|
|
507
521
|
if (pageContent.match(/\/Contents\s/)) {
|
|
508
|
-
pageContent = pageContent.replace(/\/Contents\s+(\d+\s+\d+\s+R)/, `/Contents [$1 ${contentObjNum} 0 R]`);
|
|
522
|
+
pageContent = pageContent.replace(/\/Contents\s+(\d+\s+\d+\s+R)/, `/Contents [${wrapperObjNum} 0 R $1 ${contentObjNum} 0 R]`);
|
|
509
523
|
pageContent = pageContent.replace(/\/Contents\s*\[([^\]]+)\]/, (match, inner) => {
|
|
510
524
|
if (inner.includes(`${contentObjNum} 0 R`))
|
|
511
525
|
return match;
|
|
512
|
-
return `/Contents [${inner.trim()} ${contentObjNum} 0 R]`;
|
|
526
|
+
return `/Contents [${wrapperObjNum} 0 R ${inner.trim()} ${contentObjNum} 0 R]`;
|
|
513
527
|
});
|
|
514
528
|
} else {
|
|
515
529
|
pageContent += `
|
|
@@ -878,4 +892,4 @@ export {
|
|
|
878
892
|
PdfDocumentImpl
|
|
879
893
|
};
|
|
880
894
|
|
|
881
|
-
//# debugId=
|
|
895
|
+
//# debugId=E43C2313EE40EEDA64756E2164756E21
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Lightweight PDF structure parser for incremental editing\n *\n * Parses just enough of an existing PDF to enable incremental updates:\n * - Finds the cross-reference table via startxref\n * - Reads the trailer to get Root, Size, Info\n * - Follows Root -> Pages -> Kids to locate page objects\n * - Extracts MediaBox dimensions from pages\n *\n * Uses latin1 string matching on the raw PDF bytes (1 byte = 1 char)\n * for correctness with binary PDF content.\n */\n\n/**\n * Parsed PDF structure needed for incremental updates\n */\nexport type PdfStructure = {\n\txrefOffset: number;\n\trootNum: number;\n\tinfoNum: number | null;\n\tsize: number;\n\tpagesNum: number;\n\tpageNums: number[];\n\trootDictContent: string;\n\tpageDictContents: string[];\n};\n\nconst decoder = new TextDecoder(\"latin1\");\n\n/**\n * Decode Uint8Array to latin1 string for raw PDF text matching\n */\nfunction toLatin1(data: Uint8Array): string {\n\treturn decoder.decode(data);\n}\n\n/**\n * Find the byte offset recorded after the last `startxref` keyword\n */\nexport function findStartXref(data: Uint8Array): number {\n\tconst pdf = toLatin1(data);\n\tconst idx = pdf.lastIndexOf(\"startxref\");\n\tif (idx === -1) throw new Error(\"Cannot find startxref in PDF\");\n\tconst after = pdf.slice(idx + 9).trim().split(/[\\r\\n\\s]/)[0];\n\treturn parseInt(after!, 10);\n}\n\n/**\n * Parse the trailer dictionary to extract Root, Size, Info, and Prev xref offset.\n *\n * Supports both traditional trailers (`trailer << ... >>`) and\n * cross-reference streams (PDF 1.5+) where the trailer entries live\n * inside the xref stream object dictionary.\n */\nexport function parseTrailer(data: Uint8Array): {\n\troot: number;\n\tsize: number;\n\tinfo: number | null;\n\tprevXref: number;\n} {\n\tconst pdf = toLatin1(data);\n\tconst startxrefIdx = pdf.lastIndexOf(\"startxref\");\n\n\t// Try traditional trailer first\n\tconst trailerIdx = pdf.lastIndexOf(\"trailer\");\n\n\tlet dictStr: string;\n\n\tif (trailerIdx !== -1 && trailerIdx < startxrefIdx) {\n\t\t// Traditional trailer\n\t\tdictStr = pdf.slice(trailerIdx, startxrefIdx);\n\t} else {\n\t\t// Cross-reference stream (PDF 1.5+): startxref points to an object\n\t\t// whose dictionary contains the trailer entries (Root, Size, Info, etc.)\n\t\tconst xrefOffset = findStartXref(data);\n\t\tconst xrefObjStr = pdf.slice(xrefOffset, xrefOffset + 4096);\n\t\tconst dictStart = xrefObjStr.indexOf(\"<<\");\n\t\tif (dictStart === -1) {\n\t\t\tthrow new Error(\"Cannot find trailer or xref stream dictionary in PDF\");\n\t\t}\n\t\tconst dictEnd = findMatchingDictEnd(xrefObjStr, dictStart);\n\t\tif (dictEnd === -1) {\n\t\t\tthrow new Error(\"Cannot find end of xref stream dictionary\");\n\t\t}\n\t\tdictStr = xrefObjStr.slice(dictStart, dictEnd + 2);\n\t}\n\n\tconst rootMatch = dictStr.match(/\\/Root\\s+(\\d+)\\s+\\d+\\s+R/);\n\tif (!rootMatch) throw new Error(\"Cannot find Root ref in trailer\");\n\n\tconst sizeMatch = dictStr.match(/\\/Size\\s+(\\d+)/);\n\tif (!sizeMatch) throw new Error(\"Cannot find Size in trailer\");\n\n\tconst infoMatch = dictStr.match(/\\/Info\\s+(\\d+)\\s+\\d+\\s+R/);\n\tconst prevMatch = dictStr.match(/\\/Prev\\s+(\\d+)/);\n\n\treturn {\n\t\troot: parseInt(rootMatch[1]!, 10),\n\t\tsize: parseInt(sizeMatch[1]!, 10),\n\t\tinfo: infoMatch ? parseInt(infoMatch[1]!, 10) : null,\n\t\tprevXref: prevMatch ? parseInt(prevMatch[1]!, 10) : findStartXref(data),\n\t};\n}\n\n/**\n * Extract the dictionary content (between outer << and >>) for a given object number.\n * Returns the content string without the delimiters.\n */\nexport function extractObjectDictContent(\n\tdata: Uint8Array,\n\tobjNum: number,\n): string {\n\tconst pdf = toLatin1(data);\n\tconst objRegex = new RegExp(`(?:^|\\\\s)${objNum}\\\\s+0\\\\s+obj`, \"m\");\n\tconst match = pdf.match(objRegex);\n\tif (!match || match.index === undefined) {\n\t\tthrow new Error(`Cannot find object ${objNum} in PDF`);\n\t}\n\n\tconst searchStart = match.index + match[0].length;\n\tconst dictStart = pdf.indexOf(\"<<\", searchStart);\n\tif (dictStart === -1 || dictStart > searchStart + 200) {\n\t\tthrow new Error(`Cannot find dictionary start for object ${objNum}`);\n\t}\n\n\tconst dictEnd = findMatchingDictEnd(pdf, dictStart);\n\tif (dictEnd === -1) {\n\t\tthrow new Error(`Cannot find dictionary end for object ${objNum}`);\n\t}\n\n\treturn pdf.slice(dictStart + 2, dictEnd);\n}\n\n/**\n * Find all page object numbers by following Root -> Pages -> Kids\n */\nexport function findPageObjects(data: Uint8Array, rootNum: number): number[] {\n\tconst rootContent = extractObjectDictContent(data, rootNum);\n\tconst pagesMatch = rootContent.match(/\\/Pages\\s+(\\d+)\\s+\\d+\\s+R/);\n\tif (!pagesMatch) throw new Error(\"Cannot find Pages ref in Root catalog\");\n\tconst pagesNum = parseInt(pagesMatch[1]!, 10);\n\n\tconst pagesContent = extractObjectDictContent(data, pagesNum);\n\tconst kidsMatch = pagesContent.match(/\\/Kids\\s*\\[([^\\]]+)\\]/);\n\tif (!kidsMatch) throw new Error(\"Cannot find Kids array in Pages\");\n\n\tconst refs: number[] = [];\n\tconst refRegex = /(\\d+)\\s+\\d+\\s+R/g;\n\tlet m: RegExpExecArray | null;\n\twhile ((m = refRegex.exec(kidsMatch[1]!)) !== null) {\n\t\trefs.push(parseInt(m[1]!, 10));\n\t}\n\n\treturn refs;\n}\n\n/**\n * Get the MediaBox for a page object: [x1, y1, x2, y2]\n */\nexport function getMediaBox(\n\tdata: Uint8Array,\n\tpageObjNum: number,\n): [number, number, number, number] {\n\tconst content = extractObjectDictContent(data, pageObjNum);\n\tconst mediaBoxMatch = content.match(\n\t\t/\\/MediaBox\\s*\\[\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*\\]/,\n\t);\n\tif (!mediaBoxMatch) {\n\t\tthrow new Error(`Cannot find MediaBox for page object ${pageObjNum}`);\n\t}\n\n\treturn [\n\t\tparseFloat(mediaBoxMatch[1]!),\n\t\tparseFloat(mediaBoxMatch[2]!),\n\t\tparseFloat(mediaBoxMatch[3]!),\n\t\tparseFloat(mediaBoxMatch[4]!),\n\t];\n}\n\n/**\n * Parse the full PDF structure needed for incremental editing\n */\nexport function parsePdfStructure(data: Uint8Array): PdfStructure {\n\tconst xrefOffset = findStartXref(data);\n\tconst trailer = parseTrailer(data);\n\n\tconst rootContent = extractObjectDictContent(data, trailer.root);\n\tconst pagesMatch = rootContent.match(/\\/Pages\\s+(\\d+)\\s+\\d+\\s+R/);\n\tif (!pagesMatch) throw new Error(\"Cannot find Pages ref in Root catalog\");\n\tconst pagesNum = parseInt(pagesMatch[1]!, 10);\n\n\tconst pageNums = findPageObjects(data, trailer.root);\n\tconst pageDictContents = pageNums.map((pn) =>\n\t\textractObjectDictContent(data, pn),\n\t);\n\n\treturn {\n\t\txrefOffset,\n\t\trootNum: trailer.root,\n\t\tinfoNum: trailer.info,\n\t\tsize: trailer.size,\n\t\tpagesNum,\n\t\tpageNums,\n\t\trootDictContent: rootContent,\n\t\tpageDictContents,\n\t};\n}\n\n/**\n * Find the position of the >> that closes the dictionary starting at startPos.\n * Handles nested << >> and skips PDF string literals in parentheses.\n */\nfunction findMatchingDictEnd(str: string, startPos: number): number {\n\tlet depth = 0;\n\tlet i = startPos;\n\n\twhile (i < str.length - 1) {\n\t\tif (str[i] === \"(\") {\n\t\t\t// skip parenthesized string\n\t\t\ti++;\n\t\t\twhile (i < str.length && str[i] !== \")\") {\n\t\t\t\tif (str[i] === \"\\\\\") i++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++; // skip ')'\n\t\t} else if (str[i] === \"<\" && str[i + 1] === \"<\") {\n\t\t\tdepth++;\n\t\t\ti += 2;\n\t\t} else if (str[i] === \">\" && str[i + 1] === \">\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t\ti += 2;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Find the position of the ] that closes the array starting at startPos.\n * Handles nested [ ] and skips PDF string literals in parentheses.\n */\nfunction findMatchingArrayEnd(str: string, startPos: number): number {\n\tlet depth = 0;\n\tlet i = startPos;\n\n\twhile (i < str.length) {\n\t\tif (str[i] === \"(\") {\n\t\t\t// skip parenthesized string\n\t\t\ti++;\n\t\t\twhile (i < str.length && str[i] !== \")\") {\n\t\t\t\tif (str[i] === \"\\\\\") i++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++; // skip ')'\n\t\t} else if (str[i] === \"[\") {\n\t\t\tdepth++;\n\t\t\ti++;\n\t\t} else if (str[i] === \"]\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t\ti++;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Parse a Resources dictionary from page content, handling both inline\n * dictionaries and indirect references.\n *\n * Returns a map of resource type names to their dictionary/array content strings.\n * Example: { \"/Font\": \"<< /F1 10 0 R >>\", \"/ProcSet\": \"[/PDF /Text]\" }\n */\nexport function parseResourcesDict(\n\tpageContent: string,\n\tpdfData: Uint8Array,\n): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\n\t// Check for inline Resources dictionary\n\tconst inlineMatch = pageContent.match(/\\/Resources\\s*<</);\n\tif (inlineMatch) {\n\t\tconst resIdx = pageContent.indexOf(\"/Resources\");\n\t\tconst resStart = pageContent.indexOf(\"<<\", resIdx);\n\t\tconst resEnd = findMatchingDictEnd(pageContent, resStart);\n\n\t\tif (resEnd === -1) {\n\t\t\tthrow new Error(\"Cannot find end of Resources dictionary\");\n\t\t}\n\n\t\tconst resContent = pageContent.slice(resStart + 2, resEnd);\n\t\treturn parseResourceEntries(resContent);\n\t}\n\n\t// Check for indirect Resources reference\n\tconst refMatch = pageContent.match(/\\/Resources\\s+(\\d+)\\s+\\d+\\s+R/);\n\tif (refMatch) {\n\t\tconst objNum = parseInt(refMatch[1]!, 10);\n\t\tconst objContent = extractObjectDictContent(pdfData, objNum);\n\t\treturn parseResourceEntries(objContent);\n\t}\n\n\t// No Resources found\n\treturn result;\n}\n\n/**\n * Merge two Resources dictionaries, combining entries from both.\n *\n * For dictionary-type entries like /Font, /XObject, extracts individual\n * name-reference pairs and combines them. For array-type entries like\n * /ProcSet, uses the existing value (no merge needed).\n *\n * @param existing - Parsed Resources from original page\n * @param additions - New Resources to add (from signature appearance)\n * @returns Merged Resources dictionary entries\n */\nexport function mergeResourcesDicts(\n\texisting: Record<string, string>,\n\tadditions: Record<string, string>,\n): Record<string, string> {\n\tconst result = { ...existing };\n\n\tfor (const [resType, addValue] of Object.entries(additions)) {\n\t\tif (!result[resType]) {\n\t\t\t// No existing entry for this type, just add it\n\t\t\tresult[resType] = addValue;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingValue = result[resType]!;\n\n\t\t// Arrays (like /ProcSet) - keep existing, don't merge\n\t\tif (existingValue.startsWith(\"[\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Dictionaries - merge entries\n\t\tif (existingValue.startsWith(\"<<\")) {\n\t\t\tresult[resType] = mergeDictEntries(existingValue, addValue);\n\t\t} else {\n\t\t\tthrow new Error(`Unexpected resource format for ${resType}: ${existingValue}`);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Merge two PDF dictionary strings by combining their name-reference pairs.\n *\n * Example:\n * existing: \"<< /F1 10 0 R /F2 11 0 R >>\"\n * additions: \"<< /SigF1 20 0 R >>\"\n * result: \"<< /F1 10 0 R /F2 11 0 R /SigF1 20 0 R >>\"\n */\nfunction mergeDictEntries(existing: string, additions: string): string {\n\t// Extract entries from both dictionaries\n\tconst existingEntries = extractDictEntries(existing);\n\tconst additionEntries = extractDictEntries(additions);\n\n\t// Combine (additions override existing if same key)\n\tconst merged = { ...existingEntries, ...additionEntries };\n\n\t// Rebuild dictionary string\n\tconst entries = Object.entries(merged)\n\t\t.map(([name, ref]) => `${name} ${ref}`)\n\t\t.join(\" \");\n\n\treturn `<< ${entries} >>`;\n}\n\n/**\n * Extract name-reference pairs from a PDF dictionary string.\n *\n * Example: \"<< /F1 10 0 R /F2 11 0 R >>\"\n * Returns: { \"/F1\": \"10 0 R\", \"/F2\": \"11 0 R\" }\n */\nfunction extractDictEntries(dict: string): Record<string, string> {\n\tconst entries: Record<string, string> = {};\n\n\t// Remove outer << >>\n\tconst inner = dict.replace(/^<<\\s*/, \"\").replace(/\\s*>>$/, \"\");\n\n\t// Match /Name objNum gen R patterns\n\t// Pattern matches PDF names with hyphens, dots, and hex-encoded characters\n\tconst regex = /(\\/[^\\s<>\\[\\]()\\/]+)\\s+(\\d+\\s+\\d+\\s+R)/g;\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = regex.exec(inner)) !== null) {\n\t\tentries[match[1]!] = match[2]!;\n\t}\n\n\treturn entries;\n}\n\n/**\n * Parse individual resource entries from a Resources dictionary content string.\n *\n * Extracts top-level entries like /Font, /XObject, /ExtGState, etc.\n */\nfunction parseResourceEntries(content: string): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\n\t// Resource entry names to extract\n\tconst resourceTypes = [\n\t\t\"/Font\",\n\t\t\"/XObject\",\n\t\t\"/ExtGState\",\n\t\t\"/ColorSpace\",\n\t\t\"/Pattern\",\n\t\t\"/Shading\",\n\t\t\"/ProcSet\",\n\t];\n\n\tfor (const resType of resourceTypes) {\n\t\t// Use regex to match resource type at dictionary level (not nested inside values)\n\t\t// Pattern: /ResourceType followed by whitespace and then either << or [\n\t\tconst pattern = new RegExp(\n\t\t\t`${resType.replace(/\\//g, \"\\\\/\")}\\\\s+([<\\\\[])`\n\t\t);\n\t\tconst match = content.match(pattern);\n\t\t\n\t\tif (!match) continue;\n\t\t\n\t\tconst idx = match.index!;\n\t\t\n\t\t// Find the value (either << dict >> or [ array ])\n\t\tlet valueStart = idx + resType.length;\n\t\twhile (valueStart < content.length && /\\s/.test(content[valueStart]!)) {\n\t\t\tvalueStart++;\n\t\t}\n\n\t\tif (content[valueStart] === \"<\" && content[valueStart + 1] === \"<\") {\n\t\t\t// Dictionary value\n\t\t\tconst dictEnd = findMatchingDictEnd(content, valueStart);\n\t\t\tif (dictEnd === -1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot find end of ${resType} dictionary`\n\t\t\t\t);\n\t\t\t}\n\t\t\tresult[resType] = content.slice(valueStart, dictEnd + 2);\n\t\t} else if (content[valueStart] === \"[\") {\n\t\t\t// Array value\n\t\t\tconst arrayEnd = findMatchingArrayEnd(content, valueStart);\n\t\t\tif (arrayEnd === -1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot find end of ${resType} array`\n\t\t\t\t);\n\t\t\t}\n\t\t\tresult[resType] = content.slice(valueStart, arrayEnd + 1);\n\t\t}\n\t}\n\n\treturn result;\n}\n",
|
|
6
6
|
"/**\n * PdfPage implementation for the editing plugin\n *\n * Collects drawing operations as PDF content stream operators.\n * The accumulated operators are later serialised as a new content stream\n * object appended via incremental update.\n */\n\nimport type { PdfImage, PdfPage, TextOptions, RectOptions, ImageOptions } from \"./types.ts\";\n\n/**\n * Parse a hex colour string like \"#RRGGBB\" into normalised [r, g, b] values (0-1).\n * Returns null for invalid/missing input so callers can fall back to defaults.\n */\nfunction parseHexColor(hex: string | undefined): [number, number, number] | null {\n\tif (!hex) return null;\n\tconst m = hex.match(/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (!m) return null;\n\treturn [\n\t\tparseInt(m[1]!, 16) / 255,\n\t\tparseInt(m[2]!, 16) / 255,\n\t\tparseInt(m[3]!, 16) / 255,\n\t];\n}\n\nexport class PdfPageImpl implements PdfPage {\n\treadonly width: number;\n\treadonly height: number;\n\n\t/** The existing page object number in the original PDF */\n\treadonly pageObjNum: number;\n\t/** The raw dictionary content string of the original page */\n\treadonly originalDictContent: string;\n\n\t/** Accumulated content-stream operators added by draw* methods */\n\tprivate operators: string[] = [];\n\n\t/** Images referenced by drawImage (name -> obj num) */\n\tprivate imageRefs: Map<string, number> = new Map();\n\n\t/** Font object number allocated by the document (set externally) */\n\tfontObjNum = 0;\n\n\t/** Whether any drawing operations have been recorded */\n\tget dirty(): boolean {\n\t\treturn this.operators.length > 0;\n\t}\n\n\tconstructor(\n\t\tpageObjNum: number,\n\t\twidth: number,\n\t\theight: number,\n\t\toriginalDictContent: string,\n\t) {\n\t\tthis.pageObjNum = pageObjNum;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.originalDictContent = originalDictContent;\n\t}\n\n\t/**\n\t * Draw text on the page using Helvetica\n\t */\n\tdrawText(text: string, options: TextOptions): void {\n\t\tconst { x, y, size = 12, color } = options;\n\t\tconst rgb = parseHexColor(color);\n\n\t\tif (rgb) {\n\t\t\tthis.operators.push(`${rgb[0].toFixed(3)} ${rgb[1].toFixed(3)} ${rgb[2].toFixed(3)} rg`);\n\t\t}\n\n\t\t// Escape special PDF string characters\n\t\tconst escaped = text\n\t\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t\t.replace(/\\(/g, \"\\\\(\")\n\t\t\t.replace(/\\)/g, \"\\\\)\");\n\n\t\tthis.operators.push(\"BT\");\n\t\tthis.operators.push(`/F1 ${size} Tf`);\n\t\tthis.operators.push(`${x} ${y} Td`);\n\t\tthis.operators.push(`(${escaped}) Tj`);\n\t\tthis.operators.push(\"ET\");\n\t}\n\n\t/**\n\t * Draw a rectangle on the page\n\t */\n\tdrawRectangle(options: RectOptions): void {\n\t\tconst { x, y, width, height, color, borderColor, borderWidth } = options;\n\n\t\tconst fillRgb = parseHexColor(color);\n\t\tconst strokeRgb = parseHexColor(borderColor);\n\n\t\tif (fillRgb) {\n\t\t\tthis.operators.push(`${fillRgb[0].toFixed(3)} ${fillRgb[1].toFixed(3)} ${fillRgb[2].toFixed(3)} rg`);\n\t\t}\n\t\tif (strokeRgb) {\n\t\t\tthis.operators.push(`${strokeRgb[0].toFixed(3)} ${strokeRgb[1].toFixed(3)} ${strokeRgb[2].toFixed(3)} RG`);\n\t\t}\n\t\tif (borderWidth !== undefined) {\n\t\t\tthis.operators.push(`${borderWidth} w`);\n\t\t}\n\n\t\tthis.operators.push(`${x} ${y} ${width} ${height} re`);\n\n\t\tif (fillRgb && strokeRgb) {\n\t\t\tthis.operators.push(\"B\"); // fill and stroke\n\t\t} else if (fillRgb) {\n\t\t\tthis.operators.push(\"f\"); // fill only\n\t\t} else if (strokeRgb) {\n\t\t\tthis.operators.push(\"S\"); // stroke only\n\t\t} else {\n\t\t\tthis.operators.push(\"f\"); // default: fill with current colour (black)\n\t\t}\n\t}\n\n\t/**\n\t * Draw an embedded image on the page\n\t */\n\tdrawImage(image: PdfImage, options: ImageOptions): void {\n\t\tconst { x, y, width, height } = options;\n\t\tconst imgName = `Im${image.objectNumber}`;\n\t\tthis.imageRefs.set(imgName, image.objectNumber);\n\n\t\tthis.operators.push(\"q\");\n\t\tthis.operators.push(`${width} 0 0 ${height} ${x} ${y} cm`);\n\t\tthis.operators.push(`/${imgName} Do`);\n\t\tthis.operators.push(\"Q\");\n\t}\n\n\t/**\n\t * Build the content stream bytes for the accumulated operators\n\t */\n\tbuildContentStream(): Uint8Array {\n\t\tconst content = this.operators.join(\"\\n\");\n\t\treturn new TextEncoder().encode(content);\n\t}\n\n\t/**\n\t * Get image references used in drawing operations\n\t */\n\tgetImageRefs(): Map<string, number> {\n\t\treturn new Map(this.imageRefs);\n\t}\n}\n",
|
|
7
|
-
"/**\n * PdfDocument implementation for the editing plugin\n *\n * Manages loading an existing PDF, tracking modifications, and producing an\n * incremental update (appended after the original %%EOF) that adds or\n * overrides objects without rewriting the original content.\n */\n\nimport {\n\tparsePdfStructure,\n\tgetMediaBox,\n\textractObjectDictContent,\n\tparseResourcesDict,\n\tmergeResourcesDicts,\n} from \"./parser.ts\";\nimport { PdfPageImpl } from \"./page.ts\";\nimport type {\n\tPdfDocument,\n\tPdfImage,\n\tPdfPage,\n\tSignaturePlaceholderOptions,\n} from \"./types.ts\";\n\nconst BYTE_RANGE_PLACEHOLDER = \"0 0000000000 0000000000 0000000000\";\nconst DEFAULT_SIGNATURE_LENGTH = 16384;\n\nconst latin1Encoder = new TextEncoder(); // UTF-8 but we only feed ASCII/latin1-safe chars\nconst latin1Decoder = new TextDecoder(\"latin1\");\n\n/**\n * Parse PNG IHDR to extract width, height, bit depth, and colour type.\n */\nfunction parsePngIhdr(data: Uint8Array): {\n\twidth: number;\n\theight: number;\n\tbitDepth: number;\n\tcolorType: number;\n} {\n\t// PNG signature: 8 bytes, then first chunk is IHDR\n\tconst sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\tfor (let i = 0; i < sig.length; i++) {\n\t\tif (data[i] !== sig[i]) throw new Error(\"Not a valid PNG file\");\n\t}\n\n\t// IHDR chunk starts at offset 8\n\t// 4 bytes length + 4 bytes \"IHDR\" + 13 bytes data\n\tconst view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\tconst chunkType = latin1Decoder.decode(data.slice(12, 16));\n\tif (chunkType !== \"IHDR\") throw new Error(\"First PNG chunk is not IHDR\");\n\n\treturn {\n\t\twidth: view.getUint32(16),\n\t\theight: view.getUint32(20),\n\t\tbitDepth: data[24]!,\n\t\tcolorType: data[25]!,\n\t};\n}\n\n/**\n * Extract and concatenate all IDAT chunk data from a PNG\n */\nfunction extractIdatData(data: Uint8Array): Uint8Array {\n\tconst view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\tconst chunks: Uint8Array[] = [];\n\tlet offset = 8; // skip PNG signature\n\n\twhile (offset < data.length) {\n\t\tconst chunkLen = view.getUint32(offset);\n\t\tconst chunkType = latin1Decoder.decode(data.slice(offset + 4, offset + 8));\n\n\t\tif (chunkType === \"IDAT\") {\n\t\t\tchunks.push(data.slice(offset + 8, offset + 8 + chunkLen));\n\t\t}\n\n\t\t// skip: length(4) + type(4) + data(chunkLen) + crc(4)\n\t\toffset += 12 + chunkLen;\n\t}\n\n\tif (chunks.length === 0) throw new Error(\"No IDAT chunks found in PNG\");\n\n\t// Concatenate all IDAT data\n\tconst totalLen = chunks.reduce((s, c) => s + c.length, 0);\n\tconst result = new Uint8Array(totalLen);\n\tlet pos = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, pos);\n\t\tpos += chunk.length;\n\t}\n\treturn result;\n}\n\nexport class PdfDocumentImpl implements PdfDocument {\n\tprivate originalData: Uint8Array;\n\tprivate structure: ReturnType<typeof parsePdfStructure>;\n\tprivate pages: PdfPageImpl[] = [];\n\tprivate nextObjNum: number;\n\tprivate fontObjNum: number;\n\tprivate embeddedImages: Array<{\n\t\tobjNum: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tidatData: Uint8Array;\n\t\tcolorType: number;\n\t\tbitDepth: number;\n\t}> = [];\n\n\tconstructor(data: Uint8Array) {\n\t\tthis.originalData = data;\n\t\tthis.structure = parsePdfStructure(data);\n\n\t\t// Allocate a font object number right away (Helvetica)\n\t\tthis.nextObjNum = this.structure.size;\n\t\tthis.fontObjNum = this.nextObjNum++;\n\n\t\t// Build page objects\n\t\tfor (let i = 0; i < this.structure.pageNums.length; i++) {\n\t\t\tconst pageNum = this.structure.pageNums[i]!;\n\t\t\tconst mediaBox = getMediaBox(data, pageNum);\n\t\t\tconst width = mediaBox[2] - mediaBox[0];\n\t\t\tconst height = mediaBox[3] - mediaBox[1];\n\t\t\tconst dictContent = this.structure.pageDictContents[i]!;\n\t\t\tconst page = new PdfPageImpl(pageNum, width, height, dictContent);\n\t\t\tpage.fontObjNum = this.fontObjNum;\n\t\t\tthis.pages.push(page);\n\t\t}\n\t}\n\n\tget pageCount(): number {\n\t\treturn this.pages.length;\n\t}\n\n\tgetPage(index: number): PdfPage {\n\t\tif (index < 0 || index >= this.pages.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Page index ${index} out of range (0-${this.pages.length - 1})`,\n\t\t\t);\n\t\t}\n\t\treturn this.pages[index]!;\n\t}\n\n\tembedPng(data: Uint8Array): PdfImage {\n\t\tconst ihdr = parsePngIhdr(data);\n\t\tconst idatData = extractIdatData(data);\n\t\tconst objNum = this.nextObjNum++;\n\n\t\tthis.embeddedImages.push({\n\t\t\tobjNum,\n\t\t\twidth: ihdr.width,\n\t\t\theight: ihdr.height,\n\t\t\tidatData,\n\t\t\tcolorType: ihdr.colorType,\n\t\t\tbitDepth: ihdr.bitDepth,\n\t\t});\n\n\t\treturn {\n\t\t\tobjectNumber: objNum,\n\t\t\twidth: ihdr.width,\n\t\t\theight: ihdr.height,\n\t\t};\n\t}\n\n\t/**\n\t * Save the modified PDF using an incremental update\n\t */\n\tsave(): Uint8Array {\n\t\treturn this.buildIncrementalUpdate(false).pdf;\n\t}\n\n\t/**\n\t * Save with a signature placeholder for digital signing\n\t */\n\tsaveWithPlaceholder(options: SignaturePlaceholderOptions): {\n\t\tpdf: Uint8Array;\n\t\tbyteRange: [number, number, number, number];\n\t} {\n\t\treturn this.buildIncrementalUpdate(true, options);\n\t}\n\n\tprivate buildIncrementalUpdate(\n\t\twithSignature: boolean,\n\t\tsigOptions?: SignaturePlaceholderOptions,\n\t): { pdf: Uint8Array; byteRange: [number, number, number, number] } {\n\t\tconst objects: Array<{ objNum: number; content: string; streamData?: Uint8Array }> = [];\n\t\tlet currentNextObj = this.nextObjNum;\n\n\t\t// --- 1. Font object (Helvetica, always emitted if any page is dirty) ---\n\t\tconst anyDirty = this.pages.some((p) => p.dirty);\n\t\tif (anyDirty || this.embeddedImages.length > 0) {\n\t\t\tobjects.push({\n\t\t\t\tobjNum: this.fontObjNum,\n\t\t\t\tcontent: \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n\t\t\t});\n\t\t}\n\n\t\t// --- 2. Embedded image XObjects ---\n\t\tfor (const img of this.embeddedImages) {\n\t\t\tconst colorSpace = img.colorType === 2 ? \"/DeviceRGB\" : img.colorType === 0 ? \"/DeviceGray\" : \"/DeviceRGB\";\n\t\t\tconst colors = img.colorType === 2 ? 3 : 1;\n\t\t\tconst bpc = img.bitDepth;\n\n\t\t\t// PNG IDAT data uses per-row filter bytes. Tell the PDF reader\n\t\t\t// via DecodeParms with Predictor 15 (PNG optimum prediction).\n\t\t\tobjects.push({\n\t\t\t\tobjNum: img.objNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /XObject\",\n\t\t\t\t\t\"/Subtype /Image\",\n\t\t\t\t\t`/Width ${img.width}`,\n\t\t\t\t\t`/Height ${img.height}`,\n\t\t\t\t\t`/ColorSpace ${colorSpace}`,\n\t\t\t\t\t`/BitsPerComponent ${bpc}`,\n\t\t\t\t\t\"/Filter /FlateDecode\",\n\t\t\t\t\t`/DecodeParms << /Predictor 15 /Colors ${colors} /BitsPerComponent ${bpc} /Columns ${img.width} >>`,\n\t\t\t\t\t`/Length ${img.idatData.length}`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\tstreamData: img.idatData,\n\t\t\t});\n\t\t}\n\n\t\t// --- 3. Content streams for dirty pages ---\n\t\tconst contentStreamMap = new Map<number, number>(); // pageObjNum -> contentStreamObjNum\n\t\tfor (const page of this.pages) {\n\t\t\tif (!page.dirty) continue;\n\t\t\tconst contentObjNum = currentNextObj++;\n\t\t\tcontentStreamMap.set(page.pageObjNum, contentObjNum);\n\t\t\tconst streamData = page.buildContentStream();\n\t\t\tobjects.push({\n\t\t\t\tobjNum: contentObjNum,\n\t\t\t\tcontent: `<< /Length ${streamData.length} >>`,\n\t\t\t\tstreamData,\n\t\t\t});\n\t\t}\n\n\t\t// --- 4. Updated page dictionaries (add new content stream + font/image resources) ---\n\t\tfor (const page of this.pages) {\n\t\t\tif (!page.dirty && !this.hasImagesForPage(page)) continue;\n\n\t\t\tlet pageContent = page.originalDictContent;\n\n\t\t\t// Add or replace Contents reference if page is dirty\n\t\t\tif (page.dirty) {\n\t\t\t\tconst contentObjNum = contentStreamMap.get(page.pageObjNum)!;\n\n\t\t\t\tif (pageContent.match(/\\/Contents\\s/)) {\n\t\t\t\t\t// Replace existing Contents with an array: [original, new]\n\t\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t\t/\\/Contents\\s+(\\d+\\s+\\d+\\s+R)/,\n\t\t\t\t\t\t`/Contents [$1 ${contentObjNum} 0 R]`,\n\t\t\t\t\t);\n\t\t\t\t\t// Also handle existing Contents arrays\n\t\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t\t/\\/Contents\\s*\\[([^\\]]+)\\]/,\n\t\t\t\t\t\t(match, inner) => {\n\t\t\t\t\t\t\t// If we already added our ref above, skip\n\t\t\t\t\t\t\tif (inner.includes(`${contentObjNum} 0 R`)) return match;\n\t\t\t\t\t\t\treturn `/Contents [${inner.trim()} ${contentObjNum} 0 R]`;\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tpageContent += `\\n/Contents ${contentObjNum} 0 R`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Build signature's new resources\n\t\t\tconst newResourceParts: string[] = [];\n\t\t\tnewResourceParts.push(`/Font << /F1 ${this.fontObjNum} 0 R >>`);\n\n\t\t\t// Image resources\n\t\t\tconst imageRefs = page.dirty ? (page as PdfPageImpl).getImageRefs() : new Map<string, number>();\n\t\t\tif (imageRefs.size > 0) {\n\t\t\t\tconst xobjEntries = Array.from(imageRefs.entries())\n\t\t\t\t\t.map(([name, objNum]) => `/${name} ${objNum} 0 R`)\n\t\t\t\t\t.join(\" \");\n\t\t\t\tnewResourceParts.push(`/XObject << ${xobjEntries} >>`);\n\t\t\t}\n\n\t\t\tconst newResources: Record<string, string> = {};\n\t\t\tfor (const part of newResourceParts) {\n\t\t\t\tconst [resType, ...rest] = part.split(/\\s+/);\n\t\t\t\tif (resType) {\n\t\t\t\t\tnewResources[resType] = rest.join(\" \");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Parse existing Resources from page\n\t\t\tconst existingResources = parseResourcesDict(pageContent, this.originalData);\n\n\t\t\t// Merge existing with new\n\t\t\tconst mergedResources = mergeResourcesDicts(existingResources, newResources);\n\n\t\t\t// Build merged Resources dictionary string\n\t\t\tconst resourceEntries = Object.entries(mergedResources)\n\t\t\t\t.map(([name, value]) => `${name} ${value}`)\n\t\t\t\t.join(\"\\n\");\n\n\t\t\t// Update page content with merged Resources\n\t\t\tif (pageContent.match(/\\/Resources\\s*<</)) {\n\t\t\t\t// Replace existing inline Resources\n\t\t\t\tconst resIdx = pageContent.indexOf(\"/Resources\");\n\t\t\t\tconst resStart = pageContent.indexOf(\"<<\", resIdx);\n\t\t\t\tif (resStart !== -1) {\n\t\t\t\t\tconst resEnd = findMatchingDictEndInContent(pageContent, resStart);\n\t\t\t\t\tif (resEnd !== -1) {\n\t\t\t\t\t\tpageContent =\n\t\t\t\t\t\t\tpageContent.slice(0, resStart) +\n\t\t\t\t\t\t\t`<< ${resourceEntries} >>` +\n\t\t\t\t\t\t\tpageContent.slice(resEnd + 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (pageContent.match(/\\/Resources\\s+\\d+\\s+\\d+\\s+R/)) {\n\t\t\t\t// Replace indirect reference with merged inline dictionary\n\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t/\\/Resources\\s+\\d+\\s+\\d+\\s+R/,\n\t\t\t\t\t`/Resources << ${resourceEntries} >>`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// No resources at all — add them\n\t\t\t\tpageContent += `\\n/Resources << ${resourceEntries} >>`;\n\t\t\t}\n\n\t\t\tobjects.push({\n\t\t\t\tobjNum: page.pageObjNum,\n\t\t\t\tcontent: `<<${pageContent}\\n>>`,\n\t\t\t});\n\t\t}\n\n\t\t// --- 5. Signature placeholder objects (if requested) ---\n\t\tlet sigObjNum = 0;\n\t\tlet widgetObjNum = 0;\n\t\tlet acroFormObjNum = 0;\n\n\t\tif (withSignature && sigOptions) {\n\t\t\tsigObjNum = currentNextObj++;\n\t\t\twidgetObjNum = currentNextObj++;\n\t\t\tacroFormObjNum = currentNextObj++;\n\n\t\t\tconst signatureLength = sigOptions.signatureLength ?? DEFAULT_SIGNATURE_LENGTH;\n\t\t\tconst reason = sigOptions.reason ?? \"Digitally signed\";\n\t\t\tconst name = sigOptions.name ?? \"Digital Signature\";\n\t\t\tconst location = sigOptions.location ?? \"\";\n\t\t\tconst contactInfo = sigOptions.contactInfo ?? \"\";\n\t\t\tconst signingTime = formatPdfDate(new Date());\n\t\t\tconst contentsPlaceholder = \"0\".repeat(signatureLength * 2);\n\n\t\t\tconst sigParts = [\n\t\t\t\t\"<< /Type /Sig\",\n\t\t\t\t\"/Filter /Adobe.PPKLite\",\n\t\t\t\t\"/SubFilter /adbe.pkcs7.detached\",\n\t\t\t\t`/ByteRange [${BYTE_RANGE_PLACEHOLDER}]`,\n\t\t\t\t`/Contents <${contentsPlaceholder}>`,\n\t\t\t\t`/Reason ${pdfString(reason)}`,\n\t\t\t\t`/M ${pdfString(signingTime)}`,\n\t\t\t\t`/Name ${pdfString(name)}`,\n\t\t\t];\n\t\t\tif (location) sigParts.push(`/Location ${pdfString(location)}`);\n\t\t\tif (contactInfo) sigParts.push(`/ContactInfo ${pdfString(contactInfo)}`);\n\t\t\tsigParts.push(\">>\");\n\n\t\t\tobjects.push({ objNum: sigObjNum, content: sigParts.join(\"\\n\") });\n\n\t\t\t// Widget annotation\n\t\t\tconst firstPageNum = this.structure.pageNums[0]!;\n\t\t\tobjects.push({\n\t\t\t\tobjNum: widgetObjNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /Annot\",\n\t\t\t\t\t\"/Subtype /Widget\",\n\t\t\t\t\t\"/FT /Sig\",\n\t\t\t\t\t\"/Rect [0 0 0 0]\",\n\t\t\t\t\t`/V ${sigObjNum} 0 R`,\n\t\t\t\t\t`/T ${pdfString(\"Signature1\")}`,\n\t\t\t\t\t\"/F 4\",\n\t\t\t\t\t`/P ${firstPageNum} 0 R`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t});\n\n\t\t\t// AcroForm\n\t\t\tobjects.push({\n\t\t\t\tobjNum: acroFormObjNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /AcroForm\",\n\t\t\t\t\t\"/SigFlags 3\",\n\t\t\t\t\t`/Fields [${widgetObjNum} 0 R]`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t});\n\n\t\t\t// Updated Root catalog with AcroForm\n\t\t\tlet rootContent = this.structure.rootDictContent;\n\t\t\trootContent = rootContent.replace(/\\/AcroForm\\s+\\d+\\s+\\d+\\s+R/g, \"\");\n\t\t\trootContent = rootContent.replace(/\\/Perms\\s*<<[^>]*>>/g, \"\");\n\t\t\trootContent = rootContent.replace(/\\/Perms\\s+\\d+\\s+\\d+\\s+R/g, \"\");\n\n\t\t\tobjects.push({\n\t\t\t\tobjNum: this.structure.rootNum,\n\t\t\t\tcontent: `<<${rootContent}\\n/AcroForm ${acroFormObjNum} 0 R\\n>>`,\n\t\t\t});\n\n\t\t\t// Updated first page with Annots\n\t\t\tconst firstPage = this.pages[0]!;\n\t\t\tlet pageContent: string;\n\n\t\t\t// Check if we already have this page in objects (from dirty page update)\n\t\t\tconst existingPageObj = objects.find((o) => o.objNum === firstPage.pageObjNum);\n\t\t\tif (existingPageObj) {\n\t\t\t\t// Extract content from existing updated page (strip outer << >>)\n\t\t\t\tpageContent = existingPageObj.content.slice(2, existingPageObj.content.length - 2);\n\t\t\t} else {\n\t\t\t\tpageContent = firstPage.originalDictContent;\n\t\t\t}\n\n\t\t\tif (pageContent.includes(\"/Annots\")) {\n\t\t\t\tconst bracketEnd = pageContent.indexOf(\"]\", pageContent.indexOf(\"/Annots\"));\n\t\t\t\tpageContent =\n\t\t\t\t\tpageContent.slice(0, bracketEnd) +\n\t\t\t\t\t` ${widgetObjNum} 0 R` +\n\t\t\t\t\tpageContent.slice(bracketEnd);\n\t\t\t} else {\n\t\t\t\tpageContent += `\\n/Annots [${widgetObjNum} 0 R]`;\n\t\t\t}\n\n\t\t\t// Update or add the page object\n\t\t\tif (existingPageObj) {\n\t\t\t\texistingPageObj.content = `<<${pageContent}\\n>>`;\n\t\t\t} else {\n\t\t\t\tobjects.push({\n\t\t\t\t\tobjNum: firstPage.pageObjNum,\n\t\t\t\t\tcontent: `<<${pageContent}\\n>>`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// --- Serialise incremental update ---\n\t\tconst newSize = currentNextObj;\n\t\tconst appendParts: Uint8Array[] = [];\n\t\tconst objectOffsets: Array<{ objNum: number; offset: number }> = [];\n\n\t\t// Compute starting byte offset (after original data)\n\t\tlet currentOffset = this.originalData.length;\n\n\t\tfor (const obj of objects) {\n\t\t\t// Separator newline\n\t\t\tconst sep = latin1Encoder.encode(\"\\n\");\n\t\t\tappendParts.push(sep);\n\t\t\tcurrentOffset += sep.length;\n\n\t\t\tobjectOffsets.push({ objNum: obj.objNum, offset: currentOffset });\n\n\t\t\tif (obj.streamData) {\n\t\t\t\t// Object with stream\n\t\t\t\tconst header = latin1Encoder.encode(`${obj.objNum} 0 obj\\n${obj.content}\\nstream\\n`);\n\t\t\t\tappendParts.push(header);\n\t\t\t\tcurrentOffset += header.length;\n\n\t\t\t\tappendParts.push(obj.streamData);\n\t\t\t\tcurrentOffset += obj.streamData.length;\n\n\t\t\t\tconst footer = latin1Encoder.encode(\"\\nendstream\\nendobj\\n\");\n\t\t\t\tappendParts.push(footer);\n\t\t\t\tcurrentOffset += footer.length;\n\t\t\t} else {\n\t\t\t\tconst objBytes = latin1Encoder.encode(\n\t\t\t\t\t`${obj.objNum} 0 obj\\n${obj.content}\\nendobj\\n`,\n\t\t\t\t);\n\t\t\t\tappendParts.push(objBytes);\n\t\t\t\tcurrentOffset += objBytes.length;\n\t\t\t}\n\t\t}\n\n\t\t// Xref table\n\t\tconst xrefOffset = currentOffset;\n\t\tconst xrefStr = buildXrefTable(objectOffsets);\n\t\tconst xrefBytes = latin1Encoder.encode(xrefStr);\n\t\tappendParts.push(xrefBytes);\n\t\tcurrentOffset += xrefBytes.length;\n\n\t\t// Trailer\n\t\tconst trailerLines = [\"<<\", `/Size ${newSize}`, `/Root ${this.structure.rootNum} 0 R`];\n\t\tif (this.structure.infoNum !== null) {\n\t\t\ttrailerLines.push(`/Info ${this.structure.infoNum} 0 R`);\n\t\t}\n\t\ttrailerLines.push(`/Prev ${this.structure.xrefOffset}`, \">>\");\n\n\t\tconst trailerStr =\n\t\t\t`trailer\\n${trailerLines.join(\"\\n\")}\\nstartxref\\n${xrefOffset}\\n%%EOF`;\n\t\tconst trailerBytes = latin1Encoder.encode(trailerStr);\n\t\tappendParts.push(trailerBytes);\n\n\t\t// Combine original + append parts\n\t\tconst totalAppendLength = appendParts.reduce((s, p) => s + p.length, 0);\n\t\tconst result = new Uint8Array(this.originalData.length + totalAppendLength);\n\t\tresult.set(this.originalData, 0);\n\t\tlet pos = this.originalData.length;\n\t\tfor (const part of appendParts) {\n\t\t\tresult.set(part, pos);\n\t\t\tpos += part.length;\n\t\t}\n\n\t\t// --- Calculate byte range for signature ---\n\t\tlet byteRange: [number, number, number, number] = [0, 0, 0, 0];\n\n\t\tif (withSignature) {\n\t\t\tconst { br, updatedPdf } = updateByteRange(result);\n\t\t\tbyteRange = br;\n\t\t\treturn { pdf: updatedPdf, byteRange };\n\t\t}\n\n\t\treturn { pdf: result, byteRange };\n\t}\n\n\tprivate hasImagesForPage(page: PdfPageImpl): boolean {\n\t\treturn page.dirty && page.getImageRefs().size > 0;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildXrefTable(\n\tentries: Array<{ objNum: number; offset: number }>,\n): string {\n\tconst sorted = [...entries].sort((a, b) => a.objNum - b.objNum);\n\n\tconst subsections: Array<{ start: number; offsets: number[] }> = [];\n\tfor (const entry of sorted) {\n\t\tconst last = subsections[subsections.length - 1];\n\t\tif (last && entry.objNum === last.start + last.offsets.length) {\n\t\t\tlast.offsets.push(entry.offset);\n\t\t} else {\n\t\t\tsubsections.push({ start: entry.objNum, offsets: [entry.offset] });\n\t\t}\n\t}\n\n\tlet result = \"xref\\n\";\n\tfor (const sub of subsections) {\n\t\tresult += `${sub.start} ${sub.offsets.length}\\n`;\n\t\tfor (const offset of sub.offsets) {\n\t\t\tresult += `${String(offset).padStart(10, \"0\")} 00000 n \\n`;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction formatPdfDate(date: Date): string {\n\tconst y = date.getUTCFullYear();\n\tconst m = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst d = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst h = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst min = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst s = String(date.getUTCSeconds()).padStart(2, \"0\");\n\treturn `D:${y}${m}${d}${h}${min}${s}Z`;\n}\n\nfunction pdfString(str: string): string {\n\tconst escaped = str\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\\(/g, \"\\\\(\")\n\t\t.replace(/\\)/g, \"\\\\)\");\n\treturn `(${escaped})`;\n}\n\n/**\n * Find and update the ByteRange placeholder in the PDF, returning the\n * actual byte range values and the updated PDF bytes.\n */\nfunction updateByteRange(pdf: Uint8Array): {\n\tbr: [number, number, number, number];\n\tupdatedPdf: Uint8Array;\n} {\n\tconst pdfStr = new TextDecoder(\"latin1\").decode(pdf);\n\n\t// Find /Contents < ... > in the signature object\n\tconst contentsMarker = \"/Contents <\";\n\tconst contentsIdx = pdfStr.lastIndexOf(contentsMarker);\n\tif (contentsIdx === -1) throw new Error(\"Cannot find Contents in signature\");\n\tconst contentsStart = contentsIdx + contentsMarker.length;\n\tconst contentsEnd = pdfStr.indexOf(\">\", contentsStart);\n\tif (contentsEnd === -1) throw new Error(\"Cannot find end of Contents hex\");\n\n\t// The byte range: [0, before-sig-hex, after-sig-hex, rest]\n\t// contentsStart - 1 is the position of '<'\n\t// contentsEnd + 1 is the position after '>'\n\tconst br: [number, number, number, number] = [\n\t\t0,\n\t\tcontentsStart - 1, // length1: everything before '<'\n\t\tcontentsEnd + 1, // offset2: after '>'\n\t\tpdf.length - (contentsEnd + 1), // length2: rest of PDF\n\t];\n\n\t// Now update the ByteRange placeholder with actual values\n\tconst byteRangeMarker = \"/ByteRange [\";\n\tconst brIdx = pdfStr.lastIndexOf(byteRangeMarker);\n\tif (brIdx === -1) throw new Error(\"Cannot find ByteRange in PDF\");\n\tconst brStart = brIdx + byteRangeMarker.length;\n\tconst brEnd = pdfStr.indexOf(\"]\", brStart);\n\tif (brEnd === -1) throw new Error(\"Cannot find end of ByteRange\");\n\n\tconst placeholderLen = brEnd - brStart;\n\tconst brValueStr = `${br[0]} ${br[1]} ${br[2]} ${br[3]}`;\n\tconst paddedBr = brValueStr.padEnd(placeholderLen, \" \");\n\n\t// Build updated PDF\n\tconst updatedPdf = new Uint8Array(pdf.length);\n\tupdatedPdf.set(pdf);\n\n\t// Write the byte range values\n\tconst brBytes = new TextEncoder().encode(paddedBr);\n\tupdatedPdf.set(brBytes, brStart);\n\n\treturn { br, updatedPdf };\n}\n\n/**\n * Find matching >> for a << in a content string\n */\nfunction findMatchingDictEndInContent(str: string, startPos: number): number {\n\tlet depth = 0;\n\tlet i = startPos;\n\n\twhile (i < str.length - 1) {\n\t\tif (str[i] === \"(\") {\n\t\t\ti++;\n\t\t\twhile (i < str.length && str[i] !== \")\") {\n\t\t\t\tif (str[i] === \"\\\\\") i++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++;\n\t\t} else if (str[i] === \"<\" && str[i + 1] === \"<\") {\n\t\t\tdepth++;\n\t\t\ti += 2;\n\t\t} else if (str[i] === \">\" && str[i + 1] === \">\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t\ti += 2;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n// ---------------------------------------------------------------------------\n// Signature utility exports (for use by the e-signature library)\n// ---------------------------------------------------------------------------\n\n/**\n * Find the ByteRange and Contents placeholder in a signed PDF\n */\nexport function findByteRange(pdfData: Uint8Array): {\n\tbyteRange: [number, number, number, number];\n\tcontentsStart: number;\n\tcontentsEnd: number;\n\tplaceholderLength: number;\n} {\n\tconst pdf = new TextDecoder(\"latin1\").decode(pdfData);\n\n\tconst contentsMarker = \"/Contents <\";\n\tconst contentsIdx = pdf.lastIndexOf(contentsMarker);\n\tif (contentsIdx === -1) throw new Error(\"Could not find Contents in PDF\");\n\n\tconst contentsStart = contentsIdx + contentsMarker.length;\n\tconst contentsEnd = pdf.indexOf(\">\", contentsStart);\n\tif (contentsEnd === -1) throw new Error(\"Could not find end of Contents field\");\n\n\tconst placeholderLength = contentsEnd - contentsStart;\n\n\tconst byteRange: [number, number, number, number] = [\n\t\t0,\n\t\tcontentsStart - 1,\n\t\tcontentsEnd + 1,\n\t\tpdfData.length - (contentsEnd + 1),\n\t];\n\n\treturn { byteRange, contentsStart, contentsEnd, placeholderLength };\n}\n\n/**\n * Extract the bytes that need to be signed according to the ByteRange\n */\nexport function extractBytesToSign(\n\tpdfData: Uint8Array,\n\tbyteRange: [number, number, number, number],\n): Uint8Array {\n\tconst [offset1, length1, offset2, length2] = byteRange;\n\n\tif (offset1 < 0 || length1 <= 0 || offset2 <= 0 || length2 <= 0) {\n\t\tthrow new Error(`Invalid ByteRange values: [${byteRange.join(\", \")}]`);\n\t}\n\n\tif (offset1 + length1 > pdfData.length || offset2 + length2 > pdfData.length) {\n\t\tthrow new Error(\"ByteRange exceeds PDF data size\");\n\t}\n\n\tconst chunk1 = pdfData.slice(offset1, offset1 + length1);\n\tconst chunk2 = pdfData.slice(offset2, offset2 + length2);\n\n\tconst result = new Uint8Array(chunk1.length + chunk2.length);\n\tresult.set(chunk1, 0);\n\tresult.set(chunk2, chunk1.length);\n\treturn result;\n}\n\n/**\n * Embed a signature (as raw bytes) into the Contents placeholder\n */\nexport function embedSignature(\n\tpdfData: Uint8Array,\n\tsignature: Uint8Array,\n): Uint8Array {\n\tconst { contentsStart, placeholderLength } = findByteRange(pdfData);\n\n\t// Convert signature to hex\n\tconst hexChars: string[] = [];\n\tfor (let i = 0; i < signature.length; i++) {\n\t\thexChars.push(signature[i]!.toString(16).padStart(2, \"0\"));\n\t}\n\tconst signatureHex = hexChars.join(\"\");\n\n\tif (signatureHex.length > placeholderLength) {\n\t\tthrow new Error(\n\t\t\t`Signature too large: ${signatureHex.length} hex chars, placeholder is ${placeholderLength}`,\n\t\t);\n\t}\n\n\tconst paddedHex = signatureHex.padEnd(placeholderLength, \"0\");\n\tconst hexBytes = new TextEncoder().encode(paddedHex);\n\n\tconst result = new Uint8Array(pdfData.length);\n\tresult.set(pdfData);\n\tresult.set(hexBytes, contentsStart);\n\treturn result;\n}\n",
|
|
7
|
+
"/**\n * PdfDocument implementation for the editing plugin\n *\n * Manages loading an existing PDF, tracking modifications, and producing an\n * incremental update (appended after the original %%EOF) that adds or\n * overrides objects without rewriting the original content.\n */\n\nimport {\n\tparsePdfStructure,\n\tgetMediaBox,\n\textractObjectDictContent,\n\tparseResourcesDict,\n\tmergeResourcesDicts,\n} from \"./parser.ts\";\nimport { PdfPageImpl } from \"./page.ts\";\nimport type {\n\tPdfDocument,\n\tPdfImage,\n\tPdfPage,\n\tSignaturePlaceholderOptions,\n} from \"./types.ts\";\n\nconst BYTE_RANGE_PLACEHOLDER = \"0 0000000000 0000000000 0000000000\";\nconst DEFAULT_SIGNATURE_LENGTH = 16384;\n\nconst latin1Encoder = new TextEncoder(); // UTF-8 but we only feed ASCII/latin1-safe chars\nconst latin1Decoder = new TextDecoder(\"latin1\");\n\n/**\n * Parse PNG IHDR to extract width, height, bit depth, and colour type.\n */\nfunction parsePngIhdr(data: Uint8Array): {\n\twidth: number;\n\theight: number;\n\tbitDepth: number;\n\tcolorType: number;\n} {\n\t// PNG signature: 8 bytes, then first chunk is IHDR\n\tconst sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\tfor (let i = 0; i < sig.length; i++) {\n\t\tif (data[i] !== sig[i]) throw new Error(\"Not a valid PNG file\");\n\t}\n\n\t// IHDR chunk starts at offset 8\n\t// 4 bytes length + 4 bytes \"IHDR\" + 13 bytes data\n\tconst view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\tconst chunkType = latin1Decoder.decode(data.slice(12, 16));\n\tif (chunkType !== \"IHDR\") throw new Error(\"First PNG chunk is not IHDR\");\n\n\treturn {\n\t\twidth: view.getUint32(16),\n\t\theight: view.getUint32(20),\n\t\tbitDepth: data[24]!,\n\t\tcolorType: data[25]!,\n\t};\n}\n\n/**\n * Extract and concatenate all IDAT chunk data from a PNG\n */\nfunction extractIdatData(data: Uint8Array): Uint8Array {\n\tconst view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\tconst chunks: Uint8Array[] = [];\n\tlet offset = 8; // skip PNG signature\n\n\twhile (offset < data.length) {\n\t\tconst chunkLen = view.getUint32(offset);\n\t\tconst chunkType = latin1Decoder.decode(data.slice(offset + 4, offset + 8));\n\n\t\tif (chunkType === \"IDAT\") {\n\t\t\tchunks.push(data.slice(offset + 8, offset + 8 + chunkLen));\n\t\t}\n\n\t\t// skip: length(4) + type(4) + data(chunkLen) + crc(4)\n\t\toffset += 12 + chunkLen;\n\t}\n\n\tif (chunks.length === 0) throw new Error(\"No IDAT chunks found in PNG\");\n\n\t// Concatenate all IDAT data\n\tconst totalLen = chunks.reduce((s, c) => s + c.length, 0);\n\tconst result = new Uint8Array(totalLen);\n\tlet pos = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, pos);\n\t\tpos += chunk.length;\n\t}\n\treturn result;\n}\n\nexport class PdfDocumentImpl implements PdfDocument {\n\tprivate originalData: Uint8Array;\n\tprivate structure: ReturnType<typeof parsePdfStructure>;\n\tprivate pages: PdfPageImpl[] = [];\n\tprivate nextObjNum: number;\n\tprivate fontObjNum: number;\n\tprivate embeddedImages: Array<{\n\t\tobjNum: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tidatData: Uint8Array;\n\t\tcolorType: number;\n\t\tbitDepth: number;\n\t}> = [];\n\n\tconstructor(data: Uint8Array) {\n\t\tthis.originalData = data;\n\t\tthis.structure = parsePdfStructure(data);\n\n\t\t// Allocate a font object number right away (Helvetica)\n\t\tthis.nextObjNum = this.structure.size;\n\t\tthis.fontObjNum = this.nextObjNum++;\n\n\t\t// Build page objects\n\t\tfor (let i = 0; i < this.structure.pageNums.length; i++) {\n\t\t\tconst pageNum = this.structure.pageNums[i]!;\n\t\t\tconst mediaBox = getMediaBox(data, pageNum);\n\t\t\tconst width = mediaBox[2] - mediaBox[0];\n\t\t\tconst height = mediaBox[3] - mediaBox[1];\n\t\t\tconst dictContent = this.structure.pageDictContents[i]!;\n\t\t\tconst page = new PdfPageImpl(pageNum, width, height, dictContent);\n\t\t\tpage.fontObjNum = this.fontObjNum;\n\t\t\tthis.pages.push(page);\n\t\t}\n\t}\n\n\tget pageCount(): number {\n\t\treturn this.pages.length;\n\t}\n\n\tgetPage(index: number): PdfPage {\n\t\tif (index < 0 || index >= this.pages.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Page index ${index} out of range (0-${this.pages.length - 1})`,\n\t\t\t);\n\t\t}\n\t\treturn this.pages[index]!;\n\t}\n\n\tembedPng(data: Uint8Array): PdfImage {\n\t\tconst ihdr = parsePngIhdr(data);\n\t\tconst idatData = extractIdatData(data);\n\t\tconst objNum = this.nextObjNum++;\n\n\t\tthis.embeddedImages.push({\n\t\t\tobjNum,\n\t\t\twidth: ihdr.width,\n\t\t\theight: ihdr.height,\n\t\t\tidatData,\n\t\t\tcolorType: ihdr.colorType,\n\t\t\tbitDepth: ihdr.bitDepth,\n\t\t});\n\n\t\treturn {\n\t\t\tobjectNumber: objNum,\n\t\t\twidth: ihdr.width,\n\t\t\theight: ihdr.height,\n\t\t};\n\t}\n\n\t/**\n\t * Save the modified PDF using an incremental update\n\t */\n\tsave(): Uint8Array {\n\t\treturn this.buildIncrementalUpdate(false).pdf;\n\t}\n\n\t/**\n\t * Save with a signature placeholder for digital signing\n\t */\n\tsaveWithPlaceholder(options: SignaturePlaceholderOptions): {\n\t\tpdf: Uint8Array;\n\t\tbyteRange: [number, number, number, number];\n\t} {\n\t\treturn this.buildIncrementalUpdate(true, options);\n\t}\n\n\tprivate buildIncrementalUpdate(\n\t\twithSignature: boolean,\n\t\tsigOptions?: SignaturePlaceholderOptions,\n\t): { pdf: Uint8Array; byteRange: [number, number, number, number] } {\n\t\tconst objects: Array<{ objNum: number; content: string; streamData?: Uint8Array }> = [];\n\t\tlet currentNextObj = this.nextObjNum;\n\n\t\t// --- 1. Font object (Helvetica, always emitted if any page is dirty) ---\n\t\tconst anyDirty = this.pages.some((p) => p.dirty);\n\t\tif (anyDirty || this.embeddedImages.length > 0) {\n\t\t\tobjects.push({\n\t\t\t\tobjNum: this.fontObjNum,\n\t\t\t\tcontent: \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n\t\t\t});\n\t\t}\n\n\t\t// --- 2. Embedded image XObjects ---\n\t\tfor (const img of this.embeddedImages) {\n\t\t\tconst colorSpace = img.colorType === 2 ? \"/DeviceRGB\" : img.colorType === 0 ? \"/DeviceGray\" : \"/DeviceRGB\";\n\t\t\tconst colors = img.colorType === 2 ? 3 : 1;\n\t\t\tconst bpc = img.bitDepth;\n\n\t\t\t// PNG IDAT data uses per-row filter bytes. Tell the PDF reader\n\t\t\t// via DecodeParms with Predictor 15 (PNG optimum prediction).\n\t\t\tobjects.push({\n\t\t\t\tobjNum: img.objNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /XObject\",\n\t\t\t\t\t\"/Subtype /Image\",\n\t\t\t\t\t`/Width ${img.width}`,\n\t\t\t\t\t`/Height ${img.height}`,\n\t\t\t\t\t`/ColorSpace ${colorSpace}`,\n\t\t\t\t\t`/BitsPerComponent ${bpc}`,\n\t\t\t\t\t\"/Filter /FlateDecode\",\n\t\t\t\t\t`/DecodeParms << /Predictor 15 /Colors ${colors} /BitsPerComponent ${bpc} /Columns ${img.width} >>`,\n\t\t\t\t\t`/Length ${img.idatData.length}`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\tstreamData: img.idatData,\n\t\t\t});\n\t\t}\n\n\t\t// --- 3. Wrapper save-state streams + content streams for dirty pages ---\n\t\t// The original page content may modify the CTM (e.g. Y-axis flip for\n\t\t// top-left origin). We wrap the original content in q/Q so our new\n\t\t// drawing operators run with the default PDF coordinate system.\n\t\tconst wrapperStreamMap = new Map<number, number>(); // pageObjNum -> wrapperStreamObjNum\n\t\tconst contentStreamMap = new Map<number, number>(); // pageObjNum -> contentStreamObjNum\n\t\tfor (const page of this.pages) {\n\t\t\tif (!page.dirty) continue;\n\n\t\t\t// \"save state\" stream — placed BEFORE original content\n\t\t\tconst wrapperObjNum = currentNextObj++;\n\t\t\twrapperStreamMap.set(page.pageObjNum, wrapperObjNum);\n\t\t\tconst wrapperData = latin1Encoder.encode(\"q\");\n\t\t\tobjects.push({\n\t\t\t\tobjNum: wrapperObjNum,\n\t\t\t\tcontent: `<< /Length ${wrapperData.length} >>`,\n\t\t\t\tstreamData: wrapperData,\n\t\t\t});\n\n\t\t\t// Actual content stream — prefixed with Q to restore state\n\t\t\tconst contentObjNum = currentNextObj++;\n\t\t\tcontentStreamMap.set(page.pageObjNum, contentObjNum);\n\t\t\tconst pageStreamData = page.buildContentStream();\n\t\t\tconst prefixedData = new Uint8Array(2 + pageStreamData.length);\n\t\t\tprefixedData[0] = 0x51; // 'Q'\n\t\t\tprefixedData[1] = 0x0a; // '\\n'\n\t\t\tprefixedData.set(pageStreamData, 2);\n\t\t\tobjects.push({\n\t\t\t\tobjNum: contentObjNum,\n\t\t\t\tcontent: `<< /Length ${prefixedData.length} >>`,\n\t\t\t\tstreamData: prefixedData,\n\t\t\t});\n\t\t}\n\n\t\t// --- 4. Updated page dictionaries (add new content stream + font/image resources) ---\n\t\tfor (const page of this.pages) {\n\t\t\tif (!page.dirty && !this.hasImagesForPage(page)) continue;\n\n\t\t\tlet pageContent = page.originalDictContent;\n\n\t\t\t// Add or replace Contents reference if page is dirty\n\t\t\tif (page.dirty) {\n\t\t\t\tconst contentObjNum = contentStreamMap.get(page.pageObjNum)!;\n\t\t\t\tconst wrapperObjNum = wrapperStreamMap.get(page.pageObjNum)!;\n\n\t\t\t\tif (pageContent.match(/\\/Contents\\s/)) {\n\t\t\t\t\t// Replace existing Contents with an array: [wrapper, original, new]\n\t\t\t\t\t// The wrapper stream saves graphics state (q) before original content,\n\t\t\t\t\t// and the new stream restores it (Q) before our drawing operators.\n\t\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t\t/\\/Contents\\s+(\\d+\\s+\\d+\\s+R)/,\n\t\t\t\t\t\t`/Contents [${wrapperObjNum} 0 R $1 ${contentObjNum} 0 R]`,\n\t\t\t\t\t);\n\t\t\t\t\t// Also handle existing Contents arrays\n\t\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t\t/\\/Contents\\s*\\[([^\\]]+)\\]/,\n\t\t\t\t\t\t(match, inner) => {\n\t\t\t\t\t\t\t// If we already added our ref above, skip\n\t\t\t\t\t\t\tif (inner.includes(`${contentObjNum} 0 R`)) return match;\n\t\t\t\t\t\t\treturn `/Contents [${wrapperObjNum} 0 R ${inner.trim()} ${contentObjNum} 0 R]`;\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tpageContent += `\\n/Contents ${contentObjNum} 0 R`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Build signature's new resources\n\t\t\tconst newResourceParts: string[] = [];\n\t\t\tnewResourceParts.push(`/Font << /F1 ${this.fontObjNum} 0 R >>`);\n\n\t\t\t// Image resources\n\t\t\tconst imageRefs = page.dirty ? (page as PdfPageImpl).getImageRefs() : new Map<string, number>();\n\t\t\tif (imageRefs.size > 0) {\n\t\t\t\tconst xobjEntries = Array.from(imageRefs.entries())\n\t\t\t\t\t.map(([name, objNum]) => `/${name} ${objNum} 0 R`)\n\t\t\t\t\t.join(\" \");\n\t\t\t\tnewResourceParts.push(`/XObject << ${xobjEntries} >>`);\n\t\t\t}\n\n\t\t\tconst newResources: Record<string, string> = {};\n\t\t\tfor (const part of newResourceParts) {\n\t\t\t\tconst [resType, ...rest] = part.split(/\\s+/);\n\t\t\t\tif (resType) {\n\t\t\t\t\tnewResources[resType] = rest.join(\" \");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Parse existing Resources from page\n\t\t\tconst existingResources = parseResourcesDict(pageContent, this.originalData);\n\n\t\t\t// Merge existing with new\n\t\t\tconst mergedResources = mergeResourcesDicts(existingResources, newResources);\n\n\t\t\t// Build merged Resources dictionary string\n\t\t\tconst resourceEntries = Object.entries(mergedResources)\n\t\t\t\t.map(([name, value]) => `${name} ${value}`)\n\t\t\t\t.join(\"\\n\");\n\n\t\t\t// Update page content with merged Resources\n\t\t\tif (pageContent.match(/\\/Resources\\s*<</)) {\n\t\t\t\t// Replace existing inline Resources\n\t\t\t\tconst resIdx = pageContent.indexOf(\"/Resources\");\n\t\t\t\tconst resStart = pageContent.indexOf(\"<<\", resIdx);\n\t\t\t\tif (resStart !== -1) {\n\t\t\t\t\tconst resEnd = findMatchingDictEndInContent(pageContent, resStart);\n\t\t\t\t\tif (resEnd !== -1) {\n\t\t\t\t\t\tpageContent =\n\t\t\t\t\t\t\tpageContent.slice(0, resStart) +\n\t\t\t\t\t\t\t`<< ${resourceEntries} >>` +\n\t\t\t\t\t\t\tpageContent.slice(resEnd + 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (pageContent.match(/\\/Resources\\s+\\d+\\s+\\d+\\s+R/)) {\n\t\t\t\t// Replace indirect reference with merged inline dictionary\n\t\t\t\tpageContent = pageContent.replace(\n\t\t\t\t\t/\\/Resources\\s+\\d+\\s+\\d+\\s+R/,\n\t\t\t\t\t`/Resources << ${resourceEntries} >>`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// No resources at all — add them\n\t\t\t\tpageContent += `\\n/Resources << ${resourceEntries} >>`;\n\t\t\t}\n\n\t\t\tobjects.push({\n\t\t\t\tobjNum: page.pageObjNum,\n\t\t\t\tcontent: `<<${pageContent}\\n>>`,\n\t\t\t});\n\t\t}\n\n\t\t// --- 5. Signature placeholder objects (if requested) ---\n\t\tlet sigObjNum = 0;\n\t\tlet widgetObjNum = 0;\n\t\tlet acroFormObjNum = 0;\n\n\t\tif (withSignature && sigOptions) {\n\t\t\tsigObjNum = currentNextObj++;\n\t\t\twidgetObjNum = currentNextObj++;\n\t\t\tacroFormObjNum = currentNextObj++;\n\n\t\t\tconst signatureLength = sigOptions.signatureLength ?? DEFAULT_SIGNATURE_LENGTH;\n\t\t\tconst reason = sigOptions.reason ?? \"Digitally signed\";\n\t\t\tconst name = sigOptions.name ?? \"Digital Signature\";\n\t\t\tconst location = sigOptions.location ?? \"\";\n\t\t\tconst contactInfo = sigOptions.contactInfo ?? \"\";\n\t\t\tconst signingTime = formatPdfDate(new Date());\n\t\t\tconst contentsPlaceholder = \"0\".repeat(signatureLength * 2);\n\n\t\t\tconst sigParts = [\n\t\t\t\t\"<< /Type /Sig\",\n\t\t\t\t\"/Filter /Adobe.PPKLite\",\n\t\t\t\t\"/SubFilter /adbe.pkcs7.detached\",\n\t\t\t\t`/ByteRange [${BYTE_RANGE_PLACEHOLDER}]`,\n\t\t\t\t`/Contents <${contentsPlaceholder}>`,\n\t\t\t\t`/Reason ${pdfString(reason)}`,\n\t\t\t\t`/M ${pdfString(signingTime)}`,\n\t\t\t\t`/Name ${pdfString(name)}`,\n\t\t\t];\n\t\t\tif (location) sigParts.push(`/Location ${pdfString(location)}`);\n\t\t\tif (contactInfo) sigParts.push(`/ContactInfo ${pdfString(contactInfo)}`);\n\t\t\tsigParts.push(\">>\");\n\n\t\t\tobjects.push({ objNum: sigObjNum, content: sigParts.join(\"\\n\") });\n\n\t\t\t// Widget annotation\n\t\t\tconst firstPageNum = this.structure.pageNums[0]!;\n\t\t\tobjects.push({\n\t\t\t\tobjNum: widgetObjNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /Annot\",\n\t\t\t\t\t\"/Subtype /Widget\",\n\t\t\t\t\t\"/FT /Sig\",\n\t\t\t\t\t\"/Rect [0 0 0 0]\",\n\t\t\t\t\t`/V ${sigObjNum} 0 R`,\n\t\t\t\t\t`/T ${pdfString(\"Signature1\")}`,\n\t\t\t\t\t\"/F 4\",\n\t\t\t\t\t`/P ${firstPageNum} 0 R`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t});\n\n\t\t\t// AcroForm\n\t\t\tobjects.push({\n\t\t\t\tobjNum: acroFormObjNum,\n\t\t\t\tcontent: [\n\t\t\t\t\t\"<< /Type /AcroForm\",\n\t\t\t\t\t\"/SigFlags 3\",\n\t\t\t\t\t`/Fields [${widgetObjNum} 0 R]`,\n\t\t\t\t\t\">>\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t});\n\n\t\t\t// Updated Root catalog with AcroForm\n\t\t\tlet rootContent = this.structure.rootDictContent;\n\t\t\trootContent = rootContent.replace(/\\/AcroForm\\s+\\d+\\s+\\d+\\s+R/g, \"\");\n\t\t\trootContent = rootContent.replace(/\\/Perms\\s*<<[^>]*>>/g, \"\");\n\t\t\trootContent = rootContent.replace(/\\/Perms\\s+\\d+\\s+\\d+\\s+R/g, \"\");\n\n\t\t\tobjects.push({\n\t\t\t\tobjNum: this.structure.rootNum,\n\t\t\t\tcontent: `<<${rootContent}\\n/AcroForm ${acroFormObjNum} 0 R\\n>>`,\n\t\t\t});\n\n\t\t\t// Updated first page with Annots\n\t\t\tconst firstPage = this.pages[0]!;\n\t\t\tlet pageContent: string;\n\n\t\t\t// Check if we already have this page in objects (from dirty page update)\n\t\t\tconst existingPageObj = objects.find((o) => o.objNum === firstPage.pageObjNum);\n\t\t\tif (existingPageObj) {\n\t\t\t\t// Extract content from existing updated page (strip outer << >>)\n\t\t\t\tpageContent = existingPageObj.content.slice(2, existingPageObj.content.length - 2);\n\t\t\t} else {\n\t\t\t\tpageContent = firstPage.originalDictContent;\n\t\t\t}\n\n\t\t\tif (pageContent.includes(\"/Annots\")) {\n\t\t\t\tconst bracketEnd = pageContent.indexOf(\"]\", pageContent.indexOf(\"/Annots\"));\n\t\t\t\tpageContent =\n\t\t\t\t\tpageContent.slice(0, bracketEnd) +\n\t\t\t\t\t` ${widgetObjNum} 0 R` +\n\t\t\t\t\tpageContent.slice(bracketEnd);\n\t\t\t} else {\n\t\t\t\tpageContent += `\\n/Annots [${widgetObjNum} 0 R]`;\n\t\t\t}\n\n\t\t\t// Update or add the page object\n\t\t\tif (existingPageObj) {\n\t\t\t\texistingPageObj.content = `<<${pageContent}\\n>>`;\n\t\t\t} else {\n\t\t\t\tobjects.push({\n\t\t\t\t\tobjNum: firstPage.pageObjNum,\n\t\t\t\t\tcontent: `<<${pageContent}\\n>>`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// --- Serialise incremental update ---\n\t\tconst newSize = currentNextObj;\n\t\tconst appendParts: Uint8Array[] = [];\n\t\tconst objectOffsets: Array<{ objNum: number; offset: number }> = [];\n\n\t\t// Compute starting byte offset (after original data)\n\t\tlet currentOffset = this.originalData.length;\n\n\t\tfor (const obj of objects) {\n\t\t\t// Separator newline\n\t\t\tconst sep = latin1Encoder.encode(\"\\n\");\n\t\t\tappendParts.push(sep);\n\t\t\tcurrentOffset += sep.length;\n\n\t\t\tobjectOffsets.push({ objNum: obj.objNum, offset: currentOffset });\n\n\t\t\tif (obj.streamData) {\n\t\t\t\t// Object with stream\n\t\t\t\tconst header = latin1Encoder.encode(`${obj.objNum} 0 obj\\n${obj.content}\\nstream\\n`);\n\t\t\t\tappendParts.push(header);\n\t\t\t\tcurrentOffset += header.length;\n\n\t\t\t\tappendParts.push(obj.streamData);\n\t\t\t\tcurrentOffset += obj.streamData.length;\n\n\t\t\t\tconst footer = latin1Encoder.encode(\"\\nendstream\\nendobj\\n\");\n\t\t\t\tappendParts.push(footer);\n\t\t\t\tcurrentOffset += footer.length;\n\t\t\t} else {\n\t\t\t\tconst objBytes = latin1Encoder.encode(\n\t\t\t\t\t`${obj.objNum} 0 obj\\n${obj.content}\\nendobj\\n`,\n\t\t\t\t);\n\t\t\t\tappendParts.push(objBytes);\n\t\t\t\tcurrentOffset += objBytes.length;\n\t\t\t}\n\t\t}\n\n\t\t// Xref table\n\t\tconst xrefOffset = currentOffset;\n\t\tconst xrefStr = buildXrefTable(objectOffsets);\n\t\tconst xrefBytes = latin1Encoder.encode(xrefStr);\n\t\tappendParts.push(xrefBytes);\n\t\tcurrentOffset += xrefBytes.length;\n\n\t\t// Trailer\n\t\tconst trailerLines = [\"<<\", `/Size ${newSize}`, `/Root ${this.structure.rootNum} 0 R`];\n\t\tif (this.structure.infoNum !== null) {\n\t\t\ttrailerLines.push(`/Info ${this.structure.infoNum} 0 R`);\n\t\t}\n\t\ttrailerLines.push(`/Prev ${this.structure.xrefOffset}`, \">>\");\n\n\t\tconst trailerStr =\n\t\t\t`trailer\\n${trailerLines.join(\"\\n\")}\\nstartxref\\n${xrefOffset}\\n%%EOF`;\n\t\tconst trailerBytes = latin1Encoder.encode(trailerStr);\n\t\tappendParts.push(trailerBytes);\n\n\t\t// Combine original + append parts\n\t\tconst totalAppendLength = appendParts.reduce((s, p) => s + p.length, 0);\n\t\tconst result = new Uint8Array(this.originalData.length + totalAppendLength);\n\t\tresult.set(this.originalData, 0);\n\t\tlet pos = this.originalData.length;\n\t\tfor (const part of appendParts) {\n\t\t\tresult.set(part, pos);\n\t\t\tpos += part.length;\n\t\t}\n\n\t\t// --- Calculate byte range for signature ---\n\t\tlet byteRange: [number, number, number, number] = [0, 0, 0, 0];\n\n\t\tif (withSignature) {\n\t\t\tconst { br, updatedPdf } = updateByteRange(result);\n\t\t\tbyteRange = br;\n\t\t\treturn { pdf: updatedPdf, byteRange };\n\t\t}\n\n\t\treturn { pdf: result, byteRange };\n\t}\n\n\tprivate hasImagesForPage(page: PdfPageImpl): boolean {\n\t\treturn page.dirty && page.getImageRefs().size > 0;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildXrefTable(\n\tentries: Array<{ objNum: number; offset: number }>,\n): string {\n\tconst sorted = [...entries].sort((a, b) => a.objNum - b.objNum);\n\n\tconst subsections: Array<{ start: number; offsets: number[] }> = [];\n\tfor (const entry of sorted) {\n\t\tconst last = subsections[subsections.length - 1];\n\t\tif (last && entry.objNum === last.start + last.offsets.length) {\n\t\t\tlast.offsets.push(entry.offset);\n\t\t} else {\n\t\t\tsubsections.push({ start: entry.objNum, offsets: [entry.offset] });\n\t\t}\n\t}\n\n\tlet result = \"xref\\n\";\n\tfor (const sub of subsections) {\n\t\tresult += `${sub.start} ${sub.offsets.length}\\n`;\n\t\tfor (const offset of sub.offsets) {\n\t\t\tresult += `${String(offset).padStart(10, \"0\")} 00000 n \\n`;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction formatPdfDate(date: Date): string {\n\tconst y = date.getUTCFullYear();\n\tconst m = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst d = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst h = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst min = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst s = String(date.getUTCSeconds()).padStart(2, \"0\");\n\treturn `D:${y}${m}${d}${h}${min}${s}Z`;\n}\n\nfunction pdfString(str: string): string {\n\tconst escaped = str\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\\(/g, \"\\\\(\")\n\t\t.replace(/\\)/g, \"\\\\)\");\n\treturn `(${escaped})`;\n}\n\n/**\n * Find and update the ByteRange placeholder in the PDF, returning the\n * actual byte range values and the updated PDF bytes.\n */\nfunction updateByteRange(pdf: Uint8Array): {\n\tbr: [number, number, number, number];\n\tupdatedPdf: Uint8Array;\n} {\n\tconst pdfStr = new TextDecoder(\"latin1\").decode(pdf);\n\n\t// Find /Contents < ... > in the signature object\n\tconst contentsMarker = \"/Contents <\";\n\tconst contentsIdx = pdfStr.lastIndexOf(contentsMarker);\n\tif (contentsIdx === -1) throw new Error(\"Cannot find Contents in signature\");\n\tconst contentsStart = contentsIdx + contentsMarker.length;\n\tconst contentsEnd = pdfStr.indexOf(\">\", contentsStart);\n\tif (contentsEnd === -1) throw new Error(\"Cannot find end of Contents hex\");\n\n\t// The byte range: [0, before-sig-hex, after-sig-hex, rest]\n\t// contentsStart - 1 is the position of '<'\n\t// contentsEnd + 1 is the position after '>'\n\tconst br: [number, number, number, number] = [\n\t\t0,\n\t\tcontentsStart - 1, // length1: everything before '<'\n\t\tcontentsEnd + 1, // offset2: after '>'\n\t\tpdf.length - (contentsEnd + 1), // length2: rest of PDF\n\t];\n\n\t// Now update the ByteRange placeholder with actual values\n\tconst byteRangeMarker = \"/ByteRange [\";\n\tconst brIdx = pdfStr.lastIndexOf(byteRangeMarker);\n\tif (brIdx === -1) throw new Error(\"Cannot find ByteRange in PDF\");\n\tconst brStart = brIdx + byteRangeMarker.length;\n\tconst brEnd = pdfStr.indexOf(\"]\", brStart);\n\tif (brEnd === -1) throw new Error(\"Cannot find end of ByteRange\");\n\n\tconst placeholderLen = brEnd - brStart;\n\tconst brValueStr = `${br[0]} ${br[1]} ${br[2]} ${br[3]}`;\n\tconst paddedBr = brValueStr.padEnd(placeholderLen, \" \");\n\n\t// Build updated PDF\n\tconst updatedPdf = new Uint8Array(pdf.length);\n\tupdatedPdf.set(pdf);\n\n\t// Write the byte range values\n\tconst brBytes = new TextEncoder().encode(paddedBr);\n\tupdatedPdf.set(brBytes, brStart);\n\n\treturn { br, updatedPdf };\n}\n\n/**\n * Find matching >> for a << in a content string\n */\nfunction findMatchingDictEndInContent(str: string, startPos: number): number {\n\tlet depth = 0;\n\tlet i = startPos;\n\n\twhile (i < str.length - 1) {\n\t\tif (str[i] === \"(\") {\n\t\t\ti++;\n\t\t\twhile (i < str.length && str[i] !== \")\") {\n\t\t\t\tif (str[i] === \"\\\\\") i++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++;\n\t\t} else if (str[i] === \"<\" && str[i + 1] === \"<\") {\n\t\t\tdepth++;\n\t\t\ti += 2;\n\t\t} else if (str[i] === \">\" && str[i + 1] === \">\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t\ti += 2;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n// ---------------------------------------------------------------------------\n// Signature utility exports (for use by the e-signature library)\n// ---------------------------------------------------------------------------\n\n/**\n * Find the ByteRange and Contents placeholder in a signed PDF\n */\nexport function findByteRange(pdfData: Uint8Array): {\n\tbyteRange: [number, number, number, number];\n\tcontentsStart: number;\n\tcontentsEnd: number;\n\tplaceholderLength: number;\n} {\n\tconst pdf = new TextDecoder(\"latin1\").decode(pdfData);\n\n\tconst contentsMarker = \"/Contents <\";\n\tconst contentsIdx = pdf.lastIndexOf(contentsMarker);\n\tif (contentsIdx === -1) throw new Error(\"Could not find Contents in PDF\");\n\n\tconst contentsStart = contentsIdx + contentsMarker.length;\n\tconst contentsEnd = pdf.indexOf(\">\", contentsStart);\n\tif (contentsEnd === -1) throw new Error(\"Could not find end of Contents field\");\n\n\tconst placeholderLength = contentsEnd - contentsStart;\n\n\tconst byteRange: [number, number, number, number] = [\n\t\t0,\n\t\tcontentsStart - 1,\n\t\tcontentsEnd + 1,\n\t\tpdfData.length - (contentsEnd + 1),\n\t];\n\n\treturn { byteRange, contentsStart, contentsEnd, placeholderLength };\n}\n\n/**\n * Extract the bytes that need to be signed according to the ByteRange\n */\nexport function extractBytesToSign(\n\tpdfData: Uint8Array,\n\tbyteRange: [number, number, number, number],\n): Uint8Array {\n\tconst [offset1, length1, offset2, length2] = byteRange;\n\n\tif (offset1 < 0 || length1 <= 0 || offset2 <= 0 || length2 <= 0) {\n\t\tthrow new Error(`Invalid ByteRange values: [${byteRange.join(\", \")}]`);\n\t}\n\n\tif (offset1 + length1 > pdfData.length || offset2 + length2 > pdfData.length) {\n\t\tthrow new Error(\"ByteRange exceeds PDF data size\");\n\t}\n\n\tconst chunk1 = pdfData.slice(offset1, offset1 + length1);\n\tconst chunk2 = pdfData.slice(offset2, offset2 + length2);\n\n\tconst result = new Uint8Array(chunk1.length + chunk2.length);\n\tresult.set(chunk1, 0);\n\tresult.set(chunk2, chunk1.length);\n\treturn result;\n}\n\n/**\n * Embed a signature (as raw bytes) into the Contents placeholder\n */\nexport function embedSignature(\n\tpdfData: Uint8Array,\n\tsignature: Uint8Array,\n): Uint8Array {\n\tconst { contentsStart, placeholderLength } = findByteRange(pdfData);\n\n\t// Convert signature to hex\n\tconst hexChars: string[] = [];\n\tfor (let i = 0; i < signature.length; i++) {\n\t\thexChars.push(signature[i]!.toString(16).padStart(2, \"0\"));\n\t}\n\tconst signatureHex = hexChars.join(\"\");\n\n\tif (signatureHex.length > placeholderLength) {\n\t\tthrow new Error(\n\t\t\t`Signature too large: ${signatureHex.length} hex chars, placeholder is ${placeholderLength}`,\n\t\t);\n\t}\n\n\tconst paddedHex = signatureHex.padEnd(placeholderLength, \"0\");\n\tconst hexBytes = new TextEncoder().encode(paddedHex);\n\n\tconst result = new Uint8Array(pdfData.length);\n\tresult.set(pdfData);\n\tresult.set(hexBytes, contentsStart);\n\treturn result;\n}\n",
|
|
8
8
|
"/**\n * PDF Editing Plugin\n *\n * Load existing PDFs, modify them (draw text, rectangles, images),\n * and save with incremental updates. Also supports creating signature\n * placeholders for digital signing workflows.\n */\n\nexport type {\n\tPdfDocument,\n\tPdfPage,\n\tPdfImage,\n\tTextOptions,\n\tRectOptions,\n\tImageOptions,\n\tSignaturePlaceholderOptions,\n} from \"./types.ts\";\n\nexport { PdfDocumentImpl } from \"./document.ts\";\n\nexport {\n\tfindByteRange,\n\textractBytesToSign,\n\tembedSignature,\n} from \"./document.ts\";\n\nimport { PdfDocumentImpl } from \"./document.ts\";\nimport type { PdfDocument } from \"./types.ts\";\n\n/**\n * Load an existing PDF for editing\n *\n * @param data - The PDF file contents as a Uint8Array\n * @returns A PdfDocument that can be modified and saved\n */\nexport function loadPdf(data: Uint8Array): PdfDocument {\n\treturn new PdfDocumentImpl(data);\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "E43C2313EE40EEDA64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|