aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF_optimization.cc3
-rw-r--r--libqpdf/QPDF_pages.cc26
2 files changed, 26 insertions, 3 deletions
diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc
index f282e5f3..ecece7db 100644
--- a/libqpdf/QPDF_optimization.cc
+++ b/libqpdf/QPDF_optimization.cc
@@ -156,6 +156,9 @@ QPDF::pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys)
return;
}
+ // Calling getAllPages() resolves any duplicated page objects.
+ getAllPages();
+
// key_ancestors is a mapping of page attribute keys to a stack of
// Pages nodes that contain values for them.
std::map<std::string, std::vector<QPDFObjectHandle> > key_ancestors;
diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc
index ea5afdb5..7b6b369e 100644
--- a/libqpdf/QPDF_pages.cc
+++ b/libqpdf/QPDF_pages.cc
@@ -62,8 +62,18 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages,
void
QPDF::getAllPagesInternal2(QPDFObjectHandle cur_pages,
- std::vector<QPDFObjectHandle>& result,
- std::set<QPDFObjGen>& visited)
+ std::vector<QPDFObjectHandle>& result,
+ std::set<QPDFObjGen>& visited)
+{
+ std::set<QPDFObjGen> seen;
+ getAllPagesInternal3(cur_pages, result, visited, seen);
+}
+
+void
+QPDF::getAllPagesInternal3(QPDFObjectHandle cur_pages,
+ std::vector<QPDFObjectHandle>& result,
+ std::set<QPDFObjGen>& visited,
+ std::set<QPDFObjGen>& seen)
{
QPDFObjGen this_og = cur_pages.getObjGen();
if (visited.count(this_og) > 0)
@@ -94,11 +104,21 @@ QPDF::getAllPagesInternal2(QPDFObjectHandle cur_pages,
int n = kids.getArrayNItems();
for (int i = 0; i < n; ++i)
{
- getAllPagesInternal2(kids.getArrayItem(i), result, visited);
+ QPDFObjectHandle kid = kids.getArrayItem(i);
+ if (seen.count(kid.getObjGen()))
+ {
+ // Make a copy of the page. This does the same as
+ // shallowCopyPage in QPDFPageObjectHelper.
+ QTC::TC("qpdf", "QPDF resolve duplicated page object");
+ kid = makeIndirectObject(QPDFObjectHandle(kid).shallowCopy());
+ kids.setArrayItem(i, kid);
+ }
+ getAllPagesInternal3(kid, result, visited, seen);
}
}
else if (type == "/Page")
{
+ seen.insert(this_og);
result.push_back(cur_pages);
}
else