Commit 7f2d76b78d5bf7331f99039804c01320673bde13
1 parent
01353e11
Remove non-dictionary objects from pages tree
Showing
2 changed files
with
12 additions
and
2 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -1515,6 +1515,7 @@ class QPDF |
| 1515 | 1515 | std::set<QPDFObjGen> resolving; |
| 1516 | 1516 | QPDFObjectHandle trailer; |
| 1517 | 1517 | std::vector<QPDFObjectHandle> all_pages; |
| 1518 | + bool invalid_page_found{false}; | |
| 1518 | 1519 | std::map<QPDFObjGen, int> pageobj_to_pages_pos; |
| 1519 | 1520 | bool pushed_inherited_attributes_to_pages{false}; |
| 1520 | 1521 | bool ever_pushed_inherited_attributes_to_pages{false}; | ... | ... |
libqpdf/QPDF_pages.cc
| ... | ... | @@ -40,7 +40,7 @@ std::vector<QPDFObjectHandle> const& |
| 40 | 40 | QPDF::getAllPages() |
| 41 | 41 | { |
| 42 | 42 | // Note that pushInheritedAttributesToPage may also be used to initialize m->all_pages. |
| 43 | - if (m->all_pages.empty()) { | |
| 43 | + if (m->all_pages.empty() && !m->invalid_page_found) { | |
| 44 | 44 | m->ever_called_get_all_pages = true; |
| 45 | 45 | QPDFObjGen::set visited; |
| 46 | 46 | QPDFObjGen::set seen; |
| ... | ... | @@ -70,6 +70,10 @@ QPDF::getAllPages() |
| 70 | 70 | // Ensure we actually found a /Pages object. |
| 71 | 71 | getAllPagesInternal(pages, visited, seen, false); |
| 72 | 72 | } |
| 73 | + if (m->invalid_page_found) { | |
| 74 | + flattenPagesTree(); | |
| 75 | + m->invalid_page_found = false; | |
| 76 | + } | |
| 73 | 77 | } |
| 74 | 78 | return m->all_pages; |
| 75 | 79 | } |
| ... | ... | @@ -100,6 +104,7 @@ QPDF::getAllPagesInternal( |
| 100 | 104 | auto kid = kids.getArrayItem(i); |
| 101 | 105 | if (!kid.isDictionary()) { |
| 102 | 106 | kid.warnIfPossible("Pages tree includes non-dictionary object; ignoring"); |
| 107 | + m->invalid_page_found = true; | |
| 103 | 108 | continue; |
| 104 | 109 | } |
| 105 | 110 | if (kid.hasKey("/Kids")) { |
| ... | ... | @@ -181,7 +186,11 @@ QPDF::flattenPagesTree() |
| 181 | 186 | pages.replaceKey("/Kids", QPDFObjectHandle::newArray(m->all_pages)); |
| 182 | 187 | // /Count has not changed |
| 183 | 188 | if (pages.getKey("/Count").getUIntValue() != len) { |
| 184 | - throw std::runtime_error("/Count is wrong after flattening pages tree"); | |
| 189 | + if (m->invalid_page_found && pages.getKey("/Count").getUIntValue() > len) { | |
| 190 | + pages.replaceKey("/Count", QPDFObjectHandle::newInteger(toI(len))); | |
| 191 | + } else { | |
| 192 | + throw std::runtime_error("/Count is wrong after flattening pages tree"); | |
| 193 | + } | |
| 185 | 194 | } |
| 186 | 195 | } |
| 187 | 196 | ... | ... |