aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libqpdf/QPDFJob.cc49
-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
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
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