From 05c527f035f72501440ae6007dbcfd32a68ada3c Mon Sep 17 00:00:00 2001 From: Jani Pehkonen Date: Tue, 7 May 2019 18:44:37 +0300 Subject: [PATCH] Fix glyph 0 in CIDFontType2 that has a CIDToGIDMap stream --- src/core/evaluator.js | 17 ++++++++++------- src/core/fonts.js | 11 +++++++++-- test/pdfs/.gitignore | 1 + test/pdfs/issue10519_reduced.pdf | Bin 0 -> 13286 bytes test/test_manifest.json | 6 ++++++ 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 test/pdfs/issue10519_reduced.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 10cd2a963..3b8a4c9b2 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -1827,7 +1827,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) { - var xref = this.xref; + let xref = this.xref, cidToGidBytes; // 9.10.2 var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); var toUnicodePromise = toUnicode ? @@ -1846,7 +1846,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var cidToGidMap = dict.get('CIDToGIDMap'); if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); + cidToGidBytes = cidToGidMap.getBytes(); } } @@ -1929,8 +1929,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return toUnicodePromise.then((toUnicode) => { properties.toUnicode = toUnicode; return this.buildToUnicode(properties); - }).then(function (toUnicode) { + }).then((toUnicode) => { properties.toUnicode = toUnicode; + if (cidToGidBytes) { + properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, + toUnicode); + } return properties; }); }, @@ -2146,18 +2150,17 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return Promise.resolve(null); }, - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { + readCidToGidMap(glyphsData, toUnicode) { // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); // Set encoding 0 to later verify the font has an encoding var result = []; for (var j = 0, jj = glyphsData.length; j < jj; j++) { var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { + const code = j >> 1; + if (glyphID === 0 && !toUnicode.has(code)) { continue; } - var code = j >> 1; result[code] = glyphID; } return result; diff --git a/src/core/fonts.js b/src/core/fonts.js index f4d00ae8d..c519dd75d 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -1606,7 +1606,8 @@ var Font = (function FontClosure() { }; } - function sanitizeMetrics(font, header, metrics, numGlyphs) { + function sanitizeMetrics(font, header, metrics, numGlyphs, + dupFirstEntry) { if (!header) { if (metrics) { metrics.data = null; @@ -1649,6 +1650,11 @@ var Font = (function FontClosure() { // the use of |numMissing * 2| when initializing the typed array. var entries = new Uint8Array(metrics.length + numMissing * 2); entries.set(metrics.data); + if (dupFirstEntry) { + // Set the sidebearing value of the duplicated glyph. + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } metrics.data = entries; } } @@ -2366,7 +2372,8 @@ var Font = (function FontClosure() { // Ensure the hmtx table contains the advance width and // sidebearings information for numGlyphs in the maxp table - sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut); + sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut, + dupFirstEntry); if (!tables['head']) { throw new FormatError('Required "head" table is not found'); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 343eeef41..b704c9682 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -293,6 +293,7 @@ !issue5540.pdf !issue5549.pdf !issue5475.pdf +!issue10519_reduced.pdf !annotation-border-styles.pdf !IdentityToUnicodeMap_charCodeOf.pdf !PDFJS-9279-reduced.pdf diff --git a/test/pdfs/issue10519_reduced.pdf b/test/pdfs/issue10519_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a80ff5e2cdf66c4185d4b54e3737a52874ce3e87 GIT binary patch literal 13286 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