2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-29 08:20:53 +00:00

Major rework -- see long comments

* Replace --create-from-json=file with --json-input, which causes the
  regular input to be treated as json.
* Eliminate --to-json
* In --json=2, bring back "objects" and eliminate "objectinfo". Stream
  data is never present.
* In --json-output=2, write "qpdf-v2" with "objects" and include
  stream data.
This commit is contained in:
Jay Berkenbilt 2022-05-18 18:22:57 -04:00
parent 23fc6756f1
commit 6f43bf8de3
89 changed files with 13633 additions and 15368 deletions

73
TODO
View File

@ -54,6 +54,10 @@ Soon: Break ground on "Document-level work"
Output JSON v2 Output JSON v2
============== ==============
Some of this documentation has drifted from the actual implementation.
Make sure pages tree repair generates warnings.
* Reread from perspective of update * Reread from perspective of update
* Test all ignore cases with QTC * Test all ignore cases with QTC
* Test case of correct file with dict before data/datafile * Test case of correct file with dict before data/datafile
@ -62,6 +66,7 @@ Output JSON v2
after creation. after creation.
* Test invalid data, invalid data file * Test invalid data, invalid data file
* Tests: round-trip through json, round-trip through qpdf --qdf * Tests: round-trip through json, round-trip through qpdf --qdf
* Test to see if we get CR/NL on Windows, which is okay
Try to never flatten pages tree. Make sure we do something reasonable Try to never flatten pages tree. Make sure we do something reasonable
with pages tree repair. The problem is that if pages tree repair is with pages tree repair. The problem is that if pages tree repair is
@ -75,6 +80,9 @@ General things to remember:
* Make sure all the information from --check and other informational * Make sure all the information from --check and other informational
options (--show-linearization, --show-encryption, --show-xref, options (--show-linearization, --show-encryption, --show-xref,
--list-attachments, --show-npages) is available in the json output. --list-attachments, --show-npages) is available in the json output.
Consider having --check, --show-encryption, etc., just select the
right keys when in json mode. I don't think I want check on by
default, so that might be different.
* Consider changing the contract to allow fields to be absent even * Consider changing the contract to allow fields to be absent even
when present in the schema. It's reasonable for people to check for when present in the schema. It's reasonable for people to check for
@ -95,41 +103,32 @@ General things to remember:
JSON to PDF: JSON to PDF:
Have --create-from-json and --update-from-json. With Have --json-input and --update-from-json. With --json-input, the json
--create-from-json, the json file must be complete, meaning all stream file must be complete, meaning all stream data, the trailer, and the
data, the trailer, and the PDF version must be present. In PDF version must be present. In --update-from-json, an object
--update-from-json, an object explicitly set to null (not "value": explicitly set to null (not "value": null) is deleted. For streams
null) is deleted. For streams with no stream data, the dictionary is with no stream data, the dictionary is updated but the data is left
updated but the data is left untouched. Other things that are omitted untouched. Other things that are omitted are left alone. Make sure
are left alone. Make sure document that, when writing a PDF file from document that, when writing a PDF file from QPDF, there is no
QPDF, there is no expectation of object numbers being preserved. As expectation of object numbers being preserved. As such,
such, --update-from-json can only be used to update the exact file --update-from-json can only be used to update the exact file that the
that the json was created from. You can put multiple objects in the json was created from. You can put multiple objects in the update
update file, but you can't use a json from one file to update the file, but you can't use a json from one file to update the output of a
output of a previous update since the object numbers will have previous update since the object numbers will have changed. Note that,
changed. Note that, when creating from a JSON, object numbers are when creating from a JSON, object numbers are preserved in the
preserved in the resulting QPDF object but still modified by resulting QPDF object but still modified by QPDFWriter for the output.
QPDFWriter for the output. This would be visible by combining This would be visible by combining --json-output and --json-input.
--to-json and --create-from-json. Also using --qdf with Also using --qdf with --create-from-json would show original object
--create-from-json would show original object IDs in comments. It will IDs in comments. It will be important to capture this in the
be important to capture this in the documentation. documentation.
When reading a JSON string, any string that doesn't look like a name When reading a JSON string, any string that doesn't look like a name
or indirect object or start with "b:" or "u:" should be considered an or indirect object or start with "b:" or "u:" should be considered an
error. Just use newUnicodeString on "u:" strings. For "b:" strings, error. Just use newUnicodeString on "u:" strings. For "b:" strings,
decode the bytes with hex_decode and use newString. decode the bytes with hex_decode and use newString.
For going back from JSON to PDF, we can have Test case: combine --json-input and --json-output to show preservation
QPDF::createFromJSON(std::shared_ptr<InputSource>) of object numbers. QPDFWriter won't show that although --qdf with the
which will have logic similar to copyForeignObject. Note that this
InputSource is not going to be this->file. We have to keep it
separately. There's also non-static QPDF::updateFromJSON. Both
createFromJSON and updateFromJSON will call the same internal method
with different options. That method will use a reactor that is a
private QPDF class that just proxies to private QPDF methods.
Test case: combine --create-from-json and --to-json to preservation of
object numbers. QPDFWriter won't show that although --qdf with the
original object ID comments would. original object ID comments would.
The backing input source for createFromJSON is this memory block: The backing input source for createFromJSON is this memory block:
@ -145,8 +144,7 @@ startxref
%%EOF %%EOF
``` ```
* Ignore all keys except .qpdf. * Ignore all keys except .qpdf-v2.
* Verify that .qpdf.jsonVersion is 2
* Set this->m->pdf_version based on the .qpdf.pdfVersion key * Set this->m->pdf_version based on the .qpdf.pdfVersion key
* For each object in .qpdf.objects: * For each object in .qpdf.objects:
* Walk through the object detecting any indirect objects. For each * Walk through the object detecting any indirect objects. For each
@ -170,15 +168,14 @@ Documentation:
Serialized PDF: Serialized PDF:
The JSON output will have a "qpdf" key containing The JSON output will have a "qpdf-v2" key containing
* jsonversion
* pdfversion * pdfversion
* maxobjectid * maxobjectid
* objects * objects
The "qpdf" key replaces "objects" and "objectinfo" in v1 JSON. In regular json mode, "objectinfo" is gone.
Within .qpdf.objects, the key is "obj:o g R" or "trailer", and the Within .objects, the key is "obj:o g R" or "trailer", and the
value is a dictionary with exactly one of "value" or "stream" as its value is a dictionary with exactly one of "value" or "stream" as its
single key. single key.
@ -222,11 +219,11 @@ for when the file is read back in.
CLI: CLI:
Example workflow: Example workflow:
* qpdf in.pdf --to-json > pdf.json * qpdf in.pdf --json-output=2 pdf.json
* edit pdf.json * edit pdf.json
* qpdf --create-from-json=pdf.json out.pdf * qpdf --json-input pdf.json out.pdf
* qpdf in.pdf --to-json > pdf.json * qpdf in.pdf --json-output=2 pdf.json
* edit pdf.json keeping only objects that need to be changed * edit pdf.json keeping only objects that need to be changed
* qpdf in.pdf --update-from-json=pdf.json out.pdf * qpdf in.pdf --update-from-json=pdf.json out.pdf

View File

@ -111,23 +111,38 @@ class QPDF
processInputSource(std::shared_ptr<InputSource>, char const* password = 0); processInputSource(std::shared_ptr<InputSource>, char const* password = 0);
// Create a PDF from an input source that contains JSON as written // Create a PDF from an input source that contains JSON as written
// by qpdf --json (version 2 or higher). The JSON must be a // by writeJSON (or qpdf --json-output, version 2 or higher). The
// complete representation of a PDF. See "QPDF JSON Format" in the // JSON must be a complete representation of a PDF. See "QPDF JSON
// manual for details. // Format" in the manual for details.
QPDF_DLL QPDF_DLL
void createFromJSON(std::string const& json_file); void createFromJSON(std::string const& json_file);
QPDF_DLL QPDF_DLL
void createFromJSON(std::shared_ptr<InputSource>); void createFromJSON(std::shared_ptr<InputSource>);
// Update a PDF from an input source that contains JSON in the // Update a PDF from an input source that contains JSON in the
// same format as is written by qpdf --json (version 2 or higher). // same format as is written by writeJSON (or qpdf --json-output,
// Objects in the PDF and not in the JSON are not modified. See // version 2 or higher). Objects in the PDF and not in the JSON
// "QPDF JSON Format" in the manual for details. // are not modified. See "QPDF JSON Format" in the manual for
// details.
QPDF_DLL QPDF_DLL
void updateFromJSON(std::string const& json_file); void updateFromJSON(std::string const& json_file);
QPDF_DLL QPDF_DLL
void updateFromJSON(std::shared_ptr<InputSource>); void updateFromJSON(std::shared_ptr<InputSource>);
// Write qpdf json format. The only supported version is 2. If
// wanted_objects is empty, write all objects. Otherwise, write
// only objects whose keys are in wanted_objects. Keys may be
// either "trailer" or of the form "obj:n n R". Invalid keys are
// ignored.
QPDF_DLL
void writeJSON(
int version,
Pipeline*,
qpdf_stream_decode_level_e,
qpdf_json_stream_data_e,
std::string const& file_prefix,
std::set<std::string> wanted_objects);
// Close or otherwise release the input source. Once this has been // Close or otherwise release the input source. Once this has been
// called, no other methods of qpdf can be called safely except // called, no other methods of qpdf can be called safely except
// for getWarnings and anyWarnings(). After this has been called, // for getWarnings and anyWarnings(). After this has been called,
@ -1040,7 +1055,6 @@ class QPDF
bool parse_error; bool parse_error;
bool saw_qpdf; bool saw_qpdf;
bool saw_objects; bool saw_objects;
bool saw_json_version;
bool saw_pdf_version; bool saw_pdf_version;
bool saw_trailer; bool saw_trailer;
state_e state; state_e state;
@ -1571,6 +1585,23 @@ class QPDF
// JSON import // JSON import
void importJSON(std::shared_ptr<InputSource>, bool must_be_complete); void importJSON(std::shared_ptr<InputSource>, bool must_be_complete);
// JSON write
void writeJSONStream(
int version,
Pipeline* p,
bool& first,
std::string const& key,
QPDFObjectHandle&,
qpdf_stream_decode_level_e,
qpdf_json_stream_data_e,
std::string const& file_prefix);
void writeJSONObject(
int version,
Pipeline* p,
bool& first,
std::string const& key,
QPDFObjectHandle&);
// Type conversion helper methods // Type conversion helper methods
template <typename T> template <typename T>
static qpdf_offset_t static qpdf_offset_t

View File

@ -323,8 +323,6 @@ class QPDFJob
Config* outputFile(std::string const& filename); Config* outputFile(std::string const& filename);
QPDF_DLL QPDF_DLL
Config* replaceInput(); Config* replaceInput();
QPDF_DLL
Config* createFromJson(std::string const& filename);
QPDF_DLL QPDF_DLL
std::shared_ptr<CopyAttConfig> copyAttachmentsFrom(); std::shared_ptr<CopyAttConfig> copyAttachmentsFrom();
@ -455,7 +453,10 @@ class QPDFJob
// Basic file processing // Basic file processing
std::shared_ptr<QPDF> processFile( std::shared_ptr<QPDF> processFile(
char const* filename, char const* password, bool used_for_input); char const* filename,
char const* password,
bool used_for_input,
bool main_input);
std::shared_ptr<QPDF> processInputSource( std::shared_ptr<QPDF> processInputSource(
std::shared_ptr<InputSource> is, std::shared_ptr<InputSource> is,
char const* password, char const* password,
@ -464,12 +465,14 @@ class QPDFJob
std::function<void(QPDF*, char const*)> fn, std::function<void(QPDF*, char const*)> fn,
char const* password, char const* password,
bool empty, bool empty,
bool used_for_input); bool used_for_input,
bool main_input);
std::shared_ptr<QPDF> doProcessOnce( std::shared_ptr<QPDF> doProcessOnce(
std::function<void(QPDF*, char const*)> fn, std::function<void(QPDF*, char const*)> fn,
char const* password, char const* password,
bool empty, bool empty,
bool used_for_input); bool used_for_input,
bool main_input);
// Transformations // Transformations
void setQPDFOptions(QPDF& pdf); void setQPDFOptions(QPDF& pdf);
@ -511,31 +514,21 @@ class QPDFJob
void setEncryptionOptions(QPDF&, QPDFWriter&); void setEncryptionOptions(QPDF&, QPDFWriter&);
void maybeFixWritePassword(int R, std::string& password); void maybeFixWritePassword(int R, std::string& password);
void writeOutfile(QPDF& pdf); void writeOutfile(QPDF& pdf);
void writeJSON(QPDF& pdf);
// JSON // JSON
void doJSON(QPDF& pdf, Pipeline*); void doJSON(QPDF& pdf, Pipeline*);
std::set<QPDFObjGen> getWantedJSONObjects(); std::set<QPDFObjGen> getWantedJSONObjects();
void doJSONObject(
Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle&);
void doJSONObjects(Pipeline* p, bool& first, QPDF& pdf); void doJSONObjects(Pipeline* p, bool& first, QPDF& pdf);
void doJSONObjectinfo(Pipeline* p, bool& first, QPDF& pdf); void doJSONObjectinfo(Pipeline* p, bool& first, QPDF& pdf);
void doJSONQpdf(Pipeline* p, bool& first, QPDF& pdf);
void doJSONPages(Pipeline* p, bool& first, QPDF& pdf); void doJSONPages(Pipeline* p, bool& first, QPDF& pdf);
void doJSONPageLabels(Pipeline* p, bool& first, QPDF& pdf); void doJSONPageLabels(Pipeline* p, bool& first, QPDF& pdf);
void doJSONOutlines(Pipeline* p, bool& first, QPDF& pdf); void doJSONOutlines(Pipeline* p, bool& first, QPDF& pdf);
void doJSONAcroform(Pipeline* p, bool& first, QPDF& pdf); void doJSONAcroform(Pipeline* p, bool& first, QPDF& pdf);
void doJSONEncrypt(Pipeline* p, bool& first, QPDF& pdf); void doJSONEncrypt(Pipeline* p, bool& first, QPDF& pdf);
void doJSONAttachments(Pipeline* p, bool& first, QPDF& pdf); void doJSONAttachments(Pipeline* p, bool& first, QPDF& pdf);
void doJSONStream(
Pipeline* p,
bool& first,
QPDF& pdf,
QPDFObjectHandle& obj,
std::string const& file_prefix);
void doJSONObject(
Pipeline* p,
bool& first,
QPDF& pdf,
std::string const& key,
QPDFObjectHandle& obj);
void addOutlinesToJson( void addOutlinesToJson(
std::vector<QPDFOutlineObjectHelper> outlines, std::vector<QPDFOutlineObjectHelper> outlines,
JSON& j, JSON& j,
@ -654,6 +647,7 @@ class QPDFJob
std::set<std::string> json_keys; std::set<std::string> json_keys;
std::set<std::string> json_objects; std::set<std::string> json_objects;
qpdf_json_stream_data_e json_stream_data; qpdf_json_stream_data_e json_stream_data;
bool json_stream_data_set;
std::string json_stream_prefix; std::string json_stream_prefix;
bool test_json_schema; bool test_json_schema;
bool check; bool check;
@ -676,7 +670,8 @@ class QPDFJob
bool check_requires_password; bool check_requires_password;
std::shared_ptr<char> infilename; std::shared_ptr<char> infilename;
std::shared_ptr<char> outfilename; std::shared_ptr<char> outfilename;
std::string create_from_json; bool json_input;
int json_output;
std::string update_from_json; std::string update_from_json;
}; };
std::shared_ptr<Members> m; std::shared_ptr<Members> m;

View File

