poppler/PDFDoc.cc | 33 ++++++++++++++++++++++----------- poppler/PDFDoc.h | 8 ++++---- 2 files changed, 26 insertions(+), 15 deletions(-)
New commits: commit db909c2a14f962234a813ba9853535b9692cfd5a Author: Albert Astals Cid <[email protected]> Date: Wed Feb 26 22:09:44 2014 +0100 Try harder to open broken files Bug #75232 diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index d7aae9f..4f3ab31 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005, 2006, 2008 Brad Hards <[email protected]> -// Copyright (C) 2005, 2007-2009, 2011-2013 Albert Astals Cid <[email protected]> +// Copyright (C) 2005, 2007-2009, 2011-2014 Albert Astals Cid <[email protected]> // Copyright (C) 2008 Julien Rebetez <[email protected]> // Copyright (C) 2008, 2010 Pino Toscano <[email protected]> // Copyright (C) 2008, 2010, 2011 Carlos Garcia Campos <[email protected]> @@ -259,9 +259,16 @@ GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) { // read xref table xref = new XRef(str, getStartXRef(), getMainXRefEntriesOffset(), &wasReconstructed); if (!xref->isOk()) { - error(errSyntaxError, -1, "Couldn't read xref table"); - errCode = xref->getErrorCode(); - return gFalse; + if (wasReconstructed) { + delete xref; + startXRefPos = -1; + xref = new XRef(str, getStartXRef(gTrue), getMainXRefEntriesOffset(gTrue), &wasReconstructed); + } + if (!xref->isOk()) { + error(errSyntaxError, -1, "Couldn't read xref table"); + errCode = xref->getErrorCode(); + return gFalse; + } } // check for encryption @@ -517,12 +524,16 @@ Linearization *PDFDoc::getLinearization() return linearization; } -GBool PDFDoc::isLinearized() { +GBool PDFDoc::isLinearized(GBool tryingToReconstruct) { if ((str->getLength()) && (getLinearization()->getLength() == str->getLength())) return gTrue; - else - return gFalse; + else { + if (tryingToReconstruct) + return getLinearization()->getLength() > 0; + else + return gFalse; + } } static GBool @@ -1635,11 +1646,11 @@ long long PDFDoc::strToLongLong(char *s) { } // Read the 'startxref' position. -Goffset PDFDoc::getStartXRef() +Goffset PDFDoc::getStartXRef(GBool tryingToReconstruct) { if (startXRefPos == -1) { - if (isLinearized()) { + if (isLinearized(tryingToReconstruct)) { char buf[linearizationSearchSize+1]; int c, n, i; @@ -1697,11 +1708,11 @@ Goffset PDFDoc::getStartXRef() return startXRefPos; } -Goffset PDFDoc::getMainXRefEntriesOffset() +Goffset PDFDoc::getMainXRefEntriesOffset(GBool tryingToReconstruct) { Guint mainXRefEntriesOffset = 0; - if (isLinearized()) { + if (isLinearized(tryingToReconstruct)) { mainXRefEntriesOffset = getLinearization()->getMainXRefEntriesOffset(); } diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 42c7cba..1e5b808 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005, 2006, 2008 Brad Hards <[email protected]> -// Copyright (C) 2005, 2009 Albert Astals Cid <[email protected]> +// Copyright (C) 2005, 2009, 2014 Albert Astals Cid <[email protected]> // Copyright (C) 2008 Julien Rebetez <[email protected]> // Copyright (C) 2008 Pino Toscano <[email protected]> // Copyright (C) 2008 Carlos Garcia Campos <[email protected]> @@ -219,7 +219,7 @@ public: // Is this document linearized? - GBool isLinearized(); + GBool isLinearized(GBool tryingToReconstruct = gFalse); // Return the document's Info dictionary (if any). Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); } @@ -301,10 +301,10 @@ private: void checkHeader(); GBool checkEncryption(GooString *ownerPassword, GooString *userPassword); // Get the offset of the start xref table. - Goffset getStartXRef(); + Goffset getStartXRef(GBool tryingToReconstruct = gFalse); // Get the offset of the entries in the main XRef table of a // linearized document (0 for non linearized documents). - Goffset getMainXRefEntriesOffset(); + Goffset getMainXRefEntriesOffset(GBool tryingToReconstruct = gFalse); long long strToLongLong(char *s); GooString *fileName; _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
