Redid encoding
This commit is contained in:
parent
8e8fb748ac
commit
aeba156d6b
229
pdf.js
229
pdf.js
@ -4213,118 +4213,135 @@ var PartialEvaluator = (function() {
|
|||||||
'9.7.5.3');
|
'9.7.5.3');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (fontDict.has('Encoding')) {
|
} else {
|
||||||
var encoding = xref.fetchIfRef(fontDict.get('Encoding'));
|
var baseEncoding = null, diffEncoding = [];
|
||||||
if (IsDict(encoding)) {
|
if (fontDict.has('Encoding')) {
|
||||||
// Build a map of between codes and glyphs
|
var encoding = xref.fetchIfRef(fontDict.get('Encoding'));
|
||||||
// Load the base encoding
|
if (IsDict(encoding)) {
|
||||||
var baseName = encoding.get('BaseEncoding');
|
// Build a map of between codes and glyphs
|
||||||
if (baseName) {
|
// Load the base encoding
|
||||||
var base = Encodings[baseName.name];
|
var baseName = encoding.get('BaseEncoding');
|
||||||
for (var j = 0, end = base.length; j < end; j++)
|
if (baseName) {
|
||||||
encodingMap[j] = GlyphsUnicode[base[j]] || 0;
|
baseEncoding = Encodings[baseName.name].slice();
|
||||||
} else {
|
|
||||||
TODO('need to load default encoding');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the differences between the base and original
|
|
||||||
var differences = encoding.get('Differences');
|
|
||||||
var index = 0;
|
|
||||||
for (var j = 0; j < differences.length; j++) {
|
|
||||||
var data = differences[j];
|
|
||||||
if (IsNum(data)) {
|
|
||||||
index = data;
|
|
||||||
} else {
|
|
||||||
encodingMap[index++] = (subType.name == 'TrueType') ? j :
|
|
||||||
GlyphsUnicode[data.name];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if (IsName(encoding)) {
|
|
||||||
var encoding = Encodings[encoding.name];
|
|
||||||
if (!encoding)
|
|
||||||
error('Unknown font encoding');
|
|
||||||
|
|
||||||
var index = 0;
|
// Load the differences between the base and original
|
||||||
for (var j = 0; j < encoding.length; j++)
|
var differences = encoding.get('Differences');
|
||||||
encodingMap[index++] = GlyphsUnicode[encoding[j]];
|
var index = 0;
|
||||||
|
for (var j = 0; j < differences.length; j++) {
|
||||||
// firstChar and width are required
|
var data = differences[j];
|
||||||
// (except for 14 standard fonts)
|
if (IsNum(data)) {
|
||||||
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
|
index = data;
|
||||||
var widths = xref.fetchIfRef(fontDict.get('Widths')) || [];
|
} else {
|
||||||
for (var j = 0; j < widths.length; j++) {
|
diffEncoding[index++] = data.name;
|
||||||
if (widths[j])
|
}
|
||||||
charset.push(encoding[j + firstChar]);
|
}
|
||||||
}
|
} else if (IsName(encoding)) {
|
||||||
}
|
baseEncoding = Encodings[encoding.name].slice();
|
||||||
} else if (fontDict.has('ToUnicode')) {
|
}
|
||||||
encodingMap = {empty: true};
|
}
|
||||||
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
|
|
||||||
if (IsName(cmapObj)) {
|
if (!baseEncoding) {
|
||||||
error('ToUnicode file cmap translation not implemented');
|
var type = subType.name;
|
||||||
} else if (IsStream(cmapObj)) {
|
if (type == 'TrueType') {
|
||||||
var encoding = Encodings['WinAnsiEncoding'];
|
baseEncoding = Encodings.WinAnsiEncoding.slice(0);
|
||||||
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
|
} else if (type == 'Type1') {
|
||||||
|
baseEncoding = Encodings.StandardEncoding.slice(0);
|
||||||
var tokens = [];
|
} else {
|
||||||
var token = '';
|
error('Unknown type of font');
|
||||||
|
}
|
||||||
var cmap = cmapObj.getBytes(cmapObj.length);
|
}
|
||||||
for (var i = 0; i < cmap.length; i++) {
|
|
||||||
var byte = cmap[i];
|
// merge in the differences
|
||||||
if (byte == 0x20 || byte == 0x0A || byte == 0x3C || byte == 0x3E) {
|
var length = baseEncoding.length > diffEncoding.length ?
|
||||||
switch (token) {
|
baseEncoding.length : diffEncoding.length;
|
||||||
case 'useCMap':
|
for (var i = 0, ii = length; i < ii; ++i) {
|
||||||
error('useCMap is not implemented');
|
var diffGlyph = diffEncoding[i];
|
||||||
break;
|
var baseGlyph = baseEncoding[i];
|
||||||
|
if (diffGlyph)
|
||||||
case 'beginbfchar':
|
encodingMap[i] = GlyphsUnicode[diffGlyph];
|
||||||
case 'beginbfrange':
|
else if (baseGlyph)
|
||||||
case 'begincodespacerange':
|
encodingMap[i] = GlyphsUnicode[baseGlyph];
|
||||||
token = '';
|
}
|
||||||
tokens = [];
|
|
||||||
break;
|
if (fontDict.has('ToUnicode')) {
|
||||||
|
encodingMap = {empty: true};
|
||||||
case 'endcodespacerange':
|
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
|
||||||
TODO('Support CMap ranges');
|
if (IsName(cmapObj)) {
|
||||||
break;
|
error('ToUnicode file cmap translation not implemented');
|
||||||
|
} else if (IsStream(cmapObj)) {
|
||||||
case 'endbfrange':
|
var encoding = Encodings['WinAnsiEncoding'];
|
||||||
for (var j = 0; j < tokens.length; j += 3) {
|
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
|
||||||
var startRange = parseInt('0x' + tokens[j]);
|
|
||||||
var endRange = parseInt('0x' + tokens[j + 1]);
|
var tokens = [];
|
||||||
var code = parseInt('0x' + tokens[j + 2]);
|
var token = '';
|
||||||
|
|
||||||
for (var k = startRange; k <= endRange; k++) {
|
var cmap = cmapObj.getBytes(cmapObj.length);
|
||||||
charset.push(encoding[code++] || '.notdef');
|
for (var i = 0; i < cmap.length; i++) {
|
||||||
}
|
var byte = cmap[i];
|
||||||
}
|
if (byte == 0x20 || byte == 0x0A || byte == 0x3C || byte == 0x3E) {
|
||||||
break;
|
switch (token) {
|
||||||
|
case 'useCMap':
|
||||||
case 'endbfchar':
|
error('useCMap is not implemented');
|
||||||
for (var j = 0; j < tokens.length; j += 2) {
|
break;
|
||||||
var index = parseInt('0x' + tokens[j]);
|
|
||||||
var code = parseInt('0x' + tokens[j + 1]);
|
case 'beginbfchar':
|
||||||
encodingMap[index] = GlyphsUnicode[encoding[code]];
|
case 'beginbfrange':
|
||||||
charset.push(encoding[code] || '.notdef');
|
case 'begincodespacerange':
|
||||||
}
|
token = '';
|
||||||
break;
|
tokens = [];
|
||||||
|
break;
|
||||||
default:
|
|
||||||
if (token.length) {
|
case 'endcodespacerange':
|
||||||
tokens.push(token);
|
TODO('Support CMap ranges');
|
||||||
token = '';
|
break;
|
||||||
}
|
|
||||||
break;
|
case 'endbfrange':
|
||||||
|
for (var j = 0; j < tokens.length; j += 3) {
|
||||||
|
var startRange = parseInt('0x' + tokens[j]);
|
||||||
|
var endRange = parseInt('0x' + tokens[j + 1]);
|
||||||
|
var code = parseInt('0x' + tokens[j + 2]);
|
||||||
|
|
||||||
|
for (var k = startRange; k <= endRange; k++) {
|
||||||
|
charset.push(encoding[code++] || '.notdef');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'endbfchar':
|
||||||
|
for (var j = 0; j < tokens.length; j += 2) {
|
||||||
|
var index = parseInt('0x' + tokens[j]);
|
||||||
|
var code = parseInt('0x' + tokens[j + 1]);
|
||||||
|
encodingMap[index] = GlyphsUnicode[encoding[code]];
|
||||||
|
charset.push(encoding[code] || '.notdef');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (token.length) {
|
||||||
|
tokens.push(token);
|
||||||
|
token = '';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (byte == 0x5B || byte == 0x5D) {
|
||||||
|
error('CMAP list parsing is not implemented');
|
||||||
|
} else {
|
||||||
|
token += String.fromCharCode(byte);
|
||||||
}
|
}
|
||||||
} else if (byte == 0x5B || byte == 0x5D) {
|
|
||||||
error('CMAP list parsing is not implemented');
|
|
||||||
} else {
|
|
||||||
token += String.fromCharCode(byte);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/* // firstChar and width are required
|
||||||
|
// (except for 14 standard fonts)
|
||||||
|
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
|
||||||
|
var widths = xref.fetchIfRef(fontDict.get('Widths')) || [];
|
||||||
|
for (var j = 0; j < widths.length; j++) {
|
||||||
|
if (widths[j])
|
||||||
|
charset.push(encoding[j + firstChar]);
|
||||||
|
}
|
||||||
|
*/ }
|
||||||
|
|
||||||
if (!fd) {
|
if (!fd) {
|
||||||
var baseFontName = fontDict.get('BaseFont');
|
var baseFontName = fontDict.get('BaseFont');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user