aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--include/qpdf/QPDFObjectHandle.hh22
-rw-r--r--libqpdf/QPDF_Stream.cc8
3 files changed, 27 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 41c4671b..95ed40c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2022-05-17 Jay Berkenbilt <ejb@ql.org>
+
+ * Allow passing *uninitialized* (not null) objects to
+ replaceStreamData as filter and/or decode_parms to leave any
+ existing values for /Filter and /DecodeParms untouched.
+
2022-05-15 Jay Berkenbilt <ejb@ql.org>
* Add QUtil::is_long_long to test whether a string can be
diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh
index 2265459d..557330e5 100644
--- a/include/qpdf/QPDFObjectHandle.hh
+++ b/include/qpdf/QPDFObjectHandle.hh
@@ -1199,13 +1199,21 @@ class QPDFObjectHandle
QPDF_DLL
void replaceDict(QPDFObjectHandle const&);
- // Replace this stream's stream data with the given data buffer,
- // and replace the /Filter and /DecodeParms keys in the stream
- // dictionary with the given values. (If either value is empty,
- // the corresponding key is removed.) The stream's /Length key is
- // replaced with the length of the data buffer. The stream is
- // interpreted as if the data read from the file, after any
- // decryption filters have been applied, is as presented.
+ // REPLACING STREAM DATA
+
+ // Note about all replaceStreamData methods: whatever values are
+ // passed as filter and decode_parms will overwrite /Filter and
+ // /DecodeParms in the stream. Passing a null object
+ // (QPDFObjectHandle::newNull()) will remove those values from the
+ // stream dictionary. From qpdf 11, passing an *uninitialized*
+ // QPDFObjectHandle (QPDFObjectHandle()) will leave any existing
+ // values untouched.
+
+ // Replace this stream's stream data with the given data buffer.
+ // The stream's /Length key is replaced with the length of the
+ // data buffer. The stream is interpreted as if the data read from
+ // the file, after any decryption filters have been applied, is as
+ // presented.
QPDF_DLL
void replaceStreamData(
std::shared_ptr<Buffer> data,
diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc
index c6f0d873..11dbe7e3 100644
--- a/libqpdf/QPDF_Stream.cc
+++ b/libqpdf/QPDF_Stream.cc
@@ -725,8 +725,12 @@ QPDF_Stream::replaceFilterData(
QPDFObjectHandle const& decode_parms,
size_t length)
{
- this->stream_dict.replaceKey("/Filter", filter);
- this->stream_dict.replaceKey("/DecodeParms", decode_parms);
+ if (filter.isInitialized()) {
+ this->stream_dict.replaceKey("/Filter", filter);
+ }
+ if (decode_parms.isInitialized()) {
+ this->stream_dict.replaceKey("/DecodeParms", decode_parms);
+ }
if (length == 0) {
QTC::TC("qpdf", "QPDF_Stream unknown stream length");
this->stream_dict.removeKey("/Length");