2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-10-31 19:02:30 +00:00

Make inline image token exactly contain the image data

Do not include the trailing EI, and handle cases where EI is not
preceded by a delimiter. Such cases have been seen in the wild.
This commit is contained in:
Jay Berkenbilt 2019-01-31 15:51:52 -05:00
parent 5211bcb5ea
commit eb49e07c0a
21 changed files with 28713 additions and 24190 deletions

View File

@ -26,10 +26,14 @@
* Very low-level QPDFTokenizer API now includes an * Very low-level QPDFTokenizer API now includes an
expectInlineImage method that takes an input stream, enabling it expectInlineImage method that takes an input stream, enabling it
to locate an inline image's EI operator better. This is called to locate an inline image's EI operator better. When this method
is called, the inline image token returned will not contain the EI
operator and will contain correct image data. This is called
automatically everywhere within the qpdf library. Most user code automatically everywhere within the qpdf library. Most user code
will never have to use the low-level tokenizer API. If you use will never have to use the low-level tokenizer API. If you use
Pl_QPDFTokenizer, this will be done automatically for you. Pl_QPDFTokenizer, this will be done automatically for you. If you
use the low-level API and call expectInlineImage, you should call
the new version.
2019-01-29 Jay Berkenbilt <ejb@ql.org> 2019-01-29 Jay Berkenbilt <ejb@ql.org>

3
TODO
View File

@ -24,6 +24,9 @@ Do these things next time we have to break binary compatibility
* Get rid of the version of QPDF::copyForeignObject with the bool * Get rid of the version of QPDF::copyForeignObject with the bool
unused parameter. unused parameter.
* Remove version of QPDFTokenizer::expectInlineImage with no
arguments.
Lexical Lexical
======= =======

View File

@ -176,19 +176,23 @@ class QPDFTokenizer
// Calling this method puts the tokenizer in a state for reading // Calling this method puts the tokenizer in a state for reading
// inline images. You should call this method after reading the // inline images. You should call this method after reading the
// character following the ID operator. In that state, it will // character following the ID operator. In that state, it will
// return all data up to and including the next EI token. After // return all data up to BUT NOT INCLUDING the next EI token. This
// you call this method, the next call to readToken (or the token // is a difference in behavior from the legacy version. After you
// call this method, the next call to readToken (or the token
// created next time getToken returns true) will either be // created next time getToken returns true) will either be
// tt_inline_image or tt_bad. This is the only way readToken // tt_inline_image or tt_bad. This is the only way readToken
// returns a tt_inline_image token. The version of this method // returns a tt_inline_image token. The older version of this
// that takes a PointerHolder<InputSource> does a better job of // method that takes does not take a PointerHolder<InputSource>
// locating the end of the inline image and should be used // will always end the inline image the first time it sees
// whenever the input source is available. It preserves both // something that looks like an EI operator and will include the
// tell() and getLastOffset(). The version without the input // EI operator in the token. It is being maintained for backward
// source will always end the inline image the first time it sees // compatibility only and will likely be removed in the future.
// something that looks like an EI operator.
QPDF_DLL QPDF_DLL
void expectInlineImage(PointerHolder<InputSource> input); void expectInlineImage(PointerHolder<InputSource> input);
// Legacy version. New code should not call this. The token
// returned will include the EI keyword. The recipient of the
// token will have to remove it.
QPDF_DLL QPDF_DLL
void expectInlineImage(); void expectInlineImage();

View File

