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/.gitignore b/test/pdfs/.gitignore index d93dae609..7f2911983 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -18,6 +18,7 @@ !cmykjpeg.pdf !issue840.pdf !scan-bad.pdf +!pdfjsbad1586.pdf !freeculture.pdf !pdfkit_compressed.pdf !TAMReview.pdf diff --git a/test/pdfs/pdfjsbad1586.pdf b/test/pdfs/pdfjsbad1586.pdf new file mode 100644 index 000000000..71c0ed40b Binary files /dev/null and b/test/pdfs/pdfjsbad1586.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 38e7d7ed2..5ec9e850f 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -363,6 +363,12 @@ "link": true, "type": "eq" }, + { "id": "issue1586", + "file": "pdfs/pdfjsbad1586.pdf", + "md5": "793d0870f0b0c613799b0677d64daca4", + "rounds": 1, + "type": "load" + }, { "id": "aboutstacks", "file": "pdfs/aboutstacks.pdf", "md5": "6e7c8416a293ba2d83bc8dd20c6ccf51",