From 3a7004ca25d9df656a60c08bd189feaef41c409f Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Wed, 26 Jan 2022 15:35:46 +0100 Subject: [PATCH] Take into account all rotations before comparing glyph positions - it aims to fix #14497; - previously, only rotations with an angle 0, 90, 180 or 270 were taken into account; - so generalize to any angle but keep the fast path for 0, 90, ... because they're likely more common than anything else. --- src/core/evaluator.js | 63 +++++++++++++++++++++++++-------------- test/pdfs/.gitignore | 1 + test/pdfs/issue14497.pdf | Bin 0 -> 33464 bytes test/test_manifest.json | 6 ++++ 4 files changed, 48 insertions(+), 22 deletions(-) create mode 100755 test/pdfs/issue14497.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 4838a29ea..3caf1929d 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2385,6 +2385,14 @@ class PartialEvaluator { }); } + function applyInverseRotation(x, y, matrix) { + const scale = Math.hypot(matrix[0], matrix[1]); + return [ + (matrix[0] * x + matrix[1] * y) / scale, + (matrix[2] * x + matrix[3] * y) / scale, + ]; + } + function compareWithLastPosition() { if ( !combineTextItems || @@ -2404,9 +2412,8 @@ class PartialEvaluator { return; } - let rotate = 0; + let rotate = -1; // Take into account the rotation is the current transform. - // Only rotations with an angle of 0, 90, 180 or 270 are considered. if ( currentTransform[0] && currentTransform[1] === 0 && @@ -2418,28 +2425,40 @@ class PartialEvaluator { currentTransform[0] === 0 && currentTransform[3] === 0 ) { - rotate += currentTransform[1] > 0 ? 90 : 270; + rotate = currentTransform[1] > 0 ? 90 : 270; } - if (rotate !== 0) { - switch (rotate) { - case 90: - [posX, posY] = [posY, posX]; - [lastPosX, lastPosY] = [lastPosY, lastPosX]; - break; - case 180: - [posX, posY, lastPosX, lastPosY] = [ - -posX, - -posY, - -lastPosX, - -lastPosY, - ]; - break; - case 270: - [posX, posY] = [-posY, -posX]; - [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; - break; - } + switch (rotate) { + case 0: + break; + case 90: + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; + break; + case 180: + [posX, posY, lastPosX, lastPosY] = [ + -posX, + -posY, + -lastPosX, + -lastPosY, + ]; + break; + case 270: + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; + break; + default: + // This is not a 0, 90, 180, 270 rotation so: + // - remove the scale factor from the matrix to get a rotation matrix + // - apply the inverse (which is the transposed) to the positions + // and we can then compare positions of the glyphes to detect + // a whitespace. + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation( + lastPosX, + lastPosY, + textContentItem.prevTransform + ); } if (textState.font.vertical) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 2627c9fc3..9a245d595 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -506,3 +506,4 @@ !poppler-90-0-fuzzed.pdf !issue14415.pdf !issue14307.pdf +!issue14497.pdf diff --git a/test/pdfs/issue14497.pdf b/test/pdfs/issue14497.pdf new file mode 100755 index 0000000000000000000000000000000000000000..cbc5e5de1a25ec06101014fb8ffed5c3f48bd17a GIT binary patch literal 33464 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 RY&8W01vW&W2$L}AKLDg3FnIs~ literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 6d397afc4..ad6d7c200 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -6238,5 +6238,11 @@ "link": true, "lastPage": 1, "type": "text" + }, + { "id": "issue14497", + "file": "pdfs/issue14497.pdf", + "md5": "7f795a92caa612117b6928f8bb4c5b65", + "rounds": 1, + "type": "text" } ]