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:
parent
5211bcb5ea
commit
eb49e07c0a
@ -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
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
|
* 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
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
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 /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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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-
|
||||||
|
@ -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-
|
||||||
|
@ -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 ---
|
||||||
|
@ -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 ---
|
||||||
|
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: >>
|
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 ---
|
||||||
|
Loading…
Reference in New Issue
Block a user