aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc4
-rw-r--r--libqpdf/QPDFObjectHandle.cc22
2 files changed, 26 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 5dfc9224..023e0469 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -2596,6 +2596,10 @@ QPDF::replaceForeignIndirectObjects(
void
QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
{
+ // This method was originally written for copying foreign streams,
+ // but it is used by QPDFObjectHandle to copy streams from the
+ // same QPDF object as well.
+
QPDFObjectHandle dict = result.getDict();
QPDFObjectHandle old_dict = foreign.getDict();
if (this->m->copied_stream_data_provider == 0)
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index ceb91630..f6ba3093 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -2877,6 +2877,28 @@ QPDFObjectHandle::copyObject(std::set<QPDFObjGen>& visited,
}
}
+QPDFObjectHandle
+QPDFObjectHandle::copyStream()
+{
+ assertStream();
+ QPDFObjectHandle result = newStream(this->getOwningQPDF());
+ QPDFObjectHandle dict = result.getDict();
+ QPDFObjectHandle old_dict = getDict();
+ for (auto& iter: QPDFDictItems(old_dict))
+ {
+ if (iter.second.isIndirect())
+ {
+ dict.replaceKey(iter.first, iter.second);
+ }
+ else
+ {
+ dict.replaceKey(iter.first, iter.second.shallowCopy());
+ }
+ }
+ QPDF::StreamCopier::copyStreamData(getOwningQPDF(), result, *this);
+ return result;
+}
+
void
QPDFObjectHandle::makeDirect()
{