diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index a965f468..9ea329ff 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -1197,6 +1197,13 @@ class QPDFObjectHandle QPDF_DLL JSON getJSON(int json_version, bool dereference_indirect = false); + // Write the object encoded as JSON to a pipeline. This is equivalent to, but more efficient + // than, calling getJSON(json_version, dereference_indirect).write(p, depth). See the + // documentation for getJSON and JSON::write for further detail. + QPDF_DLL + void + writeJSON(int json_version, Pipeline* p, bool dereference_indirect = false, size_t depth = 0); + // Deprecated version uses v1 for backward compatibility. // ABI: remove for qpdf 12 [[deprecated("Use getJSON(int version)")]] QPDF_DLL JSON diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 4fda24f5..9b9849a3 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1638,6 +1638,13 @@ QPDFObjectHandle::writeJSON(int json_version, JSON::Writer& p, bool dereference_ } } +void +QPDFObjectHandle::writeJSON(int json_version, Pipeline* p, bool dereference_indirect, size_t depth) +{ + JSON::Writer jw{p, depth}; + writeJSON(json_version, jw, dereference_indirect); +} + JSON QPDFObjectHandle::getStreamJSON( int json_version, diff --git a/qpdf/qtest/qpdf-json.test b/qpdf/qtest/qpdf-json.test index defabbe7..299bcd7e 100644 --- a/qpdf/qtest/qpdf-json.test +++ b/qpdf/qtest/qpdf-json.test @@ -350,7 +350,7 @@ $td->runtest("check C API write to JSON stream", # (using #xx) would generate invalid JSON, even though qpdf's own JSON # parser would accept it. Also, the JSON spec allows real numbers in # scientific notation, but the PDF spec does not. -$n_tests += 6; +$n_tests += 7; $td->runtest("handle binary names", {$td->COMMAND => "qpdf --json-output weird-tokens.pdf a.json"}, @@ -379,6 +379,9 @@ $td->runtest("check json", {$td->FILE => "a.json"}, {$td->FILE => "weird-tokens-v1.json"}, $td->NORMALIZE_NEWLINES); - +$td->runtest("write JSON to pipeline", + {$td->COMMAND => "test_driver 98 minimal.pdf ''"}, + {$td->STRING => "test 98 done\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); cleanup(); $td->report($n_tests); diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index 28d8062c..f421f86a 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -3380,6 +3380,22 @@ test_97(QPDF& pdf, char const* arg2) assert(nulls.unparse() == nulls2.unparse()); } +static void +test_98(QPDF& pdf, char const* arg2) +{ + // Test QPDFObjectHandle::writeJSON. This test is built for minimal.pdf. + for (int i = 1; i < 7; ++i) { + auto oh = pdf.getObject(i, 0); + Pl_Buffer bf1{"write", nullptr}; + Pl_Buffer bf2{"get", nullptr}; + oh.writeJSON(JSON::LATEST, &bf1, true, 7); + bf1.finish(); + oh.getJSON(JSON::LATEST, true).write(&bf2, 7); + bf2.finish(); + assert(bf1.getString() == bf2.getString()); + } +} + void runtest(int n, char const* filename1, char const* arg2) { @@ -3481,7 +3497,7 @@ runtest(int n, char const* filename1, char const* arg2) {78, test_78}, {79, test_79}, {80, test_80}, {81, test_81}, {82, test_82}, {83, test_83}, {84, test_84}, {85, test_85}, {86, test_86}, {87, test_87}, {88, test_88}, {89, test_89}, {90, test_90}, {91, test_91}, {92, test_92}, {93, test_93}, {94, test_94}, {95, test_95}, - {96, test_96}, {97, test_97}}; + {96, test_96}, {97, test_97}, {98, test_98}}; auto fn = test_functions.find(n); if (fn == test_functions.end()) {