diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 0daa066..c240a59 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -1624,14 +1625,19 @@ QPDFWriter::unparseObject( void QPDFWriter::writeObjectStreamOffsets(std::vector& offsets, int first_obj) { - for (size_t i = 0; i < offsets.size(); ++i) { - if (i != 0) { + qpdf_assert_debug(first_obj > 0); + bool is_first = true; + auto id = std::to_string(first_obj) + ' '; + for (auto& offset: offsets) { + if (is_first) { + is_first = false; + } else { writeStringQDF("\n"); writeStringNoQDF(" "); } - writeString(std::to_string(i + QIntC::to_size(first_obj))); - writeString(" "); - writeString(std::to_string(offsets.at(i))); + writeString(id); + util::increment(id, 1); + writeString(std::to_string(offset)); } writeString("\n"); } diff --git a/libqpdf/qpdf/Util.hh b/libqpdf/qpdf/Util.hh index 9f6b389..726f818 100644 --- a/libqpdf/qpdf/Util.hh +++ b/libqpdf/qpdf/Util.hh @@ -44,6 +44,21 @@ namespace qpdf::util return {'#', hexchars[static_cast(c) >> 4], hexchars[c & 0x0f]}; } + // Numerically increment a digit string. Ignore the last 'tail' characters. + inline void + increment(std::string& s, int tail = 0) + { + auto end = s.rend(); + for (auto it = s.rbegin() + tail; it != end; ++it) { + ++*it; + if (*it != ':') { + return; + } + *it = '0'; + } + s.insert(0, 1, '1'); + } + } // namespace qpdf::util #endif // UTIL_HH