diff options
author | Jay Berkenbilt <ejb@ql.org> | 2024-01-05 22:11:09 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2024-01-05 23:12:12 +0100 |
commit | 7cac433e2d9256fb8361aa53d136d4eaacfda6fe (patch) | |
tree | 91e18e06655d5d83dd745032641cdd7406785ced /libqpdf/QPDFJob.cc | |
parent | 543038c52a3e0dc166565142ed7efb183e461948 (diff) | |
download | qpdf-7cac433e2d9256fb8361aa53d136d4eaacfda6fe.tar.zst |
Implement --set-page-labels and supporting API (fixes #939)
Diffstat (limited to 'libqpdf/QPDFJob.cc')
-rw-r--r-- | libqpdf/QPDFJob.cc | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index b0910cbd..2e0abb43 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -2172,6 +2172,37 @@ QPDFJob::handleTransformations(QPDF& pdf) if (m->remove_page_labels) { pdf.getRoot().removeKey("/PageLabels"); } + if (!m->page_label_specs.empty()) { + auto nums = QPDFObjectHandle::newArray(); + auto n_pages = QIntC::to_int(dh.getAllPages().size()); + int last_page_seen{0}; + for (auto& spec: m->page_label_specs) { + if (spec.first_page < 0) { + spec.first_page = n_pages + 1 + spec.first_page; + } + if (last_page_seen == 0) { + if (spec.first_page != 1) { + throw std::runtime_error( + "the first page label specification must start with page 1"); + } + } else if (spec.first_page <= last_page_seen) { + throw std::runtime_error( + "page label specifications must be in order by first page"); + } + if (spec.first_page > n_pages) { + throw std::runtime_error( + "page label spec: page " + std::to_string(spec.first_page) + + " is more than the total number of pages (" + std::to_string(n_pages) + ")"); + } + last_page_seen = spec.first_page; + nums.appendItem(QPDFObjectHandle::newInteger(spec.first_page - 1)); + nums.appendItem(QPDFPageLabelDocumentHelper::pageLabelDict( + spec.label_type, spec.start_num, spec.prefix)); + } + auto page_labels = QPDFObjectHandle::newDictionary(); + page_labels.replaceKey("/Nums", nums); + pdf.getRoot().replaceKey("/PageLabels", page_labels); + } if (!m->attachments_to_remove.empty()) { QPDFEmbeddedFileDocumentHelper efdh(pdf); for (auto const& key: m->attachments_to_remove) { @@ -3019,10 +3050,9 @@ QPDFJob::writeOutfile(QPDF& pdf) try { QUtil::remove_file(backup.c_str()); } catch (QPDFSystemError& e) { - *m->log->getError() - << m->message_prefix << ": unable to delete original file (" << e.what() << ");" - << " original file left in " << backup - << ", but the input was successfully replaced\n"; + *m->log->getError() << m->message_prefix << ": unable to delete original file (" + << e.what() << ");" << " original file left in " << backup + << ", but the input was successfully replaced\n"; } } } |