Commit 5754ab8b39646404801931ed065f985efa0b34a7
1 parent
aabd3f6f
Tune QPDF::readObjectInStream
Showing
2 changed files
with
8 additions
and
8 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -1010,7 +1010,7 @@ class QPDF |
| 1010 | 1010 | QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og); |
| 1011 | 1011 | void readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset); |
| 1012 | 1012 | void validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset); |
| 1013 | - QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>, QPDFObjGen og); | |
| 1013 | + QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); | |
| 1014 | 1014 | size_t recoverStreamLength( |
| 1015 | 1015 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); |
| 1016 | 1016 | QPDFTokenizer::Token readToken(std::shared_ptr<InputSource>, size_t max_len = 0); | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -1413,10 +1413,11 @@ QPDF::validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset |
| 1413 | 1413 | } |
| 1414 | 1414 | |
| 1415 | 1415 | QPDFObjectHandle |
| 1416 | -QPDF::readObjectInStream(std::shared_ptr<InputSource> input, QPDFObjGen og) | |
| 1416 | +QPDF::readObjectInStream(std::shared_ptr<InputSource>& input, int obj) | |
| 1417 | 1417 | { |
| 1418 | - setLastObjectDescription("", og); | |
| 1419 | - qpdf_offset_t offset = input->tell(); | |
| 1418 | + m->last_object_description.erase(7); // last_object_description starts with "object " | |
| 1419 | + m->last_object_description += std::to_string(obj); | |
| 1420 | + m->last_object_description += " 0"; | |
| 1420 | 1421 | |
| 1421 | 1422 | bool empty = false; |
| 1422 | 1423 | auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this) |
| ... | ... | @@ -1426,9 +1427,6 @@ QPDF::readObjectInStream(std::shared_ptr<InputSource> input, QPDFObjGen og) |
| 1426 | 1427 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1427 | 1428 | warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null")); |
| 1428 | 1429 | } |
| 1429 | - | |
| 1430 | - // Override last_offset so that it points to the beginning of the object we just read | |
| 1431 | - input->setLastOffset(offset); | |
| 1432 | 1430 | return object; |
| 1433 | 1431 | } |
| 1434 | 1432 | |
| ... | ... | @@ -1787,13 +1785,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number) |
| 1787 | 1785 | // found here in the cache. Remember that some objects stored here might have been overridden |
| 1788 | 1786 | // by new objects appended to the file, so it is necessary to recheck the xref table and only |
| 1789 | 1787 | // cache what would actually be resolved here. |
| 1788 | + m->last_object_description.clear(); | |
| 1789 | + m->last_object_description += "object "; | |
| 1790 | 1790 | for (auto const& iter: offsets) { |
| 1791 | 1791 | QPDFObjGen og(iter.first, 0); |
| 1792 | 1792 | QPDFXRefEntry const& entry = m->xref_table[og]; |
| 1793 | 1793 | if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) { |
| 1794 | 1794 | int offset = iter.second; |
| 1795 | 1795 | input->seek(offset, SEEK_SET); |
| 1796 | - QPDFObjectHandle oh = readObjectInStream(input, og); | |
| 1796 | + QPDFObjectHandle oh = readObjectInStream(input, iter.first); | |
| 1797 | 1797 | updateCache(og, oh.getObj(), end_before_space, end_after_space); |
| 1798 | 1798 | } else { |
| 1799 | 1799 | QTC::TC("qpdf", "QPDF not caching overridden objstm object"); | ... | ... |