@ -17,6 +17,7 @@ QPDF_DLL Config* flattenRotation();
QPDF_DLL Config* generateAppearances(); QPDF_DLL Config* generateAppearances();
QPDF_DLL Config* ignoreXrefStreams(); QPDF_DLL Config* ignoreXrefStreams();
QPDF_DLL Config* isEncrypted(); QPDF_DLL Config* isEncrypted();
QPDF_DLL Config* jsonInput();
QPDF_DLL Config* keepInlineImages(); QPDF_DLL Config* keepInlineImages();
QPDF_DLL Config* linearize(); QPDF_DLL Config* linearize();
QPDF_DLL Config* listAttachments(); QPDF_DLL Config* listAttachments();
@ -44,7 +45,6 @@ QPDF_DLL Config* staticId();
QPDF_DLL Config* suppressPasswordRecovery(); QPDF_DLL Config* suppressPasswordRecovery();
QPDF_DLL Config* suppressRecovery(); QPDF_DLL Config* suppressRecovery();
QPDF_DLL Config* testJsonSchema(); QPDF_DLL Config* testJsonSchema();
QPDF_DLL Config* toJson();
QPDF_DLL Config* verbose(); QPDF_DLL Config* verbose();
QPDF_DLL Config* warningExit0(); QPDF_DLL Config* warningExit0();
QPDF_DLL Config* withImages(); QPDF_DLL Config* withImages();
@ -77,12 +77,13 @@ QPDF_DLL Config* compressStreams(std::string const& parameter);
QPDF_DLL Config* decodeLevel(std::string const& parameter); QPDF_DLL Config* decodeLevel(std::string const& parameter);
QPDF_DLL Config* flattenAnnotations(std::string const& parameter); QPDF_DLL Config* flattenAnnotations(std::string const& parameter);
QPDF_DLL Config* jsonKey(std::string const& parameter); QPDF_DLL Config* jsonKey(std::string const& parameter);
QPDF_DLL Config* jsonOutput(std::string const& parameter);
QPDF_DLL Config* jsonStreamData(std::string const& parameter);
QPDF_DLL Config* keepFilesOpen(std::string const& parameter); QPDF_DLL Config* keepFilesOpen(std::string const& parameter);
QPDF_DLL Config* normalizeContent(std::string const& parameter); QPDF_DLL Config* normalizeContent(std::string const& parameter);
QPDF_DLL Config* objectStreams(std::string const& parameter); QPDF_DLL Config* objectStreams(std::string const& parameter);
QPDF_DLL Config* passwordMode(std::string const& parameter); QPDF_DLL Config* passwordMode(std::string const& parameter);
QPDF_DLL Config* removeUnreferencedResources(std::string const& parameter); QPDF_DLL Config* removeUnreferencedResources(std::string const& parameter);
QPDF_DLL Config* streamData(std::string const& parameter); QPDF_DLL Config* streamData(std::string const& parameter);
QPDF_DLL Config* jsonStreamData(std::string const& parameter);
QPDF_DLL Config* json(std::string const& parameter); QPDF_DLL Config* json(std::string const& parameter);
QPDF_DLL Config* json(); QPDF_DLL Config* json();

View File

@ -3,15 +3,15 @@ generate_auto_job 0514289f2deb3bf7c1a6e85ef7d99ad120321ef5a6fe49d76c5274c6a658d3
include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4 include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4
include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42 include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42
include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5 include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5
include/qpdf/auto_job_c_main.hh 178a0c98c80d53036910ec67165dbc3902aa8da857de8a0df52911f005918c54 include/qpdf/auto_job_c_main.hh c21395ba79b98b3054f6d73266285d216b77568ea55ca7149d3e6a157604d682
include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec
include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1
job.yml a95b2446066293f409b36032a0ee411dbe570a7a94f5fd295048d009215f993f job.yml feae32412cc75f84fb9ff7521121466f9582e85547f45613c3a7083a929f01e6
libqpdf/qpdf/auto_job_decl.hh 833bde9c1f8fc17b914f16498e26d9d1315361645b4ac5c50c1f830a76618ca7 libqpdf/qpdf/auto_job_decl.hh 74df4d7fdbdf51ecd0d58ce1e9844bb5525b9adac5a45f7c9a787ecdda2868df
libqpdf/qpdf/auto_job_help.hh 38bf89067ca7dc244e4e697c598ba0ba8a827600a78b9195fc69f0ac1663f3a2 libqpdf/qpdf/auto_job_help.hh 5ca1d2b73f6a70f1ef47896b49553ae8ded4a6459bbb1f6697947e2cc598d799
libqpdf/qpdf/auto_job_init.hh f0ffab312430b232a7288b8443382ed859021e6ad6ed2c8c9a4dbbd2b33e2aa7 libqpdf/qpdf/auto_job_init.hh 3acc779ff96bde839c8c95a844145df830c53ee58fbf61b8ce056a1751bc11f2
libqpdf/qpdf/auto_job_json_decl.hh 81d09d4b82b2e042a64246ed1d7a187bdc83b671b45e7b8ee60ad37c0c11e9a7 libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297
libqpdf/qpdf/auto_job_json_init.hh 2fcdae08365abe351d2dfb6a823e2b3af27a6510632de23cabef6cefa5dfb199 libqpdf/qpdf/auto_job_json_init.hh 0441fd710ded1512a84976b542910fec16e8b9ab665e5efb5b37c5a29fd8654f
libqpdf/qpdf/auto_job_schema.hh 1a80be3b8d97e9b5a55b8aa45a4b312668b1687eab6f038c4ee5f4662ab71997 libqpdf/qpdf/auto_job_schema.hh 9d543cd4a43eafffc2c4b8a6fee29e399c271c52cb6f7d417ae5497b3c1127dc
manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580
manual/cli.rst 4550dd1b459721d8ef9affa7c9c07f351a06379498ec1291f702f1a5994b6d84 manual/cli.rst 3d133669f2b1f845bbc09e51e5b6fff6dd8803282b71aff0db2c55878b1ec508

25
job.yml
View File

@ -36,10 +36,6 @@ choices:
- all - all
- print - print
- screen - screen
json_version:
- 1
- 2
- latest
json_key: json_key:
# The list of selectable top-level keys id duplicated in the # The list of selectable top-level keys id duplicated in the
# following places: job.yml, QPDFJob::json_schema, and # following places: job.yml, QPDFJob::json_schema, and
@ -48,15 +44,21 @@ choices:
- attachments - attachments
- encrypt - encrypt
- objectinfo # only v1 - objectinfo # only v1
- objects # only v1 - objects
- outlines - outlines
- pagelabels - pagelabels
- pages - pages
- qpdf # only v2 json_output:
- 2
- latest
json_stream_data: json_stream_data:
- none - none
- inline - inline
- file - file
json_version:
- 1
- 2
- latest
print128: print128:
- full - full
- low - low
@ -86,7 +88,6 @@ options:
- underlay - underlay
- empty - empty
- replace-input - replace-input
- create-from-json
positional: true positional: true
bare: bare:
- add-attachment - add-attachment
@ -105,6 +106,7 @@ options:
- generate-appearances - generate-appearances
- ignore-xref-streams - ignore-xref-streams
- is-encrypted - is-encrypted
- json-input
- keep-inline-images - keep-inline-images
- linearize - linearize
- list-attachments - list-attachments
@ -135,7 +137,6 @@ options:
- suppress-password-recovery - suppress-password-recovery
- suppress-recovery - suppress-recovery
- test-json-schema - test-json-schema
- to-json
- underlay - underlay
- verbose - verbose
- warning-exit-0 - warning-exit-0
@ -164,20 +165,20 @@ options:
show-attachment: attachment show-attachment: attachment
show-object: trailer show-object: trailer
json-stream-prefix: stream-file-prefix json-stream-prefix: stream-file-prefix
create-from-json: qpdf-json file
update-from-json: qpdf-json file update-from-json: qpdf-json file
required_choices: required_choices:
compress-streams: yn compress-streams: yn
decode-level: decode_level decode-level: decode_level
flatten-annotations: flatten flatten-annotations: flatten
json-key: json_key json-key: json_key
json-output: json_output
json-stream-data: json_stream_data
keep-files-open: yn keep-files-open: yn
normalize-content: yn normalize-content: yn
object-streams: object_streams object-streams: object_streams
password-mode: password_mode password-mode: password_mode
remove-unreferenced-resources: remove_unref remove-unreferenced-resources: remove_unref
stream-data: stream_data stream-data: stream_data
json-stream-data: json_stream_data
optional_choices: optional_choices:
json: json_version json: json_version
- table: pages - table: pages
@ -281,7 +282,7 @@ json:
main.password: main.password:
password-file: password-file:
empty: empty:
create-from-json: json-input:
# output # output
_outputFile: "output filename" _outputFile: "output filename"
replace-input: replace-input:
@ -308,6 +309,7 @@ json:
force-version: force-version:
progress: progress:
split-pages: split-pages:
json-output:
encrypt: encrypt:
_user-password: "user password" _user-password: "user password"
_owner-password: "owner password" _owner-password: "owner password"
@ -362,7 +364,6 @@ json:
- null - null
json-stream-data: json-stream-data:
json-stream-prefix: json-stream-prefix:
to-json:
# other options # other options
update-from-json: update-from-json:
allow-weak-crypto: allow-weak-crypto:

View File

