poppler/Catalog.cc |   37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

New commits:
commit d91876a0c7a936b1f6f461d80131d7586a6c1a5e
Author: Albert Astals Cid <[email protected]>
Date:   Thu Jan 8 20:13:06 2015 +0100

    Accept malformed documents whose root is a Page instead of a Pages
    
    gs and Adobe Reader do it so it's "common" enough
    
    Bug #88172

diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index 039f63e..f75f4e1 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005 Kristian Høgsberg <[email protected]>
-// Copyright (C) 2005-2013 Albert Astals Cid <[email protected]>
+// Copyright (C) 2005-2013, 2015 Albert Astals Cid <[email protected]>
 // Copyright (C) 2005 Jeff Muizelaar <[email protected]>
 // Copyright (C) 2005 Jonathan Blandford <[email protected]>
 // Copyright (C) 2005 Marco Pesenti Gritti <[email protected]>
@@ -807,7 +807,6 @@ int Catalog::getNumPages()
       return 0;
     }
     catDict.dictLookup("Pages", &pagesDict);
-    catDict.free();
 
     // This should really be isDict("Pages"), but I've seen at least one
     // PDF file where the /Type entry is missing.
@@ -815,19 +814,47 @@ int Catalog::getNumPages()
       error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})",
           pagesDict.getTypeName());
       pagesDict.free();
+      catDict.free();
       return 0;
     }
 
     pagesDict.dictLookup("Count", &obj);
     // some PDF files actually use real numbers here ("/Count 9.0")
     if (!obj.isNum()) {
-      error(errSyntaxError, -1, "Page count in top-level pages object is wrong 
type ({0:s})",
-         obj.getTypeName());
-      numPages = 0;
+      if (pagesDict.dictIs("Page")) {
+       Object pageRootRef;
+       catDict.dictLookupNF("Pages", &pageRootRef);
+
+       error(errSyntaxError, -1, "Pages top-level is a single Page. The 
document is mal-formet, trying to recover...");
+
+       Dict *pageDict = pagesDict.getDict();
+       const Ref pageRef = pageRootRef.getRef();
+       Page *p = new Page(doc, 1, pageDict, pageRef, new PageAttrs(NULL, 
pageDict), form);
+       if (p->isOk()) {
+         pages = (Page **)gmallocn(1, sizeof(Page *));
+         pageRefs = (Ref *)gmallocn(1, sizeof(Ref));
+
+         pages[0] = p;
+         pageRefs[0].num = pageRef.num;
+         pageRefs[0].gen = pageRef.gen;
+
+         numPages = 1;
+         lastCachedPage = 1;
+         pagesSize = 1;
+       } else {
+         delete p;
+         numPages = 0;
+       }
+      } else {
+       error(errSyntaxError, -1, "Page count in top-level pages object is 
wrong type ({0:s})",
+         obj.getTypeName());
+       numPages = 0;
+      }
     } else {
       numPages = (int)obj.getNum();
     }
 
+    catDict.free();
     obj.free();
     pagesDict.free();
   }
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to