Browse Source

Add '^M' support in the ASCII85Decode filter and fix the fonts code to load the Type1 spec

Vivien Nicolas 14 years ago
parent
commit
83f930abd6
  1. 38
      fonts.js
  2. 15
      pdf.js

38
fonts.js

@ -1562,6 +1562,10 @@ var Type1Parser = function() { @@ -1562,6 +1562,10 @@ var Type1Parser = function() {
return parseFloat(str.substr(start, count) || 0);
};
function isSeparator(c) {
return c == ' ' || c == '\n' || c == '\x0d';
};
this.extractFontProgram = function t1_extractFontProgram(stream) {
var eexec = decrypt(stream, kEexecEncryptionKey, 4);
var eexecStr = '';
@ -1586,12 +1590,12 @@ var Type1Parser = function() { @@ -1586,12 +1590,12 @@ var Type1Parser = function() {
var c = '';
var count = eexecStr.length;
for (var i = 0; i < count; i++) {
var getToken = function() {
while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n'))
var getToken = function getToken() {
while (i < count && isSeparator(eexecStr[i]))
++i;
var token = '';
while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n'))
while (i < count && !isSeparator(eexecStr[i]))
token += eexecStr[i++];
return token;
@ -1618,7 +1622,7 @@ var Type1Parser = function() { @@ -1618,7 +1622,7 @@ var Type1Parser = function() {
}
i += length;
token = '';
} else if (c == ' ' || c == '\n') {
} else if (isSeparator(c)) {
length = parseInt(token);
token = '';
} else {
@ -1695,13 +1699,13 @@ var Type1Parser = function() { @@ -1695,13 +1699,13 @@ var Type1Parser = function() {
var token = '';
var count = headerString.length;
for (var i = 0; i < count; i++) {
var getToken = function() {
var getToken = function getToken() {
var char = headerString[i];
while (i < count && (char == ' ' || char == '\n' || char == '/'))
while (i < count && (isSeparator(char) || char == '/'))
char = headerString[++i];
var token = '';
while (i < count && !(char == ' ' || char == '\n' || char == '/')) {
while (i < count && !(isSeparator(char) || char == '/')) {
token += char;
char = headerString[++i];
}
@ -1710,7 +1714,7 @@ var Type1Parser = function() { @@ -1710,7 +1714,7 @@ var Type1Parser = function() {
};
var c = headerString[i];
if (c == ' ' || c == '\n') {
if (isSeparator(c)) {
switch (token) {
case '/FontMatrix':
var matrix = readNumberArray(headerString, i + 1);
@ -1736,7 +1740,7 @@ var Type1Parser = function() { @@ -1736,7 +1740,7 @@ var Type1Parser = function() {
if ('undefined' == typeof(properties.differences[index])) {
properties.encoding[index] = glyph;
properties.glyphs[glyph] = GlyphsUnicode[glyph];
properties.glyphs[glyph] = GlyphsUnicode[glyph] || index;
}
getToken(); // read the in 'put'
}
@ -1752,8 +1756,8 @@ var Type1Parser = function() { @@ -1752,8 +1756,8 @@ var Type1Parser = function() {
};
/**
* The CFF class takes a Type1 file and wrap it into a 'Compact Font Format',
* which itself embed Type2 charstrings.
* The CFF class takes a Type1 file and wrap it into a
* 'Compact Font Format' which itself embed Type2 charstrings.
*/
var CFFStrings = [
'.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
@ -1827,19 +1831,11 @@ var type1Parser = new Type1Parser(); @@ -1827,19 +1831,11 @@ var type1Parser = new Type1Parser();
var CFF = function(name, file, properties) {
// Get the data block containing glyphs and subrs informations
var length1 = file.dict.get('Length1');
if (!IsNum(length1))
length1 = length1.num;
var length2 = file.dict.get('Length2');
if (!IsNum(length2))
length2 = length2.num;
var headerBlock = file.getBytes(length1);
var headerBlock = file.getBytes(properties.length1);
type1Parser.extractFontHeader(headerBlock, properties);
// Decrypt the data blocks and retrieve it's content
var eexecBlock = file.getBytes(length2);
var eexecBlock = file.getBytes(properties.length2);
var data = type1Parser.extractFontProgram(eexecBlock);
for (var info in data.properties)
properties[info] = data.properties[info];

15
pdf.js

@ -2358,7 +2358,7 @@ var Lexer = (function() { @@ -2358,7 +2358,7 @@ var Lexer = (function() {
}
constructor.isSpace = function(ch) {
return ch == ' ' || ch == '\t';
return ch == ' ' || ch == '\t' || ch == '\x0d';
};
// A '1' in this array means the character is white space. A '1' or
@ -4428,6 +4428,7 @@ var PartialEvaluator = (function() { @@ -4428,6 +4428,7 @@ var PartialEvaluator = (function() {
fontName = fontName.name.replace(/[\+,\-]/g, '_');
var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
var length1, length2;
if (fontFile) {
fontFile = xref.fetchIfRef(fontFile);
@ -4436,6 +4437,14 @@ var PartialEvaluator = (function() { @@ -4436,6 +4437,14 @@ var PartialEvaluator = (function() {
if (fileType)
fileType = fileType.name;
}
length1 = fontFile.dict.get('Length1');
if (!IsInt(length1))
length1 = xref.fetchIfRef(length1);
length2 = fontFile.dict.get('Length2');
if (!IsInt(length2))
length2 = xref.fetchIfRef(length2);
}
var widths = fontDict.get('Widths');
@ -4464,7 +4473,9 @@ var PartialEvaluator = (function() { @@ -4464,7 +4473,9 @@ var PartialEvaluator = (function() {
italicAngle: descriptor.get('ItalicAngle'),
fixedPitch: false,
textMatrix: IDENTITY_MATRIX,
compositeFont: compositeFont
compositeFont: compositeFont,
length1: length1,
length2: length2
};
return {

Loading…
Cancel
Save