Commit d61612a2e54d266d8fc4f55042080b780984272e

Authored by Jay Berkenbilt
1 parent c5f622a0

Bug fix: don't compress hint streams when --compress-streams=n

ChangeLog
1 2023-12-20 Jay Berkenbilt <ejb@ql.org> 1 2023-12-20 Jay Berkenbilt <ejb@ql.org>
2 2
3 - * Bug fix: with --compress-streams=n, don't compress object or  
4 - XRef streams. 3 + * Bug fix: with --compress-streams=n, don't compress object, XRef,
  4 + or linearization hint streams.
5 5
6 2023-12-16 Jay Berkenbilt <ejb@ql.org> 6 2023-12-16 Jay Berkenbilt <ejb@ql.org>
7 7
include/qpdf/QPDF.hh
@@ -745,9 +745,10 @@ class QPDF @@ -745,9 +745,10 @@ class QPDF
745 std::map<int, int> const& obj_renumber, 745 std::map<int, int> const& obj_renumber,
746 std::shared_ptr<Buffer>& hint_stream, 746 std::shared_ptr<Buffer>& hint_stream,
747 int& S, 747 int& S,
748 - int& O) 748 + int& O,
  749 + bool compressed)
749 { 750 {
750 - return qpdf.generateHintStream(xref, lengths, obj_renumber, hint_stream, S, O); 751 + return qpdf.generateHintStream(xref, lengths, obj_renumber, hint_stream, S, O, compressed);
751 } 752 }
752 753
753 static void 754 static void
@@ -1094,7 +1095,8 @@ class QPDF @@ -1094,7 +1095,8 @@ class QPDF
1094 std::map<int, int> const& obj_renumber, 1095 std::map<int, int> const& obj_renumber,
1095 std::shared_ptr<Buffer>& hint_stream, 1096 std::shared_ptr<Buffer>& hint_stream,
1096 int& S, 1097 int& S,
1097 - int& O); 1098 + int& O,
  1099 + bool compressed);
1098 1100
1099 // Map object to object stream that contains it 1101 // Map object to object stream that contains it
1100 void getObjectStreamData(std::map<int, int>&); 1102 void getObjectStreamData(std::map<int, int>&);
libqpdf/QPDFWriter.cc
@@ -2289,15 +2289,20 @@ QPDFWriter::writeHintStream(int hint_id) @@ -2289,15 +2289,20 @@ QPDFWriter::writeHintStream(int hint_id)
2289 std::shared_ptr<Buffer> hint_buffer; 2289 std::shared_ptr<Buffer> hint_buffer;
2290 int S = 0; 2290 int S = 0;
2291 int O = 0; 2291 int O = 0;
  2292 + bool compressed = (m->compress_streams && !m->qdf_mode);
2292 QPDF::Writer::generateHintStream( 2293 QPDF::Writer::generateHintStream(
2293 - m->pdf, m->xref, m->lengths, m->obj_renumber_no_gen, hint_buffer, S, O); 2294 + m->pdf, m->xref, m->lengths, m->obj_renumber_no_gen, hint_buffer, S, O, compressed);
2294 2295
2295 openObject(hint_id); 2296 openObject(hint_id);
2296 setDataKey(hint_id); 2297 setDataKey(hint_id);
2297 2298
2298 size_t hlen = hint_buffer->getSize(); 2299 size_t hlen = hint_buffer->getSize();
2299 2300
2300 - writeString("<< /Filter /FlateDecode /S "); 2301 + writeString("<< ");
  2302 + if (compressed) {
  2303 + writeString("/Filter /FlateDecode ");
  2304 + }
  2305 + writeString("/S ");
2301 writeString(std::to_string(S)); 2306 writeString(std::to_string(S));
2302 if (O) { 2307 if (O) {
2303 writeString(" /O "); 2308 writeString(" /O ");
libqpdf/QPDF_linearization.cc
@@ -1748,10 +1748,10 @@ QPDF::writeHSharedObject(BitWriter&amp; w) @@ -1748,10 +1748,10 @@ QPDF::writeHSharedObject(BitWriter&amp; w)
1748 void 1748 void
1749 QPDF::writeHGeneric(BitWriter& w, HGeneric& t) 1749 QPDF::writeHGeneric(BitWriter& w, HGeneric& t)
1750 { 1750 {
1751 - w.writeBitsInt(t.first_object, 32); // 1  
1752 - w.writeBits(toULL(t.first_object_offset), 32); // 2  
1753 - w.writeBitsInt(t.nobjects, 32); // 3  
1754 - w.writeBitsInt(t.group_length, 32); // 4 1751 + w.writeBitsInt(t.first_object, 32); // 1
  1752 + w.writeBits(toULL(t.first_object_offset), 32); // 2
  1753 + w.writeBitsInt(t.nobjects, 32); // 3
  1754 + w.writeBitsInt(t.group_length, 32); // 4
1755 } 1755 }
1756 1756
1757 void 1757 void
@@ -1761,7 +1761,8 @@ QPDF::generateHintStream( @@ -1761,7 +1761,8 @@ QPDF::generateHintStream(
1761 std::map<int, int> const& obj_renumber, 1761 std::map<int, int> const& obj_renumber,
1762 std::shared_ptr<Buffer>& hint_buffer, 1762 std::shared_ptr<Buffer>& hint_buffer,
1763 int& S, 1763 int& S,
1764 - int& O) 1764 + int& O,
  1765 + bool compressed)
1765 { 1766 {
1766 // Populate actual hint table values 1767 // Populate actual hint table values
1767 calculateHPageOffset(xref, lengths, obj_renumber); 1768 calculateHPageOffset(xref, lengths, obj_renumber);
@@ -1771,8 +1772,14 @@ QPDF::generateHintStream( @@ -1771,8 +1772,14 @@ QPDF::generateHintStream(
1771 // Write the hint stream itself into a compressed memory buffer. Write through a counter so we 1772 // Write the hint stream itself into a compressed memory buffer. Write through a counter so we
1772 // can get offsets. 1773 // can get offsets.
1773 Pl_Buffer hint_stream("hint stream"); 1774 Pl_Buffer hint_stream("hint stream");
1774 - Pl_Flate f("compress hint stream", &hint_stream, Pl_Flate::a_deflate);  
1775 - Pl_Count c("count", &f); 1775 + Pipeline* next = &hint_stream;
  1776 + std::shared_ptr<Pipeline> flate;
  1777 + if (compressed) {
  1778 + flate =
  1779 + std::make_shared<Pl_Flate>("compress hint stream", &hint_stream, Pl_Flate::a_deflate);
  1780 + next = flate.get();
  1781 + }
  1782 + Pl_Count c("count", next);
1776 BitWriter w(&c); 1783 BitWriter w(&c);
1777 1784
1778 writeHPageOffset(w); 1785 writeHPageOffset(w);
qpdf/qtest/qpdf/job-json-misc-options.pdf
No preview for this file type
qpdf/qtest/qpdf/lin-special.disable.exp
No preview for this file type
qpdf/qtest/qpdf/lin-special.generate.exp
No preview for this file type
qpdf/qtest/qpdf/lin-special.preserve.exp
No preview for this file type
qpdf/qtest/qpdf/object-stream.disable.exp
No preview for this file type
qpdf/qtest/qpdf/object-stream.generate.exp
No preview for this file type
qpdf/qtest/qpdf/object-stream.preserve.exp
No preview for this file type
qpdf/qtest/qpdf/replaced-stream-data-flate.pdf
No preview for this file type