diff --git a/src/obj.js b/src/obj.js index c905a7dc5..47aed8f8a 100644 --- a/src/obj.js +++ b/src/obj.js @@ -364,9 +364,8 @@ var XRef = (function XRefClosure() { } } - // Sanity check: as per spec, first object must have these properties - if (this.entries[0] && - !(this.entries[0].gen === 65535 && this.entries[0].free)) + // Sanity check: as per spec, first object must be free + if (this.entries[0] && !this.entries[0].free) error('Invalid XRef table: unexpected first object'); // Sanity check @@ -525,7 +524,7 @@ var XRef = (function XRefClosure() { } // reading XRef streams for (var i = 0, ii = xrefStms.length; i < ii; ++i) { - this.readXRef(xrefStms[i]); + this.readXRef(xrefStms[i], true); } // finding main trailer var dict; @@ -548,7 +547,7 @@ var XRef = (function XRefClosure() { // nothing helps error('Invalid PDF structure'); }, - readXRef: function XRef_readXRef(startXRef) { + readXRef: function XRef_readXRef(startXRef, recoveryMode) { var stream = this.stream; stream.pos = startXRef; @@ -581,16 +580,18 @@ var XRef = (function XRefClosure() { error('Invalid XRef stream'); } dict = this.readXRefStream(obj); + if (!dict) + error('Failed to read XRef stream'); } // Recursively get previous dictionary, if any obj = dict.get('Prev'); if (isInt(obj)) - this.readXRef(obj); + this.readXRef(obj, recoveryMode); else if (isRef(obj)) { // The spec says Prev must not be a reference, i.e. "/Prev NNN" // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" - this.readXRef(obj.num); + this.readXRef(obj.num, recoveryMode); } return dict; @@ -598,6 +599,9 @@ var XRef = (function XRefClosure() { log('(while reading XRef): ' + e); } + if (recoveryMode) + return; + warn('Indexing all PDF objects'); return this.indexObjects(); }, diff --git a/test/pdfs/issue1586.pdf.link b/test/pdfs/issue1586.pdf.link new file mode 100644 index 000000000..f66f7f39f --- /dev/null +++ b/test/pdfs/issue1586.pdf.link @@ -0,0 +1 @@ +http://cdn.flamehaus.com/Valve_Handbook_LowRes.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 207c41c22..1dd1f6c1e 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -363,6 +363,13 @@ "link": true, "type": "eq" }, + { "id": "issue1586", + "file": "pdfs/issue1586.pdf", + "md5": "80d396cb306014b24ca82ceb68958fb5", + "rounds": 1, + "link": true, + "type": "load" + }, { "id": "aboutstacks", "file": "pdfs/aboutstacks.pdf", "md5": "6e7c8416a293ba2d83bc8dd20c6ccf51",