From 12ecd2019a3186d11ebb6083b3813ce722fb2329 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 26 Dec 2020 19:45:01 -0500 Subject: Add QPDFObjectHandle::setFilterOnWrite --- libqpdf/QPDFObjectHandle.cc | 14 ++++++++++++++ libqpdf/QPDFWriter.cc | 15 +++++++++++---- libqpdf/QPDF_Stream.cc | 13 +++++++++++++ libqpdf/qpdf/QPDF_Stream.hh | 3 +++ 4 files changed, 41 insertions(+), 4 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index e09146e4..7b36fffe 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1176,6 +1176,20 @@ QPDFObjectHandle::getDict() return dynamic_cast(obj.getPointer())->getDict(); } +void +QPDFObjectHandle::setFilterOnWrite(bool val) +{ + assertStream(); + dynamic_cast(obj.getPointer())->setFilterOnWrite(val); +} + +bool +QPDFObjectHandle::getFilterOnWrite() +{ + assertStream(); + return dynamic_cast(obj.getPointer())->getFilterOnWrite(); +} + bool QPDFObjectHandle::isDataModified() { diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 7057930b..689fef74 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -1470,6 +1470,7 @@ QPDFWriter::willFilterStream(QPDFObjectHandle stream, { compress_stream = false; is_metadata = false; + QPDFObjGen old_og = stream.getObjGen(); QPDFObjectHandle stream_dict = stream.getDict(); @@ -1481,7 +1482,13 @@ QPDFWriter::willFilterStream(QPDFObjectHandle stream, bool filter = (stream.isDataModified() || this->m->compress_streams || this->m->stream_decode_level); - if (this->m->compress_streams) + bool filter_on_write = stream.getFilterOnWrite(); + if (! filter_on_write) + { + QTC::TC("qpdf", "QPDFWriter getFilterOnWrite false"); + filter = false; + } + if (filter_on_write && this->m->compress_streams) { // Don't filter if the stream is already compressed with // FlateDecode. This way we don't make it worse if the @@ -1502,7 +1509,7 @@ QPDFWriter::willFilterStream(QPDFObjectHandle stream, } bool normalize = false; bool uncompress = false; - if (is_metadata && + if (filter_on_write && is_metadata && ((! this->m->encrypted) || (this->m->encrypt_metadata == false))) { QTC::TC("qpdf", "QPDFWriter not compressing metadata"); @@ -1510,13 +1517,13 @@ QPDFWriter::willFilterStream(QPDFObjectHandle stream, compress_stream = false; uncompress = true; } - else if (this->m->normalize_content && + else if (filter_on_write && this->m->normalize_content && this->m->normalized_streams.count(old_og)) { normalize = true; filter = true; } - else if (filter && this->m->compress_streams) + else if (filter_on_write && filter && this->m->compress_streams) { compress_stream = true; QTC::TC("qpdf", "QPDFWriter compressing uncompressed stream"); diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 8f9b4b52..05cde8d8 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -90,6 +90,7 @@ QPDF_Stream::QPDF_Stream(QPDF* qpdf, int objid, int generation, qpdf(qpdf), objid(objid), generation(generation), + filter_on_write(true), stream_dict(stream_dict), offset(offset), length(length) @@ -115,6 +116,18 @@ QPDF_Stream::registerStreamFilter( filter_factories[filter_name] = factory; } +void +QPDF_Stream::setFilterOnWrite(bool val) +{ + this->filter_on_write = val; +} + +bool +QPDF_Stream::getFilterOnWrite() const +{ + return this->filter_on_write; +} + void QPDF_Stream::releaseResolved() { diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index b11de6a2..c4fdd379 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -27,6 +27,8 @@ class QPDF_Stream: public QPDFObject virtual void setDescription(QPDF*, std::string const&); QPDFObjectHandle getDict() const; bool isDataModified() const; + void setFilterOnWrite(bool); + bool getFilterOnWrite() const; // Methods to help QPDF copy foreign streams qpdf_offset_t getOffset() const; @@ -83,6 +85,7 @@ class QPDF_Stream: public QPDFObject QPDF* qpdf; int objid; int generation; + bool filter_on_write; QPDFObjectHandle stream_dict; qpdf_offset_t offset; size_t length; -- cgit v1.2.3-54-g00ecf