@ -402,6 +402,7 @@ QPDFJob::Members::Members() :
list_attachments(false), list_attachments(false),
json_version(0), json_version(0),
json_stream_data(qpdf_sj_none), json_stream_data(qpdf_sj_none),
json_stream_data_set(false),
test_json_schema(false), test_json_schema(false),
check(false), check(false),
optimize_images(false), optimize_images(false),
@ -418,7 +419,9 @@ QPDFJob::Members::Members() :
require_outfile(true), require_outfile(true),
replace_input(false), replace_input(false),
check_is_encrypted(false), check_is_encrypted(false),
check_requires_password(false) check_requires_password(false),
json_input(false),
json_output(0)
{ {
} }
@ -533,7 +536,8 @@ QPDFJob::run()
checkConfiguration(); checkConfiguration();
std::shared_ptr<QPDF> pdf_ph; std::shared_ptr<QPDF> pdf_ph;
try { try {
pdf_ph = processFile(m->infilename.get(), m->password.get(), true); pdf_ph =
processFile(m->infilename.get(), m->password.get(), true, true);
} catch (QPDFExc& e) { } catch (QPDFExc& e) {
if ((e.getErrorCode() == qpdf_e_password) && if ((e.getErrorCode() == qpdf_e_password) &&
(m->check_is_encrypted || m->check_requires_password)) { (m->check_is_encrypted || m->check_requires_password)) {
@ -704,15 +708,8 @@ QPDFJob::checkConfiguration()
" overwrite the input file"); " overwrite the input file");
} }
if (m->json_version == 1) { if (m->json_keys.count("objectinfo")) {
if (m->json_keys.count("qpdf")) { usage("json key \"objectinfo\" is only valid for json version 1");
usage("json key \"qpdf\" is not valid for json version 1");
}
} else {
if (m->json_keys.count("objects") || m->json_keys.count("objectinfo")) {
usage("json keys \"objects\" and \"objectinfo\" are only valid for "
"json version 1");
}
} }
} }
@ -1060,6 +1057,26 @@ QPDFJob::getWantedJSONObjects()
return wanted_og; return wanted_og;
} }
void
QPDFJob::doJSONObject(
Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj)
{
if (this->m->json_version == 1) {
JSON::writeDictionaryItem(p, first, key, obj.getJSON(1, true), 1);
} else {
auto j = JSON::makeDictionary();
if (obj.isStream()) {
j.addDictionaryMember("stream", JSON::makeDictionary())
.addDictionaryMember(
"dict", obj.getDict().getJSON(this->m->json_version, true));
} else {
j.addDictionaryMember(
"value", obj.getJSON(this->m->json_version, true));
}
JSON::writeDictionaryItem(p, first, key, j, 1);
}
}
void void
QPDFJob::doJSONObjects(Pipeline* p, bool& first, QPDF& pdf) QPDFJob::doJSONObjects(Pipeline* p, bool& first, QPDF& pdf)
{ {
@ -1070,22 +1087,17 @@ QPDFJob::doJSONObjects(Pipeline* p, bool& first, QPDF& pdf)
std::set<QPDFObjGen> wanted_og = getWantedJSONObjects(); std::set<QPDFObjGen> wanted_og = getWantedJSONObjects();
std::vector<QPDFObjectHandle> objects = pdf.getAllObjects(); std::vector<QPDFObjectHandle> objects = pdf.getAllObjects();
for (auto& obj: objects) { for (auto& obj: objects) {
std::string key = obj.unparse();
if (this->m->json_version > 1) {
key = "obj:" + key;
}
if (all_objects || wanted_og.count(obj.getObjGen())) { if (all_objects || wanted_og.count(obj.getObjGen())) {
JSON::writeDictionaryItem( doJSONObject(p, first_object, key, obj);
p,
first_object,
obj.unparse(),
obj.getJSON(this->m->json_version, true),
1);
} }
} }
if (all_objects || m->json_objects.count("trailer")) { if (all_objects || m->json_objects.count("trailer")) {
JSON::writeDictionaryItem( auto trailer = pdf.getTrailer();
p, doJSONObject(p, first_object, "trailer", trailer);
first_object,
"trailer",
pdf.getTrailer().getJSON(this->m->json_version, true),
1);
} }
JSON::writeDictionaryClose(p, first_object, 1); JSON::writeDictionaryClose(p, first_object, 1);
} }
@ -1122,108 +1134,6 @@ QPDFJob::doJSONObjectinfo(Pipeline* p, bool& first, QPDF& pdf)
JSON::writeDictionaryClose(p, first_object, 1); JSON::writeDictionaryClose(p, first_object, 1);
} }
void
QPDFJob::doJSONStream(
Pipeline* p,
bool& first,
QPDF& pdf,
QPDFObjectHandle& obj,
std::string const& file_prefix)
{
Pipeline* stream_p = nullptr;
FILE* f = nullptr;
std::shared_ptr<Pl_StdioFile> f_pl;
std::string filename;
if (this->m->json_stream_data == qpdf_sj_file) {
filename = file_prefix + "-" + QUtil::int_to_string(obj.getObjectID());
f = QUtil::safe_fopen(filename.c_str(), "wb");
f_pl = std::make_shared<Pl_StdioFile>("stream data", f);
stream_p = f_pl.get();
}
auto j = JSON::makeDictionary();
j.addDictionaryMember(
"stream",
obj.getStreamJSON(
this->m->json_version,
this->m->json_stream_data,
this->m->decode_level,
stream_p,
filename));
JSON::writeDictionaryItem(p, first, "obj:" + obj.unparse(), j, 2);
if (f) {
f_pl->finish();
f_pl = nullptr;
fclose(f);
}
}
void
QPDFJob::doJSONObject(
Pipeline* p,
bool& first,
QPDF& pdf,
std::string const& key,
QPDFObjectHandle& obj)
{
auto j = JSON::makeDictionary();
j.addDictionaryMember("value", obj.getJSON(this->m->json_version, true));
JSON::writeDictionaryItem(p, first, key, j, 2);
}
void
QPDFJob::doJSONQpdf(Pipeline* p, bool& first, QPDF& pdf)
{
std::string file_prefix = this->m->json_stream_prefix;
if (this->m->json_stream_data == qpdf_sj_file) {
if (file_prefix.empty()) {
if (this->m->infilename.get()) {
file_prefix = this->m->infilename.get();
}
if (file_prefix.empty()) {
usage(
"please specify --json-stream-prefix since the input file "
"name is unknown");
}
}
}
JSON::writeDictionaryKey(p, first, "qpdf", 0);
bool first_qpdf = true;
JSON::writeDictionaryOpen(p, first_qpdf, 1);
JSON::writeDictionaryItem(
p, first_qpdf, "jsonversion", JSON::makeInt(this->m->json_version), 1);
JSON::writeDictionaryItem(
p, first_qpdf, "pdfversion", JSON::makeString(pdf.getPDFVersion()), 1);
JSON::writeDictionaryItem(
p,
first_qpdf,
"maxobjectid",
JSON::makeInt(QIntC::to_longlong(pdf.getObjectCount())),
1);
JSON::writeDictionaryKey(p, first_qpdf, "objects", 1);
bool first_object = true;
JSON::writeDictionaryOpen(p, first_object, 2);
bool all_objects = m->json_objects.empty();
std::set<QPDFObjGen> wanted_og = getWantedJSONObjects();
std::vector<QPDFObjectHandle> objects = pdf.getAllObjects();
for (auto& obj: objects) {
if (all_objects || wanted_og.count(obj.getObjGen())) {
if (obj.isStream()) {
doJSONStream(p, first_object, pdf, obj, file_prefix);
} else {
doJSONObject(p, first_object, pdf, "obj:" + obj.unparse(), obj);
}
}
}
if (all_objects || m->json_objects.count("trailer")) {
auto trailer = pdf.getTrailer();
doJSONObject(p, first_object, pdf, "trailer", trailer);
}
JSON::writeDictionaryClose(p, first_object, 2);
JSON::writeDictionaryClose(p, first_qpdf, 1);
}
void void
QPDFJob::doJSONPages(Pipeline* p, bool& first, QPDF& pdf) QPDFJob::doJSONPages(Pipeline* p, bool& first, QPDF& pdf)
{ {
@ -1603,12 +1513,12 @@ QPDFJob::json_schema(int json_version, std::set<std::string>* keys)
// The list of selectable top-level keys id duplicated in the // The list of selectable top-level keys id duplicated in the
// following places: job.yml, QPDFJob::json_schema, and // following places: job.yml, QPDFJob::json_schema, and
// QPDFJob::doJSON. // QPDFJob::doJSON.
if (json_version == 1) { if (all_keys || keys->count("objects")) {
if (all_keys || keys->count("objects")) { schema.addDictionaryMember("objects", JSON::parse(R"({
schema.addDictionaryMember("objects", JSON::parse(R"({
"<n n R|trailer>": "json representation of object" "<n n R|trailer>": "json representation of object"
})")); })"));
} }
if (json_version == 1) {
if (all_keys || keys->count("objectinfo")) { if (all_keys || keys->count("objectinfo")) {
JSON objectinfo = JSON objectinfo =
schema.addDictionaryMember("objectinfo", JSON::parse(R"({ schema.addDictionaryMember("objectinfo", JSON::parse(R"({
@ -1619,17 +1529,6 @@ QPDFJob::json_schema(int json_version, std::set<std::string>* keys)
"length": "if stream, its length, otherwise null" "length": "if stream, its length, otherwise null"
} }
} }
})"));
}
} else {
if (all_keys || keys->count("qpdf")) {
schema.addDictionaryMember("qpdf", JSON::parse(R"({
"jsonversion": "qpdf json output version",
"pdfversion": "PDF version from PDF header",
"maxobjectid": "Highest object ID; needed for adding new objects",
"objects": {
"<obj:n n R|trailer>": "json representation of object"
}
})")); })"));
} }
} }
@ -1843,17 +1742,15 @@ QPDFJob::doJSON(QPDF& pdf, Pipeline* p)
// repairing the page tree. To see the original file with any page // repairing the page tree. To see the original file with any page
// tree problems and the page tree not flattened, select // tree problems and the page tree not flattened, select
// objects/objectinfo without other keys. // objects/objectinfo without other keys.
if (all_keys || m->json_keys.count("objects")) {
doJSONObjects(p, first, pdf);
}
if (this->m->json_version == 1) { if (this->m->json_version == 1) {
if (all_keys || m->json_keys.count("objects")) { // "objectinfo" is not needed for version >1 since you can
doJSONObjects(p, first, pdf); // tell streams from other objects in "objects".
}
if (all_keys || m->json_keys.count("objectinfo")) { if (all_keys || m->json_keys.count("objectinfo")) {
doJSONObjectinfo(p, first, pdf); doJSONObjectinfo(p, first, pdf);
} }
} else {
if (all_keys || m->json_keys.count("qpdf")) {
doJSONQpdf(p, first, pdf);
}
} }
JSON::writeDictionaryClose(p, first, 0); JSON::writeDictionaryClose(p, first, 0);
@ -1939,16 +1836,15 @@ QPDFJob::doProcessOnce(
std::function<void(QPDF*, char const*)> fn, std::function<void(QPDF*, char const*)> fn,
char const* password, char const* password,
bool empty, bool empty,
bool used_for_input) bool used_for_input,
bool main_input)
{ {
auto pdf = std::make_shared<QPDF>(); auto pdf = std::make_shared<QPDF>();
setQPDFOptions(*pdf); setQPDFOptions(*pdf);
if (empty) { if (empty) {
if (!this->m->create_from_json.empty()) { pdf->emptyPDF();
pdf->createFromJSON(this->m->create_from_json); } else if (main_input && this->m->json_input) {
} else { pdf->createFromJSON(this->m->infilename.get());
pdf->emptyPDF();
}
} else { } else {
fn(pdf.get(), password); fn(pdf.get(), password);
} }
@ -1964,7 +1860,8 @@ QPDFJob::doProcess(
std::function<void(QPDF*, char const*)> fn, std::function<void(QPDF*, char const*)> fn,
char const* password, char const* password,
bool empty, bool empty,
bool used_for_input) bool used_for_input,
bool main_input)
{ {
// If a password has been specified but doesn't work, try other // If a password has been specified but doesn't work, try other
// passwords that are equivalent in different character encodings. // passwords that are equivalent in different character encodings.
@ -1990,7 +1887,7 @@ QPDFJob::doProcess(
m->suppress_password_recovery) { m->suppress_password_recovery) {
// There is no password, or we're not doing recovery, so just // There is no password, or we're not doing recovery, so just
// do the normal processing with the supplied password. // do the normal processing with the supplied password.
return doProcessOnce(fn, password, empty, used_for_input); return doProcessOnce(fn, password, empty, used_for_input, main_input);
} }
// Get a list of otherwise encoded strings. Keep in scope for this // Get a list of otherwise encoded strings. Keep in scope for this
@ -2018,7 +1915,7 @@ QPDFJob::doProcess(
bool warned = false; bool warned = false;
for (auto iter = passwords.begin(); iter != passwords.end(); ++iter) { for (auto iter = passwords.begin(); iter != passwords.end(); ++iter) {
try { try {
return doProcessOnce(fn, *iter, empty, used_for_input); return doProcessOnce(fn, *iter, empty, used_for_input, main_input);
} catch (QPDFExc& e) { } catch (QPDFExc& e) {
auto next = iter; auto next = iter;
++next; ++next;
@ -2042,12 +1939,16 @@ QPDFJob::doProcess(
std::shared_ptr<QPDF> std::shared_ptr<QPDF>
QPDFJob::processFile( QPDFJob::processFile(
char const* filename, char const* password, bool used_for_input) char const* filename,
char const* password,
bool used_for_input,
bool main_input)
{ {
auto f1 = std::mem_fn<void(char const*, char const*)>(&QPDF::processFile); auto f1 = std::mem_fn<void(char const*, char const*)>(&QPDF::processFile);
auto fn = auto fn =
std::bind(f1, std::placeholders::_1, filename, std::placeholders::_2); std::bind(f1, std::placeholders::_1, filename, std::placeholders::_2);
return doProcess(fn, password, strcmp(filename, "") == 0, used_for_input); return doProcess(
fn, password, strcmp(filename, "") == 0, used_for_input, main_input);
} }
std::shared_ptr<QPDF> std::shared_ptr<QPDF>
@ -2056,7 +1957,7 @@ QPDFJob::processInputSource(
{ {
auto f1 = std::mem_fn(&QPDF::processInputSource); auto f1 = std::mem_fn(&QPDF::processInputSource);
auto fn = std::bind(f1, std::placeholders::_1, is, std::placeholders::_2); auto fn = std::bind(f1, std::placeholders::_1, is, std::placeholders::_2);
return doProcess(fn, password, false, used_for_input); return doProcess(fn, password, false, used_for_input, false);
} }
void void
@ -2067,7 +1968,8 @@ QPDFJob::validateUnderOverlay(QPDF& pdf, UnderOverlay* uo)
} }
QPDFPageDocumentHelper main_pdh(pdf); QPDFPageDocumentHelper main_pdh(pdf);
int main_npages = QIntC::to_int(main_pdh.getAllPages().size()); int main_npages = QIntC::to_int(main_pdh.getAllPages().size());
uo->pdf = processFile(uo->filename.c_str(), uo->password.get(), true); uo->pdf =
processFile(uo->filename.c_str(), uo->password.get(), true, false);
QPDFPageDocumentHelper uo_pdh(*(uo->pdf)); QPDFPageDocumentHelper uo_pdh(*(uo->pdf));
int uo_npages = QIntC::to_int(uo_pdh.getAllPages().size()); int uo_npages = QIntC::to_int(uo_pdh.getAllPages().size());
try { try {
@ -2324,8 +2226,8 @@ QPDFJob::copyAttachments(QPDF& pdf)
cout << prefix << ": copying attachments from " << to_copy.path cout << prefix << ": copying attachments from " << to_copy.path
<< std::endl; << std::endl;
}); });
auto other = auto other = processFile(
processFile(to_copy.path.c_str(), to_copy.password.c_str(), false); to_copy.path.c_str(), to_copy.password.c_str(), false, false);
QPDFEmbeddedFileDocumentHelper other_efdh(*other); QPDFEmbeddedFileDocumentHelper other_efdh(*other);
auto other_attachments = other_efdh.getEmbeddedFiles(); auto other_attachments = other_efdh.getEmbeddedFiles();
for (auto const& iter: other_attachments) { for (auto const& iter: other_attachments) {
@ -3176,6 +3078,7 @@ QPDFJob::setWriterOptions(QPDF& pdf, QPDFWriter& w)
std::shared_ptr<QPDF> encryption_pdf = processFile( std::shared_ptr<QPDF> encryption_pdf = processFile(
m->encryption_file.c_str(), m->encryption_file.c_str(),
m->encryption_file_password.get(), m->encryption_file_password.get(),
false,
false); false);
w.copyEncryptionParameters(*encryption_pdf); w.copyEncryptionParameters(*encryption_pdf);
} }
@ -3332,10 +3235,13 @@ QPDFJob::writeOutfile(QPDF& pdf)
// goes out of scope. // goes out of scope.
m->outfilename = temp_out; m->outfilename = temp_out;
} else if (strcmp(m->outfilename.get(), "-") == 0) { } else if (strcmp(m->outfilename.get(), "-") == 0) {
m->outfilename = 0; m->outfilename = nullptr;
} }
{ if (this->m->json_output) {
// Private scope so QPDFWriter will close the output file writeJSON(pdf);
} else {
// QPDFWriter must have block scope so the output file will be
// closed after write() finishes.
QPDFWriter w(pdf, m->outfilename.get()); QPDFWriter w(pdf, m->outfilename.get());
setWriterOptions(pdf, w); setWriterOptions(pdf, w);
w.write(); w.write();
@ -3375,3 +3281,47 @@ QPDFJob::writeOutfile(QPDF& pdf)
} }
} }
} }
void
QPDFJob::writeJSON(QPDF& pdf)
{
// File pipeline must have block scope so it will be closed
// after write.
std::shared_ptr<QUtil::FileCloser> fc;
std::shared_ptr<Pipeline> fp;
std::string file_prefix = this->m->json_stream_prefix;
if (m->outfilename.get()) {
QTC::TC("qpdf", "QPDFJob write json to file");
if (file_prefix.empty()) {
file_prefix = this->m->outfilename.get();
}
fc = std::make_shared<QUtil::FileCloser>(
QUtil::safe_fopen(this->m->outfilename.get(), "w"));
fp = std::make_shared<Pl_StdioFile>("json output", fc->f);
} else if (
(this->m->json_stream_data == qpdf_sj_file) && file_prefix.empty()) {
QTC::TC("qpdf", "QPDFJob need json-stream-prefix for stdout");
usage("please specify --json-stream-prefix since the input file "
"name is unknown");
} else {
QTC::TC("qpdf", "QPDFJob write json to stdout");
fp = std::make_shared<Pl_OStream>("json output", *this->m->cout);
}
std::set<std::string> json_objects;
if (this->m->json_objects.count("trailer")) {
json_objects.insert("trailer");
}
auto wanted = getWantedJSONObjects();
for (auto const& og: wanted) {
std::ostringstream s;
s << "obj:" << og.getObj() << " " << og.getGen() << " R";
json_objects.insert(s.str());
}
pdf.writeJSON(
this->m->json_output,
fp.get(),
this->m->decode_level,
this->m->json_stream_data,
file_prefix,
json_objects);
}

View File

