From 009767d97a0dfebbb9bb71efb4b894b25fb59dd8 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 25 Jan 2019 06:55:31 -0500 Subject: Handle inheritable page attributes Add getAttribute for handling inheritable page attributes, and fix getPageImages and annotation flattening code to use it. --- libqpdf/QPDFPageObjectHelper.cc | 43 +++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'libqpdf/QPDFPageObjectHelper.cc') diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index c5ede04f..4d58da32 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -15,6 +15,42 @@ QPDFPageObjectHelper::QPDFPageObjectHelper(QPDFObjectHandle oh) : { } +QPDFObjectHandle +QPDFPageObjectHelper::getAttribute(std::string const& name, + bool copy_if_shared) +{ + bool inheritable = ((name == "/MediaBox") || (name == "/CropBox") || + (name == "/Resources") || (name == "/Rotate")); + + QPDFObjectHandle node = this->oh; + QPDFObjectHandle result(node.getKey(name)); + std::set seen; + bool inherited = false; + while (inheritable && result.isNull() && node.hasKey("/Parent")) + { + seen.insert(node.getObjGen()); + node = node.getKey("/Parent"); + if (seen.count(node.getObjGen())) + { + break; + } + result = node.getKey(name); + if (! result.isNull()) + { + QTC::TC("qpdf", "QPDFPageObjectHelper non-trivial inheritance"); + inherited = true; + } + } + if (copy_if_shared && (inherited || result.isIndirect())) + { + QTC::TC("qpdf", "QPDFPageObjectHelper copy shared attribute"); + result = result.shallowCopy(); + this->oh.replaceKey(name, result); + } + return result; +} + + std::map QPDFPageObjectHelper::getPageImages() { @@ -159,12 +195,7 @@ QPDFPageObjectHelper::removeUnreferencedResources() std::vector to_filter; to_filter.push_back("/Font"); to_filter.push_back("/XObject"); - QPDFObjectHandle resources = this->oh.getKey("/Resources"); - if (resources.isDictionary()) - { - resources = resources.shallowCopy(); - this->oh.replaceKey("/Resources", resources); - } + QPDFObjectHandle resources = getAttribute("/Resources", true); for (std::vector::iterator d_iter = to_filter.begin(); d_iter != to_filter.end(); ++d_iter) { -- cgit v1.2.3-54-g00ecf