Commit 532cc58d7e1ad73d2e724abb0bb21af90e791d30

Authored by Jay Berkenbilt
Committed by GitHub
2 parents aea885aa 8ff20b00

Merge pull request #1138 from m-holger/j_key

Allow "n:/pdf-syntax" JSON syntax for dictionary keys
libqpdf/QPDF_Dictionary.cc
... ... @@ -3,6 +3,7 @@
3 3 #include <qpdf/QPDFObject_private.hh>
4 4 #include <qpdf/QPDF_Name.hh>
5 5 #include <qpdf/QPDF_Null.hh>
  6 +#include <qpdf/QUtil.hh>
6 7  
7 8 using namespace std::literals;
8 9  
... ... @@ -72,9 +73,19 @@ QPDF_Dictionary::getJSON(int json_version)
72 73 JSON j = JSON::makeDictionary();
73 74 for (auto& iter: this->items) {
74 75 if (!iter.second.isNull()) {
75   - std::string key =
76   - (json_version == 1 ? QPDF_Name::normalizeName(iter.first) : iter.first);
77   - j.addDictionaryMember(key, iter.second.getJSON(json_version));
  76 + if (json_version == 1) {
  77 + j.addDictionaryMember(
  78 + QPDF_Name::normalizeName(iter.first), iter.second.getJSON(json_version));
  79 + } else {
  80 + bool has_8bit_chars;
  81 + bool is_valid_utf8;
  82 + bool is_utf16;
  83 + QUtil::analyze_encoding(iter.first, has_8bit_chars, is_valid_utf8, is_utf16);
  84 + std::string key = !has_8bit_chars || is_valid_utf8
  85 + ? iter.first
  86 + : "n:" + QPDF_Name::normalizeName(iter.first);
  87 + j.addDictionaryMember(key, iter.second.getJSON(json_version));
  88 + }
78 89 }
79 90 }
80 91 return j;
... ...
libqpdf/QPDF_json.cc
... ... @@ -666,7 +666,9 @@ QPDF::JSONReactor::dictionaryItem(std::string const&amp; key, JSON const&amp; value)
666 666 if (dict.isStream()) {
667 667 dict = dict.getDict();
668 668 }
669   - dict.replaceKey(key, makeObject(value));
  669 + dict.replaceKey(
  670 + is_pdf_name(key) ? QPDFObjectHandle::parse(key.substr(2)).getName() : key,
  671 + makeObject(value));
670 672 }
671 673 } else {
672 674 throw std::logic_error("QPDF_json: unknown state " + std::to_string(state));
... ...
qpdf/qtest/qpdf/weird-tokens-alt.json
... ... @@ -26,7 +26,8 @@
26 26 1e12
27 27 ],
28 28 "/Pages": "2 0 R",
29   - "/Type": "/Catalog"
  29 + "/Type": "/Catalog",
  30 + "n:/WeirdKey+#ba#da#cc#e5": 42
30 31 }
31 32 },
32 33 "obj:2 0 R": {
... ...
qpdf/qtest/qpdf/weird-tokens.json
... ... @@ -26,7 +26,8 @@
26 26 1000000000000
27 27 ],
28 28 "/Pages": "2 0 R",
29   - "/Type": "/Catalog"
  29 + "/Type": "/Catalog",
  30 + "n:/WeirdKey+#ba#da#cc#e5": 42
30 31 }
31 32 },
32 33 "obj:2 0 R": {
... ...
qpdf/qtest/qpdf/weird-tokens.pdf
... ... @@ -21,6 +21,7 @@
21 21 ]
22 22 /Pages 2 0 R
23 23 /Type /Catalog
  24 + /WeirdKey+#ba#da#cc#e5 42
24 25 >>
25 26 endobj
26 27  
... ... @@ -85,16 +86,16 @@ xref
85 86 0 7
86 87 0000000000 65535 f
87 88 0000000025 00000 n
88   -0000000361 00000 n
89   -0000000443 00000 n
90   -0000000639 00000 n
91   -0000000738 00000 n
92   -0000000757 00000 n
  89 +0000000389 00000 n
  90 +0000000471 00000 n
  91 +0000000667 00000 n
  92 +0000000766 00000 n
  93 +0000000785 00000 n
93 94 trailer <<
94 95 /Root 1 0 R
95 96 /Size 7
96 97 /ID [<42841c13bbf709d79a200fa1691836f8><728c020f464c3cf7e02c12605fa7d88b>]
97 98 >>
98 99 startxref
99   -863
  100 +891
100 101 %%EOF
... ...