@ -100,13 +100,6 @@ ArgParser::argReplaceInput()
this->gave_output = true; this->gave_output = true;
} }
void
ArgParser::argCreateFromJson(std::string const& arg)
{
c_main->createFromJson(arg);
this->gave_input = true;
}
void void
ArgParser::argVersion() ArgParser::argVersion()
{ {

View File

@ -27,8 +27,7 @@ QPDFJob::Config::emptyInput()
// Various places in QPDFJob.cc know that the empty string for // Various places in QPDFJob.cc know that the empty string for
// infile means empty. We set it to something other than a // infile means empty. We set it to something other than a
// null pointer as an indication that some input source has // null pointer as an indication that some input source has
// been specified. The --create-from-json option also sets // been specified. This approach means that passing "" as
// infilename to empty. This approach means that passing "" as
// the argument to inputFile in job JSON, or equivalently // the argument to inputFile in job JSON, or equivalently
// using "" as a positional command-line argument would be the // using "" as a positional command-line argument would be the
// same as --empty. This probably isn't worth blocking or // same as --empty. This probably isn't worth blocking or
@ -265,6 +264,7 @@ QPDFJob::Config::jsonObject(std::string const& parameter)
QPDFJob::Config* QPDFJob::Config*
QPDFJob::Config::jsonStreamData(std::string const& parameter) QPDFJob::Config::jsonStreamData(std::string const& parameter)
{ {
o.m->json_stream_data_set = true;
if (parameter == "none") { if (parameter == "none") {
o.m->json_stream_data = qpdf_sj_none; o.m->json_stream_data = qpdf_sj_none;
} else if (parameter == "inline") { } else if (parameter == "inline") {
@ -286,22 +286,28 @@ QPDFJob::Config::jsonStreamPrefix(std::string const& parameter)
} }
QPDFJob::Config* QPDFJob::Config*
QPDFJob::Config::toJson() QPDFJob::Config::jsonInput()
{ {
json("latest"); o.m->json_input = true;
jsonStreamData("inline");
jsonKey("qpdf");
decodeLevel("none");
return this; return this;
} }
QPDFJob::Config* QPDFJob::Config*
QPDFJob::Config::createFromJson(std::string const& parameter) QPDFJob::Config::jsonOutput(std::string const& parameter)
{ {
// See comments in emptyInput() about setting infilename to the std::string v = parameter;
// empty string. if (parameter == "latest") {
o.m->infilename = QUtil::make_shared_cstr(""); v = "2";
o.m->create_from_json = parameter; }
if (v != "2") {
usage("only version 2 is supported for --json-output");
}
o.m->json_output = QUtil::string_to_int(v.c_str());
if (!o.m->json_stream_data_set) {
// No need to set json_stream_data_set -- that indicates
// explicit use of --json-stream-data.
o.m->json_stream_data = qpdf_sj_inline;
}
return this; return this;
} }

View File

@ -250,12 +250,6 @@ Handlers::setupEmpty()
addBare([this]() { c_main->emptyInput(); }); addBare([this]() { c_main->emptyInput(); });
} }
void
Handlers::setupCreateFromJson()
{
addParameter([this](char const* p) { c_main->createFromJson(p); });
}
void void
Handlers::setupOutputFile() Handlers::setupOutputFile()
{ {

View File

@ -2,6 +2,7 @@
#include <qpdf/FileInputSource.hh> #include <qpdf/FileInputSource.hh>
#include <qpdf/Pl_Base64.hh> #include <qpdf/Pl_Base64.hh>
#include <qpdf/Pl_StdioFile.hh>
#include <qpdf/QIntC.hh> #include <qpdf/QIntC.hh>
#include <qpdf/QTC.hh> #include <qpdf/QTC.hh>
#include <qpdf/QUtil.hh> #include <qpdf/QUtil.hh>
@ -13,7 +14,7 @@
// | st_initial // | st_initial
// { | -> st_top // { | -> st_top
// "qpdf": { | -> st_qpdf // "qpdf-v2": { | -> st_qpdf
// "objects": { | -> st_objects // "objects": { | -> st_objects
// "obj:1 0 R": { | -> st_object_top // "obj:1 0 R": { | -> st_object_top
// "value": { | -> st_object // "value": { | -> st_object
@ -93,7 +94,6 @@ QPDF::JSONReactor::JSONReactor(
parse_error(false), parse_error(false),
saw_qpdf(false), saw_qpdf(false),
saw_objects(false), saw_objects(false),
saw_json_version(false),
saw_pdf_version(false), saw_pdf_version(false),
saw_trailer(false), saw_trailer(false),
state(st_initial), state(st_initial),
@ -154,21 +154,17 @@ QPDF::JSONReactor::containerEnd(JSON const& value)
QTC::TC("qpdf", "QPDF_json missing qpdf"); QTC::TC("qpdf", "QPDF_json missing qpdf");
error(0, "\"qpdf\" object was not seen"); error(0, "\"qpdf\" object was not seen");
} else { } else {
if (!this->saw_json_version) {
QTC::TC("qpdf", "QPDF_json missing json version");
error(0, "\"qpdf.jsonversion\" was not seen");
}
if (must_be_complete && !this->saw_pdf_version) { if (must_be_complete && !this->saw_pdf_version) {
QTC::TC("qpdf", "QPDF_json missing pdf version"); QTC::TC("qpdf", "QPDF_json missing pdf version");
error(0, "\"qpdf.pdfversion\" was not seen"); error(0, "\"qpdf-v2.pdfversion\" was not seen");
} }
if (!this->saw_objects) { if (!this->saw_objects) {
QTC::TC("qpdf", "QPDF_json missing objects"); QTC::TC("qpdf", "QPDF_json missing objects");
error(0, "\"qpdf.objects\" was not seen"); error(0, "\"qpdf-v2.objects\" was not seen");
} else { } else {
if (must_be_complete && !this->saw_trailer) { if (must_be_complete && !this->saw_trailer) {
QTC::TC("qpdf", "QPDF_json missing trailer"); QTC::TC("qpdf", "QPDF_json missing trailer");
error(0, "\"qpdf.objects.trailer\" was not seen"); error(0, "\"qpdf-v2.objects.trailer\" was not seen");
} }
} }
} }
@ -279,7 +275,7 @@ QPDF::JSONReactor::dictionaryItem(std::string const& key, JSON const& value)
QTC::TC("qpdf", "QPDF_json ignoring in st_ignore"); QTC::TC("qpdf", "QPDF_json ignoring in st_ignore");
// ignore // ignore
} else if (state == st_top) { } else if (state == st_top) {
if (key == "qpdf") { if (key == "qpdf-v2") {
this->saw_qpdf = true; this->saw_qpdf = true;
nestedState(key, value, st_qpdf); nestedState(key, value, st_qpdf);
} else { } else {
@ -289,14 +285,7 @@ QPDF::JSONReactor::dictionaryItem(std::string const& key, JSON const& value)
next_state = st_ignore; next_state = st_ignore;
} }
} else if (state == st_qpdf) { } else if (state == st_qpdf) {
if (key == "jsonversion") { if (key == "pdfversion") {
this->saw_json_version = true;
std::string v;
if (!(value.getNumber(v) && (v == "2"))) {
QTC::TC("qpdf", "QPDF_json bad json version");
error(value.getStart(), "only JSON version 2 is supported");
}
} else if (key == "pdfversion") {
this->saw_pdf_version = true; this->saw_pdf_version = true;
bool version_okay = false; bool version_okay = false;
std::string v; std::string v;
@ -567,3 +556,110 @@ QPDF::importJSON(std::shared_ptr<InputSource> is, bool must_be_complete)
// std::cout << oh.unparseResolved() << std::endl; // std::cout << oh.unparseResolved() << std::endl;
// } // }
} }
void
QPDF::writeJSONStream(
int version,
Pipeline* p,
bool& first,
std::string const& key,
QPDFObjectHandle& obj,
qpdf_stream_decode_level_e decode_level,
qpdf_json_stream_data_e json_stream_data,
std::string const& file_prefix)
{
Pipeline* stream_p = nullptr;
FILE* f = nullptr;
std::shared_ptr<Pl_StdioFile> f_pl;
std::string filename;
if (json_stream_data == qpdf_sj_file) {
filename = file_prefix + "-" + QUtil::int_to_string(obj.getObjectID());
f = QUtil::safe_fopen(filename.c_str(), "wb");
f_pl = std::make_shared<Pl_StdioFile>("stream data", f);
stream_p = f_pl.get();
}
auto j = JSON::makeDictionary();
j.addDictionaryMember(
"stream",
obj.getStreamJSON(
version, json_stream_data, decode_level, stream_p, filename));
JSON::writeDictionaryItem(p, first, key, j, 2);
if (f) {
f_pl->finish();
f_pl = nullptr;
fclose(f);
}
}
void
QPDF::writeJSONObject(
int version,
Pipeline* p,
bool& first,
std::string const& key,
QPDFObjectHandle& obj)
{
auto j = JSON::makeDictionary();
j.addDictionaryMember("value", obj.getJSON(version, true));
JSON::writeDictionaryItem(p, first, key, j, 2);
}
void
QPDF::writeJSON(
int version,
Pipeline* p,
qpdf_stream_decode_level_e decode_level,
qpdf_json_stream_data_e json_stream_data,
std::string const& file_prefix,
std::set<std::string> wanted_objects)
{
if (version != 2) {
throw std::runtime_error(
"QPDF::writeJSON: only version 2 is supported");
}
bool first = true;
JSON::writeDictionaryOpen(p, first, 0);
JSON::writeDictionaryKey(p, first, "qpdf-v2", 0);
bool first_qpdf = true;
JSON::writeDictionaryOpen(p, first_qpdf, 1);
JSON::writeDictionaryItem(
p, first_qpdf, "pdfversion", JSON::makeString(getPDFVersion()), 1);
JSON::writeDictionaryItem(
p,
first_qpdf,
"maxobjectid",
JSON::makeInt(QIntC::to_longlong(getObjectCount())),
1);
JSON::writeDictionaryKey(p, first_qpdf, "objects", 1);
bool first_object = true;
JSON::writeDictionaryOpen(p, first_object, 2);
bool all_objects = wanted_objects.empty();
std::vector<QPDFObjectHandle> objects = getAllObjects();
for (auto& obj: objects) {
std::string key = "obj:" + obj.unparse();
if (all_objects || wanted_objects.count(key)) {
if (obj.isStream()) {
writeJSONStream(
version,
p,
first_object,
key,
obj,
decode_level,
json_stream_data,
file_prefix);
} else {
writeJSONObject(version, p, first_object, key, obj);
}
}
}
if (all_objects || wanted_objects.count("trailer")) {
auto trailer = getTrailer();
writeJSONObject(version, p, first_object, "trailer", trailer);
}
JSON::writeDictionaryClose(p, first_object, 2);
JSON::writeDictionaryClose(p, first_qpdf, 1);
JSON::writeDictionaryClose(p, first, 0);
*p << "\n";
}

View File

@ -28,7 +28,6 @@ void argOverlay();
void argPages(); void argPages();
void argReplaceInput(); void argReplaceInput();
void argUnderlay(); void argUnderlay();
void argCreateFromJson(std::string const&);
void argPagesPositional(std::string const&); void argPagesPositional(std::string const&);
void argPagesPassword(std::string const&); void argPagesPassword(std::string const&);
void argEndPages(); void argEndPages();

View File

@ -798,10 +798,6 @@ depth in the JSON section of the manual. "version" may be a
specific version or "latest". Run qpdf --json-help for a specific version or "latest". Run qpdf --json-help for a
description of the generated JSON object. description of the generated JSON object.
)"); )");
ap.addOptionHelp("--to-json", "json", "serialize to JSON", R"(Shortcut for options useful for serializing PDF to JSON:
--json=latest --json-stream-data=inline
--json-key=qpdf --decode-level=none
)");
ap.addOptionHelp("--json-help", "json", "show format of JSON output", R"(Describe the format of the JSON output by writing to standard ap.addOptionHelp("--json-help", "json", "show format of JSON output", R"(Describe the format of the JSON output by writing to standard
output a JSON object with the same keys and with values output a JSON object with the same keys and with values
containing descriptive text. containing descriptive text.
@ -836,11 +832,16 @@ name as the prefix for stream data files. Whatever is given here
will be appended with -nnn to create the name of the file that will be appended with -nnn to create the name of the file that
will contain the data for the stream stream in object nnn. will contain the data for the stream stream in object nnn.
)"); )");
ap.addOptionHelp("--create-from-json", "json", "create PDF from qpdf JSON", R"(--create-from-json=qpdf-json-file ap.addOptionHelp("--json-output", "json", "serialize to JSON", R"(--json-output=version
Create a PDF file from the prior output of qpdf --json. See the The output file will be qpdf JSON format at the given version.
"QPDF JSON Format" section of the manual for information about Only version 2 is supported. See also --json-stream-data
how to use this option. and --json-stream-prefix
)");
ap.addOptionHelp("--json-input", "json", "input file is qpdf JSON", R"(Treat the input file as a JSON file in qpdf JSON format as
written by qpdf --json-output. See the "QPDF JSON Format"
section of the manual for information about how to use this
option.
)"); )");
ap.addOptionHelp("--update-from-json", "json", "update a PDF from qpdf JSON", R"(--update-from-json=qpdf-json-file ap.addOptionHelp("--update-from-json", "json", "update a PDF from qpdf JSON", R"(--update-from-json=qpdf-json-file

View File

@ -19,9 +19,10 @@ static char const* decode_level_choices[] = {"none", "generalized", "specialized
static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0}; static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0};
static char const* remove_unref_choices[] = {"auto", "yes", "no", 0}; static char const* remove_unref_choices[] = {"auto", "yes", "no", 0};
static char const* flatten_choices[] = {"all", "print", "screen", 0}; static char const* flatten_choices[] = {"all", "print", "screen", 0};
static char const* json_version_choices[] = {"1", "2", "latest", 0}; static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0};
static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", "qpdf", 0}; static char const* json_output_choices[] = {"2", "latest", 0};
static char const* json_stream_data_choices[] = {"none", "inline", "file", 0}; static char const* json_stream_data_choices[] = {"none", "inline", "file", 0};
static char const* json_version_choices[] = {"1", "2", "latest", 0};
static char const* print128_choices[] = {"full", "low", "none", 0}; static char const* print128_choices[] = {"full", "low", "none", 0};
static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0}; static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0};
@ -49,6 +50,7 @@ this->ap.addBare("flatten-rotation", [this](){c_main->flattenRotation();});
this->ap.addBare("generate-appearances", [this](){c_main->generateAppearances();}); this->ap.addBare("generate-appearances", [this](){c_main->generateAppearances();});
this->ap.addBare("ignore-xref-streams", [this](){c_main->ignoreXrefStreams();}); this->ap.addBare("ignore-xref-streams", [this](){c_main->ignoreXrefStreams();});
this->ap.addBare("is-encrypted", [this](){c_main->isEncrypted();}); this->ap.addBare("is-encrypted", [this](){c_main->isEncrypted();});
this->ap.addBare("json-input", [this](){c_main->jsonInput();});
this->ap.addBare("keep-inline-images", [this](){c_main->keepInlineImages();}); this->ap.addBare("keep-inline-images", [this](){c_main->keepInlineImages();});
this->ap.addBare("linearize", [this](){c_main->linearize();}); this->ap.addBare("linearize", [this](){c_main->linearize();});
this->ap.addBare("list-attachments", [this](){c_main->listAttachments();}); this->ap.addBare("list-attachments", [this](){c_main->listAttachments();});
@ -79,7 +81,6 @@ this->ap.addBare("static-id", [this](){c_main->staticId();});
this->ap.addBare("suppress-password-recovery", [this](){c_main->suppressPasswordRecovery();}); this->ap.addBare("suppress-password-recovery", [this](){c_main->suppressPasswordRecovery();});
this->ap.addBare("suppress-recovery", [this](){c_main->suppressRecovery();}); this->ap.addBare("suppress-recovery", [this](){c_main->suppressRecovery();});
this->ap.addBare("test-json-schema", [this](){c_main->testJsonSchema();}); this->ap.addBare("test-json-schema", [this](){c_main->testJsonSchema();});
this->ap.addBare("to-json", [this](){c_main->toJson();});
this->ap.addBare("underlay", b(&ArgParser::argUnderlay)); this->ap.addBare("underlay", b(&ArgParser::argUnderlay));
this->ap.addBare("verbose", [this](){c_main->verbose();}); this->ap.addBare("verbose", [this](){c_main->verbose();});
this->ap.addBare("warning-exit-0", [this](){c_main->warningExit0();}); this->ap.addBare("warning-exit-0", [this](){c_main->warningExit0();});
@ -104,7 +105,6 @@ this->ap.addRequiredParameter("rotate", [this](std::string const& x){c_main->rot
this->ap.addRequiredParameter("show-attachment", [this](std::string const& x){c_main->showAttachment(x);}, "attachment"); this->ap.addRequiredParameter("show-attachment", [this](std::string const& x){c_main->showAttachment(x);}, "attachment");
this->ap.addRequiredParameter("show-object", [this](std::string const& x){c_main->showObject(x);}, "trailer"); this->ap.addRequiredParameter("show-object", [this](std::string const& x){c_main->showObject(x);}, "trailer");
this->ap.addRequiredParameter("json-stream-prefix", [this](std::string const& x){c_main->jsonStreamPrefix(x);}, "stream-file-prefix"); this->ap.addRequiredParameter("json-stream-prefix", [this](std::string const& x){c_main->jsonStreamPrefix(x);}, "stream-file-prefix");
this->ap.addRequiredParameter("create-from-json", p(&ArgParser::argCreateFromJson), "qpdf-json file");
this->ap.addRequiredParameter("update-from-json", [this](std::string const& x){c_main->updateFromJson(x);}, "qpdf-json file"); this->ap.addRequiredParameter("update-from-json", [this](std::string const& x){c_main->updateFromJson(x);}, "qpdf-json file");
this->ap.addOptionalParameter("collate", [this](std::string const& x){c_main->collate(x);}); this->ap.addOptionalParameter("collate", [this](std::string const& x){c_main->collate(x);});
this->ap.addOptionalParameter("split-pages", [this](std::string const& x){c_main->splitPages(x);}); this->ap.addOptionalParameter("split-pages", [this](std::string const& x){c_main->splitPages(x);});
@ -112,13 +112,14 @@ this->ap.addChoices("compress-streams", [this](std::string const& x){c_main->com
this->ap.addChoices("decode-level", [this](std::string const& x){c_main->decodeLevel(x);}, true, decode_level_choices); this->ap.addChoices("decode-level", [this](std::string const& x){c_main->decodeLevel(x);}, true, decode_level_choices);
this->ap.addChoices("flatten-annotations", [this](std::string const& x){c_main->flattenAnnotations(x);}, true, flatten_choices); this->ap.addChoices("flatten-annotations", [this](std::string const& x){c_main->flattenAnnotations(x);}, true, flatten_choices);
this->ap.addChoices("json-key", [this](std::string const& x){c_main->jsonKey(x);}, true, json_key_choices); this->ap.addChoices("json-key", [this](std::string const& x){c_main->jsonKey(x);}, true, json_key_choices);
this->ap.addChoices("json-output", [this](std::string const& x){c_main->jsonOutput(x);}, true, json_output_choices);
this->ap.addChoices("json-stream-data", [this](std::string const& x){c_main->jsonStreamData(x);}, true, json_stream_data_choices);
this->ap.addChoices("keep-files-open", [this](std::string const& x){c_main->keepFilesOpen(x);}, true, yn_choices); this->ap.addChoices("keep-files-open", [this](std::string const& x){c_main->keepFilesOpen(x);}, true, yn_choices);
this->ap.addChoices("normalize-content", [this](std::string const& x){c_main->normalizeContent(x);}, true, yn_choices); this->ap.addChoices("normalize-content", [this](std::string const& x){c_main->normalizeContent(x);}, true, yn_choices);
this->ap.addChoices("object-streams", [this](std::string const& x){c_main->objectStreams(x);}, true, object_streams_choices); this->ap.addChoices("object-streams", [this](std::string const& x){c_main->objectStreams(x);}, true, object_streams_choices);
this->ap.addChoices("password-mode", [this](std::string const& x){c_main->passwordMode(x);}, true, password_mode_choices); this->ap.addChoices("password-mode", [this](std::string const& x){c_main->passwordMode(x);}, true, password_mode_choices);
this->ap.addChoices("remove-unreferenced-resources", [this](std::string const& x){c_main->removeUnreferencedResources(x);}, true, remove_unref_choices); this->ap.addChoices("remove-unreferenced-resources", [this](std::string const& x){c_main->removeUnreferencedResources(x);}, true, remove_unref_choices);
this->ap.addChoices("stream-data", [this](std::string const& x){c_main->streamData(x);}, true, stream_data_choices); this->ap.addChoices("stream-data", [this](std::string const& x){c_main->streamData(x);}, true, stream_data_choices);
this->ap.addChoices("json-stream-data", [this](std::string const& x){c_main->jsonStreamData(x);}, true, json_stream_data_choices);
this->ap.addChoices("json", [this](std::string const& x){c_main->json(x);}, false, json_version_choices); this->ap.addChoices("json", [this](std::string const& x){c_main->json(x);}, false, json_version_choices);
this->ap.registerOptionTable("pages", b(&ArgParser::argEndPages)); this->ap.registerOptionTable("pages", b(&ArgParser::argEndPages));
this->ap.addPositional(p(&ArgParser::argPagesPositional)); this->ap.addPositional(p(&ArgParser::argPagesPositional));

View File

@ -8,7 +8,6 @@
void setupInputFile(); void setupInputFile();
void setupPassword(); void setupPassword();
void setupEmpty(); void setupEmpty();
void setupCreateFromJson();
void setupOutputFile(); void setupOutputFile();
void setupReplaceInput(); void setupReplaceInput();
void beginEncrypt(JSON); void beginEncrypt(JSON);

View File

@ -12,9 +12,10 @@ static char const* decode_level_choices[] = {"none", "generalized", "specialized
static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0}; static char const* object_streams_choices[] = {"disable", "preserve", "generate", 0};
static char const* remove_unref_choices[] = {"auto", "yes", "no", 0}; static char const* remove_unref_choices[] = {"auto", "yes", "no", 0};
static char const* flatten_choices[] = {"all", "print", "screen", 0}; static char const* flatten_choices[] = {"all", "print", "screen", 0};
static char const* json_version_choices[] = {"1", "2", "latest", 0}; static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0};
static char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", "qpdf", 0}; static char const* json_output_choices[] = {"2", "latest", 0};
static char const* json_stream_data_choices[] = {"none", "inline", "file", 0}; static char const* json_stream_data_choices[] = {"none", "inline", "file", 0};
static char const* json_version_choices[] = {"1", "2", "latest", 0};
static char const* print128_choices[] = {"full", "low", "none", 0}; static char const* print128_choices[] = {"full", "low", "none", 0};
static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0}; static char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0};
@ -30,9 +31,9 @@ popHandler(); // key: passwordFile
pushKey("empty"); pushKey("empty");
setupEmpty(); setupEmpty();
popHandler(); // key: empty popHandler(); // key: empty
pushKey("createFromJson"); pushKey("jsonInput");
setupCreateFromJson(); addBare([this]() { c_main->jsonInput(); });
popHandler(); // key: createFromJson popHandler(); // key: jsonInput
pushKey("outputFile"); pushKey("outputFile");
setupOutputFile(); setupOutputFile();
popHandler(); // key: outputFile popHandler(); // key: outputFile
@ -105,6 +106,9 @@ popHandler(); // key: progress
pushKey("splitPages"); pushKey("splitPages");
addParameter([this](std::string const& p) { c_main->splitPages(p); }); addParameter([this](std::string const& p) { c_main->splitPages(p); });
popHandler(); // key: splitPages popHandler(); // key: splitPages
pushKey("jsonOutput");
addChoices(json_output_choices, true, [this](std::string const& p) { c_main->jsonOutput(p); });
popHandler(); // key: jsonOutput
pushKey("encrypt"); pushKey("encrypt");
beginDict(bindJSON(&Handlers::beginEncrypt), bindBare(&Handlers::endEncrypt)); // .encrypt beginDict(bindJSON(&Handlers::beginEncrypt), bindBare(&Handlers::endEncrypt)); // .encrypt
pushKey("userPassword"); pushKey("userPassword");
@ -262,9 +266,6 @@ popHandler(); // key: jsonStreamData
pushKey("jsonStreamPrefix"); pushKey("jsonStreamPrefix");
addParameter([this](std::string const& p) { c_main->jsonStreamPrefix(p); }); addParameter([this](std::string const& p) { c_main->jsonStreamPrefix(p); });
popHandler(); // key: jsonStreamPrefix popHandler(); // key: jsonStreamPrefix
pushKey("toJson");
addBare([this]() { c_main->toJson(); });
popHandler(); // key: toJson
pushKey("updateFromJson"); pushKey("updateFromJson");
addParameter([this](std::string const& p) { c_main->updateFromJson(p); }); addParameter([this](std::string const& p) { c_main->updateFromJson(p); });
popHandler(); // key: updateFromJson popHandler(); // key: updateFromJson

View File

@ -3,7 +3,7 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({
"password": "password for encrypted file", "password": "password for encrypted file",
"passwordFile": "read password from a file", "passwordFile": "read password from a file",
"empty": "use empty file as input", "empty": "use empty file as input",
"createFromJson": "create PDF from qpdf JSON", "jsonInput": "input file is qpdf JSON",
"outputFile": "output filename", "outputFile": "output filename",
"replaceInput": "overwrite input with output", "replaceInput": "overwrite input with output",
"qdf": "enable viewing PDF code in a text editor", "qdf": "enable viewing PDF code in a text editor",
@ -28,6 +28,7 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({
"forceVersion": "set output PDF version", "forceVersion": "set output PDF version",
"progress": "show progress when writing", "progress": "show progress when writing",
"splitPages": "write pages to separate files", "splitPages": "write pages to separate files",
"jsonOutput": "serialize to JSON",
"encrypt": { "encrypt": {
"userPassword": "user password", "userPassword": "user password",
"ownerPassword": "owner password", "ownerPassword": "owner password",
@ -87,7 +88,6 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({
], ],
"jsonStreamData": "how to handle streams in json output", "jsonStreamData": "how to handle streams in json output",
"jsonStreamPrefix": "prefix for json stream data files", "jsonStreamPrefix": "prefix for json stream data files",
"toJson": "serialize to JSON",
"updateFromJson": "update a PDF from qpdf JSON", "updateFromJson": "update a PDF from qpdf JSON",
"allowWeakCrypto": "allow insecure cryptographic algorithms", "allowWeakCrypto": "allow insecure cryptographic algorithms",
"keepFilesOpen": "manage keeping multiple files open", "keepFilesOpen": "manage keeping multiple files open",

View File

@ -3174,20 +3174,6 @@ Related Options
:qpdf:ref:`--json-help` option to get a description of the JSON :qpdf:ref:`--json-help` option to get a description of the JSON
object. object.
.. qpdf:option:: --to-json
.. help: serialize to JSON
Shortcut for options useful for serializing PDF to JSON:
--json=latest --json-stream-data=inline
--json-key=qpdf --decode-level=none
This option is a shorthand for
``--json=latest --json-stream-data=inline --json-key=qpdf --decode-level=none``.
These are good options for serializing a PDF to JSON in manner that
allows qpdf to read it back in. You can override any of these
options by specifying other options after them.
.. qpdf:option:: --json-help .. qpdf:option:: --json-help
.. help: show format of JSON output .. help: show format of JSON output
@ -3253,7 +3239,8 @@ Related Options
inline (base64-encoded) or written to a file. If ``file`` is inline (base64-encoded) or written to a file. If ``file`` is
chosen, the file will be the name of the input file appended with chosen, the file will be the name of the input file appended with
:samp:`-{nnn}` where :samp:`{nnn}` is the object number. The prefix :samp:`-{nnn}` where :samp:`{nnn}` is the object number. The prefix
can be overridden with :qpdf:ref:`--json-stream-prefix`. can be overridden with :qpdf:ref:`--json-stream-prefix`. This
option only applies when used with :qpdf:ref:`--json-output`.
.. qpdf:option:: --json-stream-prefix=file-prefix .. qpdf:option:: --json-stream-prefix=file-prefix
@ -3268,20 +3255,34 @@ Related Options
``file``, override the input file name as the prefix for stream ``file``, override the input file name as the prefix for stream
data files. Whatever is given here will be appended with data files. Whatever is given here will be appended with
:samp:`-{nnn}` to create the name of the file that will contain the :samp:`-{nnn}` to create the name of the file that will contain the
data for the stream stream in object :samp:`{nnn}`. data for the stream stream in object :samp:`{nnn}`. This
option only applies when used with :qpdf:ref:`--json-output`.
.. qpdf:option:: --create-from-json=qpdf-json-file .. qpdf:option:: --json-output=version
.. help: create PDF from qpdf JSON .. help: serialize to JSON
Create a PDF file from the prior output of qpdf --json. See the The output file will be qpdf JSON format at the given version.
"QPDF JSON Format" section of the manual for information about Only version 2 is supported. See also --json-stream-data
how to use this option. and --json-stream-prefix
This option creates a PDF file from the previous output of ``qpdf The output file will be qpdf JSON format at the given version. Only
--json`` that includes stream data and information about all version 2 is supported. See also :qpdf:ref:`--json-stream-data` and
objects. For information about converting between PDF and JSON, :qpdf:ref:`--json-stream-prefix`.
please see :ref:`qpdf-json`.
.. qpdf:option:: --json-input
.. help: input file is qpdf JSON
Treat the input file as a JSON file in qpdf JSON format as
written by qpdf --json-output. See the "QPDF JSON Format"
section of the manual for information about how to use this
option.
Treat the input file as a JSON file in qpdf JSON format as written
by ``qpdf --json-output``. The input file must be complete and
include all stream data. For information about converting between
PDF and JSON, please see :ref:`qpdf-json`.
.. qpdf:option:: --update-from-json=qpdf-json-file .. qpdf:option:: --update-from-json=qpdf-json-file

View File

@ -651,10 +651,8 @@ QPDFJob json encrypt missing password 0
QPDFJob json pages no file 0 QPDFJob json pages no file 0
qpdf-c called qpdf_empty_pdf 0 qpdf-c called qpdf_empty_pdf 0
QPDF_json missing qpdf 0 QPDF_json missing qpdf 0
QPDF_json missing json version 0
QPDF_json missing pdf version 0 QPDF_json missing pdf version 0
QPDF_json top-level scalar 0 QPDF_json top-level scalar 0
QPDF_json bad json version 0
QPDF_json bad pdf version 0 QPDF_json bad pdf version 0
QPDF_json top-level array 0 QPDF_json top-level array 0
QPDF_json bad object key 0 QPDF_json bad object key 0
@ -668,3 +666,6 @@ QPDF_json data datafile both or neither 0
QPDF_json stream no dict 0 QPDF_json stream no dict 0
QPDF_json trailer no value 0 QPDF_json trailer no value 0
QPDF_json value stream both or neither 0 QPDF_json value stream both or neither 0
QPDFJob need json-stream-prefix for stdout 0
QPDFJob write json to stdout 0
QPDFJob write json to file 0

View File

@ -26,16 +26,16 @@ my @json_files = (
['field-types', ['--show-encryption-key']], ['field-types', ['--show-encryption-key']],
['image-streams', ['--decode-level=all']], ['image-streams', ['--decode-level=all']],
['image-streams', ['--decode-level=specialized']], ['image-streams', ['--decode-level=specialized']],
['page-labels-and-outlines', ['--json-key=qpdf']], ['page-labels-and-outlines', ['--json-key=objects']],
['page-labels-and-outlines', ['--json-key=pages']], ['page-labels-and-outlines', ['--json-key=pages']],
['page-labels-and-outlines', ['--json-key=pagelabels']], ['page-labels-and-outlines', ['--json-key=pagelabels']],
['page-labels-and-outlines', ['--json-key=outlines']], ['page-labels-and-outlines', ['--json-key=outlines']],
['page-labels-and-outlines', ['page-labels-and-outlines',
['--json-key=outlines', '--json-key=pages']], ['--json-key=outlines', '--json-key=pages']],
['page-labels-and-outlines', ['page-labels-and-outlines',
['--json-key=qpdf', '--json-object=trailer']], ['--json-key=objects', '--json-object=trailer']],
['page-labels-and-outlines', ['page-labels-and-outlines',
['--json-key=qpdf', '--json-object=trailer', '--json-object=2 0 R']], ['--json-key=objects', '--json-object=trailer', '--json-object=2 0 R']],
['field-types', ['--json-key=acroform']], ['field-types', ['--json-key=acroform']],
['need-appearances', ['--json-key=acroform']], ['need-appearances', ['--json-key=acroform']],
['V4-aes', ['--json-key=encrypt']], ['V4-aes', ['--json-key=encrypt']],
@ -46,27 +46,18 @@ foreach my $d (@json_files)
{ {
my ($file, $xargs) = @$d; my ($file, $xargs) = @$d;
my $out = "json-$file"; my $out = "json-$file";
my @v1_xargs = ();
foreach my $x (@$xargs) foreach my $x (@$xargs)
{ {
my $y = $x; my $y = $x;
$y =~ s/^.*=//; $y =~ s/^.*=//;
$y =~ s/\s.*//; $y =~ s/\s.*//;
$out .= "-$y"; $out .= "-$y";
if ($x eq '--json-key=qpdf')
{
push(@v1_xargs, '--json-key=objects');
}
else
{
push(@v1_xargs, $x);
}
} }
my $in = "$file.pdf"; my $in = "$file.pdf";
$td->runtest("json v1 $out", $td->runtest("json v1 $out",
{$td->COMMAND => {$td->COMMAND =>
['qpdf', '--json=1', '--test-json-schema', ['qpdf', '--json=1', '--test-json-schema',
@v1_xargs, $in]}, @$xargs, $in]},
{$td->FILE => "$out-v1.out", $td->EXIT_STATUS => 0}, {$td->FILE => "$out-v1.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("json v2 $out", $td->runtest("json v2 $out",
@ -78,8 +69,8 @@ foreach my $d (@json_files)
$td->runtest("bad json stream data (inline)", $td->runtest("bad json stream data (inline)",
{$td->COMMAND => {$td->COMMAND =>
"qpdf --json=2 --test-json-schema" . "qpdf --json-output=2" .
" --json-stream-data=inline bad-data.pdf > a.json"}, " --json-stream-data=inline bad-data.pdf a.json"},
{$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3}, {$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("check (inline)", $td->runtest("check (inline)",
@ -88,9 +79,9 @@ $td->runtest("check (inline)",
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("bad json stream data (file)", $td->runtest("bad json stream data (file)",
{$td->COMMAND => {$td->COMMAND =>
"qpdf --json=2 --test-json-schema" . "qpdf --json-output=2 " .
" --json-stream-data=file --json-stream-prefix=auto" . " --json-stream-data=file --json-stream-prefix=auto" .
" bad-data.pdf > a.json"}, " bad-data.pdf a.json"},
{$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3}, {$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("check (file)", $td->runtest("check (file)",
@ -110,7 +101,7 @@ foreach my $l (qw(none generalized specialized all))
# library is use. # library is use.
$td->runtest("image-streams json inline: $l", $td->runtest("image-streams json inline: $l",
{$td->COMMAND => {$td->COMMAND =>
"qpdf image-streams-small.pdf --json=2" . "qpdf image-streams-small.pdf - --json-output=2" .
" --decode-level=$l --json-stream-data=inline"}, " --decode-level=$l --json-stream-data=inline"},
{$td->FILE => "json-image-streams-$l-inline-v2.out", {$td->FILE => "json-image-streams-$l-inline-v2.out",
$td->EXIT_STATUS => 0}, $td->EXIT_STATUS => 0},
@ -118,9 +109,9 @@ foreach my $l (qw(none generalized specialized all))
} }
$td->runtest("image-streams json file: $l", $td->runtest("image-streams json file: $l",
{$td->COMMAND => {$td->COMMAND =>
"qpdf image-streams-small.pdf --json=2" . "qpdf image-streams-small.pdf - --json-output=2" .
" --decode-level=$l --json-stream-data=file" . " --decode-level=$l --json-stream-data=file" .
" --json-stream-prefix=auto --json-key=qpdf" . " --json-stream-prefix=auto" .
" --json-object=12 --json-object=16 --json-object=18"}, " --json-object=12 --json-object=16 --json-object=18"},
{$td->FILE => "json-image-streams-$l-file-v2.out", {$td->FILE => "json-image-streams-$l-file-v2.out",
$td->EXIT_STATUS => 0}, $td->EXIT_STATUS => 0},
@ -159,10 +150,12 @@ foreach my $l (qw(none generalized specialized all))
} }
} }
$td->runtest("use --to-json option", $td->runtest("file to stdout without prefix",
{$td->COMMAND => "qpdf --to-json image-streams-small.pdf"}, {$td->COMMAND =>
{$td->FILE => "image-streams-small-to-json.out", "qpdf image-streams-small.pdf - --json-output=2" .
$td->EXIT_STATUS => 0}, " -json-stream-data=file"},
{$td->FILE => "file-stdout-needs-prefix.out",
$td->EXIT_STATUS => 2},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
cleanup(); cleanup();

View File

@ -50,19 +50,19 @@ $td->runtest("show direct pages",
# Json mode for direct and duplicated pages illustrates that the # Json mode for direct and duplicated pages illustrates that the
# "objects" section the original objects before correction when # "objects" section the original objects before correction when
# "pages" is not output but after correct when it is.# numbers. # "pages" is not output but after correct when it is.
foreach my $f (qw(page_api_2 direct-pages)) foreach my $f (qw(page_api_2 direct-pages))
{ {
$td->runtest("json for $f (objects only)", $td->runtest("json for $f (objects only)",
{$td->COMMAND => {$td->COMMAND =>
"qpdf --json=latest $f.pdf" . "qpdf --json=latest $f.pdf" .
" --json-key=qpdf"}, " --json-key=objects"},
{$td->FILE => "$f-json-objects.out", $td->EXIT_STATUS => 0}, {$td->FILE => "$f-json-objects.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("json for $f (with pages)", $td->runtest("json for $f (with pages)",
{$td->COMMAND => {$td->COMMAND =>
"qpdf --json=latest $f.pdf" . "qpdf --json=latest $f.pdf" .
" --json-key=qpdf --json-key=pages"}, " --json-key=objects --json-key=pages"},
{$td->FILE => "$f-json-pages.out", $td->EXIT_STATUS => 0}, {$td->FILE => "$f-json-pages.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
} }

View File

@ -1,3 +1,3 @@
WARNING: bad-data.pdf (offset 319): error decoding stream data for object 4 0: LZWDecoder: bad code received WARNING: bad-data.pdf (offset 319): error decoding stream data for object 4 0: LZWDecoder: bad code received
WARNING: bad-data.pdf (offset 319): stream will be re-processed without filtering to avoid data loss WARNING: bad-data.pdf (offset 319): stream will be re-processed without filtering to avoid data loss
qpdf: operation succeeded with warnings qpdf: operation succeeded with warnings; resulting file may have some problems

View File

@ -3,93 +3,88 @@
"parameters": { "parameters": {
"decodelevel": "generalized" "decodelevel": "generalized"
}, },
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 6, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/Count": 2,
}, "/Kids": [
"obj:2 0 R": { {
"value": { "/Contents": "3 0 R",
"/Count": 2, "/MediaBox": [
"/Kids": [ 0,
{ 0,
"/Contents": "3 0 R", 612,
"/MediaBox": [ 792
0, ],
0, "/Parent": "2 0 R",
612, "/Resources": {
792 "/Font": {
], "/F1": "5 0 R"
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "5 0 R"
},
"/ProcSet": "6 0 R"
}, },
"/Type": "/Page" "/ProcSet": "6 0 R"
}, },
{ "/Type": "/Page"
"/Contents": "3 0 R", },
"/MediaBox": [ {
0, "/Contents": "3 0 R",
0, "/MediaBox": [
612, 0,
792 0,
], 612,
"/Parent": "2 0 R", 792
"/Resources": { ],
"/Font": { "/Parent": "2 0 R",
"/F1": "5 0 R" "/Resources": {
}, "/Font": {
"/ProcSet": "6 0 R" "/F1": "5 0 R"
}, },
"/Type": "/Page" "/ProcSet": "6 0 R"
} },
], "/Type": "/Page"
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"stream": {
"dict": {
"/Length": "4 0 R"
} }
],
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"stream": {
"dict": {
"/Length": "4 0 R"
} }
}, }
"obj:4 0 R": { },
"value": 44 "obj:4 0 R": {
}, "value": 44
"obj:5 0 R": { },
"value": { "obj:5 0 R": {
"/BaseFont": "/Helvetica", "value": {
"/Encoding": "/WinAnsiEncoding", "/BaseFont": "/Helvetica",
"/Name": "/F1", "/Encoding": "/WinAnsiEncoding",
"/Subtype": "/Type1", "/Name": "/F1",
"/Type": "/Font" "/Subtype": "/Type1",
} "/Type": "/Font"
}, }
"obj:6 0 R": { },
"value": [ "obj:6 0 R": {
"/PDF", "value": [
"/Text" "/PDF",
] "/Text"
}, ]
"trailer": { },
"value": { "trailer": {
"/ID": [ "value": {
"b:1323a5937c577a66735583a93698ce3c", "/ID": [
"b:372cbf44f6db88ab60d9263c0f0bd26a" "b:1323a5937c577a66735583a93698ce3c",
], "b:372cbf44f6db88ab60d9263c0f0bd26a"
"/Root": "1 0 R", ],
"/Size": 7 "/Root": "1 0 R",
} "/Size": 7
} }
} }
} }

View File

@ -25,99 +25,94 @@
"pageposfrom1": 2 "pageposfrom1": 2
} }
], ],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 8, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
"/Count": 2,
"/Kids": [
"7 0 R",
"8 0 R"
],
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"stream": {
"dict": {
"/Length": "4 0 R"
} }
}, }
"obj:2 0 R": { },
"value": { "obj:4 0 R": {
"/Count": 2, "value": 44
"/Kids": [ },
"7 0 R", "obj:5 0 R": {
"8 0 R" "value": {
], "/BaseFont": "/Helvetica",
"/Type": "/Pages" "/Encoding": "/WinAnsiEncoding",
} "/Name": "/F1",
}, "/Subtype": "/Type1",
"obj:3 0 R": { "/Type": "/Font"
"stream": { }
"dict": { },
"/Length": "4 0 R" "obj:6 0 R": {
} "value": [
} "/PDF",
}, "/Text"
"obj:4 0 R": { ]
"value": 44 },
}, "obj:7 0 R": {
"obj:5 0 R": { "value": {
"value": { "/Contents": "3 0 R",
"/BaseFont": "/Helvetica", "/MediaBox": [
"/Encoding": "/WinAnsiEncoding", 0,
"/Name": "/F1", 0,
"/Subtype": "/Type1", 612,
"/Type": "/Font" 792
} ],
}, "/Parent": "2 0 R",
"obj:6 0 R": { "/Resources": {
"value": [ "/Font": {
"/PDF", "/F1": "5 0 R"
"/Text"
]
},
"obj:7 0 R": {
"value": {
"/Contents": "3 0 R",
"/MediaBox": [
0,
0,
612,
792
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "5 0 R"
},
"/ProcSet": "6 0 R"
}, },
"/Type": "/Page" "/ProcSet": "6 0 R"
} },
}, "/Type": "/Page"
"obj:8 0 R": { }
"value": { },
"/Contents": "3 0 R", "obj:8 0 R": {
"/MediaBox": [ "value": {
0, "/Contents": "3 0 R",
0, "/MediaBox": [
612, 0,
792 0,
], 612,
"/Parent": "2 0 R", 792
"/Resources": { ],
"/Font": { "/Parent": "2 0 R",
"/F1": "5 0 R" "/Resources": {
}, "/Font": {
"/ProcSet": "6 0 R" "/F1": "5 0 R"
}, },
"/Type": "/Page" "/ProcSet": "6 0 R"
} },
}, "/Type": "/Page"
"trailer": { }
"value": { },
"/ID": [ "trailer": {
"b:1323a5937c577a66735583a93698ce3c", "value": {
"b:372cbf44f6db88ab60d9263c0f0bd26a" "/ID": [
], "b:1323a5937c577a66735583a93698ce3c",
"/Root": "1 0 R", "b:372cbf44f6db88ab60d9263c0f0bd26a"
"/Size": 7 ],
} "/Root": "1 0 R",
"/Size": 7
} }
} }
} }

View File

@ -0,0 +1,9 @@
qpdf: please specify --json-stream-prefix since the input file name is unknown
For help:
qpdf --help=usage usage information
qpdf --help=topic help on a topic
qpdf --help=--option help on an option
qpdf --help general help and a topic list

File diff suppressed because one or more lines are too long

View File

@ -1,57 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"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,
"modify": true,
"modifyannotations": 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"
},
"userpasswordmatched": false
},
"outlines": [],
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,57 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"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,
"modify": true,
"modifyannotations": 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"
},
"userpasswordmatched": false
},
"outlines": [],
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "all"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -274,473 +274,468 @@
"userpasswordmatched": false "userpasswordmatched": false
}, },
"outlines": [], "outlines": [],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 30, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/Count": 9,
}, "/Kids": [
"obj:2 0 R": { "3 0 R",
"value": { "4 0 R",
"/Count": 9, "5 0 R",
"/Kids": [ "6 0 R",
"3 0 R", "7 0 R",
"4 0 R", "8 0 R",
"5 0 R", "9 0 R",
"6 0 R", "10 0 R",
"7 0 R", "11 0 R"
"8 0 R", ],
"9 0 R", "/Type": "/Pages"
"10 0 R", }
"11 0 R" },
], "obj:3 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "12 0 R",
}, "/MediaBox": [
"obj:3 0 R": { 0,
"value": { 0,
"/Contents": "12 0 R", 612,
"/MediaBox": [ 392
0, ],
0, "/Parent": "2 0 R",
612, "/Resources": {
392 "/Font": {
], "/F1": "13 0 R"
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
},
"/ProcSet": [
"/PDF",
"/Text",
"/ImageC"
],
"/XObject": {
"/Im1": "14 0 R"
}
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:4 0 R": { "/ImageC"
"value": {
"/Contents": "15 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "14 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:4 0 R": {
"/ImageC" "value": {
], "/Contents": "15 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "16 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:5 0 R": { "/ImageC"
"value": {
"/Contents": "17 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "16 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:5 0 R": {
"/ImageC" "value": {
], "/Contents": "17 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "18 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:6 0 R": { "/ImageC"
"value": {
"/Contents": "19 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "18 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:6 0 R": {
"/ImageC" "value": {
], "/Contents": "19 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "20 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:7 0 R": { "/ImageC"
"value": {
"/Contents": "21 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "20 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:7 0 R": {
"/ImageC" "value": {
], "/Contents": "21 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "22 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:8 0 R": { "/ImageC"
"value": {
"/Contents": "23 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "22 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:8 0 R": {
"/ImageC" "value": {
], "/Contents": "23 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "24 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:9 0 R": { "/ImageC"
"value": {
"/Contents": "25 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "24 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:9 0 R": {
"/ImageC" "value": {
], "/Contents": "25 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "26 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:10 0 R": { "/ImageC"
"value": {
"/Contents": "27 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "26 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:10 0 R": {
"/ImageC" "value": {
], "/Contents": "27 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "28 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:11 0 R": { "/ImageC"
"value": {
"/Contents": "29 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "28 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:11 0 R": {
"/ImageC" "value": {
], "/Contents": "29 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "30 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:12 0 R": { "/ImageC"
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
], ],
"/Root": "1 0 R", "/XObject": {
"/Size": 31 "/Im1": "30 0 R"
}
},
"/Type": "/Page"
}
},
"obj:12 0 R": {
"stream": {
"dict": {
"/Length": 95
} }
} }
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
],
"/Root": "1 0 R",
"/Size": 31
}
} }
} }
} }

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "generalized"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -1,281 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "generalized"
},
"pages": [
{
"contents": [
"12 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "14 0 R",
"width": 40
}
],
"label": null,
"object": "3 0 R",
"outlines": [],
"pageposfrom1": 1
},
{
"contents": [
"15 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "16 0 R",
"width": 40
}
],
"label": null,
"object": "4 0 R",
"outlines": [],
"pageposfrom1": 2
},
{
"contents": [
"17 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "18 0 R",
"width": 40
}
],
"label": null,
"object": "5 0 R",
"outlines": [],
"pageposfrom1": 3
},
{
"contents": [
"19 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "20 0 R",
"width": 40
}
],
"label": null,
"object": "6 0 R",
"outlines": [],
"pageposfrom1": 4
},
{
"contents": [
"21 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "22 0 R",
"width": 40
}
],
"label": null,
"object": "7 0 R",
"outlines": [],
"pageposfrom1": 5
},
{
"contents": [
"23 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "24 0 R",
"width": 40
}
],
"label": null,
"object": "8 0 R",
"outlines": [],
"pageposfrom1": 6
},
{
"contents": [
"25 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "26 0 R",
"width": 40
}
],
"label": null,
"object": "9 0 R",
"outlines": [],
"pageposfrom1": 7
},
{
"contents": [
"27 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "28 0 R",
"width": 40
}
],
"label": null,
"object": "10 0 R",
"outlines": [],
"pageposfrom1": 8
},
{
"contents": [
"29 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "30 0 R",
"width": 40
}
],
"label": null,
"object": "11 0 R",
"outlines": [],
"pageposfrom1": 9
}
],
"pagelabels": [],
"acroform": {
"fields": [],
"hasacroform": false,
"needappearances": false
},
"attachments": {},
"encrypt": {
"capabilities": {
"accessibility": true,
"extract": true,
"modify": true,
"modifyannotations": 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"
},
"userpasswordmatched": false
},
"outlines": [],
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -1,281 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"pages": [
{
"contents": [
"12 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "14 0 R",
"width": 40
}
],
"label": null,
"object": "3 0 R",
"outlines": [],
"pageposfrom1": 1
},
{
"contents": [
"15 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "16 0 R",
"width": 40
}
],
"label": null,
"object": "4 0 R",
"outlines": [],
"pageposfrom1": 2
},
{
"contents": [
"17 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "18 0 R",
"width": 40
}
],
"label": null,
"object": "5 0 R",
"outlines": [],
"pageposfrom1": 3
},
{
"contents": [
"19 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "20 0 R",
"width": 40
}
],
"label": null,
"object": "6 0 R",
"outlines": [],
"pageposfrom1": 4
},
{
"contents": [
"21 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "22 0 R",
"width": 40
}
],
"label": null,
"object": "7 0 R",
"outlines": [],
"pageposfrom1": 5
},
{
"contents": [
"23 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "24 0 R",
"width": 40
}
],
"label": null,
"object": "8 0 R",
"outlines": [],
"pageposfrom1": 6
},
{
"contents": [
"25 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "26 0 R",
"width": 40
}
],
"label": null,
"object": "9 0 R",
"outlines": [],
"pageposfrom1": 7
},
{
"contents": [
"27 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "28 0 R",
"width": 40
}
],
"label": null,
"object": "10 0 R",
"outlines": [],
"pageposfrom1": 8
},
{
"contents": [
"29 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "30 0 R",
"width": 40
}
],
"label": null,
"object": "11 0 R",
"outlines": [],
"pageposfrom1": 9
}
],
"pagelabels": [],
"acroform": {
"fields": [],
"hasacroform": false,
"needappearances": false
},
"attachments": {},
"encrypt": {
"capabilities": {
"accessibility": true,
"extract": true,
"modify": true,
"modifyannotations": 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"
},
"userpasswordmatched": false
},
"outlines": [],
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -274,485 +274,480 @@
"userpasswordmatched": false "userpasswordmatched": false
}, },
"outlines": [], "outlines": [],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 30, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/Count": 9,
}, "/Kids": [
"obj:2 0 R": { "3 0 R",
"value": { "4 0 R",
"/Count": 9, "5 0 R",
"/Kids": [ "6 0 R",
"3 0 R", "7 0 R",
"4 0 R", "8 0 R",
"5 0 R", "9 0 R",
"6 0 R", "10 0 R",
"7 0 R", "11 0 R"
"8 0 R", ],
"9 0 R", "/Type": "/Pages"
"10 0 R", }
"11 0 R" },
], "obj:3 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "12 0 R",
}, "/MediaBox": [
"obj:3 0 R": { 0,
"value": { 0,
"/Contents": "12 0 R", 612,
"/MediaBox": [ 392
0, ],
0, "/Parent": "2 0 R",
612, "/Resources": {
392 "/Font": {
], "/F1": "13 0 R"
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
},
"/ProcSet": [
"/PDF",
"/Text",
"/ImageC"
],
"/XObject": {
"/Im1": "14 0 R"
}
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:4 0 R": { "/ImageC"
"value": {
"/Contents": "15 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "14 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:4 0 R": {
"/ImageC" "value": {
], "/Contents": "15 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "16 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:5 0 R": { "/ImageC"
"value": {
"/Contents": "17 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "16 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:5 0 R": {
"/ImageC" "value": {
], "/Contents": "17 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "18 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:6 0 R": { "/ImageC"
"value": {
"/Contents": "19 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "18 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:6 0 R": {
"/ImageC" "value": {
], "/Contents": "19 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "20 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:7 0 R": { "/ImageC"
"value": {
"/Contents": "21 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "20 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:7 0 R": {
"/ImageC" "value": {
], "/Contents": "21 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "22 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:8 0 R": { "/ImageC"
"value": {
"/Contents": "23 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "22 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:8 0 R": {
"/ImageC" "value": {
], "/Contents": "23 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "24 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:9 0 R": { "/ImageC"
"value": {
"/Contents": "25 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "24 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:9 0 R": {
"/ImageC" "value": {
], "/Contents": "25 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "26 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:10 0 R": { "/ImageC"
"value": {
"/Contents": "27 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "26 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:10 0 R": {
"/ImageC" "value": {
], "/Contents": "27 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "28 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:11 0 R": { "/ImageC"
"value": {
"/Contents": "29 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "28 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:11 0 R": {
"/ImageC" "value": {
], "/Contents": "29 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "30 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:12 0 R": { "/ImageC"
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 97
}
}
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 51,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 102
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 454,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 108
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 7688,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 96
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 46,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 99
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 849,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 6411,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 97
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 36,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 359,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 108
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 37,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"trailer": {
"value": {
"/ID": [
"b:5aa7af805079bb907e9034361d9a11a2",
"b:5aa7af805079bb907e9034361d9a11a2"
], ],
"/Root": "1 0 R", "/XObject": {
"/Size": 31 "/Im1": "30 0 R"
}
},
"/Type": "/Page"
}
},
"obj:12 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 97
} }
} }
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 51,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 102
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 454,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 108
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 7688,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 96
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 46,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 99
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 849,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 6411,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 97
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/FlateDecode",
"/Height": 48,
"/Length": 36,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 48,
"/Length": 359,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Filter": "/FlateDecode",
"/Length": 108
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 48,
"/Length": 37,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 40
}
}
},
"trailer": {
"value": {
"/ID": [
"b:5aa7af805079bb907e9034361d9a11a2",
"b:5aa7af805079bb907e9034361d9a11a2"
],
"/Root": "1 0 R",
"/Size": 31
}
} }
} }
} }

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "specialized"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -1,281 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "specialized"
},
"pages": [
{
"contents": [
"12 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "14 0 R",
"width": 40
}
],
"label": null,
"object": "3 0 R",
"outlines": [],
"pageposfrom1": 1
},
{
"contents": [
"15 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "16 0 R",
"width": 40
}
],
"label": null,
"object": "4 0 R",
"outlines": [],
"pageposfrom1": 2
},
{
"contents": [
"17 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceCMYK",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "18 0 R",
"width": 40
}
],
"label": null,
"object": "5 0 R",
"outlines": [],
"pageposfrom1": 3
},
{
"contents": [
"19 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "20 0 R",
"width": 40
}
],
"label": null,
"object": "6 0 R",
"outlines": [],
"pageposfrom1": 4
},
{
"contents": [
"21 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "22 0 R",
"width": 40
}
],
"label": null,
"object": "7 0 R",
"outlines": [],
"pageposfrom1": 5
},
{
"contents": [
"23 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceRGB",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "24 0 R",
"width": 40
}
],
"label": null,
"object": "8 0 R",
"outlines": [],
"pageposfrom1": 6
},
{
"contents": [
"25 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/FlateDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "26 0 R",
"width": 40
}
],
"label": null,
"object": "9 0 R",
"outlines": [],
"pageposfrom1": 7
},
{
"contents": [
"27 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/DCTDecode"
],
"filterable": false,
"height": 48,
"name": "/Im1",
"object": "28 0 R",
"width": 40
}
],
"label": null,
"object": "10 0 R",
"outlines": [],
"pageposfrom1": 8
},
{
"contents": [
"29 0 R"
],
"images": [
{
"bitspercomponent": 8,
"colorspace": "/DeviceGray",
"decodeparms": [
null
],
"filter": [
"/RunLengthDecode"
],
"filterable": true,
"height": 48,
"name": "/Im1",
"object": "30 0 R",
"width": 40
}
],
"label": null,
"object": "11 0 R",
"outlines": [],
"pageposfrom1": 9
}
],
"pagelabels": [],
"acroform": {
"fields": [],
"hasacroform": false,
"needappearances": false
},
"attachments": {},
"encrypt": {
"capabilities": {
"accessibility": true,
"extract": true,
"modify": true,
"modifyannotations": 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"
},
"userpasswordmatched": false
},
"outlines": [],
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 30, "maxobjectid": 30,
"objects": { "objects": {

View File

@ -274,473 +274,468 @@
"userpasswordmatched": false "userpasswordmatched": false
}, },
"outlines": [], "outlines": [],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 30, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/Count": 9,
}, "/Kids": [
"obj:2 0 R": { "3 0 R",
"value": { "4 0 R",
"/Count": 9, "5 0 R",
"/Kids": [ "6 0 R",
"3 0 R", "7 0 R",
"4 0 R", "8 0 R",
"5 0 R", "9 0 R",
"6 0 R", "10 0 R",
"7 0 R", "11 0 R"
"8 0 R", ],
"9 0 R", "/Type": "/Pages"
"10 0 R", }
"11 0 R" },
], "obj:3 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "12 0 R",
}, "/MediaBox": [
"obj:3 0 R": { 0,
"value": { 0,
"/Contents": "12 0 R", 612,
"/MediaBox": [ 392
0, ],
0, "/Parent": "2 0 R",
612, "/Resources": {
392 "/Font": {
], "/F1": "13 0 R"
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
},
"/ProcSet": [
"/PDF",
"/Text",
"/ImageC"
],
"/XObject": {
"/Im1": "14 0 R"
}
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:4 0 R": { "/ImageC"
"value": {
"/Contents": "15 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "14 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:4 0 R": {
"/ImageC" "value": {
], "/Contents": "15 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "16 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:5 0 R": { "/ImageC"
"value": {
"/Contents": "17 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "16 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:5 0 R": {
"/ImageC" "value": {
], "/Contents": "17 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "18 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:6 0 R": { "/ImageC"
"value": {
"/Contents": "19 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "18 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:6 0 R": {
"/ImageC" "value": {
], "/Contents": "19 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "20 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:7 0 R": { "/ImageC"
"value": {
"/Contents": "21 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "20 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:7 0 R": {
"/ImageC" "value": {
], "/Contents": "21 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "22 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:8 0 R": { "/ImageC"
"value": {
"/Contents": "23 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "22 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:8 0 R": {
"/ImageC" "value": {
], "/Contents": "23 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "24 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:9 0 R": { "/ImageC"
"value": {
"/Contents": "25 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "24 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:9 0 R": {
"/ImageC" "value": {
], "/Contents": "25 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "26 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:10 0 R": { "/ImageC"
"value": {
"/Contents": "27 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "26 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:10 0 R": {
"/ImageC" "value": {
], "/Contents": "27 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "28 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:11 0 R": { "/ImageC"
"value": {
"/Contents": "29 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "28 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:11 0 R": {
"/ImageC" "value": {
], "/Contents": "29 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "30 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:12 0 R": { "/ImageC"
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
], ],
"/Root": "1 0 R", "/XObject": {
"/Size": 31 "/Im1": "30 0 R"
}
},
"/Type": "/Page"
}
},
"obj:12 0 R": {
"stream": {
"dict": {
"/Length": 95
} }
} }
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
],
"/Root": "1 0 R",
"/Size": 31
}
} }
} }
} }

