aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFOutlineObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-12-19 03:08:53 +0100
committerJay Berkenbilt <ejb@ql.org>2018-12-22 01:11:57 +0100
commitd5d179f4419dfbbbc3598b91071f6ca7cc44357c (patch)
treec2824094f0ac9aed1788014b6a2031e803a8a3bd /libqpdf/QPDFOutlineObjectHelper.cc
parent30a0c070e41212172f5516936594ec0f6e72ac70 (diff)
downloadqpdf-d5d179f4419dfbbbc3598b91071f6ca7cc44357c.tar.zst
Add document and object helpers for outlines (bookmarks)
Diffstat (limited to 'libqpdf/QPDFOutlineObjectHelper.cc')
-rw-r--r--libqpdf/QPDFOutlineObjectHelper.cc117
1 files changed, 117 insertions, 0 deletions
diff --git a/libqpdf/QPDFOutlineObjectHelper.cc b/libqpdf/QPDFOutlineObjectHelper.cc
new file mode 100644
index 00000000..e8eb11d0
--- /dev/null
+++ b/libqpdf/QPDFOutlineObjectHelper.cc
@@ -0,0 +1,117 @@
+#include <qpdf/QPDFOutlineObjectHelper.hh>
+#include <qpdf/QPDFOutlineDocumentHelper.hh>
+#include <qpdf/QTC.hh>
+
+QPDFOutlineObjectHelper::Members::~Members()
+{
+}
+
+QPDFOutlineObjectHelper::Members::Members(QPDFOutlineDocumentHelper& dh) :
+ dh(dh)
+{
+}
+
+QPDFOutlineObjectHelper::QPDFOutlineObjectHelper(
+ QPDFObjectHandle oh, QPDFOutlineDocumentHelper& dh, int depth) :
+ QPDFObjectHelper(oh),
+ m(new Members(dh))
+{
+ if (depth > 50)
+ {
+ // Not exercised in test suite, but was tested manually by
+ // temporarily changing max depth to 1.
+ return;
+ }
+ if (QPDFOutlineDocumentHelper::Accessor::checkSeen(
+ this->m->dh, this->oh.getObjGen()))
+ {
+ QTC::TC("qpdf", "QPDFOutlineObjectHelper loop");
+ return;
+ }
+
+ QPDFObjectHandle cur = oh.getKey("/First");
+ while (! cur.isNull())
+ {
+ QPDFOutlineObjectHelper new_ooh(cur, dh, 1 + depth);
+ new_ooh.m->parent = new QPDFOutlineObjectHelper(*this);
+ this->m->kids.push_back(new_ooh);
+ cur = cur.getKey("/Next");
+ }
+}
+
+PointerHolder<QPDFOutlineObjectHelper>
+QPDFOutlineObjectHelper::getParent()
+{
+ return this->m->parent;
+}
+
+std::list<QPDFOutlineObjectHelper>
+QPDFOutlineObjectHelper::getKids()
+{
+ return this->m->kids;
+}
+
+QPDFObjectHandle
+QPDFOutlineObjectHelper::getDest()
+{
+ QPDFObjectHandle dest;
+ QPDFObjectHandle A;
+ if (this->oh.hasKey("/Dest"))
+ {
+ QTC::TC("qpdf", "QPDFOutlineObjectHelper direct dest");
+ dest = this->oh.getKey("/Dest");
+ }
+ else if ((A = this->oh.getKey("/A")).isDictionary() &&
+ A.getKey("/S").isName() &&
+ (A.getKey("/S").getName() == "/GoTo") &&
+ A.hasKey("/D"))
+ {
+ QTC::TC("qpdf", "QPDFOutlineObjectHelper action dest");
+ dest = A.getKey("/D");
+ }
+ if (! dest.isInitialized())
+ {
+ dest = QPDFObjectHandle::newNull();
+ }
+
+ if (dest.isName() || dest.isString())
+ {
+ QTC::TC("qpdf", "QPDFOutlineObjectHelper named dest");
+ dest = this->m->dh.resolveNamedDest(dest);
+ }
+
+ return dest;
+}
+
+QPDFObjectHandle
+QPDFOutlineObjectHelper::getDestPage()
+{
+ QPDFObjectHandle dest = getDest();
+ if ((dest.isArray()) && (dest.getArrayNItems() > 0))
+ {
+ return dest.getArrayItem(0);
+ }
+ return QPDFObjectHandle::newNull();
+}
+
+int
+QPDFOutlineObjectHelper::getCount()
+{
+ int count = 0;
+ if (this->oh.hasKey("/Count"))
+ {
+ count = this->oh.getKey("/Count").getIntValue();
+ }
+ return count;
+}
+
+std::string
+QPDFOutlineObjectHelper::getTitle()
+{
+ std::string result;
+ if (this->oh.hasKey("/Title"))
+ {
+ result = this->oh.getKey("/Title").getUTF8Value();
+ }
+ return result;
+}