diff --git a/ChangeLog b/ChangeLog index 35a41ec0..6b726fc5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ 2023-12-20 Jay Berkenbilt - * Bug fix: with --compress-streams=n, don't compress object or - XRef streams. + * Bug fix: with --compress-streams=n, don't compress object, XRef, + or linearization hint streams. 2023-12-16 Jay Berkenbilt diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index ffe07559..392a153a 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -745,9 +745,10 @@ class QPDF std::map const& obj_renumber, std::shared_ptr& hint_stream, int& S, - int& O) + int& O, + bool compressed) { - return qpdf.generateHintStream(xref, lengths, obj_renumber, hint_stream, S, O); + return qpdf.generateHintStream(xref, lengths, obj_renumber, hint_stream, S, O, compressed); } static void @@ -1094,7 +1095,8 @@ class QPDF std::map const& obj_renumber, std::shared_ptr& hint_stream, int& S, - int& O); + int& O, + bool compressed); // Map object to object stream that contains it void getObjectStreamData(std::map&); diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 3085e6c0..981fc755 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -2289,15 +2289,20 @@ QPDFWriter::writeHintStream(int hint_id) std::shared_ptr hint_buffer; int S = 0; int O = 0; + bool compressed = (m->compress_streams && !m->qdf_mode); QPDF::Writer::generateHintStream( - m->pdf, m->xref, m->lengths, m->obj_renumber_no_gen, hint_buffer, S, O); + m->pdf, m->xref, m->lengths, m->obj_renumber_no_gen, hint_buffer, S, O, compressed); openObject(hint_id); setDataKey(hint_id); size_t hlen = hint_buffer->getSize(); - writeString("<< /Filter /FlateDecode /S "); + writeString("<< "); + if (compressed) { + writeString("/Filter /FlateDecode "); + } + writeString("/S "); writeString(std::to_string(S)); if (O) { writeString(" /O "); diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc index 469b9933..1657d54a 100644 --- a/libqpdf/QPDF_linearization.cc +++ b/libqpdf/QPDF_linearization.cc @@ -1748,10 +1748,10 @@ QPDF::writeHSharedObject(BitWriter& w) void QPDF::writeHGeneric(BitWriter& w, HGeneric& t) { - w.writeBitsInt(t.first_object, 32); // 1 - w.writeBits(toULL(t.first_object_offset), 32); // 2 - w.writeBitsInt(t.nobjects, 32); // 3 - w.writeBitsInt(t.group_length, 32); // 4 + w.writeBitsInt(t.first_object, 32); // 1 + w.writeBits(toULL(t.first_object_offset), 32); // 2 + w.writeBitsInt(t.nobjects, 32); // 3 + w.writeBitsInt(t.group_length, 32); // 4 } void @@ -1761,7 +1761,8 @@ QPDF::generateHintStream( std::map const& obj_renumber, std::shared_ptr& hint_buffer, int& S, - int& O) + int& O, + bool compressed) { // Populate actual hint table values calculateHPageOffset(xref, lengths, obj_renumber); @@ -1771,8 +1772,14 @@ QPDF::generateHintStream( // Write the hint stream itself into a compressed memory buffer. Write through a counter so we // can get offsets. Pl_Buffer hint_stream("hint stream"); - Pl_Flate f("compress hint stream", &hint_stream, Pl_Flate::a_deflate); - Pl_Count c("count", &f); + Pipeline* next = &hint_stream; + std::shared_ptr flate; + if (compressed) { + flate = + std::make_shared("compress hint stream", &hint_stream, Pl_Flate::a_deflate); + next = flate.get(); + } + Pl_Count c("count", next); BitWriter w(&c); writeHPageOffset(w); diff --git a/qpdf/qtest/qpdf/job-json-misc-options.pdf b/qpdf/qtest/qpdf/job-json-misc-options.pdf index be88f1e1..809f18d0 100644 Binary files a/qpdf/qtest/qpdf/job-json-misc-options.pdf and b/qpdf/qtest/qpdf/job-json-misc-options.pdf differ diff --git a/qpdf/qtest/qpdf/lin-special.disable.exp b/qpdf/qtest/qpdf/lin-special.disable.exp index 14c2eaef..727341b1 100644 Binary files a/qpdf/qtest/qpdf/lin-special.disable.exp and b/qpdf/qtest/qpdf/lin-special.disable.exp differ diff --git a/qpdf/qtest/qpdf/lin-special.generate.exp b/qpdf/qtest/qpdf/lin-special.generate.exp index af7cb061..545ce977 100644 Binary files a/qpdf/qtest/qpdf/lin-special.generate.exp and b/qpdf/qtest/qpdf/lin-special.generate.exp differ diff --git a/qpdf/qtest/qpdf/lin-special.preserve.exp b/qpdf/qtest/qpdf/lin-special.preserve.exp index 14c2eaef..727341b1 100644 Binary files a/qpdf/qtest/qpdf/lin-special.preserve.exp and b/qpdf/qtest/qpdf/lin-special.preserve.exp differ diff --git a/qpdf/qtest/qpdf/object-stream.disable.exp b/qpdf/qtest/qpdf/object-stream.disable.exp index a05e0485..9633275f 100644 Binary files a/qpdf/qtest/qpdf/object-stream.disable.exp and b/qpdf/qtest/qpdf/object-stream.disable.exp differ diff --git a/qpdf/qtest/qpdf/object-stream.generate.exp b/qpdf/qtest/qpdf/object-stream.generate.exp index 3b16f121..a7b4a448 100644 Binary files a/qpdf/qtest/qpdf/object-stream.generate.exp and b/qpdf/qtest/qpdf/object-stream.generate.exp differ diff --git a/qpdf/qtest/qpdf/object-stream.preserve.exp b/qpdf/qtest/qpdf/object-stream.preserve.exp index 3b16f121..a7b4a448 100644 Binary files a/qpdf/qtest/qpdf/object-stream.preserve.exp and b/qpdf/qtest/qpdf/object-stream.preserve.exp differ diff --git a/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf b/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf index 02931170..d51ffefe 100644 Binary files a/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf and b/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf differ