From 98da4fd83527f47a28132ff4a120bc043d9e58f6 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 2 Jan 2021 09:47:27 -0500 Subject: Externalize inline images now includes form XObjects --- libqpdf/QPDFPageObjectHelper.cc | 56 +++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 13 deletions(-) (limited to 'libqpdf/QPDFPageObjectHelper.cc') diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index ef563dc2..f7fcd395 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -486,20 +486,50 @@ QPDFPageObjectHelper::getFormXObjects() void QPDFPageObjectHelper::externalizeInlineImages(size_t min_size) { - QPDFObjectHandle resources = getAttribute("/Resources", true); - // Calling mergeResources also ensures that /XObject becomes - // direct and is not shared with other pages. - resources.mergeResources( - QPDFObjectHandle::parse("<< /XObject << >> >>")); - InlineImageTracker iit(this->oh.getOwningQPDF(), min_size, resources); - Pl_Buffer b("new page content"); - filterContents(&iit, &b); - if (iit.any_images) + externalizeInlineImages(min_size, false); +} + +void +QPDFPageObjectHelper::externalizeInlineImages(size_t min_size, bool shallow) +{ + if (shallow) + { + QPDFObjectHandle resources = getAttribute("/Resources", true); + // Calling mergeResources also ensures that /XObject becomes + // direct and is not shared with other pages. + resources.mergeResources( + QPDFObjectHandle::parse("<< /XObject << >> >>")); + InlineImageTracker iit(this->oh.getOwningQPDF(), min_size, resources); + Pl_Buffer b("new page content"); + filterContents(&iit, &b); + if (iit.any_images) + { + if (this->oh.isFormXObject()) + { + this->oh.replaceStreamData( + b.getBuffer(), + QPDFObjectHandle::newNull(), + QPDFObjectHandle::newNull()); + } + else + { + this->oh.replaceKey( + "/Contents", + QPDFObjectHandle::newStream( + this->oh.getOwningQPDF(), b.getBuffer())); + } + } + } + else { - getObjectHandle().replaceKey( - "/Contents", - QPDFObjectHandle::newStream( - this->oh.getOwningQPDF(), b.getBuffer())); + externalizeInlineImages(min_size, true); + forEachFormXObject( + true, + [min_size](QPDFObjectHandle& obj, + QPDFObjectHandle&, std::string const&) { + QPDFPageObjectHelper(obj).externalizeInlineImages( + min_size, true); + }); } } -- cgit v1.2.3-54-g00ecf