Commit 9ebabd19538512b6515696b164a17b90060a75c3
Committed by
Jay Berkenbilt
1 parent
0a3c5331
Add new methods QPDF::newStream
Showing
3 changed files
with
66 additions
and
12 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -382,6 +382,36 @@ class QPDF |
| 382 | 382 | QPDF_DLL |
| 383 | 383 | std::map<QPDFObjGen, QPDFXRefEntry> getXRefTable(); |
| 384 | 384 | |
| 385 | + // Public factory methods | |
| 386 | + | |
| 387 | + // Create a new stream. A subsequent call must be made to | |
| 388 | + // replaceStreamData() to provide data for the stream. The stream's | |
| 389 | + // dictionary may be retrieved by calling getDict(), and the resulting | |
| 390 | + // dictionary may be modified. Alternatively, you can create a new | |
| 391 | + // dictionary and call replaceDict to install it. | |
| 392 | + QPDF_DLL | |
| 393 | + QPDFObjectHandle newStream(); | |
| 394 | + | |
| 395 | + // Create a new stream. Use the given buffer as the stream data. The | |
| 396 | + // stream dictionary's /Length key will automatically be set to the size of | |
| 397 | + // the data buffer. If additional keys are required, the stream's | |
| 398 | + // dictionary may be retrieved by calling getDict(), and the resulting | |
| 399 | + // dictionary may be modified. This method is just a convenient wrapper | |
| 400 | + // around the newStream() and replaceStreamData(). It is a convenience | |
| 401 | + // methods for streams that require no parameters beyond the stream length. | |
| 402 | + // Note that you don't have to deal with compression yourself if you use | |
| 403 | + // QPDFWriter. By default, QPDFWriter will automatically compress | |
| 404 | + // uncompressed stream data. Example programs are provided that | |
| 405 | + // illustrate this. | |
| 406 | + QPDF_DLL | |
| 407 | + QPDFObjectHandle newStream(std::shared_ptr<Buffer> data); | |
| 408 | + | |
| 409 | + // Create new stream with data from string. This method will | |
| 410 | + // create a copy of the data rather than using the user-provided | |
| 411 | + // buffer as in the std::shared_ptr<Buffer> version of newStream. | |
| 412 | + QPDF_DLL | |
| 413 | + QPDFObjectHandle newStream(std::string const& data); | |
| 414 | + | |
| 385 | 415 | // Install this object handle as an indirect object and return an |
| 386 | 416 | // indirect reference to it. |
| 387 | 417 | QPDF_DLL | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -2002,6 +2002,31 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) |
| 2002 | 2002 | } |
| 2003 | 2003 | |
| 2004 | 2004 | QPDFObjectHandle |
| 2005 | +QPDF::newStream() | |
| 2006 | +{ | |
| 2007 | + return makeIndirectObject(QPDF_Stream::create( | |
| 2008 | + this, nextObjGen(), QPDFObjectHandle::newDictionary(), 0, 0)); | |
| 2009 | +} | |
| 2010 | + | |
| 2011 | +QPDFObjectHandle | |
| 2012 | +QPDF::newStream(std::shared_ptr<Buffer> data) | |
| 2013 | +{ | |
| 2014 | + auto result = newStream(); | |
| 2015 | + result.replaceStreamData( | |
| 2016 | + data, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull()); | |
| 2017 | + return result; | |
| 2018 | +} | |
| 2019 | + | |
| 2020 | +QPDFObjectHandle | |
| 2021 | +QPDF::newStream(std::string const& data) | |
| 2022 | +{ | |
| 2023 | + auto result = newStream(); | |
| 2024 | + result.replaceStreamData( | |
| 2025 | + data, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull()); | |
| 2026 | + return result; | |
| 2027 | +} | |
| 2028 | + | |
| 2029 | +QPDFObjectHandle | |
| 2005 | 2030 | QPDF::reserveObjectIfNotExists(QPDFObjGen const& og) |
| 2006 | 2031 | { |
| 2007 | 2032 | if (!isCached(og) && m->xref_table.count(og) == 0) { | ... | ... |
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -2165,30 +2165,29 @@ QPDFObjectHandle::newStream(QPDF* qpdf) |
| 2165 | 2165 | "attempt to create stream in null qpdf object"); |
| 2166 | 2166 | } |
| 2167 | 2167 | QTC::TC("qpdf", "QPDFObjectHandle newStream"); |
| 2168 | - QPDFObjectHandle stream_dict = newDictionary(); | |
| 2169 | - QPDFObjectHandle result = qpdf->makeIndirectObject(QPDFObjectHandle( | |
| 2170 | - QPDF_Stream::create(qpdf, QPDFObjGen(), stream_dict, 0, 0))); | |
| 2171 | - auto stream = result.asStream(); | |
| 2172 | - stream->setObjGen(result.getObjGen()); | |
| 2173 | - return result; | |
| 2168 | + return qpdf->newStream(); | |
| 2174 | 2169 | } |
| 2175 | 2170 | |
| 2176 | 2171 | QPDFObjectHandle |
| 2177 | 2172 | QPDFObjectHandle::newStream(QPDF* qpdf, std::shared_ptr<Buffer> data) |
| 2178 | 2173 | { |
| 2174 | + if (qpdf == nullptr) { | |
| 2175 | + throw std::runtime_error( | |
| 2176 | + "attempt to create stream in null qpdf object"); | |
| 2177 | + } | |
| 2179 | 2178 | QTC::TC("qpdf", "QPDFObjectHandle newStream with data"); |
| 2180 | - QPDFObjectHandle result = newStream(qpdf); | |
| 2181 | - result.replaceStreamData(data, newNull(), newNull()); | |
| 2182 | - return result; | |
| 2179 | + return qpdf->newStream(data); | |
| 2183 | 2180 | } |
| 2184 | 2181 | |
| 2185 | 2182 | QPDFObjectHandle |
| 2186 | 2183 | QPDFObjectHandle::newStream(QPDF* qpdf, std::string const& data) |
| 2187 | 2184 | { |
| 2185 | + if (qpdf == nullptr) { | |
| 2186 | + throw std::runtime_error( | |
| 2187 | + "attempt to create stream in null qpdf object"); | |
| 2188 | + } | |
| 2188 | 2189 | QTC::TC("qpdf", "QPDFObjectHandle newStream with string"); |
| 2189 | - QPDFObjectHandle result = newStream(qpdf); | |
| 2190 | - result.replaceStreamData(data, newNull(), newNull()); | |
| 2191 | - return result; | |
| 2190 | + return qpdf->newStream(data); | |
| 2192 | 2191 | } |
| 2193 | 2192 | |
| 2194 | 2193 | QPDFObjectHandle | ... | ... |