diff --git a/src/core/fonts.js b/src/core/fonts.js index a805b370b26c2..aeaf00e82ce29 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -401,6 +401,21 @@ function buildToFontChar(encoding, glyphsUnicodeMap, differences) { return toFontChar; } +function convertCidString(charCode, cid, shouldThrow = false) { + switch (cid.length) { + case 1: + return cid.charCodeAt(0); + case 2: + return (cid.charCodeAt(0) << 8) | cid.charCodeAt(1); + } + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new FormatError(msg); + } + warn(msg); + return cid; +} + /** * Rebuilds the char code to glyph ID map by moving all char codes to the * private use area. This is done to avoid issues with various problematic @@ -929,7 +944,7 @@ class Font { return; } - this.cidEncoding = properties.cidEncoding; + this.cidEncoding = properties.cidEncoding || ""; this.vertical = !!properties.vertical; if (this.vertical) { this.vmetrics = properties.vmetrics; @@ -2612,6 +2627,9 @@ class Font { const isCidToGidMapEmpty = cidToGidMap.length === 0; properties.cMap.forEach(function (charCode, cid) { + if (typeof cid === "string") { + cid = convertCidString(charCode, cid, /* shouldThrow = */ true); + } if (cid > 0xffff) { throw new FormatError("Max size of CID is 65,535"); } @@ -3057,6 +3075,10 @@ class Font { let charcode = 0; if (this.composite && this.cMap.contains(glyphUnicode)) { charcode = this.cMap.lookup(glyphUnicode); + + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } } // ... via toUnicode map if (!charcode && this.toUnicode) { @@ -3085,6 +3107,10 @@ class Font { let widthCode = charcode; if (this.cMap && this.cMap.contains(charcode)) { widthCode = this.cMap.lookup(charcode); + + if (typeof widthCode === "string") { + widthCode = convertCidString(charcode, widthCode); + } } width = this.widths[widthCode]; width = isNum(width) ? width : this.defaultWidth; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index f30fcadce2768..1723cfadabddd 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -238,6 +238,7 @@ !bug900822.pdf !bug1392647.pdf !issue918.pdf +!bug920426.pdf !issue1905.pdf !issue2833.pdf !issue2931.pdf diff --git a/test/pdfs/bug920426.pdf b/test/pdfs/bug920426.pdf new file mode 100644 index 0000000000000..6d8fb1541d720 Binary files /dev/null and b/test/pdfs/bug920426.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index aa2f82b34fbd3..016d55262002f 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -154,6 +154,12 @@ "link": false, "type": "eq" }, + { "id": "bug920426", + "file": "pdfs/bug920426.pdf", + "md5": "2fd118b44513afb22509c3584388cc29", + "rounds": 1, + "type": "eq" + }, { "id": "issue13343", "file": "pdfs/issue13343.pdf", "md5": "f8bf1888839e15254555092c504e1900",