Commit b5d41b16b874e322befbd3fa2dde07714f7090a3

Authored by Jay Berkenbilt
1 parent 1cc532dc

QPDFJob: convert under/overlay and rotate

generate_auto_job
... ... @@ -32,30 +32,6 @@ def write_file(filename):
32 32 os.rename(tmpfile, filename)
33 33  
34 34  
35   -# QXXXQ
36   -# These are trivial but not in main and so need a different config
37   -# object. Some are in more than one table.
38   -not_yet = set([
39   - 'accessibility',
40   - 'allow-insecure',
41   - 'annotate',
42   - 'assemble',
43   - 'cleartext-metadata',
44   - 'extract',
45   - 'force-R5',
46   - 'force-V4',
47   - 'form',
48   - 'from',
49   - 'modify',
50   - 'modify-other',
51   - 'print',
52   - 'repeat',
53   - 'rotate',
54   - 'to',
55   - 'use-aes',
56   -])
57   -
58   -
59 35 class Main:
60 36 SOURCES = [
61 37 whoami,
... ... @@ -447,8 +423,7 @@ class Main:
447 423 for i, [kind, v] in flags.items():
448 424 self.options_without_help.add(f'--{i}')
449 425 add_jdata(i, table_prefix or table)
450   - # QXXXQ not_yet
451   - if i in not_yet or config is None or i in o.get('manual', []):
  426 + if config is None or i in o.get('manual', []):
452 427 identifier = self.to_identifier(i, arg_prefix, False)
453 428 self.handle_flag(i, identifier, kind, v)
454 429 else:
... ...
include/qpdf/QPDFJob.hh
... ... @@ -201,6 +201,22 @@ class QPDFJob
201 201 Config& config;
202 202 };
203 203  
  204 + class UOConfig
  205 + {
  206 + friend class QPDFJob;
  207 + friend class Config;
  208 + public:
  209 + QPDF_DLL UOConfig& path(char const* parameter);
  210 +
  211 +# include <qpdf/auto_job_c_uo.hh>
  212 +
  213 + private:
  214 + UOConfig(Config&);
  215 + UOConfig(PagesConfig const&) = delete;
  216 +
  217 + Config& config;
  218 + };
  219 +
