mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 02:49:00 +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:
parent
5211bcb5ea
commit
eb49e07c0a
@ -26,10 +26,14 @@
|
||||
|
||||
* Very low-level QPDFTokenizer API now includes an
|
||||
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
|
||||
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>
|
||||
|
||||
|
3
TODO
3
TODO
@ -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
|
||||
unused parameter.
|
||||
|
||||
* Remove version of QPDFTokenizer::expectInlineImage with no
|
||||
arguments.
|
||||
|
||||
Lexical
|
||||
=======
|
||||
|
||||
|
@ -176,19 +176,23 @@ class QPDFTokenizer
|
||||
// Calling this method puts the tokenizer in a state for reading
|
||||
// inline images. You should call this method after reading the
|
||||
// character following the ID operator. In that state, it will
|
||||
// return all data up to and including the next EI token. After
|
||||
// you call this method, the next call to readToken (or the token
|
||||
// return all data up to BUT NOT INCLUDING the next EI token. This
|
||||
// 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
|
||||
// tt_inline_image or tt_bad. This is the only way readToken
|
||||
// returns a tt_inline_image token. The version of this method
|
||||
// that takes a PointerHolder<InputSource> does a better job of
|
||||
// locating the end of the inline image and should be used
|
||||
// whenever the input source is available. It preserves both
|
||||
// tell() and getLastOffset(). The version without the input
|
||||
// source will always end the inline image the first time it sees
|
||||
// something that looks like an EI operator.
|
||||
// returns a tt_inline_image token. The older version of this
|
||||
// method that takes does not take a PointerHolder<InputSource>
|
||||
// will always end the inline image the first time it sees
|
||||
// something that looks like an EI operator and will include the
|
||||
// EI operator in the token. It is being maintained for backward
|
||||
// compatibility only and will likely be removed in the future.
|
||||
QPDF_DLL
|
||||
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
|
||||
void expectInlineImage();
|
||||
|
||||
|
@ -1570,16 +1570,7 @@ QPDFObjectHandle::parseContentStream_data(
|
||||
}
|
||||
else
|
||||
{
|
||||
// Skip back over EI
|
||||
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);
|
||||
}
|
||||
}
|
||||
std::string inline_image = t.getValue();
|
||||
QTC::TC("qpdf", "QPDFObjectHandle inline image token");
|
||||
callbacks->handleObject(
|
||||
QPDFObjectHandle::newInlineImage(inline_image));
|
||||
|
@ -228,10 +228,6 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const& token)
|
||||
{
|
||||
std::string image_data(token.getValue());
|
||||
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)
|
||||
{
|
||||
QTC::TC("qpdf", "QPDFPageObjectHelper externalize inline image");
|
||||
@ -256,14 +252,18 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const& token)
|
||||
QTC::TC("qpdf", "QPDFPageObjectHelper keep inline image");
|
||||
write(bi_str);
|
||||
writeToken(token);
|
||||
state = st_top;
|
||||
}
|
||||
state = st_top;
|
||||
}
|
||||
else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "ID"))
|
||||
{
|
||||
bi_str += token.getValue();
|
||||
dict_str += " >>";
|
||||
}
|
||||
else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "EI"))
|
||||
{
|
||||
state = st_top;
|
||||
}
|
||||
else
|
||||
{
|
||||
bi_str += token.getValue();
|
||||
|
@ -73,15 +73,6 @@ QPDFWordTokenFinder::check()
|
||||
// beginning of the input.
|
||||
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;
|
||||
}
|
||||
|
||||
@ -724,7 +715,7 @@ QPDFTokenizer::findEI(PointerHolder<InputSource> input)
|
||||
{
|
||||
break;
|
||||
}
|
||||
this->m->inline_image_bytes = input->tell() - pos;
|
||||
this->m->inline_image_bytes = input->tell() - pos - 2;
|
||||
|
||||
QPDFTokenizer check;
|
||||
bool found_bad = false;
|
||||
|
@ -431,7 +431,6 @@ qpdf from_nr from repeat_nr 0
|
||||
QPDF resolve duplicated page object 0
|
||||
QPDF handle direct page object 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 by byte count 0
|
||||
QPDFTokenizer inline image at EOF the old way 0
|
||||
|
@ -776,7 +776,7 @@ $td->runtest("tokenizer",
|
||||
|
||||
$td->runtest("tokenizer with old inline image code",
|
||||
{$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->runtest("tokenizer with max_len",
|
||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
qpdf: image /IIm1 on page 1: optimizing image reduces size from 2391 to ...
|
||||
qpdf: image /IIm2 on page 1: optimizing image reduces size from 2134996 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 2134997 to ...
|
||||
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: wrote file a.pdf
|
||||
|
@ -1,4 +1,4 @@
|
||||
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: wrote file a.pdf
|
||||
|
@ -1,5 +1,5 @@
|
||||
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 /IIm4 on page 1: not optimizing because image is smaller than requested minimum dimensions
|
||||
qpdf: wrote file a.pdf
|
||||
|
@ -29,7 +29,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 1 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789c63fc0f0001030101
|
||||
inline-image: 789c63fc0f00010301010a
|
||||
operator: EI
|
||||
operator: Q
|
||||
operator: q
|
||||
@ -54,7 +54,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 30 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a
|
||||
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a0a
|
||||
operator: EI
|
||||
operator: Q
|
||||
operator: q
|
||||
@ -79,7 +79,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 32 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13
|
||||
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c130a
|
||||
operator: EI
|
||||
operator: Q
|
||||
-EOF-
|
||||
|
@ -38,7 +38,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 1 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789c63fc0f0001030101
|
||||
inline-image: 789c63fc0f00010301010a
|
||||
operator: EI
|
||||
operator: Q
|
||||
operator: q
|
||||
@ -63,7 +63,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 30 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a
|
||||
inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a0a
|
||||
operator: EI
|
||||
operator: Q
|
||||
operator: q
|
||||
@ -88,7 +88,7 @@ name: /Fl
|
||||
name: /DP
|
||||
dictionary: << /Columns 32 /Predictor 15 >>
|
||||
operator: ID
|
||||
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13
|
||||
inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c130a
|
||||
operator: EI
|
||||
operator: Q
|
||||
-EOF-
|
||||
|
@ -599,7 +599,8 @@ skipping to endstream
|
||||
103: dict_close: >>
|
||||
105: space: \x0a
|
||||
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
|
||||
355: word: BT
|
||||
357: space: \x0a
|
||||
@ -810,7 +811,8 @@ EI not found; resuming normal scanning
|
||||
67: dict_close: >>
|
||||
69: space: \x0a
|
||||
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
|
||||
--- END PAGE 7 ---
|
||||
--- BEGIN PAGE 8 ---
|
||||
|
@ -291,7 +291,8 @@ skipping to endstream
|
||||
101: integer: 66
|
||||
103: dict_close: >>
|
||||
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
|
||||
360: name: /F1
|
||||
364: integer: 24
|
||||
@ -414,7 +415,8 @@ EI not found; resuming normal scanning
|
||||
65: integer: 66
|
||||
67: dict_close: >>
|
||||
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
|
||||
--- END PAGE 7 ---
|
||||
--- BEGIN PAGE 8 ---
|
||||
|
2320
qpdf/qtest/qpdf/tokens-old-ei.out
Normal file
2320
qpdf/qtest/qpdf/tokens-old-ei.out
Normal file
File diff suppressed because it is too large
Load Diff
@ -599,7 +599,8 @@ skipping to endstream
|
||||
103: dict_close: >>
|
||||
105: space: \x0a
|
||||
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
|
||||
355: word: BT
|
||||
357: space: \x0a
|
||||
@ -810,7 +811,8 @@ EI not found; resuming normal scanning
|
||||
67: dict_close: >>
|
||||
69: space: \x0a
|
||||
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
|
||||
--- END PAGE 7 ---
|
||||
--- BEGIN PAGE 8 ---
|
||||
|
Loading…
Reference in New Issue
Block a user