From 7866109af97d16ebedd55901b16d4bfef27eb15b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 25 Jun 2016 12:41:26 +0200 Subject: [PATCH] Fallback to attempt to recover standard glyph names when amending the `charCodeToGlyphId` with entries from the `differences` array in `type1FontGlyphMapping` (issue 7439) Fixes 7439. --- src/core/fonts.js | 51 +++++++++++++++++++++++----------------- test/pdfs/.gitignore | 1 + test/pdfs/issue7439.pdf | Bin 0 -> 18557 bytes test/test_manifest.json | 7 ++++++ 4 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 test/pdfs/issue7439.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index fe8538ebb..fbcba6264 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -185,6 +185,25 @@ function getFontType(type, subtype) { } } +// Some bad PDF generators, e.g. Scribus PDF, include glyph names +// in a 'uniXXXX' format -- attempting to recover proper ones. +function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + // The glyph name is non-standard, trying to recover. + var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (var key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + warn('Unable to recover a standard glyph name for: ' + name); + return name; +} + var Glyph = (function GlyphClosure() { function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { @@ -2266,26 +2285,6 @@ var Font = (function FontClosure() { return false; } - // Some bad PDF generators, e.g. Scribus PDF, include glyph names - // in a 'uniXXXX' format -- attempting to recover proper ones. - function recoverGlyphName(name, glyphsUnicodeMap) { - if (glyphsUnicodeMap[name] !== undefined) { - return name; - } - // The glyph name is non-standard, trying to recover. - var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); - if (unicode !== -1) { - for (var key in glyphsUnicodeMap) { - if (glyphsUnicodeMap[key] === unicode) { - return key; - } - } - } - warn('Unable to recover a standard glyph name for: ' + name); - return name; - } - - if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; var isCidToGidMapEmpty = cidToGidMap.length === 0; @@ -2859,11 +2858,21 @@ function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { } // Lastly, merge in the differences. - var differences = properties.differences; + var differences = properties.differences, glyphsUnicodeMap; if (differences) { for (charCode in differences) { var glyphName = differences[charCode]; glyphId = glyphNames.indexOf(glyphName); + + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = getGlyphsUnicode(); + } + var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } if (glyphId >= 0) { charCodeToGlyphId[charCode] = glyphId; } else { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d0b08ac30..7b256d168 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -26,6 +26,7 @@ !issue7115.pdf !issue7200.pdf !issue7229.pdf +!issue7439.pdf !filled-background.pdf !ArabicCIDTrueType.pdf !ThuluthFeatures.pdf diff --git a/test/pdfs/issue7439.pdf b/test/pdfs/issue7439.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03a6686be12901a520d1c9b20c7a98b74e067ede GIT binary patch literal 18557 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