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 000000000..03a6686be Binary files /dev/null and b/test/pdfs/issue7439.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index ac342b40c..072e60191 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -1701,6 +1701,13 @@ "link": false, "type": "eq" }, + { "id": "issue7439", + "file": "pdfs/issue7439.pdf", + "md5": "56682657990a894c66db26560d3039d7", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "bug867484", "file": "pdfs/bug867484.pdf", "md5": "347af7b0ef7279b1a7f43b03bfda4548",