diff --git a/src/core/fonts.js b/src/core/fonts.js index 872a5b0cb..8a191e1b5 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -2203,6 +2203,10 @@ var ToUnicodeMap = (function ToUnicodeMapClosure() { } }, + has: function(i) { + return this._map[i] !== undefined; + }, + get: function(i) { return this._map[i]; }, @@ -2232,6 +2236,10 @@ var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { } }, + has: function (i) { + return this.firstChar <= i && i <= this.lastChar; + }, + get: function (i) { if (this.firstChar <= i && i <= this.lastChar) { return String.fromCharCode(i); @@ -2664,7 +2672,6 @@ var Font = (function FontClosure() { var isSymbolic = !!(properties.flags & FontFlags.Symbolic); var isIdentityUnicode = properties.toUnicode instanceof IdentityToUnicodeMap; - var isCidFontType2 = (properties.type === 'CIDFontType2'); var newMap = Object.create(null); var toFontChar = []; var usedFontCharCodes = []; @@ -2675,8 +2682,7 @@ var Font = (function FontClosure() { var fontCharCode = originalCharCode; // First try to map the value to a unicode position if a non identity map // was created. - // console.log(fontCharCode); - if (!isIdentityUnicode && toUnicode.get(originalCharCode) !== undefined) { + if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { var unicode = toUnicode.get(fontCharCode); // TODO: Try to map ligatures to the correct spot. if (unicode.length === 1) { @@ -4040,8 +4046,9 @@ var Font = (function FontClosure() { if (isTrueType) { var isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); - missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, dupFirstEntry); + missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, + numGlyphs, isGlyphLocationsLong, + hintsValid, dupFirstEntry); } if (!tables.hhea) { @@ -4066,17 +4073,20 @@ var Font = (function FontClosure() { var charCodeToGlyphId = [], charCode; if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; - var cidToGidMapLength = cidToGidMap.length; + var isCidToGidMapEmpty = cidToGidMap.length === 0; + var toUnicode = properties.toUnicode; + properties.cMap.forEach(function(charCode, cid) { assert(cid <= 0xffff, 'Max size of CID is 65,535'); var glyphId = -1; - if (cidToGidMapLength === 0) { + if (isCidToGidMapEmpty) { glyphId = charCode; } else if (cidToGidMap[cid] !== undefined) { glyphId = cidToGidMap[cid]; } - if (glyphId >= 0 && glyphId < numGlyphs && !missingGlyphs[charCode]) { + if (glyphId >= 0 && glyphId < numGlyphs && + (!missingGlyphs[glyphId] || toUnicode.has(charCode))) { charCodeToGlyphId[charCode] = glyphId; } }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index e612c39cf..8108d7c56 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -18,6 +18,7 @@ !sizes.pdf !close-path-bug.pdf !issue4630.pdf +!issue5202.pdf !issue5280.pdf !alphatrans.pdf !devicen.pdf @@ -62,6 +63,7 @@ !issue1002.pdf !issue925.pdf !issue2840.pdf +!issue4061.pdf !issue4668.pdf !issue5039.pdf !issue5070.pdf diff --git a/test/pdfs/issue4061.pdf b/test/pdfs/issue4061.pdf new file mode 100644 index 000000000..ace045d5c Binary files /dev/null and b/test/pdfs/issue4061.pdf differ diff --git a/test/pdfs/issue5202.pdf b/test/pdfs/issue5202.pdf new file mode 100644 index 000000000..7196c55e2 Binary files /dev/null and b/test/pdfs/issue5202.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 1e05ff5a7..797ddd81f 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -485,6 +485,20 @@ "lastPage": 1, "type": "eq" }, + { "id": "issue4061", + "file": "pdfs/issue4061.pdf", + "md5": "236aaa8840a47c3c061f8e3034549764", + "rounds": 1, + "link": false, + "type": "eq" + }, + { "id": "issue5202", + "file": "pdfs/issue5202.pdf", + "md5": "bb9cc69211112e66aab40828086a4e5a", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue5238", "file": "pdfs/issue5238.pdf", "md5": "6ddecda00893be1793de20a70c83a3c2",