first commit

This commit is contained in:
Ale
2025-05-13 12:01:17 +02:00
commit d7881a4461
4852 changed files with 537159 additions and 0 deletions

15
node_modules/pdf-lib/cjs/core/parser/BaseParser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,15 @@
import ByteStream from "./ByteStream";
declare class BaseParser {
protected readonly bytes: ByteStream;
protected readonly capNumbers: boolean;
constructor(bytes: ByteStream, capNumbers?: boolean);
protected parseRawInt(): number;
protected parseRawNumber(): number;
protected skipWhitespace(): void;
protected skipLine(): void;
protected skipComment(): boolean;
protected skipWhitespaceAndComments(): void;
protected matchKeyword(keyword: number[]): boolean;
}
export default BaseParser;
//# sourceMappingURL=BaseParser.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"BaseParser.d.ts","sourceRoot":"","sources":["../../../src/core/parser/BaseParser.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,qBAAmC;AASpD,cAAM,UAAU;IACd,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;gBAE3B,KAAK,EAAE,UAAU,EAAE,UAAU,UAAQ;IAKjD,SAAS,CAAC,WAAW,IAAI,MAAM;IAoB/B,SAAS,CAAC,cAAc,IAAI,MAAM;IAsClC,SAAS,CAAC,cAAc,IAAI,IAAI;IAMhC,SAAS,CAAC,QAAQ,IAAI,IAAI;IAQ1B,SAAS,CAAC,WAAW,IAAI,OAAO;IAUhC,SAAS,CAAC,yBAAyB,IAAI,IAAI;IAK3C,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;CAUnD;AAED,eAAe,UAAU,CAAC"}

110
node_modules/pdf-lib/cjs/core/parser/BaseParser.js generated vendored Normal file
View File

@@ -0,0 +1,110 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
var CharCodes_1 = tslib_1.__importDefault(require("../syntax/CharCodes"));
var Numeric_1 = require("../syntax/Numeric");
var Whitespace_1 = require("../syntax/Whitespace");
var utils_1 = require("../../utils");
var Newline = CharCodes_1.default.Newline, CarriageReturn = CharCodes_1.default.CarriageReturn;
// TODO: Throw error if eof is reached before finishing object parse...
var BaseParser = /** @class */ (function () {
function BaseParser(bytes, capNumbers) {
if (capNumbers === void 0) { capNumbers = false; }
this.bytes = bytes;
this.capNumbers = capNumbers;
}
BaseParser.prototype.parseRawInt = function () {
var value = '';
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (!Numeric_1.IsDigit[byte])
break;
value += utils_1.charFromCode(this.bytes.next());
}
var numberValue = Number(value);
if (!value || !isFinite(numberValue)) {
throw new errors_1.NumberParsingError(this.bytes.position(), value);
}
return numberValue;
};
// TODO: Maybe handle exponential format?
// TODO: Compare performance of string concatenation to charFromCode(...bytes)
BaseParser.prototype.parseRawNumber = function () {
var value = '';
// Parse integer-part, the leading (+ | - | . | 0-9)
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (!Numeric_1.IsNumeric[byte])
break;
value += utils_1.charFromCode(this.bytes.next());
if (byte === CharCodes_1.default.Period)
break;
}
// Parse decimal-part, the trailing (0-9)
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (!Numeric_1.IsDigit[byte])
break;
value += utils_1.charFromCode(this.bytes.next());
}
var numberValue = Number(value);
if (!value || !isFinite(numberValue)) {
throw new errors_1.NumberParsingError(this.bytes.position(), value);
}
if (numberValue > Number.MAX_SAFE_INTEGER) {
if (this.capNumbers) {
var msg = "Parsed number that is too large for some PDF readers: " + value + ", using Number.MAX_SAFE_INTEGER instead.";
console.warn(msg);
return Number.MAX_SAFE_INTEGER;
}
else {
var msg = "Parsed number that is too large for some PDF readers: " + value + ", not capping.";
console.warn(msg);
}
}
return numberValue;
};
BaseParser.prototype.skipWhitespace = function () {
while (!this.bytes.done() && Whitespace_1.IsWhitespace[this.bytes.peek()]) {
this.bytes.next();
}
};
BaseParser.prototype.skipLine = function () {
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (byte === Newline || byte === CarriageReturn)
return;
this.bytes.next();
}
};
BaseParser.prototype.skipComment = function () {
if (this.bytes.peek() !== CharCodes_1.default.Percent)
return false;
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (byte === Newline || byte === CarriageReturn)
return true;
this.bytes.next();
}
return true;
};
BaseParser.prototype.skipWhitespaceAndComments = function () {
this.skipWhitespace();
while (this.skipComment())
this.skipWhitespace();
};
BaseParser.prototype.matchKeyword = function (keyword) {
var initialOffset = this.bytes.offset();
for (var idx = 0, len = keyword.length; idx < len; idx++) {
if (this.bytes.done() || this.bytes.next() !== keyword[idx]) {
this.bytes.moveTo(initialOffset);
return false;
}
}
return true;
};
return BaseParser;
}());
exports.default = BaseParser;
//# sourceMappingURL=BaseParser.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"BaseParser.js","sourceRoot":"","sources":["../../../src/core/parser/BaseParser.ts"],"names":[],"mappings":"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"}

27
node_modules/pdf-lib/cjs/core/parser/ByteStream.d.ts generated vendored Normal file
View File

@@ -0,0 +1,27 @@
import PDFRawStream from "../objects/PDFRawStream";
declare class ByteStream {
static of: (bytes: Uint8Array) => ByteStream;
static fromPDFRawStream: (rawStream: PDFRawStream) => ByteStream;
private readonly bytes;
private readonly length;
private idx;
private line;
private column;
constructor(bytes: Uint8Array);
moveTo(offset: number): void;
next(): number;
assertNext(expected: number): number;
peek(): number;
peekAhead(steps: number): number;
peekAt(offset: number): number;
done(): boolean;
offset(): number;
slice(start: number, end: number): Uint8Array;
position(): {
line: number;
column: number;
offset: number;
};
}
export default ByteStream;
//# sourceMappingURL=ByteStream.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ByteStream.d.ts","sourceRoot":"","sources":["../../../src/core/parser/ByteStream.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,gCAAsC;AAKzD,cAAM,UAAU;IACd,MAAM,CAAC,EAAE,UAAW,UAAU,gBAA2B;IAEzD,MAAM,CAAC,gBAAgB,cAAe,YAAY,gBACM;IAExD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,KAAK,EAAE,UAAU;IAK7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,IAAI,MAAM;IAWd,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAOpC,IAAI,IAAI,MAAM;IAId,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,IAAI,IAAI,OAAO;IAIf,MAAM,IAAI,MAAM;IAIhB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU;IAI7C,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAG7D;AAED,eAAe,UAAU,CAAC"}

