poppler/Catalog.cc | 384 +++++++++++++++++++++++++++++++++++++++-------------- poppler/Catalog.h | 43 +++-- poppler/PDFDoc.cc | 17 +- poppler/PDFDoc.h | 2 4 files changed, 327 insertions(+), 119 deletions(-)
New commits: commit d46581c574b3088a82555cbc3b76e95e2571b9c0 Author: Albert Astals Cid <[email protected]> Date: Wed Apr 7 20:25:23 2010 +0100 Fix destructor diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index a0d33cf..74af00e 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005 Kristian Høgsberg <[email protected]> -// Copyright (C) 2005-2009 Albert Astals Cid <[email protected]> +// Copyright (C) 2005-2010 Albert Astals Cid <[email protected]> // Copyright (C) 2005 Jeff Muizelaar <[email protected]> // Copyright (C) 2005 Jonathan Blandford <[email protected]> // Copyright (C) 2005 Marco Pesenti Gritti <[email protected]> @@ -500,7 +500,12 @@ NameTree::NameTree() NameTree::~NameTree() { - this->free(); + int i; + + for (i = 0; i < length; i++) + delete entries[i]; + + gfree(entries); } NameTree::Entry::Entry(Array *array, int index) { @@ -612,16 +617,6 @@ GooString *NameTree::getName(int index) } } -void NameTree::free() -{ - int i; - - for (i = 0; i < length; i++) - delete entries[i]; - - gfree(entries); -} - GBool Catalog::labelToIndex(GooString *label, int *index) { char *end; diff --git a/poppler/Catalog.h b/poppler/Catalog.h index fd1c32e..2cab80a 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005 Kristian Høgsberg <[email protected]> -// Copyright (C) 2005, 2007, 2009 Albert Astals Cid <[email protected]> +// Copyright (C) 2005, 2007, 2009, 2010 Albert Astals Cid <[email protected]> // Copyright (C) 2005 Jonathan Blandford <[email protected]> // Copyright (C) 2005, 2006, 2008 Brad Hards <[email protected]> // Copyright (C) 2007 Julien Rebetez <[email protected]> @@ -54,7 +54,6 @@ public: void init(XRef *xref, Object *tree); void parse(Object *tree); GBool lookup(GooString *name, Object *obj); - void free(); int numEntries() { return length; }; // iterator accessor Object getValue(int i); commit ab14433f8b3d7c67f279cece65dfdd40c6675ac0 Author: Hib Eris <[email protected]> Date: Thu Mar 25 15:33:33 2010 +0100 Parse Form on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index 4135d79..a0d33cf 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -86,12 +86,6 @@ Catalog::Catalog(XRef *xrefA) { // get the AcroForm dictionary catDict.dictLookup("AcroForm", &acroForm); - // load Forms - if (acroForm.isDict()) { - form = new Form(xref,&acroForm); - } - - // read page tree catDict.dictLookup("Pages", &pagesDict); // This should really be isDict("Pages"), but I've seen at least one @@ -153,8 +147,8 @@ Catalog::Catalog(XRef *xrefA) { optContentProps.free(); // perform form-related loading after all widgets have been loaded - if (form) - form->postWidgetsLoad(); + if (getForm()) + getForm()->postWidgetsLoad(); catDict.free(); return; @@ -848,6 +842,17 @@ Object *Catalog::getDests() return &dests; } +Form *Catalog::getForm() +{ + if (!form) { + if (acroForm.isDict()) { + form = new Form(xref,&acroForm); + } + } + + return form; +} + Object *Catalog::getNames() { if (names.isNone()) diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 6021eed..fd1c32e 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -199,7 +199,7 @@ public: OCGs *getOptContentConfig() { return optContent; } - Form* getForm() { return form; } + Form* getForm(); enum PageMode { pageModeNone, commit c72a2c7f70b13a7b7b531b3c983d9a9bc104bac7 Author: Hib Eris <[email protected]> Date: Thu Mar 25 17:33:11 2010 +0100 Parse Names on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index 07b1e20..4135d79 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -74,6 +74,9 @@ Catalog::Catalog(XRef *xrefA) { optContent = NULL; pageMode = pageModeNull; pageLayout = pageLayoutNull; + destNameTree = NULL; + embeddedFileNameTree = NULL; + jsNameTree = NULL; xref->getCatalog(&catDict); if (!catDict.isDict()) { @@ -130,20 +133,6 @@ Catalog::Catalog(XRef *xrefA) { } pagesDict.free(); - // read root of named destination tree - PDF1.6 table 3.28 - if (catDict.dictLookup("Names", &obj)->isDict()) { - obj.dictLookup("Dests", &obj2); - destNameTree.init(xref, &obj2); - obj2.free(); - obj.dictLookup("EmbeddedFiles", &obj2); - embeddedFileNameTree.init(xref, &obj2); - obj2.free(); - obj.dictLookup("JavaScript", &obj2); - jsNameTree.init(xref, &obj2); - obj2.free(); - } - obj.free(); - // read base URI if (catDict.dictLookup("URI", &obj)->isDict()) { if (obj.dictLookup("Base", &obj2)->isString()) { @@ -190,9 +179,9 @@ Catalog::~Catalog() { gfree(pageRefs); } dests.free(); - destNameTree.free(); - embeddedFileNameTree.free(); - jsNameTree.free(); + delete destNameTree; + delete embeddedFileNameTree; + delete jsNameTree; if (baseURI) { delete baseURI; } @@ -346,7 +335,7 @@ LinkDest *Catalog::findDest(GooString *name) { obj1.free(); } if (!found) { - if (destNameTree.lookup(name, &obj1)) + if (getDestNameTree()->lookup(name, &obj1)) found = gTrue; else obj1.free(); @@ -380,10 +369,10 @@ EmbFile *Catalog::embeddedFile(int i) { Object efDict; Object obj; - obj = embeddedFileNameTree.getValue(i); + obj = getEmbeddedFileNameTree()->getValue(i); EmbFile *embeddedFile = 0; if (obj.isRef()) { - GooString desc(embeddedFileNameTree.getName(i)); + GooString desc(getEmbeddedFileNameTree()->getName(i)); embeddedFile = new EmbFile(obj.fetch(xref, &efDict), &desc); efDict.free(); } else { @@ -395,7 +384,7 @@ EmbFile *Catalog::embeddedFile(int i) GooString *Catalog::getJS(int i) { - Object obj = jsNameTree.getValue(i); + Object obj = getJSNameTree()->getValue(i); if (obj.isRef()) { Ref r = obj.getRef(); obj.free(); @@ -515,6 +504,11 @@ NameTree::NameTree() entries = NULL; } +NameTree::~NameTree() +{ + this->free(); +} + NameTree::Entry::Entry(Array *array, int index) { if (!array->getString(index, &name) || !array->getNF(index + 1, &value)) { Object aux; @@ -854,3 +848,79 @@ Object *Catalog::getDests() return &dests; } +Object *Catalog::getNames() +{ + if (names.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Names", &names); + } else { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + names.initNull(); + } + catDict.free(); + } + + return &names; +} + +NameTree *Catalog::getDestNameTree() +{ + if (!destNameTree) { + + destNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("Dests", &obj); + destNameTree->init(xref, &obj); + obj.free(); + } + + } + + return destNameTree; +} + +NameTree *Catalog::getEmbeddedFileNameTree() +{ + if (!embeddedFileNameTree) { + + embeddedFileNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("EmbeddedFiles", &obj); + embeddedFileNameTree->init(xref, &obj); + obj.free(); + } + + } + + return embeddedFileNameTree; +} + +NameTree *Catalog::getJSNameTree() +{ + if (!jsNameTree) { + + jsNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("JavaScript", &obj); + jsNameTree->init(xref, &obj); + obj.free(); + } + + } + + return jsNameTree; +} + diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 134f1db..6021eed 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -50,6 +50,7 @@ class OCGs; class NameTree { public: NameTree(); + ~NameTree(); void init(XRef *xref, Object *tree); void parse(Object *tree); GBool lookup(GooString *name, Object *obj); @@ -177,13 +178,13 @@ public: Object *getDests(); // Get the number of embedded files - int numEmbeddedFiles() { return embeddedFileNameTree.numEntries(); } + int numEmbeddedFiles() { return getEmbeddedFileNameTree()->numEntries(); } // Get the i'th file embedded (at the Document level) in the document EmbFile *embeddedFile(int i); // Get the number of javascript scripts - int numJS() { return jsNameTree.numEntries(); } + int numJS() { return getJSNameTree()->numEntries(); } // Get the i'th JavaScript script (at the Document level) in the document GooString *getJS(int i); @@ -236,9 +237,10 @@ private: int numPages; // number of pages int pagesSize; // size of pages array Object dests; // named destination dictionary - NameTree destNameTree; // named destination name-tree - NameTree embeddedFileNameTree; // embedded file name-tree - NameTree jsNameTree; // Java Script name-tree + Object names; // named names dictionary + NameTree *destNameTree; // named destination name-tree + NameTree *embeddedFileNameTree; // embedded file name-tree + NameTree *jsNameTree; // Java Script name-tree GooString *baseURI; // base URI for URI-type links Object metadata; // metadata stream Object structTreeRoot; // structure tree root dictionary @@ -253,6 +255,12 @@ private: int readPageTree(Dict *pages, PageAttrs *attrs, int start, char *alreadyRead); Object *findDestInTree(Object *tree, GooString *name, Object *obj); + + Object *getNames(); + NameTree *getDestNameTree(); + NameTree *getEmbeddedFileNameTree(); + NameTree *getJSNameTree(); + }; #endif commit 32053360c93607cf9bdc092257cefad5d4df9ec5 Author: Hib Eris <[email protected]> Date: Thu Mar 25 16:32:22 2010 +0100 Parse Dests on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index f6a8bef..07b1e20 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -130,9 +130,6 @@ Catalog::Catalog(XRef *xrefA) { } pagesDict.free(); - // read named destination dictionary - catDict.dictLookup("Dests", &dests); - // read root of named destination tree - PDF1.6 table 3.28 if (catDict.dictLookup("Names", &obj)->isDict()) { obj.dictLookup("Dests", &obj2); @@ -177,7 +174,6 @@ Catalog::Catalog(XRef *xrefA) { pagesDict.free(); err1: catDict.free(); - dests.initNull(); ok = gFalse; } @@ -343,8 +339,8 @@ LinkDest *Catalog::findDest(GooString *name) { // try named destination dictionary then name tree found = gFalse; - if (dests.isDict()) { - if (!dests.dictLookup(name->getCString(), &obj1)->isNull()) + if (getDests()->isDict()) { + if (!getDests()->dictLookup(name->getCString(), &obj1)->isNull()) found = gTrue; else obj1.free(); @@ -839,3 +835,22 @@ Object *Catalog::getOutline() return &outline; } +Object *Catalog::getDests() +{ + if (dests.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Dests", &dests); + } else { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + dests.initNull(); + } + catDict.free(); + } + + return &dests; +} + diff --git a/poppler/Catalog.h b/poppler/Catalog.h index cfae726..134f1db 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -174,7 +174,7 @@ public: // NULL if <name> is not a destination. LinkDest *findDest(GooString *name); - Object *getDests() { return &dests; } + Object *getDests(); // Get the number of embedded files int numEmbeddedFiles() { return embeddedFileNameTree.numEntries(); } commit da0f8e69eecb944e128474f62829f729eeabd189 Author: Hib Eris <[email protected]> Date: Thu Mar 25 16:48:07 2010 +0100 Parse Outline on demand in PDFDoc diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 9505639..2d1477d 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -226,11 +226,6 @@ GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) { return gFalse; } -#ifndef DISABLE_OUTLINE - // read outline - outline = new Outline(catalog->getOutline(), xref); -#endif - // done return gTrue; } @@ -907,6 +902,18 @@ void PDFDoc::writeTrailer (Guint uxrefOffset, int uxrefSize, OutStream* outStr, delete trailerDict; } +#ifndef DISABLE_OUTLINE +Outline *PDFDoc::getOutline() +{ + if (!outline) { + // read outline + outline = new Outline(catalog->getOutline(), xref); + } + + return outline; +} +#endif + PDFDoc *PDFDoc::ErrorPDFDoc(int errorCode, GooString *fileNameA) { PDFDoc *doc = new PDFDoc(); diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 79f6d6d..6d7dea2 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -170,7 +170,7 @@ public: #ifndef DISABLE_OUTLINE // Return the outline object. - Outline *getOutline() { return outline; } + Outline *getOutline(); #endif // Is the file encrypted? commit d7a69c8cad112cb6616d0192d8a4028fdaee2f73 Author: Hib Eris <[email protected]> Date: Thu Mar 25 16:05:02 2010 +0100 Parse Outline on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index bcae737..f6a8bef 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -156,9 +156,6 @@ Catalog::Catalog(XRef *xrefA) { } obj.free(); - // get the outline dictionary - catDict.dictLookup("Outlines", &outline); - // get the Optional Content dictionary if (catDict.dictLookup("OCProperties", &optContentProps)->isDict()) { optContent = new OCGs(&optContentProps, xref); @@ -822,3 +819,23 @@ Object *Catalog::getStructTreeRoot() return &structTreeRoot; } + +Object *Catalog::getOutline() +{ + if (outline.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Outlines", &outline); + } else { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + outline.initNull(); + } + catDict.free(); + } + + return &outline; +} + diff --git a/poppler/Catalog.h b/poppler/Catalog.h index a55d449..cfae726 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -192,7 +192,7 @@ public: GBool labelToIndex(GooString *label, int *index); GBool indexToLabel(int index, GooString *label); - Object *getOutline() { return &outline; } + Object *getOutline(); Object *getAcroForm() { return &acroForm; } commit c149e027fa76824221a78fe6d3bf9bfe953491d4 Author: Hib Eris <[email protected]> Date: Thu Mar 25 15:51:51 2010 +0100 Parse StructTreeRoot on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index d27b6f1..bcae737 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -156,9 +156,6 @@ Catalog::Catalog(XRef *xrefA) { } obj.free(); - // get the structure tree root - catDict.dictLookup("StructTreeRoot", &structTreeRoot); - // get the outline dictionary catDict.dictLookup("Outlines", &outline); @@ -806,3 +803,22 @@ PageLabelInfo *Catalog::getPageLabelInfo() return pageLabelInfo; } + +Object *Catalog::getStructTreeRoot() +{ + if (structTreeRoot.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("StructTreeRoot", &structTreeRoot); + } else { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + structTreeRoot.initNull(); + } + catDict.free(); + } + + return &structTreeRoot; +} diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 2f7c616..a55d449 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -164,7 +164,7 @@ public: GooString *readMetadata(); // Return the structure tree root object. - Object *getStructTreeRoot() { return &structTreeRoot; } + Object *getStructTreeRoot(); // Find a page, given its object ID. Returns page number, or 0 if // not found. commit 3c6effe44d6d97f175c2ee7f3913d8c4ba34d612 Author: Hib Eris <[email protected]> Date: Thu Mar 25 14:55:22 2010 +0100 Parse Metadata on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index aa21b45..d27b6f1 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -156,9 +156,6 @@ Catalog::Catalog(XRef *xrefA) { } obj.free(); - // get the metadata stream - catDict.dictLookup("Metadata", &metadata); - // get the structure tree root catDict.dictLookup("StructTreeRoot", &structTreeRoot); @@ -224,6 +221,19 @@ GooString *Catalog::readMetadata() { Object obj; int c; + if (metadata.isNone()) { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Metadata", &metadata); + } else { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + metadata.initNull(); + } + catDict.free(); + } + if (!metadata.isStream()) { return NULL; } commit 749d67ea2346a3453ef41dc37ba59d419ad900b0 Author: Hib Eris <[email protected]> Date: Thu Mar 25 15:09:58 2010 +0100 Parse PageLabelInfo on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index 94ccff2..aa21b45 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -147,10 +147,6 @@ Catalog::Catalog(XRef *xrefA) { } obj.free(); - if (catDict.dictLookup("PageLabels", &obj)->isDict()) - pageLabelInfo = new PageLabelInfo(&obj, numPages); - obj.free(); - // read base URI if (catDict.dictLookup("URI", &obj)->isDict()) { if (obj.dictLookup("Base", &obj2)->isString()) { @@ -642,8 +638,9 @@ GBool Catalog::labelToIndex(GooString *label, int *index) { char *end; - if (pageLabelInfo != NULL) { - if (!pageLabelInfo->labelToIndex(label, index)) + PageLabelInfo *pli = getPageLabelInfo(); + if (pli != NULL) { + if (!pli->labelToIndex(label, index)) return gFalse; } else { *index = strtol(label->getCString(), &end, 10) - 1; @@ -664,8 +661,9 @@ GBool Catalog::indexToLabel(int index, GooString *label) if (index < 0 || index >= numPages) return gFalse; - if (pageLabelInfo != NULL) { - return pageLabelInfo->indexToLabel(index, label); + PageLabelInfo *pli = getPageLabelInfo(); + if (pli != NULL) { + return pli->indexToLabel(index, label); } else { snprintf(buffer, sizeof (buffer), "%d", index + 1); label->append(buffer); @@ -775,3 +773,26 @@ EmbFile::EmbFile(Object *efDict, GooString *description) if (!m_mimetype) m_mimetype = new GooString(); } + +PageLabelInfo *Catalog::getPageLabelInfo() +{ + if (!pageLabelInfo) { + Object catDict; + Object obj; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + catDict.free(); + return NULL; + } + + if (catDict.dictLookup("PageLabels", &obj)->isDict()) { + pageLabelInfo = new PageLabelInfo(&obj, getNumPages()); + } + obj.free(); + catDict.free(); + } + + return pageLabelInfo; +} diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 5e84679..2f7c616 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -226,6 +226,9 @@ public: private: + // Get page label info. + PageLabelInfo *getPageLabelInfo(); + XRef *xref; // the xref table for this PDF file Page **pages; // array of pages Ref *pageRefs; // object ID for each page commit 78f7d106714fa489a66c39410163a6902ba24856 Author: Hib Eris <[email protected]> Date: Sat Mar 27 14:43:57 2010 +0100 Parse PageMode and PageLayout on demand diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index b659180..94ccff2 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -23,6 +23,7 @@ // Copyright (C) 2007 Julien Rebetez <[email protected]> // Copyright (C) 2008 Pino Toscano <[email protected]> // Copyright (C) 2009 Ilya Gorenbein <[email protected]> +// Copyright (C) 2010 Hib Eris <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -71,6 +72,8 @@ Catalog::Catalog(XRef *xrefA) { pageLabelInfo = NULL; form = NULL; optContent = NULL; + pageMode = pageModeNull; + pageLayout = pageLayoutNull; xref->getCatalog(&catDict); if (!catDict.isDict()) { @@ -148,41 +151,6 @@ Catalog::Catalog(XRef *xrefA) { pageLabelInfo = new PageLabelInfo(&obj, numPages); obj.free(); - // read page mode - pageMode = pageModeNone; - if (catDict.dictLookup("PageMode", &obj)->isName()) { - if (obj.isName("UseNone")) - pageMode = pageModeNone; - else if (obj.isName("UseOutlines")) - pageMode = pageModeOutlines; - else if (obj.isName("UseThumbs")) - pageMode = pageModeThumbs; - else if (obj.isName("FullScreen")) - pageMode = pageModeFullScreen; - else if (obj.isName("UseOC")) - pageMode = pageModeOC; - else if (obj.isName("UseAttachments")) - pageMode = pageModeAttach; - } - obj.free(); - - pageLayout = pageLayoutNone; - if (catDict.dictLookup("PageLayout", &obj)->isName()) { - if (obj.isName("SinglePage")) - pageLayout = pageLayoutSinglePage; - if (obj.isName("OneColumn")) - pageLayout = pageLayoutOneColumn; - if (obj.isName("TwoColumnLeft")) - pageLayout = pageLayoutTwoColumnLeft; - if (obj.isName("TwoColumnRight")) - pageLayout = pageLayoutTwoColumnRight; - if (obj.isName("TwoPageLeft")) - pageLayout = pageLayoutTwoPageLeft; - if (obj.isName("TwoPageRight")) - pageLayout = pageLayoutTwoPageRight; - } - obj.free(); - // read base URI if (catDict.dictLookup("URI", &obj)->isDict()) { if (obj.dictLookup("Base", &obj2)->isString()) { @@ -473,6 +441,77 @@ GooString *Catalog::getJS(int i) return js; } +Catalog::PageMode Catalog::getPageMode() { + + if (pageMode == pageModeNull) { + + Object catDict, obj; + + pageMode = pageModeNone; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + catDict.free(); + return pageMode; + } + + if (catDict.dictLookup("PageMode", &obj)->isName()) { + if (obj.isName("UseNone")) + pageMode = pageModeNone; + else if (obj.isName("UseOutlines")) + pageMode = pageModeOutlines; + else if (obj.isName("UseThumbs")) + pageMode = pageModeThumbs; + else if (obj.isName("FullScreen")) + pageMode = pageModeFullScreen; + else if (obj.isName("UseOC")) + pageMode = pageModeOC; + else if (obj.isName("UseAttachments")) + pageMode = pageModeAttach; + } + obj.free(); + catDict.free(); + } + return pageMode; +} + +Catalog::PageLayout Catalog::getPageLayout() { + + if (pageLayout == pageLayoutNull) { + + Object catDict, obj; + + pageLayout = pageLayoutNone; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + catDict.free(); + return pageLayout; + } + + pageLayout = pageLayoutNone; + if (catDict.dictLookup("PageLayout", &obj)->isName()) { + if (obj.isName("SinglePage")) + pageLayout = pageLayoutSinglePage; + if (obj.isName("OneColumn")) + pageLayout = pageLayoutOneColumn; + if (obj.isName("TwoColumnLeft")) + pageLayout = pageLayoutTwoColumnLeft; + if (obj.isName("TwoColumnRight")) + pageLayout = pageLayoutTwoColumnRight; + if (obj.isName("TwoPageLeft")) + pageLayout = pageLayoutTwoPageLeft; + if (obj.isName("TwoPageRight")) + pageLayout = pageLayoutTwoPageRight; + } + obj.free(); + catDict.free(); + } + return pageLayout; +} + NameTree::NameTree() { size = 0; diff --git a/poppler/Catalog.h b/poppler/Catalog.h index f5b389f..5e84679 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -19,6 +19,7 @@ // Copyright (C) 2005, 2006, 2008 Brad Hards <[email protected]> // Copyright (C) 2007 Julien Rebetez <[email protected]> // Copyright (C) 2008 Pino Toscano <[email protected]> +// Copyright (C) 2010 Hib Eris <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -205,7 +206,8 @@ public: pageModeThumbs, pageModeFullScreen, pageModeOC, - pageModeAttach + pageModeAttach, + pageModeNull }; enum PageLayout { pageLayoutNone, @@ -214,12 +216,13 @@ public: pageLayoutTwoColumnLeft, pageLayoutTwoColumnRight, pageLayoutTwoPageLeft, - pageLayoutTwoPageRight + pageLayoutTwoPageRight, + pageLayoutNull }; // Returns the page mode. - PageMode getPageMode() { return pageMode; } - PageLayout getPageLayout() { return pageLayout; } + PageMode getPageMode(); + PageLayout getPageLayout(); private:
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
