aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--include/qpdf/QPDF.hh6
-rw-r--r--libqpdf/QPDF.cc26
3 files changed, 26 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2463c250..dd19b0a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2018-06-22 Jay Berkenbilt <ejb@ql.org>
+ * Add new method QPDF::getObjectCount(). This gives an approximate
+ (upper bound) account of objects in the QPDF object.
+
* Don't leave files open when merging. This makes it possible
merge more files at once than the operating system's open file
limit. Fixes #154.
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh
index ad84fad5..681d233c 100644
--- a/include/qpdf/QPDF.hh
+++ b/include/qpdf/QPDF.hh
@@ -431,6 +431,12 @@ class QPDF
QPDF_DLL
void showXRefTable();
+ // Return the approximate number of indirect objects. It is
+ // approximate because not all objects in the file are preserved
+ // in all cases.
+ QPDF_DLL
+ size_t getObjectCount();
+
// Returns a list of indirect objects for every object in the xref
// table. Useful for discovering objects that are not otherwise
// referenced.
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 4dc1e5ca..7d3c10e7 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -1218,6 +1218,22 @@ QPDF::showXRefTable()
}
}
+size_t
+QPDF::getObjectCount()
+{
+ // This method returns the next available indirect object number.
+ // makeIndirectObject uses it for this purpose.
+ QPDFObjGen o1(0, 0);
+ if (! this->m->obj_cache.empty())
+ {
+ o1 = (*(this->m->obj_cache.rbegin())).first;
+ }
+ QPDFObjGen o2 = (*(this->m->xref_table.rbegin())).first;
+ QTC::TC("qpdf", "QPDF indirect last obj from xref",
+ (o2.getObj() > o1.getObj()) ? 1 : 0);
+ return std::max(o1.getObj(), o2.getObj());
+}
+
std::vector<QPDFObjectHandle>
QPDF::getAllObjects()
{
@@ -1904,15 +1920,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
QPDFObjectHandle
QPDF::makeIndirectObject(QPDFObjectHandle oh)
{
- QPDFObjGen o1(0, 0);
- if (! this->m->obj_cache.empty())
- {
- o1 = (*(this->m->obj_cache.rbegin())).first;
- }
- QPDFObjGen o2 = (*(this->m->xref_table.rbegin())).first;
- QTC::TC("qpdf", "QPDF indirect last obj from xref",
- (o2.getObj() > o1.getObj()) ? 1 : 0);
- int max_objid = std::max(o1.getObj(), o2.getObj());
+ int max_objid = getObjectCount();
QPDFObjGen next(max_objid + 1, 0);
this->m->obj_cache[next] =
ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1);