diff --git a/examples/pdf-bookmarks.cc b/examples/pdf-bookmarks.cc index e343c541..1212b86d 100644 --- a/examples/pdf-bookmarks.cc +++ b/examples/pdf-bookmarks.cc @@ -5,11 +5,14 @@ #include #include #include +#include #include // This program demonstrates extraction of bookmarks using the qpdf // outlines API. Note that all the information shown by this program // can also be obtained from a PDF file using qpdf's --json option. +// +// Ignore calls to QTC::TC - they are for qpdf CI testing only. static char const* whoami = 0; static enum { st_none, st_numbers, st_lines } style = st_none; @@ -51,13 +54,10 @@ void print_lines(std::vector& numbers) void generate_page_map(QPDF& qpdf) { QPDFPageDocumentHelper dh(qpdf); - std::vector pages = dh.getAllPages(); int n = 0; - for (std::vector::iterator iter = pages.begin(); - iter != pages.end(); ++iter) + for (auto const& page : dh.getAllPages()) { - QPDFObjectHandle oh = (*iter).getObjectHandle(); - page_map[oh.getObjGen()] = ++n; + page_map[page.getObjectHandle().getObjGen()] = ++n; } } @@ -73,10 +73,9 @@ void show_bookmark_details(QPDFOutlineObjectHelper outline, case st_numbers: QTC::TC("examples", "pdf-bookmarks numbers"); - for (std::vector::iterator iter = numbers.begin(); - iter != numbers.end(); ++iter) + for (auto const& number : numbers) { - std::cout << *iter << "."; + std::cout << number << "."; } std::cout << " "; break; @@ -138,20 +137,18 @@ void show_bookmark_details(QPDFOutlineObjectHelper outline, void extract_bookmarks(std::vector outlines, std::vector& numbers) { - numbers.push_back(0); - for (std::vector::iterator iter = outlines.begin(); - iter != outlines.end(); ++iter) + // For style == st_numbers, numbers.at(n) contains the numerical + // label for the outline, so we count up from 1. + // For style == st_lines, numbers.at(n) == 0 indicates the last + // outline at level n, and we don't otherwise care what the value + // is, so we count up to zero. + numbers.push_back( + (style == st_lines) ? -QIntC::to_int(outlines.size()) : 0); + for (auto& outline : outlines) { ++(numbers.back()); - show_bookmark_details(*iter, numbers); - std::vector::iterator next = iter; - ++next; - bool has_next = (next != outlines.end()); - if ((style == st_lines) && (! has_next)) - { - numbers.back() = 0; - } - extract_bookmarks((*iter).getKids(), numbers); + show_bookmark_details(outline, numbers); + extract_bookmarks(outline.getKids(), numbers); } numbers.pop_back(); }