Merge pull request #924 from cdosborn/main

Improve --optimize-images to find images nested within XObjects
This commit is contained in:
Jay Berkenbilt 2023-03-18 15:34:27 -04:00 committed by GitHub
commit fe36ef141c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 25 deletions

View File

@ -2363,31 +2363,30 @@ QPDFJob::handleTransformations(QPDF& pdf)
int pageno = 0; int pageno = 0;
for (auto& ph: dh.getAllPages()) { for (auto& ph: dh.getAllPages()) {
++pageno; ++pageno;
QPDFObjectHandle page = ph.getObjectHandle(); ph.forEachImage(
for (auto& iter2: ph.getImages()) { true,
std::string name = iter2.first; [this, pageno, &pdf](
QPDFObjectHandle& image = iter2.second; QPDFObjectHandle& obj,
ImageOptimizer* io = new ImageOptimizer( QPDFObjectHandle& xobj_dict,
*this, std::string const& key) {
m->oi_min_width, auto io = std::make_unique<ImageOptimizer>(
m->oi_min_height, *this,
m->oi_min_area, m->oi_min_width,
image); m->oi_min_height,
std::shared_ptr<QPDFObjectHandle::StreamDataProvider> sdp(io); m->oi_min_area,
if (io->evaluate( obj);
"image " + name + " on page " + if (io->evaluate(
std::to_string(pageno))) { "image " + key + " on page " +
QPDFObjectHandle new_image = pdf.newStream(); std::to_string(pageno))) {
new_image.replaceDict(image.getDict().shallowCopy()); QPDFObjectHandle new_image = pdf.newStream();
new_image.replaceStreamData( new_image.replaceDict(obj.getDict().shallowCopy());
sdp, new_image.replaceStreamData(
QPDFObjectHandle::newName("/DCTDecode"), std::move(io),
QPDFObjectHandle::newNull()); QPDFObjectHandle::newName("/DCTDecode"),
ph.getAttribute("/Resources", true) QPDFObjectHandle::newNull());
.getKey("/XObject") xobj_dict.replaceKey(key, new_image);
.replaceKey(name, new_image); }
} });
}
} }
} }
if (m->generate_appearances) { if (m->generate_appearances) {

View File

@ -33,6 +33,8 @@ my @image_opt = (
['large-inline-image', 'inline-images-keep-all', '--keep-inline-images'], ['large-inline-image', 'inline-images-keep-all', '--keep-inline-images'],
['unsupported-optimization', 'unsupported', ['unsupported-optimization', 'unsupported',
'--oi-min-width=0 --oi-min-height=0 --oi-min-area=0'], '--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); my $n_tests = 2 * scalar(@image_opt);

Binary file not shown.

View File

@ -0,0 +1,18 @@
{
"version": 2,
"parameters": {
"decodelevel": "generalized"
},
"pages": [
{
"contents": [
"4 0 R"
],
"images": [],
"label": null,
"object": "3 0 R",
"outlines": [],
"pageposfrom1": 1
}
]
}

View File

@ -0,0 +1,2 @@
qpdf: image /X1 on page 1: optimizing image reduces size from 2628 to ...
qpdf: wrote file a.pdf