Commit bb96499b613265b3d9cf2146af09283a4b99ef13
1 parent
0e3d4cdc
Update docs and prepare QPDF::writeJSON for changes
Add additional parameters that will be needed to call QPDF::writeJSON in partial mode.
Showing
8 changed files
with
77 additions
and
55 deletions
TODO
| @@ -69,24 +69,9 @@ Soon: Break ground on "Document-level work" | @@ -69,24 +69,9 @@ Soon: Break ground on "Document-level work" | ||
| 69 | JSON v2 fixes | 69 | JSON v2 fixes |
| 70 | ============= | 70 | ============= |
| 71 | 71 | ||
| 72 | -* Get rid of separate format for --json and --json-output. Instead, | ||
| 73 | - --json-output can just require an outfile and change some defaults | ||
| 74 | - like which keys are present and json-stream-data. This makes it | ||
| 75 | - easier to support use cases like being able to use information in | ||
| 76 | - other top-level keys ("pages", "attachments", etc.) to drive | ||
| 77 | - modifications made to objects without having to run qpdf twice. I | ||
| 78 | - think --json-output should make the default key be only "qpdf" and | ||
| 79 | - the default json-stream-data mode be inline, but make it so you can | ||
| 80 | - use --json-stream-data and --json-stream-prefix with --json and | ||
| 81 | - --json-keys with --json-output. These would be exactly the same: | ||
| 82 | - | ||
| 83 | - --json-output --json-keys=all - | ||
| 84 | - --json --json-stream-data=inline | ||
| 85 | - | ||
| 86 | - And these: | ||
| 87 | - | ||
| 88 | - --json-output - | ||
| 89 | - --json --json-stream-data=inline --json-key=qpdf | 72 | +* Unify code between QPDFJob::doJSONObjects and QPDF::writeJSON. Make |
| 73 | + sure that the "qpdf" key is always present when json-output is | ||
| 74 | + specified. | ||
| 90 | 75 | ||
| 91 | * Change the name of the "qpdf-v2" key to "qpdf". Use that in place of | 76 | * Change the name of the "qpdf-v2" key to "qpdf". Use that in place of |
| 92 | "objects" and change its content to a two-element array whose first | 77 | "objects" and change its content to a two-element array whose first |
| @@ -114,9 +99,10 @@ JSON v2 fixes | @@ -114,9 +99,10 @@ JSON v2 fixes | ||
| 114 | 99 | ||
| 115 | This implies a few things: | 100 | This implies a few things: |
| 116 | 101 | ||
| 117 | - * QPDF::writeJSON will have to take an argument indicating whether | ||
| 118 | - additional keys are being written which determines whether it | ||
| 119 | - outputs the outer braces or not. | 102 | + * Fix --json-help |
| 103 | + | ||
| 104 | + * --json-key=objects is only valid for v1. --json-key=qpdf is only | ||
| 105 | + valid for v2. | ||
| 120 | 106 | ||
| 121 | * This changes the policy about additional extra keys. Have a | 107 | * This changes the policy about additional extra keys. Have a |
| 122 | guarantee that qpdf will never add a key whose name is or starts | 108 | guarantee that qpdf will never add a key whose name is or starts |
include/qpdf/QPDF.hh
| @@ -134,8 +134,17 @@ class QPDF | @@ -134,8 +134,17 @@ class QPDF | ||
| 134 | void updateFromJSON(std::shared_ptr<InputSource>); | 134 | void updateFromJSON(std::shared_ptr<InputSource>); |
| 135 | 135 | ||
| 136 | // Write qpdf json format to the pipeline "p". The only supported | 136 | // Write qpdf json format to the pipeline "p". The only supported |
| 137 | - // version is 2. The finish() method is called on the pipeline at | ||
| 138 | - // the end. The decode_level parameter controls which streams are | 137 | + // version is 2. |
| 138 | + // | ||
| 139 | + // If the value of "complete" is true, a complete JSON object | ||
| 140 | + // containing only the "qpdf" key is written to the pipeline, and | ||
| 141 | + // finish() is called on the pipeline at the end. If the value of | ||
| 142 | + // "complete" is false, the "qpdf" key and its value are written | ||
| 143 | + // to the pipeline assuming that a dictionary is already open, and | ||
| 144 | + // finish() is not called. The parameter first_key indicates | ||
| 145 | + // whether this is the first key if in-progress dictionary. | ||
| 146 | + // | ||
| 147 | + // The decode_level parameter controls which streams are | ||
| 139 | // uncompressed in the JSON. Use qpdf_dl_none to preserve all | 148 | // uncompressed in the JSON. Use qpdf_dl_none to preserve all |
| 140 | // stream data exactly as it appears in the input. The possible | 149 | // stream data exactly as it appears in the input. The possible |
| 141 | // values for json_stream_data can be found in qpdf/Constants.h | 150 | // values for json_stream_data can be found in qpdf/Constants.h |
| @@ -158,6 +167,8 @@ class QPDF | @@ -158,6 +167,8 @@ class QPDF | ||
| 158 | void writeJSON( | 167 | void writeJSON( |
| 159 | int version, | 168 | int version, |
| 160 | Pipeline* p, | 169 | Pipeline* p, |
| 170 | + bool complete, | ||
| 171 | + bool first_key, | ||
| 161 | qpdf_stream_decode_level_e decode_level, | 172 | qpdf_stream_decode_level_e decode_level, |
| 162 | qpdf_json_stream_data_e json_stream_data, | 173 | qpdf_json_stream_data_e json_stream_data, |
| 163 | std::string const& file_prefix, | 174 | std::string const& file_prefix, |
job.sums
| @@ -8,10 +8,10 @@ include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c | @@ -8,10 +8,10 @@ include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c | ||
| 8 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 | 8 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 |
| 9 | job.yml 3b2b3c6f92b48f6c76109711cbfdd74669fa31a80cd17379548b09f8e76be05d | 9 | job.yml 3b2b3c6f92b48f6c76109711cbfdd74669fa31a80cd17379548b09f8e76be05d |
| 10 | libqpdf/qpdf/auto_job_decl.hh 74df4d7fdbdf51ecd0d58ce1e9844bb5525b9adac5a45f7c9a787ecdda2868df | 10 | libqpdf/qpdf/auto_job_decl.hh 74df4d7fdbdf51ecd0d58ce1e9844bb5525b9adac5a45f7c9a787ecdda2868df |
| 11 | -libqpdf/qpdf/auto_job_help.hh 3aaae4cde004e5314d3ac6d554da575e40209c0f0611f6a308957986f9c7967b | 11 | +libqpdf/qpdf/auto_job_help.hh db2e4350c700e064b204e3e20d4fee4eddfe312b28092afcf608b4b6863d30e5 |
| 12 | libqpdf/qpdf/auto_job_init.hh 7ea8e0641dc26fdfba6e283e14dbbff0c016654e174cdace8054f8bef53750fd | 12 | libqpdf/qpdf/auto_job_init.hh 7ea8e0641dc26fdfba6e283e14dbbff0c016654e174cdace8054f8bef53750fd |
| 13 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 | 13 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 |
| 14 | libqpdf/qpdf/auto_job_json_init.hh 5f6b53e3c81d4b54ce5c4cf9c3f52d0c02f987c53bf8841c0280367bad23e335 | 14 | libqpdf/qpdf/auto_job_json_init.hh 5f6b53e3c81d4b54ce5c4cf9c3f52d0c02f987c53bf8841c0280367bad23e335 |
| 15 | libqpdf/qpdf/auto_job_schema.hh 9d543cd4a43eafffc2c4b8a6fee29e399c271c52cb6f7d417ae5497b3c1127dc | 15 | libqpdf/qpdf/auto_job_schema.hh 9d543cd4a43eafffc2c4b8a6fee29e399c271c52cb6f7d417ae5497b3c1127dc |
| 16 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 | 16 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 |
| 17 | -manual/cli.rst ad8b234c24569e41c7929f729bb2188f86cd94b8fea5905b71802673cec92eed | 17 | +manual/cli.rst 8e1f443c6fa000e023e516c318df4d04d58233d4d8648907c4a71f0ea5722bca |
libqpdf/QPDFJob.cc
| @@ -3381,6 +3381,8 @@ QPDFJob::writeJSON(QPDF& pdf) | @@ -3381,6 +3381,8 @@ QPDFJob::writeJSON(QPDF& pdf) | ||
| 3381 | pdf.writeJSON( | 3381 | pdf.writeJSON( |
| 3382 | this->m->json_output, | 3382 | this->m->json_output, |
| 3383 | fp.get(), | 3383 | fp.get(), |
| 3384 | + true, | ||
| 3385 | + true, | ||
| 3384 | this->m->decode_level, | 3386 | this->m->decode_level, |
| 3385 | this->m->json_stream_data, | 3387 | this->m->json_stream_data, |
| 3386 | file_prefix, | 3388 | file_prefix, |
libqpdf/QPDFJob_config.cc
| @@ -312,6 +312,9 @@ QPDFJob::Config::jsonOutput(std::string const& parameter) | @@ -312,6 +312,9 @@ QPDFJob::Config::jsonOutput(std::string const& parameter) | ||
| 312 | if (!o.m->decode_level_set) { | 312 | if (!o.m->decode_level_set) { |
| 313 | o.m->decode_level = qpdf_dl_none; | 313 | o.m->decode_level = qpdf_dl_none; |
| 314 | } | 314 | } |
| 315 | + if (o.m->json_keys.empty()) { | ||
| 316 | + o.m->json_keys.insert("qpdf"); | ||
| 317 | + } | ||
| 315 | return this; | 318 | return this; |
| 316 | } | 319 | } |
| 317 | 320 |
libqpdf/QPDF_json.cc
| @@ -764,6 +764,8 @@ void | @@ -764,6 +764,8 @@ void | ||
| 764 | QPDF::writeJSON( | 764 | QPDF::writeJSON( |
| 765 | int version, | 765 | int version, |
| 766 | Pipeline* p, | 766 | Pipeline* p, |
| 767 | + bool complete, | ||
| 768 | + bool first_key, | ||
| 767 | qpdf_stream_decode_level_e decode_level, | 769 | qpdf_stream_decode_level_e decode_level, |
| 768 | qpdf_json_stream_data_e json_stream_data, | 770 | qpdf_json_stream_data_e json_stream_data, |
| 769 | std::string const& file_prefix, | 771 | std::string const& file_prefix, |
| @@ -818,7 +820,9 @@ QPDF::writeJSON( | @@ -818,7 +820,9 @@ QPDF::writeJSON( | ||
| 818 | } | 820 | } |
| 819 | JSON::writeDictionaryClose(p, first_object, 2); | 821 | JSON::writeDictionaryClose(p, first_object, 2); |
| 820 | JSON::writeDictionaryClose(p, first_qpdf, 1); | 822 | JSON::writeDictionaryClose(p, first_qpdf, 1); |
| 821 | - JSON::writeDictionaryClose(p, first, 0); | ||
| 822 | - *p << "\n"; | ||
| 823 | - p->finish(); | 823 | + if (complete) { |
| 824 | + JSON::writeDictionaryClose(p, first, 0); | ||
| 825 | + *p << "\n"; | ||
| 826 | + p->finish(); | ||
| 827 | + } | ||
| 824 | } | 828 | } |
libqpdf/qpdf/auto_job_help.hh
| @@ -821,16 +821,18 @@ objects will be shown. | @@ -821,16 +821,18 @@ objects will be shown. | ||
| 821 | )"); | 821 | )"); |
| 822 | ap.addOptionHelp("--json-stream-data", "json", "how to handle streams in json output", R"(--json-stream-data={none|inline|file} | 822 | ap.addOptionHelp("--json-stream-data", "json", "how to handle streams in json output", R"(--json-stream-data={none|inline|file} |
| 823 | 823 | ||
| 824 | -When used with --json-output, this option controls whether | ||
| 825 | -streams in json output should be omitted, written inline | ||
| 826 | -(base64-encoded) or written to a file. If "file" is chosen, the | ||
| 827 | -file will be the name of the output file appended with -nnn where | ||
| 828 | -nnn is the object number. The prefix can be overridden with | ||
| 829 | ---json-stream-prefix. | 824 | +When used with --json, this option controls whether streams in |
| 825 | +json output should be omitted, written inline (base64-encoded) | ||
| 826 | +or written to a file. If "file" is chosen, the file will be the | ||
| 827 | +name of the output file appended with -nnn where nnn is the | ||
| 828 | +object number. The prefix can be overridden with | ||
| 829 | +--json-stream-prefix. The default is "none", except | ||
| 830 | +when --json-output is specified, in which case the default is | ||
| 831 | +"inline". | ||
| 830 | )"); | 832 | )"); |
| 831 | ap.addOptionHelp("--json-stream-prefix", "json", "prefix for json stream data files", R"(--json-stream-prefix=file-prefix | 833 | ap.addOptionHelp("--json-stream-prefix", "json", "prefix for json stream data files", R"(--json-stream-prefix=file-prefix |
| 832 | 834 | ||
| 833 | -When used with --json-output, --json-stream-data=file-prefix | 835 | +When used with --json-stream-data=file, --json-stream-data=file-prefix |
| 834 | sets the prefix for stream data files, overriding the default, | 836 | sets the prefix for stream data files, overriding the default, |
| 835 | which is to use the output file name. Whatever is given here | 837 | which is to use the output file name. Whatever is given here |
| 836 | will be appended with -nnn to create the name of the file that | 838 | will be appended with -nnn to create the name of the file that |
manual/cli.rst
| @@ -3220,7 +3220,9 @@ Related Options | @@ -3220,7 +3220,9 @@ Related Options | ||
| 3220 | This option is repeatable. If given, only the specified top-level | 3220 | This option is repeatable. If given, only the specified top-level |
| 3221 | keys will be included in the JSON output. Otherwise, all keys will | 3221 | keys will be included in the JSON output. Otherwise, all keys will |
| 3222 | be included. ``version`` and ``parameters`` will always appear in | 3222 | be included. ``version`` and ``parameters`` will always appear in |
| 3223 | - the output. | 3223 | + the output. If not given, all keys will be included, unless |
| 3224 | + :qpdf:ref:`--json-output` was specified, in which case, only the | ||
| 3225 | + ``"qpdf"`` key will be included by default. | ||
| 3224 | 3226 | ||
| 3225 | .. qpdf:option:: --json-object={trailer|obj[,gen]} | 3227 | .. qpdf:option:: --json-object={trailer|obj[,gen]} |
| 3226 | 3228 | ||
| @@ -3241,39 +3243,41 @@ Related Options | @@ -3241,39 +3243,41 @@ Related Options | ||
| 3241 | 3243 | ||
| 3242 | .. help: how to handle streams in json output | 3244 | .. help: how to handle streams in json output |
| 3243 | 3245 | ||
| 3244 | - When used with --json-output, this option controls whether | ||
| 3245 | - streams in json output should be omitted, written inline | ||
| 3246 | - (base64-encoded) or written to a file. If "file" is chosen, the | ||
| 3247 | - file will be the name of the output file appended with -nnn where | ||
| 3248 | - nnn is the object number. The prefix can be overridden with | ||
| 3249 | - --json-stream-prefix. | 3246 | + When used with --json, this option controls whether streams in |
| 3247 | + json output should be omitted, written inline (base64-encoded) | ||
| 3248 | + or written to a file. If "file" is chosen, the file will be the | ||
| 3249 | + name of the output file appended with -nnn where nnn is the | ||
| 3250 | + object number. The prefix can be overridden with | ||
| 3251 | + --json-stream-prefix. The default is "none", except | ||
| 3252 | + when --json-output is specified, in which case the default is | ||
| 3253 | + "inline". | ||
| 3250 | 3254 | ||
| 3251 | - When used with :qpdf:ref:`--json-output`, this option controls | 3255 | + When used with :qpdf:ref:`--json`, this option controls |
| 3252 | whether streams in JSON output should be omitted, written inline | 3256 | whether streams in JSON output should be omitted, written inline |
| 3253 | (base64-encoded) or written to a file. If ``file`` is chosen, the | 3257 | (base64-encoded) or written to a file. If ``file`` is chosen, the |
| 3254 | file will be the name of the output file appended with | 3258 | file will be the name of the output file appended with |
| 3255 | :samp:`-{nnn}` where :samp:`{nnn}` is the object number. The stream | 3259 | :samp:`-{nnn}` where :samp:`{nnn}` is the object number. The stream |
| 3256 | data file prefix can be overridden with | 3260 | data file prefix can be overridden with |
| 3257 | - :qpdf:ref:`--json-stream-prefix`. This option only applies when | ||
| 3258 | - used with :qpdf:ref:`--json-output`. | 3261 | + :qpdf:ref:`--json-stream-prefix`. The default value is ``none``, |
| 3262 | + except when :qpdf:ref:`--json-output` is specified, in which case | ||
| 3263 | + the default is ``inline``. | ||
| 3259 | 3264 | ||
| 3260 | .. qpdf:option:: --json-stream-prefix=file-prefix | 3265 | .. qpdf:option:: --json-stream-prefix=file-prefix |
| 3261 | 3266 | ||
| 3262 | .. help: prefix for json stream data files | 3267 | .. help: prefix for json stream data files |
| 3263 | 3268 | ||
| 3264 | - When used with --json-output, --json-stream-data=file-prefix | 3269 | + When used with --json-stream-data=file, --json-stream-data=file-prefix |
| 3265 | sets the prefix for stream data files, overriding the default, | 3270 | sets the prefix for stream data files, overriding the default, |
| 3266 | which is to use the output file name. Whatever is given here | 3271 | which is to use the output file name. Whatever is given here |
| 3267 | will be appended with -nnn to create the name of the file that | 3272 | will be appended with -nnn to create the name of the file that |
| 3268 | will contain the data for the stream stream in object nnn. | 3273 | will contain the data for the stream stream in object nnn. |
| 3269 | 3274 | ||
| 3270 | - When used with :qpdf:ref:`--json-output`, | 3275 | + When used with ``--json-stream-data=file``, |
| 3271 | ``--json-stream-data=file-prefix`` sets the prefix for stream data | 3276 | ``--json-stream-data=file-prefix`` sets the prefix for stream data |
| 3272 | files, overriding the default, which is to use the output file | 3277 | files, overriding the default, which is to use the output file |
| 3273 | name. Whatever is given here will be appended with :samp:`-{nnn}` | 3278 | name. Whatever is given here will be appended with :samp:`-{nnn}` |
| 3274 | to create the name of the file that will contain the data for the | 3279 | to create the name of the file that will contain the data for the |
| 3275 | - stream stream in object :samp:`{nnn}`. This option only applies | ||
| 3276 | - when used with :qpdf:ref:`--json-output`. | 3280 | + stream stream in object :samp:`{nnn}`. |
| 3277 | 3281 | ||
| 3278 | .. qpdf:option:: --json-output[=version] | 3282 | .. qpdf:option:: --json-output[=version] |
| 3279 | 3283 | ||
| @@ -3288,12 +3292,22 @@ Related Options | @@ -3288,12 +3292,22 @@ Related Options | ||
| 3288 | in qpdf JSON format at the given version. ``version`` may be a | 3292 | in qpdf JSON format at the given version. ``version`` may be a |
| 3289 | specific version or ``latest`` (the default). The only supported | 3293 | specific version or ``latest`` (the default). The only supported |
| 3290 | version is 2. See also :qpdf:ref:`--json-stream-data` and | 3294 | version is 2. See also :qpdf:ref:`--json-stream-data` and |
| 3291 | - :qpdf:ref:`--json-stream-prefix`. When this option is specified, | ||
| 3292 | - the default decode level for stream data is ``none``, but you can | ||
| 3293 | - override it with :qpdf:ref:`--decode-level`. If you want to look at | ||
| 3294 | - the contents of streams easily as you would in QDF mode (see | ||
| 3295 | - :ref:`qdf`), you can use ``--decode-level=generalized`` and | ||
| 3296 | - ``--json-stream-data=file`` for a convenient way to do that. | 3295 | + :qpdf:ref:`--json-stream-prefix`. This option also changes the |
| 3296 | + following defaults: | ||
| 3297 | + | ||
| 3298 | + - The default value for :qpdf:ref:`--json-stream-data` changes from | ||
| 3299 | + ``none`` to ``inline``. | ||
| 3300 | + | ||
| 3301 | + - The default decode level for stream data becomes ``none``, but you can | ||
| 3302 | + override it with :qpdf:ref:`--decode-level`. | ||
| 3303 | + | ||
| 3304 | + - Only the ``"qpdf"`` key is included in the JSON output, but you | ||
| 3305 | + can add additional keys with :qpdf:ref:`--json-key`. | ||
| 3306 | + | ||
| 3307 | + If you want to look at the contents of streams easily as you would | ||
| 3308 | + in QDF mode (see :ref:`qdf`), you can use | ||
| 3309 | + ``--decode-level=generalized`` and ``--json-stream-data=file`` for | ||
| 3310 | + a convenient way to do that. | ||
| 3297 | 3311 | ||
| 3298 | .. qpdf:option:: --json-input | 3312 | .. qpdf:option:: --json-input |
| 3299 | 3313 |