View File

@ -274,473 +274,468 @@
"userpasswordmatched": false "userpasswordmatched": false
}, },
"outlines": [], "outlines": [],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 30, "/Pages": "2 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "2 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/Count": 9,
}, "/Kids": [
"obj:2 0 R": { "3 0 R",
"value": { "4 0 R",
"/Count": 9, "5 0 R",
"/Kids": [ "6 0 R",
"3 0 R", "7 0 R",
"4 0 R", "8 0 R",
"5 0 R", "9 0 R",
"6 0 R", "10 0 R",
"7 0 R", "11 0 R"
"8 0 R", ],
"9 0 R", "/Type": "/Pages"
"10 0 R", }
"11 0 R" },
], "obj:3 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "12 0 R",
}, "/MediaBox": [
"obj:3 0 R": { 0,
"value": { 0,
"/Contents": "12 0 R", 612,
"/MediaBox": [ 392
0, ],
0, "/Parent": "2 0 R",
612, "/Resources": {
392 "/Font": {
], "/F1": "13 0 R"
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
},
"/ProcSet": [
"/PDF",
"/Text",
"/ImageC"
],
"/XObject": {
"/Im1": "14 0 R"
}
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:4 0 R": { "/ImageC"
"value": {
"/Contents": "15 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "14 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:4 0 R": {
"/ImageC" "value": {
], "/Contents": "15 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "16 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:5 0 R": { "/ImageC"
"value": {
"/Contents": "17 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "16 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:5 0 R": {
"/ImageC" "value": {
], "/Contents": "17 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "18 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:6 0 R": { "/ImageC"
"value": {
"/Contents": "19 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "18 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:6 0 R": {
"/ImageC" "value": {
], "/Contents": "19 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "20 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:7 0 R": { "/ImageC"
"value": {
"/Contents": "21 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "20 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:7 0 R": {
"/ImageC" "value": {
], "/Contents": "21 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "22 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:8 0 R": { "/ImageC"
"value": {
"/Contents": "23 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "22 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:8 0 R": {
"/ImageC" "value": {
], "/Contents": "23 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "24 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:9 0 R": { "/ImageC"
"value": {
"/Contents": "25 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "24 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:9 0 R": {
"/ImageC" "value": {
], "/Contents": "25 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "26 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:10 0 R": { "/ImageC"
"value": {
"/Contents": "27 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "26 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:10 0 R": {
"/ImageC" "value": {
], "/Contents": "27 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "28 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:11 0 R": { "/ImageC"
"value": {
"/Contents": "29 0 R",
"/MediaBox": [
0,
0,
612,
392
], ],
"/Parent": "2 0 R", "/XObject": {
"/Resources": { "/Im1": "28 0 R"
"/Font": { }
"/F1": "13 0 R" },
}, "/Type": "/Page"
"/ProcSet": [ }
"/PDF", },
"/Text", "obj:11 0 R": {
"/ImageC" "value": {
], "/Contents": "29 0 R",
"/XObject": { "/MediaBox": [
"/Im1": "30 0 R" 0,
} 0,
612,
392
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "13 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text",
"obj:12 0 R": { "/ImageC"
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
], ],
"/Root": "1 0 R", "/XObject": {
"/Size": 31 "/Im1": "30 0 R"
}
},
"/Type": "/Page"
}
},
"obj:12 0 R": {
"stream": {
"dict": {
"/Length": 95
} }
} }
},
"obj:13 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Name": "/F1",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:14 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Height": 480,
"/Length": 768000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:15 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:16 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 9364,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:17 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:18 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceCMYK",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 768998,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:19 0 R": {
"stream": {
"dict": {
"/Length": 94
}
}
},
"obj:20 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Height": 480,
"/Length": 576000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:21 0 R": {
"stream": {
"dict": {
"/Length": 100
}
}
},
"obj:22 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 3650,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:23 0 R": {
"stream": {
"dict": {
"/Length": 106
}
}
},
"obj:24 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceRGB",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 641497,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:25 0 R": {
"stream": {
"dict": {
"/Length": 95
}
}
},
"obj:26 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Height": 480,
"/Length": 192000,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:27 0 R": {
"stream": {
"dict": {
"/Length": 101
}
}
},
"obj:28 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/DCTDecode",
"/Height": 480,
"/Length": 2587,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"obj:29 0 R": {
"stream": {
"dict": {
"/Length": 107
}
}
},
"obj:30 0 R": {
"stream": {
"dict": {
"/BitsPerComponent": 8,
"/ColorSpace": "/DeviceGray",
"/Filter": "/RunLengthDecode",
"/Height": 480,
"/Length": 3001,
"/Subtype": "/Image",
"/Type": "/XObject",
"/Width": 400
}
}
},
"trailer": {
"value": {
"/ID": [
"b:53b6958e9beef00ea2ac077d5f2912b6",
"b:272b8d8ba45632ab505020e7606d221d"
],
"/Root": "1 0 R",
"/Size": 31
}
} }
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,52 @@
{
"version": 2,
"parameters": {
"decodelevel": "generalized"
},
"objects": {
"obj:2 0 R": {
"value": {
"/Count": 30,
"/Kids": [
"3 0 R",
"4 0 R",
"5 0 R",
"6 0 R",
"7 0 R",
"8 0 R",
"9 0 R",
"10 0 R",
"11 0 R",
"12 0 R",
"13 0 R",
"14 0 R",
"15 0 R",
"16 0 R",
"17 0 R",
"18 0 R",
"19 0 R",
"20 0 R",
"21 0 R",
"22 0 R",
"23 0 R",
"24 0 R",
"25 0 R",
"26 0 R",
"27 0 R",
"28 0 R",
"29 0 R",
"30 0 R",
"31 0 R",
"32 0 R"
],
"/Type": "/Pages"
}
},
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 107
}
}
}
}

