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,7 +1010,7 @@ class QPDF | ||
| 1010 | QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og); | 1010 | QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og); |
| 1011 | void readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset); | 1011 | void readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset); |
| 1012 | void validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset); | 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 | size_t recoverStreamLength( | 1014 | size_t recoverStreamLength( |
| 1015 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); | 1015 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); |
| 1016 | QPDFTokenizer::Token readToken(std::shared_ptr<InputSource>, size_t max_len = 0); | 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,10 +1413,11 @@ QPDF::validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset | ||
| 1413 | } | 1413 | } |
| 1414 | 1414 | ||
| 1415 | QPDFObjectHandle | 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 | bool empty = false; | 1422 | bool empty = false; |
| 1422 | auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this) | 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,9 +1427,6 @@ QPDF::readObjectInStream(std::shared_ptr<InputSource> input, QPDFObjGen og) | ||
| 1426 | // actual PDF files and Adobe Reader appears to ignore them. | 1427 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1427 | warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null")); | 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 | return object; | 1430 | return object; |
| 1433 | } | 1431 | } |
| 1434 | 1432 | ||
| @@ -1787,13 +1785,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | @@ -1787,13 +1785,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | ||
| 1787 | // found here in the cache. Remember that some objects stored here might have been overridden | 1785 | // found here in the cache. Remember that some objects stored here might have been overridden |
| 1788 | // by new objects appended to the file, so it is necessary to recheck the xref table and only | 1786 | // by new objects appended to the file, so it is necessary to recheck the xref table and only |
| 1789 | // cache what would actually be resolved here. | 1787 | // cache what would actually be resolved here. |
| 1788 | + m->last_object_description.clear(); | ||
| 1789 | + m->last_object_description += "object "; | ||
| 1790 | for (auto const& iter: offsets) { | 1790 | for (auto const& iter: offsets) { |
| 1791 | QPDFObjGen og(iter.first, 0); | 1791 | QPDFObjGen og(iter.first, 0); |
| 1792 | QPDFXRefEntry const& entry = m->xref_table[og]; | 1792 | QPDFXRefEntry const& entry = m->xref_table[og]; |
| 1793 | if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) { | 1793 | if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) { |
| 1794 | int offset = iter.second; | 1794 | int offset = iter.second; |
| 1795 | input->seek(offset, SEEK_SET); | 1795 | input->seek(offset, SEEK_SET); |
| 1796 | - QPDFObjectHandle oh = readObjectInStream(input, og); | 1796 | + QPDFObjectHandle oh = readObjectInStream(input, iter.first); |
| 1797 | updateCache(og, oh.getObj(), end_before_space, end_after_space); | 1797 | updateCache(og, oh.getObj(), end_before_space, end_after_space); |
| 1798 | } else { | 1798 | } else { |
| 1799 | QTC::TC("qpdf", "QPDF not caching overridden objstm object"); | 1799 | QTC::TC("qpdf", "QPDF not caching overridden objstm object"); |