From 20770cb06abbde69dd5dcf13a88b795d28723a34 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 29 May 2021 18:06:49 +0200 Subject: [PATCH 1/2] Improve text-selection for Type3 fonts with empty /FontBBox-entries (issue 6605) For Type3 fonts where the /CharProcs-streams of the individual glyph starts with a `d1` operator, we can use that to build a fallback bounding box for the font and thus improve text-selection in some cases. --- src/core/evaluator.js | 28 +++++++++++++++++++++++----- test/pdfs/.gitignore | 1 + test/pdfs/issue6605.pdf | Bin 0 -> 174718 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 test/pdfs/issue6605.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 51c0c511c..ab8fc66dc 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2115,7 +2115,7 @@ class PartialEvaluator { if ( font.isType3Font && - textState.fontSize <= 1 && + (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX) ) { const glyphHeight = font.bbox[3] - font.bbox[1]; @@ -3815,7 +3815,7 @@ class PartialEvaluator { firstChar, lastChar, toUnicode, - bbox: descriptor.getArray("FontBBox"), + bbox: descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), ascent: descriptor.get("Ascent"), descent: descriptor.get("Descent"), xHeight: descriptor.get("XHeight"), @@ -3962,6 +3962,9 @@ class TranslatedFont { const fontResources = this.dict.get("Resources") || resources; const charProcOperatorList = Object.create(null); + const isEmptyBBox = + !translatedFont.bbox || isArrayEqual(translatedFont.bbox, [0, 0, 0, 0]); + for (const key of charProcs.getKeys()) { loadCharProcsPromise = loadCharProcsPromise.then(() => { const glyphStream = charProcs.get(key); @@ -3981,7 +3984,7 @@ class TranslatedFont { // colour-related parameters) in the graphics state; // any use of such operators shall be ignored." if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { - this._removeType3ColorOperators(operatorList); + this._removeType3ColorOperators(operatorList, isEmptyBBox); } charProcOperatorList[key] = operatorList.getIR(); @@ -3996,8 +3999,12 @@ class TranslatedFont { }); }); } - this.type3Loaded = loadCharProcsPromise.then(function () { + this.type3Loaded = loadCharProcsPromise.then(() => { translatedFont.charProcOperatorList = charProcOperatorList; + if (this._bbox) { + translatedFont.isCharBBox = true; + translatedFont.bbox = this._bbox; + } }); return this.type3Loaded; } @@ -4005,7 +4012,7 @@ class TranslatedFont { /** * @private */ - _removeType3ColorOperators(operatorList) { + _removeType3ColorOperators(operatorList, isEmptyBBox = false) { if ( typeof PDFJSDev === "undefined" || PDFJSDev.test("!PRODUCTION || TESTING") @@ -4015,6 +4022,17 @@ class TranslatedFont { "Type3 glyph shall start with the d1 operator." ); } + if (isEmptyBBox) { + if (!this._bbox) { + this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; + } + const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)); + + this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); + this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); + this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); + this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); + } let i = 1, ii = operatorList.length; while (i < ii) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d42280b85..30b829844 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -437,6 +437,7 @@ !quadpoints.pdf !transparent.pdf !xobject-image.pdf +!issue6605.pdf !ccitt_EndOfBlock_false.pdf !issue9972-1.pdf !issue9972-2.pdf diff --git a/test/pdfs/issue6605.pdf b/test/pdfs/issue6605.pdf new file mode 100644 index 0000000000000000000000000000000000000000..529f9ccd666baa66c1ea9b2d644de4e974e3978a GIT binary patch literal 174718 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%0AXA9UUh{xYUyR$Cwy43MRFL+b$ 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index a4afb11b4..f089bfd05 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -4935,6 +4935,12 @@ "type": "eq", "annotations": true }, + { "id": "issue6605", + "file": "pdfs/issue6605.pdf", + "md5": "67158a9c6d0e966ece55f7c433e18cc5", + "rounds": 1, + "type": "text" + }, { "id": "annotation-choice-widget-forms", "file": "pdfs/annotation-choice-widget.pdf", "md5": "7dfb0d743a0da0f4a71b209ab43b0be5", From eefc94ceb7443febb4b48b789f0551ba7894efc1 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 29 May 2021 20:01:52 +0200 Subject: [PATCH 2/2] Ensure that we fully load Type3 fonts in `PartialEvaluator.getTextContent` This is necessary now, since with the previous patch the /FontBBox potentially depends on the contents of the /CharProcs-streams. Note that if `getOperatorList` is called *before* `getTextContent`, this patch doesn't matter since the font is already fully loaded/parsed. However, for e.g. the `text` test-cases this is necessary to ensure correct reference images. --- src/core/evaluator.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index ab8fc66dc..e7705418f 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2251,6 +2251,20 @@ class PartialEvaluator { function handleSetFont(fontName, fontRef) { return self .loadFont(fontName, fontRef, resources) + .then(function (translated) { + if (!translated.font.isType3Font) { + return translated; + } + return translated + .loadType3Data(self, resources, task) + .catch(function () { + // Ignore Type3-parsing errors, since we only use `loadType3Data` + // here to ensure that we'll always obtain a useful /FontBBox. + }) + .then(function () { + return translated; + }); + }) .then(function (translated) { textState.font = translated.font; textState.fontMatrix =