aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFPageObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-01-02 15:47:27 +0100
committerJay Berkenbilt <ejb@ql.org>2021-01-02 20:08:17 +0100
commit98da4fd83527f47a28132ff4a120bc043d9e58f6 (patch)
tree350e2b436b6ac7d43b72ac16fa29c03ee0463a3e /libqpdf/QPDFPageObjectHelper.cc
parentbedf35d6a55a9092485d56002b50bc9003ce7931 (diff)
downloadqpdf-98da4fd83527f47a28132ff4a120bc043d9e58f6.tar.zst
Externalize inline images now includes form XObjects
Diffstat (limited to 'libqpdf/QPDFPageObjectHelper.cc')
-rw-r--r--libqpdf/QPDFPageObjectHelper.cc56
1 files changed, 43 insertions, 13 deletions
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);
+ });
}
}