204 220 // Configuration is performed by calling methods XXX QXXXQ document
205 221 class Config
206 222 {
... ... @@ -210,6 +226,8 @@ class QPDFJob
210 226 std::shared_ptr<CopyAttConfig> copyAttachmentsFrom();
211 227 std::shared_ptr<AttConfig> addAttachment();
212 228 std::shared_ptr<PagesConfig> pages();
  229 + std::shared_ptr<UOConfig> overlay();
  230 + std::shared_ptr<UOConfig> underlay();
213 231  
214 232 # include <qpdf/auto_job_c_main.hh>
215 233  
... ... @@ -422,16 +440,12 @@ class QPDFJob
422 440 bool check_requires_password;
423 441 std::shared_ptr<char> infilename;
424 442 std::shared_ptr<char> outfilename;
425   -
426   - // Helper functions
427   - void parseRotationParameter(std::string const&);
428   - std::vector<int> parseNumrange(char const* range, int max,
429   - bool throw_error = false);
430   -
431   -
432 443 // QXXXQ END-PUBLIC
433 444  
434 445 private:
  446 + // Helper functions
  447 + void parseRotationParameter(std::string const&);
  448 + std::vector<int> parseNumrange(char const* range, int max);
435 449  
436 450 // Basic file processing
437 451 std::shared_ptr<QPDF> processFile(
... ...
include/qpdf/auto_job_c_main.hh
... ... @@ -65,6 +65,7 @@ QPDF_DLL Config&amp; oiMinWidth(char const* parameter);
65 65 QPDF_DLL Config& password(char const* parameter);
66 66 QPDF_DLL Config& passwordFile(char const* parameter);
67 67 QPDF_DLL Config& removeAttachment(char const* parameter);
  68 +QPDF_DLL Config& rotate(char const* parameter);
68 69 QPDF_DLL Config& showAttachment(char const* parameter);
69 70 QPDF_DLL Config& showObject(char const* parameter);
70 71 QPDF_DLL Config& compressStreams(char const* parameter);
... ...
include/qpdf/auto_job_c_uo.hh 0 โ†’ 100644
  1 +//
  2 +// This file is automatically generated by generate_auto_job.
  3 +// Edits will be automatically overwritten if the build is
  4 +// run in maintainer mode.
  5 +//
  6 +QPDF_DLL Config& end();
  7 +QPDF_DLL UOConfig& to(char const* parameter);
  8 +QPDF_DLL UOConfig& from(char const* parameter);
  9 +QPDF_DLL UOConfig& repeat(char const* parameter);
  10 +QPDF_DLL UOConfig& password(char const* parameter);
... ...
job.sums
1 1 # Generated by generate_auto_job
2   -generate_auto_job d41f3092545906dcd9a82f88ff41939bf695a36ecaebfe8559c66bd92b7416fb
  2 +generate_auto_job 7a539a822d332e33e08495a82a3fb86ceed2da2bb92ca492dd7ed888d226ab6a
3 3 include/qpdf/auto_job_c_att.hh ecc3f8f711b486b491e811176362a90c022eb225ff12157df3a10ca021be87b1
4 4 include/qpdf/auto_job_c_copy_att.hh caffae3d1faf2cd92a07ba77da638cce31da3e074a047918834195c0f3ed508a
5   -include/qpdf/auto_job_c_main.hh 1e060e9dd2029d21b29fed03e3a1e62164050b43684bd7434cc9e9707f73150d
  5 +include/qpdf/auto_job_c_main.hh 7f7c0a4d8e640a2d24908af348f7b658ca81d3d8aa5346cf4327f6c1d4021119
6 6 include/qpdf/auto_job_c_pages.hh 79ee6e52a36fedfd0e6ca60bd926bc25a3e975ab6fa984a7e798a48791e8ba86
7   -job.yml 4cd60df0caa74b68cc39352910a8381c3411248bc3edef69f9d16d75e807f451
8   -libqpdf/qpdf/auto_job_decl.hh f9f2a605fb8b5fed9b74c4cd07c07c3cdee60e2628d082250810c8074d5acd83
  7 +include/qpdf/auto_job_c_uo.hh 80404376f19fe57d67421ad0c5fb1755811758c73870df96f081f032b196deff
  8 +job.yml 1f508cb7108c55885fbe98537676573bbfddf7b476b2023fd10a975d47afc037
  9 +libqpdf/qpdf/auto_job_decl.hh dc9232ed6961d709abacbbf71eb7d19c5e6951894aec6f480afcd3b6ba463206
9 10 libqpdf/qpdf/auto_job_help.hh 383eea80e2c185ef5295fc126246457a7ceeffea759fdb90bb2e6727532ea538
10   -libqpdf/qpdf/auto_job_init.hh b776c87e61d56842f23cb46fb6d4e44f5740e64854844bcc454fd812f7b4f8d5
  11 +libqpdf/qpdf/auto_job_init.hh 25a93a4ded91e1faa2d6a9d2bb85d811b5b49ae54c9fbdccad65b94538365418
11 12 libqpdf/qpdf/auto_job_schema.hh 6e6d72e99dacd02c22d9ac70f4dc78a935f879d2a16c89f07f2bdfa936cc2ae3
12 13 manual/_ext/qpdf.py 855fe12de5af7a10bb24be6ecc4d5dff4c84ac58cf388a13be6bbb394346a67d
13 14 manual/cli.rst 68122ff8179c10df3fe6d577adde4973c346f7866ba9a511bab5a6e6f292a6f1
... ...
... ... @@ -205,6 +205,7 @@ options:
205 205 - force-R5
206 206 - allow-insecure
207 207 - table: underlay/overlay
  208 + config: c_uo
208 209 prefix: UO
209 210 positional: true
210 211 required_parameter:
... ...
libqpdf/QPDFJob.cc
... ... @@ -507,7 +507,7 @@ QPDFJob::parseRotationParameter(std::string const&amp; parameter)
507 507 bool range_valid = false;
508 508 try
509 509 {
510   - parseNumrange(range.c_str(), 0, true);
  510 + QUtil::parse_numrange(range.c_str(), 0);
511 511 range_valid = true;
512 512 }
513 513 catch (std::runtime_error const&)
... ... @@ -532,7 +532,7 @@ QPDFJob::parseRotationParameter(std::string const&amp; parameter)
532 532 }
533 533  
534 534 std::vector<int>
535   -QPDFJob::parseNumrange(char const* range, int max, bool throw_error)
  535 +QPDFJob::parseNumrange(char const* range, int max)
536 536 {
537 537 try
538 538 {
... ... @@ -540,14 +540,7 @@ QPDFJob::parseNumrange(char const* range, int max, bool throw_error)
540 540 }
541 541 catch (std::runtime_error& e)
542 542 {
543   - if (throw_error)
544   - {
545   - throw(e);
546   - }
547   - else
548   - {
549   - throw ConfigError(e.what());
550   - }
  543 + throw ConfigError(e.what());
551 544 }
552 545 return std::vector<int>();
553 546 }
... ...
libqpdf/QPDFJob_argv.cc
... ... @@ -36,7 +36,6 @@ namespace
36 36 void usage(std::string const& message);
37 37 void initOptionTables();
38 38 void doFinalChecks();
39   - void parseUnderOverlayOptions(QPDFJob::UnderOverlay*);
40 39  
41 40 QPDFArgParser ap;
42 41 QPDFJob& o;
... ... @@ -44,6 +43,7 @@ namespace
44 43 std::shared_ptr<QPDFJob::CopyAttConfig> c_copy_att;
45 44 std::shared_ptr<QPDFJob::AttConfig> c_att;
46 45 std::shared_ptr<QPDFJob::PagesConfig> c_pages;
  46 + std::shared_ptr<QPDFJob::UOConfig> c_uo;
47 47 std::vector<char*> accumulated_args; // points to member in ap
48 48 char* pages_password;
49 49 };
... ... @@ -321,7 +321,7 @@ ArgParser::argPagesPositional(char* arg)
321 321 {
322 322 try
323 323 {
324   - o.parseNumrange(range, 0, true);
  324 + QUtil::parse_numrange(range, 0);
325 325 }
326 326 catch (std::runtime_error& e1)
327 327 {
... ... @@ -369,19 +369,15 @@ ArgParser::argEndPages()
369 369 void
370 370 ArgParser::argUnderlay()
371 371 {
372   - parseUnderOverlayOptions(&o.underlay);
  372 + this->c_uo = c_main->underlay();
  373 + this->ap.selectOptionTable(O_UNDERLAY_OVERLAY);
373 374 }
374 375  
375 376 void
376 377 ArgParser::argOverlay()
377 378 {
378   - parseUnderOverlayOptions(&o.overlay);
379   -}
380   -
381   -void
382   -ArgParser::argRotate(char* parameter)
383   -{
384   - o.parseRotationParameter(parameter);
  379 + this->c_uo = c_main->overlay();
  380 + this->ap.selectOptionTable(O_UNDERLAY_OVERLAY);
385 381 }
386 382  
387 383 void
... ... @@ -576,57 +572,14 @@ ArgParser::argEnd256BitEncryption()
576 572 void
577 573 ArgParser::argUOPositional(char* arg)
578 574 {
579   - if (! o.under_overlay->filename.empty())
580   - {
581   - usage(o.under_overlay->which + " file already specified");
582   - }
583   - else
584   - {
585   - o.under_overlay->filename = arg;
586   - }
587   -}
588   -
589   -void
590   -ArgParser::argUOTo(char* parameter)
591   -{
592   - o.parseNumrange(parameter, 0);
593   - o.under_overlay->to_nr = parameter;
594   -}
595   -
596   -void
597   -ArgParser::argUOFrom(char* parameter)
598   -{
599   - if (strlen(parameter))
600   - {
601   - o.parseNumrange(parameter, 0);
602   - }
603   - o.under_overlay->from_nr = parameter;
604   -}
605   -
606   -void
607   -ArgParser::argUORepeat(char* parameter)
608   -{
609   - if (strlen(parameter))
610   - {
611   - o.parseNumrange(parameter, 0);
612   - }
613   - o.under_overlay->repeat_nr = parameter;
614   -}
615   -
616   -void
617   -ArgParser::argUOPassword(char* parameter)
618   -{
619   - o.under_overlay->password = QUtil::make_shared_cstr(parameter);
  575 + c_uo->path(arg);
620 576 }
621 577  
622 578 void
623 579 ArgParser::argEndUnderlayOverlay()
624 580 {
625   - if (o.under_overlay->filename.empty())
626   - {
627   - usage(o.under_overlay->which + " file not specified");
628   - }
629   - o.under_overlay = 0;
  581 + c_uo->end();
  582 + c_uo = nullptr;
630 583 }
631 584  
632 585 void
... ... @@ -668,13 +621,6 @@ ArgParser::usage(std::string const&amp; message)
668 621 }
669 622  
670 623 void
671   -ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo)
672   -{
673   - o.under_overlay = uo;
674   - this->ap.selectOptionTable(O_UNDERLAY_OVERLAY);
675   -}
676   -
677   -void
678 624 ArgParser::parseOptions()
679 625 {
680 626 try
... ...
libqpdf/QPDFJob_config.cc
... ... @@ -688,6 +688,13 @@ QPDFJob::Config::jobJsonFile(char const* parameter)
688 688 return *this;
689 689 }
690 690  
  691 +QPDFJob::Config&
  692 +QPDFJob::Config::rotate(char const* parameter)
  693 +{
  694 + o.parseRotationParameter(parameter);
  695 + return *this;
  696 +}
  697 +
