diff options
author | Jay Berkenbilt <ejb@ql.org> | 2019-01-29 02:13:10 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2019-01-29 02:29:58 +0100 |
commit | 52f9d326a56e6409a1487c724241f91de33e3ba6 (patch) | |
tree | a45d1cc452d3d61a940b16cc6a6bb524b55f302b /libqpdf/QPDF_pages.cc | |
parent | 9e01c8bd996a15934f58979f447bea359e857875 (diff) | |
download | qpdf-52f9d326a56e6409a1487c724241f91de33e3ba6.tar.zst |
Resolve duplicated page objects (fixes #268)
When linearizing a file or getting the list of all pages in a file,
detect if the pages tree contains a duplicated page object and, if so,
shallow copy it. This makes it possible to have a one to one mapping
of page positions to page objects.
Diffstat (limited to 'libqpdf/QPDF_pages.cc')
-rw-r--r-- | libqpdf/QPDF_pages.cc | 26 |
1 files changed, 23 insertions, 3 deletions
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 |