From 8de2497a8fcfc659e9d0927aadd44ac4ee1f0d18 Mon Sep 17 00:00:00 2001 From: Connor Osborn Date: Mon, 13 Mar 2023 12:57:00 -0400 Subject: [PATCH] Improve --optimize-images to find images nested within XObjects --- libqpdf/QPDFJob.cc | 49 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index 87ec32b9..933ae8ff 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -2349,31 +2349,30 @@ QPDFJob::handleTransformations(QPDF& pdf) int pageno = 0; for (auto& ph: dh.getAllPages()) { ++pageno; - QPDFObjectHandle page = ph.getObjectHandle(); - for (auto& iter2: ph.getImages()) { - std::string name = iter2.first; - QPDFObjectHandle& image = iter2.second; - ImageOptimizer* io = new ImageOptimizer( - *this, - m->oi_min_width, - m->oi_min_height, - m->oi_min_area, - image); - std::shared_ptr sdp(io); - if (io->evaluate( - "image " + name + " on page " + - std::to_string(pageno))) { - QPDFObjectHandle new_image = pdf.newStream(); - new_image.replaceDict(image.getDict().shallowCopy()); - new_image.replaceStreamData( - sdp, - QPDFObjectHandle::newName("/DCTDecode"), - QPDFObjectHandle::newNull()); - ph.getAttribute("/Resources", true) - .getKey("/XObject") - .replaceKey(name, new_image); - } - } + ph.forEachImage( + true, + [this, pageno, &pdf]( + QPDFObjectHandle& obj, + QPDFObjectHandle& xobj_dict, + std::string const& key) { + auto io = std::make_unique( + *this, + m->oi_min_width, + m->oi_min_height, + m->oi_min_area, + obj); + if (io->evaluate( + "image " + key + " on page " + + std::to_string(pageno))) { + QPDFObjectHandle new_image = pdf.newStream(); + new_image.replaceDict(obj.getDict().shallowCopy()); + new_image.replaceStreamData( + std::move(io), + QPDFObjectHandle::newName("/DCTDecode"), + QPDFObjectHandle::newNull()); + xobj_dict.replaceKey(key, new_image); + } + }); } } if (m->generate_appearances) {