From a11343e9af26b88061f2d73e13dc8b8dd8062a7e Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 15 Sep 2021 11:06:25 +0200 Subject: [PATCH] Improve glyph mapping for non-embedded composite standard fonts with a /CIDToGIDMap (issue 11915) *Please note:* All of this feels very handwavy, but at least it passes all tests locally. Hopefully we have enough tests for this part of the font code. For non-embedded composite standard fonts with an "incomplete" /CIDToGIDMap, we'll now fallback to an *explicitly defined* /ToUnicode map even when that one happens to be an /Identity-H or /Identity-V map. The `Font.fallbackToSystemFont` method is unfortunately getting more and more special-cases, however that might be unavoidable given all the weird non-embedded fonts found in the wild :-( --- src/core/fonts.js | 15 +++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue11915.pdf | Bin 0 -> 7729 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 22 insertions(+) create mode 100644 test/pdfs/issue11915.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 262f9e96c..5a48bbe50 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -1073,6 +1073,7 @@ class Font { map[+charCode] = SupplementalGlyphMapForCalibri[charCode]; } } + // Always update the glyph mapping with the `cidToGidMap` when it exists // (fixes issue12418_reduced.pdf). if (cidToGidMap) { @@ -1082,6 +1083,20 @@ class Font { map[+charCode] = cidToGidMap[cid]; } } + // When the /CIDToGIDMap is "incomplete", fallback to the included + // /ToUnicode-map regardless of its encoding (fixes issue11915.pdf). + if ( + cidToGidMap.length !== this.toUnicode.length && + properties.hasIncludedToUnicodeMap && + this.toUnicode instanceof IdentityToUnicodeMap + ) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + const cid = map[charCode]; + if (cidToGidMap[cid] === undefined) { + map[+charCode] = unicodeCharCode; + } + }); + } } if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index c8845e4ee..acdf66ae4 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -355,6 +355,7 @@ !tensor-allflags-withfunction.pdf !issue10084_reduced.pdf !issue4246.pdf +!issue11915.pdf !js-authors.pdf !issue4461.pdf !issue4573.pdf diff --git a/test/pdfs/issue11915.pdf b/test/pdfs/issue11915.pdf new file mode 100644 index 0000000000000000000000000000000000000000..30396554f126e154e0b5cb73b061bd687afe586e GIT binary patch literal 7729 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 Vr^|LSGC)LaBec()xqNfo{uhg{3OE1& literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index cbb51a523..508fc5208 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2365,6 +2365,12 @@ "link": false, "type": "text" }, + { "id": "issue11915", + "file": "pdfs/issue11915.pdf", + "md5": "c4f890b4a5b6f21653421856335181d5", + "rounds": 1, + "type": "eq" + }, { "id": "issue10614", "file": "pdfs/issue10614.pdf", "md5": "c41da60ce9af100cb78e1c2a6ba18232",