64
node_modules/pdf-lib/cjs/core/parser/ByteStream.js generated vendored Normal file
View File

@@ -0,0 +1,64 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
var decode_1 = require("../streams/decode");
var CharCodes_1 = tslib_1.__importDefault(require("../syntax/CharCodes"));
// TODO: See how line/col tracking affects performance
var ByteStream = /** @class */ (function () {
function ByteStream(bytes) {
this.idx = 0;
this.line = 0;
this.column = 0;
this.bytes = bytes;
this.length = this.bytes.length;
}
ByteStream.prototype.moveTo = function (offset) {
this.idx = offset;
};
ByteStream.prototype.next = function () {
var byte = this.bytes[this.idx++];
if (byte === CharCodes_1.default.Newline) {
this.line += 1;
this.column = 0;
}
else {
this.column += 1;
}
return byte;
};
ByteStream.prototype.assertNext = function (expected) {
if (this.peek() !== expected) {
throw new errors_1.NextByteAssertionError(this.position(), expected, this.peek());
}
return this.next();
};
ByteStream.prototype.peek = function () {
return this.bytes[this.idx];
};
ByteStream.prototype.peekAhead = function (steps) {
return this.bytes[this.idx + steps];
};
ByteStream.prototype.peekAt = function (offset) {
return this.bytes[offset];
};
ByteStream.prototype.done = function () {
return this.idx >= this.length;
};
ByteStream.prototype.offset = function () {
return this.idx;
};
ByteStream.prototype.slice = function (start, end) {
return this.bytes.slice(start, end);
};
ByteStream.prototype.position = function () {
return { line: this.line, column: this.column, offset: this.idx };
};
ByteStream.of = function (bytes) { return new ByteStream(bytes); };
ByteStream.fromPDFRawStream = function (rawStream) {
return ByteStream.of(decode_1.decodePDFRawStream(rawStream).decode());
};
return ByteStream;
}());
exports.default = ByteStream;
//# sourceMappingURL=ByteStream.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ByteStream.js","sourceRoot":"","sources":["../../../src/core/parser/ByteStream.ts"],"names":[],"mappings":";;;AAAA,oCAAyD;AAEzD,4CAA6D;AAC7D,0EAAkD;AAElD,sDAAsD;AACtD;IAaE,oBAAY,KAAiB;QAJrB,QAAG,GAAG,CAAC,CAAC;QACR,SAAI,GAAG,CAAC,CAAC;QACT,WAAM,GAAG,CAAC,CAAC;QAGjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,2BAAM,GAAN,UAAO,MAAc;QACnB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;IACpB,CAAC;IAED,yBAAI,GAAJ;QACE,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,mBAAS,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjB;aAAM;YACL,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;SAClB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAAU,GAAV,UAAW,QAAgB;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE;YAC5B,MAAM,IAAI,+BAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAC1E;QACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,yBAAI,GAAJ;QACE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,8BAAS,GAAT,UAAU,KAAa;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,2BAAM,GAAN,UAAO,MAAc;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,yBAAI,GAAJ;QACE,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,2BAAM,GAAN;QACE,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,0BAAK,GAAL,UAAM,KAAa,EAAE,GAAW;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,6BAAQ,GAAR;QACE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACpE,CAAC;IAjEM,aAAE,GAAG,UAAC,KAAiB,IAAK,OAAA,IAAI,UAAU,CAAC,KAAK,CAAC,EAArB,CAAqB,CAAC;IAElD,2BAAgB,GAAG,UAAC,SAAuB;QAChD,OAAA,UAAU,CAAC,EAAE,CAAC,2BAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IAArD,CAAqD,CAAC;IA+D1D,iBAAC;CAAA,AAnED,IAmEC;AAED,kBAAe,UAAU,CAAC"}

View File

@@ -0,0 +1,30 @@
import { Position } from "../errors";
import PDFArray from "../objects/PDFArray";
import PDFDict from "../objects/PDFDict";
import PDFHexString from "../objects/PDFHexString";
import PDFName from "../objects/PDFName";
import PDFNumber from "../objects/PDFNumber";
import PDFObject from "../objects/PDFObject";
import PDFRef from "../objects/PDFRef";
import PDFStream from "../objects/PDFStream";
import PDFString from "../objects/PDFString";
import BaseParser from "./BaseParser";
import ByteStream from "./ByteStream";
import PDFContext from "../PDFContext";
declare class PDFObjectParser extends BaseParser {
static forBytes: (bytes: Uint8Array, context: PDFContext, capNumbers?: boolean | undefined) => PDFObjectParser;
static forByteStream: (byteStream: ByteStream, context: PDFContext, capNumbers?: boolean) => PDFObjectParser;
protected readonly context: PDFContext;
constructor(byteStream: ByteStream, context: PDFContext, capNumbers?: boolean);
parseObject(): PDFObject;
protected parseNumberOrRef(): PDFNumber | PDFRef;
protected parseHexString(): PDFHexString;
protected parseString(): PDFString;
protected parseName(): PDFName;
protected parseArray(): PDFArray;
protected parseDict(): PDFDict;
protected parseDictOrStream(): PDFDict | PDFStream;
protected findEndOfStreamFallback(startPos: Position): number;
}
export default PDFObjectParser;
//# sourceMappingURL=PDFObjectParser.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFObjectParser.d.ts","sourceRoot":"","sources":["../../../src/core/parser/PDFObjectParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EAET,kBAAwB;AACzB,OAAO,QAAQ,4BAAkC;AAEjD,OAAO,OAAoB,2BAAiC;AAC5D,OAAO,YAAY,gCAAsC;AACzD,OAAO,OAAO,2BAAiC;AAE/C,OAAO,SAAS,6BAAmC;AACnD,OAAO,SAAS,6BAAmC;AAEnD,OAAO,MAAM,0BAAgC;AAC7C,OAAO,SAAS,6BAAmC;AACnD,OAAO,SAAS,6BAAmC;AACnD,OAAO,UAAU,qBAAmC;AACpD,OAAO,UAAU,qBAAmC;AACpD,OAAO,UAAU,sBAA4B;AAY7C,cAAM,eAAgB,SAAQ,UAAU;IACtC,MAAM,CAAC,QAAQ,UACN,UAAU,WACR,UAAU,uDAE+C;IAEpE,MAAM,CAAC,aAAa,eACN,UAAU,WACb,UAAU,2CAEqC;IAE1D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;gBAE3B,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,UAAQ;IAM3E,WAAW,IAAI,SAAS;IAwBxB,SAAS,CAAC,gBAAgB,IAAI,SAAS,GAAG,MAAM;IAmBhD,SAAS,CAAC,cAAc,IAAI,YAAY;IAYxC,SAAS,CAAC,WAAW,IAAI,SAAS;IAkClC,SAAS,CAAC,SAAS,IAAI,OAAO;IAc9B,SAAS,CAAC,UAAU,IAAI,QAAQ;IAchC,SAAS,CAAC,SAAS,IAAI,OAAO;IAmC9B,SAAS,CAAC,iBAAiB,IAAI,OAAO,GAAG,SAAS;IAsClD,SAAS,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ;CA4BrD;AAED,eAAe,eAAe,CAAC"}