691 698 std::shared_ptr<QPDFJob::CopyAttConfig>
692 699 QPDFJob::Config::copyAttachmentsFrom()
693 700 {
... ... @@ -875,3 +882,84 @@ QPDFJob::PagesConfig::pageSpec(std::string const&amp; filename,
875 882 QPDFJob::PageSpec(filename, password, range));
876 883 return *this;
877 884 }
  885 +
  886 +std::shared_ptr<QPDFJob::UOConfig>
  887 +QPDFJob::Config::overlay()
  888 +{
  889 + o.under_overlay = &o.overlay;
  890 + return std::shared_ptr<UOConfig>(new UOConfig(*this));
  891 +}
  892 +
  893 +std::shared_ptr<QPDFJob::UOConfig>
  894 +QPDFJob::Config::underlay()
  895 +{
  896 + o.under_overlay = &o.underlay;
  897 + return std::shared_ptr<UOConfig>(new UOConfig(*this));
  898 +}
  899 +
  900 +QPDFJob::UOConfig::UOConfig(Config& c) :
  901 + config(c)
  902 +{
  903 +}
  904 +
  905 +QPDFJob::Config&
  906 +QPDFJob::UOConfig::end()
  907 +{
  908 + if (config.o.under_overlay->filename.empty())
  909 + {
  910 + usage(config.o.under_overlay->which + " file not specified");
  911 + }
  912 + config.o.under_overlay = 0;
  913 + return this->config;
  914 +}
  915 +
  916 +QPDFJob::UOConfig&
  917 +QPDFJob::UOConfig::path(char const* parameter)
  918 +{
  919 + if (! config.o.under_overlay->filename.empty())
  920 + {
  921 + usage(config.o.under_overlay->which + " file already specified");
  922 + }
  923 + else
  924 + {
  925 + config.o.under_overlay->filename = parameter;
  926 + }
  927 + return *this;
  928 +}
  929 +
  930 +QPDFJob::UOConfig&
  931 +QPDFJob::UOConfig::to(char const* parameter)
  932 +{
  933 + config.o.parseNumrange(parameter, 0);
  934 + config.o.under_overlay->to_nr = parameter;
  935 + return *this;
  936 +}
  937 +
  938 +QPDFJob::UOConfig&
  939 +QPDFJob::UOConfig::from(char const* parameter)
  940 +{
  941 + if (strlen(parameter))
  942 + {
  943 + config.o.parseNumrange(parameter, 0);
  944 + }
  945 + config.o.under_overlay->from_nr = parameter;
  946 + return *this;
  947 +}
  948 +
  949 +QPDFJob::UOConfig&
  950 +QPDFJob::UOConfig::repeat(char const* parameter)
  951 +{
  952 + if (strlen(parameter))
  953 + {
  954 + config.o.parseNumrange(parameter, 0);
  955 + }
  956 + config.o.under_overlay->repeat_nr = parameter;
  957 + return *this;
  958 +}
  959 +
  960 +QPDFJob::UOConfig&
  961 +QPDFJob::UOConfig::password(char const* parameter)
  962 +{
  963 + config.o.under_overlay->password = QUtil::make_shared_cstr(parameter);
  964 + return *this;
  965 +}
