Commit 2a82f6e1e05b5791c264efd8f70a20aeadca7501

Authored by Jay Berkenbilt
1 parent c8183607

Add method to get count of objects in QPDF

ChangeLog
1 1 2018-06-22 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * Add new method QPDF::getObjectCount(). This gives an approximate
  4 + (upper bound) account of objects in the QPDF object.
  5 +
3 6 * Don't leave files open when merging. This makes it possible
4 7 merge more files at once than the operating system's open file
5 8 limit. Fixes #154.
... ...
include/qpdf/QPDF.hh
... ... @@ -431,6 +431,12 @@ class QPDF
431 431 QPDF_DLL
432 432 void showXRefTable();
433 433  
  434 + // Return the approximate number of indirect objects. It is
  435 + // approximate because not all objects in the file are preserved
  436 + // in all cases.
  437 + QPDF_DLL
  438 + size_t getObjectCount();
  439 +
434 440 // Returns a list of indirect objects for every object in the xref
435 441 // table. Useful for discovering objects that are not otherwise
436 442 // referenced.
... ...
libqpdf/QPDF.cc
... ... @@ -1218,6 +1218,22 @@ QPDF::showXRefTable()
1218 1218 }
1219 1219 }
1220 1220  
  1221 +size_t
  1222 +QPDF::getObjectCount()
  1223 +{
  1224 + // This method returns the next available indirect object number.
  1225 + // makeIndirectObject uses it for this purpose.
  1226 + QPDFObjGen o1(0, 0);
  1227 + if (! this->m->obj_cache.empty())
  1228 + {
  1229 + o1 = (*(this->m->obj_cache.rbegin())).first;
  1230 + }
  1231 + QPDFObjGen o2 = (*(this->m->xref_table.rbegin())).first;
  1232 + QTC::TC("qpdf", "QPDF indirect last obj from xref",
  1233 + (o2.getObj() > o1.getObj()) ? 1 : 0);
  1234 + return std::max(o1.getObj(), o2.getObj());
  1235 +}
  1236 +
1221 1237 std::vector<QPDFObjectHandle>
1222 1238 QPDF::getAllObjects()
1223 1239 {
... ... @@ -1904,15 +1920,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1904 1920 QPDFObjectHandle
1905 1921 QPDF::makeIndirectObject(QPDFObjectHandle oh)
1906 1922 {
1907   - QPDFObjGen o1(0, 0);
1908   - if (! this->m->obj_cache.empty())
1909   - {
1910   - o1 = (*(this->m->obj_cache.rbegin())).first;
1911   - }
1912   - QPDFObjGen o2 = (*(this->m->xref_table.rbegin())).first;
1913   - QTC::TC("qpdf", "QPDF indirect last obj from xref",
1914   - (o2.getObj() > o1.getObj()) ? 1 : 0);
1915   - int max_objid = std::max(o1.getObj(), o2.getObj());
  1923 + int max_objid = getObjectCount();
1916 1924 QPDFObjGen next(max_objid + 1, 0);
1917 1925 this->m->obj_cache[next] =
1918 1926 ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1);
... ...