diff options
-rw-r--r-- | libqpdf/QPDFJob.cc | 49 | ||||
-rw-r--r-- | qpdf/qtest/image-optimization.test | 2 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/nested-images.pdf | bin | 0 -> 5744 bytes | |||
-rw-r--r-- | qpdf/qtest/qpdf/optimize-images-nested-images-json.out | 18 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/optimize-images-nested-images.out | 2 |
5 files changed, 46 insertions, 25 deletions
diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index b57a791b..4916be41 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -2363,31 +2363,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<QPDFObjectHandle::StreamDataProvider> 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<ImageOptimizer>( + *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) { diff --git a/qpdf/qtest/image-optimization.test b/qpdf/qtest/image-optimization.test index 1b3901e6..10ffd526 100644 --- a/qpdf/qtest/image-optimization.test +++ b/qpdf/qtest/image-optimization.test @@ -33,6 +33,8 @@ my @image_opt = ( ['large-inline-image', 'inline-images-keep-all', '--keep-inline-images'], ['unsupported-optimization', 'unsupported', '--oi-min-width=0 --oi-min-height=0 --oi-min-area=0'], + ['nested-images', 'nested-images', + '--oi-min-width=0 --oi-min-height=0 --oi-min-area=0'] ); my $n_tests = 2 * scalar(@image_opt); diff --git a/qpdf/qtest/qpdf/nested-images.pdf b/qpdf/qtest/qpdf/nested-images.pdf Binary files differnew file mode 100644 index 00000000..cb2b4d87 --- /dev/null +++ b/qpdf/qtest/qpdf/nested-images.pdf diff --git a/qpdf/qtest/qpdf/optimize-images-nested-images-json.out b/qpdf/qtest/qpdf/optimize-images-nested-images-json.out new file mode 100644 index 00000000..9f713aa7 --- /dev/null +++ b/qpdf/qtest/qpdf/optimize-images-nested-images-json.out @@ -0,0 +1,18 @@ +{ + "version": 2, + "parameters": { + "decodelevel": "generalized" + }, + "pages": [ + { + "contents": [ + "4 0 R" + ], + "images": [], + "label": null, + "object": "3 0 R", + "outlines": [], + "pageposfrom1": 1 + } + ] +} diff --git a/qpdf/qtest/qpdf/optimize-images-nested-images.out b/qpdf/qtest/qpdf/optimize-images-nested-images.out new file mode 100644 index 00000000..253a9208 --- /dev/null +++ b/qpdf/qtest/qpdf/optimize-images-nested-images.out @@ -0,0 +1,2 @@ +qpdf: image /X1 on page 1: optimizing image reduces size from 2628 to ... +qpdf: wrote file a.pdf |