diff options
author | Jay Berkenbilt <ejb@ql.org> | 2020-03-31 18:58:06 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2020-03-31 23:39:20 +0200 |
commit | dac65a21fb4fa5f871e31c314280b75adde89a6c (patch) | |
tree | 55305e16b27d47d27b8dfb39c106b5db3574c2fc /libqpdf/QPDFPageObjectHelper.cc | |
parent | 278710fbe855b82ce0db1b1f1d8f969798872b6c (diff) | |
download | qpdf-dac65a21fb4fa5f871e31c314280b75adde89a6c.tar.zst |
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.
Diffstat (limited to 'libqpdf/QPDFPageObjectHelper.cc')
-rw-r--r-- | libqpdf/QPDFPageObjectHelper.cc | 23 |
1 files changed, 23 insertions, 0 deletions
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); + }); + } } } } |