View File

@ -0,0 +1,14 @@
{
"version": 2,
"parameters": {
"decodelevel": "generalized"
},
"objects": {
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 107
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +0,0 @@
{
"version": 2,
"parameters": {
"decodelevel": "generalized"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3",
"maxobjectid": 106,
"objects": {
"obj:2 0 R": {
"value": {
"/Count": 30,
"/Kids": [
"3 0 R",
"4 0 R",
"5 0 R",
"6 0 R",
"7 0 R",
"8 0 R",
"9 0 R",
"10 0 R",
"11 0 R",
"12 0 R",
"13 0 R",
"14 0 R",
"15 0 R",
"16 0 R",
"17 0 R",
"18 0 R",
"19 0 R",
"20 0 R",
"21 0 R",
"22 0 R",
"23 0 R",
"24 0 R",
"25 0 R",
"26 0 R",
"27 0 R",
"28 0 R",
"29 0 R",
"30 0 R",
"31 0 R",
"32 0 R"
],
"/Type": "/Pages"
}
},
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 107
}
}
}
}
}

View File

@ -1,19 +0,0 @@
{
"version": 2,
"parameters": {
"decodelevel": "generalized"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3",
"maxobjectid": 106,
"objects": {
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 107
}
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,117 +3,112 @@
"parameters": { "parameters": {
"decodelevel": "generalized" "decodelevel": "generalized"
}, },
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 10, "/Pages": "3 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "3 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/CreationDate": "u:D:20120621124041",
}, "/Producer": "u:Apex PDFWriter"
"obj:2 0 R": { }
"value": { },
"/CreationDate": "u:D:20120621124041", "obj:3 0 R": {
"/Producer": "u:Apex PDFWriter" "value": {
} "/Count": 3,
}, "/Kids": [
"obj:3 0 R": { "4 0 R",
"value": { "4 0 R",
"/Count": 3, "5 0 R"
"/Kids": [ ],
"4 0 R", "/Type": "/Pages"
"4 0 R", }
"5 0 R" },
], "obj:4 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "6 0 R",
}, "/MediaBox": [
"obj:4 0 R": { 0,
"value": { 0,
"/Contents": "6 0 R", 612,
"/MediaBox": [ 792
0, ],
0, "/Parent": "3 0 R",
612, "/Resources": {
792 "/Font": {
], "/F1": "8 0 R"
"/Parent": "3 0 R",
"/Resources": {
"/Font": {
"/F1": "8 0 R"
},
"/ProcSet": [
"/PDF",
"/Text"
]
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text"
"obj:5 0 R": { ]
"value": { },
"/Contents": "9 0 R", "/Type": "/Page"
"/MediaBox": [ }
0, },
0, "obj:5 0 R": {
612, "value": {
792 "/Contents": "9 0 R",
], "/MediaBox": [
"/Parent": "3 0 R", 0,
"/Resources": { 0,
"/Font": { 612,
"/F1": "8 0 R" 792
}, ],
"/ProcSet": [ "/Parent": "3 0 R",
"/PDF", "/Resources": {
"/Text" "/Font": {
] "/F1": "8 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
"/PDF",
"/Text"
]
},
"/Type": "/Page"
}
},
"obj:6 0 R": {
"stream": {
"dict": {
"/Length": "7 0 R"
} }
}, }
"obj:6 0 R": { },
"stream": { "obj:7 0 R": {
"dict": { "value": 47
"/Length": "7 0 R" },
} "obj:8 0 R": {
} "value": {
}, "/BaseFont": "/Times-Roman",
"obj:7 0 R": { "/Encoding": "/WinAnsiEncoding",
"value": 47 "/Subtype": "/Type1",
}, "/Type": "/Font"
"obj:8 0 R": { }
"value": { },
"/BaseFont": "/Times-Roman", "obj:9 0 R": {
"/Encoding": "/WinAnsiEncoding", "stream": {
"/Subtype": "/Type1", "dict": {
"/Type": "/Font" "/Length": "10 0 R"
}
},
"obj:9 0 R": {
"stream": {
"dict": {
"/Length": "10 0 R"
}
}
},
"obj:10 0 R": {
"value": 47
},
"trailer": {
"value": {
"/ID": [
"b:fb18b786ff7b358705da8a532aba8f6f",
"b:f7179eb35159bfd4c00f128abcfd1f02"
],
"/Info": "2 0 R",
"/Root": "1 0 R",
"/Size": 11
} }
} }
},
"obj:10 0 R": {
"value": 47
},
"trailer": {
"value": {
"/ID": [
"b:fb18b786ff7b358705da8a532aba8f6f",
"b:f7179eb35159bfd4c00f128abcfd1f02"
],
"/Info": "2 0 R",
"/Root": "1 0 R",
"/Size": 11
}
} }
} }
} }

