From f6b13fcc05d3d1367a03d54e83fe0605366e49fd Mon Sep 17 00:00:00 2001 From: Connor Osborn Date: Mon, 13 Mar 2023 16:38:49 -0400 Subject: [PATCH] Add test validating that images in nested XObjects are included in optimization The sample file (nested-images.pdf) includes a pdf with an image that is nested within an XObject within an XObject in the Resources dict of the only page. These images were ignored in prior versions of qpdf. --- qpdf/qtest/image-optimization.test | 2 ++ qpdf/qtest/qpdf/nested-images.pdf | Bin 0 -> 5744 bytes .../optimize-images-nested-images-json.out | 18 ++++++++++++++++++ .../qpdf/optimize-images-nested-images.out | 2 ++ 4 files changed, 22 insertions(+) create mode 100644 qpdf/qtest/qpdf/nested-images.pdf create mode 100644 qpdf/qtest/qpdf/optimize-images-nested-images-json.out create mode 100644 qpdf/qtest/qpdf/optimize-images-nested-images.out 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 0000000000000000000000000000000000000000..cb2b4d8728fead1fe38c007fbe5fcf866c28babd GIT binary patch literal 5744 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 literal 0 HcmV?d00001 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