@ -1570,16 +1570,7 @@ QPDFObjectHandle::parseContentStream_data(
} }
else else
{ {
// Skip back over EI std::string inline_image = t.getValue();
input->seek(-2, SEEK_CUR);
std::string inline_image = t.getRawValue();
for (int i = 0; i < 3; ++i)
{
if (inline_image.length() > 0)
{
inline_image.erase(inline_image.length() - 1);
}
}
QTC::TC("qpdf", "QPDFObjectHandle inline image token"); QTC::TC("qpdf", "QPDFObjectHandle inline image token");
callbacks->handleObject( callbacks->handleObject(
QPDFObjectHandle::newInlineImage(inline_image)); QPDFObjectHandle::newInlineImage(inline_image));

View File

@ -228,10 +228,6 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const& token)
{ {
std::string image_data(token.getValue()); std::string image_data(token.getValue());
size_t len = image_data.length(); size_t len = image_data.length();
// The token ends with delimiter followed by EI, so it
// will always be at least 3 bytes long. We want to
// exclude the EI and preceding delimiter.
len = (len >= 3 ? len - 3 : 0);
if (len >= this->min_size) if (len >= this->min_size)
{ {
QTC::TC("qpdf", "QPDFPageObjectHelper externalize inline image"); QTC::TC("qpdf", "QPDFPageObjectHelper externalize inline image");
@ -256,14 +252,18 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const& token)
QTC::TC("qpdf", "QPDFPageObjectHelper keep inline image"); QTC::TC("qpdf", "QPDFPageObjectHelper keep inline image");
write(bi_str); write(bi_str);
writeToken(token); writeToken(token);
state = st_top;
} }
state = st_top;
} }
else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "ID")) else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "ID"))
{ {
bi_str += token.getValue(); bi_str += token.getValue();
dict_str += " >>"; dict_str += " >>";
} }
else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "EI"))
{
state = st_top;
}
else else
{ {
bi_str += token.getValue(); bi_str += token.getValue();

View File

@ -73,15 +73,6 @@ QPDFWordTokenFinder::check()
// beginning of the input. // beginning of the input.
return false; return false;
} }
is->seek(token_start - 1, SEEK_SET);
char prev;
bool prev_okay = ((is->read(&prev, 1) == 1) && is_delimiter(prev));
is->seek(pos, SEEK_SET);
if (! prev_okay)
{
QTC::TC("qpdf", "QPDFTokenizer finder word not preceded by delimiter");
return false;
}
return true; return true;
} }
@ -724,7 +715,7 @@ QPDFTokenizer::findEI(PointerHolder<InputSource> input)
{ {
break; break;
} }
this->m->inline_image_bytes = input->tell() - pos; this->m->inline_image_bytes = input->tell() - pos - 2;
QPDFTokenizer check; QPDFTokenizer check;
bool found_bad = false; bool found_bad = false;

View File

@ -431,7 +431,6 @@ qpdf from_nr from repeat_nr 0
QPDF resolve duplicated page object 0 QPDF resolve duplicated page object 0
QPDF handle direct page object 0 QPDF handle direct page object 0
QPDFTokenizer finder found wrong word 0 QPDFTokenizer finder found wrong word 0
QPDFTokenizer finder word not preceded by delimiter 0
QPDFTokenizer found EI the old way 0 QPDFTokenizer found EI the old way 0
QPDFTokenizer found EI by byte count 0 QPDFTokenizer found EI by byte count 0
QPDFTokenizer inline image at EOF the old way 0 QPDFTokenizer inline image at EOF the old way 0

View File

