From a22c0eab483e6899f433e3d60d51b9c6c8aff6ab Mon Sep 17 00:00:00 2001 From: Jani Pehkonen Date: Tue, 24 Mar 2020 15:33:43 +0200 Subject: [PATCH] The first glyph in CFF CIDFonts must be named 0 instead of ".notdef" Fixes #11718 in which the `ff` ligature glyph is at index zero in a CFF font. Beacuse this is a CIDFont, glyph names are CIDs, which are integers. Thus the string `".notdef"` is not correct. The rest of the charset data is already parsed correctly as integers when the boolean argument `cid` is true. --- src/core/cff_parser.js | 2 +- test/pdfs/.gitignore | 1 + test/pdfs/issue11718_reduced.pdf | Bin 0 -> 10080 bytes test/test_manifest.json | 6 ++++++ test/unit/cff_parser_spec.js | 4 ++-- 5 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 test/pdfs/issue11718_reduced.pdf diff --git a/src/core/cff_parser.js b/src/core/cff_parser.js index e61ff1b91..fd8299fdf 100644 --- a/src/core/cff_parser.js +++ b/src/core/cff_parser.js @@ -803,7 +803,7 @@ var CFFParser = (function CFFParserClosure() { var bytes = this.bytes; var start = pos; var format = bytes[pos++]; - var charset = [".notdef"]; + const charset = [cid ? 0 : ".notdef"]; var id, count, i; // subtract 1 for the .notdef glyph diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 93b088f00..648de4c34 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -254,6 +254,7 @@ !bug903856.pdf !bug850854.pdf !bug866395.pdf +!issue11718_reduced.pdf !bug1027533.pdf !bug1028735.pdf !bug1046314.pdf diff --git a/test/pdfs/issue11718_reduced.pdf b/test/pdfs/issue11718_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94c602b2b754a9a3f8ef3d4af9f67efc9f00e31e GIT binary patch literal 10080 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 WXJaSl->C!ha)ANV)RKx)fd2srq95S^ literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index e2c374065..9429ca6f9 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -3339,6 +3339,12 @@ "rounds": 1, "type": "eq" }, + { "id": "issue11718", + "file": "pdfs/issue11718_reduced.pdf", + "md5": "a0deea064b4171bb8ea9f6e8a523e594", + "rounds": 1, + "type": "eq" + }, { "id": "issue3061", "file": "pdfs/issue3061.pdf", "md5": "696a7cb1b194d095ca3f7861779a606b", diff --git a/test/unit/cff_parser_spec.js b/test/unit/cff_parser_spec.js index e3da8f6b7..25074ee72 100644 --- a/test/unit/cff_parser_spec.js +++ b/test/unit/cff_parser_spec.js @@ -268,7 +268,7 @@ describe("CFFParser", function() { // CID font charset = parser.parseCharsets(3, 2, new CFFStrings(), true); - expect(charset.charset).toEqual([".notdef", 8, 9]); + expect(charset.charset).toEqual([0, 8, 9]); }); it("parses charset format 2", function() { @@ -286,7 +286,7 @@ describe("CFFParser", function() { // CID font charset = parser.parseCharsets(3, 2, new CFFStrings(), true); - expect(charset.charset).toEqual([".notdef", 8, 9]); + expect(charset.charset).toEqual([0, 8, 9]); }); it("parses encoding format 0", function() {