233
node_modules/pdf-lib/cjs/core/parser/PDFObjectParser.js generated vendored Normal file
View File

@@ -0,0 +1,233 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
var PDFArray_1 = tslib_1.__importDefault(require("../objects/PDFArray"));
var PDFBool_1 = tslib_1.__importDefault(require("../objects/PDFBool"));
var PDFDict_1 = tslib_1.__importDefault(require("../objects/PDFDict"));
var PDFHexString_1 = tslib_1.__importDefault(require("../objects/PDFHexString"));
var PDFName_1 = tslib_1.__importDefault(require("../objects/PDFName"));
var PDFNull_1 = tslib_1.__importDefault(require("../objects/PDFNull"));
var PDFNumber_1 = tslib_1.__importDefault(require("../objects/PDFNumber"));
var PDFRawStream_1 = tslib_1.__importDefault(require("../objects/PDFRawStream"));
var PDFRef_1 = tslib_1.__importDefault(require("../objects/PDFRef"));
var PDFString_1 = tslib_1.__importDefault(require("../objects/PDFString"));
var BaseParser_1 = tslib_1.__importDefault(require("./BaseParser"));
var ByteStream_1 = tslib_1.__importDefault(require("./ByteStream"));
var PDFCatalog_1 = tslib_1.__importDefault(require("../structures/PDFCatalog"));
var PDFPageLeaf_1 = tslib_1.__importDefault(require("../structures/PDFPageLeaf"));
var PDFPageTree_1 = tslib_1.__importDefault(require("../structures/PDFPageTree"));
var CharCodes_1 = tslib_1.__importDefault(require("../syntax/CharCodes"));
var Delimiters_1 = require("../syntax/Delimiters");
var Keywords_1 = require("../syntax/Keywords");
var Numeric_1 = require("../syntax/Numeric");
var Whitespace_1 = require("../syntax/Whitespace");
var utils_1 = require("../../utils");
// TODO: Throw error if eof is reached before finishing object parse...
var PDFObjectParser = /** @class */ (function (_super) {
tslib_1.__extends(PDFObjectParser, _super);
function PDFObjectParser(byteStream, context, capNumbers) {
if (capNumbers === void 0) { capNumbers = false; }
var _this = _super.call(this, byteStream, capNumbers) || this;
_this.context = context;
return _this;
}
// TODO: Is it possible to reduce duplicate parsing for ref lookaheads?
PDFObjectParser.prototype.parseObject = function () {
this.skipWhitespaceAndComments();
if (this.matchKeyword(Keywords_1.Keywords.true))
return PDFBool_1.default.True;
if (this.matchKeyword(Keywords_1.Keywords.false))
return PDFBool_1.default.False;
if (this.matchKeyword(Keywords_1.Keywords.null))
return PDFNull_1.default;
var byte = this.bytes.peek();
if (byte === CharCodes_1.default.LessThan &&
this.bytes.peekAhead(1) === CharCodes_1.default.LessThan) {
return this.parseDictOrStream();
}
if (byte === CharCodes_1.default.LessThan)
return this.parseHexString();
if (byte === CharCodes_1.default.LeftParen)
return this.parseString();
if (byte === CharCodes_1.default.ForwardSlash)
return this.parseName();
if (byte === CharCodes_1.default.LeftSquareBracket)
return this.parseArray();
if (Numeric_1.IsNumeric[byte])
return this.parseNumberOrRef();
throw new errors_1.PDFObjectParsingError(this.bytes.position(), byte);
};
PDFObjectParser.prototype.parseNumberOrRef = function () {
var firstNum = this.parseRawNumber();
this.skipWhitespaceAndComments();
var lookaheadStart = this.bytes.offset();
if (Numeric_1.IsDigit[this.bytes.peek()]) {
var secondNum = this.parseRawNumber();
this.skipWhitespaceAndComments();
if (this.bytes.peek() === CharCodes_1.default.R) {
this.bytes.assertNext(CharCodes_1.default.R);
return PDFRef_1.default.of(firstNum, secondNum);
}
}
this.bytes.moveTo(lookaheadStart);
return PDFNumber_1.default.of(firstNum);
};
// TODO: Maybe update PDFHexString.of() logic to remove whitespace and validate input?
PDFObjectParser.prototype.parseHexString = function () {
var value = '';
this.bytes.assertNext(CharCodes_1.default.LessThan);
while (!this.bytes.done() && this.bytes.peek() !== CharCodes_1.default.GreaterThan) {
value += utils_1.charFromCode(this.bytes.next());
}
this.bytes.assertNext(CharCodes_1.default.GreaterThan);
return PDFHexString_1.default.of(value);
};
PDFObjectParser.prototype.parseString = function () {
var nestingLvl = 0;
var isEscaped = false;
var value = '';
while (!this.bytes.done()) {
var byte = this.bytes.next();
value += utils_1.charFromCode(byte);
// Check for unescaped parenthesis
if (!isEscaped) {
if (byte === CharCodes_1.default.LeftParen)
nestingLvl += 1;
if (byte === CharCodes_1.default.RightParen)
nestingLvl -= 1;
}
// Track whether current character is being escaped or not
if (byte === CharCodes_1.default.BackSlash) {
isEscaped = !isEscaped;
}
else if (isEscaped) {
isEscaped = false;
}
// Once (if) the unescaped parenthesis balance out, return their contents
if (nestingLvl === 0) {
// Remove the outer parens so they aren't part of the contents
return PDFString_1.default.of(value.substring(1, value.length - 1));
}
}
throw new errors_1.UnbalancedParenthesisError(this.bytes.position());
};
// TODO: Compare performance of string concatenation to charFromCode(...bytes)
// TODO: Maybe preallocate small Uint8Array if can use charFromCode?
PDFObjectParser.prototype.parseName = function () {
this.bytes.assertNext(CharCodes_1.default.ForwardSlash);
var name = '';
while (!this.bytes.done()) {
var byte = this.bytes.peek();
if (Whitespace_1.IsWhitespace[byte] || Delimiters_1.IsDelimiter[byte])
break;
name += utils_1.charFromCode(byte);
this.bytes.next();
}
return PDFName_1.default.of(name);
};
PDFObjectParser.prototype.parseArray = function () {
this.bytes.assertNext(CharCodes_1.default.LeftSquareBracket);
this.skipWhitespaceAndComments();
var pdfArray = PDFArray_1.default.withContext(this.context);
while (this.bytes.peek() !== CharCodes_1.default.RightSquareBracket) {
var element = this.parseObject();
pdfArray.push(element);
this.skipWhitespaceAndComments();
}
this.bytes.assertNext(CharCodes_1.default.RightSquareBracket);
return pdfArray;
};
PDFObjectParser.prototype.parseDict = function () {
this.bytes.assertNext(CharCodes_1.default.LessThan);
this.bytes.assertNext(CharCodes_1.default.LessThan);
this.skipWhitespaceAndComments();
var dict = new Map();
while (!this.bytes.done() &&
this.bytes.peek() !== CharCodes_1.default.GreaterThan &&
this.bytes.peekAhead(1) !== CharCodes_1.default.GreaterThan) {
var key = this.parseName();
var value = this.parseObject();
dict.set(key, value);
this.skipWhitespaceAndComments();
}
this.skipWhitespaceAndComments();
this.bytes.assertNext(CharCodes_1.default.GreaterThan);
this.bytes.assertNext(CharCodes_1.default.GreaterThan);
var Type = dict.get(PDFName_1.default.of('Type'));
if (Type === PDFName_1.default.of('Catalog')) {
return PDFCatalog_1.default.fromMapWithContext(dict, this.context);
}
else if (Type === PDFName_1.default.of('Pages')) {
return PDFPageTree_1.default.fromMapWithContext(dict, this.context);
}
else if (Type === PDFName_1.default.of('Page')) {
return PDFPageLeaf_1.default.fromMapWithContext(dict, this.context);
}
else {
return PDFDict_1.default.fromMapWithContext(dict, this.context);
}
};
PDFObjectParser.prototype.parseDictOrStream = function () {
var startPos = this.bytes.position();
var dict = this.parseDict();
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.streamEOF1) &&
!this.matchKeyword(Keywords_1.Keywords.streamEOF2) &&
!this.matchKeyword(Keywords_1.Keywords.streamEOF3) &&
!this.matchKeyword(Keywords_1.Keywords.streamEOF4) &&
!this.matchKeyword(Keywords_1.Keywords.stream)) {
return dict;
}
var start = this.bytes.offset();
var end;
var Length = dict.get(PDFName_1.default.of('Length'));
if (Length instanceof PDFNumber_1.default) {
end = start + Length.asNumber();
this.bytes.moveTo(end);
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.endstream)) {
this.bytes.moveTo(start);
end = this.findEndOfStreamFallback(startPos);
}
}
else {
end = this.findEndOfStreamFallback(startPos);
}
var contents = this.bytes.slice(start, end);
return PDFRawStream_1.default.of(dict, contents);
};
PDFObjectParser.prototype.findEndOfStreamFallback = function (startPos) {
// Move to end of stream, while handling nested streams
var nestingLvl = 1;
var end = this.bytes.offset();
while (!this.bytes.done()) {
end = this.bytes.offset();
if (this.matchKeyword(Keywords_1.Keywords.stream)) {
nestingLvl += 1;
}
else if (this.matchKeyword(Keywords_1.Keywords.EOF1endstream) ||
this.matchKeyword(Keywords_1.Keywords.EOF2endstream) ||
this.matchKeyword(Keywords_1.Keywords.EOF3endstream) ||
this.matchKeyword(Keywords_1.Keywords.endstream)) {
nestingLvl -= 1;
}
else {
this.bytes.next();
}
if (nestingLvl === 0)
break;
}
if (nestingLvl !== 0)
throw new errors_1.PDFStreamParsingError(startPos);
return end;
};
PDFObjectParser.forBytes = function (bytes, context, capNumbers) { return new PDFObjectParser(ByteStream_1.default.of(bytes), context, capNumbers); };
PDFObjectParser.forByteStream = function (byteStream, context, capNumbers) {
if (capNumbers === void 0) { capNumbers = false; }
return new PDFObjectParser(byteStream, context, capNumbers);
};
return PDFObjectParser;
}(BaseParser_1.default));
exports.default = PDFObjectParser;
//# sourceMappingURL=PDFObjectParser.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
import PDFRawStream from "../objects/PDFRawStream";
import PDFObjectParser from "./PDFObjectParser";
declare class PDFObjectStreamParser extends PDFObjectParser {
static forStream: (rawStream: PDFRawStream, shouldWaitForTick?: (() => boolean) | undefined) => PDFObjectStreamParser;
private alreadyParsed;
private readonly shouldWaitForTick;
private readonly firstOffset;
private readonly objectCount;
constructor(rawStream: PDFRawStream, shouldWaitForTick?: () => boolean);
parseIntoContext(): Promise<void>;
private parseOffsetsAndObjectNumbers;
}
export default PDFObjectStreamParser;
//# sourceMappingURL=PDFObjectStreamParser.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFObjectStreamParser.d.ts","sourceRoot":"","sources":["../../../src/core/parser/PDFObjectStreamParser.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,gCAAsC;AAGzD,OAAO,eAAe,0BAAwC;AAG9D,cAAM,qBAAsB,SAAQ,eAAe;IACjD,MAAM,CAAC,SAAS,cACH,YAAY,6BACG,OAAO,wCAC0B;IAE7D,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAE,MAAM,OAAO;IAWhE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBvC,OAAO,CAAC,4BAA4B;CAgBrC;AAED,eAAe,qBAAqB,CAAC"}

