Blob Blame History Raw
--- poppler-0.26.5/poppler/PSOutputDev.cc
+++ poppler-0.26.5/poppler/PSOutputDev.cc
@@ -2069,7 +2069,7 @@ void PSOutputDev::setupEmbeddedType1Font
   static const char hexChar[17] = "0123456789abcdef";
   Object refObj, strObj, obj1, obj2, obj3;
   Dict *dict;
-  int length1, length2, length3;
+  long length1, length2, length3;
   int c;
   int start[4];
   GBool binMode;
@@ -2119,8 +2119,18 @@ void PSOutputDev::setupEmbeddedType1Font
   embFontList->append(psName->getCString());
   embFontList->append("\n");
 
-  // copy ASCII portion of font
   strObj.streamReset();
+  if (strObj.streamGetChar() == 0x80 &&
+      strObj.streamGetChar() == 1) {
+    // PFB format
+    length1 = strObj.streamGetChar() |
+             (strObj.streamGetChar() << 8) |
+             (strObj.streamGetChar() << 16) |
+             (strObj.streamGetChar() << 24);
+  } else {
+    strObj.streamReset();
+  }
+  // copy ASCII portion of font
   for (i = 0; i < length1 && (c = strObj.streamGetChar()) != EOF; ++i) {
     writePSChar(c);
   }
@@ -2153,9 +2163,18 @@ void PSOutputDev::setupEmbeddedType1Font
 
   // convert binary data to ASCII
   if (binMode) {
-    for (i = 0; i < 4; ++i) {
-      writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
-      writePSChar(hexChar[start[i] & 0x0f]);
+    if (start[0] == 0x80 &&
+        start[1] == 2) {
+      length2 = start[2] |
+               (start[3] << 8) |
+               (strObj.streamGetChar() << 16) |
+               (strObj.streamGetChar() << 24);
+      i = 0;
+    } else {
+      for (i = 0; i < 4; ++i) {
+        writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
+        writePSChar(hexChar[start[i] & 0x0f]);
+      }
     }
 #if 0 // this causes trouble for various PostScript printers
     // if Length2 is incorrect (too small), font data gets chopped, so
@@ -2193,8 +2212,32 @@ void PSOutputDev::setupEmbeddedType1Font
   {
     if (length3 > 0) {
       // write fixed-content portion
-      while ((c = strObj.streamGetChar()) != EOF) {
-	writePSChar(c);
+      c = strObj.streamGetChar();
+      if (c == 0x80) {
+        c = strObj.streamGetChar();
+        if (c == 1) {
+          length3 = strObj.streamGetChar() |
+                   (strObj.streamGetChar() << 8) |
+                   (strObj.streamGetChar() << 16) |
+                   (strObj.streamGetChar() << 24);
+
+          i = 0;
+          while (i < length3) {
+            if ((c = strObj.streamGetChar()) == EOF) {
+              break;
+            }
+            writePSChar(c);
+            ++i;
+          }
+        }
+      } else {
+        if (c != EOF) {
+          writePSChar(c);
+
+          while ((c = strObj.streamGetChar()) != EOF) {
+	    writePSChar(c);
+	  }
+        }
       }
     } else {
       // write padding and "cleartomark"