diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | TODO | 8 | ||||
-rw-r--r-- | libqpdf/QPDFJob.cc | 49 | ||||
-rw-r--r-- | manual/release-notes.rst | 6 | ||||
-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 |
8 files changed, 66 insertions, 25 deletions
@@ -1,3 +1,9 @@ +2023-03-18 Jay Berkenbilt <ejb@ql.org> + + * Enhance --optimize-images to support images nested inside of + form XObjects. Thanks to Connor Osborne (github user cdosborn) for + the contribution. Fixes #923. + 2023-02-25 Jay Berkenbilt <ejb@ql.org> * 11.3.0: release @@ -263,6 +263,14 @@ Always: For qpdf 12, see https://github.com/qpdf/qpdf/discussions/785 +C++ Version Changes +=================== + +Use +// C++NN: ... +to mark places in the code that should be updated when we require at +least that version of C++. + Page splitting/merging ====================== diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index 646a21fc..b700378e 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -2364,31 +2364,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/manual/release-notes.rst b/manual/release-notes.rst index 904c3e12..39b40ab4 100644 --- a/manual/release-notes.rst +++ b/manual/release-notes.rst @@ -8,6 +8,12 @@ For a detailed list of changes, please see the file .. x.y.z: not yet released +11.4.0: not yet released + - CLI Enhancements + + - The :qpdf:ref:`--optimize-images` option now optimizes images + inside of form XObjects. + 11.3.0: February 25, 2023 - CLI Enhancements 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 |