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

15
pdf.js

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

Loading…
Cancel
Save