From 9379b768118f465e94f826bed1daacbbc94938fc Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 10 Feb 2024 19:26:40 +0000 Subject: [PATCH] Add additional name token JSON tests Also, test writing JSON v1 files and files with deeply nested containers. --- qpdf/qtest/qpdf-json.test | 10 +- qpdf/qtest/qpdf/weird-tokens-alt.json | 136 +++++++++++- qpdf/qtest/qpdf/weird-tokens-v1.json | 295 ++++++++++++++++++++++++++ qpdf/qtest/qpdf/weird-tokens.json | 136 +++++++++++- qpdf/qtest/qpdf/weird-tokens.pdf | 148 ++++++++++++- 5 files changed, 715 insertions(+), 10 deletions(-) create mode 100644 qpdf/qtest/qpdf/weird-tokens-v1.json diff --git a/qpdf/qtest/qpdf-json.test b/qpdf/qtest/qpdf-json.test index 9542bccf..defabbe7 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 += 4; +$n_tests += 6; $td->runtest("handle binary names", {$td->COMMAND => "qpdf --json-output weird-tokens.pdf a.json"}, @@ -371,6 +371,14 @@ $td->runtest("weird tokens with scientific notation", "qpdf --json-input --json-output weird-tokens-alt.json -"}, {$td->FILE => "weird-tokens.json", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +$td->runtest("handle binary names (JSON v1)", + {$td->COMMAND => + "qpdf --json=1 weird-tokens.pdf a.json"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("check json", + {$td->FILE => "a.json"}, + {$td->FILE => "weird-tokens-v1.json"}, + $td->NORMALIZE_NEWLINES); cleanup(); $td->report($n_tests); diff --git a/qpdf/qtest/qpdf/weird-tokens-alt.json b/qpdf/qtest/qpdf/weird-tokens-alt.json index 607bdd55..7fbff908 100644 --- a/qpdf/qtest/qpdf/weird-tokens-alt.json +++ b/qpdf/qtest/qpdf/weird-tokens-alt.json @@ -10,21 +10,155 @@ { "obj:1 0 R": { "value": { + "/Escape\\Key": 42, "/Extra": [ "u:Names with binary data", "n:/ABCDEF+#ba#da#cc#e5", "n:/OVERLONG+#c0#81", + "n:/OVERLONG+#c1#ff", + "/Ok+€", "n:/OVERLONG+#e0#81#82", + "n:/OVERLONG+#e0#9f#ff", + "/Ok+ࠀ", "n:/OVERLONG+#f0#81#82#83", + "n:/OVERLONG+#f0#8f#ff#ff", + "/Ok+𐀀", "n:/range+#01", "n:/low+#18", "/ABCEDEF+π", "n:/one+#a0two", "n:/text#2fplain", + "u:Names requiring escaping in JSON", + "/Back\\shlash", + "/Low\u0022", + "/Low\u001f", + "/ExceptSpace ", + "/Except!", "u:Very small/large reals", 1e-05, 1e12 ], + "/Nested": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": 42 + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, "/Pages": "2 0 R", "/Type": "/Catalog", "n:/WeirdKey+#ba#da#cc#e5": 42 @@ -78,7 +212,7 @@ "value": { "/ID": [ "b:42841c13bbf709d79a200fa1691836f8", - "b:728c020f464c3cf7e02c12605fa7d88b" + "b:31415926535897932384626433832795" ], "/Root": "1 0 R", "/Size": 7 diff --git a/qpdf/qtest/qpdf/weird-tokens-v1.json b/qpdf/qtest/qpdf/weird-tokens-v1.json new file mode 100644 index 00000000..8b8c194c --- /dev/null +++ b/qpdf/qtest/qpdf/weird-tokens-v1.json @@ -0,0 +1,295 @@ +{ + "version": 1, + "parameters": { + "decodelevel": "generalized" + }, + "pages": [ + { + "contents": [ + "4 0 R" + ], + "images": [], + "label": null, + "object": "3 0 R", + "outlines": [], + "pageposfrom1": 1 + } + ], + "pagelabels": [], + "acroform": { + "fields": [], + "hasacroform": false, + "needappearances": false + }, + "attachments": {}, + "encrypt": { + "capabilities": { + "accessibility": true, + "extract": true, + "moddifyannotations": true, + "modify": true, + "modifyassembly": true, + "modifyforms": true, + "modifyother": true, + "printhigh": true, + "printlow": true + }, + "encrypted": false, + "ownerpasswordmatched": false, + "parameters": { + "P": 0, + "R": 0, + "V": 0, + "bits": 0, + "filemethod": "none", + "key": null, + "method": "none", + "streammethod": "none", + "stringmethod": "none" + }, + "recovereduserpassword": null, + "userpasswordmatched": false + }, + "outlines": [], + "objects": { + "1 0 R": { + "/Escape\\Key": 42, + "/Extra": [ + "Names with binary data", + "/ABCDEF+#ba#da#cc#e5", + "/OVERLONG+#c0#81", + "/OVERLONG+#c1#ff", + "/Ok+#c2#80", + "/OVERLONG+#e0#81#82", + "/OVERLONG+#e0#9f#ff", + "/Ok+#e0#a0#80", + "/OVERLONG+#f0#81#82#83", + "/OVERLONG+#f0#8f#ff#ff", + "/Ok+#f0#90#80#80", + "/range+#01", + "/low+#18", + "/ABCEDEF+#cf#80", + "/one+#a0two", + "/text#2fplain", + "Names requiring escaping in JSON", + "/Back\\shlash", + "/Low\"", + "/Low#1f", + "/ExceptSpace#20", + "/Except!", + "Very small/large reals", + 0.00001, + 1000000000000 + ], + "/Nested": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": 42 + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/Pages": "2 0 R", + "/Type": "/Catalog", + "/WeirdKey+#ba#da#cc#e5": 42 + }, + "2 0 R": { + "/Count": 1, + "/Kids": [ + "3 0 R" + ], + "/Type": "/Pages" + }, + "3 0 R": { + "/Contents": "4 0 R", + "/MediaBox": [ + 0, + 0, + 612, + 792 + ], + "/Parent": "2 0 R", + "/Resources": { + "/Font": { + "/F1": "6 0 R" + } + }, + "/Type": "/Page" + }, + "4 0 R": { + "/Length": "5 0 R" + }, + "5 0 R": 44, + "6 0 R": { + "/BaseFont": "/Helvetica", + "/Encoding": "/WinAnsiEncoding", + "/Subtype": "/Type1", + "/Type": "/Font" + }, + "trailer": { + "/ID": [ + "B—˝\u0013»÷\t×ı \u000f¡i˘6ø", + "1AY&SXŠfi#—bd3…'Ł" + ], + "/Root": "1 0 R", + "/Size": 7 + } + }, + "objectinfo": { + "1 0 R": { + "stream": { + "filter": null, + "is": false, + "length": null + } + }, + "2 0 R": { + "stream": { + "filter": null, + "is": false, + "length": null + } + }, + "3 0 R": { + "stream": { + "filter": null, + "is": false, + "length": null + } + }, + "4 0 R": { + "stream": { + "filter": null, + "is": true, + "length": 44 + } + }, + "5 0 R": { + "stream": { + "filter": null, + "is": false, + "length": null + } + }, + "6 0 R": { + "stream": { + "filter": null, + "is": false, + "length": null + } + } + } +} diff --git a/qpdf/qtest/qpdf/weird-tokens.json b/qpdf/qtest/qpdf/weird-tokens.json index 6aca6a5a..4ad926e7 100644 --- a/qpdf/qtest/qpdf/weird-tokens.json +++ b/qpdf/qtest/qpdf/weird-tokens.json @@ -10,21 +10,155 @@ { "obj:1 0 R": { "value": { + "/Escape\\Key": 42, "/Extra": [ "u:Names with binary data", "n:/ABCDEF+#ba#da#cc#e5", "n:/OVERLONG+#c0#81", + "n:/OVERLONG+#c1#ff", + "/Ok+€", "n:/OVERLONG+#e0#81#82", + "n:/OVERLONG+#e0#9f#ff", + "/Ok+ࠀ", "n:/OVERLONG+#f0#81#82#83", + "n:/OVERLONG+#f0#8f#ff#ff", + "/Ok+𐀀", "/range+\u0001", "/low+\u0018", "/ABCEDEF+π", "n:/one+#a0two", "/text/plain", + "u:Names requiring escaping in JSON", + "/Back\\shlash", + "/Low\"", + "/Low\u001f", + "/ExceptSpace ", + "/Except!", "u:Very small/large reals", 0.00001, 1000000000000 ], + "/Nested": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": { + "/1": { + "/2": { + "/3": { + "/4": { + "/5": { + "/6": { + "/7": { + "/8": { + "/9": { + "/10": 42 + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, "/Pages": "2 0 R", "/Type": "/Catalog", "n:/WeirdKey+#ba#da#cc#e5": 42 @@ -78,7 +212,7 @@ "value": { "/ID": [ "b:42841c13bbf709d79a200fa1691836f8", - "b:728c020f464c3cf7e02c12605fa7d88b" + "b:31415926535897932384626433832795" ], "/Root": "1 0 R", "/Size": 7 diff --git a/qpdf/qtest/qpdf/weird-tokens.pdf b/qpdf/qtest/qpdf/weird-tokens.pdf index 27415a46..c49a046f 100644 --- a/qpdf/qtest/qpdf/weird-tokens.pdf +++ b/qpdf/qtest/qpdf/weird-tokens.pdf @@ -4,21 +4,155 @@ 1 0 obj << + /Escape\Key 42 /Extra [ (Names with binary data) /ABCDEF+#ba#da#cc#e5 /OVERLONG+#c0#81 + /OVERLONG+#c1#ff + /Ok+#c2#80 /OVERLONG+#e0#81#82 + /OVERLONG+#e0#9f#ff + /Ok+#e0#a0#80 /OVERLONG+#f0#81#82#83 + /OVERLONG+#f0#8f#ff#ff + /Ok+#f0#90#80#80 /range+#01 /low+#18 /ABCEDEF+#cf#80 /one+#a0two /text#2fplain + (Names requiring escaping in JSON) + /Back\shlash + /Low" + /Low#1f + /ExceptSpace#20 + /Except! (Very small/large reals) 0.00001 1000000000000 ] + /Nested << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 << + /1 << + /2 << + /3 << + /4 << + /5 << + /6 << + /7 << + /8 << + /9 << + /10 42 + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> + >> /Pages 2 0 R /Type /Catalog /WeirdKey+#ba#da#cc#e5 42 @@ -86,16 +220,16 @@ xref 0 7 0000000000 65535 f 0000000025 00000 n -0000000389 00000 n -0000000471 00000 n -0000000667 00000 n -0000000766 00000 n -0000000785 00000 n +0000008642 00000 n +0000008724 00000 n +0000008920 00000 n +0000009019 00000 n +0000009038 00000 n trailer << /Root 1 0 R /Size 7 - /ID [<42841c13bbf709d79a200fa1691836f8><728c020f464c3cf7e02c12605fa7d88b>] + /ID [<42841c13bbf709d79a200fa1691836f8><31415926535897932384626433832795>] >> startxref -891 +9144 %%EOF