From a160bd4efec87ed3b632916efc8ae20ac3624116 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 5 Apr 2025 09:35:00 -0400 Subject: [PATCH] Allow rotate as array in job JSON (fixes #1401) --- job.sums | 8 ++++---- job.yml | 1 + libqpdf/QPDFJob_json.cc | 12 ++++++++++++ libqpdf/qpdf/auto_job_json_decl.hh | 2 ++ libqpdf/qpdf/auto_job_json_init.hh | 2 ++ libqpdf/qpdf/auto_job_schema.hh | 4 +++- manual/release-notes.rst | 3 +++ qpdf/qtest/qpdf/rotate-multi.json | 7 +++++++ qpdf/qtest/rotate-pages.test | 6 +++++- 9 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 qpdf/qtest/qpdf/rotate-multi.json diff --git a/job.sums b/job.sums index 0fd8697..3b06a5e 100644 --- a/job.sums +++ b/job.sums @@ -7,13 +7,13 @@ include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a3 include/qpdf/auto_job_c_main.hh 48e8ea475e8a8f4c96de86bdad10dff83a263deccc3798c8bed7f5e0e070a037 include/qpdf/auto_job_c_pages.hh 09ca15649cc94fdaf6d9bdae28a20723f2a66616bf15aa86d83df31051d82506 include/qpdf/auto_job_c_uo.hh 9c2f98a355858dd54d0bba444b73177a59c9e56833e02fa6406f429c07f39e62 -job.yml ba9f24920c2221883b1d6d8e42f7ac7c78988063a0ca9181dc08abe9cde6f760 +job.yml 9245e70c233dc2067827593403bd9e9feafc5aa0be6b12bb7b99a4b2cab84584 libqpdf/qpdf/auto_job_decl.hh 34ba07d3891c3e5cdd8712f991e508a0652c9db314c5d5bcdf4421b76e6f6e01 libqpdf/qpdf/auto_job_help.hh 03bdaab05f84b16bfb15ad7993a4655b7dc14af070fa97fe3035943726d4b258 libqpdf/qpdf/auto_job_init.hh 029d929f930f60b4055796c8c4ce2ed625f861316ac738ab638579eca46b2472 -libqpdf/qpdf/auto_job_json_decl.hh 843892c8e8652a86b7eb573893ef24050b7f36fe313f7251874be5cd4cdbe3fd -libqpdf/qpdf/auto_job_json_init.hh b883f3768c8367327ea1f17e8ca503178be62a9cede316bf7ad96c0fafee5513 -libqpdf/qpdf/auto_job_schema.hh 6d28db327dd19e0a7da375c681ecea7965513fa4b5d2349a80089b057f8c02d8 +libqpdf/qpdf/auto_job_json_decl.hh 04965f6321e54b8b3b1dd2ca101d763a22ab44fa81c69e4b6fc0fd6bb7f50f92 +libqpdf/qpdf/auto_job_json_init.hh 42b402305b52fc217453206c0a372303d0b59d4d4227bb564b4fa639257d4411 +libqpdf/qpdf/auto_job_schema.hh 2d3c163c74498b638a13931eed71c2a4dc6b155a9d3e2c1b740070fac4293737 manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 manual/cli.rst 1094662a10db21528fd151739a9779a4504ebac75b483a11a53d42ab0430ee42 manual/qpdf.1 c7d03b8b544b0c3b2a74149d746596d4564aefff50a53980e435aa5c841f7bed diff --git a/job.yml b/job.yml index cc34b8a..5db4b8d 100644 --- a/job.yml +++ b/job.yml @@ -450,6 +450,7 @@ json: remove-structure: report-memory-usage: rotate: + - null set-page-labels: - null overlay: diff --git a/libqpdf/QPDFJob_json.cc b/libqpdf/QPDFJob_json.cc index f5ed0a8..eb24bd3 100644 --- a/libqpdf/QPDFJob_json.cc +++ b/libqpdf/QPDFJob_json.cc @@ -590,6 +590,18 @@ Handlers::setupUnderlayPassword() } void +Handlers::beginRotateArray(JSON) +{ + // nothing needed +} + +void +Handlers::endRotateArray() +{ + // nothing needed +} + +void Handlers::setupSetPageLabels() { accumulated_args.clear(); diff --git a/libqpdf/qpdf/auto_job_json_decl.hh b/libqpdf/qpdf/auto_job_json_decl.hh index a5a393a..58d55e1 100644 --- a/libqpdf/qpdf/auto_job_json_decl.hh +++ b/libqpdf/qpdf/auto_job_json_decl.hh @@ -43,6 +43,8 @@ void beginPages(JSON); void endPages(); void setupPagesFile(); void setupPagesPassword(); +void beginRotateArray(JSON); +void endRotateArray(); void beginSetPageLabelsArray(JSON); void endSetPageLabelsArray(); void setupSetPageLabels(); diff --git a/libqpdf/qpdf/auto_job_json_init.hh b/libqpdf/qpdf/auto_job_json_init.hh index d85b75e..6457f26 100644 --- a/libqpdf/qpdf/auto_job_json_init.hh +++ b/libqpdf/qpdf/auto_job_json_init.hh @@ -428,7 +428,9 @@ pushKey("reportMemoryUsage"); addBare([this]() { c_main->reportMemoryUsage(); }); popHandler(); // key: reportMemoryUsage pushKey("rotate"); +beginArray(bindJSON(&Handlers::beginRotateArray), bindBare(&Handlers::endRotateArray)); // .rotate[] addParameter([this](std::string const& p) { c_main->rotate(p); }); +popHandler(); // array: .rotate[] popHandler(); // key: rotate pushKey("setPageLabels"); beginArray(bindJSON(&Handlers::beginSetPageLabelsArray), bindBare(&Handlers::endSetPageLabelsArray)); // .setPageLabels[] diff --git a/libqpdf/qpdf/auto_job_schema.hh b/libqpdf/qpdf/auto_job_schema.hh index d0c8d3b..23ba4de 100644 --- a/libqpdf/qpdf/auto_job_schema.hh +++ b/libqpdf/qpdf/auto_job_schema.hh @@ -150,7 +150,9 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ "removePageLabels": "remove explicit page numbers", "removeStructure": "remove metadata", "reportMemoryUsage": "best effort report of memory usage", - "rotate": "rotate pages", + "rotate": [ + "rotate pages" + ], "setPageLabels": [ "number pages for the entire document" ], diff --git a/manual/release-notes.rst b/manual/release-notes.rst index 37860b6..2b30b64 100644 --- a/manual/release-notes.rst +++ b/manual/release-notes.rst @@ -29,6 +29,9 @@ more detail. - Fix two object stream error/warning messages that reported the wrong object id. + - Accept an array for ``rotate`` in qpdf job JSON since it is a + repeatable option. + - CLI Enhancements - New :qpdf:ref:`--remove-structure` option to exclude the document diff --git a/qpdf/qtest/qpdf/rotate-multi.json b/qpdf/qtest/qpdf/rotate-multi.json new file mode 100644 index 0000000..6112091 --- /dev/null +++ b/qpdf/qtest/qpdf/rotate-multi.json @@ -0,0 +1,7 @@ +{ + "rotate": [ + "+450:1,4,11,16", + "900:2,5,12-13", + "-1890:3,15,17,18" + ] +} diff --git a/qpdf/qtest/rotate-pages.test b/qpdf/qtest/rotate-pages.test index 46527ff..0a6ba93 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 = 21; +my $n_tests = 22; # Do absolute, positive, and negative on ranges that include # inherited and non-inherited. @@ -38,6 +38,10 @@ $td->runtest("page rotation (>270)", " --rotate=900:2,5,12-13" . " --rotate=-1890:3,15,17,18"}, {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("job json multiple page rotation", + {$td->COMMAND => "qpdf --static-id to-rotate.pdf a.pdf" . + " --job-json-file=rotate-multi.json"}, + {$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}); -- libgit2 0.21.4