: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
const length = array.length;
const operator = this.xref.fetchIfRef(array[0]);
if (length < 2 || !(operator instanceof Name)) {
warn("Invalid visibility expression");
currentResult.push(operator.name);
warn(`Invalid operator ${operator.name} in visibility expression`);
for (let i = 1; i < length; i++) {
const object = this.xref.fetchIfRef(raw);
if (Array.isArray(object)) {
currentResult.push(nestedResult);
this._parseVisibilityExpression(object, nestingCounter, nestedResult);
} else if (raw instanceof Ref) {
currentResult.push(raw.toString());
async parseMarkedContentProps(contentProperties, resources) {
if (contentProperties instanceof Name) {
const properties = resources.get("Properties");
optionalContent = properties.get(contentProperties.name);
} else if (contentProperties instanceof Dict) {
optionalContent = contentProperties;
throw new FormatError("Optional content properties malformed.");
const optionalContentType = optionalContent.get("Type")?.name;
if (optionalContentType === "OCG") {
type: optionalContentType,
id: optionalContent.objId
} else if (optionalContentType === "OCMD") {
const expression = optionalContent.get("VE");
if (Array.isArray(expression)) {
this._parseVisibilityExpression(expression, 0, result);
const optionalContentGroups = optionalContent.get("OCGs");
if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) {
if (Array.isArray(optionalContentGroups)) {
for (const ocg of optionalContentGroups) {
groupIds.push(ocg.toString());
groupIds.push(optionalContentGroups.objId);
type: optionalContentType,
policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null,
} else if (optionalContentGroups instanceof Ref) {
type: optionalContentType,
id: optionalContentGroups.toString()
resources ||= Dict.empty;
initialState ||= new EvalState();
throw new Error('getOperatorList: missing "operatorList" parameter');
const localImageCache = new LocalImageCache();
const localColorSpaceCache = new LocalColorSpaceCache();
const localGStateCache = new LocalGStateCache();
const localTilingPatternCache = new LocalTilingPatternCache();
const localShadingPatternCache = new Map();
const xobjs = resources.get("XObject") || Dict.empty;
const patterns = resources.get("Pattern") || Dict.empty;
const stateManager = new StateManager(initialState);
const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
const timeSlotManager = new TimeSlotManager();
function closePendingRestoreOPS(argument) {
for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
operatorList.addOp(OPS.restore, []);
return new Promise(function promiseBody(resolve, reject) {
const next = function (promise) {
Promise.all([promise, operatorList.ready]).then(function () {
promiseBody(resolve, reject);
task.ensureNotTerminated();
let stop, i, ii, cs, name, isValidName;
while (!(stop = timeSlotManager.check())) {
if (!preprocessor.read(operation)) {
let args = operation.args;
isValidName = args[0] instanceof Name;
const localImage = localImageCache.getByName(name);
operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent);
incrementCachedImageMaskCount(localImage);
next(new Promise(function (resolveXObject, rejectXObject) {
throw new FormatError("XObject must be referred to by name.");
let xobj = xobjs.getRaw(name);
if (xobj instanceof Ref) {
const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj);
operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent);
incrementCachedImageMaskCount(localImage);
const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
operatorList.addDependency(globalImage.objId);
operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent);
if (!(xobj instanceof BaseStream)) {
throw new FormatError("XObject should be a stream");
const type = xobj.dict.get("Subtype");
if (!(type instanceof Name)) {
throw new FormatError("XObject should have a Name subtype");
if (type.name === "Form") {
self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () {
} else if (type.name === "Image") {
self.buildPaintImageXObject({
}).then(resolveXObject, rejectXObject);
} else if (type.name === "PS") {
info("Ignored XObject subtype PS");
throw new FormatError(`Unhandled XObject subtype ${type.name}`);
}).catch(function (reason) {
if (reason instanceof AbortException) {
if (self.options.ignoreErrors) {
warn(`getOperatorList - ignoring XObject: "${reason}".`);
next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) {
operatorList.addDependency(loadedName);
operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
var cacheKey = args[0].cacheKey;
const localImage = localImageCache.getByName(cacheKey);
operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent);
incrementCachedImageMaskCount(localImage);
next(self.buildPaintImageXObject({
if (!stateManager.state.font) {
self.ensureStateFont(stateManager.state);
args[0] = self.handleText(args[0], stateManager.state);
if (!stateManager.state.font) {
self.ensureStateFont(stateManager.state);
var state = stateManager.state;
for (const arrItem of args[0]) {
if (typeof arrItem === "string") {
combinedGlyphs.push(...self.handleText(arrItem, state));
} else if (typeof arrItem === "number") {
combinedGlyphs.push(arrItem);
args[0] = combinedGlyphs;
case OPS.nextLineShowText:
if (!stateManager.state.font) {
self.ensureStateFont(stateManager.state);
operatorList.addOp(OPS.nextLine);
args[0] = self.handleText(args[0], stateManager.state);
case OPS.nextLineSetSpacingShowText:
if (!stateManager.state.font) {
self.ensureStateFont(stateManager.state);
operatorList.addOp(OPS.nextLine);
operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
args[0] = self.handleText(args[0], stateManager.state);
case OPS.setTextRenderingMode:
stateManager.state.textRenderingMode = args[0];
case OPS.setFillColorSpace:
const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache);
stateManager.state.fillColorSpace = cachedColorSpace;
next(self.parseColorSpace({
}).then(function (colorSpace) {
stateManager.state.fillColorSpace = colorSpace;
case OPS.setStrokeColorSpace:
const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache);
stateManager.state.strokeColorSpace = cachedColorSpace;
next(self.parseColorSpace({
}).then(function (colorSpace) {
stateManager.state.strokeColorSpace = colorSpace;
cs = stateManager.state.fillColorSpace;
args = cs.getRgb(args, 0);
fn = OPS.setFillRGBColor;
cs = stateManager.state.strokeColorSpace;
args = cs.getRgb(args, 0);
fn = OPS.setStrokeRGBColor;
stateManager.state.fillColorSpace = ColorSpace.singletons.gray;
args = ColorSpace.singletons.gray.getRgb(args, 0);
fn = OPS.setFillRGBColor;
stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;
args = ColorSpace.singletons.gray.getRgb(args, 0);
fn = OPS.setStrokeRGBColor;
case OPS.setFillCMYKColor:
stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;
args = ColorSpace.singletons.cmyk.getRgb(args, 0);
fn = OPS.setFillRGBColor;
case OPS.setStrokeCMYKColor:
stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;
args = ColorSpace.singletons.cmyk.getRgb(args, 0);
fn = OPS.setStrokeRGBColor;
case OPS.setFillRGBColor:
stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;
args = ColorSpace.singletons.rgb.getRgb(args, 0);
case OPS.setStrokeRGBColor:
stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;
args = ColorSpace.singletons.rgb.getRgb(args, 0);
cs = stateManager.state.fillColorSpace;
if (cs.name === "Pattern") {
next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
args = cs.getRgb(args, 0);
fn = OPS.setFillRGBColor;
case OPS.setStrokeColorN:
cs = stateManager.state.strokeColorSpace;
if (cs.name === "Pattern") {
next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
args = cs.getRgb(args, 0);
fn = OPS.setStrokeRGBColor;
var shadingRes = resources.get("Shading");
throw new FormatError("No shading resource found");
var shading = shadingRes.get(args[0].name);
throw new FormatError("No shading object found");
const patternId = self.parseShading({
isValidName = args[0] instanceof Name;
const localGStateObj = localGStateCache.getByName(name);
if (localGStateObj.length > 0) {
operatorList.addOp(OPS.setGState, [localGStateObj]);
next(new Promise(function (resolveGState, rejectGState) {
throw new FormatError("GState must be referred to by name.");
const extGState = resources.get("ExtGState");
if (!(extGState instanceof Dict)) {
throw new FormatError("ExtGState should be a dictionary.");
const gState = extGState.get(name);
if (!(gState instanceof Dict)) {
throw new FormatError("GState should be a dictionary.");
}).then(resolveGState, rejectGState);
}).catch(function (reason) {
if (reason instanceof AbortException) {
if (self.options.ignoreErrors) {
warn(`getOperatorList - ignoring ExtGState: "${reason}".`);
self.buildPath(operatorList, fn, args, parsingText);
case OPS.beginMarkedContentProps:
if (!(args[0] instanceof Name)) {
warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`);
operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
if (args[0].name === "OC") {
next(self.parseMarkedContentProps(args[1], resources).then(data => {
operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]);
if (reason instanceof AbortException) {
if (self.options.ignoreErrors) {
warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`);
operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null];
case OPS.beginMarkedContent:
case OPS.endMarkedContent:
for (i = 0, ii = args.length; i < ii; i++) {
if (args[i] instanceof Dict) {
warn("getOperatorList - ignoring operator: " + fn);