]> git.parisson.com Git - pdf.js.git/commitdiff
Add '^M' support in the ASCII85Decode filter and fix the fonts code to load the Type1...
authorVivien Nicolas <21@vingtetun.org>
Mon, 5 Sep 2011 20:09:40 +0000 (22:09 +0200)
committerVivien Nicolas <21@vingtetun.org>
Mon, 5 Sep 2011 20:09:40 +0000 (22:09 +0200)
fonts.js
pdf.js

index 3234fa1d3d08be1c1ba6e9d486b88e3b25011871..829d783e627179435eb3e00a6e6aa0876cfec3fb 100755 (executable)
--- a/fonts.js
+++ b/fonts.js
@@ -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() {
     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() {
         }
         i += length;
         token = '';
-      } else if (c == ' ' || c == '\n') {
+      } else if (isSeparator(c)) {
         length = parseInt(token);
         token = '';
       } else {
@@ -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() {
       };
 
       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() {
               
                 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() {
 };
 
 /**
- * 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();
 
 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];
diff --git a/pdf.js b/pdf.js
index 51d29725736c63eb140300a3d465ca9267448437..51802d9c7dab9856b62c00cf9de72262086bf631 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -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() {
       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() {
           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() {
         italicAngle: descriptor.get('ItalicAngle'),
         fixedPitch: false,
         textMatrix: IDENTITY_MATRIX,
-        compositeFont: compositeFont
+        compositeFont: compositeFont,
+        length1: length1,
+        length2: length2
       };
 
       return {