From 92fbc6fdf56bad6aff8c9f3f1a3032d5ad36ec51 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 21 Feb 2021 06:35:53 -0500 Subject: QPDFObjectHandle::copyStream --- libqpdf/QPDF.cc | 4 ++++ libqpdf/QPDFObjectHandle.cc | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'libqpdf') 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& 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() { -- cgit v1.2.3-70-g09d2