diff options
author | Jay Berkenbilt <ejb@ql.org> | 2022-09-08 21:57:33 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2022-09-09 12:19:09 +0200 |
commit | f1a2d3160a1dbaf735cce597d0f6f40e76f7f223 (patch) | |
tree | 41721144a2d94d962f3de9b48ad58d18bfd838e0 /qpdf | |
parent | 66f1fd2ad9f2a4e3172bd07f6d71bb1321b0dce0 (diff) | |
download | qpdf-f1a2d3160a1dbaf735cce597d0f6f40e76f7f223.tar.zst |
Add JSON v2 support to C API
Diffstat (limited to 'qpdf')
-rw-r--r-- | qpdf/qpdf-ctest.c | 119 | ||||
-rw-r--r-- | qpdf/qtest/qpdf-json.test | 53 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/minimal-update.json | 17 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/minimal.json | 74 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/qpdf-ctest-42-43.pdf | bin | 0 -> 799 bytes | |||
-rw-r--r-- | qpdf/qtest/qpdf/qpdf-ctest-44-45.pdf | bin | 0 -> 798 bytes | |||
-rw-r--r-- | qpdf/qtest/qpdf/qpdf-ctest-46.json | 74 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/qpdf-ctest-47-4 | 5 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/qpdf-ctest-47.json | 25 |
9 files changed, 366 insertions, 1 deletions
diff --git a/qpdf/qpdf-ctest.c b/qpdf/qpdf-ctest.c index 07d6ca9e..b562ed8b 100644 --- a/qpdf/qpdf-ctest.c +++ b/qpdf/qpdf-ctest.c @@ -133,6 +133,13 @@ count_progress(int percent, void* data) ++(*(int*)data); } +static int +write_to_file(char const* data, size_t size, void* udata) +{ + FILE* f = (FILE*)udata; + return fwrite(data, 1, size, f) != size; +} + static void test01( char const* infile, @@ -1458,7 +1465,7 @@ test41( char const* outfile, char const* xarg) { - /* Empty PDF -- infile is ignored*/ + /* Empty PDF -- infile is ignored */ assert(qpdf_empty_pdf(qpdf) == 0); qpdf_init_write(qpdf, outfile); qpdf_set_static_ID(qpdf, QPDF_TRUE); @@ -1466,6 +1473,110 @@ test41( report_errors(); } +static void +test42( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + assert(qpdf_create_from_json_file(qpdf, infile) == QPDF_SUCCESS); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_write(qpdf); + report_errors(); +} + +static void +test43( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + char* buf = NULL; + unsigned long size = 0; + read_file_into_memory(infile, &buf, &size); + assert(qpdf_create_from_json_data(qpdf, buf, size) == QPDF_SUCCESS); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_write(qpdf); + report_errors(); + free(buf); +} + +static void +test44( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + assert(qpdf_read(qpdf, infile, password) == 0); + assert(qpdf_update_from_json_file(qpdf, xarg) == QPDF_SUCCESS); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_write(qpdf); + report_errors(); +} + +static void +test45( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + char* buf = NULL; + unsigned long size = 0; + read_file_into_memory(xarg, &buf, &size); + assert(qpdf_read(qpdf, infile, password) == 0); + assert(qpdf_update_from_json_data(qpdf, buf, size) == QPDF_SUCCESS); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_write(qpdf); + report_errors(); + free(buf); +} + +static void +test46( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + FILE* f = safe_fopen(outfile, "wb"); + assert(qpdf_read(qpdf, infile, password) == 0); + qpdf_write_json( + qpdf, 2, write_to_file, f, qpdf_dl_none, qpdf_sj_inline, "", NULL); + fclose(f); + report_errors(); +} + +static void +test47( + char const* infile, + char const* password, + char const* outfile, + char const* xarg) +{ + FILE* f = safe_fopen(outfile, "wb"); + assert(qpdf_read(qpdf, infile, password) == 0); + char const* wanted_objects[] = {"obj:4 0 R", "trailer", NULL}; + qpdf_write_json( + qpdf, + 2, + write_to_file, + f, + qpdf_dl_specialized, + qpdf_sj_file, + xarg, + wanted_objects); + fclose(f); + report_errors(); +} + int main(int argc, char* argv[]) { @@ -1542,6 +1653,12 @@ main(int argc, char* argv[]) : (n == 39) ? test39 : (n == 40) ? test40 : (n == 41) ? test41 + : (n == 42) ? test42 + : (n == 43) ? test43 + : (n == 44) ? test44 + : (n == 45) ? test45 + : (n == 46) ? test46 + : (n == 47) ? test47 : 0); if (fn == 0) { diff --git a/qpdf/qtest/qpdf-json.test b/qpdf/qtest/qpdf-json.test index 553a84e2..2867f8a7 100644 --- a/qpdf/qtest/qpdf-json.test +++ b/qpdf/qtest/qpdf-json.test @@ -288,5 +288,58 @@ $td->runtest("simple version of writeJSON", {$td->FILE => "minimal-write-json.json", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +$n_tests += 13; +$td->runtest("C API create from json file", + {$td->COMMAND => "qpdf-ctest 42 minimal.json '' a.pdf"}, + {$td->STRING => "C test 42 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API create from file", + {$td->FILE => "a.pdf"}, + {$td->FILE => "qpdf-ctest-42-43.pdf"}); +$td->runtest("C API create from json buffer", + {$td->COMMAND => "qpdf-ctest 43 minimal.json '' a.pdf"}, + {$td->STRING => "C test 43 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API create from buffer", + {$td->FILE => "a.pdf"}, + {$td->FILE => "qpdf-ctest-42-43.pdf"}); +$td->runtest("C API update from json file", + {$td->COMMAND => + "qpdf-ctest 44 minimal.pdf '' a.pdf minimal-update.json"}, + {$td->STRING => "C test 44 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API update from file", + {$td->FILE => "a.pdf"}, + {$td->FILE => "qpdf-ctest-44-45.pdf"}); +$td->runtest("C API update from json buffer", + {$td->COMMAND => + "qpdf-ctest 45 minimal.pdf '' a.pdf minimal-update.json"}, + {$td->STRING => "C test 45 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API update from buffer", + {$td->FILE => "a.pdf"}, + {$td->FILE => "qpdf-ctest-44-45.pdf"}); +$td->runtest("C API write to JSON 1", + {$td->COMMAND => + "qpdf-ctest 46 minimal.pdf '' a.json"}, + {$td->STRING => "C test 46 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API write to JSON 1", + {$td->FILE => "a.json"}, + {$td->FILE => "qpdf-ctest-46.json"}, + $td->NORMALIZE_NEWLINES); +$td->runtest("C API write to JSON 2", + {$td->COMMAND => + "qpdf-ctest 47 minimal.pdf '' a.json auto"}, + {$td->STRING => "C test 47 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API write to JSON 2", + {$td->FILE => "a.json"}, + {$td->FILE => "qpdf-ctest-47.json"}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check C API write to JSON stream", + {$td->FILE => "auto-4"}, + {$td->FILE => "qpdf-ctest-47-4"}); + cleanup(); $td->report($n_tests); diff --git a/qpdf/qtest/qpdf/minimal-update.json b/qpdf/qtest/qpdf/minimal-update.json new file mode 100644 index 00000000..1bd9abc0 --- /dev/null +++ b/qpdf/qtest/qpdf/minimal-update.json @@ -0,0 +1,17 @@ +{ + "qpdf": [ + { + "jsonversion": 2, + "pushedinheritedpageresources": false, + "calledgetallpages": false + }, + { + "obj:4 0 R": { + "stream": { + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoU2FsYWQpIFRqCkVUCg==", + "dict": {} + } + } + } + ] +} diff --git a/qpdf/qtest/qpdf/minimal.json b/qpdf/qtest/qpdf/minimal.json new file mode 100644 index 00000000..ae4a9faa --- /dev/null +++ b/qpdf/qtest/qpdf/minimal.json @@ -0,0 +1,74 @@ +{ + "qpdf": [ + { + "jsonversion": 2, + "pdfversion": "1.3", + "pushedinheritedpageresources": false, + "calledgetallpages": false, + "maxobjectid": 6 + }, + { + "obj:1 0 R": { + "value": { + "/Pages": "2 0 R", + "/Type": "/Catalog" + } + }, + "obj:2 0 R": { + "value": { + "/Count": 1, + "/Kids": [ + "3 0 R" + ], + "/Type": "/Pages" + } + }, + "obj:3 0 R": { + "value": { + "/Contents": "4 0 R", + "/MediaBox": [ + 0, + 0, + 612, + 792 + ], + "/Parent": "2 0 R", + "/Resources": { + "/Font": { + "/F1": "6 0 R" + }, + "/ProcSet": "5 0 R" + }, + "/Type": "/Page" + } + }, + "obj:4 0 R": { + "stream": { + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=", + "dict": {} + } + }, + "obj:5 0 R": { + "value": [ + "/PDF", + "/Text" + ] + }, + "obj:6 0 R": { + "value": { + "/BaseFont": "/Helvetica", + "/Encoding": "/WinAnsiEncoding", + "/Name": "/F1", + "/Subtype": "/Type1", + "/Type": "/Font" + } + }, + "trailer": { + "value": { + "/Root": "1 0 R", + "/Size": 7 + } + } + } + ] +} diff --git a/qpdf/qtest/qpdf/qpdf-ctest-42-43.pdf b/qpdf/qtest/qpdf/qpdf-ctest-42-43.pdf Binary files differnew file mode 100644 index 00000000..b8c692ed --- /dev/null +++ b/qpdf/qtest/qpdf/qpdf-ctest-42-43.pdf diff --git a/qpdf/qtest/qpdf/qpdf-ctest-44-45.pdf b/qpdf/qtest/qpdf/qpdf-ctest-44-45.pdf Binary files differnew file mode 100644 index 00000000..f7f56fd9 --- /dev/null +++ b/qpdf/qtest/qpdf/qpdf-ctest-44-45.pdf diff --git a/qpdf/qtest/qpdf/qpdf-ctest-46.json b/qpdf/qtest/qpdf/qpdf-ctest-46.json new file mode 100644 index 00000000..ae4a9faa --- /dev/null +++ b/qpdf/qtest/qpdf/qpdf-ctest-46.json @@ -0,0 +1,74 @@ +{ + "qpdf": [ + { + "jsonversion": 2, + "pdfversion": "1.3", + "pushedinheritedpageresources": false, + "calledgetallpages": false, + "maxobjectid": 6 + }, + { + "obj:1 0 R": { + "value": { + "/Pages": "2 0 R", + "/Type": "/Catalog" + } + }, + "obj:2 0 R": { + "value": { + "/Count": 1, + "/Kids": [ + "3 0 R" + ], + "/Type": "/Pages" + } + }, + "obj:3 0 R": { + "value": { + "/Contents": "4 0 R", + "/MediaBox": [ + 0, + 0, + 612, + 792 + ], + "/Parent": "2 0 R", + "/Resources": { + "/Font": { + "/F1": "6 0 R" + }, + "/ProcSet": "5 0 R" + }, + "/Type": "/Page" + } + }, + "obj:4 0 R": { + "stream": { + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=", + "dict": {} + } + }, + "obj:5 0 R": { + "value": [ + "/PDF", + "/Text" + ] + }, + "obj:6 0 R": { + "value": { + "/BaseFont": "/Helvetica", + "/Encoding": "/WinAnsiEncoding", + "/Name": "/F1", + "/Subtype": "/Type1", + "/Type": "/Font" + } + }, + "trailer": { + "value": { + "/Root": "1 0 R", + "/Size": 7 + } + } + } + ] +} diff --git a/qpdf/qtest/qpdf/qpdf-ctest-47-4 b/qpdf/qtest/qpdf/qpdf-ctest-47-4 new file mode 100644 index 00000000..b74381fa --- /dev/null +++ b/qpdf/qtest/qpdf/qpdf-ctest-47-4 @@ -0,0 +1,5 @@ +BT + /F1 24 Tf + 72 720 Td + (Potato) Tj +ET diff --git a/qpdf/qtest/qpdf/qpdf-ctest-47.json b/qpdf/qtest/qpdf/qpdf-ctest-47.json new file mode 100644 index 00000000..44f8b500 --- /dev/null +++ b/qpdf/qtest/qpdf/qpdf-ctest-47.json @@ -0,0 +1,25 @@ +{ + "qpdf": [ + { + "jsonversion": 2, + "pdfversion": "1.3", + "pushedinheritedpageresources": false, + "calledgetallpages": false, + "maxobjectid": 6 + }, + { + "obj:4 0 R": { + "stream": { + "datafile": "auto-4", + "dict": {} + } + }, + "trailer": { + "value": { + "/Root": "1 0 R", + "/Size": 7 + } + } + } + ] +} |