aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--TODO8
-rw-r--r--libqpdf/QPDFJob.cc49
-rw-r--r--manual/release-notes.rst6
-rw-r--r--qpdf/qtest/image-optimization.test2
-rw-r--r--qpdf/qtest/qpdf/nested-images.pdfbin0 -> 5744 bytes
-rw-r--r--qpdf/qtest/qpdf/optimize-images-nested-images-json.out18
-rw-r--r--qpdf/qtest/qpdf/optimize-images-nested-images.out2
8 files changed, 66 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index cc1a6608..4c8ddfee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/TODO b/TODO
index fce507ab..4eba6f6b 100644
--- a/TODO
+++ b/TODO
@@ -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
new file mode 100644
index 00000000..cb2b4d87
--- /dev/null
+++ b/qpdf/qtest/qpdf/nested-images.pdf
Binary files differ
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