diff options
author | Jay Berkenbilt <ejb@ql.org> | 2017-07-28 05:42:27 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2017-07-28 05:42:27 +0200 |
commit | 7f8892525f897b17049f9e59bc4ce8ac28c9e082 (patch) | |
tree | 8f46d2ac355e8245cb2e0c764ebe0b34923e3494 /libqpdf/QPDFWriter.cc | |
parent | 428d96dfe19da96ac4759b190f5b25cf75ecdac6 (diff) | |
download | qpdf-7f8892525f897b17049f9e59bc4ce8ac28c9e082.tar.zst |
Add precheck streams capability
When requested, QPDFWriter will do more aggress prechecking of streams
to make sure it can actually succeed in decoding them before
attempting to do so. This will allow preservation of raw data even
when the raw data is corrupted relative to the specified filters.
Diffstat (limited to 'libqpdf/QPDFWriter.cc')
-rw-r--r-- | libqpdf/QPDFWriter.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 01748fc7..59e306fc 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -57,6 +57,7 @@ QPDFWriter::init() stream_data_mode_set = false; stream_data_mode = qpdf_s_compress; qdf_mode = false; + precheck_streams = false; static_id = false; suppress_original_object_ids = false; direct_stream_lengths = true; @@ -177,6 +178,12 @@ QPDFWriter::setQDFMode(bool val) } void +QPDFWriter::setPrecheckStreams(bool val) +{ + this->precheck_streams = val; +} + +void QPDFWriter::setMinimumPDFVersion(std::string const& version) { setMinimumPDFVersion(version, 0); @@ -1522,6 +1529,21 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, flags |= f_stream; + if (filter && this->precheck_streams) + { + try + { + QTC::TC("qpdf", "QPDFWriter precheck stream"); + Pl_Discard discard; + filter = object.pipeStreamData( + &discard, true, false, false, true); + } + catch (std::exception) + { + filter = false; + } + } + pushPipeline(new Pl_Buffer("stream data")); activatePipelineStack(); bool filtered = |