@ -776,7 +776,7 @@ $td->runtest("tokenizer",
$td->runtest("tokenizer with old inline image code", $td->runtest("tokenizer with old inline image code",
{$td->COMMAND => "test_tokenizer -old-ei tokens.pdf"}, {$td->COMMAND => "test_tokenizer -old-ei tokens.pdf"},
{$td->FILE => "tokens.out", $td->EXIT_STATUS => 0}, {$td->FILE => "tokens-old-ei.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES); $td->NORMALIZE_NEWLINES);
$td->runtest("tokenizer with max_len", $td->runtest("tokenizer with max_len",

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
qpdf: image /IIm1 on page 1: optimizing image reduces size from 2391 to ... qpdf: image /IIm1 on page 1: optimizing image reduces size from 2392 to ...
qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134996 to ... qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134997 to ...
qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT
qpdf: image /IIm4 on page 1: not optimizing because DCT compression does not reduce image size qpdf: image /IIm4 on page 1: not optimizing because DCT compression does not reduce image size
qpdf: wrote file a.pdf qpdf: wrote file a.pdf

View File

@ -1,4 +1,4 @@
qpdf: image /IIm1 on page 1: not optimizing because image is smaller than requested minimum dimensions qpdf: image /IIm1 on page 1: not optimizing because image is smaller than requested minimum dimensions
qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134996 to ... qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134997 to ...
qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT
qpdf: wrote file a.pdf qpdf: wrote file a.pdf

View File

@ -1,5 +1,5 @@
qpdf: image /IIm1 on page 1: not optimizing because image is smaller than requested minimum dimensions qpdf: image /IIm1 on page 1: not optimizing because image is smaller than requested minimum dimensions
qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134996 to ... qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134997 to ...
qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT qpdf: image /IIm3 on page 1: not optimizing because unable to decode data or data already uses DCT
qpdf: image /IIm4 on page 1: not optimizing because image is smaller than requested minimum dimensions qpdf: image /IIm4 on page 1: not optimizing because image is smaller than requested minimum dimensions
qpdf: wrote file a.pdf qpdf: wrote file a.pdf

View File

@ -29,7 +29,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 1 /Predictor 15 >> dictionary: << /Columns 1 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789c63fc0f0001030101 inline-image: 789c63fc0f00010301010a
operator: EI operator: EI
operator: Q operator: Q
operator: q operator: q
@ -54,7 +54,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 30 /Predictor 15 >> dictionary: << /Columns 30 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a0a
operator: EI operator: EI
operator: Q operator: Q
operator: q operator: q
@ -79,7 +79,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 32 /Predictor 15 >> dictionary: << /Columns 32 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13 inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c130a
operator: EI operator: EI
operator: Q operator: Q
-EOF- -EOF-

View File

@ -38,7 +38,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 1 /Predictor 15 >> dictionary: << /Columns 1 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789c63fc0f0001030101 inline-image: 789c63fc0f00010301010a
operator: EI operator: EI
operator: Q operator: Q
operator: q operator: q
@ -63,7 +63,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 30 /Predictor 15 >> dictionary: << /Columns 30 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a0a
operator: EI operator: EI
operator: Q operator: Q
operator: q operator: q
@ -88,7 +88,7 @@ name: /Fl
name: /DP name: /DP
dictionary: << /Columns 32 /Predictor 15 >> dictionary: << /Columns 32 /Predictor 15 >>
operator: ID operator: ID
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13 inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c130a
operator: EI operator: EI
operator: Q operator: Q
-EOF- -EOF-

View File

@ -599,7 +599,8 @@ skipping to endstream
103: dict_close: >> 103: dict_close: >>
105: space: \x0a 105: space: \x0a
106: word: ID 106: word: ID
109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
352: word: EI
354: space: \x0a 354: space: \x0a
355: word: BT 355: word: BT
357: space: \x0a 357: space: \x0a
@ -810,7 +811,8 @@ EI not found; resuming normal scanning
67: dict_close: >> 67: dict_close: >>
69: space: \x0a 69: space: \x0a
70: word: ID 70: word: ID
73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
316: word: EI
318: eof 318: eof
--- END PAGE 7 --- --- END PAGE 7 ---
--- BEGIN PAGE 8 --- --- BEGIN PAGE 8 ---

View File

@ -291,7 +291,8 @@ skipping to endstream
101: integer: 66 101: integer: 66
103: dict_close: >> 103: dict_close: >>
106: word: ID 106: word: ID
109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
352: word: EI
355: word: BT 355: word: BT
360: name: /F1 360: name: /F1
364: integer: 24 364: integer: 24
@ -414,7 +415,8 @@ EI not found; resuming normal scanning
65: integer: 66 65: integer: 66
67: dict_close: >> 67: dict_close: >>
70: word: ID 70: word: ID
73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
316: word: EI
318: eof 318: eof
--- END PAGE 7 --- --- END PAGE 7 ---
--- BEGIN PAGE 8 --- --- BEGIN PAGE 8 ---

File diff suppressed because it is too large Load Diff

View File

@ -599,7 +599,8 @@ skipping to endstream
103: dict_close: >> 103: dict_close: >>
105: space: \x0a 105: space: \x0a
106: word: ID 106: word: ID
109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 109: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
352: word: EI
354: space: \x0a 354: space: \x0a
355: word: BT 355: word: BT
357: space: \x0a 357: space: \x0a
@ -810,7 +811,8 @@ EI not found; resuming normal scanning
67: dict_close: >> 67: dict_close: >>
69: space: \x0a 69: space: \x0a
70: word: ID 70: word: ID
73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI 73: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0a
316: word: EI
318: eof 318: eof
--- END PAGE 7 --- --- END PAGE 7 ---
--- BEGIN PAGE 8 --- --- BEGIN PAGE 8 ---