From 32e4359a2447c38833fe86050c39a8b46db52792 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Mon, 3 Apr 2023 16:27:04 +0100 Subject: [PATCH] more --- cpdfmanual.pdf | Bin 301426 -> 301442 bytes cpdfmanual.tex | 1 + cpdfpage.ml | 65 +++++++++++++++++++++++-------------------------- 3 files changed, 31 insertions(+), 35 deletions(-) diff --git a/cpdfmanual.pdf b/cpdfmanual.pdf index 2a84f36b26cb3017e1e84769c08bd3689603a70e..95483b05ab73e7b05acca869a7900dbce66c0e6f 100644 GIT binary patch delta 8165 zcmai$RZtvE)TVaqN#va8M+b zcDl(qw;;Mdg9t<9)!#kouH|2y{wgA|pxKx&_Kop;(y8Ui+kmm}QGzztz-OC+yAqM= zMOBu1mZ~NlrN@zankvZ+a;Bci*snFiKd|cbv?~op7b+$@^j*s`>np-|Yl;ObS2DYuK*G;`cBuAhCBN5sCQ_nu`+lAJu z%_EXXswt}e!(Xl<)%GO56`}B|5&<;=8GZm^Qb?Cc;(&qqth5ab@Q05YXTe3PX2iub z=k%aVg&6YXukF^^@EH0iHu5(fdZIJ zQ0~Rl#zHWxhIC?+XU^jl_Bk8Cgk&WQ8$&+xXUdb-!x`xd-LV z_1?ugbAIMzj`1Km(Mj8(VTiL6f36c!r=p;Z{JLgZkB2R4B#!ty8@)exR@9rIrO+NxJ-qJSjwAEy5(%Hrs zg&?!oIQ%f4E*bb!B(_~Dg45l-3r3Lt6Z=8P9oKnt6vBIx4*RK6rf(kZNS=t?$jIJf z=s>aBQRw~0C!|foIU&Z3>}vK4GIGT&m&*Y3IMn{^s=OAPdl;w3p9f)Um#sEpf0lY! z)+|1_K#1wggf@W5mut>M%o6tsY;Q-f3HS#?RLy$l?Wl-p@f^HYwEB_9Y9X_8_ODu` zBVTb#dn599Z&NXH_a9b$QPB)aZ>uf9QHMD6%m4H+$}1ir7jni_U|Ti5c5%DtcqbO< ztmC~i%BjFza`KR%>7?%#7X8w0+D0dsI0ug_vK_-C5Exlx6k4*{D4eJeEyTGLrg?;I zeEs|O@KK#!esgvEr-ON0W<+oG)iytBgqLGq9sf6xT>r4z!Kc8U#1V!ma}E&Jd2ETQNpqqI>0 zD`tHUf{fd>P2eUL72nGf-*4JgL^ESC^BmXUwO@~(o@1Df5-5~JlanJFN;>^5zFIQE z))y(O%Wr(h@%!_uO74W9Tpyvln|+1r()Qwg4ABk9{TUx|Tu%teJ2OIQQ{93?tkvh8+|HD z!XuhRK*6dM<-C>G#CUaE?I(8z9x;BtEzj~T6C7_-=>nx^JAo&pMpLMB_0tZQ7rq_J zISse6S*4XqAOM{;eKsR}M+&crsuV@NZ)z0)!^Xwh(l zr$nVt9Q{TxfeWWM$r)xu&0kC;;KjI!?3^1Tj6Lhl?N%`64pY%?PoOc}9m}Uarp~8oCgNk`0n7 zY~ZcbLk6HrW88BrGfgd|5xgN9G-XFFMsGlOTO6!;>s1uhBd<*OUN)lnowxhKT$pSx z%3JLjQvis)zb2g?W8Dd7F{}lnlh4Hw{}@wA8@oM@1d>NZrJ7yx&v^?6$HX%gdpnFN zFq#r(-34vu_;jm7I!c+nVwFp!1UeDCY??&xpKUB-%@AwvpzF_3KAF! zZnMfdisQ$(I~|_ney*u=(^pT8mgXip0htWp8{Wp zTTJ1j{N5x4WiK?A>EqLCikuW+@6-()!38!Z%_mK-CW1V}m$>)&X@hnZK8;pD#64N{ zCXFV7pMUGKj-l!4YhUP@+MaK8ORPEMWHcj$zeD}DyiU+8Gl&Z2(7`EJY$r`r_`lrqt8I@};Aq^CJP=7}+X<;vmH*6kv2y5O)4KUc zn&-Q_!CfBt+4zgB3wA(q2Z3$;6S&(pAac|fZpr=!L7+DA1Lrd9gs9j|H`1m6!|=Nf zuUYl**{QCwcH5OB-1(eZ#T}aRFn@WQ5WSIn4kn-3`QQV9E0m;|y@Z5es@u~4cmH~N z7SPUBg{uZj2?}Xf?B+LBJSb3dYE~JtqTl3yFEw;d@J~3`o0!LeXG)LpwASyCy&JjK zqASwjM~H^JPN1jtvHW&`^cT~A;}-wMwV#_q;d!X5UWt?Ou`N!eMuE-D-AOG&LE3)+ zIi;{@!!(T-HE5Y&O7=i_cyr`lU0Sf`ugB}lwx{lojRq!bfvX@|$-vgY$X?gc0@Dd| zji-N)rk>q{g>AwCOSy&vUW+EGFWG9OlM6%Vw;e#TEE)8ktwcYNMEhi=M0f*iV1;tE zP>(mx1jl+po+%@c8JOkaoycBP^b*)HM6#+r4X3-QS1$|MW(92rI`J&i9OMIjegliP zk~s7jc~RazW#CfC2)!Yv3OS>vS(6nvH8wucQ^Ktem`xG{Ha12>GM7UYrUCYA-}7`c zH7Um{8!^6SXf+~`LRSIU_5PM(0{z(wTJlwA9SAL+m1Z6rzG)z`yI*}0mu9WC$fWc6 zL-rLbsF5XWZbzGLrM?bEEnOX;4~;gxHWgyHTG^GJw>A|iNI=FT)9gjn3`{d?vL(rM zohlwS$w!x&sd=%3w4#Vud5LreI`b1@6RqgFqe9O7#=H>)Xb7wC61PsvYyeg=|yRR0i#Vl;NURq3Z>o_%&yZr%E#9MRUHn;;n-jG{EP<`5B}&cWuh`(8dR z9$qZC!YXMFJsBXxC<$6e`p^(*Z-jcAdEP1($;?^HxDb4tX$t7pLesl5w#qfLKXUFq zNm+QuGS5fxAS1X(pU>ICCZb#5^nksr-<%j`k=c^s|GanN2<#dT_U%-D2a6+l$aSVI zm-U7HWhaS_94Vb2T(x41=K5 z8=O<}c3YR6*{RLN$!la&Q|V1v!nwJqm=C`jj8`h<7RxF@_19r`^M) ziyr@3;ERhBWuYj8b%<=7)BinN77InS^irRpkdER+c`_SMySg}Z2_X^bgJSxUlXCl$ zj=k{rZ>GKy#4BwR%lvf0-+6n_+WM@& z-{?2$QB1=EtqZY)yuIadm_wA3oqQ~ z{9639*O=~)q9q(ZtsqSmX_w5e_jNLqy!?10M*ati9VPf@j@YjK#-~)eFX>=zlp`Je zlcSVx9)@7KK4VbWUDrwcQLRKJ!FG_pFPh^q{}|`;xP*1{?;F=A^ftDkHWnHlIfGie zH~M{X;`BaMbjDM{L?mfU&^yH6HT9Cgps$6tWp9EN9qQELEYYX<4*cJTzFh{^MVE_J z$nM2B`5A&y?K?^#mKrnhyG7^+8b@v6 z?Tmp+g8Gr7RYeXO?(tUzmOqt$x)vHSSL7JL9bbD6+pmh?6Vb;gFNii>r9~a5# zPaL9_I+jzs;Dil0>6ebf>ok7S9YE z)}@*<6(Xm&9l0{t{SB>NbdPmYd1RKm%g>BeTe@TIN!zXV|ZP=)>M8|1-l+p2u=xdh}q;?W4SB4k>ga^NDrV!AK_T z77OQQF&l34)D)@e57F_&Bm^XJ!s(i7Wu=9!#MG99 zxF6O@1>HNP<=JEWjQz=udm63+)?cj`>CBJ6Z&FjYerD%ET^(VMkhU$z|9~+}*r``| zzUWynNaZRJuqo_l`>UV%`usxj^E+h>7v)AIKh?R*7`)F+hO0HI^}WF^YP~vXBAktD zXu-n-eWyEJxPkUigH&xs?VevWX?Xuq0Ad4(>`gtt4AdQn>n5wZTU6X1mF2YJsc*1_ z6Qo)Z%%5M_&Nc23Oc`()d`%&L)19?@IJl6XqSy!Q->oon{g6g;k7L)18tm%3%1M!g zVSck6_C6*#K}Zo>rfT)PyT4Ci9tHUHmZ7*#(!zf(qKMte#lR}9`Hr9G`+eC;*-EOh zI-rsp%SB^L%d)F~qvyC&yAT45>ItP5*0H;?AJ^w(+(}C*l5)$#8u23PKej%?4dX@d>r{9n?%fET ziJG%CUuH?*WUA(6vCg4t{YU8D;j57Myr#oA)~qKK)#-J_?sX`cE)dcNN*}`J{5tGq zB;!wqw|5K=7Eq2lZ`eaJQr#-AM0>bmK;I=nwVWTi2v*gn!+Kijgnq$ZnSS)ckcIx# z2K8OCY6KEIANmo?;SOKoD?I3nToY(Q=W}8xyh11$L}>io&3K|}S2qGWqt;|R8Iy(FA5 z;{r={l#MV~F(~Ovf6R%()ydjazsz{?I}15yCLO6$T72LQOwvAaAUvUSPD--WXz8^U z7EgT@FjYTM(v`yJPkG64Udo69+6fm?jv1k)@b_pbTNf_M^%WfuK1Ck-q5QMZdVAfA zpjYL=f)rv0V7tA3GC_p^xQedwU1miHRDz>3~ zn(#D;#H-*>HEgL4YmVP1AEc_2&_1h*L4}a?6@w$e{*TdMi z=)~e^KpD!P8c^@|A=ExOgsPG848(AP>nl`vxik}AJsFV8q?6YQtLixF@?Psuu4kR+ zHO#WqV7ry0Sy4A2>X0xbdiWCXy5txY%%mp@=r{g0Cu0zyc@nMK_}V{3aKd$qG%lC` z`cVF;;v|d`FGivb$%)}tl;+8psR82_3$knLo5gnqiFN71&~GLfH;~6|zXx4G!Xqim zAa|q5Yu)xyl1!2kQJFQmVE6d{`Uoa4;sE^0>cYI^0YmayU7KT4`o*;_`mBy7Due)snz7c7?oA;4bnUMEa`a zUXj!z7dk!Z_A~yPt|Dn(k;h{$>~!ZomVeZ6mufEZnh|LfyxWP=F?BpZnj~$FPA<<) zUouL@7ZGPrcjx^yB;5bwcZEpyI~M$i_AJBQ7?jBJ8`32_(=*eWl&4zuYMBF_ z5(?NeXeDGOO`a0pf7YH*2908Y@j6e7QKp4lfblwWRu4ACxAJL5LtYH8eYBFe$T!Z1 z-YZUvQl^0H6nubF@`Nq{@xm(_h_!zzcEm(wFcn^dc%et*QFK=l7EQ*s<7IbLQWllP zLe=R&9++rYTr8c81n z6${AOw#NUG9u2N$8^)XD-W6XQ)Q-1@s?$HzmlHP7IBpEa zUC#A)uEVlaY!L+#OJ+Q{E8gwW_rCU!v9qC*Oe8Ub({C^6zb%L)E^$UF4Drg=3~n@S zKJW}&_EztEL#dPhb{b#=m+t3U#pdSj3y?fsJ6Q@dus(<^Pmg^xv+EnDT{85ysJ+cS z*;ga!yv$VJjCw_5%v%MZb8^aIr{bxr=#ZO|`jjU@_IdN>UBM#2Bi{)wX3 zJtdv?%<$*!OC$Z}PkLcw|0dZ^I-M6KxyxUo`ls|UZ@KCPYAhm1^tPxQr)a3x1Y%!m zKFULpR0XtujW0u^bm;{~<*oA!H)7Q7Egj^JCgj(NS7G*n_Ix>y5eEFle~O5gZ3P1q zSr6VxbQu~Bgz$HK)M53Zr$GI=a4ujRq{j-vI#FQQjart#J%Wh_HJwn~-US<06BbGE z_~ryv>&6|z=ljzSXU9Rmf4{dafEP7R3_aXfk;`vfNhk#%-><4 zbZ)xqUK<;?^^+>!>twLpQngl-;+@d?Pk=zHvRU%R`E6AMHmCCpHS>|OitY5VEdlgi zZn}(_GKr$GK=lwNy5L{hY_WmAIvVNfIe3u?%6w8iRN|HG*UWSl2sm7|%%q3BRb5Ha zYrLk;qZ55@GAVjOlp z0)d>H>rQ1YtCtgm>YbY1UXn6x(Xo+Mxy0vK%MCx%!%t<5xK6F+GZ1KQR|@&k?H z)BwJ3mhB+txPxSGsXar)?6)?JEuEEx`A%_+{r<4kGollgT3LIYChAEAYRr)(`!LPSHCTw_p9|)EKW<*n+3JIp?+0!@R^$l}ET?R@A=EmLfji zehJISp0nWjC{i2iC%Df8%|&0semn3gkMDmH`hC2J61vz&0#<-3qRnz^4E;0_@7u}W zQWKUMgAGQgMSNA05|U?ujQ;sateE*-Xd2rRvPJsdR+#4D(8^$?mJ!7Kk2A!KeWTUg zZ(Ma`ID-D_M#SZqox9k|O=}*wN86qES)smC7GhVn;3tLJCh817K?MoP3%>z=8h_5s zEPRRe3umAo=VpDx(i_FwE|!4-^yoYGfLkJQk_&@gD}+Rp&UO&zX44NVgxYm1%va}F zcWslKtrqmI{Dy|#Z(>s^e*~XK!H;Uo9rhpmrN`XoK5~uZ>g+L7Amw`8CiMbYZr#z$ z%`#(dbSNm4=r#SG7NuzX8UU>+aj&}nO-^mvtUd1P4T6+KKOl0LeymG!nkMGEGoZ)p zPAYRHX}ENzZ!vqjd!|D1GUf`Fg*K(pv}(jbne-j2uSfOK`L&aiW8!qIOBoo6$-j&$ zg5}xy{@>F5H(4o{gC(s0lD;!$(?08@rO9Of<{9 delta 8140 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 iao+IB@4i~p7ZiC@9ELQ#j5l - iter - (fun (k, v) -> - match v with - | Pdf.Indirect i -> change_pattern_matrices_xobject pdf tr k v i - | _ -> raise (Pdf.PDFError "change_pattern_matrices_page")) - elts - | _ -> () - end; - begin match Pdf.lookup_direct pdf "/Pattern" resources with - | Some (Pdf.Dictionary patterns) -> - let entries = - map - (fun (name, p) -> - Printf.printf "Changing matrices of pattern %s\n" name; - let old_pattern = Pdf.direct pdf p in - let new_pattern = - let existing_tr = Pdf.parse_matrix pdf "/Matrix" old_pattern in - let new_tr = Pdftransform.matrix_compose tr existing_tr in - Pdf.add_dict_entry old_pattern "/Matrix" (Pdf.make_matrix new_tr) - in - name, Pdf.Indirect (Pdf.addobj pdf new_pattern)) - patterns - in - Pdf.add_dict_entry resources "/Pattern" (Pdf.Dictionary entries) - | _ -> resources - end - with - Pdftransform.NonInvertable -> - Printf.eprintf "Warning: noninvertible matrix\n%!"; - resources + begin match Pdf.lookup_direct pdf "/XObject" resources with + | Some (Pdf.Dictionary elts) -> + iter + (fun (k, v) -> + match v with + | Pdf.Indirect i -> change_pattern_matrices_xobject pdf tr k v i + | _ -> raise (Pdf.PDFError "change_pattern_matrices_page")) + elts + | _ -> () + end; + begin match Pdf.lookup_direct pdf "/Pattern" resources with + | Some (Pdf.Dictionary patterns) -> + let entries = + map + (fun (name, p) -> + Printf.printf "Changing matrices of pattern %s\n" name; + let old_pattern = Pdf.direct pdf p in + let new_pattern = + let existing_tr = Pdf.parse_matrix pdf "/Matrix" old_pattern in + let new_tr = Pdftransform.matrix_compose tr existing_tr in + Pdf.add_dict_entry old_pattern "/Matrix" (Pdf.make_matrix new_tr) + in + name, Pdf.Indirect (Pdf.addobj pdf new_pattern)) + patterns + in + Pdf.add_dict_entry resources "/Pattern" (Pdf.Dictionary entries) + | _ -> resources + end and change_pattern_matrices_xobject pdf tr k v i = match Pdf.lookup_direct pdf "/Subtype" v with @@ -643,7 +638,7 @@ let stamp relative_to_cropbox position topline midline fast scale_to_fit isover let new_marks = map (Cpdfbookmarks.change_bookmark changetable) marks in Pdfmarks.add_bookmarks new_marks changed -(* Combine pages from two PDFs. For now, assume equal length. *) +(* Combine pages from two PDFs. For now, assume equal length. FIXME: Why? *) (* If [over] has more pages than [under], chop the excess. If the converse, pad [over] to the same length *)