Refactor QPDF::writeJSON

This commit is contained in:
m-holger 2024-02-15 18:02:01 +00:00
parent b9bc05356a
commit c06653c3ab
1 changed files with 52 additions and 101 deletions

View File

@ -848,48 +848,6 @@ writeJSONStreamFile(
fclose(f); fclose(f);
} }
void
writeJSONStream(
int version,
Pipeline* p,
bool& first,
std::string const& key,
QPDF_Stream& stream,
int id,
qpdf_stream_decode_level_e decode_level,
qpdf_json_stream_data_e json_stream_data,
std::string const& file_prefix)
{
if (first) {
*p << "\n \"" << key << "\": {\n \"stream\": ";
first = false;
} else {
*p << ",\n \"" << key << "\": {\n \"stream\": ";
}
JSON::Writer jw{p, 4};
if (json_stream_data == qpdf_sj_file) {
writeJSONStreamFile(version, jw, stream, id, decode_level, file_prefix);
} else {
stream.writeStreamJSON(version, jw, json_stream_data, decode_level, nullptr, "");
}
*p << "\n }";
}
void
writeJSONObject(
int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj)
{
if (first) {
*p << "\n \"" << key << "\": {\n \"value\": ";
first = false;
} else {
*p << ",\n \"" << key << "\": {\n \"value\": ";
}
auto w = JSON::Writer(p, 4);
obj.writeJSON(version, w, true);
*p << "\n }";
}
void void
QPDF::writeJSON( QPDF::writeJSON(
int version, int version,
@ -914,82 +872,75 @@ QPDF::writeJSON(
std::string const& file_prefix, std::string const& file_prefix,
std::set<std::string> wanted_objects) std::set<std::string> wanted_objects)
{ {
int const depth_outer = 1;
int const depth_top = 1;
int const depth_qpdf = 2;
int const depth_qpdf_inner = 3;
if (version != 2) { if (version != 2) {
throw std::runtime_error("QPDF::writeJSON: only version 2 is supported"); throw std::runtime_error("QPDF::writeJSON: only version 2 is supported");
} }
bool first = true; JSON::Writer jw{p, 4};
if (complete) { if (complete) {
JSON::writeDictionaryOpen(p, first, depth_outer); jw << "{";
} else { } else if (!first_key) {
first = first_key; jw << ",";
} }
JSON::writeDictionaryKey(p, first, "qpdf", depth_top); first_key = false;
bool first_qpdf = true;
JSON::writeArrayOpen(p, first_qpdf, depth_top); /* clang-format off */
JSON::writeNext(p, first_qpdf, depth_qpdf); jw << "\n"
bool first_qpdf_inner = true; " \"qpdf\": [\n"
JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf); " {\n"
JSON::writeDictionaryItem( " \"jsonversion\": " << std::to_string(version) << ",\n"
p, first_qpdf_inner, "jsonversion", JSON::makeInt(version), depth_qpdf_inner); " \"pdfversion\": \"" << getPDFVersion() << "\",\n"
JSON::writeDictionaryItem( " \"pushedinheritedpageresources\": " << (everPushedInheritedAttributesToPages() ? "true" : "false") << ",\n"
p, first_qpdf_inner, "pdfversion", JSON::makeString(getPDFVersion()), depth_qpdf_inner); " \"calledgetallpages\": " << (everCalledGetAllPages() ? "true" : "false") << ",\n"
JSON::writeDictionaryItem( " \"maxobjectid\": " << std::to_string(getObjectCount()) << "\n"
p, " },\n"
first_qpdf_inner, " {";
"pushedinheritedpageresources", /* clang-format on */
JSON::makeBool(everPushedInheritedAttributesToPages()),
depth_qpdf_inner);
JSON::writeDictionaryItem(
p,
first_qpdf_inner,
"calledgetallpages",
JSON::makeBool(everCalledGetAllPages()),
depth_qpdf_inner);
JSON::writeDictionaryItem(
p,
first_qpdf_inner,
"maxobjectid",
JSON::makeInt(QIntC::to_longlong(getObjectCount())),
depth_qpdf_inner);
JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf);
JSON::writeNext(p, first_qpdf, depth_qpdf);
JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf);
bool all_objects = wanted_objects.empty(); bool all_objects = wanted_objects.empty();
bool first = true;
for (auto& obj: getAllObjects()) { for (auto& obj: getAllObjects()) {
auto const og = obj.getObjGen(); auto const og = obj.getObjGen();
std::string key = "obj:" + og.unparse(' ') + " R"; std::string key = "obj:" + og.unparse(' ') + " R";
if (all_objects || wanted_objects.count(key)) { if (all_objects || wanted_objects.count(key)) {
if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) { if (first) {
writeJSONStream( jw << "\n \"" << key;
version, first = false;
p,
first_qpdf_inner,
key,
*stream,
og.getObj(),
decode_level,
json_stream_data,
file_prefix);
} else { } else {
writeJSONObject(version, p, first_qpdf_inner, key, obj); jw << "\n },\n \"" << key;
}
if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) {
jw << "\": {\n \"stream\": ";
if (json_stream_data == qpdf_sj_file) {
writeJSONStreamFile(
version, jw, *stream, og.getObj(), decode_level, file_prefix);
} else {
stream->writeStreamJSON(
version, jw, json_stream_data, decode_level, nullptr, "");
}
} else {
jw << "\": {\n \"value\": ";
obj.writeJSON(version, jw, true);
} }
} }
} }
if (all_objects || wanted_objects.count("trailer")) { if (all_objects || wanted_objects.count("trailer")) {
auto trailer = getTrailer(); if (!first) {
writeJSONObject(version, p, first_qpdf_inner, "trailer", trailer); jw << "\n },";
}
jw << "\n \"trailer\": {\n \"value\": ";
getTrailer().writeJSON(version, jw, true);
first = false;
} }
JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf); if (!first) {
JSON::writeArrayClose(p, first_qpdf, depth_top); jw << "\n }";
}
/* clang-format off */
jw << "\n"
" }\n"
" ]";
/* clang-format on */
if (complete) { if (complete) {
JSON::writeDictionaryClose(p, first, 0); jw << "\n}\n";
*p << "\n";
p->finish(); p->finish();
} }
first_key = false;
} }