aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog32
-rw-r--r--include/qpdf/QPDFTokenizer.hh14
-rw-r--r--libqpdf/FileInputSource.cc22
-rw-r--r--libqpdf/QPDFTokenizer.cc114
-rw-r--r--qpdf/qpdf.testcov3
-rw-r--r--qpdf/qtest/qpdf.test12
-rw-r--r--qpdf/qtest/qpdf/bad16-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad16.out2
-rw-r--r--qpdf/qtest/qpdf/good14.out8
-rw-r--r--qpdf/qtest/qpdf/good14.pdf22
-rw-r--r--qpdf/qtest/qpdf/good14.qdf67
-rw-r--r--qpdf/qtest/qpdf/issue-100.out2
-rw-r--r--qpdf/qtest/qpdf/issue-101.out4
-rw-r--r--qpdf/qtest/qpdf/issue-146.out2
-rw-r--r--qpdf/qtest/qpdf/issue-51.out2
-rw-r--r--qpdf/qtest/qpdf/issue-99.out2
-rw-r--r--qpdf/qtest/qpdf/issue-99b.out2
-rw-r--r--qpdf/qtest/qpdf/linearization-bounds-1.out2
-rw-r--r--qpdf/qtest/qpdf/tokens-maxlen.out2476
-rw-r--r--qpdf/qtest/qpdf/tokens-no-ignorable.out1120
-rw-r--r--qpdf/qtest/qpdf/tokens.out1187
-rw-r--r--qpdf/test_tokenizer.cc74
22 files changed, 5084 insertions, 89 deletions
diff --git a/ChangeLog b/ChangeLog
index 9b55d807..e95e2370 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,37 @@
2018-02-04 Jay Berkenbilt <ejb@ql.org>
+ * 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 <ejb@ql.org>
+
* Add QPDFWriter::setLinearizationPass1Filename method and
--linearize-pass1 command line option to allow specification of a
file into which QPDFWriter will write its intermediate
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();
}
@@ -33,6 +34,18 @@ QPDFTokenizer::allowEOF()
}
void
+QPDFTokenizer::includeIgnorable()
+{
+ this->include_ignorable = true;
+}
+
+bool
+QPDFTokenizer::isSpace(char ch)
+{
+ return ((ch == '\0') || QUtil::is_space(ch));
+}
+
+void
QPDFTokenizer::reset()
{
state = st_top;
@@ -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<InputSource> 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<InputSource> input,
}
else
{
- if (QUtil::is_space(static_cast<unsigned char>(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<InputSource> 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: <edd60fe8ee87f88731a86f819fe65199>)
+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: <feeb>)
+23: space: \x0a
+26: string: \xab\xcd (raw: <ab\x0aCD>)
+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: <fade\x0aET (invalid character (T) in hexstring)
+176: space: \x0a
+177: bad: ) (unexpected ))
+178: 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: <ff\x0a (EOF while reading token)
+275: eof
+--- END PAGE 4 ---
+--- BEGIN PAGE 5 ---
+0: word: BT
+2: space: \x0a
+5: bad: /F#00x (null character not allowed in name token)
+11: space:
+12: integer: 24
+14: space:
+15: word: Tf
+17: space: \x0a
+20: integer: 72
+22: space:
+23: integer: 720
+26: space:
+27: word: Td
+29: space: \x0a
+32: string: P\x00tat\x00 (raw: (P\x00tat\000))
+43: space:
+44: word: Tj
+46: space: \x0a
+47: word: ET
+49: space: \x0a\x00\x0a
+52: name: /ThisMustBeLast
+67: space: \x0a
+68: eof
+--- END PAGE 5 ---
+--- BEGIN PAGE 6 ---
+0: word: ID
+skipping to EI
+EI not found
+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 6 ---
+--- BEGIN PAGE 7 ---
+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 7 ---
+--- BEGIN PAGE 8 ---
+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 8 ---
+--- BEGIN PAGE 9 ---
+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 9 ---
+--- BEGIN PAGE 10 ---
+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 10 ---
+--- BEGIN PAGE 11 ---
+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 11 ---
+--- BEGIN OBJECT STREAM 1 ---
+0: integer: 2
+1: space:
+2: integer: 0
+3: space: \x0a
+4: integer: 3
+5: space:
+6: integer: 97
+8: space: \x0a
+9: integer: 4
+10: space:
+11: integer: 318
+14: space: \x0a
+15: integer: 5
+16: space:
+17: integer: 566
+20: space: \x0a
+21: integer: 6
+22: space:
+23: integer: 814
+26: space: \x0a
+27: integer: 7
+28: space:
+29: integer: 1062
+33: space: \x0a
+34: integer: 8
+35: space:
+36: integer: 1310
+40: space: \x0a
+41: integer: 9
+42: space:
+43: integer: 1558
+47: space: \x0a
+48: integer: 10
+50: space:
+51: integer: 1808
+55: space: \x0a
+56: integer: 11
+58: space:
+59: integer: 2058
+63: space: \x0a
+64: integer: 12
+66: space:
+67: integer: 2309
+71: space: \x0a
+72: integer: 13
+74: space:
+75: integer: 2560
+79: space: \x0a
+80: integer: 14
+82: space:
+83: integer: 2812
+87: space: \x0a
+88: integer: 15
+90: space:
+91: integer: 3064
+95: space: \x0a
+96: integer: 16
+98: space:
+99: integer: 3228
+103: space: \x0a
+104: integer: 17
+106: space:
+107: integer: 3309
+111: space: \x0a
+112: integer: 18
+114: space:
+115: integer: 3473
+119: space: \x0a
+120: integer: 19
+122: space:
+123: integer: 3554
+127: space: \x0a
+128: integer: 20
+130: space:
+131: integer: 3718
+135: space: \x0a
+136: integer: 21
+138: space:
+139: integer: 3799
+143: space: \x0a
+144: integer: 22
+146: space:
+147: integer: 3963
+151: space: \x0a
+152: integer: 23
+154: space:
+155: integer: 4044
+159: space: \x0a
+160: integer: 24
+162: space:
+163: integer: 4208
+167: space: \x0a
+168: integer: 25
+170: space:
+171: integer: 4289
+175: space: \x0a
+176: integer: 26
+178: space:
+179: integer: 4453
+183: space: \x0a
+184: integer: 27
+186: space:
+187: integer: 4534
+191: space: \x0a
+192: integer: 28
+194: space:
+195: integer: 4698
+199: space: \x0a
+200: integer: 29
+202: space:
+203: integer: 4779
+207: space: \x0a
+208: integer: 30
+210: space:
+211: integer: 4943
+215: space: \x0a
+216: integer: 31
+218: space:
+219: integer: 5024
+223: space: \x0a
+224: integer: 32
+226: space:
+227: integer: 5188
+231: space: \x0a
+232: integer: 33
+234: space:
+235: integer: 5269
+239: space: \x0a
+240: integer: 34
+242: space:
+243: integer: 5433
+247: space: \x0a
+248: integer: 35
+250: space:
+251: integer: 5514
+255: space: \x0a
+256: integer: 36
+258: space:
+259: integer: 5678
+263: space: \x0a
+264: bad: %% Object stream: object 2, index 0; original obje (exceeded allowable length while reading token)
+314: word: ct
+316: space:
+317: word: ID:
+320: space:
+321: integer: 2
+322: space: \x0a
+323: dict_open: <<
+325: space: \x0a
+328: name: /Pages
+334: space:
+335: integer: 3
+336: space:
+337: integer: 0
+338: space:
+339: word: R
+340: space: \x0a
+343: name: /Type
+348: space:
+349: name: /Catalog
+357: space: \x0a
+358: dict_close: >>
+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: <edd60fe8ee87f88731a86f819fe65199>)
+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: <feeb>)
+26: string: \xab\xcd (raw: <ab\x0aCD>)
+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: <fade\x0aET (invalid character (T) in hexstring)
+177: bad: ) (unexpected ))
+178: 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: <ff\x0a (EOF while reading token)
+275: eof
+--- END PAGE 4 ---
+--- BEGIN PAGE 5 ---
+0: word: BT
+5: bad: /F#00x (null character not allowed in name token)
+12: integer: 24
+15: word: Tf
+20: integer: 72
+23: integer: 720
+27: word: Td
+32: string: P\x00tat\x00 (raw: (P\x00tat\000))
+44: word: Tj
+47: word: ET
+52: name: /ThisMustBeLast
+68: eof
+--- END PAGE 5 ---
+--- BEGIN PAGE 6 ---
+0: word: ID
+skipping to EI
+EI not found
+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 6 ---
+--- BEGIN PAGE 7 ---
+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 7 ---
+--- BEGIN PAGE 8 ---
+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 8 ---
+--- BEGIN PAGE 9 ---
+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 9 ---
+--- BEGIN PAGE 10 ---
+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 10 ---
+--- BEGIN PAGE 11 ---
+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 11 ---
+--- BEGIN OBJECT STREAM 1 ---
+0: integer: 2
+2: integer: 0
+4: integer: 3
+6: integer: 97
+9: integer: 4
+11: integer: 318
+15: integer: 5
+17: integer: 566
+21: integer: 6
+23: integer: 814
+27: integer: 7
+29: integer: 1062
+34: integer: 8
+36: integer: 1310
+41: integer: 9
+43: integer: 1558
+48: integer: 10
+51: integer: 1808
+56: integer: 11
+59: integer: 2058
+64: integer: 12
+67: integer: 2309
+72: integer: 13
+75: integer: 2560
+80: integer: 14
+83: integer: 2812
+88: integer: 15
+91: integer: 3064
+96: integer: 16
+99: integer: 3228
+104: integer: 17
+107: integer: 3309
+112: integer: 18
+115: integer: 3473
+120: integer: 19
+123: integer: 3554
+128: integer: 20
+131: integer: 3718
+136: integer: 21
+139: integer: 3799
+144: integer: 22
+147: integer: 3963
+152: integer: 23
+155: integer: 4044
+160: integer: 24
+163: integer: 4208
+168: integer: 25
+171: integer: 4289
+176: integer: 26
+179: integer: 4453
+184: integer: 27
+187: integer: 4534
+192: integer: 28
+195: integer: 4698
+200: integer: 29
+203: integer: 4779
+208: integer: 30
+211: integer: 4943
+216: integer: 31
+219: integer: 5024
+224: integer: 32
+227: integer: 5188
+232: integer: 33
+235: integer: 5269
+240: integer: 34
+243: integer: 5433
+248: integer: 35
+251: integer: 5514
+256: integer: 36
+259: integer: 5678
+323: dict_open: <<
+328: name: /Pages
+335: integer: 3
+337: integer: 0
+339: word: R
+343: name: /Type
+349: name: /Catalog
+358: dict_close: >>
+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: <edd60fe8ee87f88731a86f819fe65199>)
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: <feeb>)
+23: space: \x0a
26: string: \xab\xcd (raw: <ab\x0aCD>)
+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: <fade\x0aET) (invalid character (T) in hexstring)
+165: space: \x0a
+168: bad: <fade\x0aET (invalid character (T) in hexstring)
+176: space: \x0a
177: bad: ) (unexpected ))
178: 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
-271: bad: ff (raw: <ff\x0a) (EOF while reading token)
+270: space: \x0a
+271: bad: <ff\x0a (EOF while reading token)
275: eof
--- END PAGE 4 ---
--- BEGIN PAGE 5 ---
0: word: BT
+2: space: \x0a
5: bad: /F#00x (null character not allowed in name token)
+11: space:
12: integer: 24
+14: space:
15: word: Tf
+17: space: \x0a
20: integer: 72
+22: space:
23: integer: 720
+26: space:
27: word: Td
+29: space: \x0a
32: string: P\x00tat\x00 (raw: (P\x00tat\000))
+43: space:
44: word: Tj
+46: space: \x0a
47: word: ET
+49: space: \x0a\x00\x0a
52: name: /ThisMustBeLast
+67: space: \x0a
68: eof
--- END PAGE 5 ---
--- BEGIN PAGE 6 ---
0: word: ID
skipping to EI
EI not found
+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 6 ---
--- BEGIN PAGE 7 ---
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 7 ---
--- BEGIN PAGE 8 ---
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 8 ---
--- BEGIN PAGE 9 ---
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 9 ---
--- BEGIN PAGE 10 ---
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 10 ---
--- BEGIN PAGE 11 ---
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 11 ---
--- BEGIN OBJECT STREAM 1 ---
0: integer: 2
+1: space:
2: integer: 0
+3: space: \x0a
4: integer: 3
+5: space:
6: integer: 97
+8: space: \x0a
9: integer: 4
+10: space:
11: integer: 318
+14: space: \x0a
15: integer: 5
+16: space:
17: integer: 566
+20: space: \x0a
21: integer: 6
+22: space:
23: integer: 814
+26: space: \x0a
27: integer: 7
+28: space:
29: integer: 1062
+33: space: \x0a
34: integer: 8
+35: space:
36: integer: 1310
+40: space: \x0a
41: integer: 9
+42: space:
43: integer: 1558
+47: space: \x0a
48: integer: 10
+50: space:
51: integer: 1808
+55: space: \x0a
56: integer: 11
+58: space:
59: integer: 2058
+63: space: \x0a
64: integer: 12
+66: space:
67: integer: 2309
+71: space: \x0a
72: integer: 13
+74: space:
75: integer: 2560
+79: space: \x0a
80: integer: 14
+82: space:
83: integer: 2812
+87: space: \x0a
88: integer: 15
+90: space:
91: integer: 3064
+95: space: \x0a
96: integer: 16
+98: space:
99: integer: 3228
+103: space: \x0a
104: integer: 17
+106: space:
107: integer: 3309
+111: space: \x0a
112: integer: 18
+114: space:
115: integer: 3473
+119: space: \x0a
120: integer: 19
+122: space:
123: integer: 3554
+127: space: \x0a
128: integer: 20
+130: space:
131: integer: 3718
+135: space: \x0a
136: integer: 21
+138: space:
139: integer: 3799
+143: space: \x0a
144: integer: 22
+146: space:
147: integer: 3963
+151: space: \x0a
152: integer: 23
+154: space:
155: integer: 4044
+159: space: \x0a
160: integer: 24
+162: space:
163: integer: 4208
+167: space: \x0a
168: integer: 25
+170: space:
171: integer: 4289
+175: space: \x0a
176: integer: 26
+178: space:
179: integer: 4453
+183: space: \x0a
184: integer: 27
+186: space:
187: integer: 4534
+191: space: \x0a
192: integer: 28
+194: space:
195: integer: 4698
+199: space: \x0a
200: integer: 29
+202: space:
203: integer: 4779
+207: space: \x0a
208: integer: 30
+210: space:
211: integer: 4943
+215: space: \x0a
216: integer: 31
+218: space:
219: integer: 5024
+223: space: \x0a
224: integer: 32
+226: space:
227: integer: 5188
+231: space: \x0a
232: integer: 33
+234: space:
235: integer: 5269
+239: space: \x0a
240: integer: 34
+242: space:
243: integer: 5433
+247: space: \x0a
248: integer: 35
+250: space:
251: integer: 5514
+255: space: \x0a
256: integer: 36
+258: space:
259: integer: 5678
+263: space: \x0a
+264: comment: %% Object stream: object 2, index 0; original object ID: 2
+322: space: \x0a
323: dict_open: <<
+325: space: \x0a
328: name: /Pages
+334: space:
335: integer: 3
+336: space:
337: integer: 0
+338: space:
339: word: R
+340: space: \x0a
343: name: /Type
+348: space:
349: name: /Catalog
+357: space: \x0a
358: dict_close: >>
+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<InputSource> is, char const* what, Finder& f)
+try_skipping(QPDFTokenizer& tokenizer, PointerHolder<InputSource> 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<InputSource> is, char const* what, Finder& f)
static void
dump_tokens(PointerHolder<InputSource> 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<InputSource> 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<InputSource> 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<InputSource> 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<InputSource> 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)
{