From 2a82f6e1e05b5791c264efd8f70a20aeadca7501 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 22 Jun 2018 14:52:03 -0400 Subject: [PATCH] Add method to get count of objects in QPDF --- ChangeLog | 3 +++ include/qpdf/QPDF.hh | 6 ++++++ libqpdf/QPDF.cc | 26 +++++++++++++++++--------- 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 + * 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 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);