diff --git a/bower.json b/bower.json index c954b0b1d..0c4a6de70 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.1137", + "version": "1.0.1141", "main": [ "build/pdf.js", "build/pdf.worker.js" diff --git a/build/pdf.combined.js b/build/pdf.combined.js index ffad37a0c..43dba005d 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1137'; -PDFJS.build = 'fb82000'; +PDFJS.version = '1.0.1141'; +PDFJS.build = '394b38b'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -22619,6 +22619,10 @@ var ToUnicodeMap = (function ToUnicodeMapClosure() { } }, + has: function(i) { + return this._map[i] !== undefined; + }, + get: function(i) { return this._map[i]; }, @@ -22648,6 +22652,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); @@ -23080,7 +23088,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 = []; @@ -23091,17 +23098,11 @@ var Font = (function FontClosure() { var fontCharCode = originalCharCode; // First try to map the value to a unicode position if a non identity map // was created. - if (!isIdentityUnicode) { - if (toUnicode.get(originalCharCode) !== undefined) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - } else if (isCidFontType2) { - // For CIDFontType2, move characters not present in toUnicode - // to the private use area (fixes bug 1028735 and issue 4881). - fontCharCode = nextAvailableFontCharCode; + if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { + var unicode = toUnicode.get(fontCharCode); + // TODO: Try to map ligatures to the correct spot. + if (unicode.length === 1) { + fontCharCode = unicode.charCodeAt(0); } } // Try to move control characters, special characters and already mapped @@ -23946,6 +23947,7 @@ var Font = (function FontClosure() { var newGlyfData = new Uint8Array(oldGlyfDataLength); var startOffset = itemDecode(locaData, 0); var writeOffset = 0; + var missingGlyphData = {}; itemEncode(locaData, 0, writeOffset); var i, j; for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { @@ -23963,6 +23965,10 @@ var Font = (function FontClosure() { continue; } + if (startOffset === endOffset) { + missingGlyphData[i] = true; + } + var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid); writeOffset += newLength; @@ -23979,7 +23985,7 @@ var Font = (function FontClosure() { itemEncode(locaData, j, simpleGlyph.length); } glyf.data = simpleGlyph; - return; + return missingGlyphData; } if (dupFirstEntry) { @@ -23996,6 +24002,7 @@ var Font = (function FontClosure() { } else { glyf.data = newGlyfData.subarray(0, writeOffset); } + return missingGlyphData; } function readPostScriptTable(post, properties, maxpNumGlyphs) { @@ -24455,11 +24462,13 @@ var Font = (function FontClosure() { sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); + var missingGlyphs = {}; if (isTrueType) { var isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); - sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, dupFirstEntry); + missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, + numGlyphs, isGlyphLocationsLong, + hintsValid, dupFirstEntry); } if (!tables.hhea) { @@ -24481,19 +24490,33 @@ var Font = (function FontClosure() { } } - var charCodeToGlyphId = [], charCode; + var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode; + + function hasGlyph(glyphId, charCode) { + if (!missingGlyphs[glyphId]) { + return true; + } + if (charCode >= 0 && toUnicode.has(charCode)) { + return true; + } + return false; + } + if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; - var cidToGidMapLength = cidToGidMap.length; + var isCidToGidMapEmpty = cidToGidMap.length === 0; + 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) { + + if (glyphId >= 0 && glyphId < numGlyphs && + hasGlyph(glyphId, charCode)) { charCodeToGlyphId[charCode] = glyphId; } }); @@ -24553,7 +24576,8 @@ var Font = (function FontClosure() { var found = false; for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode === unicodeOrCharCode) { + if (cmapMappings[i].charCode === unicodeOrCharCode && + hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) { charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; found = true; break; @@ -24563,7 +24587,7 @@ var Font = (function FontClosure() { // Try to map using the post table. There are currently no known // pdfs that this fixes. var glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0) { + if (glyphId > 0 && hasGlyph(glyphId, -1)) { charCodeToGlyphId[charCode] = glyphId; } } diff --git a/build/pdf.js b/build/pdf.js index 11a509f98..d44f47024 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1137'; -PDFJS.build = 'fb82000'; +PDFJS.version = '1.0.1141'; +PDFJS.build = '394b38b'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/build/pdf.worker.js b/build/pdf.worker.js index ee106b64e..90d2899f4 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1137'; -PDFJS.build = 'fb82000'; +PDFJS.version = '1.0.1141'; +PDFJS.build = '394b38b'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -16294,6 +16294,10 @@ var ToUnicodeMap = (function ToUnicodeMapClosure() { } }, + has: function(i) { + return this._map[i] !== undefined; + }, + get: function(i) { return this._map[i]; }, @@ -16323,6 +16327,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); @@ -16755,7 +16763,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 = []; @@ -16766,17 +16773,11 @@ var Font = (function FontClosure() { var fontCharCode = originalCharCode; // First try to map the value to a unicode position if a non identity map // was created. - if (!isIdentityUnicode) { - if (toUnicode.get(originalCharCode) !== undefined) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - } else if (isCidFontType2) { - // For CIDFontType2, move characters not present in toUnicode - // to the private use area (fixes bug 1028735 and issue 4881). - fontCharCode = nextAvailableFontCharCode; + if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { + var unicode = toUnicode.get(fontCharCode); + // TODO: Try to map ligatures to the correct spot. + if (unicode.length === 1) { + fontCharCode = unicode.charCodeAt(0); } } // Try to move control characters, special characters and already mapped @@ -17621,6 +17622,7 @@ var Font = (function FontClosure() { var newGlyfData = new Uint8Array(oldGlyfDataLength); var startOffset = itemDecode(locaData, 0); var writeOffset = 0; + var missingGlyphData = {}; itemEncode(locaData, 0, writeOffset); var i, j; for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { @@ -17638,6 +17640,10 @@ var Font = (function FontClosure() { continue; } + if (startOffset === endOffset) { + missingGlyphData[i] = true; + } + var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid); writeOffset += newLength; @@ -17654,7 +17660,7 @@ var Font = (function FontClosure() { itemEncode(locaData, j, simpleGlyph.length); } glyf.data = simpleGlyph; - return; + return missingGlyphData; } if (dupFirstEntry) { @@ -17671,6 +17677,7 @@ var Font = (function FontClosure() { } else { glyf.data = newGlyfData.subarray(0, writeOffset); } + return missingGlyphData; } function readPostScriptTable(post, properties, maxpNumGlyphs) { @@ -18130,11 +18137,13 @@ var Font = (function FontClosure() { sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); + var missingGlyphs = {}; if (isTrueType) { var isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); - sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, dupFirstEntry); + missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, + numGlyphs, isGlyphLocationsLong, + hintsValid, dupFirstEntry); } if (!tables.hhea) { @@ -18156,19 +18165,33 @@ var Font = (function FontClosure() { } } - var charCodeToGlyphId = [], charCode; + var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode; + + function hasGlyph(glyphId, charCode) { + if (!missingGlyphs[glyphId]) { + return true; + } + if (charCode >= 0 && toUnicode.has(charCode)) { + return true; + } + return false; + } + if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; - var cidToGidMapLength = cidToGidMap.length; + var isCidToGidMapEmpty = cidToGidMap.length === 0; + 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) { + + if (glyphId >= 0 && glyphId < numGlyphs && + hasGlyph(glyphId, charCode)) { charCodeToGlyphId[charCode] = glyphId; } }); @@ -18228,7 +18251,8 @@ var Font = (function FontClosure() { var found = false; for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode === unicodeOrCharCode) { + if (cmapMappings[i].charCode === unicodeOrCharCode && + hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) { charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; found = true; break; @@ -18238,7 +18262,7 @@ var Font = (function FontClosure() { // Try to map using the post table. There are currently no known // pdfs that this fixes. var glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0) { + if (glyphId > 0 && hasGlyph(glyphId, -1)) { charCodeToGlyphId[charCode] = glyphId; } } diff --git a/package.json b/package.json index b82a42a2b..3fed13ece 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.1137", + "version": "1.0.1141", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla",