From 2bf7359e3559f7a6453eb0c444b93e17a2a5a405 Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 7 Jul 2023 20:14:59 +0100 Subject: Add new private method QPDF::readObjectInStream --- libqpdf/QPDF.cc | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 9554027c..cfa22730 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1389,6 +1389,26 @@ QPDF::readObject( return object; } +QPDFObjectHandle +QPDF::readObjectInStream(std::shared_ptr input, QPDFObjGen og) +{ + setLastObjectDescription("", og); + qpdf_offset_t offset = input->tell(); + + bool empty = false; + auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this) + .parse(empty, false); + if (empty) { + // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in + // actual PDF files and Adobe Reader appears to ignore them. + warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null")); + } + + // Override last_offset so that it points to the beginning of the object we just read + input->setLastOffset(offset); + return object; +} + bool QPDF::findEndstream() { @@ -1750,7 +1770,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) { int offset = iter.second; input->seek(offset, SEEK_SET); - QPDFObjectHandle oh = readObject(input, "", og, true); + QPDFObjectHandle oh = readObjectInStream(input, og); updateCache(og, oh.getObj(), end_before_space, end_after_space); } else { QTC::TC("qpdf", "QPDF not caching overridden objstm object"); -- cgit v1.2.3-54-g00ecf