From d97474868d7fa6a94bab49d89af5dd82fd5e3a41 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 28 Jan 2018 18:28:45 -0500 Subject: [PATCH] Lexer enhancements: EOF, comment, space Significant enhancements to the lexer to improve EOF handling and to support comments and spaces as tokens. Various other minor issues were fixed as well. --- ChangeLog | 32 + include/qpdf/QPDFTokenizer.hh | 14 +- libqpdf/FileInputSource.cc | 22 +- libqpdf/QPDFTokenizer.cc | 114 +- qpdf/qpdf.testcov | 3 +- qpdf/qtest/qpdf.test | 12 +- qpdf/qtest/qpdf/bad16-recover.out | 4 +- qpdf/qtest/qpdf/bad16.out | 2 +- qpdf/qtest/qpdf/good14.out | 8 + qpdf/qtest/qpdf/good14.pdf | 22 +- qpdf/qtest/qpdf/good14.qdf | 67 +- qpdf/qtest/qpdf/issue-100.out | 2 +- qpdf/qtest/qpdf/issue-101.out | 4 +- qpdf/qtest/qpdf/issue-146.out | 2 +- qpdf/qtest/qpdf/issue-51.out | 2 +- qpdf/qtest/qpdf/issue-99.out | 2 +- qpdf/qtest/qpdf/issue-99b.out | 2 +- qpdf/qtest/qpdf/linearization-bounds-1.out | 2 +- qpdf/qtest/qpdf/tokens-maxlen.out | 2476 ++++++++++++++++++++ qpdf/qtest/qpdf/tokens-no-ignorable.out | 1120 +++++++++ qpdf/qtest/qpdf/tokens.out | 1187 +++++++++- qpdf/test_tokenizer.cc | 74 +- 22 files changed, 5084 insertions(+), 89 deletions(-) create mode 100644 qpdf/qtest/qpdf/tokens-maxlen.out create mode 100644 qpdf/qtest/qpdf/tokens-no-ignorable.out diff --git a/ChangeLog b/ChangeLog index 9b55d807..e95e2370 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2018-02-04 Jay Berkenbilt + + * Significant lexer (tokenizer) enhancements. These are changes to + the QPDFTokenizer class. These changes are of concern only to + people who are operating with PDF files at the lexical layer + using qpdf. They have little or no impact on most high-level + interfaces or the command-line tool. + * New token types tt_space and tt_comment to recognize + whitespace and comments. this makes it possible to tokenize a + PDF file or stream and preserve everything about it. + * For backward compatibility, space and comment tokens are not + returned by the tokenizer unless + QPDFTokenizer.includeIgnorable() is called. + * Better handling of null bytes. These are now included in space + tokens rather than being their own "tt_word" tokens. This + should have no impact on any correct PDF file and has no + impact on output, but it may change offsets in some error + messages when trying to parse contents of bad files. Under + default operation, qpdf does not attempt to parse content + streams, so this change is mostly invisible. + * Bug fix to handling of bad tokens at ends of streams. Now, + when allowEOF() has been called, these are treated as bad tokens + (tt_bad or an exception, depending on invocation), and a + separate tt_eof token is returned. Before the bad token + contents were returned as the value of a tt_eof token. tt_eof + tokens are always empty now. + * Fix a bug that would, on rare occasions, report the offset in an + error message in the wrong space because of spaces or comments + adjacent to a bad token. + * Clarify in comments exactly where the input source is + positioned surrounding calls to readToken and getToken. + 2018-02-04 Jay Berkenbilt * Add QPDFWriter::setLinearizationPass1Filename method and diff --git a/include/qpdf/QPDFTokenizer.hh b/include/qpdf/QPDFTokenizer.hh index 8c9fe984..cd727613 100644 --- a/include/qpdf/QPDFTokenizer.hh +++ b/include/qpdf/QPDFTokenizer.hh @@ -33,7 +33,8 @@ class QPDFTokenizer { public: // Token type tt_eof is only returned of allowEOF() is called on - // the tokenizer. tt_eof was introduced in QPDF version 4.1. + // the tokenizer. tt_eof was introduced in QPDF version 4.1. + // tt_space and tt_comment were added in QPDF version 8. enum token_type_e { tt_bad, @@ -51,6 +52,8 @@ class QPDFTokenizer tt_bool, tt_word, tt_eof, + tt_space, + tt_comment, }; class Token @@ -120,6 +123,11 @@ class QPDFTokenizer QPDF_DLL void allowEOF(); + // If called, readToken will return "ignorable" tokens for space + // and comments. This was added in QPDF 8. + QPDF_DLL + void includeIgnorable(); + // Mode of operation: // Keep presenting characters and calling getToken() until @@ -159,13 +167,15 @@ class QPDFTokenizer private: void reset(); void resolveLiteral(); + bool isSpace(char); // Lexer state - enum { st_top, st_in_comment, st_in_string, st_lt, st_gt, + enum { st_top, st_in_space, st_in_comment, st_in_string, st_lt, st_gt, st_literal, st_in_hexstring, st_token_ready } state; bool pound_special_in_name; bool allow_eof; + bool include_ignorable; // Current token accumulation token_type_e type; diff --git a/libqpdf/FileInputSource.cc b/libqpdf/FileInputSource.cc index a1b1ced5..4e4a34bf 100644 --- a/libqpdf/FileInputSource.cc +++ b/libqpdf/FileInputSource.cc @@ -120,15 +120,23 @@ FileInputSource::rewind() size_t FileInputSource::read(char* buffer, size_t length) { - this->last_offset = QUtil::tell(this->file); + this->last_offset = this->tell(); size_t len = fread(buffer, 1, length, this->file); - if ((len == 0) && ferror(this->file)) + if (len == 0) { - throw QPDFExc(qpdf_e_system, - this->filename, "", - this->last_offset, - std::string("read ") + - QUtil::int_to_string(length) + " bytes"); + if (ferror(this->file)) + { + throw QPDFExc(qpdf_e_system, + this->filename, "", + this->last_offset, + std::string("read ") + + QUtil::int_to_string(length) + " bytes"); + } + else if (length > 0) + { + this->seek(0, SEEK_END); + this->last_offset = this->tell(); + } } return len; } diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc index 6580a1be..2a45a0b5 100644 --- a/libqpdf/QPDFTokenizer.cc +++ b/libqpdf/QPDFTokenizer.cc @@ -14,7 +14,8 @@ QPDFTokenizer::QPDFTokenizer() : pound_special_in_name(true), - allow_eof(false) + allow_eof(false), + include_ignorable(false) { reset(); } @@ -32,6 +33,18 @@ QPDFTokenizer::allowEOF() this->allow_eof = true; } +void +QPDFTokenizer::includeIgnorable() +{ + this->include_ignorable = true; +} + +bool +QPDFTokenizer::isSpace(char ch) +{ + return ((ch == '\0') || QUtil::is_space(ch)); +} + void QPDFTokenizer::reset() { @@ -148,14 +161,21 @@ QPDFTokenizer::presentCharacter(char ch) { // Note: we specifically do not use ctype here. It is // locale-dependent. - if (strchr(" \t\n\v\f\r", ch)) + if (isSpace(ch)) { - // ignore + if (this->include_ignorable) + { + state = st_in_space; + val += ch; + } } else if (ch == '%') { - // Discard comments state = st_in_comment; + if (this->include_ignorable) + { + val += ch; + } } else if (ch == '(') { @@ -209,12 +229,41 @@ QPDFTokenizer::presentCharacter(char ch) } } } + else if (state == st_in_space) + { + // We only enter this state if include_ignorable is true. + if (! isSpace(ch)) + { + type = tt_space; + unread_char = true; + char_to_unread = ch; + state = st_token_ready; + } + else + { + val += ch; + } + } else if (state == st_in_comment) { if ((ch == '\r') || (ch == '\n')) - { - state = st_top; - } + { + if (this->include_ignorable) + { + type = tt_comment; + unread_char = true; + char_to_unread = ch; + state = st_token_ready; + } + else + { + state = st_top; + } + } + else if (this->include_ignorable) + { + val += ch; + } } else if (state == st_lt) { @@ -397,7 +446,7 @@ QPDFTokenizer::presentCharacter(char ch) { val += ch; } - else if (strchr(" \t\n\v\f\r", ch)) + else if (isSpace(ch)) { // ignore } @@ -435,19 +484,23 @@ QPDFTokenizer::presentEOF() QTC::TC("qpdf", "QPDF_Tokenizer EOF reading appendable token"); resolveLiteral(); } + else if ((this->include_ignorable) && (state == st_in_space)) + { + type = tt_space; + } + else if ((this->include_ignorable) && (state == st_in_comment)) + { + type = tt_comment; + } + else if (betweenTokens()) + { + type = tt_eof; + } else if (state != st_token_ready) { - QTC::TC("qpdf", "QPDF_Tokenizer EOF reading token", - this->allow_eof ? 1 : 0); - if ((this->allow_eof) && (state == st_top)) - { - type = tt_eof; - } - else - { - type = tt_bad; - error_message = "EOF while reading token"; - } + QTC::TC("qpdf", "QPDF_Tokenizer EOF reading token"); + type = tt_bad; + error_message = "EOF while reading token"; } state = st_token_ready; @@ -461,6 +514,10 @@ QPDFTokenizer::getToken(Token& token, bool& unread_char, char& ch) ch = this->char_to_unread; if (ready) { + if (type == tt_bad) + { + val = raw_val; + } token = Token(type, val, raw_val, error_message); reset(); } @@ -470,7 +527,10 @@ QPDFTokenizer::getToken(Token& token, bool& unread_char, char& ch) bool QPDFTokenizer::betweenTokens() { - return ((state == st_top) || (state == st_in_comment)); + return ((state == st_top) || + ((! this->include_ignorable) && + ((state == st_in_comment) || + (state == st_in_space)))); } QPDFTokenizer::Token @@ -493,6 +553,13 @@ QPDFTokenizer::readToken(PointerHolder input, { presentEOF(); presented_eof = true; + if ((type == tt_eof) && (! this->allow_eof)) + { + QTC::TC("qpdf", "QPDF_Tokenizer EOF when not allowed"); + type = tt_bad; + error_message = "unexpected EOF"; + offset = input->getLastOffset(); + } } else { @@ -502,12 +569,11 @@ QPDFTokenizer::readToken(PointerHolder input, } else { - if (QUtil::is_space(static_cast(ch)) && - (input->getLastOffset() == offset)) + presentCharacter(ch); + if (betweenTokens() && (input->getLastOffset() == offset)) { ++offset; } - presentCharacter(ch); if (max_len && (raw_val.length() >= max_len) && (this->state != st_token_ready)) { @@ -515,6 +581,8 @@ QPDFTokenizer::readToken(PointerHolder input, QTC::TC("qpdf", "QPDFTokenizer block long token"); this->type = tt_bad; this->state = st_token_ready; + error_message = + "exceeded allowable length while reading token"; } } } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index b1b1d21b..914f6887 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -233,7 +233,7 @@ QPDFWriter copy use_aes 1 QPDFObjectHandle indirect without context 0 QPDFObjectHandle trailing data in parse 0 qpdf pages encryption password 0 -QPDF_Tokenizer EOF reading token 1 +QPDF_Tokenizer EOF reading token 0 QPDF_Tokenizer EOF reading appendable token 0 QPDFWriter extra header text no newline 0 QPDFWriter extra header text add newline 0 @@ -302,3 +302,4 @@ qpdf-c called qpdf_set_compress_streams 0 qpdf-c called qpdf_set_preserve_unreferenced_objects 0 qpdf-c called qpdf_set_newline_before_endstream 0 QPDF_Stream TIFF predictor 0 +QPDF_Tokenizer EOF when not allowed 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index ddf25d73..d2afff4f 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -240,7 +240,7 @@ foreach my $d (@bug_tests) show_ntests(); # ---------- $td->notify("--- Miscellaneous Tests ---"); -$n_tests += 97; +$n_tests += 99; $td->runtest("qpdf version", {$td->COMMAND => "qpdf --version"}, @@ -263,11 +263,21 @@ $td->runtest("check pass1 file", {$td->FILE => "b.pdf"}, {$td->FILE => "minimal-linearize-pass1.pdf"}); +$td->runtest("tokenizer with no ignorable", + {$td->COMMAND => "test_tokenizer -no-ignorable tokens.pdf"}, + {$td->FILE => "tokens-no-ignorable.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + $td->runtest("tokenizer", {$td->COMMAND => "test_tokenizer tokens.pdf"}, {$td->FILE => "tokens.out", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +$td->runtest("tokenizer with max_len", + {$td->COMMAND => "test_tokenizer -maxlen 50 tokens.pdf"}, + {$td->FILE => "tokens-maxlen.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + foreach (my $i = 1; $i <= 3; ++$i) { $td->runtest("misc tests", diff --git a/qpdf/qtest/qpdf/bad16-recover.out b/qpdf/qtest/qpdf/bad16-recover.out index 4cc66e23..6a1ac6ea 100644 --- a/qpdf/qtest/qpdf/bad16-recover.out +++ b/qpdf/qtest/qpdf/bad16-recover.out @@ -2,9 +2,9 @@ WARNING: bad16.pdf (trailer, file position 753): unexpected dictionary close tok WARNING: bad16.pdf (trailer, file position 756): unexpected dictionary close token WARNING: bad16.pdf (trailer, file position 759): unknown token while reading object; treating as string WARNING: bad16.pdf: file is damaged -WARNING: bad16.pdf (trailer, file position 773): EOF while reading token +WARNING: bad16.pdf (trailer, file position 779): unexpected EOF WARNING: bad16.pdf: Attempting to reconstruct cross-reference table WARNING: bad16.pdf (trailer, file position 753): unexpected dictionary close token WARNING: bad16.pdf (trailer, file position 756): unexpected dictionary close token WARNING: bad16.pdf (trailer, file position 759): unknown token while reading object; treating as string -bad16.pdf (trailer, file position 773): EOF while reading token +bad16.pdf (trailer, file position 779): unexpected EOF diff --git a/qpdf/qtest/qpdf/bad16.out b/qpdf/qtest/qpdf/bad16.out index e3947f9d..7efc2b9b 100644 --- a/qpdf/qtest/qpdf/bad16.out +++ b/qpdf/qtest/qpdf/bad16.out @@ -1,4 +1,4 @@ WARNING: bad16.pdf (trailer, file position 753): unexpected dictionary close token WARNING: bad16.pdf (trailer, file position 756): unexpected dictionary close token WARNING: bad16.pdf (trailer, file position 759): unknown token while reading object; treating as string -bad16.pdf (trailer, file position 773): EOF while reading token +bad16.pdf (trailer, file position 779): unexpected EOF diff --git a/qpdf/qtest/qpdf/good14.out b/qpdf/qtest/qpdf/good14.out index fb96e05e..c6aa52be 100644 --- a/qpdf/qtest/qpdf/good14.out +++ b/qpdf/qtest/qpdf/good14.out @@ -39,4 +39,12 @@ This stream does end with a newline. -- stream 4 -- (ends with a name) /ThisMustBeLast +-- stream 5 -- +% This stream has an inline image marker that is not terminated +(Potato) + +BI +ID +<506f7 +461746f> test 3 done diff --git a/qpdf/qtest/qpdf/good14.pdf b/qpdf/qtest/qpdf/good14.pdf index 426e04ab..da70e82f 100644 --- a/qpdf/qtest/qpdf/good14.pdf +++ b/qpdf/qtest/qpdf/good14.pdf @@ -125,8 +125,21 @@ stream /ThisMustBeLastendstream endobj +13 0 obj +<< /Length 103 >> +stream +% This stream has an inline image marker that is not terminated +<506f7 +461746f> +BI +ID +<506f7 +461746f> +endstream +endobj + xref -0 13 +0 14 0000000000 65535 f 0000000045 00000 n 0000000099 00000 n @@ -140,11 +153,12 @@ xref 0000001283 00000 n 0000001374 00000 n 0000001430 00000 n +0000001515 00000 n trailer << - /Size 13 + /Size 14 /Root 1 0 R - /QStreams [ 7 0 R 8 0 R 10 0 R 11 0 R 12 0 R ] + /QStreams [ 7 0 R 8 0 R 10 0 R 11 0 R 12 0 R 13 0 R ] >> startxref -1515 +1670 %%EOF diff --git a/qpdf/qtest/qpdf/good14.qdf b/qpdf/qtest/qpdf/good14.qdf index 24d312e5..c1e5d3c6 100644 --- a/qpdf/qtest/qpdf/good14.qdf +++ b/qpdf/qtest/qpdf/good14.qdf @@ -5,7 +5,7 @@ %% Original object ID: 1 0 1 0 obj << - /Pages 12 0 R + /Pages 14 0 R /Type /Catalog >> endobj @@ -110,12 +110,32 @@ endobj 34 endobj -%% Original object ID: 2 0 +%% Original object ID: 13 0 12 0 obj +<< + /Length 13 0 R +>> +stream +% This stream has an inline image marker that is not terminated +<506f7 +461746f> +BI +ID +<506f7 +461746f> +endstream +endobj + +13 0 obj +103 +endobj + +%% Original object ID: 2 0 +14 0 obj << /Count 1 /Kids [ - 13 0 R + 15 0 R ] /Type /Pages >> @@ -123,21 +143,21 @@ endobj %% Page 1 %% Original object ID: 3 0 -13 0 obj +15 0 obj << - /Contents 14 0 R + /Contents 16 0 R /MediaBox [ 0 0 612 792 ] - /Parent 12 0 R + /Parent 14 0 R /Resources << /Font << - /F1 16 0 R + /F1 18 0 R >> - /ProcSet 17 0 R + /ProcSet 19 0 R >> /Type /Page >> @@ -145,9 +165,9 @@ endobj %% Contents for page 1 %% Original object ID: 4 0 -14 0 obj +16 0 obj << - /Length 15 0 R + /Length 17 0 R >> stream BT @@ -158,12 +178,12 @@ ET endstream endobj -15 0 obj +17 0 obj 44 endobj %% Original object ID: 6 0 -16 0 obj +18 0 obj << /BaseFont /Helvetica /Encoding /WinAnsiEncoding @@ -174,7 +194,7 @@ endobj endobj %% Original object ID: 5 0 -17 0 obj +19 0 obj [ /PDF /Text @@ -182,7 +202,7 @@ endobj endobj xref -0 18 +0 20 0000000000 65535 f 0000000052 00000 n 0000000134 00000 n @@ -195,12 +215,14 @@ xref 0000001151 00000 n 0000001197 00000 n 0000001310 00000 n -0000001357 00000 n -0000001468 00000 n -0000001715 00000 n -0000001816 00000 n -0000001863 00000 n -0000002009 00000 n +0000001358 00000 n +0000001518 00000 n +0000001566 00000 n +0000001677 00000 n +0000001924 00000 n +0000002025 00000 n +0000002072 00000 n +0000002218 00000 n trailer << /QStreams [ 2 0 R @@ -208,11 +230,12 @@ trailer << 6 0 R 8 0 R 10 0 R + 12 0 R ] /Root 1 0 R - /Size 18 + /Size 20 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> startxref -2045 +2254 %%EOF diff --git a/qpdf/qtest/qpdf/issue-100.out b/qpdf/qtest/qpdf/issue-100.out index dfbe117f..fbc84369 100644 --- a/qpdf/qtest/qpdf/issue-100.out +++ b/qpdf/qtest/qpdf/issue-100.out @@ -13,4 +13,4 @@ WARNING: issue-100.pdf (object 5 0, file position 489): attempting to recover st WARNING: issue-100.pdf (object 5 0, file position 489): recovered stream length: 12 WARNING: issue-100.pdf (trailer, file position 953): expected dictionary key but found non-name object; inserting key /QPDFFake1 WARNING: issue-100.pdf (trailer, file position 953): dictionary ended prematurely; using null as value for last key -issue-100.pdf (file position 1138): unable to find /Root dictionary +issue-100.pdf (file position 1144): unable to find /Root dictionary diff --git a/qpdf/qtest/qpdf/issue-101.out b/qpdf/qtest/qpdf/issue-101.out index e147baad..b34b0be1 100644 --- a/qpdf/qtest/qpdf/issue-101.out +++ b/qpdf/qtest/qpdf/issue-101.out @@ -16,7 +16,7 @@ WARNING: issue-101.pdf (trailer, file position 2613): /Length key in stream dict WARNING: issue-101.pdf (trailer, file position 2684): attempting to recover stream length WARNING: issue-101.pdf (trailer, file position 2684): recovered stream length: 74 WARNING: issue-101.pdf (trailer, file position 2928): unknown token while reading object; treating as string -WARNING: issue-101.pdf (trailer, file position 2929): unknown token while reading object; treating as string +WARNING: issue-101.pdf (trailer, file position 2930): unknown token while reading object; treating as string WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake1 WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake2 WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake3 @@ -45,7 +45,7 @@ WARNING: issue-101.pdf (file position 696): unknown token while reading object; WARNING: issue-101.pdf (file position 698): unknown token while reading object; treating as string WARNING: issue-101.pdf (file position 701): unknown token while reading object; treating as string WARNING: issue-101.pdf (file position 711): unknown token while reading object; treating as string -WARNING: issue-101.pdf (file position 742): unknown token while reading object; treating as string +WARNING: issue-101.pdf (file position 743): unknown token while reading object; treating as string WARNING: issue-101.pdf (file position 745): unknown token while reading object; treating as string WARNING: issue-101.pdf (file position 747): unknown token while reading object; treating as string WARNING: issue-101.pdf (file position 777): unknown token while reading object; treating as string diff --git a/qpdf/qtest/qpdf/issue-146.out b/qpdf/qtest/qpdf/issue-146.out index 70584f4d..d515c344 100644 --- a/qpdf/qtest/qpdf/issue-146.out +++ b/qpdf/qtest/qpdf/issue-146.out @@ -2,4 +2,4 @@ WARNING: issue-146.pdf: file is damaged WARNING: issue-146.pdf: can't find startxref WARNING: issue-146.pdf: Attempting to reconstruct cross-reference table WARNING: issue-146.pdf (trailer, file position 20728): unknown token while reading object; treating as string -issue-146.pdf (trailer, file position 20732): EOF while reading token +issue-146.pdf (trailer, file position 20732): unexpected EOF diff --git a/qpdf/qtest/qpdf/issue-51.out b/qpdf/qtest/qpdf/issue-51.out index d291fee3..1eeadebd 100644 --- a/qpdf/qtest/qpdf/issue-51.out +++ b/qpdf/qtest/qpdf/issue-51.out @@ -6,5 +6,5 @@ WARNING: issue-51.pdf (file position 70): loop detected resolving object 2 0 WARNING: issue-51.pdf (object 2 0, file position 26): /Length key in stream dictionary is not an integer WARNING: issue-51.pdf (object 2 0, file position 71): attempting to recover stream length WARNING: issue-51.pdf (object 2 0, file position 71): unable to recover stream data; treating stream as empty -WARNING: issue-51.pdf (object 2 0, file position 977): EOF while reading token +WARNING: issue-51.pdf (object 2 0, file position 977): unexpected EOF qpdf: operation succeeded with warnings; resulting file may have some problems diff --git a/qpdf/qtest/qpdf/issue-99.out b/qpdf/qtest/qpdf/issue-99.out index eb20da6e..644d4a13 100644 --- a/qpdf/qtest/qpdf/issue-99.out +++ b/qpdf/qtest/qpdf/issue-99.out @@ -1,4 +1,4 @@ WARNING: issue-99.pdf: file is damaged WARNING: issue-99.pdf (file position 3526): xref not found WARNING: issue-99.pdf: Attempting to reconstruct cross-reference table -issue-99.pdf (file position 4793): unable to find /Root dictionary +issue-99.pdf (file position 4798): unable to find /Root dictionary diff --git a/qpdf/qtest/qpdf/issue-99b.out b/qpdf/qtest/qpdf/issue-99b.out index 8f012b1a..95a51a89 100644 --- a/qpdf/qtest/qpdf/issue-99b.out +++ b/qpdf/qtest/qpdf/issue-99b.out @@ -2,4 +2,4 @@ WARNING: issue-99b.pdf: file is damaged WARNING: issue-99b.pdf (object 1 0, file position 9): object with ID 0 WARNING: issue-99b.pdf: Attempting to reconstruct cross-reference table WARNING: issue-99b.pdf: object 1 0 not found in file after regenerating cross reference table -issue-99b.pdf (file position 757): unable to find /Root dictionary +issue-99b.pdf (file position 763): unable to find /Root dictionary diff --git a/qpdf/qtest/qpdf/linearization-bounds-1.out b/qpdf/qtest/qpdf/linearization-bounds-1.out index 99025ee5..bca3fb0a 100644 --- a/qpdf/qtest/qpdf/linearization-bounds-1.out +++ b/qpdf/qtest/qpdf/linearization-bounds-1.out @@ -2,7 +2,7 @@ checking linearization-bounds-1.pdf PDF Version: 1.3 File is not encrypted File is linearized -WARNING: linearization-bounds-1.pdf (linearization hint stream: object 62 0, file position 1001182): EOF while reading token +WARNING: linearization-bounds-1.pdf (linearization hint stream: object 62 0, file position 12302): unexpected EOF WARNING: linearization-bounds-1.pdf (linearization hint stream: object 62 0, file position 1183): attempting to recover stream length WARNING: linearization-bounds-1.pdf (linearization hint stream: object 62 0, file position 1183): recovered stream length: 106 linearization-bounds-1.pdf (linearization hint table, file position 1183): /S (shared object) offset is out of bounds diff --git a/qpdf/qtest/qpdf/tokens-maxlen.out b/qpdf/qtest/qpdf/tokens-maxlen.out new file mode 100644 index 00000000..01283fc8 --- /dev/null +++ b/qpdf/qtest/qpdf/tokens-maxlen.out @@ -0,0 +1,2476 @@ +--- BEGIN FILE --- +0: comment: %PDF-1.5 +8: space: \x0a +9: comment: %\xbf\xf7\xa2\xfe +14: space: \x0a +15: comment: %QDF-1.0 +23: space: \x0a\x0a +25: comment: %comment 1 +35: space: \x0d +36: comment: %comment 2 +46: space: \x0d\x0a +48: comment: %comment 3 +58: space: \x0a\x0a +60: integer: 1 +61: space: +62: integer: 0 +63: space: +64: word: obj +67: space: \x0a +68: dict_open: << +70: space: \x0a +73: name: /Type +78: space: +79: name: /ObjStm +86: space: \x0a +89: name: /Length +96: space: +97: integer: 6020 +101: space: \x0a +104: name: /N +106: space: +107: integer: 35 +109: space: \x0a +112: name: /First +118: space: +119: integer: 323 +122: space: \x0a +123: dict_close: >> +125: space: \x0a +126: word: stream +skipping to endstream +6153: word: endstream +6162: space: \x0a +6163: word: endobj +6169: space: \x0a\x0a +6171: comment: %% Contents for page 1 +6193: space: \x0a +6194: comment: %% Original object ID: 37 0 +6221: space: \x0a +6222: integer: 37 +6224: space: +6225: integer: 0 +6226: space: +6227: word: obj +6230: space: \x0a +6231: dict_open: << +6233: space: \x0a +6236: name: /Length +6243: space: +6244: integer: 38 +6246: space: +6247: integer: 0 +6248: space: +6249: word: R +6250: space: \x0a +6251: dict_close: >> +6253: space: \x0a +6254: word: stream +skipping to endstream +6305: word: endstream +6314: space: \x0a +6315: word: endobj +6321: space: \x0a\x0a +6323: integer: 38 +6325: space: +6326: integer: 0 +6327: space: +6328: word: obj +6331: space: \x0a +6332: integer: 44 +6334: space: \x0a +6335: word: endobj +6341: space: \x0a\x0a +6343: comment: %% Contents for page 2 +6365: space: \x0a +6366: comment: %% Original object ID: 38 0 +6393: space: \x0a +6394: integer: 39 +6396: space: +6397: integer: 0 +6398: space: +6399: word: obj +6402: space: \x0a +6403: dict_open: << +6405: space: \x0a +6408: name: /Length +6415: space: +6416: integer: 40 +6418: space: +6419: integer: 0 +6420: space: +6421: word: R +6422: space: \x0a +6423: dict_close: >> +6425: space: \x0a +6426: word: stream +skipping to endstream +6832: word: endstream +6841: space: \x0a +6842: word: endobj +6848: space: \x0a\x0a +6850: integer: 40 +6852: space: +6853: integer: 0 +6854: space: +6855: word: obj +6858: space: \x0a +6859: integer: 399 +6862: space: \x0a +6863: word: endobj +6869: space: \x0a\x0a +6871: comment: %% Contents for page 3 +6893: space: \x0a +6894: comment: %% Original object ID: 39 0 +6921: space: \x0a +6922: integer: 41 +6924: space: +6925: integer: 0 +6926: space: +6927: word: obj +6930: space: \x0a +6931: dict_open: << +6933: space: \x0a +6936: name: /Length +6943: space: +6944: integer: 42 +6946: space: +6947: integer: 0 +6948: space: +6949: word: R +6950: space: \x0a +6951: dict_close: >> +6953: space: \x0a +6954: word: stream +skipping to endstream +7001: word: endstream +7010: space: \x0a +7011: word: endobj +7017: space: \x0a\x0a +7019: integer: 42 +7021: space: +7022: integer: 0 +7023: space: +7024: word: obj +7027: space: \x0a +7028: integer: 40 +7030: space: \x0a +7031: word: endobj +7037: space: \x0a\x0a +7039: comment: %% Contents for page 4 +7061: space: \x0a +7062: comment: %% Original object ID: 40 0 +7089: space: \x0a +7090: integer: 43 +7092: space: +7093: integer: 0 +7094: space: +7095: word: obj +7098: space: \x0a +7099: dict_open: << +7101: space: \x0a +7104: name: /Length +7111: space: +7112: integer: 44 +7114: space: +7115: integer: 0 +7116: space: +7117: word: R +7118: space: \x0a +7119: dict_close: >> +7121: space: \x0a +7122: word: stream +skipping to endstream +7404: word: endstream +7413: space: \x0a +7414: word: endobj +7420: space: \x0a\x0a +7422: integer: 44 +7424: space: +7425: integer: 0 +7426: space: +7427: word: obj +7430: space: \x0a +7431: integer: 275 +7434: space: \x0a +7435: word: endobj +7441: space: \x0a\x0a +7443: comment: %% Contents for page 5 +7465: space: \x0a +7466: comment: %% Original object ID: 41 0 +7493: space: \x0a +7494: integer: 45 +7496: space: +7497: integer: 0 +7498: space: +7499: word: obj +7502: space: \x0a +7503: dict_open: << +7505: space: \x0a +7508: name: /Length +7515: space: +7516: integer: 46 +7518: space: +7519: integer: 0 +7520: space: +7521: word: R +7522: space: \x0a +7523: dict_close: >> +7525: space: \x0a +7526: word: stream +skipping to endstream +7601: word: endstream +7610: space: \x0a +7611: word: endobj +7617: space: \x0a\x0a +7619: integer: 46 +7621: space: +7622: integer: 0 +7623: space: +7624: word: obj +7627: space: \x0a +7628: integer: 68 +7630: space: \x0a +7631: word: endobj +7637: space: \x0a\x0a +7639: comment: %% Contents for page 6 +7661: space: \x0a +7662: comment: %% Original object ID: 42 0 +7689: space: \x0a +7690: integer: 47 +7692: space: +7693: integer: 0 +7694: space: +7695: word: obj +7698: space: \x0a +7699: dict_open: << +7701: space: \x0a +7704: name: /Length +7711: space: +7712: integer: 48 +7714: space: +7715: integer: 0 +7716: space: +7717: word: R +7718: space: \x0a +7719: dict_close: >> +7721: space: \x0a +7722: word: stream +skipping to endstream +7773: word: endstream +7782: space: \x0a +7783: word: endobj +7789: space: \x0a\x0a +7791: integer: 48 +7793: space: +7794: integer: 0 +7795: space: +7796: word: obj +7799: space: \x0a +7800: integer: 44 +7802: space: \x0a +7803: word: endobj +7809: space: \x0a\x0a +7811: comment: %% Contents for page 7 +7833: space: \x0a +7834: comment: %% Original object ID: 43 0 +7861: space: \x0a +7862: integer: 49 +7864: space: +7865: integer: 0 +7866: space: +7867: word: obj +7870: space: \x0a +7871: dict_open: << +7873: space: \x0a +7876: name: /Length +7883: space: +7884: integer: 50 +7886: space: +7887: integer: 0 +7888: space: +7889: word: R +7890: space: \x0a +7891: dict_close: >> +7893: space: \x0a +7894: word: stream +skipping to endstream +7945: word: endstream +7954: space: \x0a +7955: word: endobj +7961: space: \x0a\x0a +7963: integer: 50 +7965: space: +7966: integer: 0 +7967: space: +7968: word: obj +7971: space: \x0a +7972: integer: 44 +7974: space: \x0a +7975: word: endobj +7981: space: \x0a\x0a +7983: comment: %% Contents for page 8 +8005: space: \x0a +8006: comment: %% Original object ID: 44 0 +8033: space: \x0a +8034: integer: 51 +8036: space: +8037: integer: 0 +8038: space: +8039: word: obj +8042: space: \x0a +8043: dict_open: << +8045: space: \x0a +8048: name: /Length +8055: space: +8056: integer: 52 +8058: space: +8059: integer: 0 +8060: space: +8061: word: R +8062: space: \x0a +8063: dict_close: >> +8065: space: \x0a +8066: word: stream +skipping to endstream +8117: word: endstream +8126: space: \x0a +8127: word: endobj +8133: space: \x0a\x0a +8135: integer: 52 +8137: space: +8138: integer: 0 +8139: space: +8140: word: obj +8143: space: \x0a +8144: integer: 44 +8146: space: \x0a +8147: word: endobj +8153: space: \x0a\x0a +8155: comment: %% Contents for page 9 +8177: space: \x0a +8178: comment: %% Original object ID: 45 0 +8205: space: \x0a +8206: integer: 53 +8208: space: +8209: integer: 0 +8210: space: +8211: word: obj +8214: space: \x0a +8215: dict_open: << +8217: space: \x0a +8220: name: /Length +8227: space: +8228: integer: 54 +8230: space: +8231: integer: 0 +8232: space: +8233: word: R +8234: space: \x0a +8235: dict_close: >> +8237: space: \x0a +8238: word: stream +skipping to endstream +8289: word: endstream +8298: space: \x0a +8299: word: endobj +8305: space: \x0a\x0a +8307: integer: 54 +8309: space: +8310: integer: 0 +8311: space: +8312: word: obj +8315: space: \x0a +8316: integer: 44 +8318: space: \x0a +8319: word: endobj +8325: space: \x0a\x0a +8327: comment: %% Contents for page 10 +8350: space: \x0a +8351: comment: %% Original object ID: 46 0 +8378: space: \x0a +8379: integer: 55 +8381: space: +8382: integer: 0 +8383: space: +8384: word: obj +8387: space: \x0a +8388: dict_open: << +8390: space: \x0a +8393: name: /Length +8400: space: +8401: integer: 56 +8403: space: +8404: integer: 0 +8405: space: +8406: word: R +8407: space: \x0a +8408: dict_close: >> +8410: space: \x0a +8411: word: stream +skipping to endstream +8462: word: endstream +8471: space: \x0a +8472: word: endobj +8478: space: \x0a\x0a +8480: integer: 56 +8482: space: +8483: integer: 0 +8484: space: +8485: word: obj +8488: space: \x0a +8489: integer: 44 +8491: space: \x0a +8492: word: endobj +8498: space: \x0a\x0a +8500: comment: %% Contents for page 11 +8523: space: \x0a +8524: comment: %% Original object ID: 47 0 +8551: space: \x0a +8552: integer: 57 +8554: space: +8555: integer: 0 +8556: space: +8557: word: obj +8560: space: \x0a +8561: dict_open: << +8563: space: \x0a +8566: name: /Length +8573: space: +8574: integer: 58 +8576: space: +8577: integer: 0 +8578: space: +8579: word: R +8580: space: \x0a +8581: dict_close: >> +8583: space: \x0a +8584: word: stream +skipping to endstream +8635: word: endstream +8644: space: \x0a +8645: word: endobj +8651: space: \x0a\x0a +8653: integer: 58 +8655: space: +8656: integer: 0 +8657: space: +8658: word: obj +8661: space: \x0a +8662: integer: 44 +8664: space: \x0a +8665: word: endobj +8671: space: \x0a\x0a +8673: integer: 59 +8675: space: +8676: integer: 0 +8677: space: +8678: word: obj +8681: space: \x0a +8682: dict_open: << +8684: space: \x0a +8687: name: /Type +8692: space: +8693: name: /XRef +8698: space: \x0a +8701: name: /Length +8708: space: +8709: integer: 240 +8712: space: \x0a +8715: name: /W +8717: space: +8718: array_open: [ +8719: space: +8720: integer: 1 +8721: space: +8722: integer: 2 +8723: space: +8724: integer: 1 +8725: space: +8726: array_close: ] +8727: space: \x0a +8730: name: /Root +8735: space: +8736: integer: 2 +8737: space: +8738: integer: 0 +8739: space: +8740: word: R +8741: space: \x0a +8744: name: /Size +8749: space: +8750: integer: 60 +8752: space: \x0a +8755: name: /ID +8758: space: +8759: array_open: [ +8760: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>) +8794: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: ) +8828: array_close: ] +8829: space: \x0a +8830: dict_close: >> +8832: space: \x0a +8833: word: stream +skipping to endstream +9081: word: endstream +9090: space: \x0a +9091: word: endobj +9097: space: \x0a\x0a +9099: word: startxref +9108: space: \x0a +9109: integer: 8673 +9113: space: \x0a +9114: comment: %%EOF +9119: space: \x0a +9120: eof +--- END FILE --- +--- BEGIN PAGE 1 --- +0: word: BT +2: space: \x0a +5: name: /F1 +8: space: +9: integer: 24 +11: space: +12: word: Tf +14: space: \x0a +17: integer: 72 +19: space: +20: integer: 720 +23: space: +24: word: Td +26: space: \x0a +29: string: Potato (raw: (Potato)) +37: space: +38: word: Tj +40: space: \x0a +41: word: ET +43: space: \x0a +44: eof +--- END PAGE 1 --- +--- BEGIN PAGE 2 --- +0: word: BT +2: space: \x0a +5: name: /F1 +8: space: +9: integer: 24 +11: space: +12: word: Tf +14: space: \x0a +17: integer: 72 +19: space: +20: integer: 720 +23: space: +24: word: Td +26: space: \x0a +29: string: Potato (raw: (Potato)) +37: space: +38: word: Tj +40: space: \x0a +41: word: ET +43: space: \x0a +44: word: BI +46: space: \x0a +47: name: /CS +50: space: +51: name: /G +53: name: /W +55: space: +56: integer: 66 +58: name: /H +60: space: +61: integer: 47 +63: name: /BPC +67: space: +68: integer: 8 +69: name: /F +71: name: /Fl +74: name: /DP +77: dict_open: << +79: name: /Predictor +89: space: +90: integer: 15 +92: name: /Columns +100: space: +101: integer: 66 +103: dict_close: >> +105: space: \x0a +106: word: ID +skipping to EI +352: word: EI +354: space: \x0a +355: word: BT +357: space: \x0a +360: name: /F1 +363: space: +364: integer: 24 +366: space: +367: word: Tf +369: space: \x0a +372: integer: 72 +374: space: +375: integer: 720 +378: space: +379: word: Td +381: space: \x0a +384: string: Potato (raw: (Potato)) +392: space: +393: word: Tj +395: space: \x0a +396: word: ET +398: space: \x0a +399: eof +--- END PAGE 2 --- +--- BEGIN PAGE 3 --- +0: word: BT +2: space: \x0a +5: name: /F1 +8: space: +9: integer: 24 +11: space: +12: word: Tf +14: space: \x0a +17: integer: 72 +19: space: +20: integer: 720 +23: space: +24: word: Td +26: space: \x0a +29: bad: (Potato\x0aET\x0a (EOF while reading token) +40: eof +--- END PAGE 3 --- +--- BEGIN PAGE 4 --- +0: word: BT +2: space: \x0a +5: name: /F1 +8: space: +9: integer: 24 +11: space: +12: word: Tf +14: space: \x0a +17: string: \xfe\xeb (raw: ) +23: space: \x0a +26: string: \xab\xcd (raw: ) +33: space: \x0a +36: string: quack (raw: (qu\\x0d\x0aack)) +46: space: \x0a +49: string: quack (raw: (qu\\x0aack)) +58: space: \x0a +61: string: quack (raw: (qu\\x0dack)) +70: space: \x0a +73: integer: 72 +75: space: +76: integer: 720 +79: space: +80: word: Td +82: space: \x0a +85: real: 3.14 +89: space: \x0a +92: real: 3. +94: space: \x0a +97: real: .14 +100: space: \x0a +103: real: +3.14 +108: space: \x0a +111: real: +3. +114: space: \x0a +117: real: +.14 +121: space: \x0a +124: real: -3.14 +129: space: \x0a +132: real: -3. +135: space: \x0a +138: real: -.14 +142: space: \x0a +145: integer: +16059 +151: space: \x0a +154: integer: -16059 +160: space: \x0a +163: word: +. +165: space: \x0a +168: bad: (unexpected >) +179: word: quack +184: space: +185: bad: /name#oops (invalid name token) +195: space: +196: name: /name (raw: /n#61me) +203: space: +204: word: one +207: space: +208: bool: true +212: space: +213: word: two +216: space: +217: bool: false +222: space: +223: word: three +228: space: +229: null: null +233: space: +234: word: four +238: space: \x0a +239: word: !@#$^& +245: brace_open: { +246: brace_close: } +247: word: *-_+= +252: space: \x0a +253: word: abc123def3.14true +270: space: \x0a +271: bad: > +360: space: \x0a +361: bad: %% Object stream: object 3, index 1; original obje (exceeded allowable length while reading token) +411: word: ct +413: space: +414: word: ID: +417: space: +418: integer: 3 +419: space: \x0a +420: dict_open: << +422: space: \x0a +425: name: /Count +431: space: +432: integer: 11 +434: space: \x0a +437: name: /Kids +442: space: +443: array_open: [ +444: space: \x0a +449: integer: 4 +450: space: +451: integer: 0 +452: space: +453: word: R +454: space: \x0a +459: integer: 5 +460: space: +461: integer: 0 +462: space: +463: word: R +464: space: \x0a +469: integer: 6 +470: space: +471: integer: 0 +472: space: +473: word: R +474: space: \x0a +479: integer: 7 +480: space: +481: integer: 0 +482: space: +483: word: R +484: space: \x0a +489: integer: 8 +490: space: +491: integer: 0 +492: space: +493: word: R +494: space: \x0a +499: integer: 9 +500: space: +501: integer: 0 +502: space: +503: word: R +504: space: \x0a +509: integer: 10 +511: space: +512: integer: 0 +513: space: +514: word: R +515: space: \x0a +520: integer: 11 +522: space: +523: integer: 0 +524: space: +525: word: R +526: space: \x0a +531: integer: 12 +533: space: +534: integer: 0 +535: space: +536: word: R +537: space: \x0a +542: integer: 13 +544: space: +545: integer: 0 +546: space: +547: word: R +548: space: \x0a +553: integer: 14 +555: space: +556: integer: 0 +557: space: +558: word: R +559: space: \x0a +562: array_close: ] +563: space: \x0a +566: name: /Type +571: space: +572: name: /Pages +578: space: \x0a +579: dict_close: >> +581: space: \x0a +582: bad: %% Object stream: object 4, index 2; original obje (exceeded allowable length while reading token) +632: word: ct +634: space: +635: word: ID: +638: space: +639: integer: 4 +640: space: \x0a +641: comment: %% Page 1 +650: space: \x0a +651: dict_open: << +653: space: \x0a +656: name: /Contents +665: space: +666: integer: 37 +668: space: +669: integer: 0 +670: space: +671: word: R +672: space: \x0a +675: name: /MediaBox +684: space: +685: array_open: [ +686: space: \x0a +691: integer: 0 +692: space: \x0a +697: integer: 0 +698: space: \x0a +703: integer: 612 +706: space: \x0a +711: integer: 792 +714: space: \x0a +717: array_close: ] +718: space: \x0a +721: name: /Parent +728: space: +729: integer: 3 +730: space: +731: integer: 0 +732: space: +733: word: R +734: space: \x0a +737: name: /Resources +747: space: +748: dict_open: << +750: space: \x0a +755: name: /Font +760: space: +761: dict_open: << +763: space: \x0a +770: name: /F1 +773: space: +774: integer: 15 +776: space: +777: integer: 0 +778: space: +779: word: R +780: space: \x0a +785: dict_close: >> +787: space: \x0a +792: name: /ProcSet +800: space: +801: integer: 16 +803: space: +804: integer: 0 +805: space: +806: word: R +807: space: \x0a +810: dict_close: >> +812: space: \x0a +815: name: /Type +820: space: +821: name: /Page +826: space: \x0a +827: dict_close: >> +829: space: \x0a +830: bad: %% Object stream: object 5, index 3; original obje (exceeded allowable length while reading token) +880: word: ct +882: space: +883: word: ID: +886: space: +887: integer: 5 +888: space: \x0a +889: comment: %% Page 2 +898: space: \x0a +899: dict_open: << +901: space: \x0a +904: name: /Contents +913: space: +914: integer: 39 +916: space: +917: integer: 0 +918: space: +919: word: R +920: space: \x0a +923: name: /MediaBox +932: space: +933: array_open: [ +934: space: \x0a +939: integer: 0 +940: space: \x0a +945: integer: 0 +946: space: \x0a +951: integer: 612 +954: space: \x0a +959: integer: 792 +962: space: \x0a +965: array_close: ] +966: space: \x0a +969: name: /Parent +976: space: +977: integer: 3 +978: space: +979: integer: 0 +980: space: +981: word: R +982: space: \x0a +985: name: /Resources +995: space: +996: dict_open: << +998: space: \x0a +1003: name: /Font +1008: space: +1009: dict_open: << +1011: space: \x0a +1018: name: /F1 +1021: space: +1022: integer: 17 +1024: space: +1025: integer: 0 +1026: space: +1027: word: R +1028: space: \x0a +1033: dict_close: >> +1035: space: \x0a +1040: name: /ProcSet +1048: space: +1049: integer: 18 +1051: space: +1052: integer: 0 +1053: space: +1054: word: R +1055: space: \x0a +1058: dict_close: >> +1060: space: \x0a +1063: name: /Type +1068: space: +1069: name: /Page +1074: space: \x0a +1075: dict_close: >> +1077: space: \x0a +1078: bad: %% Object stream: object 6, index 4; original obje (exceeded allowable length while reading token) +1128: word: ct +1130: space: +1131: word: ID: +1134: space: +1135: integer: 6 +1136: space: \x0a +1137: comment: %% Page 3 +1146: space: \x0a +1147: dict_open: << +1149: space: \x0a +1152: name: /Contents +1161: space: +1162: integer: 41 +1164: space: +1165: integer: 0 +1166: space: +1167: word: R +1168: space: \x0a +1171: name: /MediaBox +1180: space: +1181: array_open: [ +1182: space: \x0a +1187: integer: 0 +1188: space: \x0a +1193: integer: 0 +1194: space: \x0a +1199: integer: 612 +1202: space: \x0a +1207: integer: 792 +1210: space: \x0a +1213: array_close: ] +1214: space: \x0a +1217: name: /Parent +1224: space: +1225: integer: 3 +1226: space: +1227: integer: 0 +1228: space: +1229: word: R +1230: space: \x0a +1233: name: /Resources +1243: space: +1244: dict_open: << +1246: space: \x0a +1251: name: /Font +1256: space: +1257: dict_open: << +1259: space: \x0a +1266: name: /F1 +1269: space: +1270: integer: 19 +1272: space: +1273: integer: 0 +1274: space: +1275: word: R +1276: space: \x0a +1281: dict_close: >> +1283: space: \x0a +1288: name: /ProcSet +1296: space: +1297: integer: 20 +1299: space: +1300: integer: 0 +1301: space: +1302: word: R +1303: space: \x0a +1306: dict_close: >> +1308: space: \x0a +1311: name: /Type +1316: space: +1317: name: /Page +1322: space: \x0a +1323: dict_close: >> +1325: space: \x0a +1326: bad: %% Object stream: object 7, index 5; original obje (exceeded allowable length while reading token) +1376: word: ct +1378: space: +1379: word: ID: +1382: space: +1383: integer: 7 +1384: space: \x0a +1385: comment: %% Page 4 +1394: space: \x0a +1395: dict_open: << +1397: space: \x0a +1400: name: /Contents +1409: space: +1410: integer: 43 +1412: space: +1413: integer: 0 +1414: space: +1415: word: R +1416: space: \x0a +1419: name: /MediaBox +1428: space: +1429: array_open: [ +1430: space: \x0a +1435: integer: 0 +1436: space: \x0a +1441: integer: 0 +1442: space: \x0a +1447: integer: 612 +1450: space: \x0a +1455: integer: 792 +1458: space: \x0a +1461: array_close: ] +1462: space: \x0a +1465: name: /Parent +1472: space: +1473: integer: 3 +1474: space: +1475: integer: 0 +1476: space: +1477: word: R +1478: space: \x0a +1481: name: /Resources +1491: space: +1492: dict_open: << +1494: space: \x0a +1499: name: /Font +1504: space: +1505: dict_open: << +1507: space: \x0a +1514: name: /F1 +1517: space: +1518: integer: 21 +1520: space: +1521: integer: 0 +1522: space: +1523: word: R +1524: space: \x0a +1529: dict_close: >> +1531: space: \x0a +1536: name: /ProcSet +1544: space: +1545: integer: 22 +1547: space: +1548: integer: 0 +1549: space: +1550: word: R +1551: space: \x0a +1554: dict_close: >> +1556: space: \x0a +1559: name: /Type +1564: space: +1565: name: /Page +1570: space: \x0a +1571: dict_close: >> +1573: space: \x0a +1574: bad: %% Object stream: object 8, index 6; original obje (exceeded allowable length while reading token) +1624: word: ct +1626: space: +1627: word: ID: +1630: space: +1631: integer: 8 +1632: space: \x0a +1633: comment: %% Page 5 +1642: space: \x0a +1643: dict_open: << +1645: space: \x0a +1648: name: /Contents +1657: space: +1658: integer: 45 +1660: space: +1661: integer: 0 +1662: space: +1663: word: R +1664: space: \x0a +1667: name: /MediaBox +1676: space: +1677: array_open: [ +1678: space: \x0a +1683: integer: 0 +1684: space: \x0a +1689: integer: 0 +1690: space: \x0a +1695: integer: 612 +1698: space: \x0a +1703: integer: 792 +1706: space: \x0a +1709: array_close: ] +1710: space: \x0a +1713: name: /Parent +1720: space: +1721: integer: 3 +1722: space: +1723: integer: 0 +1724: space: +1725: word: R +1726: space: \x0a +1729: name: /Resources +1739: space: +1740: dict_open: << +1742: space: \x0a +1747: name: /Font +1752: space: +1753: dict_open: << +1755: space: \x0a +1762: name: /F1 +1765: space: +1766: integer: 23 +1768: space: +1769: integer: 0 +1770: space: +1771: word: R +1772: space: \x0a +1777: dict_close: >> +1779: space: \x0a +1784: name: /ProcSet +1792: space: +1793: integer: 24 +1795: space: +1796: integer: 0 +1797: space: +1798: word: R +1799: space: \x0a +1802: dict_close: >> +1804: space: \x0a +1807: name: /Type +1812: space: +1813: name: /Page +1818: space: \x0a +1819: dict_close: >> +1821: space: \x0a +1822: bad: %% Object stream: object 9, index 7; original obje (exceeded allowable length while reading token) +1872: word: ct +1874: space: +1875: word: ID: +1878: space: +1879: integer: 9 +1880: space: \x0a +1881: comment: %% Page 6 +1890: space: \x0a +1891: dict_open: << +1893: space: \x0a +1896: name: /Contents +1905: space: +1906: integer: 47 +1908: space: +1909: integer: 0 +1910: space: +1911: word: R +1912: space: \x0a +1915: name: /MediaBox +1924: space: +1925: array_open: [ +1926: space: \x0a +1931: integer: 0 +1932: space: \x0a +1937: integer: 0 +1938: space: \x0a +1943: integer: 612 +1946: space: \x0a +1951: integer: 792 +1954: space: \x0a +1957: array_close: ] +1958: space: \x0a +1961: name: /Parent +1968: space: +1969: integer: 3 +1970: space: +1971: integer: 0 +1972: space: +1973: word: R +1974: space: \x0a +1977: name: /Resources +1987: space: +1988: dict_open: << +1990: space: \x0a +1995: name: /Font +2000: space: +2001: dict_open: << +2003: space: \x0a +2010: name: /F1 +2013: space: +2014: integer: 25 +2016: space: +2017: integer: 0 +2018: space: +2019: word: R +2020: space: \x0a +2025: dict_close: >> +2027: space: \x0a +2032: name: /ProcSet +2040: space: +2041: integer: 26 +2043: space: +2044: integer: 0 +2045: space: +2046: word: R +2047: space: \x0a +2050: dict_close: >> +2052: space: \x0a +2055: name: /Type +2060: space: +2061: name: /Page +2066: space: \x0a +2067: dict_close: >> +2069: space: \x0a +2070: bad: %% Object stream: object 10, index 8; original obj (exceeded allowable length while reading token) +2120: word: ect +2123: space: +2124: word: ID: +2127: space: +2128: integer: 10 +2130: space: \x0a +2131: comment: %% Page 7 +2140: space: \x0a +2141: dict_open: << +2143: space: \x0a +2146: name: /Contents +2155: space: +2156: integer: 49 +2158: space: +2159: integer: 0 +2160: space: +2161: word: R +2162: space: \x0a +2165: name: /MediaBox +2174: space: +2175: array_open: [ +2176: space: \x0a +2181: integer: 0 +2182: space: \x0a +2187: integer: 0 +2188: space: \x0a +2193: integer: 612 +2196: space: \x0a +2201: integer: 792 +2204: space: \x0a +2207: array_close: ] +2208: space: \x0a +2211: name: /Parent +2218: space: +2219: integer: 3 +2220: space: +2221: integer: 0 +2222: space: +2223: word: R +2224: space: \x0a +2227: name: /Resources +2237: space: +2238: dict_open: << +2240: space: \x0a +2245: name: /Font +2250: space: +2251: dict_open: << +2253: space: \x0a +2260: name: /F1 +2263: space: +2264: integer: 27 +2266: space: +2267: integer: 0 +2268: space: +2269: word: R +2270: space: \x0a +2275: dict_close: >> +2277: space: \x0a +2282: name: /ProcSet +2290: space: +2291: integer: 28 +2293: space: +2294: integer: 0 +2295: space: +2296: word: R +2297: space: \x0a +2300: dict_close: >> +2302: space: \x0a +2305: name: /Type +2310: space: +2311: name: /Page +2316: space: \x0a +2317: dict_close: >> +2319: space: \x0a +2320: bad: %% Object stream: object 11, index 9; original obj (exceeded allowable length while reading token) +2370: word: ect +2373: space: +2374: word: ID: +2377: space: +2378: integer: 11 +2380: space: \x0a +2381: comment: %% Page 8 +2390: space: \x0a +2391: dict_open: << +2393: space: \x0a +2396: name: /Contents +2405: space: +2406: integer: 51 +2408: space: +2409: integer: 0 +2410: space: +2411: word: R +2412: space: \x0a +2415: name: /MediaBox +2424: space: +2425: array_open: [ +2426: space: \x0a +2431: integer: 0 +2432: space: \x0a +2437: integer: 0 +2438: space: \x0a +2443: integer: 612 +2446: space: \x0a +2451: integer: 792 +2454: space: \x0a +2457: array_close: ] +2458: space: \x0a +2461: name: /Parent +2468: space: +2469: integer: 3 +2470: space: +2471: integer: 0 +2472: space: +2473: word: R +2474: space: \x0a +2477: name: /Resources +2487: space: +2488: dict_open: << +2490: space: \x0a +2495: name: /Font +2500: space: +2501: dict_open: << +2503: space: \x0a +2510: name: /F1 +2513: space: +2514: integer: 29 +2516: space: +2517: integer: 0 +2518: space: +2519: word: R +2520: space: \x0a +2525: dict_close: >> +2527: space: \x0a +2532: name: /ProcSet +2540: space: +2541: integer: 30 +2543: space: +2544: integer: 0 +2545: space: +2546: word: R +2547: space: \x0a +2550: dict_close: >> +2552: space: \x0a +2555: name: /Type +2560: space: +2561: name: /Page +2566: space: \x0a +2567: dict_close: >> +2569: space: \x0a +2570: bad: %% Object stream: object 12, index 10; original ob (exceeded allowable length while reading token) +2620: word: ject +2624: space: +2625: word: ID: +2628: space: +2629: integer: 12 +2631: space: \x0a +2632: comment: %% Page 9 +2641: space: \x0a +2642: dict_open: << +2644: space: \x0a +2647: name: /Contents +2656: space: +2657: integer: 53 +2659: space: +2660: integer: 0 +2661: space: +2662: word: R +2663: space: \x0a +2666: name: /MediaBox +2675: space: +2676: array_open: [ +2677: space: \x0a +2682: integer: 0 +2683: space: \x0a +2688: integer: 0 +2689: space: \x0a +2694: integer: 612 +2697: space: \x0a +2702: integer: 792 +2705: space: \x0a +2708: array_close: ] +2709: space: \x0a +2712: name: /Parent +2719: space: +2720: integer: 3 +2721: space: +2722: integer: 0 +2723: space: +2724: word: R +2725: space: \x0a +2728: name: /Resources +2738: space: +2739: dict_open: << +2741: space: \x0a +2746: name: /Font +2751: space: +2752: dict_open: << +2754: space: \x0a +2761: name: /F1 +2764: space: +2765: integer: 31 +2767: space: +2768: integer: 0 +2769: space: +2770: word: R +2771: space: \x0a +2776: dict_close: >> +2778: space: \x0a +2783: name: /ProcSet +2791: space: +2792: integer: 32 +2794: space: +2795: integer: 0 +2796: space: +2797: word: R +2798: space: \x0a +2801: dict_close: >> +2803: space: \x0a +2806: name: /Type +2811: space: +2812: name: /Page +2817: space: \x0a +2818: dict_close: >> +2820: space: \x0a +2821: bad: %% Object stream: object 13, index 11; original ob (exceeded allowable length while reading token) +2871: word: ject +2875: space: +2876: word: ID: +2879: space: +2880: integer: 13 +2882: space: \x0a +2883: comment: %% Page 10 +2893: space: \x0a +2894: dict_open: << +2896: space: \x0a +2899: name: /Contents +2908: space: +2909: integer: 55 +2911: space: +2912: integer: 0 +2913: space: +2914: word: R +2915: space: \x0a +2918: name: /MediaBox +2927: space: +2928: array_open: [ +2929: space: \x0a +2934: integer: 0 +2935: space: \x0a +2940: integer: 0 +2941: space: \x0a +2946: integer: 612 +2949: space: \x0a +2954: integer: 792 +2957: space: \x0a +2960: array_close: ] +2961: space: \x0a +2964: name: /Parent +2971: space: +2972: integer: 3 +2973: space: +2974: integer: 0 +2975: space: +2976: word: R +2977: space: \x0a +2980: name: /Resources +2990: space: +2991: dict_open: << +2993: space: \x0a +2998: name: /Font +3003: space: +3004: dict_open: << +3006: space: \x0a +3013: name: /F1 +3016: space: +3017: integer: 33 +3019: space: +3020: integer: 0 +3021: space: +3022: word: R +3023: space: \x0a +3028: dict_close: >> +3030: space: \x0a +3035: name: /ProcSet +3043: space: +3044: integer: 34 +3046: space: +3047: integer: 0 +3048: space: +3049: word: R +3050: space: \x0a +3053: dict_close: >> +3055: space: \x0a +3058: name: /Type +3063: space: +3064: name: /Page +3069: space: \x0a +3070: dict_close: >> +3072: space: \x0a +3073: bad: %% Object stream: object 14, index 12; original ob (exceeded allowable length while reading token) +3123: word: ject +3127: space: +3128: word: ID: +3131: space: +3132: integer: 14 +3134: space: \x0a +3135: comment: %% Page 11 +3145: space: \x0a +3146: dict_open: << +3148: space: \x0a +3151: name: /Contents +3160: space: +3161: integer: 57 +3163: space: +3164: integer: 0 +3165: space: +3166: word: R +3167: space: \x0a +3170: name: /MediaBox +3179: space: +3180: array_open: [ +3181: space: \x0a +3186: integer: 0 +3187: space: \x0a +3192: integer: 0 +3193: space: \x0a +3198: integer: 612 +3201: space: \x0a +3206: integer: 792 +3209: space: \x0a +3212: array_close: ] +3213: space: \x0a +3216: name: /Parent +3223: space: +3224: integer: 3 +3225: space: +3226: integer: 0 +3227: space: +3228: word: R +3229: space: \x0a +3232: name: /Resources +3242: space: +3243: dict_open: << +3245: space: \x0a +3250: name: /Font +3255: space: +3256: dict_open: << +3258: space: \x0a +3265: name: /F1 +3268: space: +3269: integer: 35 +3271: space: +3272: integer: 0 +3273: space: +3274: word: R +3275: space: \x0a +3280: dict_close: >> +3282: space: \x0a +3287: name: /ProcSet +3295: space: +3296: integer: 36 +3298: space: +3299: integer: 0 +3300: space: +3301: word: R +3302: space: \x0a +3305: dict_close: >> +3307: space: \x0a +3310: name: /Type +3315: space: +3316: name: /Page +3321: space: \x0a +3322: dict_close: >> +3324: space: \x0a +3325: bad: %% Object stream: object 15, index 13; original ob (exceeded allowable length while reading token) +3375: word: ject +3379: space: +3380: word: ID: +3383: space: +3384: integer: 15 +3386: space: \x0a +3387: dict_open: << +3389: space: \x0a +3392: name: /BaseFont +3401: space: +3402: name: /Helvetica +3412: space: \x0a +3415: name: /Encoding +3424: space: +3425: name: /WinAnsiEncoding +3441: space: \x0a +3444: name: /Name +3449: space: +3450: name: /F1 +3453: space: \x0a +3456: name: /Subtype +3464: space: +3465: name: /Type1 +3471: space: \x0a +3474: name: /Type +3479: space: +3480: name: /Font +3485: space: \x0a +3486: dict_close: >> +3488: space: \x0a +3489: bad: %% Object stream: object 16, index 14; original ob (exceeded allowable length while reading token) +3539: word: ject +3543: space: +3544: word: ID: +3547: space: +3548: integer: 16 +3550: space: \x0a +3551: array_open: [ +3552: space: \x0a +3555: name: /PDF +3559: space: \x0a +3562: name: /Text +3567: space: \x0a +3568: array_close: ] +3569: space: \x0a +3570: bad: %% Object stream: object 17, index 15; original ob (exceeded allowable length while reading token) +3620: word: ject +3624: space: +3625: word: ID: +3628: space: +3629: integer: 17 +3631: space: \x0a +3632: dict_open: << +3634: space: \x0a +3637: name: /BaseFont +3646: space: +3647: name: /Helvetica +3657: space: \x0a +3660: name: /Encoding +3669: space: +3670: name: /WinAnsiEncoding +3686: space: \x0a +3689: name: /Name +3694: space: +3695: name: /F1 +3698: space: \x0a +3701: name: /Subtype +3709: space: +3710: name: /Type1 +3716: space: \x0a +3719: name: /Type +3724: space: +3725: name: /Font +3730: space: \x0a +3731: dict_close: >> +3733: space: \x0a +3734: bad: %% Object stream: object 18, index 16; original ob (exceeded allowable length while reading token) +3784: word: ject +3788: space: +3789: word: ID: +3792: space: +3793: integer: 18 +3795: space: \x0a +3796: array_open: [ +3797: space: \x0a +3800: name: /PDF +3804: space: \x0a +3807: name: /Text +3812: space: \x0a +3813: array_close: ] +3814: space: \x0a +3815: bad: %% Object stream: object 19, index 17; original ob (exceeded allowable length while reading token) +3865: word: ject +3869: space: +3870: word: ID: +3873: space: +3874: integer: 19 +3876: space: \x0a +3877: dict_open: << +3879: space: \x0a +3882: name: /BaseFont +3891: space: +3892: name: /Helvetica +3902: space: \x0a +3905: name: /Encoding +3914: space: +3915: name: /WinAnsiEncoding +3931: space: \x0a +3934: name: /Name +3939: space: +3940: name: /F1 +3943: space: \x0a +3946: name: /Subtype +3954: space: +3955: name: /Type1 +3961: space: \x0a +3964: name: /Type +3969: space: +3970: name: /Font +3975: space: \x0a +3976: dict_close: >> +3978: space: \x0a +3979: bad: %% Object stream: object 20, index 18; original ob (exceeded allowable length while reading token) +4029: word: ject +4033: space: +4034: word: ID: +4037: space: +4038: integer: 20 +4040: space: \x0a +4041: array_open: [ +4042: space: \x0a +4045: name: /PDF +4049: space: \x0a +4052: name: /Text +4057: space: \x0a +4058: array_close: ] +4059: space: \x0a +4060: bad: %% Object stream: object 21, index 19; original ob (exceeded allowable length while reading token) +4110: word: ject +4114: space: +4115: word: ID: +4118: space: +4119: integer: 21 +4121: space: \x0a +4122: dict_open: << +4124: space: \x0a +4127: name: /BaseFont +4136: space: +4137: name: /Helvetica +4147: space: \x0a +4150: name: /Encoding +4159: space: +4160: name: /WinAnsiEncoding +4176: space: \x0a +4179: name: /Name +4184: space: +4185: name: /F1 +4188: space: \x0a +4191: name: /Subtype +4199: space: +4200: name: /Type1 +4206: space: \x0a +4209: name: /Type +4214: space: +4215: name: /Font +4220: space: \x0a +4221: dict_close: >> +4223: space: \x0a +4224: bad: %% Object stream: object 22, index 20; original ob (exceeded allowable length while reading token) +4274: word: ject +4278: space: +4279: word: ID: +4282: space: +4283: integer: 22 +4285: space: \x0a +4286: array_open: [ +4287: space: \x0a +4290: name: /PDF +4294: space: \x0a +4297: name: /Text +4302: space: \x0a +4303: array_close: ] +4304: space: \x0a +4305: bad: %% Object stream: object 23, index 21; original ob (exceeded allowable length while reading token) +4355: word: ject +4359: space: +4360: word: ID: +4363: space: +4364: integer: 23 +4366: space: \x0a +4367: dict_open: << +4369: space: \x0a +4372: name: /BaseFont +4381: space: +4382: name: /Helvetica +4392: space: \x0a +4395: name: /Encoding +4404: space: +4405: name: /WinAnsiEncoding +4421: space: \x0a +4424: name: /Name +4429: space: +4430: name: /F1 +4433: space: \x0a +4436: name: /Subtype +4444: space: +4445: name: /Type1 +4451: space: \x0a +4454: name: /Type +4459: space: +4460: name: /Font +4465: space: \x0a +4466: dict_close: >> +4468: space: \x0a +4469: bad: %% Object stream: object 24, index 22; original ob (exceeded allowable length while reading token) +4519: word: ject +4523: space: +4524: word: ID: +4527: space: +4528: integer: 24 +4530: space: \x0a +4531: array_open: [ +4532: space: \x0a +4535: name: /PDF +4539: space: \x0a +4542: name: /Text +4547: space: \x0a +4548: array_close: ] +4549: space: \x0a +4550: bad: %% Object stream: object 25, index 23; original ob (exceeded allowable length while reading token) +4600: word: ject +4604: space: +4605: word: ID: +4608: space: +4609: integer: 25 +4611: space: \x0a +4612: dict_open: << +4614: space: \x0a +4617: name: /BaseFont +4626: space: +4627: name: /Helvetica +4637: space: \x0a +4640: name: /Encoding +4649: space: +4650: name: /WinAnsiEncoding +4666: space: \x0a +4669: name: /Name +4674: space: +4675: name: /F1 +4678: space: \x0a +4681: name: /Subtype +4689: space: +4690: name: /Type1 +4696: space: \x0a +4699: name: /Type +4704: space: +4705: name: /Font +4710: space: \x0a +4711: dict_close: >> +4713: space: \x0a +4714: bad: %% Object stream: object 26, index 24; original ob (exceeded allowable length while reading token) +4764: word: ject +4768: space: +4769: word: ID: +4772: space: +4773: integer: 26 +4775: space: \x0a +4776: array_open: [ +4777: space: \x0a +4780: name: /PDF +4784: space: \x0a +4787: name: /Text +4792: space: \x0a +4793: array_close: ] +4794: space: \x0a +4795: bad: %% Object stream: object 27, index 25; original ob (exceeded allowable length while reading token) +4845: word: ject +4849: space: +4850: word: ID: +4853: space: +4854: integer: 27 +4856: space: \x0a +4857: dict_open: << +4859: space: \x0a +4862: name: /BaseFont +4871: space: +4872: name: /Helvetica +4882: space: \x0a +4885: name: /Encoding +4894: space: +4895: name: /WinAnsiEncoding +4911: space: \x0a +4914: name: /Name +4919: space: +4920: name: /F1 +4923: space: \x0a +4926: name: /Subtype +4934: space: +4935: name: /Type1 +4941: space: \x0a +4944: name: /Type +4949: space: +4950: name: /Font +4955: space: \x0a +4956: dict_close: >> +4958: space: \x0a +4959: bad: %% Object stream: object 28, index 26; original ob (exceeded allowable length while reading token) +5009: word: ject +5013: space: +5014: word: ID: +5017: space: +5018: integer: 28 +5020: space: \x0a +5021: array_open: [ +5022: space: \x0a +5025: name: /PDF +5029: space: \x0a +5032: name: /Text +5037: space: \x0a +5038: array_close: ] +5039: space: \x0a +5040: bad: %% Object stream: object 29, index 27; original ob (exceeded allowable length while reading token) +5090: word: ject +5094: space: +5095: word: ID: +5098: space: +5099: integer: 29 +5101: space: \x0a +5102: dict_open: << +5104: space: \x0a +5107: name: /BaseFont +5116: space: +5117: name: /Helvetica +5127: space: \x0a +5130: name: /Encoding +5139: space: +5140: name: /WinAnsiEncoding +5156: space: \x0a +5159: name: /Name +5164: space: +5165: name: /F1 +5168: space: \x0a +5171: name: /Subtype +5179: space: +5180: name: /Type1 +5186: space: \x0a +5189: name: /Type +5194: space: +5195: name: /Font +5200: space: \x0a +5201: dict_close: >> +5203: space: \x0a +5204: bad: %% Object stream: object 30, index 28; original ob (exceeded allowable length while reading token) +5254: word: ject +5258: space: +5259: word: ID: +5262: space: +5263: integer: 30 +5265: space: \x0a +5266: array_open: [ +5267: space: \x0a +5270: name: /PDF +5274: space: \x0a +5277: name: /Text +5282: space: \x0a +5283: array_close: ] +5284: space: \x0a +5285: bad: %% Object stream: object 31, index 29; original ob (exceeded allowable length while reading token) +5335: word: ject +5339: space: +5340: word: ID: +5343: space: +5344: integer: 31 +5346: space: \x0a +5347: dict_open: << +5349: space: \x0a +5352: name: /BaseFont +5361: space: +5362: name: /Helvetica +5372: space: \x0a +5375: name: /Encoding +5384: space: +5385: name: /WinAnsiEncoding +5401: space: \x0a +5404: name: /Name +5409: space: +5410: name: /F1 +5413: space: \x0a +5416: name: /Subtype +5424: space: +5425: name: /Type1 +5431: space: \x0a +5434: name: /Type +5439: space: +5440: name: /Font +5445: space: \x0a +5446: dict_close: >> +5448: space: \x0a +5449: bad: %% Object stream: object 32, index 30; original ob (exceeded allowable length while reading token) +5499: word: ject +5503: space: +5504: word: ID: +5507: space: +5508: integer: 32 +5510: space: \x0a +5511: array_open: [ +5512: space: \x0a +5515: name: /PDF +5519: space: \x0a +5522: name: /Text +5527: space: \x0a +5528: array_close: ] +5529: space: \x0a +5530: bad: %% Object stream: object 33, index 31; original ob (exceeded allowable length while reading token) +5580: word: ject +5584: space: +5585: word: ID: +5588: space: +5589: integer: 33 +5591: space: \x0a +5592: dict_open: << +5594: space: \x0a +5597: name: /BaseFont +5606: space: +5607: name: /Helvetica +5617: space: \x0a +5620: name: /Encoding +5629: space: +5630: name: /WinAnsiEncoding +5646: space: \x0a +5649: name: /Name +5654: space: +5655: name: /F1 +5658: space: \x0a +5661: name: /Subtype +5669: space: +5670: name: /Type1 +5676: space: \x0a +5679: name: /Type +5684: space: +5685: name: /Font +5690: space: \x0a +5691: dict_close: >> +5693: space: \x0a +5694: bad: %% Object stream: object 34, index 32; original ob (exceeded allowable length while reading token) +5744: word: ject +5748: space: +5749: word: ID: +5752: space: +5753: integer: 34 +5755: space: \x0a +5756: array_open: [ +5757: space: \x0a +5760: name: /PDF +5764: space: \x0a +5767: name: /Text +5772: space: \x0a +5773: array_close: ] +5774: space: \x0a +5775: bad: %% Object stream: object 35, index 33; original ob (exceeded allowable length while reading token) +5825: word: ject +5829: space: +5830: word: ID: +5833: space: +5834: integer: 35 +5836: space: \x0a +5837: dict_open: << +5839: space: \x0a +5842: name: /BaseFont +5851: space: +5852: name: /Helvetica +5862: space: \x0a +5865: name: /Encoding +5874: space: +5875: name: /WinAnsiEncoding +5891: space: \x0a +5894: name: /Name +5899: space: +5900: name: /F1 +5903: space: \x0a +5906: name: /Subtype +5914: space: +5915: name: /Type1 +5921: space: \x0a +5924: name: /Type +5929: space: +5930: name: /Font +5935: space: \x0a +5936: dict_close: >> +5938: space: \x0a +5939: bad: %% Object stream: object 36, index 34; original ob (exceeded allowable length while reading token) +5989: word: ject +5993: space: +5994: word: ID: +5997: space: +5998: integer: 36 +6000: space: \x0a +6001: array_open: [ +6002: space: \x0a +6005: name: /PDF +6009: space: \x0a +6012: name: /Text +6017: space: \x0a +6018: array_close: ] +6019: space: \x0a +6020: eof +--- END OBJECT STREAM 1 --- diff --git a/qpdf/qtest/qpdf/tokens-no-ignorable.out b/qpdf/qtest/qpdf/tokens-no-ignorable.out new file mode 100644 index 00000000..2ad1e3a6 --- /dev/null +++ b/qpdf/qtest/qpdf/tokens-no-ignorable.out @@ -0,0 +1,1120 @@ +--- BEGIN FILE --- +60: integer: 1 +62: integer: 0 +64: word: obj +68: dict_open: << +73: name: /Type +79: name: /ObjStm +89: name: /Length +97: integer: 6020 +104: name: /N +107: integer: 35 +112: name: /First +119: integer: 323 +123: dict_close: >> +126: word: stream +skipping to endstream +6153: word: endstream +6163: word: endobj +6222: integer: 37 +6225: integer: 0 +6227: word: obj +6231: dict_open: << +6236: name: /Length +6244: integer: 38 +6247: integer: 0 +6249: word: R +6251: dict_close: >> +6254: word: stream +skipping to endstream +6305: word: endstream +6315: word: endobj +6323: integer: 38 +6326: integer: 0 +6328: word: obj +6332: integer: 44 +6335: word: endobj +6394: integer: 39 +6397: integer: 0 +6399: word: obj +6403: dict_open: << +6408: name: /Length +6416: integer: 40 +6419: integer: 0 +6421: word: R +6423: dict_close: >> +6426: word: stream +skipping to endstream +6832: word: endstream +6842: word: endobj +6850: integer: 40 +6853: integer: 0 +6855: word: obj +6859: integer: 399 +6863: word: endobj +6922: integer: 41 +6925: integer: 0 +6927: word: obj +6931: dict_open: << +6936: name: /Length +6944: integer: 42 +6947: integer: 0 +6949: word: R +6951: dict_close: >> +6954: word: stream +skipping to endstream +7001: word: endstream +7011: word: endobj +7019: integer: 42 +7022: integer: 0 +7024: word: obj +7028: integer: 40 +7031: word: endobj +7090: integer: 43 +7093: integer: 0 +7095: word: obj +7099: dict_open: << +7104: name: /Length +7112: integer: 44 +7115: integer: 0 +7117: word: R +7119: dict_close: >> +7122: word: stream +skipping to endstream +7404: word: endstream +7414: word: endobj +7422: integer: 44 +7425: integer: 0 +7427: word: obj +7431: integer: 275 +7435: word: endobj +7494: integer: 45 +7497: integer: 0 +7499: word: obj +7503: dict_open: << +7508: name: /Length +7516: integer: 46 +7519: integer: 0 +7521: word: R +7523: dict_close: >> +7526: word: stream +skipping to endstream +7601: word: endstream +7611: word: endobj +7619: integer: 46 +7622: integer: 0 +7624: word: obj +7628: integer: 68 +7631: word: endobj +7690: integer: 47 +7693: integer: 0 +7695: word: obj +7699: dict_open: << +7704: name: /Length +7712: integer: 48 +7715: integer: 0 +7717: word: R +7719: dict_close: >> +7722: word: stream +skipping to endstream +7773: word: endstream +7783: word: endobj +7791: integer: 48 +7794: integer: 0 +7796: word: obj +7800: integer: 44 +7803: word: endobj +7862: integer: 49 +7865: integer: 0 +7867: word: obj +7871: dict_open: << +7876: name: /Length +7884: integer: 50 +7887: integer: 0 +7889: word: R +7891: dict_close: >> +7894: word: stream +skipping to endstream +7945: word: endstream +7955: word: endobj +7963: integer: 50 +7966: integer: 0 +7968: word: obj +7972: integer: 44 +7975: word: endobj +8034: integer: 51 +8037: integer: 0 +8039: word: obj +8043: dict_open: << +8048: name: /Length +8056: integer: 52 +8059: integer: 0 +8061: word: R +8063: dict_close: >> +8066: word: stream +skipping to endstream +8117: word: endstream +8127: word: endobj +8135: integer: 52 +8138: integer: 0 +8140: word: obj +8144: integer: 44 +8147: word: endobj +8206: integer: 53 +8209: integer: 0 +8211: word: obj +8215: dict_open: << +8220: name: /Length +8228: integer: 54 +8231: integer: 0 +8233: word: R +8235: dict_close: >> +8238: word: stream +skipping to endstream +8289: word: endstream +8299: word: endobj +8307: integer: 54 +8310: integer: 0 +8312: word: obj +8316: integer: 44 +8319: word: endobj +8379: integer: 55 +8382: integer: 0 +8384: word: obj +8388: dict_open: << +8393: name: /Length +8401: integer: 56 +8404: integer: 0 +8406: word: R +8408: dict_close: >> +8411: word: stream +skipping to endstream +8462: word: endstream +8472: word: endobj +8480: integer: 56 +8483: integer: 0 +8485: word: obj +8489: integer: 44 +8492: word: endobj +8552: integer: 57 +8555: integer: 0 +8557: word: obj +8561: dict_open: << +8566: name: /Length +8574: integer: 58 +8577: integer: 0 +8579: word: R +8581: dict_close: >> +8584: word: stream +skipping to endstream +8635: word: endstream +8645: word: endobj +8653: integer: 58 +8656: integer: 0 +8658: word: obj +8662: integer: 44 +8665: word: endobj +8673: integer: 59 +8676: integer: 0 +8678: word: obj +8682: dict_open: << +8687: name: /Type +8693: name: /XRef +8701: name: /Length +8709: integer: 240 +8715: name: /W +8718: array_open: [ +8720: integer: 1 +8722: integer: 2 +8724: integer: 1 +8726: array_close: ] +8730: name: /Root +8736: integer: 2 +8738: integer: 0 +8740: word: R +8744: name: /Size +8750: integer: 60 +8755: name: /ID +8759: array_open: [ +8760: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>) +8794: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: ) +8828: array_close: ] +8830: dict_close: >> +8833: word: stream +skipping to endstream +9081: word: endstream +9091: word: endobj +9099: word: startxref +9109: integer: 8673 +9120: eof +--- END FILE --- +--- BEGIN PAGE 1 --- +0: word: BT +5: name: /F1 +9: integer: 24 +12: word: Tf +17: integer: 72 +20: integer: 720 +24: word: Td +29: string: Potato (raw: (Potato)) +38: word: Tj +41: word: ET +44: eof +--- END PAGE 1 --- +--- BEGIN PAGE 2 --- +0: word: BT +5: name: /F1 +9: integer: 24 +12: word: Tf +17: integer: 72 +20: integer: 720 +24: word: Td +29: string: Potato (raw: (Potato)) +38: word: Tj +41: word: ET +44: word: BI +47: name: /CS +51: name: /G +53: name: /W +56: integer: 66 +58: name: /H +61: integer: 47 +63: name: /BPC +68: integer: 8 +69: name: /F +71: name: /Fl +74: name: /DP +77: dict_open: << +79: name: /Predictor +90: integer: 15 +92: name: /Columns +101: integer: 66 +103: dict_close: >> +106: word: ID +skipping to EI +352: word: EI +355: word: BT +360: name: /F1 +364: integer: 24 +367: word: Tf +372: integer: 72 +375: integer: 720 +379: word: Td +384: string: Potato (raw: (Potato)) +393: word: Tj +396: word: ET +399: eof +--- END PAGE 2 --- +--- BEGIN PAGE 3 --- +0: word: BT +5: name: /F1 +9: integer: 24 +12: word: Tf +17: integer: 72 +20: integer: 720 +24: word: Td +29: bad: (Potato\x0aET\x0a (EOF while reading token) +40: eof +--- END PAGE 3 --- +--- BEGIN PAGE 4 --- +0: word: BT +5: name: /F1 +9: integer: 24 +12: word: Tf +17: string: \xfe\xeb (raw: ) +26: string: \xab\xcd (raw: ) +36: string: quack (raw: (qu\\x0d\x0aack)) +49: string: quack (raw: (qu\\x0aack)) +61: string: quack (raw: (qu\\x0dack)) +73: integer: 72 +76: integer: 720 +80: word: Td +85: real: 3.14 +92: real: 3. +97: real: .14 +103: real: +3.14 +111: real: +3. +117: real: +.14 +124: real: -3.14 +132: real: -3. +138: real: -.14 +145: integer: +16059 +154: integer: -16059 +163: word: +. +168: bad: (unexpected >) +179: word: quack +185: bad: /name#oops (invalid name token) +196: name: /name (raw: /n#61me) +204: word: one +208: bool: true +213: word: two +217: bool: false +223: word: three +229: null: null +234: word: four +239: word: !@#$^& +245: brace_open: { +246: brace_close: } +247: word: *-_+= +253: word: abc123def3.14true +271: bad: > +420: dict_open: << +425: name: /Count +432: integer: 11 +437: name: /Kids +443: array_open: [ +449: integer: 4 +451: integer: 0 +453: word: R +459: integer: 5 +461: integer: 0 +463: word: R +469: integer: 6 +471: integer: 0 +473: word: R +479: integer: 7 +481: integer: 0 +483: word: R +489: integer: 8 +491: integer: 0 +493: word: R +499: integer: 9 +501: integer: 0 +503: word: R +509: integer: 10 +512: integer: 0 +514: word: R +520: integer: 11 +523: integer: 0 +525: word: R +531: integer: 12 +534: integer: 0 +536: word: R +542: integer: 13 +545: integer: 0 +547: word: R +553: integer: 14 +556: integer: 0 +558: word: R +562: array_close: ] +566: name: /Type +572: name: /Pages +579: dict_close: >> +651: dict_open: << +656: name: /Contents +666: integer: 37 +669: integer: 0 +671: word: R +675: name: /MediaBox +685: array_open: [ +691: integer: 0 +697: integer: 0 +703: integer: 612 +711: integer: 792 +717: array_close: ] +721: name: /Parent +729: integer: 3 +731: integer: 0 +733: word: R +737: name: /Resources +748: dict_open: << +755: name: /Font +761: dict_open: << +770: name: /F1 +774: integer: 15 +777: integer: 0 +779: word: R +785: dict_close: >> +792: name: /ProcSet +801: integer: 16 +804: integer: 0 +806: word: R +810: dict_close: >> +815: name: /Type +821: name: /Page +827: dict_close: >> +899: dict_open: << +904: name: /Contents +914: integer: 39 +917: integer: 0 +919: word: R +923: name: /MediaBox +933: array_open: [ +939: integer: 0 +945: integer: 0 +951: integer: 612 +959: integer: 792 +965: array_close: ] +969: name: /Parent +977: integer: 3 +979: integer: 0 +981: word: R +985: name: /Resources +996: dict_open: << +1003: name: /Font +1009: dict_open: << +1018: name: /F1 +1022: integer: 17 +1025: integer: 0 +1027: word: R +1033: dict_close: >> +1040: name: /ProcSet +1049: integer: 18 +1052: integer: 0 +1054: word: R +1058: dict_close: >> +1063: name: /Type +1069: name: /Page +1075: dict_close: >> +1147: dict_open: << +1152: name: /Contents +1162: integer: 41 +1165: integer: 0 +1167: word: R +1171: name: /MediaBox +1181: array_open: [ +1187: integer: 0 +1193: integer: 0 +1199: integer: 612 +1207: integer: 792 +1213: array_close: ] +1217: name: /Parent +1225: integer: 3 +1227: integer: 0 +1229: word: R +1233: name: /Resources +1244: dict_open: << +1251: name: /Font +1257: dict_open: << +1266: name: /F1 +1270: integer: 19 +1273: integer: 0 +1275: word: R +1281: dict_close: >> +1288: name: /ProcSet +1297: integer: 20 +1300: integer: 0 +1302: word: R +1306: dict_close: >> +1311: name: /Type +1317: name: /Page +1323: dict_close: >> +1395: dict_open: << +1400: name: /Contents +1410: integer: 43 +1413: integer: 0 +1415: word: R +1419: name: /MediaBox +1429: array_open: [ +1435: integer: 0 +1441: integer: 0 +1447: integer: 612 +1455: integer: 792 +1461: array_close: ] +1465: name: /Parent +1473: integer: 3 +1475: integer: 0 +1477: word: R +1481: name: /Resources +1492: dict_open: << +1499: name: /Font +1505: dict_open: << +1514: name: /F1 +1518: integer: 21 +1521: integer: 0 +1523: word: R +1529: dict_close: >> +1536: name: /ProcSet +1545: integer: 22 +1548: integer: 0 +1550: word: R +1554: dict_close: >> +1559: name: /Type +1565: name: /Page +1571: dict_close: >> +1643: dict_open: << +1648: name: /Contents +1658: integer: 45 +1661: integer: 0 +1663: word: R +1667: name: /MediaBox +1677: array_open: [ +1683: integer: 0 +1689: integer: 0 +1695: integer: 612 +1703: integer: 792 +1709: array_close: ] +1713: name: /Parent +1721: integer: 3 +1723: integer: 0 +1725: word: R +1729: name: /Resources +1740: dict_open: << +1747: name: /Font +1753: dict_open: << +1762: name: /F1 +1766: integer: 23 +1769: integer: 0 +1771: word: R +1777: dict_close: >> +1784: name: /ProcSet +1793: integer: 24 +1796: integer: 0 +1798: word: R +1802: dict_close: >> +1807: name: /Type +1813: name: /Page +1819: dict_close: >> +1891: dict_open: << +1896: name: /Contents +1906: integer: 47 +1909: integer: 0 +1911: word: R +1915: name: /MediaBox +1925: array_open: [ +1931: integer: 0 +1937: integer: 0 +1943: integer: 612 +1951: integer: 792 +1957: array_close: ] +1961: name: /Parent +1969: integer: 3 +1971: integer: 0 +1973: word: R +1977: name: /Resources +1988: dict_open: << +1995: name: /Font +2001: dict_open: << +2010: name: /F1 +2014: integer: 25 +2017: integer: 0 +2019: word: R +2025: dict_close: >> +2032: name: /ProcSet +2041: integer: 26 +2044: integer: 0 +2046: word: R +2050: dict_close: >> +2055: name: /Type +2061: name: /Page +2067: dict_close: >> +2141: dict_open: << +2146: name: /Contents +2156: integer: 49 +2159: integer: 0 +2161: word: R +2165: name: /MediaBox +2175: array_open: [ +2181: integer: 0 +2187: integer: 0 +2193: integer: 612 +2201: integer: 792 +2207: array_close: ] +2211: name: /Parent +2219: integer: 3 +2221: integer: 0 +2223: word: R +2227: name: /Resources +2238: dict_open: << +2245: name: /Font +2251: dict_open: << +2260: name: /F1 +2264: integer: 27 +2267: integer: 0 +2269: word: R +2275: dict_close: >> +2282: name: /ProcSet +2291: integer: 28 +2294: integer: 0 +2296: word: R +2300: dict_close: >> +2305: name: /Type +2311: name: /Page +2317: dict_close: >> +2391: dict_open: << +2396: name: /Contents +2406: integer: 51 +2409: integer: 0 +2411: word: R +2415: name: /MediaBox +2425: array_open: [ +2431: integer: 0 +2437: integer: 0 +2443: integer: 612 +2451: integer: 792 +2457: array_close: ] +2461: name: /Parent +2469: integer: 3 +2471: integer: 0 +2473: word: R +2477: name: /Resources +2488: dict_open: << +2495: name: /Font +2501: dict_open: << +2510: name: /F1 +2514: integer: 29 +2517: integer: 0 +2519: word: R +2525: dict_close: >> +2532: name: /ProcSet +2541: integer: 30 +2544: integer: 0 +2546: word: R +2550: dict_close: >> +2555: name: /Type +2561: name: /Page +2567: dict_close: >> +2642: dict_open: << +2647: name: /Contents +2657: integer: 53 +2660: integer: 0 +2662: word: R +2666: name: /MediaBox +2676: array_open: [ +2682: integer: 0 +2688: integer: 0 +2694: integer: 612 +2702: integer: 792 +2708: array_close: ] +2712: name: /Parent +2720: integer: 3 +2722: integer: 0 +2724: word: R +2728: name: /Resources +2739: dict_open: << +2746: name: /Font +2752: dict_open: << +2761: name: /F1 +2765: integer: 31 +2768: integer: 0 +2770: word: R +2776: dict_close: >> +2783: name: /ProcSet +2792: integer: 32 +2795: integer: 0 +2797: word: R +2801: dict_close: >> +2806: name: /Type +2812: name: /Page +2818: dict_close: >> +2894: dict_open: << +2899: name: /Contents +2909: integer: 55 +2912: integer: 0 +2914: word: R +2918: name: /MediaBox +2928: array_open: [ +2934: integer: 0 +2940: integer: 0 +2946: integer: 612 +2954: integer: 792 +2960: array_close: ] +2964: name: /Parent +2972: integer: 3 +2974: integer: 0 +2976: word: R +2980: name: /Resources +2991: dict_open: << +2998: name: /Font +3004: dict_open: << +3013: name: /F1 +3017: integer: 33 +3020: integer: 0 +3022: word: R +3028: dict_close: >> +3035: name: /ProcSet +3044: integer: 34 +3047: integer: 0 +3049: word: R +3053: dict_close: >> +3058: name: /Type +3064: name: /Page +3070: dict_close: >> +3146: dict_open: << +3151: name: /Contents +3161: integer: 57 +3164: integer: 0 +3166: word: R +3170: name: /MediaBox +3180: array_open: [ +3186: integer: 0 +3192: integer: 0 +3198: integer: 612 +3206: integer: 792 +3212: array_close: ] +3216: name: /Parent +3224: integer: 3 +3226: integer: 0 +3228: word: R +3232: name: /Resources +3243: dict_open: << +3250: name: /Font +3256: dict_open: << +3265: name: /F1 +3269: integer: 35 +3272: integer: 0 +3274: word: R +3280: dict_close: >> +3287: name: /ProcSet +3296: integer: 36 +3299: integer: 0 +3301: word: R +3305: dict_close: >> +3310: name: /Type +3316: name: /Page +3322: dict_close: >> +3387: dict_open: << +3392: name: /BaseFont +3402: name: /Helvetica +3415: name: /Encoding +3425: name: /WinAnsiEncoding +3444: name: /Name +3450: name: /F1 +3456: name: /Subtype +3465: name: /Type1 +3474: name: /Type +3480: name: /Font +3486: dict_close: >> +3551: array_open: [ +3555: name: /PDF +3562: name: /Text +3568: array_close: ] +3632: dict_open: << +3637: name: /BaseFont +3647: name: /Helvetica +3660: name: /Encoding +3670: name: /WinAnsiEncoding +3689: name: /Name +3695: name: /F1 +3701: name: /Subtype +3710: name: /Type1 +3719: name: /Type +3725: name: /Font +3731: dict_close: >> +3796: array_open: [ +3800: name: /PDF +3807: name: /Text +3813: array_close: ] +3877: dict_open: << +3882: name: /BaseFont +3892: name: /Helvetica +3905: name: /Encoding +3915: name: /WinAnsiEncoding +3934: name: /Name +3940: name: /F1 +3946: name: /Subtype +3955: name: /Type1 +3964: name: /Type +3970: name: /Font +3976: dict_close: >> +4041: array_open: [ +4045: name: /PDF +4052: name: /Text +4058: array_close: ] +4122: dict_open: << +4127: name: /BaseFont +4137: name: /Helvetica +4150: name: /Encoding +4160: name: /WinAnsiEncoding +4179: name: /Name +4185: name: /F1 +4191: name: /Subtype +4200: name: /Type1 +4209: name: /Type +4215: name: /Font +4221: dict_close: >> +4286: array_open: [ +4290: name: /PDF +4297: name: /Text +4303: array_close: ] +4367: dict_open: << +4372: name: /BaseFont +4382: name: /Helvetica +4395: name: /Encoding +4405: name: /WinAnsiEncoding +4424: name: /Name +4430: name: /F1 +4436: name: /Subtype +4445: name: /Type1 +4454: name: /Type +4460: name: /Font +4466: dict_close: >> +4531: array_open: [ +4535: name: /PDF +4542: name: /Text +4548: array_close: ] +4612: dict_open: << +4617: name: /BaseFont +4627: name: /Helvetica +4640: name: /Encoding +4650: name: /WinAnsiEncoding +4669: name: /Name +4675: name: /F1 +4681: name: /Subtype +4690: name: /Type1 +4699: name: /Type +4705: name: /Font +4711: dict_close: >> +4776: array_open: [ +4780: name: /PDF +4787: name: /Text +4793: array_close: ] +4857: dict_open: << +4862: name: /BaseFont +4872: name: /Helvetica +4885: name: /Encoding +4895: name: /WinAnsiEncoding +4914: name: /Name +4920: name: /F1 +4926: name: /Subtype +4935: name: /Type1 +4944: name: /Type +4950: name: /Font +4956: dict_close: >> +5021: array_open: [ +5025: name: /PDF +5032: name: /Text +5038: array_close: ] +5102: dict_open: << +5107: name: /BaseFont +5117: name: /Helvetica +5130: name: /Encoding +5140: name: /WinAnsiEncoding +5159: name: /Name +5165: name: /F1 +5171: name: /Subtype +5180: name: /Type1 +5189: name: /Type +5195: name: /Font +5201: dict_close: >> +5266: array_open: [ +5270: name: /PDF +5277: name: /Text +5283: array_close: ] +5347: dict_open: << +5352: name: /BaseFont +5362: name: /Helvetica +5375: name: /Encoding +5385: name: /WinAnsiEncoding +5404: name: /Name +5410: name: /F1 +5416: name: /Subtype +5425: name: /Type1 +5434: name: /Type +5440: name: /Font +5446: dict_close: >> +5511: array_open: [ +5515: name: /PDF +5522: name: /Text +5528: array_close: ] +5592: dict_open: << +5597: name: /BaseFont +5607: name: /Helvetica +5620: name: /Encoding +5630: name: /WinAnsiEncoding +5649: name: /Name +5655: name: /F1 +5661: name: /Subtype +5670: name: /Type1 +5679: name: /Type +5685: name: /Font +5691: dict_close: >> +5756: array_open: [ +5760: name: /PDF +5767: name: /Text +5773: array_close: ] +5837: dict_open: << +5842: name: /BaseFont +5852: name: /Helvetica +5865: name: /Encoding +5875: name: /WinAnsiEncoding +5894: name: /Name +5900: name: /F1 +5906: name: /Subtype +5915: name: /Type1 +5924: name: /Type +5930: name: /Font +5936: dict_close: >> +6001: array_open: [ +6005: name: /PDF +6012: name: /Text +6018: array_close: ] +6020: eof +--- END OBJECT STREAM 1 --- diff --git a/qpdf/qtest/qpdf/tokens.out b/qpdf/qtest/qpdf/tokens.out index f52e619b..2e08f3e0 100644 --- a/qpdf/qtest/qpdf/tokens.out +++ b/qpdf/qtest/qpdf/tokens.out @@ -1,1120 +1,2301 @@ --- BEGIN FILE --- +0: comment: %PDF-1.5 +8: space: \x0a +9: comment: %\xbf\xf7\xa2\xfe +14: space: \x0a +15: comment: %QDF-1.0 +23: space: \x0a\x0a +25: comment: %comment 1 +35: space: \x0d +36: comment: %comment 2 +46: space: \x0d\x0a +48: comment: %comment 3 +58: space: \x0a\x0a 60: integer: 1 +61: space: 62: integer: 0 +63: space: 64: word: obj +67: space: \x0a 68: dict_open: << +70: space: \x0a 73: name: /Type +78: space: 79: name: /ObjStm +86: space: \x0a 89: name: /Length +96: space: 97: integer: 6020 +101: space: \x0a 104: name: /N +106: space: 107: integer: 35 +109: space: \x0a 112: name: /First +118: space: 119: integer: 323 +122: space: \x0a 123: dict_close: >> +125: space: \x0a 126: word: stream skipping to endstream 6153: word: endstream +6162: space: \x0a 6163: word: endobj +6169: space: \x0a\x0a +6171: comment: %% Contents for page 1 +6193: space: \x0a +6194: comment: %% Original object ID: 37 0 +6221: space: \x0a 6222: integer: 37 +6224: space: 6225: integer: 0 +6226: space: 6227: word: obj +6230: space: \x0a 6231: dict_open: << +6233: space: \x0a 6236: name: /Length +6243: space: 6244: integer: 38 +6246: space: 6247: integer: 0 +6248: space: 6249: word: R +6250: space: \x0a 6251: dict_close: >> +6253: space: \x0a 6254: word: stream skipping to endstream 6305: word: endstream +6314: space: \x0a 6315: word: endobj +6321: space: \x0a\x0a 6323: integer: 38 +6325: space: 6326: integer: 0 +6327: space: 6328: word: obj +6331: space: \x0a 6332: integer: 44 +6334: space: \x0a 6335: word: endobj +6341: space: \x0a\x0a +6343: comment: %% Contents for page 2 +6365: space: \x0a +6366: comment: %% Original object ID: 38 0 +6393: space: \x0a 6394: integer: 39 +6396: space: 6397: integer: 0 +6398: space: 6399: word: obj +6402: space: \x0a 6403: dict_open: << +6405: space: \x0a 6408: name: /Length +6415: space: 6416: integer: 40 +6418: space: 6419: integer: 0 +6420: space: 6421: word: R +6422: space: \x0a 6423: dict_close: >> +6425: space: \x0a 6426: word: stream skipping to endstream 6832: word: endstream +6841: space: \x0a 6842: word: endobj +6848: space: \x0a\x0a 6850: integer: 40 +6852: space: 6853: integer: 0 +6854: space: 6855: word: obj +6858: space: \x0a 6859: integer: 399 +6862: space: \x0a 6863: word: endobj +6869: space: \x0a\x0a +6871: comment: %% Contents for page 3 +6893: space: \x0a +6894: comment: %% Original object ID: 39 0 +6921: space: \x0a 6922: integer: 41 +6924: space: 6925: integer: 0 +6926: space: 6927: word: obj +6930: space: \x0a 6931: dict_open: << +6933: space: \x0a 6936: name: /Length +6943: space: 6944: integer: 42 +6946: space: 6947: integer: 0 +6948: space: 6949: word: R +6950: space: \x0a 6951: dict_close: >> +6953: space: \x0a 6954: word: stream skipping to endstream 7001: word: endstream +7010: space: \x0a 7011: word: endobj +7017: space: \x0a\x0a 7019: integer: 42 +7021: space: 7022: integer: 0 +7023: space: 7024: word: obj +7027: space: \x0a 7028: integer: 40 +7030: space: \x0a 7031: word: endobj +7037: space: \x0a\x0a +7039: comment: %% Contents for page 4 +7061: space: \x0a +7062: comment: %% Original object ID: 40 0 +7089: space: \x0a 7090: integer: 43 +7092: space: 7093: integer: 0 +7094: space: 7095: word: obj +7098: space: \x0a 7099: dict_open: << +7101: space: \x0a 7104: name: /Length +7111: space: 7112: integer: 44 +7114: space: 7115: integer: 0 +7116: space: 7117: word: R +7118: space: \x0a 7119: dict_close: >> +7121: space: \x0a 7122: word: stream skipping to endstream 7404: word: endstream +7413: space: \x0a 7414: word: endobj +7420: space: \x0a\x0a 7422: integer: 44 +7424: space: 7425: integer: 0 +7426: space: 7427: word: obj +7430: space: \x0a 7431: integer: 275 +7434: space: \x0a 7435: word: endobj +7441: space: \x0a\x0a +7443: comment: %% Contents for page 5 +7465: space: \x0a +7466: comment: %% Original object ID: 41 0 +7493: space: \x0a 7494: integer: 45 +7496: space: 7497: integer: 0 +7498: space: 7499: word: obj +7502: space: \x0a 7503: dict_open: << +7505: space: \x0a 7508: name: /Length +7515: space: 7516: integer: 46 +7518: space: 7519: integer: 0 +7520: space: 7521: word: R +7522: space: \x0a 7523: dict_close: >> +7525: space: \x0a 7526: word: stream skipping to endstream 7601: word: endstream +7610: space: \x0a 7611: word: endobj +7617: space: \x0a\x0a 7619: integer: 46 +7621: space: 7622: integer: 0 +7623: space: 7624: word: obj +7627: space: \x0a 7628: integer: 68 +7630: space: \x0a 7631: word: endobj +7637: space: \x0a\x0a +7639: comment: %% Contents for page 6 +7661: space: \x0a +7662: comment: %% Original object ID: 42 0 +7689: space: \x0a 7690: integer: 47 +7692: space: 7693: integer: 0 +7694: space: 7695: word: obj +7698: space: \x0a 7699: dict_open: << +7701: space: \x0a 7704: name: /Length +7711: space: 7712: integer: 48 +7714: space: 7715: integer: 0 +7716: space: 7717: word: R +7718: space: \x0a 7719: dict_close: >> +7721: space: \x0a 7722: word: stream skipping to endstream 7773: word: endstream +7782: space: \x0a 7783: word: endobj +7789: space: \x0a\x0a 7791: integer: 48 +7793: space: 7794: integer: 0 +7795: space: 7796: word: obj +7799: space: \x0a 7800: integer: 44 +7802: space: \x0a 7803: word: endobj +7809: space: \x0a\x0a +7811: comment: %% Contents for page 7 +7833: space: \x0a +7834: comment: %% Original object ID: 43 0 +7861: space: \x0a 7862: integer: 49 +7864: space: 7865: integer: 0 +7866: space: 7867: word: obj +7870: space: \x0a 7871: dict_open: << +7873: space: \x0a 7876: name: /Length +7883: space: 7884: integer: 50 +7886: space: 7887: integer: 0 +7888: space: 7889: word: R +7890: space: \x0a 7891: dict_close: >> +7893: space: \x0a 7894: word: stream skipping to endstream 7945: word: endstream +7954: space: \x0a 7955: word: endobj +7961: space: \x0a\x0a 7963: integer: 50 +7965: space: 7966: integer: 0 +7967: space: 7968: word: obj +7971: space: \x0a 7972: integer: 44 +7974: space: \x0a 7975: word: endobj +7981: space: \x0a\x0a +7983: comment: %% Contents for page 8 +8005: space: \x0a +8006: comment: %% Original object ID: 44 0 +8033: space: \x0a 8034: integer: 51 +8036: space: 8037: integer: 0 +8038: space: 8039: word: obj +8042: space: \x0a 8043: dict_open: << +8045: space: \x0a 8048: name: /Length +8055: space: 8056: integer: 52 +8058: space: 8059: integer: 0 +8060: space: 8061: word: R +8062: space: \x0a 8063: dict_close: >> +8065: space: \x0a 8066: word: stream skipping to endstream 8117: word: endstream +8126: space: \x0a 8127: word: endobj +8133: space: \x0a\x0a 8135: integer: 52 +8137: space: 8138: integer: 0 +8139: space: 8140: word: obj +8143: space: \x0a 8144: integer: 44 +8146: space: \x0a 8147: word: endobj +8153: space: \x0a\x0a +8155: comment: %% Contents for page 9 +8177: space: \x0a +8178: comment: %% Original object ID: 45 0 +8205: space: \x0a 8206: integer: 53 +8208: space: 8209: integer: 0 +8210: space: 8211: word: obj +8214: space: \x0a 8215: dict_open: << +8217: space: \x0a 8220: name: /Length +8227: space: 8228: integer: 54 +8230: space: 8231: integer: 0 +8232: space: 8233: word: R +8234: space: \x0a 8235: dict_close: >> +8237: space: \x0a 8238: word: stream skipping to endstream 8289: word: endstream +8298: space: \x0a 8299: word: endobj +8305: space: \x0a\x0a 8307: integer: 54 +8309: space: 8310: integer: 0 +8311: space: 8312: word: obj +8315: space: \x0a 8316: integer: 44 +8318: space: \x0a 8319: word: endobj +8325: space: \x0a\x0a +8327: comment: %% Contents for page 10 +8350: space: \x0a +8351: comment: %% Original object ID: 46 0 +8378: space: \x0a 8379: integer: 55 +8381: space: 8382: integer: 0 +8383: space: 8384: word: obj +8387: space: \x0a 8388: dict_open: << +8390: space: \x0a 8393: name: /Length +8400: space: 8401: integer: 56 +8403: space: 8404: integer: 0 +8405: space: 8406: word: R +8407: space: \x0a 8408: dict_close: >> +8410: space: \x0a 8411: word: stream skipping to endstream 8462: word: endstream +8471: space: \x0a 8472: word: endobj +8478: space: \x0a\x0a 8480: integer: 56 +8482: space: 8483: integer: 0 +8484: space: 8485: word: obj +8488: space: \x0a 8489: integer: 44 +8491: space: \x0a 8492: word: endobj +8498: space: \x0a\x0a +8500: comment: %% Contents for page 11 +8523: space: \x0a +8524: comment: %% Original object ID: 47 0 +8551: space: \x0a 8552: integer: 57 +8554: space: 8555: integer: 0 +8556: space: 8557: word: obj +8560: space: \x0a 8561: dict_open: << +8563: space: \x0a 8566: name: /Length +8573: space: 8574: integer: 58 +8576: space: 8577: integer: 0 +8578: space: 8579: word: R +8580: space: \x0a 8581: dict_close: >> +8583: space: \x0a 8584: word: stream skipping to endstream 8635: word: endstream +8644: space: \x0a 8645: word: endobj +8651: space: \x0a\x0a 8653: integer: 58 +8655: space: 8656: integer: 0 +8657: space: 8658: word: obj +8661: space: \x0a 8662: integer: 44 +8664: space: \x0a 8665: word: endobj +8671: space: \x0a\x0a 8673: integer: 59 +8675: space: 8676: integer: 0 +8677: space: 8678: word: obj +8681: space: \x0a 8682: dict_open: << +8684: space: \x0a 8687: name: /Type +8692: space: 8693: name: /XRef +8698: space: \x0a 8701: name: /Length +8708: space: 8709: integer: 240 +8712: space: \x0a 8715: name: /W +8717: space: 8718: array_open: [ +8719: space: 8720: integer: 1 +8721: space: 8722: integer: 2 +8723: space: 8724: integer: 1 +8725: space: 8726: array_close: ] +8727: space: \x0a 8730: name: /Root +8735: space: 8736: integer: 2 +8737: space: 8738: integer: 0 +8739: space: 8740: word: R +8741: space: \x0a 8744: name: /Size +8749: space: 8750: integer: 60 +8752: space: \x0a 8755: name: /ID +8758: space: 8759: array_open: [ 8760: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>) 8794: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: ) 8828: array_close: ] +8829: space: \x0a 8830: dict_close: >> +8832: space: \x0a 8833: word: stream skipping to endstream 9081: word: endstream +9090: space: \x0a 9091: word: endobj +9097: space: \x0a\x0a 9099: word: startxref +9108: space: \x0a 9109: integer: 8673 +9113: space: \x0a +9114: comment: %%EOF +9119: space: \x0a 9120: eof --- END FILE --- --- BEGIN PAGE 1 --- 0: word: BT +2: space: \x0a 5: name: /F1 +8: space: 9: integer: 24 +11: space: 12: word: Tf +14: space: \x0a 17: integer: 72 +19: space: 20: integer: 720 +23: space: 24: word: Td +26: space: \x0a 29: string: Potato (raw: (Potato)) +37: space: 38: word: Tj +40: space: \x0a 41: word: ET +43: space: \x0a 44: eof --- END PAGE 1 --- --- BEGIN PAGE 2 --- 0: word: BT +2: space: \x0a 5: name: /F1 +8: space: 9: integer: 24 +11: space: 12: word: Tf +14: space: \x0a 17: integer: 72 +19: space: 20: integer: 720 +23: space: 24: word: Td +26: space: \x0a 29: string: Potato (raw: (Potato)) +37: space: 38: word: Tj +40: space: \x0a 41: word: ET +43: space: \x0a 44: word: BI +46: space: \x0a 47: name: /CS +50: space: 51: name: /G 53: name: /W +55: space: 56: integer: 66 58: name: /H +60: space: 61: integer: 47 63: name: /BPC +67: space: 68: integer: 8 69: name: /F 71: name: /Fl 74: name: /DP 77: dict_open: << 79: name: /Predictor +89: space: 90: integer: 15 92: name: /Columns +100: space: 101: integer: 66 103: dict_close: >> +105: space: \x0a 106: word: ID skipping to EI 352: word: EI +354: space: \x0a 355: word: BT +357: space: \x0a 360: name: /F1 +363: space: 364: integer: 24 +366: space: 367: word: Tf +369: space: \x0a 372: integer: 72 +374: space: 375: integer: 720 +378: space: 379: word: Td +381: space: \x0a 384: string: Potato (raw: (Potato)) +392: space: 393: word: Tj +395: space: \x0a 396: word: ET +398: space: \x0a 399: eof --- END PAGE 2 --- --- BEGIN PAGE 3 --- 0: word: BT +2: space: \x0a 5: name: /F1 +8: space: 9: integer: 24 +11: space: 12: word: Tf +14: space: \x0a 17: integer: 72 +19: space: 20: integer: 720 +23: space: 24: word: Td -29: bad: Potato\x0aET\x0a (raw: (Potato\x0aET\x0a) (EOF while reading token) +26: space: \x0a +29: bad: (Potato\x0aET\x0a (EOF while reading token) 40: eof --- END PAGE 3 --- --- BEGIN PAGE 4 --- 0: word: BT +2: space: \x0a 5: name: /F1 +8: space: 9: integer: 24 +11: space: 12: word: Tf +14: space: \x0a 17: string: \xfe\xeb (raw: ) +23: space: \x0a 26: string: \xab\xcd (raw: ) +33: space: \x0a 36: string: quack (raw: (qu\\x0d\x0aack)) +46: space: \x0a 49: string: quack (raw: (qu\\x0aack)) +58: space: \x0a 61: string: quack (raw: (qu\\x0dack)) +70: space: \x0a 73: integer: 72 +75: space: 76: integer: 720 +79: space: 80: word: Td +82: space: \x0a 85: real: 3.14 +89: space: \x0a 92: real: 3. +94: space: \x0a 97: real: .14 +100: space: \x0a 103: real: +3.14 +108: space: \x0a 111: real: +3. +114: space: \x0a 117: real: +.14 +121: space: \x0a 124: real: -3.14 +129: space: \x0a 132: real: -3. +135: space: \x0a 138: real: -.14 +142: space: \x0a 145: integer: +16059 +151: space: \x0a 154: integer: -16059 +160: space: \x0a 163: word: +. -168: bad: fadeE (raw: (unexpected >) 179: word: quack +184: space: 185: bad: /name#oops (invalid name token) +195: space: 196: name: /name (raw: /n#61me) +203: space: 204: word: one +207: space: 208: bool: true +212: space: 213: word: two +216: space: 217: bool: false +222: space: 223: word: three +228: space: 229: null: null +233: space: 234: word: four +238: space: \x0a 239: word: !@#$^& 245: brace_open: { 246: brace_close: } 247: word: *-_+= +252: space: \x0a 253: word: abc123def3.14true -271: bad: ff (raw: > +360: space: \x0a +361: comment: %% Object stream: object 3, index 1; original object ID: 3 +419: space: \x0a 420: dict_open: << +422: space: \x0a 425: name: /Count +431: space: 432: integer: 11 +434: space: \x0a 437: name: /Kids +442: space: 443: array_open: [ +444: space: \x0a 449: integer: 4 +450: space: 451: integer: 0 +452: space: 453: word: R +454: space: \x0a 459: integer: 5 +460: space: 461: integer: 0 +462: space: 463: word: R +464: space: \x0a 469: integer: 6 +470: space: 471: integer: 0 +472: space: 473: word: R +474: space: \x0a 479: integer: 7 +480: space: 481: integer: 0 +482: space: 483: word: R +484: space: \x0a 489: integer: 8 +490: space: 491: integer: 0 +492: space: 493: word: R +494: space: \x0a 499: integer: 9 +500: space: 501: integer: 0 +502: space: 503: word: R +504: space: \x0a 509: integer: 10 +511: space: 512: integer: 0 +513: space: 514: word: R +515: space: \x0a 520: integer: 11 +522: space: 523: integer: 0 +524: space: 525: word: R +526: space: \x0a 531: integer: 12 +533: space: 534: integer: 0 +535: space: 536: word: R +537: space: \x0a 542: integer: 13 +544: space: 545: integer: 0 +546: space: 547: word: R +548: space: \x0a 553: integer: 14 +555: space: 556: integer: 0 +557: space: 558: word: R +559: space: \x0a 562: array_close: ] +563: space: \x0a 566: name: /Type +571: space: 572: name: /Pages +578: space: \x0a 579: dict_close: >> +581: space: \x0a +582: comment: %% Object stream: object 4, index 2; original object ID: 4 +640: space: \x0a +641: comment: %% Page 1 +650: space: \x0a 651: dict_open: << +653: space: \x0a 656: name: /Contents +665: space: 666: integer: 37 +668: space: 669: integer: 0 +670: space: 671: word: R +672: space: \x0a 675: name: /MediaBox +684: space: 685: array_open: [ +686: space: \x0a 691: integer: 0 +692: space: \x0a 697: integer: 0 +698: space: \x0a 703: integer: 612 +706: space: \x0a 711: integer: 792 +714: space: \x0a 717: array_close: ] +718: space: \x0a 721: name: /Parent +728: space: 729: integer: 3 +730: space: 731: integer: 0 +732: space: 733: word: R +734: space: \x0a 737: name: /Resources +747: space: 748: dict_open: << +750: space: \x0a 755: name: /Font +760: space: 761: dict_open: << +763: space: \x0a 770: name: /F1 +773: space: 774: integer: 15 +776: space: 777: integer: 0 +778: space: 779: word: R +780: space: \x0a 785: dict_close: >> +787: space: \x0a 792: name: /ProcSet +800: space: 801: integer: 16 +803: space: 804: integer: 0 +805: space: 806: word: R +807: space: \x0a 810: dict_close: >> +812: space: \x0a 815: name: /Type +820: space: 821: name: /Page +826: space: \x0a 827: dict_close: >> +829: space: \x0a +830: comment: %% Object stream: object 5, index 3; original object ID: 5 +888: space: \x0a +889: comment: %% Page 2 +898: space: \x0a 899: dict_open: << +901: space: \x0a 904: name: /Contents +913: space: 914: integer: 39 +916: space: 917: integer: 0 +918: space: 919: word: R +920: space: \x0a 923: name: /MediaBox +932: space: 933: array_open: [ +934: space: \x0a 939: integer: 0 +940: space: \x0a 945: integer: 0 +946: space: \x0a 951: integer: 612 +954: space: \x0a 959: integer: 792 +962: space: \x0a 965: array_close: ] +966: space: \x0a 969: name: /Parent +976: space: 977: integer: 3 +978: space: 979: integer: 0 +980: space: 981: word: R +982: space: \x0a 985: name: /Resources +995: space: 996: dict_open: << +998: space: \x0a 1003: name: /Font +1008: space: 1009: dict_open: << +1011: space: \x0a 1018: name: /F1 +1021: space: 1022: integer: 17 +1024: space: 1025: integer: 0 +1026: space: 1027: word: R +1028: space: \x0a 1033: dict_close: >> +1035: space: \x0a 1040: name: /ProcSet +1048: space: 1049: integer: 18 +1051: space: 1052: integer: 0 +1053: space: 1054: word: R +1055: space: \x0a 1058: dict_close: >> +1060: space: \x0a 1063: name: /Type +1068: space: 1069: name: /Page +1074: space: \x0a 1075: dict_close: >> +1077: space: \x0a +1078: comment: %% Object stream: object 6, index 4; original object ID: 6 +1136: space: \x0a +1137: comment: %% Page 3 +1146: space: \x0a 1147: dict_open: << +1149: space: \x0a 1152: name: /Contents +1161: space: 1162: integer: 41 +1164: space: 1165: integer: 0 +1166: space: 1167: word: R +1168: space: \x0a 1171: name: /MediaBox +1180: space: 1181: array_open: [ +1182: space: \x0a 1187: integer: 0 +1188: space: \x0a 1193: integer: 0 +1194: space: \x0a 1199: integer: 612 +1202: space: \x0a 1207: integer: 792 +1210: space: \x0a 1213: array_close: ] +1214: space: \x0a 1217: name: /Parent +1224: space: 1225: integer: 3 +1226: space: 1227: integer: 0 +1228: space: 1229: word: R +1230: space: \x0a 1233: name: /Resources +1243: space: 1244: dict_open: << +1246: space: \x0a 1251: name: /Font +1256: space: 1257: dict_open: << +1259: space: \x0a 1266: name: /F1 +1269: space: 1270: integer: 19 +1272: space: 1273: integer: 0 +1274: space: 1275: word: R +1276: space: \x0a 1281: dict_close: >> +1283: space: \x0a 1288: name: /ProcSet +1296: space: 1297: integer: 20 +1299: space: 1300: integer: 0 +1301: space: 1302: word: R +1303: space: \x0a 1306: dict_close: >> +1308: space: \x0a 1311: name: /Type +1316: space: 1317: name: /Page +1322: space: \x0a 1323: dict_close: >> +1325: space: \x0a +1326: comment: %% Object stream: object 7, index 5; original object ID: 7 +1384: space: \x0a +1385: comment: %% Page 4 +1394: space: \x0a 1395: dict_open: << +1397: space: \x0a 1400: name: /Contents +1409: space: 1410: integer: 43 +1412: space: 1413: integer: 0 +1414: space: 1415: word: R +1416: space: \x0a 1419: name: /MediaBox +1428: space: 1429: array_open: [ +1430: space: \x0a 1435: integer: 0 +1436: space: \x0a 1441: integer: 0 +1442: space: \x0a 1447: integer: 612 +1450: space: \x0a 1455: integer: 792 +1458: space: \x0a 1461: array_close: ] +1462: space: \x0a 1465: name: /Parent +1472: space: 1473: integer: 3 +1474: space: 1475: integer: 0 +1476: space: 1477: word: R +1478: space: \x0a 1481: name: /Resources +1491: space: 1492: dict_open: << +1494: space: \x0a 1499: name: /Font +1504: space: 1505: dict_open: << +1507: space: \x0a 1514: name: /F1 +1517: space: 1518: integer: 21 +1520: space: 1521: integer: 0 +1522: space: 1523: word: R +1524: space: \x0a 1529: dict_close: >> +1531: space: \x0a 1536: name: /ProcSet +1544: space: 1545: integer: 22 +1547: space: 1548: integer: 0 +1549: space: 1550: word: R +1551: space: \x0a 1554: dict_close: >> +1556: space: \x0a 1559: name: /Type +1564: space: 1565: name: /Page +1570: space: \x0a 1571: dict_close: >> +1573: space: \x0a +1574: comment: %% Object stream: object 8, index 6; original object ID: 8 +1632: space: \x0a +1633: comment: %% Page 5 +1642: space: \x0a 1643: dict_open: << +1645: space: \x0a 1648: name: /Contents +1657: space: 1658: integer: 45 +1660: space: 1661: integer: 0 +1662: space: 1663: word: R +1664: space: \x0a 1667: name: /MediaBox +1676: space: 1677: array_open: [ +1678: space: \x0a 1683: integer: 0 +1684: space: \x0a 1689: integer: 0 +1690: space: \x0a 1695: integer: 612 +1698: space: \x0a 1703: integer: 792 +1706: space: \x0a 1709: array_close: ] +1710: space: \x0a 1713: name: /Parent +1720: space: 1721: integer: 3 +1722: space: 1723: integer: 0 +1724: space: 1725: word: R +1726: space: \x0a 1729: name: /Resources +1739: space: 1740: dict_open: << +1742: space: \x0a 1747: name: /Font +1752: space: 1753: dict_open: << +1755: space: \x0a 1762: name: /F1 +1765: space: 1766: integer: 23 +1768: space: 1769: integer: 0 +1770: space: 1771: word: R +1772: space: \x0a 1777: dict_close: >> +1779: space: \x0a 1784: name: /ProcSet +1792: space: 1793: integer: 24 +1795: space: 1796: integer: 0 +1797: space: 1798: word: R +1799: space: \x0a 1802: dict_close: >> +1804: space: \x0a 1807: name: /Type +1812: space: 1813: name: /Page +1818: space: \x0a 1819: dict_close: >> +1821: space: \x0a +1822: comment: %% Object stream: object 9, index 7; original object ID: 9 +1880: space: \x0a +1881: comment: %% Page 6 +1890: space: \x0a 1891: dict_open: << +1893: space: \x0a 1896: name: /Contents +1905: space: 1906: integer: 47 +1908: space: 1909: integer: 0 +1910: space: 1911: word: R +1912: space: \x0a 1915: name: /MediaBox +1924: space: 1925: array_open: [ +1926: space: \x0a 1931: integer: 0 +1932: space: \x0a 1937: integer: 0 +1938: space: \x0a 1943: integer: 612 +1946: space: \x0a 1951: integer: 792 +1954: space: \x0a 1957: array_close: ] +1958: space: \x0a 1961: name: /Parent +1968: space: 1969: integer: 3 +1970: space: 1971: integer: 0 +1972: space: 1973: word: R +1974: space: \x0a 1977: name: /Resources +1987: space: 1988: dict_open: << +1990: space: \x0a 1995: name: /Font +2000: space: 2001: dict_open: << +2003: space: \x0a 2010: name: /F1 +2013: space: 2014: integer: 25 +2016: space: 2017: integer: 0 +2018: space: 2019: word: R +2020: space: \x0a 2025: dict_close: >> +2027: space: \x0a 2032: name: /ProcSet +2040: space: 2041: integer: 26 +2043: space: 2044: integer: 0 +2045: space: 2046: word: R +2047: space: \x0a 2050: dict_close: >> +2052: space: \x0a 2055: name: /Type +2060: space: 2061: name: /Page +2066: space: \x0a 2067: dict_close: >> +2069: space: \x0a +2070: comment: %% Object stream: object 10, index 8; original object ID: 10 +2130: space: \x0a +2131: comment: %% Page 7 +2140: space: \x0a 2141: dict_open: << +2143: space: \x0a 2146: name: /Contents +2155: space: 2156: integer: 49 +2158: space: 2159: integer: 0 +2160: space: 2161: word: R +2162: space: \x0a 2165: name: /MediaBox +2174: space: 2175: array_open: [ +2176: space: \x0a 2181: integer: 0 +2182: space: \x0a 2187: integer: 0 +2188: space: \x0a 2193: integer: 612 +2196: space: \x0a 2201: integer: 792 +2204: space: \x0a 2207: array_close: ] +2208: space: \x0a 2211: name: /Parent +2218: space: 2219: integer: 3 +2220: space: 2221: integer: 0 +2222: space: 2223: word: R +2224: space: \x0a 2227: name: /Resources +2237: space: 2238: dict_open: << +2240: space: \x0a 2245: name: /Font +2250: space: 2251: dict_open: << +2253: space: \x0a 2260: name: /F1 +2263: space: 2264: integer: 27 +2266: space: 2267: integer: 0 +2268: space: 2269: word: R +2270: space: \x0a 2275: dict_close: >> +2277: space: \x0a 2282: name: /ProcSet +2290: space: 2291: integer: 28 +2293: space: 2294: integer: 0 +2295: space: 2296: word: R +2297: space: \x0a 2300: dict_close: >> +2302: space: \x0a 2305: name: /Type +2310: space: 2311: name: /Page +2316: space: \x0a 2317: dict_close: >> +2319: space: \x0a +2320: comment: %% Object stream: object 11, index 9; original object ID: 11 +2380: space: \x0a +2381: comment: %% Page 8 +2390: space: \x0a 2391: dict_open: << +2393: space: \x0a 2396: name: /Contents +2405: space: 2406: integer: 51 +2408: space: 2409: integer: 0 +2410: space: 2411: word: R +2412: space: \x0a 2415: name: /MediaBox +2424: space: 2425: array_open: [ +2426: space: \x0a 2431: integer: 0 +2432: space: \x0a 2437: integer: 0 +2438: space: \x0a 2443: integer: 612 +2446: space: \x0a 2451: integer: 792 +2454: space: \x0a 2457: array_close: ] +2458: space: \x0a 2461: name: /Parent +2468: space: 2469: integer: 3 +2470: space: 2471: integer: 0 +2472: space: 2473: word: R +2474: space: \x0a 2477: name: /Resources +2487: space: 2488: dict_open: << +2490: space: \x0a 2495: name: /Font +2500: space: 2501: dict_open: << +2503: space: \x0a 2510: name: /F1 +2513: space: 2514: integer: 29 +2516: space: 2517: integer: 0 +2518: space: 2519: word: R +2520: space: \x0a 2525: dict_close: >> +2527: space: \x0a 2532: name: /ProcSet +2540: space: 2541: integer: 30 +2543: space: 2544: integer: 0 +2545: space: 2546: word: R +2547: space: \x0a 2550: dict_close: >> +2552: space: \x0a 2555: name: /Type +2560: space: 2561: name: /Page +2566: space: \x0a 2567: dict_close: >> +2569: space: \x0a +2570: comment: %% Object stream: object 12, index 10; original object ID: 12 +2631: space: \x0a +2632: comment: %% Page 9 +2641: space: \x0a 2642: dict_open: << +2644: space: \x0a 2647: name: /Contents +2656: space: 2657: integer: 53 +2659: space: 2660: integer: 0 +2661: space: 2662: word: R +2663: space: \x0a 2666: name: /MediaBox +2675: space: 2676: array_open: [ +2677: space: \x0a 2682: integer: 0 +2683: space: \x0a 2688: integer: 0 +2689: space: \x0a 2694: integer: 612 +2697: space: \x0a 2702: integer: 792 +2705: space: \x0a 2708: array_close: ] +2709: space: \x0a 2712: name: /Parent +2719: space: 2720: integer: 3 +2721: space: 2722: integer: 0 +2723: space: 2724: word: R +2725: space: \x0a 2728: name: /Resources +2738: space: 2739: dict_open: << +2741: space: \x0a 2746: name: /Font +2751: space: 2752: dict_open: << +2754: space: \x0a 2761: name: /F1 +2764: space: 2765: integer: 31 +2767: space: 2768: integer: 0 +2769: space: 2770: word: R +2771: space: \x0a 2776: dict_close: >> +2778: space: \x0a 2783: name: /ProcSet +2791: space: 2792: integer: 32 +2794: space: 2795: integer: 0 +2796: space: 2797: word: R +2798: space: \x0a 2801: dict_close: >> +2803: space: \x0a 2806: name: /Type +2811: space: 2812: name: /Page +2817: space: \x0a 2818: dict_close: >> +2820: space: \x0a +2821: comment: %% Object stream: object 13, index 11; original object ID: 13 +2882: space: \x0a +2883: comment: %% Page 10 +2893: space: \x0a 2894: dict_open: << +2896: space: \x0a 2899: name: /Contents +2908: space: 2909: integer: 55 +2911: space: 2912: integer: 0 +2913: space: 2914: word: R +2915: space: \x0a 2918: name: /MediaBox +2927: space: 2928: array_open: [ +2929: space: \x0a 2934: integer: 0 +2935: space: \x0a 2940: integer: 0 +2941: space: \x0a 2946: integer: 612 +2949: space: \x0a 2954: integer: 792 +2957: space: \x0a 2960: array_close: ] +2961: space: \x0a 2964: name: /Parent +2971: space: 2972: integer: 3 +2973: space: 2974: integer: 0 +2975: space: 2976: word: R +2977: space: \x0a 2980: name: /Resources +2990: space: 2991: dict_open: << +2993: space: \x0a 2998: name: /Font +3003: space: 3004: dict_open: << +3006: space: \x0a 3013: name: /F1 +3016: space: 3017: integer: 33 +3019: space: 3020: integer: 0 +3021: space: 3022: word: R +3023: space: \x0a 3028: dict_close: >> +3030: space: \x0a 3035: name: /ProcSet +3043: space: 3044: integer: 34 +3046: space: 3047: integer: 0 +3048: space: 3049: word: R +3050: space: \x0a 3053: dict_close: >> +3055: space: \x0a 3058: name: /Type +3063: space: 3064: name: /Page +3069: space: \x0a 3070: dict_close: >> +3072: space: \x0a +3073: comment: %% Object stream: object 14, index 12; original object ID: 14 +3134: space: \x0a +3135: comment: %% Page 11 +3145: space: \x0a 3146: dict_open: << +3148: space: \x0a 3151: name: /Contents +3160: space: 3161: integer: 57 +3163: space: 3164: integer: 0 +3165: space: 3166: word: R +3167: space: \x0a 3170: name: /MediaBox +3179: space: 3180: array_open: [ +3181: space: \x0a 3186: integer: 0 +3187: space: \x0a 3192: integer: 0 +3193: space: \x0a 3198: integer: 612 +3201: space: \x0a 3206: integer: 792 +3209: space: \x0a 3212: array_close: ] +3213: space: \x0a 3216: name: /Parent +3223: space: 3224: integer: 3 +3225: space: 3226: integer: 0 +3227: space: 3228: word: R +3229: space: \x0a 3232: name: /Resources +3242: space: 3243: dict_open: << +3245: space: \x0a 3250: name: /Font +3255: space: 3256: dict_open: << +3258: space: \x0a 3265: name: /F1 +3268: space: 3269: integer: 35 +3271: space: 3272: integer: 0 +3273: space: 3274: word: R +3275: space: \x0a 3280: dict_close: >> +3282: space: \x0a 3287: name: /ProcSet +3295: space: 3296: integer: 36 +3298: space: 3299: integer: 0 +3300: space: 3301: word: R +3302: space: \x0a 3305: dict_close: >> +3307: space: \x0a 3310: name: /Type +3315: space: 3316: name: /Page +3321: space: \x0a 3322: dict_close: >> +3324: space: \x0a +3325: comment: %% Object stream: object 15, index 13; original object ID: 15 +3386: space: \x0a 3387: dict_open: << +3389: space: \x0a 3392: name: /BaseFont +3401: space: 3402: name: /Helvetica +3412: space: \x0a 3415: name: /Encoding +3424: space: 3425: name: /WinAnsiEncoding +3441: space: \x0a 3444: name: /Name +3449: space: 3450: name: /F1 +3453: space: \x0a 3456: name: /Subtype +3464: space: 3465: name: /Type1 +3471: space: \x0a 3474: name: /Type +3479: space: 3480: name: /Font +3485: space: \x0a 3486: dict_close: >> +3488: space: \x0a +3489: comment: %% Object stream: object 16, index 14; original object ID: 16 +3550: space: \x0a 3551: array_open: [ +3552: space: \x0a 3555: name: /PDF +3559: space: \x0a 3562: name: /Text +3567: space: \x0a 3568: array_close: ] +3569: space: \x0a +3570: comment: %% Object stream: object 17, index 15; original object ID: 17 +3631: space: \x0a 3632: dict_open: << +3634: space: \x0a 3637: name: /BaseFont +3646: space: 3647: name: /Helvetica +3657: space: \x0a 3660: name: /Encoding +3669: space: 3670: name: /WinAnsiEncoding +3686: space: \x0a 3689: name: /Name +3694: space: 3695: name: /F1 +3698: space: \x0a 3701: name: /Subtype +3709: space: 3710: name: /Type1 +3716: space: \x0a 3719: name: /Type +3724: space: 3725: name: /Font +3730: space: \x0a 3731: dict_close: >> +3733: space: \x0a +3734: comment: %% Object stream: object 18, index 16; original object ID: 18 +3795: space: \x0a 3796: array_open: [ +3797: space: \x0a 3800: name: /PDF +3804: space: \x0a 3807: name: /Text +3812: space: \x0a 3813: array_close: ] +3814: space: \x0a +3815: comment: %% Object stream: object 19, index 17; original object ID: 19 +3876: space: \x0a 3877: dict_open: << +3879: space: \x0a 3882: name: /BaseFont +3891: space: 3892: name: /Helvetica +3902: space: \x0a 3905: name: /Encoding +3914: space: 3915: name: /WinAnsiEncoding +3931: space: \x0a 3934: name: /Name +3939: space: 3940: name: /F1 +3943: space: \x0a 3946: name: /Subtype +3954: space: 3955: name: /Type1 +3961: space: \x0a 3964: name: /Type +3969: space: 3970: name: /Font +3975: space: \x0a 3976: dict_close: >> +3978: space: \x0a +3979: comment: %% Object stream: object 20, index 18; original object ID: 20 +4040: space: \x0a 4041: array_open: [ +4042: space: \x0a 4045: name: /PDF +4049: space: \x0a 4052: name: /Text +4057: space: \x0a 4058: array_close: ] +4059: space: \x0a +4060: comment: %% Object stream: object 21, index 19; original object ID: 21 +4121: space: \x0a 4122: dict_open: << +4124: space: \x0a 4127: name: /BaseFont +4136: space: 4137: name: /Helvetica +4147: space: \x0a 4150: name: /Encoding +4159: space: 4160: name: /WinAnsiEncoding +4176: space: \x0a 4179: name: /Name +4184: space: 4185: name: /F1 +4188: space: \x0a 4191: name: /Subtype +4199: space: 4200: name: /Type1 +4206: space: \x0a 4209: name: /Type +4214: space: 4215: name: /Font +4220: space: \x0a 4221: dict_close: >> +4223: space: \x0a +4224: comment: %% Object stream: object 22, index 20; original object ID: 22 +4285: space: \x0a 4286: array_open: [ +4287: space: \x0a 4290: name: /PDF +4294: space: \x0a 4297: name: /Text +4302: space: \x0a 4303: array_close: ] +4304: space: \x0a +4305: comment: %% Object stream: object 23, index 21; original object ID: 23 +4366: space: \x0a 4367: dict_open: << +4369: space: \x0a 4372: name: /BaseFont +4381: space: 4382: name: /Helvetica +4392: space: \x0a 4395: name: /Encoding +4404: space: 4405: name: /WinAnsiEncoding +4421: space: \x0a 4424: name: /Name +4429: space: 4430: name: /F1 +4433: space: \x0a 4436: name: /Subtype +4444: space: 4445: name: /Type1 +4451: space: \x0a 4454: name: /Type +4459: space: 4460: name: /Font +4465: space: \x0a 4466: dict_close: >> +4468: space: \x0a +4469: comment: %% Object stream: object 24, index 22; original object ID: 24 +4530: space: \x0a 4531: array_open: [ +4532: space: \x0a 4535: name: /PDF +4539: space: \x0a 4542: name: /Text +4547: space: \x0a 4548: array_close: ] +4549: space: \x0a +4550: comment: %% Object stream: object 25, index 23; original object ID: 25 +4611: space: \x0a 4612: dict_open: << +4614: space: \x0a 4617: name: /BaseFont +4626: space: 4627: name: /Helvetica +4637: space: \x0a 4640: name: /Encoding +4649: space: 4650: name: /WinAnsiEncoding +4666: space: \x0a 4669: name: /Name +4674: space: 4675: name: /F1 +4678: space: \x0a 4681: name: /Subtype +4689: space: 4690: name: /Type1 +4696: space: \x0a 4699: name: /Type +4704: space: 4705: name: /Font +4710: space: \x0a 4711: dict_close: >> +4713: space: \x0a +4714: comment: %% Object stream: object 26, index 24; original object ID: 26 +4775: space: \x0a 4776: array_open: [ +4777: space: \x0a 4780: name: /PDF +4784: space: \x0a 4787: name: /Text +4792: space: \x0a 4793: array_close: ] +4794: space: \x0a +4795: comment: %% Object stream: object 27, index 25; original object ID: 27 +4856: space: \x0a 4857: dict_open: << +4859: space: \x0a 4862: name: /BaseFont +4871: space: 4872: name: /Helvetica +4882: space: \x0a 4885: name: /Encoding +4894: space: 4895: name: /WinAnsiEncoding +4911: space: \x0a 4914: name: /Name +4919: space: 4920: name: /F1 +4923: space: \x0a 4926: name: /Subtype +4934: space: 4935: name: /Type1 +4941: space: \x0a 4944: name: /Type +4949: space: 4950: name: /Font +4955: space: \x0a 4956: dict_close: >> +4958: space: \x0a +4959: comment: %% Object stream: object 28, index 26; original object ID: 28 +5020: space: \x0a 5021: array_open: [ +5022: space: \x0a 5025: name: /PDF +5029: space: \x0a 5032: name: /Text +5037: space: \x0a 5038: array_close: ] +5039: space: \x0a +5040: comment: %% Object stream: object 29, index 27; original object ID: 29 +5101: space: \x0a 5102: dict_open: << +5104: space: \x0a 5107: name: /BaseFont +5116: space: 5117: name: /Helvetica +5127: space: \x0a 5130: name: /Encoding +5139: space: 5140: name: /WinAnsiEncoding +5156: space: \x0a 5159: name: /Name +5164: space: 5165: name: /F1 +5168: space: \x0a 5171: name: /Subtype +5179: space: 5180: name: /Type1 +5186: space: \x0a 5189: name: /Type +5194: space: 5195: name: /Font +5200: space: \x0a 5201: dict_close: >> +5203: space: \x0a +5204: comment: %% Object stream: object 30, index 28; original object ID: 30 +5265: space: \x0a 5266: array_open: [ +5267: space: \x0a 5270: name: /PDF +5274: space: \x0a 5277: name: /Text +5282: space: \x0a 5283: array_close: ] +5284: space: \x0a +5285: comment: %% Object stream: object 31, index 29; original object ID: 31 +5346: space: \x0a 5347: dict_open: << +5349: space: \x0a 5352: name: /BaseFont +5361: space: 5362: name: /Helvetica +5372: space: \x0a 5375: name: /Encoding +5384: space: 5385: name: /WinAnsiEncoding +5401: space: \x0a 5404: name: /Name +5409: space: 5410: name: /F1 +5413: space: \x0a 5416: name: /Subtype +5424: space: 5425: name: /Type1 +5431: space: \x0a 5434: name: /Type +5439: space: 5440: name: /Font +5445: space: \x0a 5446: dict_close: >> +5448: space: \x0a +5449: comment: %% Object stream: object 32, index 30; original object ID: 32 +5510: space: \x0a 5511: array_open: [ +5512: space: \x0a 5515: name: /PDF +5519: space: \x0a 5522: name: /Text +5527: space: \x0a 5528: array_close: ] +5529: space: \x0a +5530: comment: %% Object stream: object 33, index 31; original object ID: 33 +5591: space: \x0a 5592: dict_open: << +5594: space: \x0a 5597: name: /BaseFont +5606: space: 5607: name: /Helvetica +5617: space: \x0a 5620: name: /Encoding +5629: space: 5630: name: /WinAnsiEncoding +5646: space: \x0a 5649: name: /Name +5654: space: 5655: name: /F1 +5658: space: \x0a 5661: name: /Subtype +5669: space: 5670: name: /Type1 +5676: space: \x0a 5679: name: /Type +5684: space: 5685: name: /Font +5690: space: \x0a 5691: dict_close: >> +5693: space: \x0a +5694: comment: %% Object stream: object 34, index 32; original object ID: 34 +5755: space: \x0a 5756: array_open: [ +5757: space: \x0a 5760: name: /PDF +5764: space: \x0a 5767: name: /Text +5772: space: \x0a 5773: array_close: ] +5774: space: \x0a +5775: comment: %% Object stream: object 35, index 33; original object ID: 35 +5836: space: \x0a 5837: dict_open: << +5839: space: \x0a 5842: name: /BaseFont +5851: space: 5852: name: /Helvetica +5862: space: \x0a 5865: name: /Encoding +5874: space: 5875: name: /WinAnsiEncoding +5891: space: \x0a 5894: name: /Name +5899: space: 5900: name: /F1 +5903: space: \x0a 5906: name: /Subtype +5914: space: 5915: name: /Type1 +5921: space: \x0a 5924: name: /Type +5929: space: 5930: name: /Font +5935: space: \x0a 5936: dict_close: >> +5938: space: \x0a +5939: comment: %% Object stream: object 36, index 34; original object ID: 36 +6000: space: \x0a 6001: array_open: [ +6002: space: \x0a 6005: name: /PDF +6009: space: \x0a 6012: name: /Text +6017: space: \x0a 6018: array_close: ] +6019: space: \x0a 6020: eof --- END OBJECT STREAM 1 --- diff --git a/qpdf/test_tokenizer.cc b/qpdf/test_tokenizer.cc index de079195..6e694bfb 100644 --- a/qpdf/test_tokenizer.cc +++ b/qpdf/test_tokenizer.cc @@ -13,7 +13,8 @@ static char const* whoami = 0; void usage() { - std::cerr << "Usage: " << whoami << " filename" + std::cerr << "Usage: " << whoami + << " [-maxlen len | -no-ignorable] filename" << std::endl; exit(2); } @@ -83,6 +84,10 @@ static char const* tokenTypeName(QPDFTokenizer::token_type_e ttype) return "word"; case QPDFTokenizer::tt_eof: return "eof"; + case QPDFTokenizer::tt_space: + return "space"; + case QPDFTokenizer::tt_comment: + return "comment"; } return 0; } @@ -108,7 +113,8 @@ sanitize(std::string const& value) } static void -try_skipping(PointerHolder is, char const* what, Finder& f) +try_skipping(QPDFTokenizer& tokenizer, PointerHolder is, + size_t max_len, char const* what, Finder& f) { std::cout << "skipping to " << what << std::endl; qpdf_offset_t offset = is->tell(); @@ -121,6 +127,7 @@ try_skipping(PointerHolder is, char const* what, Finder& f) static void dump_tokens(PointerHolder is, std::string const& label, + size_t max_len, bool include_ignorable, bool skip_streams, bool skip_inline_images) { Finder f1(is, "endstream"); @@ -129,11 +136,16 @@ dump_tokens(PointerHolder is, std::string const& label, bool done = false; QPDFTokenizer tokenizer; tokenizer.allowEOF(); + if (include_ignorable) + { + tokenizer.includeIgnorable(); + } while (! done) { - QPDFTokenizer::Token token = tokenizer.readToken(is, "test", true); + QPDFTokenizer::Token token = + tokenizer.readToken(is, "test", true, max_len); - qpdf_offset_t offset = is->tell() - token.getRawValue().length(); + qpdf_offset_t offset = is->getLastOffset(); std::cout << offset << ": " << tokenTypeName(token.getType()); if (token.getType() != QPDFTokenizer::tt_eof) @@ -153,12 +165,12 @@ dump_tokens(PointerHolder is, std::string const& label, if (skip_streams && (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "stream"))) { - try_skipping(is, "endstream", f1); + try_skipping(tokenizer, is, max_len, "endstream", f1); } else if (skip_inline_images && (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "ID"))) { - try_skipping(is, "EI", f2); + try_skipping(tokenizer, is, max_len, "EI", f2); } else if (token.getType() == QPDFTokenizer::tt_eof) { @@ -168,17 +180,16 @@ dump_tokens(PointerHolder is, std::string const& label, std::cout << "--- END " << label << " ---" << std::endl; } -static void process(char const* filename) +static void process(char const* filename, bool include_ignorable, + size_t max_len) { PointerHolder is; - QPDFTokenizer tokenizer; - tokenizer.allowEOF(); // Tokenize file, skipping streams FileInputSource* fis = new FileInputSource(); fis->setFilename(filename); is = fis; - dump_tokens(is, "FILE", true, false); + dump_tokens(is, "FILE", max_len, include_ignorable, true, false); // Tokenize content streams, skipping inline images QPDF qpdf; @@ -201,7 +212,8 @@ static void process(char const* filename) BufferInputSource* bis = new BufferInputSource( "content data", content_data.getPointer()); is = bis; - dump_tokens(is, "PAGE " + QUtil::int_to_string(pageno), false, true); + dump_tokens(is, "PAGE " + QUtil::int_to_string(pageno), + max_len, include_ignorable, false, true); } // Tokenize object streams @@ -220,7 +232,7 @@ static void process(char const* filename) is = bis; dump_tokens(is, "OBJECT STREAM " + QUtil::int_to_string((*iter).getObjectID()), - false, false); + max_len, include_ignorable, false, false); } } } @@ -242,15 +254,47 @@ int main(int argc, char* argv[]) whoami += 3; } - if (argc != 2) + char const* filename = 0; + size_t max_len = 0; + bool include_ignorable = true; + for (int i = 1; i < argc; ++i) + { + if (argv[i][0] == '-') + { + if (strcmp(argv[i], "-maxlen") == 0) + { + if (++i >= argc) + { + usage(); + } + max_len = QUtil::string_to_int(argv[i]); + } + else if (strcmp(argv[i], "-no-ignorable") == 0) + { + include_ignorable = false; + } + else + { + usage(); + } + } + else if (filename) + { + usage(); + } + else + { + filename = argv[i]; + } + } + if (filename == 0) { usage(); } - char const* filename = argv[1]; try { - process(filename); + process(filename, include_ignorable, max_len); } catch (std::exception& e) {