aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFPageObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-03-31 18:28:54 +0200
committerJay Berkenbilt <ejb@ql.org>2020-03-31 23:39:20 +0200
commit278710fbe855b82ce0db1b1f1d8f969798872b6c (patch)
tree55539a13ab994adb95f64955291ce4d34ad4be2c /libqpdf/QPDFPageObjectHelper.cc
parentb03e6bd65d2144ec3b200c04514bc95cabfc085f (diff)
downloadqpdf-278710fbe855b82ce0db1b1f1d8f969798872b6c.tar.zst
Refactor QPDFPageObjectHelper::removeUnreferencedResources()
Refactor removeUnreferencedResources to prepare for filtering form XObjects.
Diffstat (limited to 'libqpdf/QPDFPageObjectHelper.cc')
-rw-r--r--libqpdf/QPDFPageObjectHelper.cc30
1 files changed, 25 insertions, 5 deletions
diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc
index 01f1d662..b0c77b0c 100644
--- a/libqpdf/QPDFPageObjectHelper.cc
+++ b/libqpdf/QPDFPageObjectHelper.cc
@@ -511,16 +511,24 @@ NameWatcher::handleToken(QPDFTokenizer::Token const& token)
}
void
-QPDFPageObjectHelper::removeUnreferencedResources()
+QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
+ QPDFObjectHandle oh, std::set<QPDFObjGen>& seen,
+ std::function<QPDFObjectHandle()> get_resource,
+ std::function<void(QPDFObjectHandle::TokenFilter*)> filter_content)
{
+ if (seen.count(oh.getObjGen()))
+ {
+ return;
+ }
+ seen.insert(oh.getObjGen());
NameWatcher nw;
try
{
- filterPageContents(&nw);
+ filter_content(&nw);
}
catch (std::exception& e)
{
- this->oh.warnIfPossible(
+ oh.warnIfPossible(
std::string("Unable to parse content stream: ") + e.what() +
"; not attempting to remove unreferenced objects from this page");
return;
@@ -528,7 +536,7 @@ QPDFPageObjectHelper::removeUnreferencedResources()
if (nw.saw_bad)
{
QTC::TC("qpdf", "QPDFPageObjectHelper bad token finding names");
- this->oh.warnIfPossible(
+ oh.warnIfPossible(
"Bad token found while scanning content stream; "
"not attempting to remove unreferenced objects from this page");
return;
@@ -541,7 +549,7 @@ QPDFPageObjectHelper::removeUnreferencedResources()
std::vector<std::string> to_filter;
to_filter.push_back("/Font");
to_filter.push_back("/XObject");
- QPDFObjectHandle resources = getAttribute("/Resources", true);
+ QPDFObjectHandle resources = get_resource();
for (std::vector<std::string>::iterator d_iter = to_filter.begin();
d_iter != to_filter.end(); ++d_iter)
{
@@ -564,6 +572,18 @@ QPDFPageObjectHelper::removeUnreferencedResources()
}
}
+void
+QPDFPageObjectHelper::removeUnreferencedResources()
+{
+ std::set<QPDFObjGen> seen;
+ removeUnreferencedResourcesHelper(
+ this->oh, seen,
+ [this]() { return this->getAttribute("/Resources", true); },
+ [this](QPDFObjectHandle::TokenFilter* f) {
+ this->filterPageContents(f);
+ });
+}
+
QPDFPageObjectHelper
QPDFPageObjectHelper::shallowCopyPage()
{