Commit 47f33cec2582101485ed93d041d069118a62b5cf
1 parent
e3506253
QPDFJob: add test cases
Showing
51 changed files
with
802 additions
and
2 deletions
libqpdf/QPDFJob_json.cc
| ... | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 | #include <qpdf/JSONHandler.hh> |
| 3 | 3 | #include <qpdf/QPDFUsage.hh> |
| 4 | 4 | #include <qpdf/QUtil.hh> |
| 5 | +#include <qpdf/QTC.hh> | |
| 5 | 6 | |
| 6 | 7 | #include <memory> |
| 7 | 8 | #include <stdexcept> |
| ... | ... | @@ -108,6 +109,7 @@ Handlers::addBare(bare_handler_t fn) |
| 108 | 109 | jh->addBoolHandler([this, fn](std::string const& path, bool v){ |
| 109 | 110 | if (! v) |
| 110 | 111 | { |
| 112 | + QTC::TC("qpdf", "QPDFJob json bare not true"); | |
| 111 | 113 | usage(path + ": value must be true"); |
| 112 | 114 | } |
| 113 | 115 | else |
| ... | ... | @@ -140,12 +142,14 @@ Handlers::addChoices(char const** choices, |
| 140 | 142 | { |
| 141 | 143 | if (strcmp(*i, p) == 0) |
| 142 | 144 | { |
| 145 | + QTC::TC("qpdf", "QPDFJob json choice match"); | |
| 143 | 146 | matches = true; |
| 144 | 147 | break; |
| 145 | 148 | } |
| 146 | 149 | } |
| 147 | 150 | if (! matches) |
| 148 | 151 | { |
| 152 | + QTC::TC("qpdf", "QPDFJob json choice mismatch"); | |
| 149 | 153 | std::ostringstream msg; |
| 150 | 154 | msg << path + ": unexpected value; expected one of "; |
| 151 | 155 | bool first = true; |
| ... | ... | @@ -307,6 +311,7 @@ Handlers::beginOutputOptionsEncrypt(JSON j) |
| 307 | 311 | { |
| 308 | 312 | if (key_len != 0) |
| 309 | 313 | { |
| 314 | + QTC::TC("qpdf", "QPDFJob json encrypt duplicate key length"); | |
| 310 | 315 | usage("exactly one of 40bit, 128bit, or 256bit must be given"); |
| 311 | 316 | } |
| 312 | 317 | key_len = QUtil::string_to_int(key.c_str()); |
| ... | ... | @@ -322,12 +327,14 @@ Handlers::beginOutputOptionsEncrypt(JSON j) |
| 322 | 327 | }); |
| 323 | 328 | if (key_len == 0) |
| 324 | 329 | { |
| 330 | + QTC::TC("qpdf", "QPDFJob json encrypt no key length"); | |
| 325 | 331 | usage("exactly one of 40bit, 128bit, or 256bit must be given;" |
| 326 | 332 | " an empty dictionary may be supplied for one of them" |
| 327 | 333 | " to set the key length without imposing any restrictions"); |
| 328 | 334 | } |
| 329 | 335 | if (! (user_password_seen && owner_password_seen)) |
| 330 | 336 | { |
| 337 | + QTC::TC("qpdf", "QPDFJob json encrypt missing password"); | |
| 331 | 338 | usage("the user and owner password are both required; use the empty" |
| 332 | 339 | " string for the user password if you don't want a password"); |
| 333 | 340 | } |
| ... | ... | @@ -550,6 +557,7 @@ Handlers::beginOptionsPages(JSON j) |
| 550 | 557 | }); |
| 551 | 558 | if (! file_seen) |
| 552 | 559 | { |
| 560 | + QTC::TC("qpdf", "QPDFJob json pages no file"); | |
| 553 | 561 | usage("file is required in page specification"); |
| 554 | 562 | } |
| 555 | 563 | this->c_pages->pageSpec( | ... | ... |
qpdf/qpdf.testcov
| ... | ... | @@ -630,3 +630,10 @@ qpdf check password password correct 0 |
| 630 | 630 | qpdf check password not encrypted 0 |
| 631 | 631 | QPDFJob_config password file 0 |
| 632 | 632 | QPDFJob_config password stdin 0 |
| 633 | +QPDFJob json bare not true 0 | |
| 634 | +QPDFJob json choice mismatch 0 | |
| 635 | +QPDFJob json choice match 0 | |
| 636 | +QPDFJob json encrypt no key length 0 | |
| 637 | +QPDFJob json encrypt duplicate key length 0 | |
| 638 | +QPDFJob json encrypt missing password 0 | |
| 639 | +QPDFJob json pages no file 0 | ... | ... |
qpdf/qtest/qpdf.test
| ... | ... | @@ -372,6 +372,93 @@ foreach my $f (@dangling) |
| 372 | 372 | } |
| 373 | 373 | show_ntests(); |
| 374 | 374 | # ---------- |
| 375 | +$td->notify("--- QPDFJob Tests ---"); | |
| 376 | + | |
| 377 | +open(F, ">auto-txt") or die; | |
| 378 | +print F "from file"; | |
| 379 | +close(F); | |
| 380 | + | |
| 381 | +my @bad_json = ( | |
| 382 | + "bare-option-false", | |
| 383 | + "choice-mismatch", | |
| 384 | + "encrypt-duplicate-key-length", | |
| 385 | + "encrypt-missing-password", | |
| 386 | + "encrypt-no-key-length", | |
| 387 | + "pages-no-file", | |
| 388 | + "schema-error", | |
| 389 | + "json-error" | |
| 390 | + ); | |
| 391 | +my @good_json = ( | |
| 392 | + "choice-match", | |
| 393 | + "input-file-password", | |
| 394 | + "empty-input", | |
| 395 | + "replace-input", | |
| 396 | + "encrypt-40", | |
| 397 | + "encrypt-128", | |
| 398 | + "encrypt-256-with-restrictions", | |
| 399 | + "add-attachments", | |
| 400 | + "copy-attachments", | |
| 401 | + "underlay-overlay", | |
| 402 | + "underlay-overlay-password", | |
| 403 | + "misc-options", | |
| 404 | + ); | |
| 405 | +$n_tests += 4 + scalar(@bad_json) + (2 * scalar(@good_json)); | |
| 406 | + | |
| 407 | + | |
| 408 | +foreach my $i (@bad_json) | |
| 409 | +{ | |
| 410 | + $td->runtest("QPDFJob bad json: $i", | |
| 411 | + {$td->COMMAND => "qpdf --job-json-file=bad-json-$i.json"}, | |
| 412 | + {$td->FILE => "bad-$i-json.out", $td->EXIT_STATUS => 2}, | |
| 413 | + $td->NORMALIZE_NEWLINES); | |
| 414 | +} | |
| 415 | + | |
| 416 | +foreach my $i (@good_json) | |
| 417 | +{ | |
| 418 | + if ($i eq 'replace-input') | |
| 419 | + { | |
| 420 | + copy("minimal.pdf", 'a.pdf'); | |
| 421 | + } | |
| 422 | + $td->runtest("QPDFJob good json: $i", | |
| 423 | + {$td->COMMAND => "qpdf --job-json-file=job-json-$i.json"}, | |
| 424 | + {$td->STRING => "", $td->EXIT_STATUS => 0}, | |
| 425 | + $td->NORMALIZE_NEWLINES); | |
| 426 | + if ($i =~ m/encrypt-256/) | |
| 427 | + { | |
| 428 | + $td->runtest("check encryption $i", | |
| 429 | + {$td->COMMAND => | |
| 430 | + "qpdf a.pdf --password=u" . | |
| 431 | + " --job-json-file=job-show-encryption.json"}, | |
| 432 | + {$td->FILE => "job-json-$i.out", $td->EXIT_STATUS => 0}, | |
| 433 | + $td->NORMALIZE_NEWLINES); | |
| 434 | + } | |
| 435 | + else | |
| 436 | + { | |
| 437 | + $td->runtest("check good json $i output", | |
| 438 | + {$td->FILE => "a.pdf"}, | |
| 439 | + {$td->FILE => "job-json-$i.pdf"}); | |
| 440 | + } | |
| 441 | +} | |
| 442 | + | |
| 443 | + | |
| 444 | +$td->runtest("QPDFJob json partial", | |
| 445 | + {$td->COMMAND => "test_driver 83 - job-partial.json"}, | |
| 446 | + {$td->FILE => "job-partial-json.out", $td->EXIT_STATUS => 0}, | |
| 447 | + $td->NORMALIZE_NEWLINES); | |
| 448 | +$td->runtest("QPDFJob API", | |
| 449 | + {$td->COMMAND => "test_driver 84 -"}, | |
| 450 | + {$td->FILE => "job-api.out", $td->EXIT_STATUS => 0}, | |
| 451 | + $td->NORMALIZE_NEWLINES); | |
| 452 | +$td->runtest("check output", | |
| 453 | + {$td->FILE => "a.pdf"}, | |
| 454 | + {$td->FILE => "test84.pdf"}); | |
| 455 | +$td->runtest("json output from job", | |
| 456 | + {$td->COMMAND => "qpdf --job-json-file=job-json-output.json"}, | |
| 457 | + {$td->FILE => "job-json-output.out.json", $td->EXIT_STATUS => 0}, | |
| 458 | + $td->NORMALIZE_NEWLINES); | |
| 459 | + | |
| 460 | +show_ntests(); | |
| 461 | +# ---------- | |
| 375 | 462 | $td->notify("--- Form Tests ---"); |
| 376 | 463 | |
| 377 | 464 | my @form_tests = ( | ... | ... |
qpdf/qtest/qpdf/bad-bare-option-false-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-bare-option-false.json: .output.options.qdf: value must be true | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-choice-mismatch-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-choice-mismatch.json: .output.options.objectStreams: unexpected value; expected one of disable, preserve, generate | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-encrypt-duplicate-key-length-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-encrypt-duplicate-key-length.json: exactly one of 40bit, 128bit, or 256bit must be given | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-encrypt-missing-password-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-encrypt-missing-password.json: the user and owner password are both required; use the empty string for the user password if you don't want a password | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-encrypt-no-key-length-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-encrypt-no-key-length.json: exactly one of 40bit, 128bit, or 256bit must be given; an empty dictionary may be supplied for one of them to set the key length without imposing any restrictions | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-json-bare-option-false.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-choice-mismatch.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-encrypt-duplicate-key-length.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-encrypt-missing-password.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-encrypt-no-key-length.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-error-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-json-error.json: JSON: offset 130: unexpected dictionary end delimiter | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-json-json-error.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-pages-no-file.json
0 โ 100644
qpdf/qtest/qpdf/bad-json-schema-error.json
0 โ 100644
qpdf/qtest/qpdf/bad-pages-no-file-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-pages-no-file.json: file is required in page specification | |
| 3 | +Run qpdf--job-json-help for information on the file format. | |
| 4 | + | |
| 5 | +For help: | |
| 6 | + qpdf--help=usage usage information | |
| 7 | + qpdf--help=topic help on a topic | |
| 8 | + qpdf--help=--option help on an option | |
| 9 | + qpdf--help general help and a topic list | |
| 10 | + | ... | ... |
qpdf/qtest/qpdf/bad-schema-error-json.out
0 โ 100644
| 1 | + | |
| 2 | +qpdf: error with job-json file bad-json-schema-error.json: qpdf: job json has errors: | |
| 3 | + json key ".output": key "potato" is not present in schema but appears in object | |
| 4 | +Run qpdf--job-json-help for information on the file format. | |
| 5 | + | |
| 6 | +For help: | |
| 7 | + qpdf--help=usage usage information | |
| 8 | + qpdf--help=topic help on a topic | |
| 9 | + qpdf--help=--option help on an option | |
| 10 | + qpdf--help general help and a topic list | |
| 11 | + | ... | ... |
qpdf/qtest/qpdf/job-api.out
0 โ 100644
qpdf/qtest/qpdf/job-json-add-attachments.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "minimal.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true | |
| 9 | + } | |
| 10 | + }, | |
| 11 | + "options": { | |
| 12 | + "addAttachment": [ | |
| 13 | + { | |
| 14 | + "file": "auto-txt", | |
| 15 | + "moddate": "D:20220131134246-05'00'", | |
| 16 | + "creationdate": "D:20220131134246-05'00'" | |
| 17 | + }, | |
| 18 | + { | |
| 19 | + "file": "auto-txt", | |
| 20 | + "moddate": "D:20220131134246-05'00'", | |
| 21 | + "creationdate": "D:20220131134246-05'00'", | |
| 22 | + "filename": "auto2", | |
| 23 | + "key": "auto2-key" | |
| 24 | + } | |
| 25 | + ] | |
| 26 | + } | |
| 27 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-add-attachments.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-choice-match.json
0 โ 100644
qpdf/qtest/qpdf/job-json-choice-match.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-copy-attachments.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "minimal.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true | |
| 9 | + } | |
| 10 | + }, | |
| 11 | + "options": { | |
| 12 | + "copyAttachmentsFrom": [ | |
| 13 | + { | |
| 14 | + "file": "job-json-add-attachments.pdf" | |
| 15 | + }, | |
| 16 | + { | |
| 17 | + "file": "20-pages.pdf", | |
| 18 | + "password": "user" | |
| 19 | + }, | |
| 20 | + { | |
| 21 | + "file": "job-json-add-attachments.pdf", | |
| 22 | + "prefix": "p-" | |
| 23 | + } | |
| 24 | + ] | |
| 25 | + } | |
| 26 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-copy-attachments.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-empty-input.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "empty": true | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true | |
| 9 | + } | |
| 10 | + }, | |
| 11 | + "options": { | |
| 12 | + "pages": [ | |
| 13 | + { | |
| 14 | + "file": "minimal.pdf" | |
| 15 | + }, | |
| 16 | + { | |
| 17 | + "file": "20-pages.pdf", | |
| 18 | + "password": "user", | |
| 19 | + "range": "1-5" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + } | |
| 23 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-empty-input.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-encrypt-128.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "fxo-blue.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true, | |
| 9 | + "staticAesIv": true, | |
| 10 | + "encrypt": { | |
| 11 | + "userPassword": "u", | |
| 12 | + "ownerPassword": "o", | |
| 13 | + "128bit": { | |
| 14 | + "useAes": "y" | |
| 15 | + } | |
| 16 | + } | |
| 17 | + } | |
| 18 | + } | |
| 19 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-encrypt-128.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-encrypt-256-with-restrictions.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "minimal.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true, | |
| 9 | + "staticAesIv": true, | |
| 10 | + "encrypt": { | |
| 11 | + "userPassword": "u", | |
| 12 | + "ownerPassword": "o", | |
| 13 | + "256bit": { | |
| 14 | + "print": "low", | |
| 15 | + "modify": "form" | |
| 16 | + } | |
| 17 | + } | |
| 18 | + } | |
| 19 | + } | |
| 20 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-encrypt-256-with-restrictions.out
0 โ 100644
| 1 | +R = 6 | |
| 2 | +P = -2092 | |
| 3 | +User password = u | |
| 4 | +Supplied password is user password | |
| 5 | +extract for accessibility: allowed | |
| 6 | +extract for any purpose: allowed | |
| 7 | +print low resolution: allowed | |
| 8 | +print high resolution: not allowed | |
| 9 | +modify document assembly: allowed | |
| 10 | +modify forms: allowed | |
| 11 | +modify annotations: not allowed | |
| 12 | +modify other: not allowed | |
| 13 | +modify anything: not allowed | |
| 14 | +stream encryption method: AESv3 | |
| 15 | +string encryption method: AESv3 | |
| 16 | +file encryption method: AESv3 | ... | ... |
qpdf/qtest/qpdf/job-json-encrypt-40.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "minimal.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true, | |
| 9 | + "encrypt": { | |
| 10 | + "userPassword": "u", | |
| 11 | + "ownerPassword": "o", | |
| 12 | + "40bit": {} | |
| 13 | + } | |
| 14 | + } | |
| 15 | + }, | |
| 16 | + "options": { | |
| 17 | + "allowWeakCrypto": true | |
| 18 | + } | |
| 19 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-encrypt-40.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-input-file-password.json
0 โ 100644
qpdf/qtest/qpdf/job-json-input-file-password.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-misc-options.json
0 โ 100644
qpdf/qtest/qpdf/job-json-misc-options.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-output.json
0 โ 100644
qpdf/qtest/qpdf/job-json-output.out.json
0 โ 100644
| 1 | +{ | |
| 2 | + "objects": { | |
| 3 | + "5 0 R": [ | |
| 4 | + "/PDF", | |
| 5 | + "/Text" | |
| 6 | + ], | |
| 7 | + "trailer": { | |
| 8 | + "/Root": "1 0 R", | |
| 9 | + "/Size": 7 | |
| 10 | + } | |
| 11 | + }, | |
| 12 | + "pages": [ | |
| 13 | + { | |
| 14 | + "contents": [ | |
| 15 | + "4 0 R" | |
| 16 | + ], | |
| 17 | + "images": [], | |
| 18 | + "label": null, | |
| 19 | + "object": "3 0 R", | |
| 20 | + "outlines": [], | |
| 21 | + "pageposfrom1": 1 | |
| 22 | + } | |
| 23 | + ], | |
| 24 | + "parameters": { | |
| 25 | + "decodelevel": "generalized" | |
| 26 | + }, | |
| 27 | + "version": 1 | |
| 28 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-replace-input.json
0 โ 100644
qpdf/qtest/qpdf/job-json-replace-input.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-underlay-overlay-password.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "minimal.pdf" | |
| 4 | + }, | |
| 5 | + "output": { | |
| 6 | + "file": "a.pdf", | |
| 7 | + "options": { | |
| 8 | + "staticId": true | |
| 9 | + } | |
| 10 | + }, | |
| 11 | + "options": { | |
| 12 | + "underlay": { | |
| 13 | + "file": "20-pages.pdf", | |
| 14 | + "password": "user", | |
| 15 | + "from": "5" | |
| 16 | + }, | |
| 17 | + "overlay": { | |
| 18 | + "file": "job-json-encrypt-128.pdf", | |
| 19 | + "password": "o", | |
| 20 | + "from": "7" | |
| 21 | + } | |
| 22 | + } | |
| 23 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-underlay-overlay-password.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-json-underlay-overlay.json
0 โ 100644
| 1 | +{ | |
| 2 | + "input": { | |
| 3 | + "file": "20-pages.pdf", | |
| 4 | + "password": "owner" | |
| 5 | + }, | |
| 6 | + "output": { | |
| 7 | + "file": "a.pdf", | |
| 8 | + "options": { | |
| 9 | + "staticId": true, | |
| 10 | + "decrypt": true | |
| 11 | + } | |
| 12 | + }, | |
| 13 | + "options": { | |
| 14 | + "underlay": { | |
| 15 | + "file": "fxo-green.pdf" | |
| 16 | + }, | |
| 17 | + "overlay": { | |
| 18 | + "file": "fxo-red.pdf", | |
| 19 | + "from": "1,2", | |
| 20 | + "repeat": "3" | |
| 21 | + } | |
| 22 | + } | |
| 23 | +} | ... | ... |
qpdf/qtest/qpdf/job-json-underlay-overlay.pdf
0 โ 100644
No preview for this file type
qpdf/qtest/qpdf/job-partial-json.out
0 โ 100644
qpdf/qtest/qpdf/job-partial.json
0 โ 100644
qpdf/qtest/qpdf/job-show-encryption.json
0 โ 100644
qpdf/qtest/qpdf/test84.pdf
0 โ 100644
| 1 | +%PDF-1.3 | |
| 2 | +%ยฟรทยขรพ | |
| 3 | +%QDF-1.0 | |
| 4 | + | |
| 5 | +%% Original object ID: 1 0 | |
| 6 | +1 0 obj | |
| 7 | +<< | |
| 8 | + /Pages 2 0 R | |
| 9 | + /Type /Catalog | |
| 10 | +>> | |
| 11 | +endobj | |
| 12 | + | |
| 13 | +%% Original object ID: 2 0 | |
| 14 | +2 0 obj | |
| 15 | +<< | |
| 16 | + /Count 1 | |
| 17 | + /Kids [ | |
| 18 | + 3 0 R | |
| 19 | + ] | |
| 20 | + /Type /Pages | |
| 21 | +>> | |
| 22 | +endobj | |
| 23 | + | |
| 24 | +%% Page 1 | |
| 25 | +%% Original object ID: 3 0 | |
| 26 | +3 0 obj | |
| 27 | +<< | |
| 28 | + /Contents 4 0 R | |
| 29 | + /MediaBox [ | |
| 30 | + 0 | |
| 31 | + 0 | |
| 32 | + 612 | |
| 33 | + 792 | |
| 34 | + ] | |
| 35 | + /Parent 2 0 R | |
| 36 | + /Resources << | |
| 37 | + /Font << | |
| 38 | + /F1 6 0 R | |
| 39 | + >> | |
| 40 | + /ProcSet 7 0 R | |
| 41 | + >> | |
| 42 | + /Type /Page | |
| 43 | +>> | |
| 44 | +endobj | |
| 45 | + | |
| 46 | +%% Contents for page 1 | |
| 47 | +%% Original object ID: 4 0 | |
| 48 | +4 0 obj | |
| 49 | +<< | |
| 50 | + /Length 5 0 R | |
| 51 | +>> | |
| 52 | +stream | |
| 53 | +BT | |
| 54 | + /F1 24 Tf | |
| 55 | + 72 720 Td | |
| 56 | + (Potato) Tj | |
| 57 | +ET | |
| 58 | +endstream | |
| 59 | +endobj | |
| 60 | + | |
| 61 | +5 0 obj | |
| 62 | +44 | |
| 63 | +endobj | |
| 64 | + | |
| 65 | +%% Original object ID: 6 0 | |
| 66 | +6 0 obj | |
| 67 | +<< | |
| 68 | + /BaseFont /Helvetica | |
| 69 | + /Encoding /WinAnsiEncoding | |
| 70 | + /Name /F1 | |
| 71 | + /Subtype /Type1 | |
| 72 | + /Type /Font | |
| 73 | +>> | |
| 74 | +endobj | |
| 75 | + | |
| 76 | +%% Original object ID: 5 0 | |
| 77 | +7 0 obj | |
| 78 | +[ | |
| 79 | ||
| 80 | + /Text | |
| 81 | +] | |
| 82 | +endobj | |
| 83 | + | |
| 84 | +xref | |
| 85 | +0 8 | |
| 86 | +0000000000 65535 f | |
| 87 | +0000000052 00000 n | |
| 88 | +0000000133 00000 n | |
| 89 | +0000000242 00000 n | |
| 90 | +0000000484 00000 n | |
| 91 | +0000000583 00000 n | |
| 92 | +0000000629 00000 n | |
| 93 | +0000000774 00000 n | |
| 94 | +trailer << | |
| 95 | + /Root 1 0 R | |
| 96 | + /Size 8 | |
| 97 | + /ID [<cd76a1aff58b062d8141f81511edbe38><cd76a1aff58b062d8141f81511edbe38>] | |
| 98 | +>> | |
| 99 | +startxref | |
| 100 | +809 | |
| 101 | +%%EOF | ... | ... |
qpdf/test_driver.cc
| ... | ... | @@ -20,6 +20,8 @@ |
| 20 | 20 | #include <qpdf/QPDFWriter.hh> |
| 21 | 21 | #include <qpdf/QPDFSystemError.hh> |
| 22 | 22 | #include <qpdf/QIntC.hh> |
| 23 | +#include <qpdf/QPDFJob.hh> | |
| 24 | +#include <qpdf/QPDFUsage.hh> | |
| 23 | 25 | #include <iostream> |
| 24 | 26 | #include <sstream> |
| 25 | 27 | #include <algorithm> |
| ... | ... | @@ -3140,6 +3142,81 @@ static void test_82(QPDF& pdf, char const* arg2) |
| 3140 | 3142 | assert(! str.isOrHasName("/Marvin")); |
| 3141 | 3143 | } |
| 3142 | 3144 | |
| 3145 | +static void test_83(QPDF& pdf, char const* arg2) | |
| 3146 | +{ | |
| 3147 | + // Test QPDFJob json with partial = false. For testing with | |
| 3148 | + // partial = true, we just use qpdf --job-json-file. | |
| 3149 | + | |
| 3150 | + QPDFJob j; | |
| 3151 | + PointerHolder<char> file_buf; | |
| 3152 | + size_t size; | |
| 3153 | + QUtil::read_file_into_memory(arg2, file_buf, size); | |
| 3154 | + try | |
| 3155 | + { | |
| 3156 | + std::cout << "calling initializeFromJson" << std::endl; | |
| 3157 | + j.initializeFromJson(std::string(file_buf.getPointer(), size)); | |
| 3158 | + std::cout << "called initializeFromJson" << std::endl; | |
| 3159 | + } | |
| 3160 | + catch (QPDFUsage& e) | |
| 3161 | + { | |
| 3162 | + std::cerr << "usage: " << e.what() << std::endl; | |
| 3163 | + } | |
| 3164 | + catch (std::exception& e) | |
| 3165 | + { | |
| 3166 | + std::cerr << "exception: " << e.what() << std::endl; | |
| 3167 | + } | |
| 3168 | +} | |
| 3169 | + | |
| 3170 | +static void test_84(QPDF& pdf, char const* arg2) | |
| 3171 | +{ | |
| 3172 | + // Test QPDFJob API | |
| 3173 | + | |
| 3174 | + std::cout << "normal" << std::endl; | |
| 3175 | + { | |
| 3176 | + QPDFJob j; | |
| 3177 | + j.config() | |
| 3178 | + ->inputFile("minimal.pdf") | |
| 3179 | + ->outputFile("a.pdf") | |
| 3180 | + ->qdf() | |
| 3181 | + ->deterministicId() | |
| 3182 | + ->objectStreams("preserve") | |
| 3183 | + ->checkConfiguration(); | |
| 3184 | + j.run(); | |
| 3185 | + } | |
| 3186 | + | |
| 3187 | + std::cout << "error caught by check" << std::endl; | |
| 3188 | + try | |
| 3189 | + { | |
| 3190 | + QPDFJob j; | |
| 3191 | + j.config() | |
| 3192 | + ->outputFile("a.pdf") | |
| 3193 | + ->qdf(); | |
| 3194 | + std::cout << "finished config" << std::endl; | |
| 3195 | + j.checkConfiguration(); | |
| 3196 | + assert(false); | |
| 3197 | + } | |
| 3198 | + catch (QPDFUsage& e) | |
| 3199 | + { | |
| 3200 | + std::cout << "usage: " << e.what() << std::endl; | |
| 3201 | + } | |
| 3202 | + | |
| 3203 | + std::cout << "error caught by run" << std::endl; | |
| 3204 | + try | |
| 3205 | + { | |
| 3206 | + QPDFJob j; | |
| 3207 | + j.config() | |
| 3208 | + ->outputFile("a.pdf") | |
| 3209 | + ->qdf(); | |
| 3210 | + std::cout << "finished config" << std::endl; | |
| 3211 | + j.run(); | |
| 3212 | + assert(false); | |
| 3213 | + } | |
| 3214 | + catch (QPDFUsage& e) | |
| 3215 | + { | |
| 3216 | + std::cout << "usage: " << e.what() << std::endl; | |
| 3217 | + } | |
| 3218 | +} | |
| 3219 | + | |
| 3143 | 3220 | void runtest(int n, char const* filename1, char const* arg2) |
| 3144 | 3221 | { |
| 3145 | 3222 | // Most tests here are crafted to work on specific files. Look at |
| ... | ... | @@ -3206,7 +3283,7 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 3206 | 3283 | pdf.processMemoryFile((std::string(filename1) + ".pdf").c_str(), |
| 3207 | 3284 | p, size); |
| 3208 | 3285 | } |
| 3209 | - else if ((n == 61) || (n == 81)) | |
| 3286 | + else if ((n == 61) || (n == 81) || (n == 83) || (n == 84)) | |
| 3210 | 3287 | { |
| 3211 | 3288 | // Ignore filename argument entirely |
| 3212 | 3289 | } |
| ... | ... | @@ -3253,7 +3330,8 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 3253 | 3330 | {68, test_68}, {69, test_69}, {70, test_70}, {71, test_71}, |
| 3254 | 3331 | {72, test_72}, {73, test_73}, {74, test_74}, {75, test_75}, |
| 3255 | 3332 | {76, test_76}, {77, test_77}, {78, test_78}, {79, test_79}, |
| 3256 | - {80, test_80}, {81, test_81}, {82, test_82}, | |
| 3333 | + {80, test_80}, {81, test_81}, {82, test_82}, {83, test_83}, | |
| 3334 | + {84, test_84}, | |
| 3257 | 3335 | }; |
| 3258 | 3336 | |
| 3259 | 3337 | auto fn = test_functions.find(n); | ... | ... |