diff --git a/libqpdf/NNTree.cc b/libqpdf/NNTree.cc index 1ee7f16..27da4ae 100644 --- a/libqpdf/NNTree.cc +++ b/libqpdf/NNTree.cc @@ -642,16 +642,37 @@ NNTreeImpl::compareKeyKid(QPDFObjectHandle const& key, Array const& kids, int id return 0; } +namespace +{ + struct Cmp + { + bool + operator()(const QPDFObjectHandle& lhs, const QPDFObjectHandle& rhs) const + { + Integer l = lhs; + Integer r = rhs; + if (l && r) { + return l.value() < r.value(); + } + return lhs.getUTF8Value() < rhs.getUTF8Value(); + } + }; +} // namespace + void NNTreeImpl::repair() { auto new_node = Dictionary({{itemsKey(), Array::empty()}}); NNTreeImpl repl(qpdf, new_node, key_type, value_valid, false); + std::map items; for (auto const& [key, value]: *this) { if (key && value) { - repl.insert(key, value); + items.insert_or_assign(key, value); } } + for (auto const& [key, value]: items) { + repl.insert(key, value); + } tree_root.replaceKey("/Kids", new_node["/Kids"]); tree_root.replaceKey(itemsKey(), new_node[itemsKey()]); }