From d24a120c7ffb4cbfd2dcebe63577d8704442f7bd Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 10 Jan 2019 22:11:38 -0500 Subject: Add QPDF::setImmediateCopyFrom --- libqpdf/QPDF.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 772a17cd..95ae9cab 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -147,6 +147,7 @@ QPDF::Members::Members() : copied_stream_data_provider(0), reconstructed_xref(false), fixed_dangling_refs(false), + immediate_copy_from(false), first_xref_item_offset(0), uncompressed_after_compressed(false) { @@ -269,6 +270,12 @@ QPDF::setAttemptRecovery(bool val) this->m->attempt_recovery = val; } +void +QPDF::setImmediateCopyFrom(bool val) +{ + this->m->immediate_copy_from = val; +} + std::vector QPDF::getWarnings() { @@ -2376,6 +2383,19 @@ QPDF::replaceForeignIndirectObjects( } PointerHolder stream_buffer = stream->getStreamDataBuffer(); + if ((foreign_stream_qpdf->m->immediate_copy_from) && + (stream_buffer.getPointer() == 0)) + { + // Pull the stream data into a buffer before attempting + // the copy operation. Do it on the source stream so that + // if the source stream is copied multiple times, we don't + // have to keep duplicating the memory. + QTC::TC("qpdf", "QPDF immediate copy stream data"); + foreign.replaceStreamData(foreign.getRawStreamData(), + dict.getKey("/Filter"), + dict.getKey("/DecodeParms")); + stream_buffer = stream->getStreamDataBuffer(); + } PointerHolder stream_provider = stream->getStreamDataProvider(); if (stream_buffer.getPointer()) -- cgit v1.2.3-54-g00ecf