diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF_Dictionary.cc | 17 | ||||
-rw-r--r-- | libqpdf/QPDF_json.cc | 4 |
2 files changed, 17 insertions, 4 deletions
diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc index 942e6d9e..f7e32fc9 100644 --- a/libqpdf/QPDF_Dictionary.cc +++ b/libqpdf/QPDF_Dictionary.cc @@ -3,6 +3,7 @@ #include <qpdf/QPDFObject_private.hh> #include <qpdf/QPDF_Name.hh> #include <qpdf/QPDF_Null.hh> +#include <qpdf/QUtil.hh> using namespace std::literals; @@ -72,9 +73,19 @@ QPDF_Dictionary::getJSON(int json_version) JSON j = JSON::makeDictionary(); for (auto& iter: this->items) { if (!iter.second.isNull()) { - std::string key = - (json_version == 1 ? QPDF_Name::normalizeName(iter.first) : iter.first); - j.addDictionaryMember(key, iter.second.getJSON(json_version)); + if (json_version == 1) { + j.addDictionaryMember( + QPDF_Name::normalizeName(iter.first), iter.second.getJSON(json_version)); + } else { + bool has_8bit_chars; + bool is_valid_utf8; + bool is_utf16; + QUtil::analyze_encoding(iter.first, has_8bit_chars, is_valid_utf8, is_utf16); + std::string key = !has_8bit_chars || is_valid_utf8 + ? iter.first + : "n:" + QPDF_Name::normalizeName(iter.first); + j.addDictionaryMember(key, iter.second.getJSON(json_version)); + } } } return j; diff --git a/libqpdf/QPDF_json.cc b/libqpdf/QPDF_json.cc index 7951b1e4..33211f14 100644 --- a/libqpdf/QPDF_json.cc +++ b/libqpdf/QPDF_json.cc @@ -666,7 +666,9 @@ QPDF::JSONReactor::dictionaryItem(std::string const& key, JSON const& value) if (dict.isStream()) { dict = dict.getDict(); } - dict.replaceKey(key, makeObject(value)); + dict.replaceKey( + is_pdf_name(key) ? QPDFObjectHandle::parse(key.substr(2)).getName() : key, + makeObject(value)); } } else { throw std::logic_error("QPDF_json: unknown state " + std::to_string(state)); |