From 4b7eb1436d6577f664796b51d29b3b82b535e15c Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Tue, 28 Mar 2023 17:48:09 +0200 Subject: [PATCH] Thin whitespaces must have their own span --- src/core/evaluator.js | 73 +++++++++++++++++++++++++-------------- test/pdfs/.gitignore | 1 + test/pdfs/issue16224.pdf | Bin 0 -> 14724 bytes test/test_manifest.json | 7 ++++ 4 files changed, 55 insertions(+), 26 deletions(-) create mode 100755 test/pdfs/issue16224.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 748914b76..bddbe7615 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2311,6 +2311,13 @@ class PartialEvaluator { return ret; } + function shouldAddWhitepsace() { + return ( + twoLastChars[twoLastCharsPos] !== " " && + twoLastChars[(twoLastCharsPos + 1) % 2] === " " + ); + } + function resetLastChars() { twoLastChars[0] = twoLastChars[1] = " "; twoLastCharsPos = 0; @@ -2360,6 +2367,23 @@ class PartialEvaluator { let textState; + function pushWhitespace({ + width = 0, + height = 0, + transform = textContentItem.prevTransform, + fontName = textContentItem.fontName, + }) { + textContent.items.push({ + str: " ", + dir: "ltr", + width, + height, + transform, + fontName, + hasEOL: false, + }); + } + function getCurrentTextTransform() { // 9.4.4 Text Space Details const font = textState.font; @@ -2631,7 +2655,16 @@ class PartialEvaluator { } if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { - textContentItem.height += advanceY; + if (shouldAddWhitepsace()) { + // The space is very thin, hence it deserves to have its own span in + // order to avoid too much shift between the canvas and the text + // layer. + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ height: Math.abs(advanceY) }); + } else { + textContentItem.height += advanceY; + } } else if ( !addFakeSpaces( advanceY, @@ -2641,15 +2674,7 @@ class PartialEvaluator { ) { if (textContentItem.str.length === 0) { resetLastChars(); - textContent.items.push({ - str: " ", - dir: "ltr", - width: 0, - height: Math.abs(advanceY), - transform: textContentItem.prevTransform, - fontName: textContentItem.fontName, - hasEOL: false, - }); + pushWhitespace({ height: Math.abs(advanceY) }); } else { textContentItem.height += advanceY; } @@ -2696,21 +2721,22 @@ class PartialEvaluator { } if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { - textContentItem.width += advanceX; + if (shouldAddWhitepsace()) { + // The space is very thin, hence it deserves to have its own span in + // order to avoid too much shift between the canvas and the text + // layer. + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ width: Math.abs(advanceX) }); + } else { + textContentItem.width += advanceX; + } } else if ( !addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation) ) { if (textContentItem.str.length === 0) { resetLastChars(); - textContent.items.push({ - str: " ", - dir: "ltr", - width: Math.abs(advanceX), - height: 0, - transform: textContentItem.prevTransform, - fontName: textContentItem.fontName, - hasEOL: false, - }); + pushWhitespace({ width: Math.abs(advanceX) }); } else { textContentItem.width += advanceX; } @@ -2872,16 +2898,11 @@ class PartialEvaluator { flushTextContentItem(); resetLastChars(); - textContent.items.push({ - str: " ", - // TODO: check if using the orientation from last chunk is - // better or not. - dir: "ltr", + pushWhitespace({ width: Math.abs(width), height: Math.abs(height), transform: transf || getCurrentTextTransform(), fontName, - hasEOL: false, }); return true; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 7756d4512..faace5c91 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -582,3 +582,4 @@ !issue16067.pdf !bug1820909.1.pdf !issue16221.pdf +!issue16224.pdf diff --git a/test/pdfs/issue16224.pdf b/test/pdfs/issue16224.pdf new file mode 100755 index 0000000000000000000000000000000000000000..97a0794b86f23cd3b1f656e2d603da83a97eb2fa GIT binary patch literal 14724 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index ba6324c3c..12abd2808 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -7517,5 +7517,12 @@ "md5": "62d93c9b3aa4ba3af5446504632e78a5", "rounds": 1, "type": "text" + }, + { + "id": "issue16224-text", + "file": "pdfs/issue16224.pdf", + "md5": "1aa34fbb2154f9a647c7fa9e90db0eff", + "rounds": 1, + "type": "text" } ]