Char code to unicode conversion
This commit is contained in:
parent
3b72c6063c
commit
94cc2cdb75
@ -505,11 +505,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
||||
var items = args[0];
|
||||
for (var j = 0, jj = items.length; j < jj; j++) {
|
||||
if (typeof items[j] === 'string')
|
||||
text += items[j];
|
||||
text += fontCharsToUnicode(items[j], font.translated.properties);
|
||||
}
|
||||
break;
|
||||
case 'Tj':
|
||||
text += args[0];
|
||||
text += fontCharsToUnicode(args[0], font.translated.properties);;
|
||||
break;
|
||||
} // switch
|
||||
|
||||
|
74
src/fonts.js
74
src/fonts.js
@ -723,6 +723,48 @@ function isSpecialUnicode(unicode) {
|
||||
unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
|
||||
}
|
||||
|
||||
function fontCharsToUnicode(charCodes, fontProperties) {
|
||||
var toUnicode = fontProperties.toUnicode;
|
||||
var composite = fontProperties.composite;
|
||||
var encoding, differences, cidToUnicode;
|
||||
var result = '';
|
||||
if (composite) {
|
||||
cidToUnicode = fontProperties.cidToUnicode
|
||||
for (var i = 0, ii = charCodes.length; i < ii; i += 2) {
|
||||
var charCode = (charCodes.charCodeAt(i) << 8) | charCodes.charCodeAt(i + 1);
|
||||
if (toUnicode && charCode in toUnicode) {
|
||||
var unicode = toUnicode[charCode];
|
||||
result += typeof unicode !== 'number' ? unicode :
|
||||
String.fromCharCode(unicode);
|
||||
continue;
|
||||
}
|
||||
result += String.fromCharCode(!cidToUnicode ? charCode :
|
||||
cidToUnicode[charCode] || charCode)
|
||||
}
|
||||
} else {
|
||||
differences = fontProperties.differences;
|
||||
encoding = fontProperties.baseEncoding;
|
||||
for (var i = 0, ii = charCodes.length; i < ii; i++) {
|
||||
var charCode = charCodes.charCodeAt(i);
|
||||
if (toUnicode && charCode in toUnicode) {
|
||||
var unicode = toUnicode[charCode];
|
||||
result += typeof unicode !== 'number' ? unicode :
|
||||
String.fromCharCode(unicode);
|
||||
continue;
|
||||
}
|
||||
|
||||
var glyphName = charCode in differences ? differences[charCode] :
|
||||
encoding[charCode];
|
||||
if (glyphName in GlyphsUnicode) {
|
||||
result += String.fromCharCode(GlyphsUnicode[glyphName]);
|
||||
continue;
|
||||
}
|
||||
result += String.fromCharCode(charCode)
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 'Font' is the class the outside world should use, it encapsulate all the font
|
||||
* decoding logics whatever type it is (assuming the font type is supported).
|
||||
@ -2098,7 +2140,7 @@ var Font = (function FontClosure() {
|
||||
},
|
||||
|
||||
charToGlyph: function fonts_charToGlyph(charcode) {
|
||||
var unicode, width, codeIRQueue;
|
||||
var fontChar, width, codeIRQueue;
|
||||
|
||||
var width = this.widths[charcode];
|
||||
|
||||
@ -2106,38 +2148,38 @@ var Font = (function FontClosure() {
|
||||
case 'CIDFontType0':
|
||||
if (this.noUnicodeAdaptation) {
|
||||
width = this.widths[this.unicodeToCID[charcode] || charcode];
|
||||
unicode = charcode;
|
||||
fontChar = charcode;
|
||||
break;
|
||||
}
|
||||
unicode = this.toUnicode[charcode] || charcode;
|
||||
fontChar = this.toUnicode[charcode] || charcode;
|
||||
break;
|
||||
case 'CIDFontType2':
|
||||
if (this.noUnicodeAdaptation) {
|
||||
width = this.widths[this.unicodeToCID[charcode] || charcode];
|
||||
unicode = charcode;
|
||||
fontChar = charcode;
|
||||
break;
|
||||
}
|
||||
unicode = this.toUnicode[charcode] || charcode;
|
||||
fontChar = this.toUnicode[charcode] || charcode;
|
||||
break;
|
||||
case 'Type1':
|
||||
var glyphName = this.differences[charcode] || this.encoding[charcode];
|
||||
if (!isNum(width))
|
||||
width = this.widths[glyphName];
|
||||
if (this.noUnicodeAdaptation) {
|
||||
unicode = GlyphsUnicode[glyphName] || charcode;
|
||||
fontChar = GlyphsUnicode[glyphName] || charcode;
|
||||
break;
|
||||
}
|
||||
unicode = this.glyphNameMap[glyphName] ||
|
||||
fontChar = this.glyphNameMap[glyphName] ||
|
||||
GlyphsUnicode[glyphName] || charcode;
|
||||
break;
|
||||
case 'Type3':
|
||||
var glyphName = this.differences[charcode] || this.encoding[charcode];
|
||||
codeIRQueue = this.charProcIRQueues[glyphName];
|
||||
unicode = charcode;
|
||||
fontChar = charcode;
|
||||
break;
|
||||
case 'TrueType':
|
||||
if (this.useToUnicode) {
|
||||
unicode = this.toUnicode[charcode] || charcode;
|
||||
fontChar = this.toUnicode[charcode] || charcode;
|
||||
break;
|
||||
}
|
||||
var glyphName = this.differences[charcode] || this.encoding[charcode];
|
||||
@ -2146,19 +2188,19 @@ var Font = (function FontClosure() {
|
||||
if (!isNum(width))
|
||||
width = this.widths[glyphName];
|
||||
if (this.noUnicodeAdaptation) {
|
||||
unicode = GlyphsUnicode[glyphName] || charcode;
|
||||
fontChar = GlyphsUnicode[glyphName] || charcode;
|
||||
break;
|
||||
}
|
||||
if (!this.hasEncoding) {
|
||||
unicode = this.useToUnicode ? this.toUnicode[charcode] : charcode;
|
||||
fontChar = this.useToUnicode ? this.toUnicode[charcode] : charcode;
|
||||
break;
|
||||
}
|
||||
if (this.hasShortCmap && false) {
|
||||
var j = Encodings.MacRomanEncoding.indexOf(glyphName);
|
||||
unicode = j >= 0 ? j :
|
||||
fontChar = j >= 0 ? j :
|
||||
this.glyphNameMap[glyphName];
|
||||
} else {
|
||||
unicode = glyphName in GlyphsUnicode ?
|
||||
fontChar = glyphName in GlyphsUnicode ?
|
||||
GlyphsUnicode[glyphName] :
|
||||
this.glyphNameMap[glyphName];
|
||||
}
|
||||
@ -2168,15 +2210,15 @@ var Font = (function FontClosure() {
|
||||
break;
|
||||
}
|
||||
|
||||
var unicodeChars = !('toUnicode' in this) ? charcode :
|
||||
this.toUnicode[charcode] || charcode;
|
||||
var unicodeChars = !('toUnicode' in this) ? fontChar :
|
||||
this.toUnicode[charcode] || fontChar;
|
||||
if (typeof unicodeChars === 'number')
|
||||
unicodeChars = String.fromCharCode(unicodeChars);
|
||||
|
||||
width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
|
||||
|
||||
return {
|
||||
fontChar: String.fromCharCode(unicode),
|
||||
fontChar: String.fromCharCode(fontChar),
|
||||
unicode: unicodeChars,
|
||||
width: width,
|
||||
codeIRQueue: codeIRQueue
|
||||
|
Loading…
x
Reference in New Issue
Block a user