From dac65a21fb4fa5f871e31c314280b75adde89a6c Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 31 Mar 2020 12:58:06 -0400 Subject: Look in form XObjects when removing unreferenced resources (fixes #373) If a page contains a form XObject, also filter the form XObject and remove its unreferenced resources. --- libqpdf/QPDFPageObjectHelper.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libqpdf') diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index b0c77b0c..d5579c72 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -568,6 +568,29 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper( { dict.removeKey(*k_iter); } + QPDFObjectHandle resource = dict.getKey(*k_iter); + if (resource.isStream() && + resource.getDict().getKey("/Type").isName() && + ("/XObject" == resource.getDict().getKey("/Type").getName()) && + resource.getDict().getKey("/Subtype").isName() && + ("/Form" == resource.getDict().getKey("/Subtype").getName())) + { + QTC::TC("qpdf", "QPDFPageObjectHelper filter form xobject"); + removeUnreferencedResourcesHelper( + resource.getDict(), seen, + [&resource]() { + auto result = resource.getDict().getKey("/Resources"); + if (result.isDictionary()) + { + result = result.shallowCopy(); + resource.getDict().replaceKey("/Resources", result); + } + return result; + }, + [&resource](QPDFObjectHandle::TokenFilter* f) { + resource.filterAsContents(f); + }); + } } } } -- cgit v1.2.3-54-g00ecf