summaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFJob_json.cc407
-rw-r--r--libqpdf/qpdf/auto_job_init.hh20
-rw-r--r--libqpdf/qpdf/auto_job_json_decl.hh50
-rw-r--r--libqpdf/qpdf/auto_job_json_init.hh171
-rw-r--r--libqpdf/qpdf/auto_job_schema.hh16
5 files changed, 583 insertions, 81 deletions
diff --git a/libqpdf/QPDFJob_json.cc b/libqpdf/QPDFJob_json.cc
index 0b2f049c..735e6a6f 100644
--- a/libqpdf/QPDFJob_json.cc
+++ b/libqpdf/QPDFJob_json.cc
@@ -23,20 +23,23 @@ namespace
void usage(std::string const& message);
void initHandlers();
- typedef std::function<void()> bare_arg_handler_t;
- typedef std::function<void(char const*)> param_arg_handler_t;
-
- void addBare(std::string const& key, bare_arg_handler_t);
- void addParameter(std::string const& key, bool required,
- param_arg_handler_t);
- void addChoices(std::string const& key,
- bool required, char const** choices,
- param_arg_handler_t);
+ typedef std::function<void()> bare_handler_t;
+ typedef std::function<void(char const*)> param_handler_t;
+ typedef std::function<void(std::string const& key)> setup_handler_t;
+
+ void addBare(std::string const& key, bare_handler_t);
+ void addParameter(std::string const& key, param_handler_t);
+ void addChoices(std::string const& key, char const** choices,
+ param_handler_t);
+ void doSetup(std::string const& key, setup_handler_t);
void beginDict(std::string const& key,
- bare_arg_handler_t start_fn,
- bare_arg_handler_t end_fn);
+ bare_handler_t start_fn,
+ bare_handler_t end_fn);
void endDict();
+ bare_handler_t bindBare(void (Handlers::*f)());
+ setup_handler_t bindSetup(void (Handlers::*f)(std::string const&));
+
std::list<std::shared_ptr<JSONHandler>> json_handlers;
JSONHandler* jh; // points to last of json_handlers
std::shared_ptr<QPDFJob::Config> c_main;
@@ -61,6 +64,18 @@ Handlers::usage(std::string const& message)
throw QPDFUsage(message);
}
+Handlers::bare_handler_t
+Handlers::bindBare(void (Handlers::*f)())
+{
+ return std::bind(std::mem_fn(f), this);
+}
+
+Handlers::setup_handler_t
+Handlers::bindSetup(void (Handlers::*f)(std::string const&))
+{
+ return std::bind(std::mem_fn(f), this, std::placeholders::_1);
+}
+
void
Handlers::initHandlers()
{
@@ -72,33 +87,6 @@ Handlers::initHandlers()
# include <qpdf/auto_job_json_init.hh>
- // QXXXQ
- auto empty = [](){};
- beginDict("input", empty, empty);
- beginDict("file", empty, empty);
- addParameter("name", true, [this](char const* p) {
- c_main->inputFile(p);
- });
- endDict(); // input.file
- endDict(); // input
- beginDict("output", empty, empty);
- beginDict("file", empty, empty);
- addParameter("name", true, [this](char const* p) {
- c_main->outputFile(p);
- });
- endDict(); // output.file
- beginDict("options", empty, empty);
- addBare("qdf", [this]() {
- c_main->qdf();
- });
- char const* choices[] = {"disable", "preserve", "generate", 0};
- addChoices("objectStreams", true, choices, [this](char const* p) {
- c_main->objectStreams(p);
- });
- endDict(); // output.options
- endDict(); // output
- // /QXXXQ
-
if (this->json_handlers.size() != 1)
{
throw std::logic_error("QPDFJob_json: json_handlers size != 1 at end");
@@ -106,7 +94,7 @@ Handlers::initHandlers()
}
void
-Handlers::addBare(std::string const& key, bare_arg_handler_t fn)
+Handlers::addBare(std::string const& key, bare_handler_t fn)
{
auto h = std::make_shared<JSONHandler>();
h->addBoolHandler([this, fn](std::string const& path, bool v){
@@ -123,29 +111,19 @@ Handlers::addBare(std::string const& key, bare_arg_handler_t fn)
}
void
-Handlers::addParameter(std::string const& key,
- bool required,
- param_arg_handler_t fn)
+Handlers::addParameter(std::string const& key, param_handler_t fn)
{
auto h = std::make_shared<JSONHandler>();
h->addStringHandler(
[fn](std::string const& path, std::string const& parameter){
fn(parameter.c_str());
});
- if (! required)
- {
- h->addNullHandler(
- [fn](std::string const& path){
- fn(nullptr);
- });
- }
jh->addDictKeyHandler(key, h);
}
void
-Handlers::addChoices(std::string const& key,
- bool required, char const** choices,
- param_arg_handler_t fn)
+Handlers::addChoices(std::string const& key, char const** choices,
+ param_handler_t fn)
{
auto h = std::make_shared<JSONHandler>();
h->addStringHandler(
@@ -183,20 +161,19 @@ Handlers::addChoices(std::string const& key,
}
fn(parameter.c_str());
});
- if (! required)
- {
- h->addNullHandler(
- [fn](std::string const& path){
- fn(nullptr);
- });
- }
jh->addDictKeyHandler(key, h);
}
void
+Handlers::doSetup(std::string const& key, setup_handler_t fn)
+{
+ fn(key);
+}
+
+void
Handlers::beginDict(std::string const& key,
- bare_arg_handler_t start_fn,
- bare_arg_handler_t end_fn)
+ bare_handler_t start_fn,
+ bare_handler_t end_fn)
{
auto new_jh = std::make_shared<JSONHandler>();
new_jh->addDictHandlers(
@@ -221,6 +198,314 @@ Handlers::handle(JSON& j)
}
void
+Handlers::beginInput()
+{
+ // nothing needed
+}
+
+void
+Handlers::endInput()
+{
+ // nothing needed
+}
+
+void
+Handlers::setupInputFileName(std::string const& key)
+{
+ addParameter(key, [this](char const* p) {
+ c_main->inputFile(p);
+ });
+}
+
+void
+Handlers::setupInputPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupInputEmpty(std::string const& key)
+{
+ addBare(key, [this]() {
+ c_main->emptyInput();
+ });
+}
+
+void
+Handlers::beginOutput()
+{
+ // nothing needed
+}
+
+void
+Handlers::endOutput()
+{
+ // nothing needed
+}
+
+void
+Handlers::setupOutputFileName(std::string const& key)
+{
+ addParameter(key, [this](char const* p) {
+ c_main->outputFile(p);
+ });
+}
+
+void
+Handlers::setupOutputReplaceInput(std::string const& key)
+{
+ addBare(key, [this]() {
+ c_main->replaceInput();
+ });
+}
+
+void
+Handlers::beginOutputOptions()
+{
+ // nothing needed
+}
+
+void
+Handlers::endOutputOptions()
+{
+ // nothing needed
+}
+
+void
+Handlers::beginOutputOptionsEncrypt()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endOutputOptionsEncrypt()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupOutputOptionsEncryptKeyLength(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupOutputOptionsEncryptUserPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupOutputOptionsEncryptOwnerPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginOutputOptionsEncrypt40Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endOutputOptionsEncrypt40Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginOutputOptionsEncrypt128Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endOutputOptionsEncrypt128Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginOutputOptionsEncrypt256Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endOutputOptionsEncrypt256Bit()
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginOptions()
+{
+ // nothing needed
+}
+
+void
+Handlers::endOptions()
+{
+ // nothing needed
+}
+
+void
+Handlers::beginInspect()
+{
+ // nothing needed
+}
+
+void
+Handlers::endInspect()
+{
+ // nothing needed
+}
+
+void
+Handlers::beginTransform()
+{
+ // nothing needed
+}
+
+void
+Handlers::endTransform()
+{
+ // nothing needed
+}
+
+void
+Handlers::beginModify()
+{
+ // nothing needed
+}
+
+void
+Handlers::endModify()
+{
+ // nothing needed
+}
+
+void
+Handlers::beginModifyAddAttachment()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endModifyAddAttachment()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyAddAttachmentPath(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginModifyCopyAttachmentsFrom()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endModifyCopyAttachmentsFrom()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyCopyAttachmentsFromPath(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyCopyAttachmentsFromPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginModifyPages()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endModifyPages()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyPagesFile(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyPagesPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyPagesRange(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginModifyOverlay()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endModifyOverlay()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyOverlayFile(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyOverlayPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::beginModifyUnderlay()
+{
+ // QXXXQ
+}
+
+void
+Handlers::endModifyUnderlay()
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyUnderlayFile(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
+Handlers::setupModifyUnderlayPassword(std::string const& key)
+{
+ // QXXXQ
+}
+
+void
QPDFJob::initializeFromJson(std::string const& json)
{
std::list<std::string> errors;
diff --git a/libqpdf/qpdf/auto_job_init.hh b/libqpdf/qpdf/auto_job_init.hh
index b6750f43..79fdc6d3 100644
--- a/libqpdf/qpdf/auto_job_init.hh
+++ b/libqpdf/qpdf/auto_job_init.hh
@@ -10,16 +10,16 @@ auto p = [this](void (ArgParser::*f)(char *)) {
return QPDFArgParser::bindParam(f, this);
};
-char const* yn_choices[] = {"y", "n", 0};
-char const* password_mode_choices[] = {"bytes", "hex-bytes", "unicode", "auto", 0};
-char const* stream_data_choices[] = {"compress", "preserve", "uncompress", 0};
-char const* decode_level_choices[] = {"none", "generalized", "specialized", "all", 0};
-char const* object_streams_choices[] = {"disable", "preserve", "generate", 0};
-char const* remove_unref_choices[] = {"auto", "yes", "no", 0};
-char const* flatten_choices[] = {"all", "print", "screen", 0};
-char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0};
-char const* print128_choices[] = {"full", "low", "none", 0};
-char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0};
+static char const* yn_choices[] = {"y", "n", 0};
+static char const* password_mode_choices[] = {"bytes", "hex-bytes", "unicode", "auto", 0};
+static char const* stream_data_choices[] = {"compress", "preserve", "uncompress", 0};
+static char const* decode_level_choices[] = {"none", "generalized", "specialized", "all", 0};
+static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0};
+static char const* remove_unref_choices[] = {"auto", "yes", "no", 0};
+static char const* flatten_choices[] = {"all", "print", "screen", 0};
+static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0};
+static char const* print128_choices[] = {"full", "low", "none", 0};
+static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0};
this->ap.selectHelpOptionTable();
this->ap.addBare("version", b(&ArgParser::argVersion));
diff --git a/libqpdf/qpdf/auto_job_json_decl.hh b/libqpdf/qpdf/auto_job_json_decl.hh
index d6cbecfe..817eff7c 100644
--- a/libqpdf/qpdf/auto_job_json_decl.hh
+++ b/libqpdf/qpdf/auto_job_json_decl.hh
@@ -3,3 +3,53 @@
// Edits will be automatically overwritten if the build is
// run in maintainer mode.
//
+void beginInput();
+void endInput();
+void setupInputFileName(std::string const&);
+void setupInputPassword(std::string const&);
+void setupInputEmpty(std::string const&);
+void beginOutput();
+void endOutput();
+void setupOutputFileName(std::string const&);
+void setupOutputReplaceInput(std::string const&);
+void beginOutputOptions();
+void endOutputOptions();
+void beginOutputOptionsEncrypt();
+void endOutputOptionsEncrypt();
+void setupOutputOptionsEncryptKeyLength(std::string const&);
+void setupOutputOptionsEncryptUserPassword(std::string const&);
+void setupOutputOptionsEncryptOwnerPassword(std::string const&);
+void beginOutputOptionsEncrypt40Bit();
+void endOutputOptionsEncrypt40Bit();
+void beginOutputOptionsEncrypt128Bit();
+void endOutputOptionsEncrypt128Bit();
+void beginOutputOptionsEncrypt256Bit();
+void endOutputOptionsEncrypt256Bit();
+void beginOptions();
+void endOptions();
+void beginInspect();
+void endInspect();
+void beginTransform();
+void endTransform();
+void beginModify();
+void endModify();
+void beginModifyAddAttachment();
+void endModifyAddAttachment();
+void setupModifyAddAttachmentPath(std::string const&);
+void beginModifyCopyAttachmentsFrom();
+void endModifyCopyAttachmentsFrom();
+void setupModifyCopyAttachmentsFromPath(std::string const&);
+void setupModifyCopyAttachmentsFromPassword(std::string const&);
+void beginModifyPages();
+void endModifyPages();
+void setupModifyPagesFile(std::string const&);
+void setupModifyPagesPassword(std::string const&);
+void setupModifyPagesRange(std::string const&);
+void beginModifyOverlay();
+void endModifyOverlay();
+void setupModifyOverlayFile(std::string const&);
+void setupModifyOverlayPassword(std::string const&);
+void beginModifyUnderlay();
+void endModifyUnderlay();
+void setupModifyUnderlayFile(std::string const&);
+void setupModifyUnderlayPassword(std::string const&);
diff --git a/libqpdf/qpdf/auto_job_json_init.hh b/libqpdf/qpdf/auto_job_json_init.hh
index d6cbecfe..2ffd2ee7 100644
--- a/libqpdf/qpdf/auto_job_json_init.hh
+++ b/libqpdf/qpdf/auto_job_json_init.hh
@@ -3,3 +3,174 @@
// Edits will be automatically overwritten if the build is
// run in maintainer mode.
//
+static char const* yn_choices[] = {"y", "n", 0};
+static char const* password_mode_choices[] = {"bytes", "hex-bytes", "unicode", "auto", 0};
+static char const* stream_data_choices[] = {"compress", "preserve", "uncompress", 0};
+static char const* decode_level_choices[] = {"none", "generalized", "specialized", "all", 0};
+static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0};
+static char const* remove_unref_choices[] = {"auto", "yes", "no", 0};
+static char const* flatten_choices[] = {"all", "print", "screen", 0};
+static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0};
+static char const* print128_choices[] = {"full", "low", "none", 0};
+static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0};
+
+beginDict("input", bindBare(&Handlers::beginInput), bindBare(&Handlers::endInput)); // .input
+doSetup("fileName", bindSetup(&Handlers::setupInputFileName));
+doSetup("password", bindSetup(&Handlers::setupInputPassword));
+addParameter("passwordFile", [this](char const* p) { c_main->passwordFile(p); });
+doSetup("empty", bindSetup(&Handlers::setupInputEmpty));
+endDict(); // .input
+beginDict("output", bindBare(&Handlers::beginOutput), bindBare(&Handlers::endOutput)); // .output
+doSetup("fileName", bindSetup(&Handlers::setupOutputFileName));
+doSetup("replaceInput", bindSetup(&Handlers::setupOutputReplaceInput));
+beginDict("options", bindBare(&Handlers::beginOutputOptions), bindBare(&Handlers::endOutputOptions)); // .output.options
+addBare("qdf", [this]() { c_main->qdf(); });
+addBare("preserveUnreferenced", [this]() { c_main->preserveUnreferenced(); });
+addBare("newlineBeforeEndstream", [this]() { c_main->newlineBeforeEndstream(); });
+addChoices("normalizeContent", yn_choices, [this](char const* p) { c_main->normalizeContent(p); });
+addChoices("streamData", stream_data_choices, [this](char const* p) { c_main->streamData(p); });
+addChoices("compressStreams", yn_choices, [this](char const* p) { c_main->compressStreams(p); });
+addBare("recompressFlate", [this]() { c_main->recompressFlate(); });
+addChoices("decodeLevel", decode_level_choices, [this](char const* p) { c_main->decodeLevel(p); });
+addBare("decrypt", [this]() { c_main->decrypt(); });
+addBare("staticAesIv", [this]() { c_main->staticAesIv(); });
+addBare("staticId", [this]() { c_main->staticId(); });
+addBare("noOriginalObjectIds", [this]() { c_main->noOriginalObjectIds(); });
+addParameter("copyEncryption", [this](char const* p) { c_main->copyEncryption(p); });
+addParameter("encryptionFilePassword", [this](char const* p) { c_main->encryptionFilePassword(p); });
+addBare("linearize", [this]() { c_main->linearize(); });
+addParameter("linearizePass1", [this](char const* p) { c_main->linearizePass1(p); });
+addChoices("objectStreams", object_streams_choices, [this](char const* p) { c_main->objectStreams(p); });
+addParameter("minVersion", [this](char const* p) { c_main->minVersion(p); });
+addParameter("forceVersion", [this](char const* p) { c_main->forceVersion(p); });
+addBare("progress", [this]() { c_main->progress(); });
+addParameter("splitPages", [this](char const* p) { c_main->splitPages(p); });
+beginDict("encrypt", bindBare(&Handlers::beginOutputOptionsEncrypt), bindBare(&Handlers::endOutputOptionsEncrypt)); // .output.options.encrypt
+doSetup("keyLength", bindSetup(&Handlers::setupOutputOptionsEncryptKeyLength));
+doSetup("userPassword", bindSetup(&Handlers::setupOutputOptionsEncryptUserPassword));
+doSetup("ownerPassword", bindSetup(&Handlers::setupOutputOptionsEncryptOwnerPassword));
+beginDict("40Bit", bindBare(&Handlers::beginOutputOptionsEncrypt40Bit), bindBare(&Handlers::endOutputOptionsEncrypt40Bit)); // .output.options.encrypt.40Bit
+addChoices("annotate", yn_choices, [this](char const* p) { c_enc->annotate(p); });
+addChoices("extract", yn_choices, [this](char const* p) { c_enc->extract(p); });
+addChoices("modify", modify128_choices, [this](char const* p) { c_enc->modify(p); });
+addChoices("print", print128_choices, [this](char const* p) { c_enc->print(p); });
+endDict(); // .output.options.encrypt.40Bit
+beginDict("128Bit", bindBare(&Handlers::beginOutputOptionsEncrypt128Bit), bindBare(&Handlers::endOutputOptionsEncrypt128Bit)); // .output.options.encrypt.128Bit
+addChoices("accessibility", yn_choices, [this](char const* p) { c_enc->accessibility(p); });
+addChoices("annotate", yn_choices, [this](char const* p) { c_enc->annotate(p); });
+addChoices("assemble", yn_choices, [this](char const* p) { c_enc->assemble(p); });
+addBare("cleartextMetadata", [this]() { c_enc->cleartextMetadata(); });
+addChoices("extract", yn_choices, [this](char const* p) { c_enc->extract(p); });
+addChoices("form", yn_choices, [this](char const* p) { c_enc->form(p); });
+addChoices("modifyOther", yn_choices, [this](char const* p) { c_enc->modifyOther(p); });
+addChoices("modify", modify128_choices, [this](char const* p) { c_enc->modify(p); });
+addChoices("print", print128_choices, [this](char const* p) { c_enc->print(p); });
+addBare("forceV4", [this]() { c_enc->forceV4(); });
+addChoices("useAes", yn_choices, [this](char const* p) { c_enc->useAes(p); });
+endDict(); // .output.options.encrypt.128Bit
+beginDict("256Bit", bindBare(&Handlers::beginOutputOptionsEncrypt256Bit), bindBare(&Handlers::endOutputOptionsEncrypt256Bit)); // .output.options.encrypt.256Bit
+addChoices("accessibility", yn_choices, [this](char const* p) { c_enc->accessibility(p); });
+addChoices("annotate", yn_choices, [this](char const* p) { c_enc->annotate(p); });
+addChoices("assemble", yn_choices, [this](char const* p) { c_enc->assemble(p); });
+addBare("cleartextMetadata", [this]() { c_enc->cleartextMetadata(); });
+addChoices("extract", yn_choices, [this](char const* p) { c_enc->extract(p); });
+addChoices("form", yn_choices, [this](char const* p) { c_enc->form(p); });
+addChoices("modifyOther", yn_choices, [this](char const* p) { c_enc->modifyOther(p); });
+addChoices("modify", modify128_choices, [this](char const* p) { c_enc->modify(p); });
+addChoices("print", print128_choices, [this](char const* p) { c_enc->print(p); });
+addBare("allowInsecure", [this]() { c_enc->allowInsecure(); });
+addBare("forceR5", [this]() { c_enc->forceR5(); });
+endDict(); // .output.options.encrypt.256Bit
+endDict(); // .output.options.encrypt
+endDict(); // .output.options
+endDict(); // .output
+beginDict("options", bindBare(&Handlers::beginOptions), bindBare(&Handlers::endOptions)); // .options
+addBare("allowWeakCrypto", [this]() { c_main->allowWeakCrypto(); });
+addBare("deterministicId", [this]() { c_main->deterministicId(); });
+addChoices("keepFilesOpen", yn_choices, [this](char const* p) { c_main->keepFilesOpen(p); });
+addParameter("keepFilesOpenThreshold", [this](char const* p) { c_main->keepFilesOpenThreshold(p); });
+addBare("noWarn", [this]() { c_main->noWarn(); });
+addBare("verbose", [this]() { c_main->verbose(); });
+addBare("warningExit0", [this]() { c_main->warningExit0(); });
+addBare("ignoreXrefStreams", [this]() { c_main->ignoreXrefStreams(); });
+addBare("passwordIsHexKey", [this]() { c_main->passwordIsHexKey(); });
+addChoices("passwordMode", password_mode_choices, [this](char const* p) { c_main->passwordMode(p); });
+addBare("suppressPasswordRecovery", [this]() { c_main->suppressPasswordRecovery(); });
+addBare("suppressRecovery", [this]() { c_main->suppressRecovery(); });
+endDict(); // .options
+beginDict("inspect", bindBare(&Handlers::beginInspect), bindBare(&Handlers::endInspect)); // .inspect
+addBare("check", [this]() { c_main->check(); });
+addBare("checkLinearization", [this]() { c_main->checkLinearization(); });
+addBare("filteredStreamData", [this]() { c_main->filteredStreamData(); });
+addBare("isEncrypted", [this]() { c_main->isEncrypted(); });
+addBare("rawStreamData", [this]() { c_main->rawStreamData(); });
+addBare("requiresPassword", [this]() { c_main->requiresPassword(); });
+addBare("showEncryption", [this]() { c_main->showEncryption(); });
+addBare("showEncryptionKey", [this]() { c_main->showEncryptionKey(); });
+addBare("showLinearization", [this]() { c_main->showLinearization(); });
+addBare("showNpages", [this]() { c_main->showNpages(); });
+addParameter("showObject", [this](char const* p) { c_main->showObject(p); });
+addBare("showPages", [this]() { c_main->showPages(); });
+addBare("showXref", [this]() { c_main->showXref(); });
+addBare("withImages", [this]() { c_main->withImages(); });
+addBare("listAttachments", [this]() { c_main->listAttachments(); });
+addParameter("showAttachment", [this](char const* p) { c_main->showAttachment(p); });
+addBare("json", [this]() { c_main->json(); });
+addChoices("jsonKey", json_key_choices, [this](char const* p) { c_main->jsonKey(p); });
+addParameter("jsonObject", [this](char const* p) { c_main->jsonObject(p); });
+endDict(); // .inspect
+beginDict("transform", bindBare(&Handlers::beginTransform), bindBare(&Handlers::endTransform)); // .transform
+addBare("coalesceContents", [this]() { c_main->coalesceContents(); });
+addParameter("compressionLevel", [this](char const* p) { c_main->compressionLevel(p); });
+addBare("externalizeInlineImages", [this]() { c_main->externalizeInlineImages(); });
+addParameter("iiMinBytes", [this](char const* p) { c_main->iiMinBytes(p); });
+addChoices("removeUnreferencedResources", remove_unref_choices, [this](char const* p) { c_main->removeUnreferencedResources(p); });
+endDict(); // .transform
+beginDict("modify", bindBare(&Handlers::beginModify), bindBare(&Handlers::endModify)); // .modify
+beginDict("addAttachment", bindBare(&Handlers::beginModifyAddAttachment), bindBare(&Handlers::endModifyAddAttachment)); // .modify.addAttachment
+doSetup("path", bindSetup(&Handlers::setupModifyAddAttachmentPath));
+addParameter("creationdate", [this](char const* p) { c_att->creationdate(p); });
+addParameter("description", [this](char const* p) { c_att->description(p); });
+addParameter("filename", [this](char const* p) { c_att->filename(p); });
+addParameter("key", [this](char const* p) { c_att->key(p); });
+addParameter("mimetype", [this](char const* p) { c_att->mimetype(p); });
+addParameter("moddate", [this](char const* p) { c_att->moddate(p); });
+addBare("replace", [this]() { c_att->replace(); });
+endDict(); // .modify.addAttachment
+addParameter("removeAttachment", [this](char const* p) { c_main->removeAttachment(p); });
+beginDict("copyAttachmentsFrom", bindBare(&Handlers::beginModifyCopyAttachmentsFrom), bindBare(&Handlers::endModifyCopyAttachmentsFrom)); // .modify.copyAttachmentsFrom
+doSetup("path", bindSetup(&Handlers::setupModifyCopyAttachmentsFromPath));
+doSetup("password", bindSetup(&Handlers::setupModifyCopyAttachmentsFromPassword));
+addParameter("prefix", [this](char const* p) { c_copy_att->prefix(p); });
+endDict(); // .modify.copyAttachmentsFrom
+addParameter("collate", [this](char const* p) { c_main->collate(p); });
+addChoices("flattenAnnotations", flatten_choices, [this](char const* p) { c_main->flattenAnnotations(p); });
+addBare("flattenRotation", [this]() { c_main->flattenRotation(); });
+addBare("generateAppearances", [this]() { c_main->generateAppearances(); });
+addBare("keepInlineImages", [this]() { c_main->keepInlineImages(); });
+addParameter("oiMinArea", [this](char const* p) { c_main->oiMinArea(p); });
+addParameter("oiMinHeight", [this](char const* p) { c_main->oiMinHeight(p); });
+addParameter("oiMinWidth", [this](char const* p) { c_main->oiMinWidth(p); });
+addBare("optimizeImages", [this]() { c_main->optimizeImages(); });
+beginDict("pages", bindBare(&Handlers::beginModifyPages), bindBare(&Handlers::endModifyPages)); // .modify.pages
+doSetup("file", bindSetup(&Handlers::setupModifyPagesFile));
+doSetup("password", bindSetup(&Handlers::setupModifyPagesPassword));
+doSetup("range", bindSetup(&Handlers::setupModifyPagesRange));
+endDict(); // .modify.pages
+addBare("removePageLabels", [this]() { c_main->removePageLabels(); });
+addParameter("rotate", [this](char const* p) { c_main->rotate(p); });
+beginDict("overlay", bindBare(&Handlers::beginModifyOverlay), bindBare(&Handlers::endModifyOverlay)); // .modify.overlay
+doSetup("file", bindSetup(&Handlers::setupModifyOverlayFile));
+doSetup("password", bindSetup(&Handlers::setupModifyOverlayPassword));
+addParameter("from", [this](char const* p) { c_uo->from(p); });
+addParameter("repeat", [this](char const* p) { c_uo->repeat(p); });
+addParameter("to", [this](char const* p) { c_uo->to(p); });
+endDict(); // .modify.overlay
+beginDict("underlay", bindBare(&Handlers::beginModifyUnderlay), bindBare(&Handlers::endModifyUnderlay)); // .modify.underlay
+doSetup("file", bindSetup(&Handlers::setupModifyUnderlayFile));
+doSetup("password", bindSetup(&Handlers::setupModifyUnderlayPassword));
+addParameter("from", [this](char const* p) { c_uo->from(p); });
+addParameter("repeat", [this](char const* p) { c_uo->repeat(p); });
+addParameter("to", [this](char const* p) { c_uo->to(p); });
+endDict(); // .modify.underlay
+endDict(); // .modify
diff --git a/libqpdf/qpdf/auto_job_schema.hh b/libqpdf/qpdf/auto_job_schema.hh
index 53356d66..968a6754 100644
--- a/libqpdf/qpdf/auto_job_schema.hh
+++ b/libqpdf/qpdf/auto_job_schema.hh
@@ -1,17 +1,13 @@
static constexpr char const* JOB_SCHEMA_DATA = R"({
"input": {
- "file": {
- "name": "input filename",
- "password": "specify password",
- "passwordFile": "read password from a file"
- },
- "empty": "qxxxq empty"
+ "fileName": "input filename",
+ "password": "specify password",
+ "passwordFile": "read password from a file",
+ "empty": "empty input file"
},
"output": {
- "file": {
- "name": "output filename"
- },
- "replaceInput": "qxxxq replace input",
+ "fileName": "output filename",
+ "replaceInput": "set to true to replace input",
"options": {
"qdf": "enable viewing PDF code in a text editor",
"preserveUnreferenced": "preserve unreferenced objects",