summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Perez de Castro <aperez@igalia.com>2013-04-25 09:52:56 +0300
committerAlbert Astals Cid <aacid@kde.org>2013-08-17 01:12:48 +0200
commit402ee8b4e31630a42a0a38db1d39164cc5789f3c (patch)
tree417a4fb9483243272ceb849742f830bb19995923
parentc3f953dc87f83ac726f99cb8f1f959c486098391 (diff)
Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary
-rw-r--r--poppler/Catalog.cc45
-rw-r--r--poppler/Catalog.h10
2 files changed, 55 insertions, 0 deletions
diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index 6bd511a1..25a89979 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -97,6 +97,7 @@ Catalog::Catalog(PDFDoc *docA) {
attrsList = NULL;
kidsIdxList = NULL;
lastCachedPage = 0;
+ markInfo = markInfoNull;
xref->getCatalog(&catDict);
if (!catDict.isDict()) {
@@ -857,6 +858,50 @@ Object *Catalog::getStructTreeRoot()
return &structTreeRoot;
}
+Guint Catalog::getMarkInfo()
+{
+ if (markInfo == markInfoNull) {
+ markInfo = 0;
+
+ Object catDict;
+ catalogLocker();
+ xref->getCatalog(&catDict);
+
+ if (catDict.isDict()) {
+ Object markInfoDict;
+ catDict.dictLookup("MarkInfo", &markInfoDict);
+ if (markInfoDict.isDict()) {
+ Object value;
+
+ if (markInfoDict.dictLookup("Marked", &value)->isBool() && value.getBool())
+ markInfo |= markInfoMarked;
+ else if (!value.isNull())
+ error(errSyntaxError, -1, "Marked object is wrong type ({0:s})", value.getTypeName());
+ value.free();
+
+ if (markInfoDict.dictLookup("Suspects", &value)->isBool() && value.getBool())
+ markInfo |= markInfoSuspects;
+ else if (!value.isNull())
+ error(errSyntaxError, -1, "Suspects object is wrong type ({0:s})", value.getTypeName());
+ value.free();
+
+ if (markInfoDict.dictLookup("UserProperties", &value)->isBool() && value.getBool())
+ markInfo |= markInfoUserProperties;
+ else if (!value.isNull())
+ error(errSyntaxError, -1, "UserProperties object is wrong type ({0:s})", value.getTypeName());
+ value.free();
+ } else if (!markInfoDict.isNull()) {
+ error(errSyntaxError, -1, "MarkInfo object is wrong type ({0:s})", markInfoDict.getTypeName());
+ }
+ markInfoDict.free();
+ } else {
+ error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+ }
+ catDict.free();
+ }
+ return markInfo;
+}
+
Object *Catalog::getOutline()
{
catalogLocker();
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
index 24a3dcfb..a89d9aa6 100644
--- a/poppler/Catalog.h
+++ b/poppler/Catalog.h
@@ -125,6 +125,15 @@ public:
// Return the structure tree root object.
Object *getStructTreeRoot();
+ // Return values from the MarkInfo dictionary as flags in a bitfield.
+ enum MarkInfoFlags {
+ markInfoNull = 1 << 0,
+ markInfoMarked = 1 << 1,
+ markInfoUserProperties = 1 << 2,
+ markInfoSuspects = 1 << 3,
+ };
+ Guint getMarkInfo();
+
// Find a page, given its object ID. Returns page number, or 0 if
// not found.
int findPage(int num, int gen);
@@ -219,6 +228,7 @@ private:
GooString *baseURI; // base URI for URI-type links
Object metadata; // metadata stream
Object structTreeRoot; // structure tree root dictionary
+ Guint markInfo; // Flags from MarkInfo dictionary
Object outline; // outline dictionary
Object acroForm; // AcroForm dictionary
Object viewerPreferences; // ViewerPreference dictionary