View File

@ -35,138 +35,133 @@
"pageposfrom1": 3 "pageposfrom1": 3
} }
], ],
"qpdf": { "objects": {
"jsonversion": 2, "obj:1 0 R": {
"pdfversion": "1.3", "value": {
"maxobjectid": 11, "/Pages": "3 0 R",
"objects": { "/Type": "/Catalog"
"obj:1 0 R": { }
"value": { },
"/Pages": "3 0 R", "obj:2 0 R": {
"/Type": "/Catalog" "value": {
} "/CreationDate": "u:D:20120621124041",
}, "/Producer": "u:Apex PDFWriter"
"obj:2 0 R": { }
"value": { },
"/CreationDate": "u:D:20120621124041", "obj:3 0 R": {
"/Producer": "u:Apex PDFWriter" "value": {
} "/Count": 3,
}, "/Kids": [
"obj:3 0 R": { "4 0 R",
"value": { "11 0 R",
"/Count": 3, "5 0 R"
"/Kids": [ ],
"4 0 R", "/Type": "/Pages"
"11 0 R", }
"5 0 R" },
], "obj:4 0 R": {
"/Type": "/Pages" "value": {
} "/Contents": "6 0 R",
}, "/MediaBox": [
"obj:4 0 R": { 0,
"value": { 0,
"/Contents": "6 0 R", 612,
"/MediaBox": [ 792
0, ],
0, "/Parent": "3 0 R",
612, "/Resources": {
792 "/Font": {
], "/F1": "8 0 R"
"/Parent": "3 0 R",
"/Resources": {
"/Font": {
"/F1": "8 0 R"
},
"/ProcSet": [
"/PDF",
"/Text"
]
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text"
"obj:5 0 R": { ]
"value": { },
"/Contents": "9 0 R", "/Type": "/Page"
"/MediaBox": [ }
0, },
0, "obj:5 0 R": {
612, "value": {
792 "/Contents": "9 0 R",
], "/MediaBox": [
"/Parent": "3 0 R", 0,
"/Resources": { 0,
"/Font": { 612,
"/F1": "8 0 R" 792
}, ],
"/ProcSet": [ "/Parent": "3 0 R",
"/PDF", "/Resources": {
"/Text" "/Font": {
] "/F1": "8 0 R"
}, },
"/Type": "/Page" "/ProcSet": [
"/PDF",
"/Text"
]
},
"/Type": "/Page"
}
},
"obj:6 0 R": {
"stream": {
"dict": {
"/Length": "7 0 R"
} }
}, }
"obj:6 0 R": { },
"stream": { "obj:7 0 R": {
"dict": { "value": 47
"/Length": "7 0 R" },
} "obj:8 0 R": {
"value": {
"/BaseFont": "/Times-Roman",
"/Encoding": "/WinAnsiEncoding",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"obj:9 0 R": {
"stream": {
"dict": {
"/Length": "10 0 R"
} }
}, }
"obj:7 0 R": { },
"value": 47 "obj:10 0 R": {
}, "value": 47
"obj:8 0 R": { },
"value": { "obj:11 0 R": {
"/BaseFont": "/Times-Roman", "value": {
"/Encoding": "/WinAnsiEncoding", "/Contents": "6 0 R",
"/Subtype": "/Type1", "/MediaBox": [
"/Type": "/Font" 0,
} 0,
}, 612,
"obj:9 0 R": { 792
"stream": { ],
"dict": { "/Parent": "3 0 R",
"/Length": "10 0 R" "/Resources": {
} "/Font": {
} "/F1": "8 0 R"
},
"obj:10 0 R": {
"value": 47
},
"obj:11 0 R": {
"value": {
"/Contents": "6 0 R",
"/MediaBox": [
0,
0,
612,
792
],
"/Parent": "3 0 R",
"/Resources": {
"/Font": {
"/F1": "8 0 R"
},
"/ProcSet": [
"/PDF",
"/Text"
]
}, },
"/Type": "/Page" "/ProcSet": [
} "/PDF",
}, "/Text"
"trailer": { ]
"value": { },
"/ID": [ "/Type": "/Page"
"b:fb18b786ff7b358705da8a532aba8f6f", }
"b:f7179eb35159bfd4c00f128abcfd1f02" },
], "trailer": {
"/Info": "2 0 R", "value": {
"/Root": "1 0 R", "/ID": [
"/Size": 11 "b:fb18b786ff7b358705da8a532aba8f6f",
} "b:f7179eb35159bfd4c00f128abcfd1f02"
],
"/Info": "2 0 R",
"/Root": "1 0 R",
"/Size": 11
} }
} }
} }

View File

@ -1,73 +0,0 @@
{
"version": 2,
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 16059,
"pdfversion": "1.3",
"maxobjectid": 6,
"objects": {
"obj:1 0 R": {
"value": {
"/Pages": "2 0 R",
"/Type": "/Catalog"
}
},
"obj:2 0 R": {
"value": {
"/Count": 1,
"/Kids": [
"3 0 R"
],
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"value": {
"/Contents": "4 0 R",
"/MediaBox": [
0,
0,
612,
792
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "6 0 R"
},
"/ProcSet": "5 0 R"
},
"/Type": "/Page"
}
},
"obj:4 0 R": {
"stream": {
"data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=",
"dict": {}
}
},
"obj:5 0 R": {
"value": [
"/PDF",
"/Text"
]
},
"obj:6 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 7
}
}
}
}
}

View File

@ -1,2 +0,0 @@
WARNING: qjson-bad-json-version1.json (offset 98): only JSON version 2 is supported
qpdf: qjson-bad-json-version1.json: errors found in JSON

View File

@ -1,73 +0,0 @@
{
"version": 2,
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": "potato",
"pdfversion": "1.3",
"maxobjectid": 6,
"objects": {
"obj:1 0 R": {
"value": {
"/Pages": "2 0 R",
"/Type": "/Catalog"
}
},
"obj:2 0 R": {
"value": {
"/Count": 1,
"/Kids": [
"3 0 R"
],
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"value": {
"/Contents": "4 0 R",
"/MediaBox": [
0,
0,
612,
792
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "6 0 R"
},
"/ProcSet": "5 0 R"
},
"/Type": "/Page"
}
},
"obj:4 0 R": {
"stream": {
"data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=",
"dict": {}
}
},
"obj:5 0 R": {
"value": [
"/PDF",
"/Text"
]
},
"obj:6 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 7
}
}
}
}
}

