Commit 8de2497a8fcfc659e9d0927aadd44ac4ee1f0d18
1 parent
b27be3ed
Improve --optimize-images to find images nested within XObjects
Showing
1 changed file
with
24 additions
and
25 deletions
libqpdf/QPDFJob.cc
| ... | ... | @@ -2349,31 +2349,30 @@ QPDFJob::handleTransformations(QPDF& pdf) |
| 2349 | 2349 | int pageno = 0; |
| 2350 | 2350 | for (auto& ph: dh.getAllPages()) { |
| 2351 | 2351 | ++pageno; |
| 2352 | - QPDFObjectHandle page = ph.getObjectHandle(); | |
| 2353 | - for (auto& iter2: ph.getImages()) { | |
| 2354 | - std::string name = iter2.first; | |
| 2355 | - QPDFObjectHandle& image = iter2.second; | |
| 2356 | - ImageOptimizer* io = new ImageOptimizer( | |
| 2357 | - *this, | |
| 2358 | - m->oi_min_width, | |
| 2359 | - m->oi_min_height, | |
| 2360 | - m->oi_min_area, | |
| 2361 | - image); | |
| 2362 | - std::shared_ptr<QPDFObjectHandle::StreamDataProvider> sdp(io); | |
| 2363 | - if (io->evaluate( | |
| 2364 | - "image " + name + " on page " + | |
| 2365 | - std::to_string(pageno))) { | |
| 2366 | - QPDFObjectHandle new_image = pdf.newStream(); | |
| 2367 | - new_image.replaceDict(image.getDict().shallowCopy()); | |
| 2368 | - new_image.replaceStreamData( | |
| 2369 | - sdp, | |
| 2370 | - QPDFObjectHandle::newName("/DCTDecode"), | |
| 2371 | - QPDFObjectHandle::newNull()); | |
| 2372 | - ph.getAttribute("/Resources", true) | |
| 2373 | - .getKey("/XObject") | |
| 2374 | - .replaceKey(name, new_image); | |
| 2375 | - } | |
| 2376 | - } | |
| 2352 | + ph.forEachImage( | |
| 2353 | + true, | |
| 2354 | + [this, pageno, &pdf]( | |
| 2355 | + QPDFObjectHandle& obj, | |
| 2356 | + QPDFObjectHandle& xobj_dict, | |
| 2357 | + std::string const& key) { | |
| 2358 | + auto io = std::make_unique<ImageOptimizer>( | |
| 2359 | + *this, | |
| 2360 | + m->oi_min_width, | |
| 2361 | + m->oi_min_height, | |
| 2362 | + m->oi_min_area, | |
| 2363 | + obj); | |
| 2364 | + if (io->evaluate( | |
| 2365 | + "image " + key + " on page " + | |
| 2366 | + std::to_string(pageno))) { | |
| 2367 | + QPDFObjectHandle new_image = pdf.newStream(); | |
| 2368 | + new_image.replaceDict(obj.getDict().shallowCopy()); | |
| 2369 | + new_image.replaceStreamData( | |
| 2370 | + std::move(io), | |
| 2371 | + QPDFObjectHandle::newName("/DCTDecode"), | |
| 2372 | + QPDFObjectHandle::newNull()); | |
| 2373 | + xobj_dict.replaceKey(key, new_image); | |
| 2374 | + } | |
| 2375 | + }); | |
| 2377 | 2376 | } |
| 2378 | 2377 | } |
| 2379 | 2378 | if (m->generate_appearances) { | ... | ... |