diff --git a/include/qpdf/QPDFJob.hh b/include/qpdf/QPDFJob.hh index 9dfe876..2841d0c 100644 --- a/include/qpdf/QPDFJob.hh +++ b/include/qpdf/QPDFJob.hh @@ -461,7 +461,7 @@ class QPDFJob // Transformations void setQPDFOptions(QPDF& pdf); - bool handlePageSpecs(QPDF& pdf); + void handlePageSpecs(QPDF& pdf); bool shouldRemoveUnreferencedResources(QPDF& pdf); void new_selection( std::string const& filename, std::string const& password, std::string const& range); diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index dc2d8d0..15cea44 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -426,15 +426,14 @@ QPDFJob::createQPDF() } if (!m->selections.empty()) { - if (!handlePageSpecs(pdf)) { - m->warnings = true; - } + handlePageSpecs(pdf); } if (!m->rotations.empty()) { handleRotations(pdf); } handleUnderOverlay(pdf); handleTransformations(pdf); + m->warnings |= m->inputs.clear(); auto root = pdf.getRoot(); if (m->remove_info) { @@ -2414,8 +2413,21 @@ QPDFJob::Inputs::process_all() } } -// Handle all page specifications. Return true if it succeeded without warnings. bool +QPDFJob::Inputs::clear() +{ + bool any_warnings = false; + for (auto& [filename, file_spec]: files) { + if (auto& pdf = file_spec.qpdf_p) { + any_warnings |= pdf->anyWarnings(); + pdf = nullptr; + } + } + return any_warnings; +} + +// Handle all page specifications. +void QPDFJob::handlePageSpecs(QPDF& pdf) { auto& main_input = m->inputs.files[m->infilename]; @@ -2615,14 +2627,6 @@ QPDFJob::handlePageSpecs(QPDF& pdf) } } } - for (auto& foreign: m->inputs.files) { - if (foreign.second.qpdf_p) { // exclude main input - if (foreign.second.qpdf->anyWarnings()) { - return false; - } - } - } - return true; } void diff --git a/libqpdf/qpdf/QPDFJob_private.hh b/libqpdf/qpdf/QPDFJob_private.hh index 8a0d8ef..f207721 100644 --- a/libqpdf/qpdf/QPDFJob_private.hh +++ b/libqpdf/qpdf/QPDFJob_private.hh @@ -62,6 +62,10 @@ struct QPDFJob::Inputs } void process(std::string const& filename, QPDFJob::Input& file_spec); void process_all(); + + // Destroy all owned QPDF objects. Return false if any of the QPDF objects recorded warnings. + bool clear(); + std::string encryption_file; std::string encryption_file_password; bool keep_files_open{true};