View File

@@ -0,0 +1,70 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
var PDFName_1 = tslib_1.__importDefault(require("../objects/PDFName"));
var PDFNumber_1 = tslib_1.__importDefault(require("../objects/PDFNumber"));
var PDFRef_1 = tslib_1.__importDefault(require("../objects/PDFRef"));
var ByteStream_1 = tslib_1.__importDefault(require("./ByteStream"));
var PDFObjectParser_1 = tslib_1.__importDefault(require("./PDFObjectParser"));
var utils_1 = require("../../utils");
var PDFObjectStreamParser = /** @class */ (function (_super) {
tslib_1.__extends(PDFObjectStreamParser, _super);
function PDFObjectStreamParser(rawStream, shouldWaitForTick) {
var _this = _super.call(this, ByteStream_1.default.fromPDFRawStream(rawStream), rawStream.dict.context) || this;
var dict = rawStream.dict;
_this.alreadyParsed = false;
_this.shouldWaitForTick = shouldWaitForTick || (function () { return false; });
_this.firstOffset = dict.lookup(PDFName_1.default.of('First'), PDFNumber_1.default).asNumber();
_this.objectCount = dict.lookup(PDFName_1.default.of('N'), PDFNumber_1.default).asNumber();
return _this;
}
PDFObjectStreamParser.prototype.parseIntoContext = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var offsetsAndObjectNumbers, idx, len, _a, objectNumber, offset, object, ref;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (this.alreadyParsed) {
throw new errors_1.ReparseError('PDFObjectStreamParser', 'parseIntoContext');
}
this.alreadyParsed = true;
offsetsAndObjectNumbers = this.parseOffsetsAndObjectNumbers();
idx = 0, len = offsetsAndObjectNumbers.length;
_b.label = 1;
case 1:
if (!(idx < len)) return [3 /*break*/, 4];
_a = offsetsAndObjectNumbers[idx], objectNumber = _a.objectNumber, offset = _a.offset;
this.bytes.moveTo(this.firstOffset + offset);
object = this.parseObject();
ref = PDFRef_1.default.of(objectNumber, 0);
this.context.assign(ref, object);
if (!this.shouldWaitForTick()) return [3 /*break*/, 3];
return [4 /*yield*/, utils_1.waitForTick()];
case 2:
_b.sent();
_b.label = 3;
case 3:
idx++;
return [3 /*break*/, 1];
case 4: return [2 /*return*/];
}
});
});
};
PDFObjectStreamParser.prototype.parseOffsetsAndObjectNumbers = function () {
var offsetsAndObjectNumbers = [];
for (var idx = 0, len = this.objectCount; idx < len; idx++) {
this.skipWhitespaceAndComments();
var objectNumber = this.parseRawInt();
this.skipWhitespaceAndComments();
var offset = this.parseRawInt();
offsetsAndObjectNumbers.push({ objectNumber: objectNumber, offset: offset });
}
return offsetsAndObjectNumbers;
};
PDFObjectStreamParser.forStream = function (rawStream, shouldWaitForTick) { return new PDFObjectStreamParser(rawStream, shouldWaitForTick); };
return PDFObjectStreamParser;
}(PDFObjectParser_1.default));
exports.default = PDFObjectStreamParser;
//# sourceMappingURL=PDFObjectStreamParser.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFObjectStreamParser.js","sourceRoot":"","sources":["../../../src/core/parser/PDFObjectStreamParser.ts"],"names":[],"mappings":";;;AAAA,oCAA+C;AAC/C,uEAA+C;AAC/C,2EAAmD;AAEnD,qEAA6C;AAC7C,oEAAoD;AACpD,8EAA8D;AAC9D,qCAAwC;AAExC;IAAoC,iDAAe;IAWjD,+BAAY,SAAuB,EAAE,iBAAiC;QAAtE,YACE,kBAAM,oBAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAQtE;QANS,IAAA,IAAI,GAAK,SAAS,KAAd,CAAe;QAE3B,KAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,KAAI,CAAC,iBAAiB,GAAG,iBAAiB,IAAI,CAAC,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC,CAAC;QAC5D,KAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1E,KAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAO,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,mBAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;;IACxE,CAAC;IAEK,gDAAgB,GAAtB;;;;;;wBACE,IAAI,IAAI,CAAC,aAAa,EAAE;4BACtB,MAAM,IAAI,qBAAY,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;yBACrE;wBACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wBAEpB,uBAAuB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;wBAC3D,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,uBAAuB,CAAC,MAAM;;;6BAAE,CAAA,GAAG,GAAG,GAAG,CAAA;wBACzD,KAA2B,uBAAuB,CAAC,GAAG,CAAC,EAArD,YAAY,kBAAA,EAAE,MAAM,YAAA,CAAkC;wBAC9D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;wBACvC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC5B,GAAG,GAAG,gBAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;wBACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;6BAC7B,IAAI,CAAC,iBAAiB,EAAE,EAAxB,wBAAwB;wBAAE,qBAAM,mBAAW,EAAE,EAAA;;wBAAnB,SAAmB,CAAC;;;wBANe,GAAG,EAAE,CAAA;;;;;;KAQzE;IAEO,4DAA4B,GAApC;QAIE,IAAM,uBAAuB,GAAG,EAAE,CAAC;QACnC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1D,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAExC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAElC,uBAAuB,CAAC,IAAI,CAAC,EAAE,YAAY,cAAA,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC;SACxD;QACD,OAAO,uBAAuB,CAAC;IACjC,CAAC;IArDM,+BAAS,GAAG,UACjB,SAAuB,EACvB,iBAAiC,IAC9B,OAAA,IAAI,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAvD,CAAuD,CAAC;IAmD/D,4BAAC;CAAA,AAvDD,CAAoC,yBAAe,GAuDlD;AAED,kBAAe,qBAAqB,CAAC"}

