From 249427ea152227b8c4e0d84fed5277ee67b0efb9 Mon Sep 17 00:00:00 2001 From: m-holger Date: Thu, 27 Mar 2025 18:36:01 +0000 Subject: [PATCH] Enhance --rotate usage message (fixes #1410) --- libqpdf/QPDFJob.cc | 21 ++++++++------------- qpdf/qtest/qpdf/invalid-rotated.out | 9 +++++++++ qpdf/qtest/rotate-pages.test | 18 +++++++++++++++++- 3 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 qpdf/qtest/qpdf/invalid-rotated.out diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index bbaf291..efa07d3 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -398,24 +398,19 @@ QPDFJob::parseRotationParameter(std::string const& parameter) if (range.empty()) { range = "1-z"; } - bool range_valid = false; try { QUtil::parse_numrange(range.c_str(), 0); - range_valid = true; } catch (std::runtime_error const&) { - // ignore - } - if (range_valid && - ((angle_str == "0") || (angle_str == "90") || (angle_str == "180") || - (angle_str == "270"))) { - int angle = QUtil::string_to_int(angle_str.c_str()); - if (relative == -1) { - angle = -angle; - } - m->rotations[range] = RotationSpec(angle, (relative != 0)); - } else { usage("invalid parameter to rotate: " + parameter); } + int angle = QUtil::string_to_int(angle_str.c_str()) % 360; + if (angle % 90 != 0) { + usage("invalid parameter to rotate (angle must be a multiple of 90): " + parameter); + } + if (relative == -1) { + angle = -angle; + } + m->rotations[range] = RotationSpec(angle, (relative != 0)); } std::vector diff --git a/qpdf/qtest/qpdf/invalid-rotated.out b/qpdf/qtest/qpdf/invalid-rotated.out new file mode 100644 index 0000000..7514838 --- /dev/null +++ b/qpdf/qtest/qpdf/invalid-rotated.out @@ -0,0 +1,9 @@ + +qpdf: invalid parameter to rotate (angle must be a multiple of 90): 45:1,4,11,16 + +For help: + qpdf --help=usage usage information + qpdf --help=topic help on a topic + qpdf --help=--option help on an option + qpdf --help general help and a topic list + diff --git a/qpdf/qtest/rotate-pages.test b/qpdf/qtest/rotate-pages.test index 2f43fed..46527ff 100644 --- a/qpdf/qtest/rotate-pages.test +++ b/qpdf/qtest/rotate-pages.test @@ -14,7 +14,7 @@ cleanup(); my $td = new TestDriver('rotate-pages'); -my $n_tests = 18; +my $n_tests = 21; # Do absolute, positive, and negative on ranges that include # inherited and non-inherited. @@ -32,6 +32,22 @@ $td->runtest("check output", {$td->COMMAND => "qpdf-test-compare a.pdf rotated.pdf"}, {$td->FILE => "rotated.pdf", $td->EXIT_STATUS => 0}); +$td->runtest("page rotation (>270)", + {$td->COMMAND => "qpdf --static-id to-rotate.pdf a.pdf" . + " --rotate=+450:1,4,11,16" . + " --rotate=900:2,5,12-13" . + " --rotate=-1890:3,15,17,18"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("check output", + {$td->COMMAND => "qpdf-test-compare a.pdf rotated.pdf"}, + {$td->FILE => "rotated.pdf", $td->EXIT_STATUS => 0}); + +$td->runtest("invald page rotation", + {$td->COMMAND => "qpdf --static-id to-rotate.pdf a.pdf" . + " --rotate=45:1,4,11,16"}, + {$td->FILE => "invalid-rotated.out", $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); + $td->runtest("remove rotation", {$td->COMMAND => "qpdf --static-id rotated.pdf a.pdf" . " --qdf --no-original-object-ids --rotate=0"}, -- libgit2 0.21.4