diff --git a/src/cidmaps.js b/src/cidmaps.js index 1b654756c..500b35a88 100644 --- a/src/cidmaps.js +++ b/src/cidmaps.js @@ -28,7 +28,8 @@ var CIDToUnicodeMaps = { 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192}, {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0, {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194, - {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288], + {f: 59, c: 33}, 165, {f: 31, c: 93}, 65512, {f: 2, c: 125}, 0, + {f: 63, c: 65377}, {s: 243}, [8195, 12288], {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281, {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541}, {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295, @@ -780,9 +781,9 @@ var CIDToUnicodeMaps = { 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013, {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794, - 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636}, - 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256, - 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304, + 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, 0, 92, + {s: 634}, 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, + 333, 256, 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304, {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0, 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593, 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0, diff --git a/src/fonts.js b/src/fonts.js index 215105b78..99605dbc9 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -413,6 +413,19 @@ var CMapConverterList = { '90msp-RKSJ-V': sjisToUnicode }; +// CMaps using Hankaku (Halfwidth) Latin glyphs instead of proportional one. +// We need to distinguish them to get correct widths from CIDFont dicts. +var HalfwidthCMaps = { + 'H': true, + 'V': true, + 'EUC-H': true, + 'EUC-V': true, + '90ms-RKSJ-H': true, + '90ms-RKSJ-V': true, + 'UniJIS-UCS2-HW-H': true, + 'UniJIS-UCS2-HW-V': true +}; + var decodeBytes; if (typeof TextDecoder !== 'undefined') { decodeBytes = function(bytes, encoding) { @@ -4141,14 +4154,18 @@ var Font = (function FontClosure() { if (!cidToUnicode) return; // identity encoding + var cidEncoding = properties.cidEncoding; + var overwrite = HalfwidthCMaps[cidEncoding]; var cid = 1, i, j, k, ii; for (i = 0, ii = cidToUnicode.length; i < ii; ++i) { var unicode = cidToUnicode[i]; if (isArray(unicode)) { var length = unicode.length; for (j = 0; j < length; j++) { - cidToUnicodeMap[cid] = unicode[j]; - unicodeToCIDMap[unicode[j]] = cid; + cidToUnicodeMap[cid] = k = unicode[j]; + if (!unicodeToCIDMap[k] || overwrite) { + unicodeToCIDMap[k] = cid; + } } cid++; } else if (typeof unicode === 'object') { @@ -4157,7 +4174,9 @@ var Font = (function FontClosure() { k = unicode.c; for (j = 0; j < fillLength; ++j) { cidToUnicodeMap[cid] = k; - unicodeToCIDMap[k] = cid; + if (!unicodeToCIDMap[k] || overwrite) { + unicodeToCIDMap[k] = cid; + } cid++; k++; } @@ -4165,13 +4184,14 @@ var Font = (function FontClosure() { cid += unicode.s; } else if (unicode) { cidToUnicodeMap[cid] = unicode; - unicodeToCIDMap[unicode] = cid; + if (!unicodeToCIDMap[unicode] || overwrite) { + unicodeToCIDMap[unicode] = cid; + } cid++; } else cid++; } - var cidEncoding = properties.cidEncoding; if (!cidEncoding) { return; } diff --git a/test/pdfs/noembed-identity-2.pdf b/test/pdfs/noembed-identity-2.pdf index 5bc89bea6..5692a262a 100644 Binary files a/test/pdfs/noembed-identity-2.pdf and b/test/pdfs/noembed-identity-2.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 319e2ab60..abbd696cf 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -833,7 +833,7 @@ }, { "id": "noembed-identity-2", "file": "pdfs/noembed-identity-2.pdf", - "md5": "5549571a910814a9c53a1761b27fd028", + "md5": "13b7d9ab9579d45c10bc8d499d087f21", "rounds": 1, "type": "eq" },