46
node_modules/pdf-lib/cjs/core/parser/PDFParser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,46 @@
import PDFObjectParser from "./PDFObjectParser";
import PDFContext from "../PDFContext";
declare class PDFParser extends PDFObjectParser {
static forBytesWithOptions: (pdfBytes: Uint8Array, objectsPerTick?: number | undefined, throwOnInvalidObject?: boolean | undefined, capNumbers?: boolean | undefined) => PDFParser;
private readonly objectsPerTick;
private readonly throwOnInvalidObject;
private alreadyParsed;
private parsedObjects;
constructor(pdfBytes: Uint8Array, objectsPerTick?: number, throwOnInvalidObject?: boolean, capNumbers?: boolean);
parseDocument(): Promise<PDFContext>;
private maybeRecoverRoot;
private parseHeader;
private parseIndirectObjectHeader;
private matchIndirectObjectHeader;
private shouldWaitForTick;
private parseIndirectObject;
private tryToParseInvalidIndirectObject;
private parseIndirectObjects;
private maybeParseCrossRefSection;
private maybeParseTrailerDict;
private maybeParseTrailer;
private parseDocumentSection;
/**
* This operation is not necessary for valid PDF files. But some invalid PDFs
* contain jibberish in between indirect objects. This method is designed to
* skip past that jibberish, should it exist, until it reaches the next
* indirect object header, an xref table section, or the file trailer.
*/
private skipJibberish;
/**
* Skips the binary comment following a PDF header. The specification
* defines this binary comment (section 7.5.2 File Header) as a sequence of 4
* or more bytes that are 128 or greater, and which are preceded by a "%".
*
* This would imply that to strip out this binary comment, we could check for
* a sequence of bytes starting with "%", and remove all subsequent bytes that
* are 128 or greater. This works for many documents that properly comply with
* the spec. But in the wild, there are PDFs that omit the leading "%", and
* include bytes that are less than 128 (e.g. 0 or 1). So in order to parse
* these headers correctly, we just throw out all bytes leading up to the
* first indirect object header.
*/
private skipBinaryHeaderComment;
}
export default PDFParser;
//# sourceMappingURL=PDFParser.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFParser.d.ts","sourceRoot":"","sources":["../../../src/core/parser/PDFParser.ts"],"names":[],"mappings":"AAiBA,OAAO,eAAe,0BAAwC;AAG9D,OAAO,UAAU,sBAA4B;AAM7C,cAAM,SAAU,SAAQ,eAAe;IACrC,MAAM,CAAC,mBAAmB,aACd,UAAU,kIAKsD;IAE5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAK;gBAGxB,QAAQ,EAAE,UAAU,EACpB,cAAc,SAAW,EACzB,oBAAoB,UAAQ,EAC5B,UAAU,UAAQ;IAOd,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IA4B1C,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,iBAAiB,CAGvB;YAEY,mBAAmB;IAmCjC,OAAO,CAAC,+BAA+B;YAiCzB,oBAAoB;IAsBlC,OAAO,CAAC,yBAAyB;IAkCjC,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,iBAAiB;YAgBX,oBAAoB;IAUlC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,uBAAuB;CAWhC;AAED,eAAe,SAAS,CAAC"}

