|
@@ -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;
|
|
|
}
|
|
|
}
|