diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh index 419cdeb..31dddc6 100644 --- a/include/qpdf/QPDFWriter.hh +++ b/include/qpdf/QPDFWriter.hh @@ -493,7 +493,7 @@ class QPDFWriter QPDFObjectHandle stream, bool& compress_stream, bool& is_metadata, - std::shared_ptr* stream_data); + std::string* stream_data); void unparseObject( QPDFObjectHandle object, int level, diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index b4380bf..5d4380f 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -1244,7 +1245,7 @@ QPDFWriter::willFilterStream( QPDFObjectHandle stream, bool& compress_stream, // out only bool& is_metadata, // out only - std::shared_ptr* stream_data) + std::string* stream_data) { compress_stream = false; is_metadata = false; @@ -1290,8 +1291,12 @@ QPDFWriter::willFilterStream( bool filtered = false; for (bool first_attempt: {true, false}) { - pushPipeline(new Pl_Buffer("stream data")); - PipelinePopper pp_stream_data(this, stream_data); + if (stream_data != nullptr) { + pushPipeline(new Pl_String("stream data", nullptr, *stream_data)); + } else { + pushPipeline(new Pl_Discard()); + } + PipelinePopper pp_stream_data(this); activatePipelineStack(pp_stream_data); try { filtered = stream.pipeStreamData( @@ -1320,6 +1325,9 @@ QPDFWriter::willFilterStream( throw std::runtime_error( "error while getting stream data for " + stream.unparse() + ": " + e.what()); } + if (stream_data) { + stream_data->clear(); + } } if (!filtered) { compress_stream = false; @@ -1545,29 +1553,28 @@ QPDFWriter::unparseObject( flags |= f_stream; bool compress_stream = false; bool is_metadata = false; - std::shared_ptr stream_data; + std::string stream_data; if (willFilterStream(object, compress_stream, is_metadata, &stream_data)) { flags |= f_filtered; } QPDFObjectHandle stream_dict = object.getDict(); - m->cur_stream_length = stream_data->getSize(); + m->cur_stream_length = stream_data.size(); if (is_metadata && m->encrypted && (!m->encrypt_metadata)) { // Don't encrypt stream data for the metadata stream m->cur_data_key.clear(); } adjustAESStreamLength(m->cur_stream_length); unparseObject(stream_dict, 0, flags, m->cur_stream_length, compress_stream); - unsigned char last_char = '\0'; + char last_char = stream_data.empty() ? '\0' : stream_data.back(); writeString("\nstream\n"); { PipelinePopper pp_enc(this); pushEncryptionFilter(pp_enc); - writeBuffer(stream_data); - last_char = m->pipeline->getLastChar(); + writeString(stream_data); } - if (m->newline_before_endstream || (m->qdf_mode && (last_char != '\n'))) { + if (m->newline_before_endstream || (m->qdf_mode && last_char != '\n')) { writeString("\n"); m->added_newline = true; } else {