summaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-03-31 18:58:06 +0200
committerJay Berkenbilt <ejb@ql.org>2020-03-31 23:39:20 +0200
commitdac65a21fb4fa5f871e31c314280b75adde89a6c (patch)
tree55305e16b27d47d27b8dfb39c106b5db3574c2fc /libqpdf
parent278710fbe855b82ce0db1b1f1d8f969798872b6c (diff)
downloadqpdf-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')
-rw-r--r--libqpdf/QPDFPageObjectHelper.cc23
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);
+ });
+ }
}
}
}