View File

@ -1,2 +0,0 @@
WARNING: qjson-bad-json-version2.json (offset 98): only JSON version 2 is supported
qpdf: qjson-bad-json-version2.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-bad-object-key.json (offset 181): object key should be "trailer" or "obj:n n R" WARNING: qjson-bad-object-key.json (offset 97): object key should be "trailer" or "obj:n n R"
qpdf: qjson-bad-object-key.json: errors found in JSON qpdf: qjson-bad-object-key.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "potato", "pdfversion": "potato",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-bad-pdf-version1.json (offset 119): invalid PDF version (must be x.y) WARNING: qjson-bad-pdf-version1.json (offset 35): invalid PDF version (must be x.y)
qpdf: qjson-bad-pdf-version1.json: errors found in JSON qpdf: qjson-bad-pdf-version1.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": [], "pdfversion": [],
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-bad-pdf-version2.json (offset 119): invalid PDF version (must be x.y) WARNING: qjson-bad-pdf-version2.json (offset 35): invalid PDF version (must be x.y)
qpdf: qjson-bad-pdf-version2.json: errors found in JSON qpdf: qjson-bad-pdf-version2.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6 "maxobjectid": 6
} }

View File

@ -1,2 +1,2 @@
WARNING: qjson-missing-objects.json: "qpdf.objects" was not seen WARNING: qjson-missing-objects.json: "qpdf-v2.objects" was not seen
qpdf: qjson-missing-objects.json: errors found in JSON qpdf: qjson-missing-objects.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-missing-trailer.json: "qpdf.objects.trailer" was not seen WARNING: qjson-missing-trailer.json: "qpdf-v2.objects.trailer" was not seen
qpdf: qjson-missing-trailer.json: errors found in JSON qpdf: qjson-missing-trailer.json: errors found in JSON

View File

@ -1,72 +0,0 @@
{
"version": 2,
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"pdfversion": "1.3",
"maxobjectid": 6,
"objects": {
"obj:1 0 R": {
"value": {
"/Pages": "2 0 R",
"/Type": "/Catalog"
}
},
"obj:2 0 R": {
"value": {
"/Count": 1,
"/Kids": [
"3 0 R"
],
"/Type": "/Pages"
}
},
"obj:3 0 R": {
"value": {
"/Contents": "4 0 R",
"/MediaBox": [
0,
0,
612,
792
],
"/Parent": "2 0 R",
"/Resources": {
"/Font": {
"/F1": "6 0 R"
},
"/ProcSet": "5 0 R"
},
"/Type": "/Page"
}
},
"obj:4 0 R": {
"stream": {
"data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=",
"dict": {}
}
},
"obj:5 0 R": {
"value": [
"/PDF",
"/Text"
]
},
"obj:6 0 R": {
"value": {
"/BaseFont": "/Helvetica",
"/Encoding": "/WinAnsiEncoding",
"/Subtype": "/Type1",
"/Type": "/Font"
}
},
"trailer": {
"value": {
"/Root": "1 0 R",
"/Size": 7
}
}
}
}
}

View File

@ -1,2 +0,0 @@
WARNING: qjson-no-json-version.json: "qpdf.jsonversion" was not seen
qpdf: qjson-no-json-version.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {
"obj:1 0 R": { "obj:1 0 R": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-no-pdf-version.json: "qpdf.pdfversion" was not seen WARNING: qjson-no-pdf-version.json: "qpdf-v2.pdfversion" was not seen
qpdf: qjson-no-pdf-version.json: errors found in JSON qpdf: qjson-no-pdf-version.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,7 +1,7 @@
WARNING: qjson-obj-key-errors.json (obj:2 0 R, offset 302): object must have exactly one of "value" or "stream" WARNING: qjson-obj-key-errors.json (obj:2 0 R, offset 218): object must have exactly one of "value" or "stream"
WARNING: qjson-obj-key-errors.json (obj:3 0 R, offset 600): object must have exactly one of "value" or "stream" WARNING: qjson-obj-key-errors.json (obj:3 0 R, offset 516): object must have exactly one of "value" or "stream"
WARNING: qjson-obj-key-errors.json (obj:4 0 R, offset 768): "stream" is missing "dict" WARNING: qjson-obj-key-errors.json (obj:4 0 R, offset 684): "stream" is missing "dict"
WARNING: qjson-obj-key-errors.json (obj:4 0 R, offset 768): "stream" must have exactly one of "data" or "datafile" WARNING: qjson-obj-key-errors.json (obj:4 0 R, offset 684): "stream" must have exactly one of "data" or "datafile"
WARNING: qjson-obj-key-errors.json (obj:5 0 R, offset 858): "stream" must have exactly one of "data" or "datafile" WARNING: qjson-obj-key-errors.json (obj:5 0 R, offset 774): "stream" must have exactly one of "data" or "datafile"
WARNING: qjson-obj-key-errors.json (trailer, offset 1236): "trailer" is missing "value" WARNING: qjson-obj-key-errors.json (trailer, offset 1152): "trailer" is missing "value"
qpdf: qjson-obj-key-errors.json: errors found in JSON qpdf: qjson-obj-key-errors.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-object-not-dict.json (offset 184): "obj:1 0 R" must be a dictionary WARNING: qjson-object-not-dict.json (offset 100): "obj:1 0 R" must be a dictionary
qpdf: qjson-object-not-dict.json: errors found in JSON qpdf: qjson-object-not-dict.json: errors found in JSON

View File

@ -1,6 +1,5 @@
{ {
"qpdf": { "qpdf-v2": {
"jsonversion": 2,
"pdfversion": "1.7", "pdfversion": "1.7",
"objects": false "objects": false
} }

View File

@ -1,3 +1,3 @@
WARNING: qjson-objects-not-dict.json (offset 77): "objects" must be a dictionary WARNING: qjson-objects-not-dict.json (offset 58): "objects" must be a dictionary
WARNING: qjson-objects-not-dict.json: "qpdf.objects.trailer" was not seen WARNING: qjson-objects-not-dict.json: "qpdf-v2.objects.trailer" was not seen
qpdf: qjson-objects-not-dict.json: errors found in JSON qpdf: qjson-objects-not-dict.json: errors found in JSON

View File

@ -1,6 +1,5 @@
{ {
"qpdf": { "qpdf-v2": {
"jsonversion": 2,
"pdfversion": "1.7", "pdfversion": "1.7",
"objects": { "objects": {
"obj:1 0 R": { "obj:1 0 R": {

View File

@ -1,5 +1,5 @@
WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 137): "stream.dict" must be a dictionary WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 118): "stream.dict" must be a dictionary
WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 137): unrecognized string value WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 118): unrecognized string value
WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 117): "stream" must have exactly one of "data" or "datafile" WARNING: qjson-stream-dict-not-dict.json (obj:1 0 R, offset 98): "stream" must have exactly one of "data" or "datafile"
WARNING: qjson-stream-dict-not-dict.json: "qpdf.objects.trailer" was not seen WARNING: qjson-stream-dict-not-dict.json: "qpdf-v2.objects.trailer" was not seen
qpdf: qjson-stream-dict-not-dict.json: errors found in JSON qpdf: qjson-stream-dict-not-dict.json: errors found in JSON

View File

@ -1,6 +1,5 @@
{ {
"qpdf": { "qpdf-v2": {
"jsonversion": 2,
"pdfversion": "1.7", "pdfversion": "1.7",
"objects": { "objects": {
"obj:1 0 R": { "obj:1 0 R": {

View File

@ -1,3 +1,3 @@
WARNING: qjson-stream-not-dict.json (obj:1 0 R, offset 118): "stream" must be a dictionary WARNING: qjson-stream-not-dict.json (obj:1 0 R, offset 99): "stream" must be a dictionary
WARNING: qjson-stream-not-dict.json: "qpdf.objects.trailer" was not seen WARNING: qjson-stream-not-dict.json: "qpdf-v2.objects.trailer" was not seen
qpdf: qjson-stream-not-dict.json: errors found in JSON qpdf: qjson-stream-not-dict.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-trailer-not-dict.json (trailer, offset 1327): "trailer.value" must be a dictionary WARNING: qjson-trailer-not-dict.json (trailer, offset 1243): "trailer.value" must be a dictionary
qpdf: qjson-trailer-not-dict.json: errors found in JSON qpdf: qjson-trailer-not-dict.json: errors found in JSON

View File

@ -1,10 +1,5 @@
{ {
"version": 2, "qpdf-v2": {
"parameters": {
"decodelevel": "none"
},
"qpdf": {
"jsonversion": 2,
"pdfversion": "1.3", "pdfversion": "1.3",
"maxobjectid": 6, "maxobjectid": 6,
"objects": { "objects": {

View File

@ -1,2 +1,2 @@
WARNING: qjson-trailer-stream.json (trailer, offset 1327): the trailer may not be a stream WARNING: qjson-trailer-stream.json (trailer, offset 1243): the trailer may not be a stream
qpdf: qjson-trailer-stream.json: errors found in JSON qpdf: qjson-trailer-stream.json: errors found in JSON

View File

@ -18,11 +18,8 @@ my $n_tests = 0;
my @badfiles = ( my @badfiles = (
'no-qpdf-object', 'no-qpdf-object',
'no-json-version',
'no-pdf-version', 'no-pdf-version',
'top-level-scalar', 'top-level-scalar',
'bad-json-version1',
'bad-json-version2',
'bad-pdf-version1', 'bad-pdf-version1',
'bad-pdf-version2', 'bad-pdf-version2',
'top-level-array', 'top-level-array',
@ -44,7 +41,7 @@ foreach my $f (@badfiles)
{ {
$td->runtest("bad: $f", $td->runtest("bad: $f",
{$td->COMMAND => {$td->COMMAND =>
"qpdf --create-from-json=qjson-$f.json a.pdf"}, "qpdf --json-input qjson-$f.json a.pdf"},
{$td->FILE => "qjson-$f.out", $td->EXIT_STATUS => 2}, {$td->FILE => "qjson-$f.out", $td->EXIT_STATUS => 2},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
} }