aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-12-27 01:45:01 +0100
committerJay Berkenbilt <ejb@ql.org>2020-12-28 18:58:19 +0100
commit12ecd2019a3186d11ebb6083b3813ce722fb2329 (patch)
treecce0595cc82bef7a66c2b8ed6d0e9bf726334500 /libqpdf
parent3f9191a34456e79ec6d98bfe46546d9df9abdcba (diff)
downloadqpdf-12ecd2019a3186d11ebb6083b3813ce722fb2329.tar.zst
Add QPDFObjectHandle::setFilterOnWrite
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFObjectHandle.cc14
-rw-r--r--libqpdf/QPDFWriter.cc15
-rw-r--r--libqpdf/QPDF_Stream.cc13
-rw-r--r--libqpdf/qpdf/QPDF_Stream.hh3
4 files changed, 41 insertions, 4 deletions
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<QPDF_Stream*>(obj.getPointer())->getDict();
}
+void
+QPDFObjectHandle::setFilterOnWrite(bool val)
+{
+ assertStream();
+ dynamic_cast<QPDF_Stream*>(obj.getPointer())->setFilterOnWrite(val);
+}
+
+bool
+QPDFObjectHandle::getFilterOnWrite()
+{
+ assertStream();
+ return dynamic_cast<QPDF_Stream*>(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)
@@ -116,6 +117,18 @@ QPDF_Stream::registerStreamFilter(
}
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()
{
this->stream_provider = 0;
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;