From 30ac51bc78f7d723e4fc94ff8af5527e88b56f23 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 8 May 2021 09:07:59 -0400 Subject: Exclude unreferenced objects in object streams (fixes #520) --- libqpdf/QPDFWriter.cc | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 689fef74..83349b48 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -2363,17 +2363,36 @@ QPDFWriter::preserveObjectStreams() { // Our object_to_object_stream map has to map ObjGen -> ObjGen // since we may be generating object streams out of old objects - // that have generation numbers greater than zero. However in an + // that have generation numbers greater than zero. However in an // existing PDF, all object stream objects and all objects in them // must have generation 0 because the PDF spec does not provide - // any way to do otherwise. + // any way to do otherwise. This code filters out objects that are + // not allowed to be in object streams. In addition to removing + // objects that were erroneously included in object streams in the + // source PDF, it also prevents unreferenced objects from being + // included. + std::set eligible; + if (! this->m->preserve_unreferenced_objects) + { + std::vector eligible_v = + QPDF::Writer::getCompressibleObjGens(this->m->pdf); + eligible = std::set(eligible_v.begin(), eligible_v.end()); + } + QTC::TC("qpdf", "QPDFWriter preserve object streams", + this->m->preserve_unreferenced_objects ? 0 : 1); std::map omap; QPDF::Writer::getObjectStreamData(this->m->pdf, omap); - for (std::map::iterator iter = omap.begin(); - iter != omap.end(); ++iter) + for (auto iter: omap) { - this->m->object_to_object_stream[QPDFObjGen((*iter).first, 0)] = - (*iter).second; + QPDFObjGen og(iter.first, 0); + if (eligible.count(og) || this->m->preserve_unreferenced_objects) + { + this->m->object_to_object_stream[og] = iter.second; + } + else + { + QTC::TC("qpdf", "QPDFWriter exclude from object stream"); + } } } -- cgit v1.2.3-70-g09d2