... ...
libqpdf/qpdf/auto_job_decl.hh
... ... @@ -24,7 +24,6 @@ void argEncrypt();
24 24 void argOverlay();
25 25 void argPages();
26 26 void argUnderlay();
27   -void argRotate(char *);
28 27 void argPagesPositional(char*);
29 28 void argPagesPassword(char *);
30 29 void argEndPages();
... ... @@ -51,10 +50,6 @@ void argEnc256ForceR5();
51 50 void argEnc256AllowInsecure();
52 51 void argEnd256BitEncryption();
53 52 void argUOPositional(char*);
54   -void argUOTo(char *);
55   -void argUOFrom(char *);
56   -void argUORepeat(char *);
57   -void argUOPassword(char *);
58 53 void argEndUnderlayOverlay();
59 54 void argAttPositional(char*);
60 55 void argEndAttachment();
... ...
libqpdf/qpdf/auto_job_init.hh
... ... @@ -97,7 +97,7 @@ this-&gt;ap.addRequiredParameter(&quot;oi-min-width&quot;, [this](char *x){c_main-&gt;oiMinWidth
97 97 this->ap.addRequiredParameter("password", [this](char *x){c_main->password(x);}, "password");
98 98 this->ap.addRequiredParameter("password-file", [this](char *x){c_main->passwordFile(x);}, "password");
99 99 this->ap.addRequiredParameter("remove-attachment", [this](char *x){c_main->removeAttachment(x);}, "attachment");
100   -this->ap.addRequiredParameter("rotate", p(&ArgParser::argRotate), "[+|-]angle");
  100 +this->ap.addRequiredParameter("rotate", [this](char *x){c_main->rotate(x);}, "[+|-]angle");
101 101 this->ap.addRequiredParameter("show-attachment", [this](char *x){c_main->showAttachment(x);}, "attachment");
102 102 this->ap.addRequiredParameter("show-object", [this](char *x){c_main->showObject(x);}, "trailer");
103 103 this->ap.addChoices("compress-streams", [this](char *x){c_main->compressStreams(x);}, true, yn_choices);
... ... @@ -137,10 +137,10 @@ this-&gt;ap.addBare(&quot;force-R5&quot;, b(&amp;ArgParser::argEnc256ForceR5));
137 137 this->ap.addBare("allow-insecure", b(&ArgParser::argEnc256AllowInsecure));
138 138 this->ap.registerOptionTable("underlay/overlay", b(&ArgParser::argEndUnderlayOverlay));
139 139 this->ap.addPositional(p(&ArgParser::argUOPositional));
140   -this->ap.addRequiredParameter("to", p(&ArgParser::argUOTo), "page-range");
141   -this->ap.addRequiredParameter("from", p(&ArgParser::argUOFrom), "page-range");
142   -this->ap.addRequiredParameter("repeat", p(&ArgParser::argUORepeat), "page-range");
143   -this->ap.addRequiredParameter("password", p(&ArgParser::argUOPassword), "password");
  140 +this->ap.addRequiredParameter("to", [this](char *x){c_uo->to(x);}, "page-range");
  141 +this->ap.addRequiredParameter("from", [this](char *x){c_uo->from(x);}, "page-range");
  142 +this->ap.addRequiredParameter("repeat", [this](char *x){c_uo->repeat(x);}, "page-range");
  143 +this->ap.addRequiredParameter("password", [this](char *x){c_uo->password(x);}, "password");
144 144 this->ap.registerOptionTable("attachment", b(&ArgParser::argEndAttachment));
145 145 this->ap.addPositional(p(&ArgParser::argAttPositional));
146 146 this->ap.addBare("replace", [this](){c_att->replace();});
... ...