From 8ea27ce157217baf14ae43f815ca36eda45d9138 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald <jonas.jenwald@gmail.com> Date: Sat, 18 Sep 2021 22:28:23 +0200 Subject: [PATCH] Tweak how fonts with an /Encoding are handled in `adjustToUnicode` (issue 14048, PR 13277 follow-up) Currently we only exclude /Encoding entries that also contains a /Differences array, which is the cause of the text-selection problem in the referenced issue. In order to address this we'll now also exclude /Encoding entries that contain one of the predefined *named* encodings, and no longer require that it also contains a /Differences array. *Please note:* This patch cases a small "regression" in the `bug1130815-text` test-case, however this is actually an improvement when compared with Adobe Reader and PDFium (in Google Chrome). --- src/core/fonts.js | 4 ++-- test/pdfs/.gitignore | 1 + test/pdfs/issue14048.pdf | Bin 0 -> 6810 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/issue14048.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 9dd9d3db3..19210e02f 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -148,9 +148,9 @@ function adjustToUnicode(properties, builtInEncoding) { if (properties.toUnicode.has(charCode)) { continue; // The font dictionary has a `ToUnicode` entry. } - } else { + } else if (properties.hasEncoding) { if ( - properties.hasEncoding && + properties.differences.length === 0 || properties.differences[charCode] !== undefined ) { continue; // The font dictionary has an `Encoding`/`Differences` entry. diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index acdf66ae4..3790b3514 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -431,6 +431,7 @@ !annotation-square-circle.pdf !annotation-square-circle-without-appearance.pdf !annotation-stamp.pdf +!issue14048.pdf !annotation-fileattachment.pdf !annotation-text-widget.pdf !annotation-choice-widget.pdf diff --git a/test/pdfs/issue14048.pdf b/test/pdfs/issue14048.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1cf071ee0e00004b6331c1601aaa06b3a70dba38 GIT binary patch literal 6810 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 V>V|Z2y9^Cn3?d5P=2p^D{vVWCysZEL literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 320cb303e..008196a58 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -4301,6 +4301,12 @@ "rounds": 1, "type": "eq" }, + { "id": "issue14048", + "file": "pdfs/issue14048.pdf", + "md5": "770026875a93dc44a187905f4dcd3de2", + "rounds": 1, + "type": "text" + }, { "id": "blendmode", "file": "pdfs/blendmode.pdf", "md5": "5a86e7e9333e93c58abc3f382e1e6ea2",