Merge pull request #5655 from Snuffleupagus/issue-5644
Avoid getting stuck in empty nodes in the Pages tree when calling |Catalog_getPageDict| (issue 5644)
This commit is contained in:
commit
846eb967cc
@ -597,6 +597,7 @@ var Catalog = (function CatalogClosure() {
|
|||||||
var nodesToVisit = [this.catDict.getRaw('Pages')];
|
var nodesToVisit = [this.catDict.getRaw('Pages')];
|
||||||
var currentPageIndex = 0;
|
var currentPageIndex = 0;
|
||||||
var xref = this.xref;
|
var xref = this.xref;
|
||||||
|
var checkAllKids = false;
|
||||||
|
|
||||||
function next() {
|
function next() {
|
||||||
while (nodesToVisit.length) {
|
while (nodesToVisit.length) {
|
||||||
@ -604,7 +605,7 @@ var Catalog = (function CatalogClosure() {
|
|||||||
|
|
||||||
if (isRef(currentNode)) {
|
if (isRef(currentNode)) {
|
||||||
xref.fetchAsync(currentNode).then(function (obj) {
|
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) {
|
if (pageIndex === currentPageIndex) {
|
||||||
capability.resolve([obj, currentNode]);
|
capability.resolve([obj, currentNode]);
|
||||||
} else {
|
} else {
|
||||||
@ -619,12 +620,17 @@ var Catalog = (function CatalogClosure() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// must be a child page dictionary
|
// Must be a child page dictionary.
|
||||||
assert(
|
assert(
|
||||||
isDict(currentNode),
|
isDict(currentNode),
|
||||||
'page dictionary kid reference points to wrong type of object'
|
'page dictionary kid reference points to wrong type of object'
|
||||||
);
|
);
|
||||||
var count = currentNode.get('Count');
|
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.
|
// Skip nodes where the page can't be.
|
||||||
if (currentPageIndex + count <= pageIndex) {
|
if (currentPageIndex + count <= pageIndex) {
|
||||||
currentPageIndex += count;
|
currentPageIndex += count;
|
||||||
@ -633,7 +639,7 @@ var Catalog = (function CatalogClosure() {
|
|||||||
|
|
||||||
var kids = currentNode.get('Kids');
|
var kids = currentNode.get('Kids');
|
||||||
assert(isArray(kids), 'page dictionary kids object is not an array');
|
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
|
// 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
|
// bottom of the tree which means the page requested must be a
|
||||||
// descendant of this pages node. Ideally we would just resolve the
|
// descendant of this pages node. Ideally we would just resolve the
|
||||||
|
1
test/pdfs/issue5644.pdf.link
Normal file
1
test/pdfs/issue5644.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://web.archive.org/web/20140703204310/http://repository.readscheme.org/ftp/papers/sw2010/06-barland.pdf
|
@ -833,6 +833,15 @@
|
|||||||
"link": false,
|
"link": false,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue5644",
|
||||||
|
"file": "pdfs/issue5644.pdf",
|
||||||
|
"md5": "6f9313c5043b3ecb0ab2df321d3e1847",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"firstPage": 1,
|
||||||
|
"lastPage": 6,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "bug866395",
|
{ "id": "bug866395",
|
||||||
"file": "pdfs/bug866395.pdf",
|
"file": "pdfs/bug866395.pdf",
|
||||||
"md5": "f03bc77e84637241980b09a0a220f575",
|
"md5": "f03bc77e84637241980b09a0a220f575",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user