Support reading all parts of a Type2 file
This commit is contained in:
parent
87b4cb85be
commit
714571dc80
89
PDFFont.js
89
PDFFont.js
@ -664,7 +664,7 @@ var Type1Font = function(aFontName, aFontFile) {
|
|||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
function decodeType2DictData(aString, aDictionary, aHack) {
|
function decodeType2DictData(aString, aDictionary, aHack, aUseRealNumber) {
|
||||||
var data = [];
|
var data = [];
|
||||||
|
|
||||||
var value = "";
|
var value = "";
|
||||||
@ -672,8 +672,6 @@ function decodeType2DictData(aString, aDictionary, aHack) {
|
|||||||
for (var i = 0; i < count; i) {
|
for (var i = 0; i < count; i) {
|
||||||
value = aString[i++];
|
value = aString[i++];
|
||||||
if (value <= 0) {
|
if (value <= 0) {
|
||||||
data.push(value);
|
|
||||||
continue;
|
|
||||||
} else if (value == 28) {
|
} else if (value == 28) {
|
||||||
value = aString[i++] << 8 | aString[i++];
|
value = aString[i++] << 8 | aString[i++];
|
||||||
} else if (value == 29) {
|
} else if (value == 29) {
|
||||||
@ -681,22 +679,72 @@ function decodeType2DictData(aString, aDictionary, aHack) {
|
|||||||
aString[i++] << 16 |
|
aString[i++] << 16 |
|
||||||
aString[i++] << 8 |
|
aString[i++] << 8 |
|
||||||
aString[i++];
|
aString[i++];
|
||||||
|
} else if (aUseRealNumber && value == 30) {
|
||||||
|
value = "";
|
||||||
|
var done = false;
|
||||||
|
while (!done) {
|
||||||
|
var byte = aString[i++];
|
||||||
|
var nibbles = [parseInt(byte / 16), parseInt(byte % 16)];
|
||||||
|
for (var j = 0; j < nibbles.length; j++) {
|
||||||
|
var nibble = nibbles[j];
|
||||||
|
dump(nibble + "\n");
|
||||||
|
switch (nibble) {
|
||||||
|
case 0x0:
|
||||||
|
case 0x1:
|
||||||
|
case 0x2:
|
||||||
|
case 0x3:
|
||||||
|
case 0x4:
|
||||||
|
case 0x5:
|
||||||
|
case 0x6:
|
||||||
|
case 0x7:
|
||||||
|
case 0x8:
|
||||||
|
case 0x9:
|
||||||
|
value += nibble;
|
||||||
|
break;
|
||||||
|
case 0xA:
|
||||||
|
value += ".";
|
||||||
|
break;
|
||||||
|
case 0xB:
|
||||||
|
value += "E";
|
||||||
|
break;
|
||||||
|
case 0xC:
|
||||||
|
value += "E-";
|
||||||
|
break;
|
||||||
|
case 0xD:
|
||||||
|
break;
|
||||||
|
case 0xE:
|
||||||
|
value += "-";
|
||||||
|
break;
|
||||||
|
case 0xF:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error(nibble + " is unssuported");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
value = parseFloat(value);
|
||||||
} else if (value < 32) {
|
} else if (value < 32) {
|
||||||
var oldValue = value;
|
|
||||||
if (value == 12) {
|
if (value == 12) {
|
||||||
value = aDictionary["12"][aString[i++]];
|
value = aDictionary["12"][aString[i++]];
|
||||||
} else {
|
} else if (aDictionary[value]) {
|
||||||
value = aDictionary[value];
|
value = aDictionary[value];
|
||||||
|
} else {
|
||||||
|
error(value + " is an invalid command number");
|
||||||
}
|
}
|
||||||
if (!value)
|
|
||||||
throw new Error("This command number does not match anything : " + oldValue);
|
|
||||||
value = aHack ? value.name : value;
|
value = aHack ? value.name : value;
|
||||||
} else if (value <= 246) {
|
} else if (value <= 246) {
|
||||||
value = parseInt(value) - 139;
|
value = parseInt(value) - 139;
|
||||||
} else if (value <= 250) {
|
} else if (value <= 250) {
|
||||||
value = ((value - 247) * 256) + parseInt(aString[i++]) + 108;
|
value = ((value - 247) * 256) + aString[i++] + 108;
|
||||||
} else if (value <= 254) {
|
} else if (value <= 254) {
|
||||||
value = -((value - 251) * 256) - parseInt(aString[i++]) - 108;
|
value = -((value - 251) * 256) - aString[i++] - 108;
|
||||||
|
} else if (value == 255) {
|
||||||
|
var byte = aString[i++];
|
||||||
|
var high = (byte >> 1);
|
||||||
|
value = (byte - high) << 24 | aString[i++] << 16 |
|
||||||
|
aString[i++] << 8 | aString[i];
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Value should not be 255");
|
throw new Error("Value should not be 255");
|
||||||
}
|
}
|
||||||
@ -780,8 +828,8 @@ var Type2Parser = function(aFilePath) {
|
|||||||
break;
|
break;
|
||||||
case "number number":
|
case "number number":
|
||||||
font.set(token.name, {
|
font.set(token.name, {
|
||||||
size: stack.pop(),
|
offset: stack.pop(),
|
||||||
offset: stack.pop()
|
size: stack.pop()
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case "boolean":
|
case "boolean":
|
||||||
@ -859,16 +907,19 @@ var Type2Parser = function(aFilePath) {
|
|||||||
for (var i = 0; i < count; i++)
|
for (var i = 0; i < count; i++)
|
||||||
parseAsToken(topDict[i], CFFDictOps);
|
parseAsToken(topDict[i], CFFDictOps);
|
||||||
|
|
||||||
|
var topDictOffset = aStream.pos;
|
||||||
|
|
||||||
for (var p in font.map)
|
for (var p in font.map)
|
||||||
dump(p + "::" + font.get(p));
|
dump(p + "::" + font.get(p));
|
||||||
|
|
||||||
// Read the Subr Index
|
// Read the Global Subr Index that comes just after the Strings Index
|
||||||
|
// (cf. "The Compact Font Format Specification" Chapter 16)
|
||||||
dump("Reading Subr Index");
|
dump("Reading Subr Index");
|
||||||
var subrs = readIndex(aStream);
|
var subrs = readIndex(aStream);
|
||||||
|
|
||||||
// Read CharStrings Index
|
// Read CharStrings Index
|
||||||
dump("Read CharStrings Index");
|
|
||||||
var charStringsOffset = font.get("CharStrings");
|
var charStringsOffset = font.get("CharStrings");
|
||||||
|
dump("Read CharStrings Index (offset: " + charStringsOffset + ")");
|
||||||
aStream.pos = charStringsOffset;
|
aStream.pos = charStringsOffset;
|
||||||
var charStrings = readIndex(aStream, true);
|
var charStrings = readIndex(aStream, true);
|
||||||
|
|
||||||
@ -885,8 +936,16 @@ var Type2Parser = function(aFilePath) {
|
|||||||
var charset = readCharset(aStream, charStrings);
|
var charset = readCharset(aStream, charStrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Encoding data
|
// Reading Private Dict
|
||||||
log("Reading encoding data");
|
var private = font.get("Private");
|
||||||
|
log("Reading Private Dict (offset: " + private.offset + " size: " + private.size + ")");
|
||||||
|
aStream.pos = private.offset;
|
||||||
|
|
||||||
|
var privateDict = [];
|
||||||
|
for (var i = 0; i < private.size; i++)
|
||||||
|
privateDict.push(aStream.getByte());
|
||||||
|
log(privateDict);
|
||||||
|
log(decodeType2DictData(privateDict, CFFDictPrivate, true, true));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -697,3 +697,79 @@ var CFFDictCommands = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var CFFDictPrivate = {
|
||||||
|
"6": {
|
||||||
|
name: "BluesValues",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
name: "OtherBlues",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
name: "FamilyBlues",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
name: "FamilyOtherBlues",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
name: "StdHW",
|
||||||
|
operand: null
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
name: "StdVW",
|
||||||
|
operand: null
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"9": {
|
||||||
|
name: "BlueScale",
|
||||||
|
operand: 0.039625
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
name: "BlueShift",
|
||||||
|
operand: 7
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
name: "BlueFuzz",
|
||||||
|
operand: 1
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
name: "StemSnapH",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
name: "StemSnapV",
|
||||||
|
operand: "delta"
|
||||||
|
},
|
||||||
|
"14": {
|
||||||
|
name: "ForceBold",
|
||||||
|
operand: "boolean"
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
name: "LanguageGroup",
|
||||||
|
operand: 0
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
name: "ExpansionFactor",
|
||||||
|
operand: 0.06
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
name: "initialRandomSeed",
|
||||||
|
operand: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
name: "Subrs",
|
||||||
|
operand: null
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
name: "defaultWidthX",
|
||||||
|
operand: 0
|
||||||
|
},
|
||||||
|
"21": {
|
||||||
|
name: "nominalWidthX",
|
||||||
|
operand: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user