From d61612a2e54d266d8fc4f55042080b780984272e Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 20 Dec 2023 11:08:36 -0500 Subject: [PATCH] Bug fix: don't compress hint streams when --compress-streams=n --- ChangeLog | 4 ++-- include/qpdf/QPDF.hh | 8 ++++--- libqpdf/QPDFWriter.cc | 9 ++++++-- libqpdf/QPDF_linearization.cc | 21 ++++++++++++------ qpdf/qtest/qpdf/job-json-misc-options.pdf | Bin 1285 -> 1288 bytes qpdf/qtest/qpdf/lin-special.disable.exp | Bin 3092 -> 3085 bytes qpdf/qtest/qpdf/lin-special.generate.exp | Bin 2849 -> 2849 bytes qpdf/qtest/qpdf/lin-special.preserve.exp | Bin 3092 -> 3085 bytes qpdf/qtest/qpdf/object-stream.disable.exp | Bin 1285 -> 1288 bytes qpdf/qtest/qpdf/object-stream.generate.exp | Bin 1373 -> 1373 bytes qpdf/qtest/qpdf/object-stream.preserve.exp | Bin 1373 -> 1373 bytes .../qtest/qpdf/replaced-stream-data-flate.pdf | Bin 1419 -> 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 - * 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 be88f1e14af432d9daf2269ed66d4e67a15ccf0c..809f18d0739e60bd973d3f366ea86f927d76adc6 100644 GIT binary patch delta 229 zcmZqW>foB7r)8m_@1YQ_U}|QmU}$8h5UZf?uVAX6@2X&EU}mhK@26m>pdX@OXlQIO zG2*P9rGbJ02q@$!aDf>H1{TJ~7-E)2W|(58W|NZ{4VjFLCQoBrA04b^lbV-a zlA&N`s$gfwRa{b(nwZPQz`(%5z`$e)q!}1XK_mn~*~~y5P#z9IYzSYDf&I}RmJ1A< P=Q6!uWHg@K#!?Re*ElNb delta 226 zcmeC+YUP@sr)8?3@1YQ_U}|QmU}$Ke5UZf?uK*NtRWLL#Gf>d?Q!rG}4*^OUnNN&3 zYiD7uU;qLNc?w)$hJk^Fu>ppdrI9hFn5psPWJW_KL(9q27}rO*W#*Km7Afev1D^^GFg-tQxWWF{;i5)H2G>Rwq0I}JUNABmOzvc<2LKzaKV1L- diff --git a/qpdf/qtest/qpdf/lin-special.disable.exp b/qpdf/qtest/qpdf/lin-special.disable.exp index 14c2eaefd9a99eac17b2b2db9f183fb0dda308b2..727341b1a858b36bc6100b67c2d7fd92706e92fb 100644 GIT binary patch delta 610 zcmZvZy-ve05P;n#5C{uG0(IjiCPaKr{I^srl`;SwU;;5zB7}turF;4SR05?NkHL-v zGcSV>JJ)nUJx)IR?(_N1KF@oz-qX>c(~#tF1x6Xb%)vDzLr@Zu0ico|k~5%)3s4mB zeEE56Gmr~`3gXs~(pk-zx46nsriwAl3}@ChkDauOwt4To)#sosBqv2xPVT@X^!xF{ zWL%8yVR%kIuWIVkhIJZ?SOpu^EOt?Q(lq(bbA zXcqoRF+8QDaZ%kYtGuoSqo}4%tUMc2=@`po%9vKHWoVG+vxc=1osn(6`cJ>n8&+6J h#~C_y8Kp9I8I@}GFDi8`PO41vBKkk(eKX&h{sMGxcfJ4s delta 595 zcmeB`m?AMjPsh?oLEl3mTEWc7Ou^99R3TPD-(SJVKtbPC!O+OiOhMmI!Bjy%M8U|+ z*mz>pnKTPS1p^RJ$W!0~GYkwYEQ~P3EX^&@#S9IMEiuFlO^q?dEKDZ%Fd8!%nM^*& zxUb$VGp8iANI~B%C$S{eB{exeB~?K`Si#g>LEk4eFTEr~!Q5QI&W@|Nq$o8pm#bn< zaza7^(;_9dG&Z(2XC4_I1BN7H;|&avI=oEsl1I|IxmGUSy{x)oiFHGz1E(Gv+qd%$ zvv@l!56*fbd80aVpOnFm-%Px$3?CzT)VNafHh*WzVD|@x1e&)EjSWpP#7qngFvLua zF@nr+vLK^yy`i}|M!*?bn3-dkU}=tFlaYZXrkJ56hV4d1rWm#x8JmJ4!WShLjf^cZ U6`Gh~T4IVt%*?=SaxZrS04Uao)Bpeg diff --git a/qpdf/qtest/qpdf/lin-special.generate.exp b/qpdf/qtest/qpdf/lin-special.generate.exp index af7cb0614ef1658e7075d402a76fa5c2b582986b..545ce977f26df11601cc451e3d887e17f82f8b79 100644 GIT binary patch delta 139 zcmZ1|woq(CBU62_f~mQJzE5gidP#9anKlQEFl?7Xt$W6A+bvNQOfUAU*_u z*h~z}Kn_a-!;S+CA^NNiS`NOh0#G(kf)j|UKnj4E6^I!au!5<%g1%2`UV2G}f|-SaogG(k zNl|KIE?32zJJ)nUJx)IR?(_N1KF@oz-qX>c(~#tF1x6Xb%)vDzLr@Zu0ico|k~5%)3s4mB zeEE56Gmr~`3gXs~(pk-zx46nsriwAl3}@ChkDauOwt4To)#sosBqv2xPVT@X^!xF{ zWL%8yVR%kIuWIVkhIJZ?SOpu^EOt?Q(lq(bbA zXcqoRF+8QDaZ%kYtGuoSqo}4%tUMc2=@`po%9vKHWoVG+vxc=1osn(6`cJ>n8&+6J h#~C_y8Kp9I8I@}GFDi8`PO41vBKkk(eKX&h{sMGxcfJ4s delta 595 zcmeB`m?AMjPsh?oLEl3mTEWc7Ou^99R3TPD-(SJVKtbPC!O+OiOhMmI!Bjy%M8U|+ z*mz>pnKTPS1p^RJ$W!0~GYkwYEQ~P3EX^&@#S9IMEiuFlO^q?dEKDZ%Fd8!%nM^*& zxUb$VGp8iANI~B%C$S{eB{exeB~?K`Si#g>LEk4eFTEr~!Q5QI&W@|Nq$o8pm#bn< zaza7^(;_9dG&Z(2XC4_I1BN7H;|&avI=oEsl1I|IxmGUSy{x)oiFHGz1E(Gv+qd%$ zvv@l!56*fbd80aVpOnFm-%Px$3?CzT)VNafHh*WzVD|@x1e&)EjSWpP#7qngFvLua zF@nr+vLK^yy`i}|M!*?bn3-dkU}=tFlaYZXrkJ56hV4d1rWm#x8JmJ4!WShLjf^cZ U6`Gh~T4IVt%*?=SaxZrS04Uao)Bpeg diff --git a/qpdf/qtest/qpdf/object-stream.disable.exp b/qpdf/qtest/qpdf/object-stream.disable.exp index a05e04853721f5529e8881060c2ff855339cf9e5..9633275fc9c960ed0a2e56e29bc96064528433fa 100644 GIT binary patch delta 229 zcmZqW>foB7r)8m_@1YQ_U}|QmU}$8h5UZf?uVAX6@2X&EU}mhK@26m>pdX@OXlQIO zG2*P9rGbJ02q@$!aDf>H1{TJ~m|{S!=;|!Z4JIcu8ZsFfO`gWMJ~~*z*i1p+Cp9m< zBtyZ>RKd=UtGJ{nH8Gcqfq{XAfq}^qNHZ{&f=CE}vYCNApgbIa*bu%P1N$SU><d?Q!rG}4*^OUnNN&3 zYiD7uU;qLNc?w)$hJk^Fu>qzSP%FAROEdGy$&7|fhL)43F|Lnr%giZBEmF{T%SkLr zbxBRmPf1nK4^}WXQ_%NG%}X!IP%tr6u(RVTE-6Y)%;l<>lbn!{keHCLDTRUQSP+{< p!={;%2R;=XV0wPqaD#o)secC;7@YZ-=WkxX^n#JmU~(r*JpdrvKe7M- diff --git a/qpdf/qtest/qpdf/object-stream.generate.exp b/qpdf/qtest/qpdf/object-stream.generate.exp index 3b16f12147d40e8f3e21274115cad2fb7f71fb38..a7b4a44827feda3081474111dd7ac9e1d2eb395e 100644 GIT binary patch delta 103 zcmcc1b(d>{9aB`Wg0Y!`zE5gidP#pPEKpLnPj2ReW88}QBW-@G^!E}@f00^NEzW@LL delta 103 zcmcc1b(d>{9aEHBW==_Jk%GQkPGU)_OKNg{N~(f>u!6Cfg1%2`UV2G}f{C$$ogG(k zNl|KIE?32zO2Jusm6?k+)g4(#Cjwpk|ZsBB+`r+7?Q3rJ8Yi8 Hbd(7IvqT>` diff --git a/qpdf/qtest/qpdf/object-stream.preserve.exp b/qpdf/qtest/qpdf/object-stream.preserve.exp index 3b16f12147d40e8f3e21274115cad2fb7f71fb38..a7b4a44827feda3081474111dd7ac9e1d2eb395e 100644 GIT binary patch delta 103 zcmcc1b(d>{9aB`Wg0Y!`zE5gidP#pPEKpLnPj2ReW88}QBW-@G^!E}@f00^NEzW@LL delta 103 zcmcc1b(d>{9aEHBW==_Jk%GQkPGU)_OKNg{N~(f>u!6Cfg1%2`UV2G}f{C$$ogG(k zNl|KIE?32zO2Jusm6?k+)g4(#Cjwpk|ZsBB+`r+7?Q3rJ8Yi8 Hbd(7IvqT>` diff --git a/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf b/qpdf/qtest/qpdf/replaced-stream-data-flate.pdf index 029311702ca07a4df91a8e8e6d5153a435b600a7..d51ffefe74b9585b04ba3eba9702b50b3d2ab849 100644 GIT binary patch delta 248 zcmeC??&F@It8HYYpzom&tzc?ls$ghjs1U25@2_B{pzo?+Xkc!spzo((sGuJLlrk}y z7;(vExZ5# delta 249 zcmeCR3dF^OWh%Fxi*6zGC_0LRNh%>V!Z