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