356
node_modules/pdf-lib/cjs/core/parser/PDFParser.js generated vendored Normal file
View File

@@ -0,0 +1,356 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var PDFCrossRefSection_1 = tslib_1.__importDefault(require("../document/PDFCrossRefSection"));
var PDFHeader_1 = tslib_1.__importDefault(require("../document/PDFHeader"));
var PDFTrailer_1 = tslib_1.__importDefault(require("../document/PDFTrailer"));
var errors_1 = require("../errors");
var PDFDict_1 = tslib_1.__importDefault(require("../objects/PDFDict"));
var PDFInvalidObject_1 = tslib_1.__importDefault(require("../objects/PDFInvalidObject"));
var PDFName_1 = tslib_1.__importDefault(require("../objects/PDFName"));
var PDFRawStream_1 = tslib_1.__importDefault(require("../objects/PDFRawStream"));
var PDFRef_1 = tslib_1.__importDefault(require("../objects/PDFRef"));
var ByteStream_1 = tslib_1.__importDefault(require("./ByteStream"));
var PDFObjectParser_1 = tslib_1.__importDefault(require("./PDFObjectParser"));
var PDFObjectStreamParser_1 = tslib_1.__importDefault(require("./PDFObjectStreamParser"));
var PDFXRefStreamParser_1 = tslib_1.__importDefault(require("./PDFXRefStreamParser"));
var PDFContext_1 = tslib_1.__importDefault(require("../PDFContext"));
var CharCodes_1 = tslib_1.__importDefault(require("../syntax/CharCodes"));
var Keywords_1 = require("../syntax/Keywords");
var Numeric_1 = require("../syntax/Numeric");
var utils_1 = require("../../utils");
var PDFParser = /** @class */ (function (_super) {
tslib_1.__extends(PDFParser, _super);
function PDFParser(pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers) {
if (objectsPerTick === void 0) { objectsPerTick = Infinity; }
if (throwOnInvalidObject === void 0) { throwOnInvalidObject = false; }
if (capNumbers === void 0) { capNumbers = false; }
var _this = _super.call(this, ByteStream_1.default.of(pdfBytes), PDFContext_1.default.create(), capNumbers) || this;
_this.alreadyParsed = false;
_this.parsedObjects = 0;
_this.shouldWaitForTick = function () {
_this.parsedObjects += 1;
return _this.parsedObjects % _this.objectsPerTick === 0;
};
_this.objectsPerTick = objectsPerTick;
_this.throwOnInvalidObject = throwOnInvalidObject;
return _this;
}
PDFParser.prototype.parseDocument = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var prevOffset, offset;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.alreadyParsed) {
throw new errors_1.ReparseError('PDFParser', 'parseDocument');
}
this.alreadyParsed = true;
this.context.header = this.parseHeader();
_a.label = 1;
case 1:
if (!!this.bytes.done()) return [3 /*break*/, 3];
return [4 /*yield*/, this.parseDocumentSection()];
case 2:
_a.sent();
offset = this.bytes.offset();
if (offset === prevOffset) {
throw new errors_1.StalledParserError(this.bytes.position());
}
prevOffset = offset;
return [3 /*break*/, 1];
case 3:
this.maybeRecoverRoot();
if (this.context.lookup(PDFRef_1.default.of(0))) {
console.warn('Removing parsed object: 0 0 R');
this.context.delete(PDFRef_1.default.of(0));
}
return [2 /*return*/, this.context];
}
});
});
};
PDFParser.prototype.maybeRecoverRoot = function () {
var isValidCatalog = function (obj) {
return obj instanceof PDFDict_1.default &&
obj.lookup(PDFName_1.default.of('Type')) === PDFName_1.default.of('Catalog');
};
var catalog = this.context.lookup(this.context.trailerInfo.Root);
if (!isValidCatalog(catalog)) {
var indirectObjects = this.context.enumerateIndirectObjects();
for (var idx = 0, len = indirectObjects.length; idx < len; idx++) {
var _a = indirectObjects[idx], ref = _a[0], object = _a[1];
if (isValidCatalog(object)) {
this.context.trailerInfo.Root = ref;
}
}
}
};
PDFParser.prototype.parseHeader = function () {
while (!this.bytes.done()) {
if (this.matchKeyword(Keywords_1.Keywords.header)) {
var major = this.parseRawInt();
this.bytes.assertNext(CharCodes_1.default.Period);
var minor = this.parseRawInt();
var header = PDFHeader_1.default.forVersion(major, minor);
this.skipBinaryHeaderComment();
return header;
}
this.bytes.next();
}
throw new errors_1.MissingPDFHeaderError(this.bytes.position());
};
PDFParser.prototype.parseIndirectObjectHeader = function () {
this.skipWhitespaceAndComments();
var objectNumber = this.parseRawInt();
this.skipWhitespaceAndComments();
var generationNumber = this.parseRawInt();
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.obj)) {
throw new errors_1.MissingKeywordError(this.bytes.position(), Keywords_1.Keywords.obj);
}
return PDFRef_1.default.of(objectNumber, generationNumber);
};
PDFParser.prototype.matchIndirectObjectHeader = function () {
var initialOffset = this.bytes.offset();
try {
this.parseIndirectObjectHeader();
return true;
}
catch (e) {
this.bytes.moveTo(initialOffset);
return false;
}
};
PDFParser.prototype.parseIndirectObject = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var ref, object;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
ref = this.parseIndirectObjectHeader();
this.skipWhitespaceAndComments();
object = this.parseObject();
this.skipWhitespaceAndComments();
// if (!this.matchKeyword(Keywords.endobj)) {
// throw new MissingKeywordError(this.bytes.position(), Keywords.endobj);
// }
// TODO: Log a warning if this fails...
this.matchKeyword(Keywords_1.Keywords.endobj);
if (!(object instanceof PDFRawStream_1.default &&
object.dict.lookup(PDFName_1.default.of('Type')) === PDFName_1.default.of('ObjStm'))) return [3 /*break*/, 2];
return [4 /*yield*/, PDFObjectStreamParser_1.default.forStream(object, this.shouldWaitForTick).parseIntoContext()];
case 1:
_a.sent();
return [3 /*break*/, 3];
case 2:
if (object instanceof PDFRawStream_1.default &&
object.dict.lookup(PDFName_1.default.of('Type')) === PDFName_1.default.of('XRef')) {
PDFXRefStreamParser_1.default.forStream(object).parseIntoContext();
}
else {
this.context.assign(ref, object);
}
_a.label = 3;
case 3: return [2 /*return*/, ref];
}
});
});
};
// TODO: Improve and clean this up
PDFParser.prototype.tryToParseInvalidIndirectObject = function () {
var startPos = this.bytes.position();
var msg = "Trying to parse invalid object: " + JSON.stringify(startPos) + ")";
if (this.throwOnInvalidObject)
throw new Error(msg);
console.warn(msg);
var ref = this.parseIndirectObjectHeader();
console.warn("Invalid object ref: " + ref);
this.skipWhitespaceAndComments();
var start = this.bytes.offset();
var failed = true;
while (!this.bytes.done()) {
if (this.matchKeyword(Keywords_1.Keywords.endobj)) {
failed = false;
}
if (!failed)
break;
this.bytes.next();
}
if (failed)
throw new errors_1.PDFInvalidObjectParsingError(startPos);
var end = this.bytes.offset() - Keywords_1.Keywords.endobj.length;
var object = PDFInvalidObject_1.default.of(this.bytes.slice(start, end));
this.context.assign(ref, object);
return ref;
};
PDFParser.prototype.parseIndirectObjects = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var initialOffset, e_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
this.skipWhitespaceAndComments();
_a.label = 1;
case 1:
if (!(!this.bytes.done() && Numeric_1.IsDigit[this.bytes.peek()])) return [3 /*break*/, 8];
initialOffset = this.bytes.offset();
_a.label = 2;
case 2:
_a.trys.push([2, 4, , 5]);
return [4 /*yield*/, this.parseIndirectObject()];
case 3:
_a.sent();
return [3 /*break*/, 5];
case 4:
e_1 = _a.sent();
// TODO: Add tracing/logging mechanism to track when this happens!
this.bytes.moveTo(initialOffset);
this.tryToParseInvalidIndirectObject();
return [3 /*break*/, 5];
case 5:
this.skipWhitespaceAndComments();
// TODO: Can this be done only when needed, to avoid harming performance?
this.skipJibberish();
if (!this.shouldWaitForTick()) return [3 /*break*/, 7];
return [4 /*yield*/, utils_1.waitForTick()];
case 6:
_a.sent();
_a.label = 7;
case 7: return [3 /*break*/, 1];
case 8: return [2 /*return*/];
}
});
});
};
PDFParser.prototype.maybeParseCrossRefSection = function () {
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.xref))
return;
this.skipWhitespaceAndComments();
var objectNumber = -1;
var xref = PDFCrossRefSection_1.default.createEmpty();
while (!this.bytes.done() && Numeric_1.IsDigit[this.bytes.peek()]) {
var firstInt = this.parseRawInt();
this.skipWhitespaceAndComments();
var secondInt = this.parseRawInt();
this.skipWhitespaceAndComments();
var byte = this.bytes.peek();
if (byte === CharCodes_1.default.n || byte === CharCodes_1.default.f) {
var ref = PDFRef_1.default.of(objectNumber, secondInt);
if (this.bytes.next() === CharCodes_1.default.n) {
xref.addEntry(ref, firstInt);
}
else {
// this.context.delete(ref);
xref.addDeletedEntry(ref, firstInt);
}
objectNumber += 1;
}
else {
objectNumber = firstInt;
}
this.skipWhitespaceAndComments();
}
return xref;
};
PDFParser.prototype.maybeParseTrailerDict = function () {
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.trailer))
return;
this.skipWhitespaceAndComments();
var dict = this.parseDict();
var context = this.context;
context.trailerInfo = {
Root: dict.get(PDFName_1.default.of('Root')) || context.trailerInfo.Root,
Encrypt: dict.get(PDFName_1.default.of('Encrypt')) || context.trailerInfo.Encrypt,
Info: dict.get(PDFName_1.default.of('Info')) || context.trailerInfo.Info,
ID: dict.get(PDFName_1.default.of('ID')) || context.trailerInfo.ID,
};
};
PDFParser.prototype.maybeParseTrailer = function () {
this.skipWhitespaceAndComments();
if (!this.matchKeyword(Keywords_1.Keywords.startxref))
return;
this.skipWhitespaceAndComments();
var offset = this.parseRawInt();
this.skipWhitespace();
this.matchKeyword(Keywords_1.Keywords.eof);
this.skipWhitespaceAndComments();
this.matchKeyword(Keywords_1.Keywords.eof);
this.skipWhitespaceAndComments();
return PDFTrailer_1.default.forLastCrossRefSectionOffset(offset);
};
PDFParser.prototype.parseDocumentSection = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.parseIndirectObjects()];
case 1:
_a.sent();
this.maybeParseCrossRefSection();
this.maybeParseTrailerDict();
this.maybeParseTrailer();
// TODO: Can this be done only when needed, to avoid harming performance?
this.skipJibberish();
return [2 /*return*/];
}
});
});
};
/**
* This operation is not necessary for valid PDF files. But some invalid PDFs
* contain jibberish in between indirect objects. This method is designed to
* skip past that jibberish, should it exist, until it reaches the next
* indirect object header, an xref table section, or the file trailer.
*/
PDFParser.prototype.skipJibberish = function () {
this.skipWhitespaceAndComments();
while (!this.bytes.done()) {
var initialOffset = this.bytes.offset();
var byte = this.bytes.peek();
var isAlphaNumeric = byte >= CharCodes_1.default.Space && byte <= CharCodes_1.default.Tilde;
if (isAlphaNumeric) {
if (this.matchKeyword(Keywords_1.Keywords.xref) ||
this.matchKeyword(Keywords_1.Keywords.trailer) ||
this.matchKeyword(Keywords_1.Keywords.startxref) ||
this.matchIndirectObjectHeader()) {
this.bytes.moveTo(initialOffset);
break;
}
}
this.bytes.next();
}
};
/**
* Skips the binary comment following a PDF header. The specification
* defines this binary comment (section 7.5.2 File Header) as a sequence of 4
* or more bytes that are 128 or greater, and which are preceded by a "%".
*
* This would imply that to strip out this binary comment, we could check for
* a sequence of bytes starting with "%", and remove all subsequent bytes that
* are 128 or greater. This works for many documents that properly comply with
* the spec. But in the wild, there are PDFs that omit the leading "%", and
* include bytes that are less than 128 (e.g. 0 or 1). So in order to parse
* these headers correctly, we just throw out all bytes leading up to the
* first indirect object header.
*/
PDFParser.prototype.skipBinaryHeaderComment = function () {
this.skipWhitespaceAndComments();
try {
var initialOffset = this.bytes.offset();
this.parseIndirectObjectHeader();
this.bytes.moveTo(initialOffset);
}
catch (e) {
this.bytes.next();
this.skipWhitespaceAndComments();
}
};
PDFParser.forBytesWithOptions = function (pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers) {
return new PDFParser(pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers);
};
return PDFParser;
}(PDFObjectParser_1.default));
exports.default = PDFParser;
//# sourceMappingURL=PDFParser.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
import PDFRawStream from "../objects/PDFRawStream";
import PDFRef from "../objects/PDFRef";
export interface Entry {
ref: PDFRef;
offset: number;
deleted: boolean;
inObjectStream: boolean;
}
declare class PDFXRefStreamParser {
static forStream: (rawStream: PDFRawStream) => PDFXRefStreamParser;
private alreadyParsed;
private readonly dict;
private readonly context;
private readonly bytes;
private readonly subsections;
private readonly byteWidths;
constructor(rawStream: PDFRawStream);
parseIntoContext(): Entry[];
private parseEntries;
}
export default PDFXRefStreamParser;
//# sourceMappingURL=PDFXRefStreamParser.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFXRefStreamParser.d.ts","sourceRoot":"","sources":["../../../src/core/parser/PDFXRefStreamParser.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,gCAAsC;AACzD,OAAO,MAAM,0BAAgC;AAI7C,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,cAAM,mBAAmB;IACvB,MAAM,CAAC,SAAS,cAAe,YAAY,yBACN;IAErC,OAAO,CAAC,aAAa,CAAU;IAE/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IACJ,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;gBAE1C,SAAS,EAAE,YAAY;IA4BnC,gBAAgB,IAAI,KAAK,EAAE;IAuB3B,OAAO,CAAC,YAAY;CA4CrB;AAED,eAAe,mBAAmB,CAAC"}

