mirror of https://github.com/qpdf/qpdf.git
Merge pull request #924 from cdosborn/main
Improve --optimize-images to find images nested within XObjects
This commit is contained in:
commit
fe36ef141c
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"parameters": {
|
||||||
|
"decodelevel": "generalized"
|
||||||
|
},
|
||||||
|
"pages": [
|
||||||
|
{
|
||||||
|
"contents": [
|
||||||
|
"4 0 R"
|
||||||
|
],
|
||||||
|
"images": [],
|
||||||
|
"label": null,
|
||||||
|
"object": "3 0 R",
|
||||||
|
"outlines": [],
|
||||||
|
"pageposfrom1": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
qpdf: image /X1 on page 1: optimizing image reduces size from 2628 to ...
|
||||||
|
qpdf: wrote file a.pdf
|
Loading…
Reference in New Issue