From 81025e499893c38b40aa824a5abc43393a8afed1 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 2 Feb 2021 16:34:06 -0500 Subject: Refactor removal of unreferenced resources Refactor in preparation for resolving unresolved resources in form xobjects from page. --- libqpdf/QPDFPageObjectHelper.cc | 62 ++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 32 deletions(-) (limited to 'libqpdf/QPDFPageObjectHelper.cc') diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index 009ecdc0..28b76561 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -703,13 +703,8 @@ NameWatcher::handleToken(QPDFTokenizer::Token const& token) void QPDFPageObjectHelper::removeUnreferencedResourcesHelper( - QPDFPageObjectHelper ph, std::set& seen) + QPDFPageObjectHelper ph) { - if (seen.count(ph.oh.getObjGen())) - { - return; - } - seen.insert(ph.oh.getObjGen()); NameWatcher nw; try { @@ -730,39 +725,35 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper( "not attempting to remove unreferenced objects from this page"); return; } - // Walk through /Font and /XObject dictionaries, removing any - // resources that are not referenced. We must make copies of + + // We will walk through /Font and /XObject dictionaries, removing + // any resources that are not referenced. We must make copies of // resource dictionaries down into the dictionaries are mutating // to prevent mutating one dictionary from having the side effect // of mutating the one it was copied from. - std::vector to_filter; - to_filter.push_back("/Font"); - to_filter.push_back("/XObject"); QPDFObjectHandle resources = ph.getAttribute("/Resources", true); - for (std::vector::iterator d_iter = to_filter.begin(); - d_iter != to_filter.end(); ++d_iter) + std::vector rdicts; + if (resources.isDictionary()) { - QPDFObjectHandle dict = resources.getKey(*d_iter); - if (! dict.isDictionary()) - { - continue; - } - dict = dict.shallowCopy(); - resources.replaceKey(*d_iter, dict); - std::set keys = dict.getKeys(); - for (std::set::iterator k_iter = keys.begin(); - k_iter != keys.end(); ++k_iter) + std::vector to_filter = {"/Font", "/XObject"}; + for (auto const& iter: to_filter) { - if (! nw.names.count(*k_iter)) + QPDFObjectHandle dict = resources.getKey(iter); + if (dict.isDictionary()) { - dict.removeKey(*k_iter); + dict = dict.shallowCopy(); + resources.replaceKey(iter, dict); + rdicts.push_back(dict); } - QPDFObjectHandle resource = dict.getKey(*k_iter); - if (resource.isFormXObject()) + } + } + for (auto& dict: rdicts) + { + for (auto const& key: dict.getKeys()) + { + if (! nw.names.count(key)) { - QTC::TC("qpdf", "QPDFPageObjectHelper filter form xobject"); - removeUnreferencedResourcesHelper( - QPDFPageObjectHelper(resource), seen); + dict.removeKey(key); } } } @@ -771,8 +762,15 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper( void QPDFPageObjectHelper::removeUnreferencedResources() { - std::set seen; - removeUnreferencedResourcesHelper(*this, seen); + forEachFormXObject( + true, + []( + QPDFObjectHandle& obj, QPDFObjectHandle&, std::string const&) + { + QTC::TC("qpdf", "QPDFPageObjectHelper filter form xobject"); + removeUnreferencedResourcesHelper(QPDFPageObjectHelper(obj)); + }); + removeUnreferencedResourcesHelper(*this); } QPDFPageObjectHelper -- cgit v1.2.3-54-g00ecf