diff options
author | Jay Berkenbilt <ejb@ql.org> | 2022-05-07 19:33:45 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2022-05-08 19:45:20 +0200 |
commit | c76536dd9a150adb71fdcda11ee1a93f25128cc7 (patch) | |
tree | 03f68965ad1646f643d184b0435bd6706b42fcdc /libqpdf/qpdf | |
parent | bdfc4da5105c86f0dc63ed390da240306e6b4466 (diff) | |
download | qpdf-c76536dd9a150adb71fdcda11ee1a93f25128cc7.tar.zst |
Implement JSON v2 output
Diffstat (limited to 'libqpdf/qpdf')
-rw-r--r-- | libqpdf/qpdf/QPDF_Stream.hh | 2 | ||||
-rw-r--r-- | libqpdf/qpdf/auto_job_help.hh | 21 | ||||
-rw-r--r-- | libqpdf/qpdf/auto_job_init.hh | 5 | ||||
-rw-r--r-- | libqpdf/qpdf/auto_job_json_init.hh | 9 | ||||
-rw-r--r-- | libqpdf/qpdf/auto_job_schema.hh | 2 |
5 files changed, 33 insertions, 6 deletions
diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index fcf98ffa..51b215e2 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -63,7 +63,7 @@ class QPDF_Stream: public QPDFObject addTokenFilter(std::shared_ptr<QPDFObjectHandle::TokenFilter> token_filter); JSON getStreamJSON( int json_version, - qpdf_stream_data_json_e json_data, + qpdf_json_stream_data_e json_data, qpdf_stream_decode_level_e decode_level, Pipeline* p, std::string const& data_filename); diff --git a/libqpdf/qpdf/auto_job_help.hh b/libqpdf/qpdf/auto_job_help.hh index 55d2cc63..47210371 100644 --- a/libqpdf/qpdf/auto_job_help.hh +++ b/libqpdf/qpdf/auto_job_help.hh @@ -817,6 +817,21 @@ objects will be shown. ap.addOptionHelp("--job-json-help", "json", "show format of job JSON", R"(Describe the format of the QPDFJob JSON input used by --job-json-file. )"); +ap.addOptionHelp("--json-stream-data", "json", "how to handle streams in json output", R"(--json-stream-data={none|inline|file} + +Control whether streams in json output should be omitted, +written inline (base64-encoded) or written to a file. If "file" +is chosen, the file will be the name of the input file appended +with -nnn where nnn is the object number. The prefix can be +overridden with --json-stream-prefix. +)"); +ap.addOptionHelp("--json-stream-prefix", "json", "prefix for json stream data files", R"(--json-stream-prefix=file-prefix + +When --json-stream-data=file is given, override the input file +name as the prefix for stream data files. Whatever is given here +will be appended with -nnn to create the name of the file that +will contain the data for the stream stream in object nnn. +)"); ap.addHelpTopic("testing", "options for testing or debugging", R"(The options below are useful when writing automated test code that includes files created by qpdf or when testing qpdf itself. )"); @@ -829,6 +844,9 @@ for testing only so that output files can be reproducible. Never use it for production files. This option is not secure since it significantly weakens the encryption. )"); +} +static void add_help_8(QPDFArgParser& ap) +{ ap.addOptionHelp("--linearize-pass1", "testing", "save pass 1 of linearization", R"(--linearize-pass1=file Write the first pass of linearization to the named file. The @@ -839,9 +857,6 @@ ap.addOptionHelp("--test-json-schema", "testing", "test generated json against s the output of qpdf --json and the output of qpdf --json-help. )"); } -static void add_help_8(QPDFArgParser& ap) -{ -} static void add_help(QPDFArgParser& ap) { add_help_1(ap); diff --git a/libqpdf/qpdf/auto_job_init.hh b/libqpdf/qpdf/auto_job_init.hh index b3191d4d..5c13275c 100644 --- a/libqpdf/qpdf/auto_job_init.hh +++ b/libqpdf/qpdf/auto_job_init.hh @@ -20,7 +20,8 @@ static char const* object_streams_choices[] = {"disable", "preserve", "generate" static char const* remove_unref_choices[] = {"auto", "yes", "no", 0}; static char const* flatten_choices[] = {"all", "print", "screen", 0}; static char const* json_version_choices[] = {"1", "2", "latest", 0}; -static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0}; +static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", "qpdf", 0}; +static char const* json_stream_data_choices[] = {"none", "inline", "file", 0}; static char const* print128_choices[] = {"full", "low", "none", 0}; static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0}; @@ -101,6 +102,7 @@ this->ap.addRequiredParameter("remove-attachment", [this](std::string const& x){ this->ap.addRequiredParameter("rotate", [this](std::string const& x){c_main->rotate(x);}, "[+|-]angle"); this->ap.addRequiredParameter("show-attachment", [this](std::string const& x){c_main->showAttachment(x);}, "attachment"); this->ap.addRequiredParameter("show-object", [this](std::string const& x){c_main->showObject(x);}, "trailer"); +this->ap.addRequiredParameter("json-stream-prefix", [this](std::string const& x){c_main->jsonStreamPrefix(x);}, "stream-file-prefix"); this->ap.addOptionalParameter("collate", [this](std::string const& x){c_main->collate(x);}); this->ap.addOptionalParameter("split-pages", [this](std::string const& x){c_main->splitPages(x);}); this->ap.addChoices("compress-streams", [this](std::string const& x){c_main->compressStreams(x);}, true, yn_choices); @@ -113,6 +115,7 @@ this->ap.addChoices("object-streams", [this](std::string const& x){c_main->objec this->ap.addChoices("password-mode", [this](std::string const& x){c_main->passwordMode(x);}, true, password_mode_choices); this->ap.addChoices("remove-unreferenced-resources", [this](std::string const& x){c_main->removeUnreferencedResources(x);}, true, remove_unref_choices); this->ap.addChoices("stream-data", [this](std::string const& x){c_main->streamData(x);}, true, stream_data_choices); +this->ap.addChoices("json-stream-data", [this](std::string const& x){c_main->jsonStreamData(x);}, true, json_stream_data_choices); this->ap.addChoices("json", [this](std::string const& x){c_main->json(x);}, false, json_version_choices); this->ap.registerOptionTable("pages", b(&ArgParser::argEndPages)); this->ap.addPositional(p(&ArgParser::argPagesPositional)); diff --git a/libqpdf/qpdf/auto_job_json_init.hh b/libqpdf/qpdf/auto_job_json_init.hh index 92c4d65c..c73eb3a7 100644 --- a/libqpdf/qpdf/auto_job_json_init.hh +++ b/libqpdf/qpdf/auto_job_json_init.hh @@ -13,7 +13,8 @@ static char const* object_streams_choices[] = {"disable", "preserve", "generate" static char const* remove_unref_choices[] = {"auto", "yes", "no", 0}; static char const* flatten_choices[] = {"all", "print", "screen", 0}; static char const* json_version_choices[] = {"1", "2", "latest", 0}; -static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0}; +static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", "qpdf", 0}; +static char const* json_stream_data_choices[] = {"none", "inline", "file", 0}; static char const* print128_choices[] = {"full", "low", "none", 0}; static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0}; @@ -252,6 +253,12 @@ beginArray(bindJSON(&Handlers::beginJsonObjectArray), bindBare(&Handlers::endJso addParameter([this](std::string const& p) { c_main->jsonObject(p); }); popHandler(); // array: .jsonObject[] popHandler(); // key: jsonObject +pushKey("jsonStreamData"); +addChoices(json_stream_data_choices, true, [this](std::string const& p) { c_main->jsonStreamData(p); }); +popHandler(); // key: jsonStreamData +pushKey("jsonStreamPrefix"); +addParameter([this](std::string const& p) { c_main->jsonStreamPrefix(p); }); +popHandler(); // key: jsonStreamPrefix pushKey("allowWeakCrypto"); addBare([this]() { c_main->allowWeakCrypto(); }); popHandler(); // key: allowWeakCrypto diff --git a/libqpdf/qpdf/auto_job_schema.hh b/libqpdf/qpdf/auto_job_schema.hh index 267dad23..c2310961 100644 --- a/libqpdf/qpdf/auto_job_schema.hh +++ b/libqpdf/qpdf/auto_job_schema.hh @@ -84,6 +84,8 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ "jsonObject": [ "limit which objects are in JSON" ], + "jsonStreamData": "how to handle streams in json output", + "jsonStreamPrefix": "prefix for json stream data files", "allowWeakCrypto": "allow insecure cryptographic algorithms", "keepFilesOpen": "manage keeping multiple files open", "keepFilesOpenThreshold": "set threshold for keepFilesOpen", |