Commit 2bf7359e3559f7a6453eb0c444b93e17a2a5a405
1 parent
098b98c8
Add new private method QPDF::readObjectInStream
Showing
2 changed files
with
22 additions
and
1 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -1011,6 +1011,7 @@ class QPDF |
| 1011 | 1011 | std::string const& description, |
| 1012 | 1012 | QPDFObjGen const& og, |
| 1013 | 1013 | bool in_object_stream); |
| 1014 | + QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>, QPDFObjGen og); | |
| 1014 | 1015 | size_t recoverStreamLength( |
| 1015 | 1016 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); |
| 1016 | 1017 | QPDFTokenizer::Token readToken(std::shared_ptr<InputSource>, size_t max_len = 0); | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -1389,6 +1389,26 @@ QPDF::readObject( |
| 1389 | 1389 | return object; |
| 1390 | 1390 | } |
| 1391 | 1391 | |
| 1392 | +QPDFObjectHandle | |
| 1393 | +QPDF::readObjectInStream(std::shared_ptr<InputSource> input, QPDFObjGen og) | |
| 1394 | +{ | |
| 1395 | + setLastObjectDescription("", og); | |
| 1396 | + qpdf_offset_t offset = input->tell(); | |
| 1397 | + | |
| 1398 | + bool empty = false; | |
| 1399 | + auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this) | |
| 1400 | + .parse(empty, false); | |
| 1401 | + if (empty) { | |
| 1402 | + // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in | |
| 1403 | + // actual PDF files and Adobe Reader appears to ignore them. | |
| 1404 | + warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null")); | |
| 1405 | + } | |
| 1406 | + | |
| 1407 | + // Override last_offset so that it points to the beginning of the object we just read | |
| 1408 | + input->setLastOffset(offset); | |
| 1409 | + return object; | |
| 1410 | +} | |
| 1411 | + | |
| 1392 | 1412 | bool |
| 1393 | 1413 | QPDF::findEndstream() |
| 1394 | 1414 | { |
| ... | ... | @@ -1750,7 +1770,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) |
| 1750 | 1770 | if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) { |
| 1751 | 1771 | int offset = iter.second; |
| 1752 | 1772 | input->seek(offset, SEEK_SET); |
| 1753 | - QPDFObjectHandle oh = readObject(input, "", og, true); | |
| 1773 | + QPDFObjectHandle oh = readObjectInStream(input, og); | |
| 1754 | 1774 | updateCache(og, oh.getObj(), end_before_space, end_after_space); |
| 1755 | 1775 | } else { |
| 1756 | 1776 | QTC::TC("qpdf", "QPDF not caching overridden objstm object"); | ... | ... |