From 3f3dbe22eaae56df48af304c35a1c0b5dd976135 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 22 Aug 2019 13:20:36 -0400 Subject: [PATCH] Remove array null flattening For some reason, qpdf from the beginning was replacing indirect references to null with literal null in arrays even after removing the old behavior of flattening scalar references. This seems like a bad idea. --- ChangeLog | 5 ++ libqpdf/QPDFWriter.cc | 8 +-- qpdf/qpdf.testcov | 1 - .../qtest/qpdf/dangling-refs-dangling-out.pdf | Bin 893 -> 934 bytes qpdf/qtest/qpdf/merge-three-files-1.pdf | Bin 8396 -> 8699 bytes qpdf/qtest/qpdf/three-files-collate-out.pdf | 62 +++++++++++------- 6 files changed, 46 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index d52a51b4..801cf03b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-08-22 Jay Berkenbilt + + * Stop replacing indirect references to null with literal null in + arrays when writing output with QPDFWriter. + 2019-08-19 Jay Berkenbilt * Accept (and warn for) extraneous whitespace preceding the xref diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 2df18452..6c92338d 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -2390,13 +2390,7 @@ QPDFWriter::prepareFileForWrite() for (int i = 0; i < nitems; ++i) { QPDFObjectHandle oh = node.getArrayItem(i); - if (oh.isIndirect() && oh.isNull()) - { - QTC::TC("qpdf", "QPDFWriter flatten array null"); - oh.makeDirect(); - node.setArrayItem(i, oh); - } - else if (! oh.isScalar()) + if (! oh.isScalar()) { queue.push_back(oh); } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index f1acee76..e8e5bf3e 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -27,7 +27,6 @@ QPDF lin outlines in part 1 QPDF lin nshared_total > nshared_first_page 1 QPDF lin part 8 empty 1 QPDF lin check shared past first page 0 -QPDFWriter flatten array null 0 main QTest implicit 0 main QTest indirect 1 main QTest null 0 diff --git a/qpdf/qtest/qpdf/dangling-refs-dangling-out.pdf b/qpdf/qtest/qpdf/dangling-refs-dangling-out.pdf index 96f810689ec22b1301cb079e30eba2cda4dc59f4..8ca87ebef7f4a865879033234b52b5f61cffc24b 100644 GIT binary patch delta 359 zcmey%wv2s(mbQ_CfkKdijg5kSWoog4F_>p(rx2^4ACQ<17ts$iR4|zsqNbTwnv=to znwOHFl*I*745C4ro%2icN)!wg^u04viWQ<2OeglsF`7(VCoX1+qAIT>HLs*t!EEAf zbrXnX`a!A1`K3k4K)XN&x#a`R0W%C0%wew44=Bn{4o)pmu$XMdD930vIh3)K(R}i0 z#wY84qk5oKAfS+^zy)R)7#JF35wkSGP-kRlfgxsWW{4qXVs42cW@=#u a5u5yjNfGE0DdtEnGea{jRaIAiH!c904OUzL delta 332 zcmZ3+{+DfnmR4SAPL6_&je>qOlLPnIpMOEls&pRbBnvxB%TfQP%(f diff --git a/qpdf/qtest/qpdf/merge-three-files-1.pdf b/qpdf/qtest/qpdf/merge-three-files-1.pdf index d90b97d77f544248e0aba16c7d4e59005edd927c..42e84a2245da64e02583c877378767c4f0e7c131 100644 GIT binary patch literal 8699 zcmc&)&2Jk;6fdnJg(a1cKzym7p(0WdB)dB^`-MW)HmTLnrcIr+1)>Tz@g_BO?Bd;& zzzJ3A5vk(9i393^KcM1>#HEK+6sdgnhEz^mxK-i?y!rCZ?yL-{T@uNT{dVTP-@K1s z-ppitex^3zP7-VUn?JArWx2>fo#pqesVQWi+Q?eXc9J3t!aB0&2B5wV8F4==&<={Sp9oi&(cCG7@VFI%Eo_jG5YodFEH*6gMk zqGINW7(RQtmY#`R4YN{I!%?9(7&nE}`J>>5Ze|H`6i}}8eT;Xk30EYE(p)d@} z_&1@$6-r#81q&@$XgQB;u~ZhcR9h(1S42pWJ(IxNmXJ_nzxmeNsJ+o@X>XuTI0MUE z;NHN}sV9@oo@?ggZUWwu!xo!aD?tZl(?3#3iV2ALYp6m$q>ex<_3s-n0Oe`b9 zaQZ$9JRhP92#coYyUAr0I|*a4n_P-70yY5RDkMrn9}LXv3d3}#oxuX3C}b|oC5>i$ zq_fFO!9hO6FNm;)M>?sVq@9iK3Iv1IMh(=64=%zYsyv0eot1?I+$SQ;M0prBudv4^ zB9RaFjv!*TO++%Ib_5Z#Z6G3|N_NIaywFWZqGERll1})&+$OSocO-6{08KB+G8!Bb z5%i&#+Y*q+Obu#{5t;a7QdxGKluc+uV}e1T6^UJv6cN-igxnegn$F>QjtPp}VQ7`q zPKHLLgLtiy{EH;X1T*riFO3(Y9wY1N=hCgD9Pm9@)zQq`c!&QPvPc7uo4 z<8~uP?j&zaT^Bl2P}`>sZ;>-#BqEVUJ1OY;{=i8V8?M*1Bb-KA+-*8p?5?i-3&aUK?um=e!wbPGLKS-fl`~{1ZugExUlg4dCBa zmcX8{){3)aCRt&dHP}3*SvQH-tt22S&Ie@C!KX)O_uTmIlaIF!z4+3|)-R)5 z_Ux;-&N+7$M{oVs-Ft8Mu3w+Eo`KDqoU68RI-ehj(}efg_OYaOImwzUF|v=g!D_R; zhU|0A_ThHg%mpXob=Vu$T-dX2EN6V9$Wj!(i%jLZ^1UAK(b>w2-9yg@I!O-I2S4OK zc*T0o^np%=LpA(;ZuoU;pJABy)~Y^+YWU~eaLsz&G^{tVLpA(kZupe-f@zqMczMN; zFN5d#jh}j!fB)24FfB9ESC*^H*~$;>fJCpb)4aaunbFw=C)mAz&(&*Bj_m#W`tAF- zzrMNe>Xn=K7e}U#&t1Lt>d4*4CwJ|Ce=ISL>%C@PWsA-AB%P>tfLHt0*?+1oqEpDw z7x-AdzzbsybAdXI4BdE|8-HhP#Wb!renU4-a^q*mmQCY2YxOnG4)C^@S6_Vf<&k5b zUAZ{=^sfDLW3g#lC$7G>A0(%r$QM2{_O4-^cdx3TRP79Pz6~W4l~H6sea%U zcj;{~@BGz@)I!Amhix_L{PY@5_}$P!LBO3aj?#;p1htEiaM>v~xcEY++W;qH>15&K zvdTV)J)L$WIEl?%xpthb&~Q(xy-g7sk3OE{u5`BRNgiqDw1Ovfu27zoQLIKQ94Yfw z?Y8>FT_tO{ZM-_gC}?sMS`Dp)MmSQITUAOzkok>8v~6fQ4Jl}HpV}Xq#9xI*CLG>& ziNH0DXjuz^RrFL4swSi$tg5ihZnA2@rHf<1zE=Jq-}9h*Ttz*Z3w~ffsNIuc9~@qi z5q8K^lFE(;$5GE5$F8}`a{~`TRMHo*3(TU7z(Io{!|ZCaG>!y7Q6-tr{z{Z( z75dA z`25f@?S|~6t++Nn3XB{NTy_ms92elg@IinhBSrx+^En`TU1r_5*@Ck$b{Smnbl5*m z@PD#cXnvFcpCNm81}#kym%3hreMq4&3L=6bem?doAtAv*e$I@Bjb+ literal 8396 zcmc&)&2Lmy6h}yt`Yefw#;>5c5}RP8eeZs}FH;H7GND4Dv<1|L=xgV-j7(>6-YZsD zhJ>XFapB5^Vc{P@T$;FHQ6eVz$<7293M@w-tLHy$r z>uU*Ggpc@}S+ws}WY4DvqXP%viQDFp-N|jFXrp|bTeP{18$D@EkuO}yc_sfe8-vA^ zb9|)0H`A`i$UdFKUGT!3AS&0e@Xco&eHEf}gHef?)f3n@Te5c#Yua;vkY6oJEI0}Q1P@< zgNN3lRy{&^T*y+4L6?Ht9x_mPD?%e(WKxoXgQJ=JQ)dU&uo9eVks=hNIjfX~1#KBq8;z#IyL`FK)?*YKXd z=ATjUOC$9e#955QOn+p+~rQ~?rT20R**Wrn5rZF7-YRxE( zr{ZOPCWA9ll6K-~&D!`PvF^^z-u{p-IONpu^sejQfBMPh!Ixhd+Wd8R)1Kac^Q?1w zVfg0no!xhL?)dF_>p3{1skzx{P5(|g93`<3)b`Q1c_~gC%Mr4Vv>9Ce}|XbyhNbMTt=f|&!I zh6ft>hdl5b)*dskPPPLL{7W9VX1!A%je|J;rI z$7j~O8Ch4uRpIOm4!;M{JM5I`FLru(dfxGO?%j3e>eEBJ|G9SS-mPzL?74FJ#=V81 z$zwBDuI?YY^W^xBy&sIkW^n#ZkmWn?vW3Q4oQ%!2fk1oq*#mVK)rIT87x+ZJ!1E(@ zbAdXI3_N&}2Y+{D*$l3W&w&T0dGIqMOJ;DLwR#5U_jFsUt1rL)>hRIeFJBmbcE{eC zk;sg#6IajJ4^z`mA%|ck(l5Mwl5} zC$RrJwoYM>h((yrREiN<&_6-n>9X^8k3GI=rd21ed})tFh6v?+e;LAbHjx+DV-@oB z3gx1BVW;bs@)vl7rm3TP3ahl&<{vo4T0 zq5F)B-TPfXy9$Q{tlpF`%Bx>>DyRZ1Z-6;q^QOBObe*>fh(Y(yA%2q#xAi!1knf8e z%S0AMe|9EOxcHqkWb%BwQ-@p!;(KFs5;D!Nj-KlE52aMz;r@<0AM97B41haRFxR)rTCd4+%hno zEw=znoqMaWsH!4cF8Ga3yka@Xr4}3<)gSU)m%3;Lb!`|#6#ql5u8nxW$0Zx(O0Q&N zA?$6*=J}9;k}YsdTL}DK8i$?Gh=B?J-YxpWG%(^~m*4S}#(B`oWm^ENFWbV<7)LNC z?4myc=WfHsTyq>8`i*hE3tL?B7xLcE1;=6eP{8u&)8 z;I6=!%N+jOR?#2B{F|y|BPM1>17m-gYvzS{=6*20!WMW&PFWZj_*`tpaEV#F&;&;Q zTowSW6xZf@jv2!z=G>sdR#D^N&d8tV1je3w#H=gWUZY+-H#Fz^%)kftL&jX+(PN~Y zsL_O5AO8F1T)WNxCxFlv^No*V;1Fa_Poc#LiWzo8;z9m`&<`o00rQB*C=Dp_L-)Xc ZkKn)1z=tCQED~ 12: /FitV 100) @@ -793,14 +793,14 @@ endobj << /Count 1 /Dest [ - null + 57 0 R /XYZ null null null ] - /First 59 0 R - /Last 59 0 R + /First 60 0 R + /Last 60 0 R /Parent 19 0 R /Prev 53 0 R /Title (Isosicle 1.1.2 -> 12: /XYZ null null null) @@ -843,17 +843,22 @@ endobj >> endobj -%% Original object ID: 44 0 +%% Original object ID: 12 0 57 0 obj +null +endobj + +%% Original object ID: 44 0 +58 0 obj << /Dest [ - null + 61 0 R /XYZ null null null ] - /Next 58 0 R + /Next 59 0 R /Parent 53 0 R /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null) /Type /Outline @@ -861,7 +866,7 @@ endobj endobj %% Original object ID: 45 0 -58 0 obj +59 0 obj << /Dest [ null @@ -871,17 +876,17 @@ endobj null ] /Parent 53 0 R - /Prev 57 0 R + /Prev 58 0 R /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null) /Type /Outline >> endobj %% Original object ID: 46 0 -59 0 obj +60 0 obj << /Dest [ - null + 62 0 R /XYZ null null @@ -893,8 +898,18 @@ endobj >> endobj +%% Original object ID: 15 0 +61 0 obj +null +endobj + +%% Original object ID: 17 0 +62 0 obj +null +endobj + xref -0 60 +0 63 0000000000 65535 f 0000000052 00000 n 0000000853 00000 n @@ -949,17 +964,20 @@ xref 0000007949 00000 n 0000008052 00000 n 0000008100 00000 n -0000008327 00000 n -0000008581 00000 n -0000008801 00000 n -0000009014 00000 n -0000009228 00000 n -0000009442 00000 n +0000008329 00000 n +0000008585 00000 n +0000008805 00000 n +0000009018 00000 n +0000009068 00000 n +0000009284 00000 n +0000009498 00000 n +0000009699 00000 n +0000009749 00000 n trailer << /Root 1 0 R - /Size 60 + /Size 63 /ID [<31415926535897932384626433832795>] >> startxref -9613 +9771 %%EOF