aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2024-01-29 14:22:58 +0100
committerm-holger <m-holger@kubitscheck.org>2024-01-29 14:22:58 +0100
commit8ff20b00897acecc6908c98fab72db1c57692abb (patch)
tree43861ce541d68eee3bb7cc9f7cd85de86a22e386 /libqpdf
parent4660e23262fd3606d0b9ef7db9bcc315783b16e3 (diff)
downloadqpdf-8ff20b00897acecc6908c98fab72db1c57692abb.tar.zst
Allow "n:/pdf-syntax" JSON syntax for dictionary keys
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF_Dictionary.cc17
-rw-r--r--libqpdf/QPDF_json.cc4
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));