diff --git a/src/core/obj.js b/src/core/obj.js index 2037688d2..833ca4215 100644 --- a/src/core/obj.js +++ b/src/core/obj.js @@ -597,6 +597,7 @@ var Catalog = (function CatalogClosure() { var nodesToVisit = [this.catDict.getRaw('Pages')]; var currentPageIndex = 0; var xref = this.xref; + var checkAllKids = false; function next() { while (nodesToVisit.length) { @@ -604,7 +605,7 @@ var Catalog = (function CatalogClosure() { if (isRef(currentNode)) { xref.fetchAsync(currentNode).then(function (obj) { - if ((isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids')))) { + if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { if (pageIndex === currentPageIndex) { capability.resolve([obj, currentNode]); } else { @@ -619,12 +620,17 @@ var Catalog = (function CatalogClosure() { return; } - // must be a child page dictionary + // Must be a child page dictionary. assert( isDict(currentNode), 'page dictionary kid reference points to wrong type of object' ); var count = currentNode.get('Count'); + // If the current node doesn't have any children, avoid getting stuck + // in an empty node further down in the tree (see issue5644.pdf). + if (count === 0) { + checkAllKids = true; + } // Skip nodes where the page can't be. if (currentPageIndex + count <= pageIndex) { currentPageIndex += count; @@ -633,7 +639,7 @@ var Catalog = (function CatalogClosure() { var kids = currentNode.get('Kids'); assert(isArray(kids), 'page dictionary kids object is not an array'); - if (count === kids.length) { + if (!checkAllKids && count === kids.length) { // Nodes that don't have the page have been skipped and this is the // bottom of the tree which means the page requested must be a // descendant of this pages node. Ideally we would just resolve the diff --git a/test/pdfs/issue5644.pdf.link b/test/pdfs/issue5644.pdf.link new file mode 100644 index 000000000..fe447e6e8 --- /dev/null +++ b/test/pdfs/issue5644.pdf.link @@ -0,0 +1 @@ +http://web.archive.org/web/20140703204310/http://repository.readscheme.org/ftp/papers/sw2010/06-barland.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 5a511510f..1eba029ec 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -833,6 +833,15 @@ "link": false, "type": "eq" }, + { "id": "issue5644", + "file": "pdfs/issue5644.pdf", + "md5": "6f9313c5043b3ecb0ab2df321d3e1847", + "rounds": 1, + "link": true, + "firstPage": 1, + "lastPage": 6, + "type": "eq" + }, { "id": "bug866395", "file": "pdfs/bug866395.pdf", "md5": "f03bc77e84637241980b09a0a220f575",