summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2023-12-20 17:08:36 +0100
committerJay Berkenbilt <ejb@ql.org>2023-12-20 21:46:20 +0100
commitd61612a2e54d266d8fc4f55042080b780984272e (patch)
treeebefee30abcf242c70d55fb4b0c5841416bec7a9
parentc5f622a09e6a68d87d3591346d872cf828cf82c7 (diff)
downloadqpdf-d61612a2e54d266d8fc4f55042080b780984272e.tar.zst
Bug fix: don't compress hint streams when --compress-streams=n
-rw-r--r--ChangeLog4
-rw-r--r--include/qpdf/QPDF.hh8
-rw-r--r--libqpdf/QPDFWriter.cc9
-rw-r--r--libqpdf/QPDF_linearization.cc21
-rw-r--r--qpdf/qtest/qpdf/job-json-misc-options.pdfbin1285 -> 1288 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.disable.expbin3092 -> 3085 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.generate.expbin2849 -> 2849 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.preserve.expbin3092 -> 3085 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.disable.expbin1285 -> 1288 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.generate.expbin1373 -> 1373 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.preserve.expbin1373 -> 1373 bytes
-rw-r--r--qpdf/qtest/qpdf/replaced-stream-data-flate.pdfbin1419 -> 1422 bytes
12 files changed, 28 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 35a41ec0..6b726fc5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,7 @@
2023-12-20 Jay Berkenbilt <ejb@ql.org>
- * 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 <ejb@ql.org>
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<int, int> const& obj_renumber,
std::shared_ptr<Buffer>& 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<int, int> const& obj_renumber,
std::shared_ptr<Buffer>& hint_stream,
int& S,
- int& O);
+ int& O,
+ bool compressed);
// Map object to object stream that contains it
void getObjectStreamData(std::map<int, int>&);
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<Buffer> 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<int, int> const& obj_renumber,
std::shared_ptr<Buffer>& 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<Pipeline> flate;
+ if (compressed) {
+ flate =
+ std::make_shared<Pl_Flate>("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
--- a/qpdf/qtest/qpdf/job-json-misc-options.pdf
+++ b/qpdf/qtest/qpdf/job-json-misc-options.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.disable.exp b/qpdf/qtest/qpdf/lin-special.disable.exp
index 14c2eaef..727341b1 100644
--- a/qpdf/qtest/qpdf/lin-special.disable.exp
+++ b/qpdf/qtest/qpdf/lin-special.disable.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.generate.exp b/qpdf/qtest/qpdf/lin-special.generate.exp
index af7cb061..545ce977 100644
--- a/qpdf/qtest/qpdf/lin-special.generate.exp
+++ b/qpdf/qtest/qpdf/lin-special.generate.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.preserve.exp b/qpdf/qtest/qpdf/lin-special.preserve.exp
index 14c2eaef..727341b1 100644
--- a/qpdf/qtest/qpdf/lin-special.preserve.exp
+++ b/qpdf/qtest/qpdf/lin-special.preserve.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.disable.exp b/qpdf/qtest/qpdf/object-stream.disable.exp
index a05e0485..9633275f 100644
--- a/qpdf/qtest/qpdf/object-stream.disable.exp
+++ b/qpdf/qtest/qpdf/object-stream.disable.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.generate.exp b/qpdf/qtest/qpdf/object-stream.generate.exp
index 3b16f121..a7b4a448 100644
--- a/qpdf/qtest/qpdf/object-stream.generate.exp
+++ b/qpdf/qtest/qpdf/object-stream.generate.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.preserve.exp b/qpdf/qtest/qpdf/object-stream.preserve.exp
index 3b16f121..a7b4a448 100644
--- a/qpdf/qtest/qpdf/object-stream.preserve.exp
+++ b/qpdf/qtest/qpdf/object-stream.preserve.exp
Binary files 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
--- a/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf
+++ b/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf
Binary files differ