@f-o-t/pdf 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-3qa5wvjk.js → index-eedrjd25.js} +181 -106
- package/dist/index-eedrjd25.js.map +13 -0
- package/dist/index-ty7xfwkn.js +307 -0
- package/dist/index-ty7xfwkn.js.map +10 -0
- package/dist/{index-w5nfn63z.js → index-xbm3820d.js} +67 -304
- package/dist/index-xbm3820d.js.map +12 -0
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/plugins/editing/document.d.ts.map +1 -1
- package/dist/plugins/editing/index.js +3 -2
- package/dist/plugins/editing/index.js.map +1 -1
- package/dist/plugins/editing/page.d.ts +17 -0
- package/dist/plugins/editing/page.d.ts.map +1 -1
- package/dist/plugins/editing/types.d.ts +2 -0
- package/dist/plugins/editing/types.d.ts.map +1 -1
- package/dist/plugins/parsing/index.js +3 -2
- package/dist/plugins/parsing/index.js.map +1 -1
- package/dist/plugins/parsing/parser.d.ts.map +1 -1
- package/dist/plugins/parsing/reader.d.ts +22 -20
- package/dist/plugins/parsing/reader.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/index-3qa5wvjk.js.map +0 -13
- package/dist/index-w5nfn63z.js.map +0 -13
|
@@ -6,6 +6,12 @@ import {
|
|
|
6
6
|
createRef,
|
|
7
7
|
createStream
|
|
8
8
|
} from "./index-4jtcmpfh.js";
|
|
9
|
+
import {
|
|
10
|
+
buildObjectIndex,
|
|
11
|
+
extractObjectDictContent,
|
|
12
|
+
getMediaBox,
|
|
13
|
+
parseTrailer
|
|
14
|
+
} from "./index-ty7xfwkn.js";
|
|
9
15
|
|
|
10
16
|
// src/plugins/parsing/lexer.ts
|
|
11
17
|
var TokenType;
|
|
@@ -329,11 +335,37 @@ class PDFParser {
|
|
|
329
335
|
}
|
|
330
336
|
streamDataStart++;
|
|
331
337
|
}
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
338
|
+
const lengthVal = dictionary.Length;
|
|
339
|
+
let data;
|
|
340
|
+
if (typeof lengthVal === "number") {
|
|
341
|
+
data = this.data.slice(streamDataStart, streamDataStart + lengthVal);
|
|
342
|
+
} else {
|
|
343
|
+
const marker = new TextEncoder().encode("endstream");
|
|
344
|
+
let endPos = streamDataStart;
|
|
345
|
+
while (endPos < this.data.length - marker.length) {
|
|
346
|
+
if (this.data[endPos] === marker[0]) {
|
|
347
|
+
let match = true;
|
|
348
|
+
for (let j = 1;j < marker.length; j++) {
|
|
349
|
+
if (this.data[endPos + j] !== marker[j]) {
|
|
350
|
+
match = false;
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (match)
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
endPos++;
|
|
358
|
+
}
|
|
359
|
+
let dataEnd = endPos;
|
|
360
|
+
if (dataEnd > streamDataStart && this.data[dataEnd - 1] === 10)
|
|
361
|
+
dataEnd--;
|
|
362
|
+
if (dataEnd > streamDataStart && this.data[dataEnd - 1] === 13)
|
|
363
|
+
dataEnd--;
|
|
364
|
+
data = this.data.slice(streamDataStart, dataEnd);
|
|
365
|
+
}
|
|
366
|
+
const afterStream = streamDataStart + data.length;
|
|
367
|
+
this.lexer = new PDFLexer(this.data.subarray(afterStream));
|
|
368
|
+
this.currentToken = this.lexer.nextToken();
|
|
337
369
|
while (this.currentToken.type !== "ENDSTREAM" /* ENDSTREAM */ && this.currentToken.type !== "EOF" /* EOF */) {
|
|
338
370
|
this.advance();
|
|
339
371
|
}
|
|
@@ -355,6 +387,9 @@ class PDFParser {
|
|
|
355
387
|
return this.currentToken.type !== "EOF" /* EOF */;
|
|
356
388
|
}
|
|
357
389
|
}
|
|
390
|
+
// src/plugins/parsing/reader.ts
|
|
391
|
+
import { inflateSync } from "zlib";
|
|
392
|
+
|
|
358
393
|
// src/errors.ts
|
|
359
394
|
class PDFError extends Error {
|
|
360
395
|
constructor(message) {
|
|
@@ -431,129 +466,169 @@ class NotImplementedError extends PDFError {
|
|
|
431
466
|
// src/plugins/parsing/reader.ts
|
|
432
467
|
class PDFReader {
|
|
433
468
|
data;
|
|
434
|
-
|
|
469
|
+
pdfStr;
|
|
470
|
+
objIndex;
|
|
435
471
|
constructor(data) {
|
|
436
472
|
this.data = data;
|
|
473
|
+
this.pdfStr = new TextDecoder("latin1").decode(data);
|
|
474
|
+
this.objIndex = buildObjectIndex(this.pdfStr);
|
|
437
475
|
}
|
|
438
476
|
parse() {
|
|
439
|
-
const
|
|
440
|
-
const xrefTable = this.parseXRefTable(xrefOffset);
|
|
441
|
-
const trailer = this.parseTrailer(xrefOffset);
|
|
442
|
-
const catalogRef = trailer.Root;
|
|
443
|
-
this.readObjects(xrefTable);
|
|
477
|
+
const trailer = parseTrailer(this.pdfStr);
|
|
444
478
|
const version = this.parseVersion();
|
|
445
|
-
const
|
|
479
|
+
const pageNums = this.findPageObjects(trailer.root);
|
|
480
|
+
const catalogRef = {
|
|
481
|
+
objectNumber: trailer.root,
|
|
482
|
+
generation: 0
|
|
483
|
+
};
|
|
484
|
+
const pages = [];
|
|
485
|
+
for (const pageNum of pageNums) {
|
|
486
|
+
const page = this.parsePage(pageNum);
|
|
487
|
+
if (page)
|
|
488
|
+
pages.push(page);
|
|
489
|
+
}
|
|
446
490
|
return {
|
|
447
491
|
version,
|
|
448
492
|
catalog: catalogRef,
|
|
449
493
|
pages,
|
|
450
|
-
objects:
|
|
494
|
+
objects: new Map
|
|
451
495
|
};
|
|
452
496
|
}
|
|
453
|
-
findStartXRef() {
|
|
454
|
-
const tailSize = Math.min(256, this.data.length);
|
|
455
|
-
const tail = new TextDecoder().decode(this.data.subarray(this.data.length - tailSize));
|
|
456
|
-
const match = tail.match(/startxref\s+(\d+)/);
|
|
457
|
-
if (!match) {
|
|
458
|
-
throw new PDFParseError("Could not find startxref");
|
|
459
|
-
}
|
|
460
|
-
return parseInt(match[1], 10);
|
|
461
|
-
}
|
|
462
|
-
parseXRefTable(offset) {
|
|
463
|
-
const content = new TextDecoder().decode(this.data.subarray(offset));
|
|
464
|
-
const lines = content.split(`
|
|
465
|
-
`);
|
|
466
|
-
const xref = new Map;
|
|
467
|
-
let i = 0;
|
|
468
|
-
while (i < lines.length && !lines[i].trim().startsWith("xref"))
|
|
469
|
-
i++;
|
|
470
|
-
i++;
|
|
471
|
-
while (i < lines.length && !lines[i].trim().startsWith("trailer")) {
|
|
472
|
-
const subsection = lines[i].trim().split(/\s+/);
|
|
473
|
-
if (subsection.length === 2) {
|
|
474
|
-
const start = parseInt(subsection[0], 10);
|
|
475
|
-
const count = parseInt(subsection[1], 10);
|
|
476
|
-
i++;
|
|
477
|
-
for (let j = 0;j < count; j++) {
|
|
478
|
-
const entry = lines[i].trim().split(/\s+/);
|
|
479
|
-
if (entry.length >= 3 && entry[2] === "n") {
|
|
480
|
-
const offset2 = parseInt(entry[0], 10);
|
|
481
|
-
xref.set(start + j, offset2);
|
|
482
|
-
}
|
|
483
|
-
i++;
|
|
484
|
-
}
|
|
485
|
-
} else {
|
|
486
|
-
i++;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
return xref;
|
|
490
|
-
}
|
|
491
|
-
parseTrailer(xrefOffset) {
|
|
492
|
-
const content = new TextDecoder().decode(this.data.subarray(xrefOffset));
|
|
493
|
-
const trailerMatch = content.match(/trailer\s*<<[\s\S]*?>>/);
|
|
494
|
-
if (!trailerMatch) {
|
|
495
|
-
throw new PDFParseError("Could not find trailer");
|
|
496
|
-
}
|
|
497
|
-
const parser = new PDFParser(new TextEncoder().encode(trailerMatch[0].replace("trailer", "")));
|
|
498
|
-
return parser.parseValue();
|
|
499
|
-
}
|
|
500
|
-
readObjects(xrefTable) {
|
|
501
|
-
for (const [objectNum, offset] of xrefTable) {
|
|
502
|
-
try {
|
|
503
|
-
const objData = this.data.subarray(offset);
|
|
504
|
-
const parser = new PDFParser(objData);
|
|
505
|
-
const obj = parser.parseIndirectObject();
|
|
506
|
-
this.objects.set(objectNum, obj.value);
|
|
507
|
-
} catch (error) {}
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
497
|
parseVersion() {
|
|
511
|
-
const
|
|
512
|
-
const match = header.match(/%PDF-(\d+\.\d+)/);
|
|
498
|
+
const match = this.pdfStr.slice(0, 20).match(/%PDF-(\d+\.\d+)/);
|
|
513
499
|
return match ? match[1] : "1.7";
|
|
514
500
|
}
|
|
515
|
-
|
|
516
|
-
const
|
|
517
|
-
|
|
518
|
-
|
|
501
|
+
findPageObjects(rootNum) {
|
|
502
|
+
const rootContent = extractObjectDictContent(this.pdfStr, rootNum, this.objIndex);
|
|
503
|
+
const pagesMatch = rootContent.match(/\/Pages\s+(\d+)\s+\d+\s+R/);
|
|
504
|
+
if (!pagesMatch)
|
|
505
|
+
throw new PDFParseError("Cannot find Pages ref in Root catalog");
|
|
506
|
+
const pagesNum = parseInt(pagesMatch[1], 10);
|
|
507
|
+
return this.collectPageLeafs(pagesNum, new Set);
|
|
508
|
+
}
|
|
509
|
+
collectPageLeafs(objNum, visited) {
|
|
510
|
+
if (visited.has(objNum))
|
|
511
|
+
return [];
|
|
512
|
+
visited.add(objNum);
|
|
513
|
+
const content = extractObjectDictContent(this.pdfStr, objNum, this.objIndex);
|
|
514
|
+
const typeMatch = content.match(/\/Type\s+\/(\w+)/);
|
|
515
|
+
if (typeMatch?.[1] === "Page") {
|
|
516
|
+
return [objNum];
|
|
517
|
+
}
|
|
518
|
+
const kidsMatch = content.match(/\/Kids\s*\[([^\]]+)\]/);
|
|
519
|
+
if (!kidsMatch)
|
|
520
|
+
return [objNum];
|
|
521
|
+
const refs = [];
|
|
522
|
+
const refRegex = /(\d+)\s+\d+\s+R/g;
|
|
523
|
+
let m;
|
|
524
|
+
while ((m = refRegex.exec(kidsMatch[1])) !== null) {
|
|
525
|
+
refs.push(parseInt(m[1], 10));
|
|
519
526
|
}
|
|
520
|
-
const pagesRef = catalog.Pages;
|
|
521
|
-
const pagesTree = this.objects.get(pagesRef.objectNumber);
|
|
522
|
-
if (!pagesTree) {
|
|
523
|
-
throw new PDFParseError("Pages tree not found");
|
|
524
|
-
}
|
|
525
|
-
const kids = pagesTree.Kids;
|
|
526
527
|
const pages = [];
|
|
527
|
-
for (const
|
|
528
|
-
|
|
529
|
-
const page = this.parsePage(kidRef);
|
|
530
|
-
if (page)
|
|
531
|
-
pages.push(page);
|
|
532
|
-
}
|
|
528
|
+
for (const ref of refs) {
|
|
529
|
+
pages.push(...this.collectPageLeafs(ref, visited));
|
|
533
530
|
}
|
|
534
531
|
return pages;
|
|
535
532
|
}
|
|
536
|
-
parsePage(
|
|
537
|
-
|
|
538
|
-
|
|
533
|
+
parsePage(pageObjNum) {
|
|
534
|
+
try {
|
|
535
|
+
const mediaBox = getMediaBox(this.pdfStr, pageObjNum, this.objIndex);
|
|
536
|
+
const size = {
|
|
537
|
+
width: mediaBox[2] - mediaBox[0],
|
|
538
|
+
height: mediaBox[3] - mediaBox[1]
|
|
539
|
+
};
|
|
540
|
+
const pageContent = extractObjectDictContent(this.pdfStr, pageObjNum, this.objIndex);
|
|
541
|
+
let content = "";
|
|
542
|
+
const contentsMatch = pageContent.match(/\/Contents\s+(\d+)\s+\d+\s+R/);
|
|
543
|
+
if (contentsMatch) {
|
|
544
|
+
const contentsNum = parseInt(contentsMatch[1], 10);
|
|
545
|
+
content = this.extractText(contentsNum);
|
|
546
|
+
}
|
|
547
|
+
return {
|
|
548
|
+
ref: { objectNumber: pageObjNum, generation: 0 },
|
|
549
|
+
size,
|
|
550
|
+
content
|
|
551
|
+
};
|
|
552
|
+
} catch {
|
|
539
553
|
return null;
|
|
540
|
-
const mediaBox = pageDict.MediaBox;
|
|
541
|
-
const size = {
|
|
542
|
-
width: mediaBox[2],
|
|
543
|
-
height: mediaBox[3]
|
|
544
|
-
};
|
|
545
|
-
let content = "";
|
|
546
|
-
const contentsRef = pageDict.Contents;
|
|
547
|
-
if (contentsRef && typeof contentsRef === "object" && "objectNumber" in contentsRef) {
|
|
548
|
-
content = this.extractText(contentsRef);
|
|
549
554
|
}
|
|
550
|
-
return { ref, size, content };
|
|
551
555
|
}
|
|
552
|
-
extractText(
|
|
553
|
-
const
|
|
554
|
-
if (!
|
|
556
|
+
extractText(objNum) {
|
|
557
|
+
const streamData = this.extractStreamData(objNum);
|
|
558
|
+
if (!streamData)
|
|
555
559
|
return "";
|
|
556
|
-
|
|
560
|
+
return this.parseTextOperators(streamData);
|
|
561
|
+
}
|
|
562
|
+
extractStreamData(objNum) {
|
|
563
|
+
const pos = this.objIndex.get(objNum);
|
|
564
|
+
if (pos === undefined)
|
|
565
|
+
return null;
|
|
566
|
+
const dictStart = this.pdfStr.indexOf("<<", pos);
|
|
567
|
+
if (dictStart === -1)
|
|
568
|
+
return null;
|
|
569
|
+
const dictEnd = this.findMatchingDictEnd(dictStart);
|
|
570
|
+
if (dictEnd === -1)
|
|
571
|
+
return null;
|
|
572
|
+
const dictContent = this.pdfStr.slice(dictStart + 2, dictEnd);
|
|
573
|
+
const afterDict = this.pdfStr.indexOf("stream", dictEnd);
|
|
574
|
+
if (afterDict === -1)
|
|
575
|
+
return null;
|
|
576
|
+
let streamStart = afterDict + 6;
|
|
577
|
+
if (this.pdfStr[streamStart] === "\r")
|
|
578
|
+
streamStart++;
|
|
579
|
+
if (this.pdfStr[streamStart] === `
|
|
580
|
+
`)
|
|
581
|
+
streamStart++;
|
|
582
|
+
const endstream = this.pdfStr.indexOf("endstream", streamStart);
|
|
583
|
+
if (endstream === -1)
|
|
584
|
+
return null;
|
|
585
|
+
let streamEnd = endstream;
|
|
586
|
+
while (streamEnd > streamStart && (this.pdfStr[streamEnd - 1] === `
|
|
587
|
+
` || this.pdfStr[streamEnd - 1] === "\r")) {
|
|
588
|
+
streamEnd--;
|
|
589
|
+
}
|
|
590
|
+
const isCompressed = /\/Filter\s*\/FlateDecode/.test(dictContent);
|
|
591
|
+
if (isCompressed) {
|
|
592
|
+
const rawBytes = new Uint8Array(streamEnd - streamStart);
|
|
593
|
+
for (let i = 0;i < rawBytes.length; i++) {
|
|
594
|
+
rawBytes[i] = this.pdfStr.charCodeAt(streamStart + i);
|
|
595
|
+
}
|
|
596
|
+
try {
|
|
597
|
+
const decompressed = inflateSync(rawBytes);
|
|
598
|
+
return new TextDecoder("latin1").decode(decompressed);
|
|
599
|
+
} catch {
|
|
600
|
+
return null;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
return this.pdfStr.slice(streamStart, streamEnd);
|
|
604
|
+
}
|
|
605
|
+
findMatchingDictEnd(startPos) {
|
|
606
|
+
let depth = 0;
|
|
607
|
+
let i = startPos;
|
|
608
|
+
while (i < this.pdfStr.length - 1) {
|
|
609
|
+
if (this.pdfStr[i] === "(") {
|
|
610
|
+
i++;
|
|
611
|
+
while (i < this.pdfStr.length && this.pdfStr[i] !== ")") {
|
|
612
|
+
if (this.pdfStr[i] === "\\")
|
|
613
|
+
i++;
|
|
614
|
+
i++;
|
|
615
|
+
}
|
|
616
|
+
i++;
|
|
617
|
+
} else if (this.pdfStr[i] === "<" && this.pdfStr[i + 1] === "<") {
|
|
618
|
+
depth++;
|
|
619
|
+
i += 2;
|
|
620
|
+
} else if (this.pdfStr[i] === ">" && this.pdfStr[i + 1] === ">") {
|
|
621
|
+
depth--;
|
|
622
|
+
if (depth === 0)
|
|
623
|
+
return i;
|
|
624
|
+
i += 2;
|
|
625
|
+
} else {
|
|
626
|
+
i++;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return -1;
|
|
630
|
+
}
|
|
631
|
+
parseTextOperators(content) {
|
|
557
632
|
const texts = [];
|
|
558
633
|
const tjRegex = /\(([^)]*)\)\s*Tj/g;
|
|
559
634
|
let match;
|
|
@@ -582,4 +657,4 @@ class PDFReader {
|
|
|
582
657
|
}
|
|
583
658
|
export { PDFError, PDFParseError, PDFGenerationError, InvalidPDFObjectError, FontNotFoundError, InvalidImageError, PDFSignatureError, PDFEncryptionError, NotImplementedError, TokenType, PDFLexer, PDFParser, PDFReader };
|
|
584
659
|
|
|
585
|
-
//# debugId=
|
|
660
|
+
//# debugId=6B537936CE65CAFF64756E2164756E21
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/plugins/parsing/lexer.ts", "../src/plugins/parsing/parser.ts", "../src/plugins/parsing/reader.ts", "../src/errors.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * PDF token types\n */\nexport enum TokenType {\n // Primitives\n NUMBER = \"NUMBER\",\n STRING = \"STRING\",\n NAME = \"NAME\",\n BOOLEAN = \"BOOLEAN\",\n NULL = \"NULL\",\n\n // Delimiters\n ARRAY_START = \"ARRAY_START\", // [\n ARRAY_END = \"ARRAY_END\", // ]\n DICT_START = \"DICT_START\", // <<\n DICT_END = \"DICT_END\", // >>\n\n // Keywords\n OBJ = \"OBJ\", // obj\n ENDOBJ = \"ENDOBJ\", // endobj\n STREAM = \"STREAM\", // stream\n ENDSTREAM = \"ENDSTREAM\", // endstream\n XREF = \"XREF\", // xref\n TRAILER = \"TRAILER\", // trailer\n STARTXREF = \"STARTXREF\", // startxref\n R = \"R\", // R (reference)\n\n // Special\n EOF = \"EOF\",\n}\n\n/**\n * PDF token\n */\nexport interface Token {\n type: TokenType;\n value: any;\n position: number;\n}\n\n/**\n * PDF Lexer\n */\nexport class PDFLexer {\n private data: Uint8Array;\n private position: number = 0;\n\n constructor(data: Uint8Array) {\n this.data = data;\n }\n\n /**\n * Get next token\n */\n nextToken(): Token {\n this.skipWhitespace();\n\n if (this.position >= this.data.length) {\n return { type: TokenType.EOF, value: null, position: this.position };\n }\n\n const char = String.fromCharCode(this.data[this.position]!);\n\n // Delimiters\n if (char === \"[\") {\n this.position++;\n return { type: TokenType.ARRAY_START, value: \"[\", position: this.position - 1 };\n }\n if (char === \"]\") {\n this.position++;\n return { type: TokenType.ARRAY_END, value: \"]\", position: this.position - 1 };\n }\n if (char === \"<\" && this.peek() === \"<\") {\n this.position += 2;\n return { type: TokenType.DICT_START, value: \"<<\", position: this.position - 2 };\n }\n if (char === \">\" && this.peek() === \">\") {\n this.position += 2;\n return { type: TokenType.DICT_END, value: \">>\", position: this.position - 2 };\n }\n\n // Name (starts with /)\n if (char === \"/\") {\n return this.readName();\n }\n\n // String (starts with ()\n if (char === \"(\") {\n return this.readString();\n }\n\n // Number or keyword\n if (char === \"-\" || char === \"+\" || char === \".\" || (char >= \"0\" && char <= \"9\")) {\n return this.readNumber();\n }\n\n // Keyword or boolean\n return this.readKeyword();\n }\n\n /**\n * Peek at next character without consuming\n */\n private peek(): string {\n if (this.position + 1 >= this.data.length) return \"\";\n return String.fromCharCode(this.data[this.position + 1]!);\n }\n\n /**\n * Skip whitespace and comments\n */\n private skipWhitespace(): void {\n while (this.position < this.data.length) {\n const char = this.data[this.position]!;\n\n // Whitespace\n if (char === 0x20 || char === 0x09 || char === 0x0A || char === 0x0D || char === 0x00) {\n this.position++;\n continue;\n }\n\n // Comment (starts with %)\n if (char === 0x25) {\n while (this.position < this.data.length && this.data[this.position]! !== 0x0A && this.data[this.position]! !== 0x0D) {\n this.position++;\n }\n continue;\n }\n\n break;\n }\n }\n\n /**\n * Read a name token\n */\n private readName(): Token {\n const start = this.position;\n this.position++; // Skip /\n\n let value = \"\";\n while (this.position < this.data.length) {\n const char = String.fromCharCode(this.data[this.position]!);\n if (this.isDelimiter(char) || this.isWhitespace(this.data[this.position]!)) {\n break;\n }\n value += char;\n this.position++;\n }\n\n return { type: TokenType.NAME, value, position: start };\n }\n\n /**\n * Read a string token\n */\n private readString(): Token {\n const start = this.position;\n this.position++; // Skip (\n\n let value = \"\";\n let depth = 1;\n\n while (this.position < this.data.length && depth > 0) {\n const char = String.fromCharCode(this.data[this.position]!);\n\n if (char === \"\\\\\") {\n // Escape sequence\n this.position++;\n if (this.position < this.data.length) {\n const escaped = String.fromCharCode(this.data[this.position]!);\n value += escaped === \"n\" ? \"\\n\" : escaped === \"r\" ? \"\\r\" : escaped === \"t\" ? \"\\t\" : escaped;\n }\n } else if (char === \"(\") {\n depth++;\n value += char;\n } else if (char === \")\") {\n depth--;\n if (depth > 0) value += char;\n } else {\n value += char;\n }\n\n this.position++;\n }\n\n return { type: TokenType.STRING, value, position: start };\n }\n\n /**\n * Read a number token\n */\n private readNumber(): Token {\n const start = this.position;\n let value = \"\";\n\n while (this.position < this.data.length) {\n const char = String.fromCharCode(this.data[this.position]!);\n if (char === \"-\" || char === \"+\" || char === \".\" || (char >= \"0\" && char <= \"9\")) {\n value += char;\n this.position++;\n } else {\n break;\n }\n }\n\n return { type: TokenType.NUMBER, value: value.includes(\".\") ? parseFloat(value) : parseInt(value, 10), position: start };\n }\n\n /**\n * Read a keyword token\n */\n private readKeyword(): Token {\n const start = this.position;\n let value = \"\";\n\n while (this.position < this.data.length) {\n const char = String.fromCharCode(this.data[this.position]!);\n if (this.isDelimiter(char) || this.isWhitespace(this.data[this.position]!)) {\n break;\n }\n value += char;\n this.position++;\n }\n\n // Check for keywords\n const upper = value.toUpperCase();\n if (upper === \"OBJ\") return { type: TokenType.OBJ, value, position: start };\n if (upper === \"ENDOBJ\") return { type: TokenType.ENDOBJ, value, position: start };\n if (upper === \"STREAM\") return { type: TokenType.STREAM, value, position: start };\n if (upper === \"ENDSTREAM\") return { type: TokenType.ENDSTREAM, value, position: start };\n if (upper === \"XREF\") return { type: TokenType.XREF, value, position: start };\n if (upper === \"TRAILER\") return { type: TokenType.TRAILER, value, position: start };\n if (upper === \"STARTXREF\") return { type: TokenType.STARTXREF, value, position: start };\n if (upper === \"R\") return { type: TokenType.R, value, position: start };\n if (upper === \"TRUE\") return { type: TokenType.BOOLEAN, value: true, position: start };\n if (upper === \"FALSE\") return { type: TokenType.BOOLEAN, value: false, position: start };\n if (upper === \"NULL\") return { type: TokenType.NULL, value: null, position: start };\n\n // Unknown keyword - treat as name without /\n return { type: TokenType.NAME, value, position: start };\n }\n\n /**\n * Check if character is delimiter\n */\n private isDelimiter(char: string): boolean {\n return [\"(\", \")\", \"<\", \">\", \"[\", \"]\", \"{\", \"}\", \"/\", \"%\"].includes(char);\n }\n\n /**\n * Check if byte is whitespace\n */\n private isWhitespace(byte: number): boolean {\n return byte === 0x20 || byte === 0x09 || byte === 0x0A || byte === 0x0D || byte === 0x00;\n }\n}\n",
|
|
6
|
+
"// @ts-nocheck\nimport { PDFLexer, TokenType, type Token } from \"./lexer.ts\";\nimport type { PDFValue, PDFDictionary, PDFArray, PDFRef, PDFStream } from \"../../types.ts\";\nimport { createDictionary, createArray, createRef, createName, createStream } from \"../../core/objects.ts\";\n\n/**\n * PDF Parser\n */\nexport class PDFParser {\n private lexer: PDFLexer;\n private currentToken: Token;\n private nextToken: Token | null = null;\n private data: Uint8Array;\n\n constructor(data: Uint8Array) {\n this.data = data;\n this.lexer = new PDFLexer(data);\n this.currentToken = this.lexer.nextToken();\n }\n\n /**\n * Parse a PDF value\n */\n parseValue(): PDFValue {\n switch (this.currentToken.type) {\n case TokenType.NUMBER:\n return this.parseNumberOrRef();\n case TokenType.STRING:\n return this.parseString();\n case TokenType.NAME:\n return this.parseName();\n case TokenType.BOOLEAN:\n return this.parseBoolean();\n case TokenType.NULL:\n return this.parseNull();\n case TokenType.ARRAY_START:\n return this.parseArray();\n case TokenType.DICT_START:\n return this.parseDictionary();\n default:\n throw new Error(`Unexpected token: ${this.currentToken.type}`);\n }\n }\n\n /**\n * Parse number or reference (number number R)\n */\n private parseNumberOrRef(): number | PDFRef {\n const first = this.currentToken.value as number;\n this.advance();\n\n // Check if this is a reference (two numbers followed by R)\n if (this.currentToken.type === TokenType.NUMBER) {\n const second = this.currentToken.value as number;\n this.advance();\n\n if ((this.currentToken.type as any) === TokenType.R) {\n this.advance();\n return createRef(first, second);\n }\n\n // Not a reference - we consumed the second number, need to put it back\n // Put the current token (third token) into nextToken buffer\n // Then restore second number as current token\n const thirdToken = this.currentToken;\n this.currentToken = { type: TokenType.NUMBER, value: second, position: 0 };\n this.nextToken = thirdToken;\n return first;\n }\n\n return first;\n }\n\n /**\n * Parse string\n */\n private parseString(): string {\n const value = this.currentToken.value as string;\n this.advance();\n return value;\n }\n\n /**\n * Parse name\n */\n private parseName(): PDFValue {\n const value = this.currentToken.value as string;\n this.advance();\n return createName(value);\n }\n\n /**\n * Parse boolean\n */\n private parseBoolean(): boolean {\n const value = this.currentToken.value as boolean;\n this.advance();\n return value;\n }\n\n /**\n * Parse null\n */\n private parseNull(): null {\n this.advance();\n return null;\n }\n\n /**\n * Parse array\n */\n private parseArray(): PDFArray {\n this.advance(); // Skip [\n const values: PDFValue[] = [];\n\n while (this.currentToken.type !== TokenType.ARRAY_END) {\n if (this.currentToken.type === TokenType.EOF) {\n throw new Error(\"Unexpected EOF in array\");\n }\n values.push(this.parseValue());\n }\n\n this.advance(); // Skip ]\n return createArray(values);\n }\n\n /**\n * Parse dictionary\n */\n private parseDictionary(): PDFDictionary {\n this.advance(); // Skip <<\n const entries: Record<string, PDFValue> = {};\n\n while (this.currentToken.type !== TokenType.DICT_END) {\n if (this.currentToken.type === TokenType.EOF) {\n throw new Error(\"Unexpected EOF in dictionary\");\n }\n\n // Key must be a name\n if (this.currentToken.type !== TokenType.NAME) {\n throw new Error(`Expected name in dictionary, got ${this.currentToken.type}`);\n }\n const key = this.currentToken.value as string;\n this.advance();\n\n // Value\n const value = this.parseValue();\n entries[key] = value;\n }\n\n this.advance(); // Skip >>\n return createDictionary(entries);\n }\n\n /**\n * Parse indirect object\n */\n parseIndirectObject(): { ref: PDFRef; value: PDFValue } {\n // Parse: objectNumber generation obj\n if (this.currentToken.type !== TokenType.NUMBER) {\n throw new Error(\"Expected object number\");\n }\n const objectNumber = this.currentToken.value as number;\n this.advance();\n\n if (this.currentToken.type !== TokenType.NUMBER) {\n throw new Error(\"Expected generation number\");\n }\n const generation = this.currentToken.value as number;\n this.advance();\n\n if ((this.currentToken.type as any) !== TokenType.OBJ) {\n throw new Error(\"Expected 'obj' keyword\");\n }\n this.advance();\n\n // Parse object value\n let value: PDFValue = this.parseValue();\n\n // Check for stream\n if (this.currentToken.type === TokenType.STREAM) {\n value = this.parseStream(value as PDFDictionary);\n }\n\n // Expect endobj\n if (this.currentToken.type !== TokenType.ENDOBJ) {\n throw new Error(\"Expected 'endobj' keyword\");\n }\n this.advance();\n\n return {\n ref: createRef(objectNumber, generation),\n value,\n };\n }\n\n /**\n * Parse stream (dictionary already parsed)\n */\n private parseStream(dictionary: PDFDictionary): PDFStream {\n // Get current position where 'stream' keyword is\n const streamKeywordPos = this.currentToken.position;\n this.advance(); // Skip 'stream'\n\n // Find the actual start of stream data (after 'stream' keyword and newline)\n // The stream keyword is followed by either \\n or \\r\\n\n let streamDataStart = streamKeywordPos + 6; // 'stream' is 6 characters\n \n // Skip the newline after 'stream'\n while (streamDataStart < this.data.length) {\n const byte = this.data[streamDataStart];\n if (byte === 0x0D || byte === 0x0A) { // \\r or \\n\n streamDataStart++;\n // Handle \\r\\n\n if (byte === 0x0D && this.data[streamDataStart] === 0x0A) {\n streamDataStart++;\n }\n break;\n }\n streamDataStart++;\n }\n\n // Get stream length — may be a direct number or an indirect reference\n const lengthVal = dictionary.Length;\n let data: Uint8Array;\n\n if (typeof lengthVal === \"number\") {\n // Direct length: slice exactly\n data = this.data.slice(streamDataStart, streamDataStart + lengthVal);\n } else {\n // Indirect reference or missing — scan raw bytes for 'endstream' marker\n // instead of tokenizing binary data (which freezes the lexer)\n const marker = new TextEncoder().encode(\"endstream\");\n let endPos = streamDataStart;\n while (endPos < this.data.length - marker.length) {\n if (this.data[endPos] === marker[0]) {\n let match = true;\n for (let j = 1; j < marker.length; j++) {\n if (this.data[endPos + j] !== marker[j]) { match = false; break; }\n }\n if (match) break;\n }\n endPos++;\n }\n // Trim trailing whitespace (\\r\\n or \\n before endstream)\n let dataEnd = endPos;\n if (dataEnd > streamDataStart && this.data[dataEnd - 1] === 0x0A) dataEnd--;\n if (dataEnd > streamDataStart && this.data[dataEnd - 1] === 0x0D) dataEnd--;\n data = this.data.slice(streamDataStart, dataEnd);\n }\n\n // Skip past stream data — create a new lexer starting after the stream\n // to avoid tokenizing binary content byte-by-byte\n const afterStream = streamDataStart + data.length;\n this.lexer = new PDFLexer(this.data.subarray(afterStream));\n this.currentToken = this.lexer.nextToken();\n\n // Skip any whitespace tokens until we hit endstream\n while (this.currentToken.type !== TokenType.ENDSTREAM && this.currentToken.type !== TokenType.EOF) {\n this.advance();\n }\n\n if (this.currentToken.type !== TokenType.ENDSTREAM) {\n throw new Error(\"Expected 'endstream' keyword\");\n }\n this.advance();\n\n return createStream(data, dictionary);\n }\n\n /**\n * Advance to next token\n */\n private advance(): void {\n if (this.nextToken !== null) {\n this.currentToken = this.nextToken;\n this.nextToken = null;\n } else {\n this.currentToken = this.lexer.nextToken();\n }\n }\n\n /**\n * Check if more tokens available\n */\n hasMore(): boolean {\n return this.currentToken.type !== TokenType.EOF;\n }\n}\n",
|
|
7
|
+
"import { inflateSync } from \"node:zlib\";\nimport {\n\tparseTrailer,\n\tbuildObjectIndex,\n\textractObjectDictContent,\n\tgetMediaBox,\n} from \"../editing/parser.ts\";\nimport type { PDFRef } from \"../../types.ts\";\nimport { PDFParseError } from \"../../errors.ts\";\n\n/**\n * Parsed PDF Document\n */\nexport interface ParsedPDF {\n\tversion: string;\n\tcatalog: PDFRef;\n\tpages: ParsedPDFPage[];\n\tobjects: Map<number, any>;\n}\n\n/**\n * Parsed PDF Page\n */\nexport interface ParsedPDFPage {\n\tref: PDFRef;\n\tsize: { width: number; height: number };\n\tcontent: string;\n}\n\n/**\n * PDF Reader - reads and parses existing PDFs using string-based parsing.\n *\n * Supports both traditional xref tables and cross-reference streams (PDF 1.5+),\n * object streams, indirect Length references, and FlateDecode-compressed content streams.\n */\nexport class PDFReader {\n\tprivate data: Uint8Array;\n\tprivate pdfStr: string;\n\tprivate objIndex: Map<number, number>;\n\n\tconstructor(data: Uint8Array) {\n\t\tthis.data = data;\n\t\t// Decode as latin1 once — same approach as editing parser\n\t\tthis.pdfStr = new TextDecoder(\"latin1\").decode(data);\n\t\tthis.objIndex = buildObjectIndex(this.pdfStr);\n\t}\n\n\t/**\n\t * Parse PDF file\n\t */\n\tparse(): ParsedPDF {\n\t\tconst trailer = parseTrailer(this.pdfStr);\n\t\tconst version = this.parseVersion();\n\n\t\t// Find page objects via Root -> Pages -> Kids\n\t\tconst pageNums = this.findPageObjects(trailer.root);\n\n\t\tconst catalogRef: PDFRef = {\n\t\t\tobjectNumber: trailer.root,\n\t\t\tgeneration: 0,\n\t\t};\n\n\t\tconst pages: ParsedPDFPage[] = [];\n\t\tfor (const pageNum of pageNums) {\n\t\t\tconst page = this.parsePage(pageNum);\n\t\t\tif (page) pages.push(page);\n\t\t}\n\n\t\treturn {\n\t\t\tversion,\n\t\t\tcatalog: catalogRef,\n\t\t\tpages,\n\t\t\tobjects: new Map(),\n\t\t};\n\t}\n\n\t/**\n\t * Parse PDF version from header\n\t */\n\tprivate parseVersion(): string {\n\t\tconst match = this.pdfStr.slice(0, 20).match(/%PDF-(\\d+\\.\\d+)/);\n\t\treturn match ? match[1]! : \"1.7\";\n\t}\n\n\t/**\n\t * Find all leaf page object numbers by following Root -> Pages -> Kids\n\t */\n\tprivate findPageObjects(rootNum: number): number[] {\n\t\tconst rootContent = extractObjectDictContent(\n\t\t\tthis.pdfStr,\n\t\t\trootNum,\n\t\t\tthis.objIndex,\n\t\t);\n\t\tconst pagesMatch = rootContent.match(/\\/Pages\\s+(\\d+)\\s+\\d+\\s+R/);\n\t\tif (!pagesMatch)\n\t\t\tthrow new PDFParseError(\"Cannot find Pages ref in Root catalog\");\n\t\tconst pagesNum = parseInt(pagesMatch[1]!, 10);\n\t\treturn this.collectPageLeafs(pagesNum, new Set());\n\t}\n\n\t/**\n\t * Recursively collect leaf Page object numbers\n\t */\n\tprivate collectPageLeafs(\n\t\tobjNum: number,\n\t\tvisited: Set<number>,\n\t): number[] {\n\t\tif (visited.has(objNum)) return [];\n\t\tvisited.add(objNum);\n\n\t\tconst content = extractObjectDictContent(\n\t\t\tthis.pdfStr,\n\t\t\tobjNum,\n\t\t\tthis.objIndex,\n\t\t);\n\n\t\tconst typeMatch = content.match(/\\/Type\\s+\\/(\\w+)/);\n\t\tif (typeMatch?.[1] === \"Page\") {\n\t\t\treturn [objNum];\n\t\t}\n\n\t\tconst kidsMatch = content.match(/\\/Kids\\s*\\[([^\\]]+)\\]/);\n\t\tif (!kidsMatch) return [objNum];\n\n\t\tconst refs: number[] = [];\n\t\tconst refRegex = /(\\d+)\\s+\\d+\\s+R/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = refRegex.exec(kidsMatch[1]!)) !== null) {\n\t\t\trefs.push(parseInt(m[1]!, 10));\n\t\t}\n\n\t\tconst pages: number[] = [];\n\t\tfor (const ref of refs) {\n\t\t\tpages.push(...this.collectPageLeafs(ref, visited));\n\t\t}\n\t\treturn pages;\n\t}\n\n\t/**\n\t * Parse a single page\n\t */\n\tprivate parsePage(pageObjNum: number): ParsedPDFPage | null {\n\t\ttry {\n\t\t\tconst mediaBox = getMediaBox(this.pdfStr, pageObjNum, this.objIndex);\n\t\t\tconst size = {\n\t\t\t\twidth: mediaBox[2] - mediaBox[0],\n\t\t\t\theight: mediaBox[3] - mediaBox[1],\n\t\t\t};\n\n\t\t\tconst pageContent = extractObjectDictContent(\n\t\t\t\tthis.pdfStr,\n\t\t\t\tpageObjNum,\n\t\t\t\tthis.objIndex,\n\t\t\t);\n\n\t\t\t// Extract text from content stream(s)\n\t\t\tlet content = \"\";\n\t\t\tconst contentsMatch = pageContent.match(\n\t\t\t\t/\\/Contents\\s+(\\d+)\\s+\\d+\\s+R/,\n\t\t\t);\n\t\t\tif (contentsMatch) {\n\t\t\t\tconst contentsNum = parseInt(contentsMatch[1]!, 10);\n\t\t\t\tcontent = this.extractText(contentsNum);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tref: { objectNumber: pageObjNum, generation: 0 },\n\t\t\t\tsize,\n\t\t\t\tcontent,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Extract text from a content stream object, handling FlateDecode compression\n\t */\n\tprivate extractText(objNum: number): string {\n\t\tconst streamData = this.extractStreamData(objNum);\n\t\tif (!streamData) return \"\";\n\n\t\treturn this.parseTextOperators(streamData);\n\t}\n\n\t/**\n\t * Extract raw stream data from an object, decompressing if needed\n\t */\n\tprivate extractStreamData(objNum: number): string | null {\n\t\tconst pos = this.objIndex.get(objNum);\n\t\tif (pos === undefined) return null;\n\n\t\t// Find the dictionary and stream\n\t\tconst dictStart = this.pdfStr.indexOf(\"<<\", pos);\n\t\tif (dictStart === -1) return null;\n\n\t\tconst dictEnd = this.findMatchingDictEnd(dictStart);\n\t\tif (dictEnd === -1) return null;\n\n\t\tconst dictContent = this.pdfStr.slice(dictStart + 2, dictEnd);\n\n\t\t// Find \"stream\" keyword after the dict\n\t\tconst afterDict = this.pdfStr.indexOf(\"stream\", dictEnd);\n\t\tif (afterDict === -1) return null;\n\n\t\t// Stream data starts after \"stream\\n\" or \"stream\\r\\n\"\n\t\tlet streamStart = afterDict + 6; // \"stream\".length\n\t\tif (this.pdfStr[streamStart] === \"\\r\") streamStart++;\n\t\tif (this.pdfStr[streamStart] === \"\\n\") streamStart++;\n\n\t\t// Find endstream\n\t\tconst endstream = this.pdfStr.indexOf(\"endstream\", streamStart);\n\t\tif (endstream === -1) return null;\n\n\t\t// Trim trailing whitespace before endstream\n\t\tlet streamEnd = endstream;\n\t\twhile (\n\t\t\tstreamEnd > streamStart &&\n\t\t\t(this.pdfStr[streamEnd - 1] === \"\\n\" ||\n\t\t\t\tthis.pdfStr[streamEnd - 1] === \"\\r\")\n\t\t) {\n\t\t\tstreamEnd--;\n\t\t}\n\n\t\tconst isCompressed = /\\/Filter\\s*\\/FlateDecode/.test(dictContent);\n\n\t\tif (isCompressed) {\n\t\t\t// Extract raw bytes from the latin1 string\n\t\t\tconst rawBytes = new Uint8Array(streamEnd - streamStart);\n\t\t\tfor (let i = 0; i < rawBytes.length; i++) {\n\t\t\t\trawBytes[i] = this.pdfStr.charCodeAt(streamStart + i);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst decompressed = inflateSync(rawBytes);\n\t\t\t\treturn new TextDecoder(\"latin1\").decode(decompressed);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn this.pdfStr.slice(streamStart, streamEnd);\n\t}\n\n\t/**\n\t * Find matching >> for a << at the given position\n\t */\n\tprivate findMatchingDictEnd(startPos: number): number {\n\t\tlet depth = 0;\n\t\tlet i = startPos;\n\t\twhile (i < this.pdfStr.length - 1) {\n\t\t\tif (this.pdfStr[i] === \"(\") {\n\t\t\t\ti++;\n\t\t\t\twhile (i < this.pdfStr.length && this.pdfStr[i] !== \")\") {\n\t\t\t\t\tif (this.pdfStr[i] === \"\\\\\") i++;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t} else if (\n\t\t\t\tthis.pdfStr[i] === \"<\" &&\n\t\t\t\tthis.pdfStr[i + 1] === \"<\"\n\t\t\t) {\n\t\t\t\tdepth++;\n\t\t\t\ti += 2;\n\t\t\t} else if (\n\t\t\t\tthis.pdfStr[i] === \">\" &&\n\t\t\t\tthis.pdfStr[i + 1] === \">\"\n\t\t\t) {\n\t\t\t\tdepth--;\n\t\t\t\tif (depth === 0) return i;\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Parse text operators from content stream data\n\t */\n\tprivate parseTextOperators(content: string): string {\n\t\tconst texts: string[] = [];\n\n\t\t// Match (text) Tj — single string show\n\t\tconst tjRegex = /\\(([^)]*)\\)\\s*Tj/g;\n\t\tlet match;\n\t\twhile ((match = tjRegex.exec(content)) !== null) {\n\t\t\ttexts.push(match[1]!);\n\t\t}\n\n\t\t// Match [...] TJ — array show (mix of strings and kerning numbers)\n\t\tconst tjArrayRegex = /\\[((?:[^[\\]]*?))\\]\\s*TJ/gi;\n\t\twhile ((match = tjArrayRegex.exec(content)) !== null) {\n\t\t\tconst arrayContent = match[1]!;\n\t\t\tconst stringParts: string[] = [];\n\t\t\tconst partRegex = /\\(([^)]*)\\)/g;\n\t\t\tlet partMatch;\n\t\t\twhile ((partMatch = partRegex.exec(arrayContent)) !== null) {\n\t\t\t\tstringParts.push(partMatch[1]!);\n\t\t\t}\n\t\t\tif (stringParts.length > 0) {\n\t\t\t\ttexts.push(stringParts.join(\"\"));\n\t\t\t}\n\t\t}\n\n\t\t// Match ' and \" operators (move to next line and show)\n\t\tconst quoteRegex = /\\(([^)]*)\\)\\s*['\"]/g;\n\t\twhile ((match = quoteRegex.exec(content)) !== null) {\n\t\t\ttexts.push(match[1]!);\n\t\t}\n\n\t\treturn texts.join(\" \");\n\t}\n}\n",
|
|
8
|
+
"/**\n * Base error class for all PDF errors\n */\nexport class PDFError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PDFError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when PDF parsing fails\n */\nexport class PDFParseError extends PDFError {\n constructor(\n message: string,\n public readonly offset?: number,\n ) {\n super(message);\n this.name = \"PDFParseError\";\n }\n}\n\n/**\n * Error thrown when PDF generation fails\n */\nexport class PDFGenerationError extends PDFError {\n constructor(message: string) {\n super(message);\n this.name = \"PDFGenerationError\";\n }\n}\n\n/**\n * Error thrown when PDF object is invalid\n */\nexport class InvalidPDFObjectError extends PDFError {\n constructor(\n public readonly objectType: string,\n reason: string,\n ) {\n super(`Invalid ${objectType}: ${reason}`);\n this.name = \"InvalidPDFObjectError\";\n }\n}\n\n/**\n * Error thrown when font is not found\n */\nexport class FontNotFoundError extends PDFError {\n constructor(public readonly fontName: string) {\n super(`Font not found: ${fontName}`);\n this.name = \"FontNotFoundError\";\n }\n}\n\n/**\n * Error thrown when image is invalid\n */\nexport class InvalidImageError extends PDFError {\n constructor(reason: string) {\n super(`Invalid image: ${reason}`);\n this.name = \"InvalidImageError\";\n }\n}\n\n/**\n * Error thrown when PDF signature fails\n */\nexport class PDFSignatureError extends PDFError {\n constructor(reason: string) {\n super(`PDF signature error: ${reason}`);\n this.name = \"PDFSignatureError\";\n }\n}\n\n/**\n * Error thrown when PDF encryption fails\n */\nexport class PDFEncryptionError extends PDFError {\n constructor(reason: string) {\n super(`PDF encryption error: ${reason}`);\n this.name = \"PDFEncryptionError\";\n }\n}\n\n/**\n * Error thrown when required feature is not implemented\n */\nexport class NotImplementedError extends PDFError {\n constructor(feature: string) {\n super(`Feature not yet implemented: ${feature}`);\n this.name = \"NotImplementedError\";\n }\n}\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "6B537936CE65CAFF64756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|