View File

@@ -0,0 +1,92 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
var PDFArray_1 = tslib_1.__importDefault(require("../objects/PDFArray"));
var PDFName_1 = tslib_1.__importDefault(require("../objects/PDFName"));
var PDFNumber_1 = tslib_1.__importDefault(require("../objects/PDFNumber"));
var PDFRef_1 = tslib_1.__importDefault(require("../objects/PDFRef"));
var ByteStream_1 = tslib_1.__importDefault(require("./ByteStream"));
var PDFXRefStreamParser = /** @class */ (function () {
function PDFXRefStreamParser(rawStream) {
this.alreadyParsed = false;
this.dict = rawStream.dict;
this.bytes = ByteStream_1.default.fromPDFRawStream(rawStream);
this.context = this.dict.context;
var Size = this.dict.lookup(PDFName_1.default.of('Size'), PDFNumber_1.default);
var Index = this.dict.lookup(PDFName_1.default.of('Index'));
if (Index instanceof PDFArray_1.default) {
this.subsections = [];
for (var idx = 0, len = Index.size(); idx < len; idx += 2) {
var firstObjectNumber = Index.lookup(idx + 0, PDFNumber_1.default).asNumber();
var length_1 = Index.lookup(idx + 1, PDFNumber_1.default).asNumber();
this.subsections.push({ firstObjectNumber: firstObjectNumber, length: length_1 });
}
}
else {
this.subsections = [{ firstObjectNumber: 0, length: Size.asNumber() }];
}
var W = this.dict.lookup(PDFName_1.default.of('W'), PDFArray_1.default);
this.byteWidths = [-1, -1, -1];
for (var idx = 0, len = W.size(); idx < len; idx++) {
this.byteWidths[idx] = W.lookup(idx, PDFNumber_1.default).asNumber();
}
}
PDFXRefStreamParser.prototype.parseIntoContext = function () {
if (this.alreadyParsed) {
throw new errors_1.ReparseError('PDFXRefStreamParser', 'parseIntoContext');
}
this.alreadyParsed = true;
this.context.trailerInfo = {
Root: this.dict.get(PDFName_1.default.of('Root')),
Encrypt: this.dict.get(PDFName_1.default.of('Encrypt')),
Info: this.dict.get(PDFName_1.default.of('Info')),
ID: this.dict.get(PDFName_1.default.of('ID')),
};
var entries = this.parseEntries();
// for (let idx = 0, len = entries.length; idx < len; idx++) {
// const entry = entries[idx];
// if (entry.deleted) this.context.delete(entry.ref);
// }
return entries;
};
PDFXRefStreamParser.prototype.parseEntries = function () {
var entries = [];
var _a = this.byteWidths, typeFieldWidth = _a[0], offsetFieldWidth = _a[1], genFieldWidth = _a[2];
for (var subsectionIdx = 0, subsectionLen = this.subsections.length; subsectionIdx < subsectionLen; subsectionIdx++) {
var _b = this.subsections[subsectionIdx], firstObjectNumber = _b.firstObjectNumber, length_2 = _b.length;
for (var objIdx = 0; objIdx < length_2; objIdx++) {
var type = 0;
for (var idx = 0, len = typeFieldWidth; idx < len; idx++) {
type = (type << 8) | this.bytes.next();
}
var offset = 0;
for (var idx = 0, len = offsetFieldWidth; idx < len; idx++) {
offset = (offset << 8) | this.bytes.next();
}
var generationNumber = 0;
for (var idx = 0, len = genFieldWidth; idx < len; idx++) {
generationNumber = (generationNumber << 8) | this.bytes.next();
}
// When the `type` field is absent, it defaults to 1
if (typeFieldWidth === 0)
type = 1;
var objectNumber = firstObjectNumber + objIdx;
var entry = {
ref: PDFRef_1.default.of(objectNumber, generationNumber),
offset: offset,
deleted: type === 0,
inObjectStream: type === 2,
};
entries.push(entry);
}
}
return entries;
};
PDFXRefStreamParser.forStream = function (rawStream) {
return new PDFXRefStreamParser(rawStream);
};
return PDFXRefStreamParser;
}());
exports.default = PDFXRefStreamParser;
//# sourceMappingURL=PDFXRefStreamParser.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PDFXRefStreamParser.js","sourceRoot":"","sources":["../../../src/core/parser/PDFXRefStreamParser.ts"],"names":[],"mappings":"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"}