commit
b0e1f5d5e3
79
fonts.js
79
fonts.js
@ -1284,8 +1284,6 @@ var Font = (function Font() {
|
|||||||
var charcode = chars.charCodeAt(i);
|
var charcode = chars.charCodeAt(i);
|
||||||
var unicode = encoding[charcode];
|
var unicode = encoding[charcode];
|
||||||
if ('undefined' == typeof(unicode)) {
|
if ('undefined' == typeof(unicode)) {
|
||||||
// FIXME/issue 233: we're hitting this in test/pdf/sizes.pdf
|
|
||||||
// at the moment, for unknown reasons.
|
|
||||||
warn('Unencoded charcode ' + charcode);
|
warn('Unencoded charcode ' + charcode);
|
||||||
unicode = charcode;
|
unicode = charcode;
|
||||||
}
|
}
|
||||||
@ -1485,16 +1483,22 @@ var Type1Parser = function() {
|
|||||||
// TODO Clean this code
|
// TODO Clean this code
|
||||||
if (value == 13) {
|
if (value == 13) {
|
||||||
if (charstring.length == 2) {
|
if (charstring.length == 2) {
|
||||||
|
lsb = charstring[0];
|
||||||
width = charstring[1];
|
width = charstring[1];
|
||||||
|
charstring.splice(0, 1);
|
||||||
} else if (charstring.length == 4 && charstring[3] == 'div') {
|
} else if (charstring.length == 4 && charstring[3] == 'div') {
|
||||||
|
lsb = charstring[0];
|
||||||
width = charstring[1] / charstring[2];
|
width = charstring[1] / charstring[2];
|
||||||
|
charstring.splice(0, 1);
|
||||||
|
} else if (charstring.length == 4 && charstring[2] == 'div') {
|
||||||
|
lsb = charstring[0] / charstring[1];
|
||||||
|
width = charstring[3];
|
||||||
|
charstring.splice(0, 3);
|
||||||
} else {
|
} else {
|
||||||
error('Unsupported hsbw format: ' + charstring);
|
error('Unsupported hsbw format: ' + charstring);
|
||||||
}
|
}
|
||||||
|
|
||||||
lsb = charstring[0];
|
|
||||||
charstring.push(lsb, 'hmoveto');
|
charstring.push(lsb, 'hmoveto');
|
||||||
charstring.splice(0, 1);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
command = charStringDictionary[value];
|
command = charStringDictionary[value];
|
||||||
@ -1584,13 +1588,12 @@ var Type1Parser = function() {
|
|||||||
while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n'))
|
while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n'))
|
||||||
++i;
|
++i;
|
||||||
|
|
||||||
var t = '';
|
var token = '';
|
||||||
while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n'))
|
while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n'))
|
||||||
t += eexecStr[i++];
|
token += eexecStr[i++];
|
||||||
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return token;
|
||||||
|
};
|
||||||
var c = eexecStr[i];
|
var c = eexecStr[i];
|
||||||
|
|
||||||
if ((glyphsSection || subrsSection) && c == 'R') {
|
if ((glyphsSection || subrsSection) && c == 'R') {
|
||||||
@ -1674,18 +1677,28 @@ var Type1Parser = function() {
|
|||||||
return program;
|
return program;
|
||||||
},
|
},
|
||||||
|
|
||||||
this.extractFontHeader = function t1_extractFontProgram(stream) {
|
this.extractFontHeader = function t1_extractFontHeader(stream, properties) {
|
||||||
var headerString = '';
|
var headerString = '';
|
||||||
for (var i = 0; i < stream.length; i++)
|
for (var i = 0; i < stream.length; i++)
|
||||||
headerString += String.fromCharCode(stream[i]);
|
headerString += String.fromCharCode(stream[i]);
|
||||||
|
|
||||||
var info = {
|
|
||||||
textMatrix: null
|
|
||||||
};
|
|
||||||
|
|
||||||
var token = '';
|
var token = '';
|
||||||
var count = headerString.length;
|
var count = headerString.length;
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
|
var getToken = function() {
|
||||||
|
var char = headerString[i];
|
||||||
|
while (i < count && (char == ' ' || char == '\n' || char == '/'))
|
||||||
|
char = headerString[++i];
|
||||||
|
|
||||||
|
var token = '';
|
||||||
|
while (i < count && !(char == ' ' || char == '\n' || char == '/')) {
|
||||||
|
token += char;
|
||||||
|
char = headerString[++i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return token;
|
||||||
|
};
|
||||||
|
|
||||||
var c = headerString[i];
|
var c = headerString[i];
|
||||||
if (c == ' ' || c == '\n') {
|
if (c == ' ' || c == '\n') {
|
||||||
switch (token) {
|
switch (token) {
|
||||||
@ -1699,7 +1712,25 @@ var Type1Parser = function() {
|
|||||||
// Make the angle into the right direction
|
// Make the angle into the right direction
|
||||||
matrix[2] *= -1;
|
matrix[2] *= -1;
|
||||||
|
|
||||||
info.textMatrix = matrix;
|
properties.textMatrix = matrix;
|
||||||
|
break;
|
||||||
|
case '/Encoding':
|
||||||
|
if (!properties.builtInEncoding)
|
||||||
|
break;
|
||||||
|
|
||||||
|
var size = parseInt(getToken());
|
||||||
|
getToken(); // read in 'array'
|
||||||
|
|
||||||
|
for (var j = 0; j < size; j++) {
|
||||||
|
var token = getToken();
|
||||||
|
if (token == 'dup') {
|
||||||
|
var index = parseInt(getToken());
|
||||||
|
var glyph = getToken();
|
||||||
|
properties.encoding[index] = GlyphsUnicode[glyph];
|
||||||
|
getToken(); // read the in 'put'
|
||||||
|
j = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
token = '';
|
token = '';
|
||||||
@ -1707,8 +1738,6 @@ var Type1Parser = function() {
|
|||||||
token += c;
|
token += c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1792,13 +1821,11 @@ var CFF = function(name, file, properties) {
|
|||||||
var length2 = file.dict.get('Length2');
|
var length2 = file.dict.get('Length2');
|
||||||
|
|
||||||
var headerBlock = file.getBytes(length1);
|
var headerBlock = file.getBytes(length1);
|
||||||
var header = type1Parser.extractFontHeader(headerBlock);
|
type1Parser.extractFontHeader(headerBlock, properties);
|
||||||
for (var info in header)
|
|
||||||
properties[info] = header[info];
|
|
||||||
|
|
||||||
// Decrypt the data blocks and retrieve it's content
|
// Decrypt the data blocks and retrieve it's content
|
||||||
var eexecBlock = file.getBytes(length2);
|
var eexecBlock = file.getBytes(length2);
|
||||||
var data = type1Parser.extractFontProgram(eexecBlock);
|
var data = type1Parser.extractFontProgram(eexecBlock, properties);
|
||||||
for (var info in data.properties)
|
for (var info in data.properties)
|
||||||
properties[info] = data.properties[info];
|
properties[info] = data.properties[info];
|
||||||
|
|
||||||
@ -1868,15 +1895,14 @@ CFF.prototype = {
|
|||||||
|
|
||||||
getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs) {
|
getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs) {
|
||||||
var charstrings = [];
|
var charstrings = [];
|
||||||
|
var missings = [];
|
||||||
|
|
||||||
for (var i = 0; i < glyphs.length; i++) {
|
for (var i = 0; i < glyphs.length; i++) {
|
||||||
var glyph = glyphs[i];
|
var glyph = glyphs[i];
|
||||||
var unicode = GlyphsUnicode[glyph.glyph];
|
var unicode = GlyphsUnicode[glyph.glyph];
|
||||||
if (!unicode) {
|
if (!unicode) {
|
||||||
if (glyph.glyph != '.notdef') {
|
if (glyph.glyph != '.notdef')
|
||||||
warn(glyph.glyph +
|
missings.push(glyph.glyph);
|
||||||
' does not have an entry in the glyphs unicode dictionary');
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
charstrings.push({
|
charstrings.push({
|
||||||
glyph: glyph,
|
glyph: glyph,
|
||||||
@ -1888,6 +1914,9 @@ CFF.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (missings.length)
|
||||||
|
warn(missings + ' does not have unicode in the glyphs dictionary');
|
||||||
|
|
||||||
charstrings.sort(function charstrings_sort(a, b) {
|
charstrings.sort(function charstrings_sort(a, b) {
|
||||||
return a.unicode - b.unicode;
|
return a.unicode - b.unicode;
|
||||||
});
|
});
|
||||||
|
9
pdf.js
9
pdf.js
@ -4196,6 +4196,7 @@ var PartialEvaluator = (function() {
|
|||||||
fd = fontDict.get('FontDescriptor');
|
fd = fontDict.get('FontDescriptor');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var builtInEncoding = false;
|
||||||
var encodingMap = {};
|
var encodingMap = {};
|
||||||
var glyphMap = {};
|
var glyphMap = {};
|
||||||
var charset = [];
|
var charset = [];
|
||||||
@ -4266,9 +4267,11 @@ var PartialEvaluator = (function() {
|
|||||||
if (!baseEncoding) {
|
if (!baseEncoding) {
|
||||||
var type = subType.name;
|
var type = subType.name;
|
||||||
if (type == 'TrueType') {
|
if (type == 'TrueType') {
|
||||||
baseEncoding = Encodings.WinAnsiEncoding.slice(0);
|
baseEncoding = Encodings.WinAnsiEncoding.slice();
|
||||||
} else if (type == 'Type1') {
|
} else if (type == 'Type1') {
|
||||||
baseEncoding = Encodings.StandardEncoding.slice(0);
|
baseEncoding = Encodings.StandardEncoding.slice();
|
||||||
|
if (!diffEncoding.length)
|
||||||
|
builtInEncoding = true;
|
||||||
} else {
|
} else {
|
||||||
error('Unknown type of font');
|
error('Unknown type of font');
|
||||||
}
|
}
|
||||||
@ -4290,6 +4293,7 @@ var PartialEvaluator = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fontDict.has('ToUnicode')) {
|
if (fontDict.has('ToUnicode')) {
|
||||||
|
encodingMap['empty'] = true;
|
||||||
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
|
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
|
||||||
if (IsName(cmapObj)) {
|
if (IsName(cmapObj)) {
|
||||||
error('ToUnicode file cmap translation not implemented');
|
error('ToUnicode file cmap translation not implemented');
|
||||||
@ -4424,6 +4428,7 @@ var PartialEvaluator = (function() {
|
|||||||
subtype: fileType,
|
subtype: fileType,
|
||||||
widths: glyphWidths,
|
widths: glyphWidths,
|
||||||
encoding: encodingMap,
|
encoding: encodingMap,
|
||||||
|
builtInEncoding: builtInEncoding,
|
||||||
charset: charset,
|
charset: charset,
|
||||||
firstChar: fontDict.get('FirstChar'),
|
firstChar: fontDict.get('FirstChar'),
|
||||||
lastChar: fontDict.get('LastChar'),
|
lastChar: fontDict.get('LastChar'),
|
||||||
|
Loading…
Reference in New Issue
Block a user