From 65e514e063dee03e1a04e1b736a8874090ba28f2 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 2 Mar 2020 15:34:00 +0100 Subject: [PATCH] Ensure that there's always a setFont (Tf) operator before text rendering operators (issue 11651) The PDF document in question is *corrupt*, since it contains multiple instances of incorrect operators. We obviously don't want to slow down parsing of *all* documents (since most are valid), just to accommodate a particular bad PDF generator, hence the reason for the inline check before calling the `ensureStateFont` method. --- src/core/evaluator.js | 52 +++++++++++++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue11651.pdf | Bin 0 -> 23047 bytes test/test_manifest.json | 14 +++++++++++ 4 files changed, 67 insertions(+) create mode 100644 test/pdfs/issue11651.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index b0d79e88b..1fff07543 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -795,6 +795,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return glyphs; }, + ensureStateFont(state) { + if (state.font) { + return; + } + const reason = new FormatError( + "Missing setFont (Tf) operator before text rendering operator." + ); + + if (this.options.ignoreErrors) { + // Missing setFont operator before text rendering operator -- sending + // unsupported feature notification and allow rendering to continue. + this.handler.send("UnsupportedFeature", { + featureId: UNSUPPORTED_FEATURES.font, + }); + warn(`ensureStateFont: "${reason}".`); + return; + } + throw reason; + }, + setGState: function PartialEvaluator_setGState( resources, gState, @@ -1364,9 +1384,17 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { ); return; case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } args[0] = self.handleText(args[0], stateManager.state); break; case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } var arr = args[0]; var combinedGlyphs = []; var arrLength = arr.length; @@ -1386,11 +1414,19 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { fn = OPS.showText; break; case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } operatorList.addOp(OPS.nextLine); args[0] = self.handleText(args[0], stateManager.state); fn = OPS.showText; break; case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } operatorList.addOp(OPS.nextLine); operatorList.addOp(OPS.setWordSpacing, [args.shift()]); operatorList.addOp(OPS.setCharSpacing, [args.shift()]); @@ -2056,6 +2092,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { textState.textLineMatrix = IDENTITY_MATRIX.slice(); break; case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } var items = args[0]; var offset; for (var j = 0, jj = items.length; j < jj; j++) { @@ -2105,14 +2145,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } break; case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } buildTextContentItem(args[0]); break; case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } flushTextContentItem(); textState.carriageReturn(); buildTextContentItem(args[0]); break; case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } flushTextContentItem(); textState.wordSpacing = args[0]; textState.charSpacing = args[1]; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d2db531b2..6635f1eb2 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -89,6 +89,7 @@ !issue11279.pdf !issue11362.pdf !issue11578_reduced.pdf +!issue11651.pdf !bad-PageLabels.pdf !decodeACSuccessive.pdf !filled-background.pdf diff --git a/test/pdfs/issue11651.pdf b/test/pdfs/issue11651.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c492852708afbaf7d63cafecef192e32d9e8b7b GIT binary patch literal 23047 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 dL@CzDXTz4MD)!J{t0Phs)GOk literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 71c4bafe3..4a8be1a46 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -67,6 +67,20 @@ "link": false, "type": "eq" }, + { "id": "issue11651-eq", + "file": "pdfs/issue11651.pdf", + "md5": "375233ad8dc4181a06148f8412f35b91", + "rounds": 1, + "link": false, + "type": "eq" + }, + { "id": "issue11651-text", + "file": "pdfs/issue11651.pdf", + "md5": "375233ad8dc4181a06148f8412f35b91", + "rounds": 1, + "link": false, + "type": "text" + }, { "id": "issue1293", "file": "pdfs/issue1293r.pdf", "md5": "4a098f5051f34fab036f5bbe88f8deef",