aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2024-02-16 15:09:28 +0100
committerm-holger <m-holger@kubitscheck.org>2024-02-16 15:09:28 +0100
commitf0bc2f11ef4f096b1338dd5fc91e3c4d88b3b9e0 (patch)
tree23967df70526644adcdd8aa7bac79c8a653f22c5
parentc06653c3ab1ec3241b66e708750813a380378fad (diff)
downloadqpdf-f0bc2f11ef4f096b1338dd5fc91e3c4d88b3b9e0.tar.zst
Expose QPDFObjectHandle::writeJSON
-rw-r--r--include/qpdf/QPDFObjectHandle.hh7
-rw-r--r--libqpdf/QPDFObjectHandle.cc7
-rw-r--r--qpdf/qtest/qpdf-json.test7
-rw-r--r--qpdf/test_driver.cc18
4 files changed, 36 insertions, 3 deletions
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()) {