From 835d8c2be50d29c633305e66d2b8ea734af596ab Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 31 Oct 2019 15:53:51 +0100 Subject: [PATCH] Allow skipping of errors when parsing broken/unsupported ColorSpaces (issue 6707, issue 11287) This will allow us to attempt to recover as much as possible of a page, rather than immediately failing, when a broken/unsupported ColorSpace is encountered. This patch thus extends the framework added in PRs such as e.g. 8240 and 8922, to also cover parsing of ColorSpaces. --- src/core/evaluator.js | 65 ++++++++++++++++++++++++----------- test/pdfs/issue11287.pdf.link | 1 + test/test_manifest.json | 8 +++++ 3 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 test/pdfs/issue11287.pdf.link diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 8cb6d12a9b8d8..7cee78a9d56a3 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -289,11 +289,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return false; }, - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { + async buildFormXObject(resources, xobj, smask, operatorList, task, + initialState) { var dict = xobj.dict; var matrix = dict.getArray('Matrix'); var bbox = dict.getArray('BBox'); @@ -318,14 +315,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { groupOptions.isolated = (group.get('I') || false); groupOptions.knockout = (group.get('K') || false); if (group.has('CS')) { - colorSpace = group.get('CS'); - if (colorSpace) { - colorSpace = ColorSpace.parse(colorSpace, this.xref, resources, - this.pdfFunctionFactory); - } else { - warn('buildFormXObject - invalid/non-existent Group /CS entry: ' + - group.getRaw('CS')); - } + colorSpace = await this.parseColorSpace({ + cs: group.get('CS'), + resources, + }); } } @@ -934,6 +927,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } }, + parseColorSpace({ cs, resources, }) { + return new Promise((resolve) => { + resolve(ColorSpace.parse(cs, this.xref, resources, + this.pdfFunctionFactory)); + }).catch((reason) => { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + // Error(s) in the ColorSpace -- sending unsupported feature + // notification and allow rendering to continue. + this.handler.send('UnsupportedFeature', + { featureId: UNSUPPORTED_FEATURES.unknown, }); + warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + return null; + } + throw reason; + }); + }, + async handleColorN(operatorList, fn, args, cs, patterns, resources, task) { // compile tiling patterns var patternName = args[args.length - 1]; @@ -1158,15 +1171,25 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { break; case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources, - self.pdfFunctionFactory); - continue; + next(self.parseColorSpace({ + cs: args[0], + resources, + }).then(function(colorSpace) { + if (colorSpace) { + stateManager.state.fillColorSpace = colorSpace; + } + })); + return; case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources, - self.pdfFunctionFactory); - continue; + next(self.parseColorSpace({ + cs: args[0], + resources, + }).then(function(colorSpace) { + if (colorSpace) { + stateManager.state.strokeColorSpace = colorSpace; + } + })); + return; case OPS.setFillColor: cs = stateManager.state.fillColorSpace; args = cs.getRgb(args, 0); diff --git a/test/pdfs/issue11287.pdf.link b/test/pdfs/issue11287.pdf.link new file mode 100644 index 0000000000000..34c88f740e184 --- /dev/null +++ b/test/pdfs/issue11287.pdf.link @@ -0,0 +1 @@ +https://github.com/mozilla/pdf.js/files/3786520/FLEXSTEEL.PIPELINE.TECHNOLOGIES.INC.vs.FEDON.DARREN.LOUIS.201834640.No.80265332.Texas.State.Harris.County.113th.District.Court.Jun.7.2018.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 28915f974e356..d7850a650613c 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2977,6 +2977,14 @@ "link": false, "type": "eq" }, + { "id": "issue11287", + "file": "pdfs/issue11287.pdf", + "md5": "d7d6a7c124fad7b00f79112b71ee09d6", + "rounds": 1, + "link": true, + "lastPage": 1, + "type": "eq" + }, { "id": "issue4890", "file": "pdfs/issue4890.pdf", "md5": "1666feb4cd26318c2bdbea6a175dce87",