From 8d56b3c511dacce516452ae61c274891c671c44b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 5 Nov 2025 16:19:44 +0000 Subject: [PATCH] Update sample with fix for daily page layout - Add font fallback to Helvetica for Linux environments - Regenerate sample.pdf with updated planner (each weekday now has exactly 2 pages) - Previous fix removed extra note pages between daily task and calendar pages --- sample.pdf | Bin 79049 -> 69369 bytes shared.rb | 9 +++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/sample.pdf b/sample.pdf index bbe6037f17acc9463aacb4fd5779a50fb4c2dda7..fbbfd9254fcb67fdaae76e6d7e60295e5d748665 100644 GIT binary patch literal 69369 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 NR6qRi4LjEJ6fB4y z#a^*DL0_{@@FPHGt07g$enZE{p%e&ljKd_Op?hYPoBIn>ThFff=Eb_Q4#nj zLc}t$-zYDUnVDE>9iVg#@(U1~c_=+RWHLe~lToNlMk3%!fveI&B<&yI=N{~){HBnF zg-Ge^PN#~hrS3R!oD%484RZDN8!eI!^i)nz2J{b5dME>wzHZ7uF`b3}0iM1=4sNdA zp1z~S(!PGaN)bp++TV3F5Wqlc_Ox4-I_+lj4pV33L{e+NVBa7yf{UcRJlzAu&IBD% zEN6ZZ8NAS0vj;NpLc$9aL7@l=MNlY$LJ<^-U{C~OM24&7i56z_)LZF0I%td-CuI~Z z5f}u@*GJ?plG-T8d%7v@yIYB^9Yit-fq{Qw&8vfTUph=YL4?XAGO>dG@eyI%y|)M@ zfR~*9@qzaW`X2bxGMIv70+B>xcER^JwpWJ;sX)&3=xcr3&a)b8GEGs>KQ^A7au57&k*PgK<#pYh+I8G(8UK5>Qx3_(_%3(^$daD zv{;}_JwpiN;*u@arWpqpRJ=vgS>u9=wP&t5%OoWDM}ZGR@hjcKI5VBUL^hoM^oiX? z6rCp^27Z|q&-?@^!RzDy3EMT9_&0b^zxLOhX7 zpvHj81?m}4LZF@j#RO^$C?ZhLfXD@E3baTjZU$U5f5Y0pceqff>fxNw2#u=)78o^MC=Ua>0%PV3IOdG4zR8Ozj0c; zt-O^=cP;*o0iHfuyt@VjY4Nr8^9=%72oy6Am`G}`4D<^Q;ITSCHwR^q*jWl7MX}UT z84@Ix+W7#e&PsK)R$c8tK5ao-48+G^J`9*fgJST1RY}mk#Y=*YC6ZdX1}d5OQiU7t zCUY~k4Gszpa5bUJB-lqJbqF36#Gs3g0l`YT2%$O~WuRMt=QtYD#8gjU>lqLjWIe_e z_@E+bZ&#HAB?yspkf(dl7=SXuyh$DXoP0gq{M?mdjKL4pKt3>^;qu9Xd^kwruYi1N zpkNunG-i_ZUj@_P!)XU@{-t0Vz#;z4U>f+E|1dC(scjBSV}L0hOoM?e^Z)}nFbxJW zzW|wmfsBg=CSV}*)!_me7Z=EZX-rHWOk-j~_>7IogK033iNOUjEXyX z1Jjs59!!IQESLrZIWP?dvS1nvU>XeMz%&@hf@v_21Jht23#P$9 z4oqVLIWUb0Q zK}7<9X^bKvz%-~x05AZ~;0GI|92>_-+MFN0nj3Obx zG^j`bFbyga08E351OU?*MM8jSP>}#&8dM|zm8e9JX54 zHD7ID8cokC4k6K;u%8M{qtPS#9}lJ})JlQ{sVJ2EOCS|9sr(6r`?2+R&D5&*Mn34qx_MFL=UP>}$b9ivDH%nm9N0JDRN1i-i`!G91Nd`V2CDQHz%0&siW8aB6^P# z?aNT1!IkE6n9x6NKBewwD$CwRMtLb48v#EKJTj>$2@Qe*A&PB6#WnZSDoBhf=Z?|= z-z2D@%*p<4}gCHDI8S*WS62yB`PB^(0biLb%7>E?`y_D0KK_c zqXyOM6NHs(+w%Y|x}@a&+~n1DUugaVUm*((1R$^_N` zyVIBrAgByQ{ihmfs6s zD<(%Ylakv|TzpruI{lCt-)aT=*pG$gmF~U%-JdJ?)>B~2qP5?pKRm!51%eXHmk5k8 zG_7-h&lINN2TXC0IQYl`GZ*0QPdcpfcHwNrXqdLPY`qtBfKc zfK{kS0ALj=5&&3*iUa^wp&|i*RYs8zz$#QE0I&)b2>`4@MFIe;j3Oa`Rj5b+U==D7 z09b{J1OQeUMM40pP>}$@DpVu@unH9k0IV{K1OQeUJpur$j2>8ee+wBB;0!-K89*-o+BjUt2x7C-DQFPAd$1Q4a{YOStpIZ)2vK@jLAt50Zc}L1ye9@IMI1Poma)JU%Yg3;V?`iF*}Xv;pO(WX_n zB$Q$IheK*LXYqi?v(yu0pgWd=3|5YS5;dR`Cde8>fC+Mj5VR)90;iDE%wzxRIppjk zFbVSZ5ws`BEF!QuWS)}A11T>&P@ zSyw2QAhX2FCCIo+t!2*W0+S$bbU{7A(hQku%^|nk025?tRkN0%MN>A1ynR#c39=>{ zV1k^92K5|rmKqot-cp0s1R?L6)y}iPizUb!aDWMN1{|~}$QpEj!kj?|^#nP)4vY+M z*FkH7&`c_uL*8g=u>@Ij4=_Q_+=KQ6i@o@~EmiddSt}4sdYlyqt;rRC>*=vYi5jL~ zZuSBAH(jHjf#XkA-WUfj3eBl%sz(^xlx#l+U4Iq_wl6jgbp2TzXfcwF16_X>2X;ej z9F<96jZRM6c0k6y`%g|SLZDsyA8uU>Q8zTkbBq3(ZTjz@X);y)4aQDME9s~}*3JRK zgWx!rK9rU_0x}QixfHO-4s5m)fO}A4Qo;{QzBOo|-)#1eo;dMuBkikW7qMkSU+MDE zv5P=+fn!jXCZl5)fnj;^x9D4Lw%C{ssFX=H*f*(T7wOnVpjGjc1*W~glMBG8i}5a$*!btJ^O1(4(+z_|rbk&azd-d3k$7crk#t=MWwbNxS^ ztu+So6oOr(V)GMxLVm0ctd=1YJv(?5s#Y7YBYcUg!uKPkWHpE&2UESw^m zKBVImaSWwW;7=W=h&_~;-J+|(nNd5%wv3z^9j8bI(bMbGnhZBU8q;x#xOE-2`=@9B z47a2BdN*{H$~Mt)iWq=hlPv*HGG^%#{JF;bdaD|ZO2;YEaf;xpr{fgS+oW}zA}#0j zA^!p!#aNb7VTJ zMKoa>vV(L-I;xw8XGkF^yCZ-pA?Tv#aWIhG0RRKJ9RQFWB&QjFY}xYEe;D}lAL*z$ z!d998QW@UTSuHBd=ZdLo9k1vc8`LyOF|4~(atxv46_t0vSjQ`(_t2J$z@)QURQ{sV z@rugZ>U6xKa<@7}$15sttJCp{O63)yV1D_tpW(>ho&xZSP%ZZ00k7z<*@I{Hr!WoB zN5q)bWA430D6mT*meW5z@Se8747MLL^6WMiCIY*Qg^7VF=w$*`6kJ9-RB?dOPbP$k z105sB>qVOUESqTp(@{ZP63|*7;}PaC`cEDO6{rNXI4uATM~I)GP?G_nKF@bi;EzzBNn!R#EqH?!79h<1! zMW{A82-Zdvx$U4dKKWzE`gC=cEqoFEz2D0 zC*=>R9VdpV9j>JLgsl7T213h1C8EzW)0rvKnJH3%#cn=K$HY-(bVr|wOQFi>s6?tJ zQ%d>hs6;v{5j;tXZXke`&0@q1MMp;^(j9%KvU{XE`b_lSIQk6z7ntW|CZs}8iL{vK z1-od-zclgv{_QHv+EQtTfV6H`Aq1il$x#V7*->7ql_H$95Gy1U2@gIiaip^D3^bjs zA|1QvTfl)fYq2!Hnx+JSSss01|1=pw5QiwflKm}JY&!H+TUxZi9v!==G-j2KU8G|d z5pdfoG}xqL7lD36+x7$DaZl@sE`FoGT<2%!kooq<+f zqez56jX`$?TDj>LC|IBoQFR%rV3SDyPka7h{@;IQ1C8_yWK=A6`f%mjD@xF9DqM;e;?bCLut9^F_e>&_e7=qvn-v3^>hkAb|mY zSgT+WP>xcBf?f@THvvi}1?@-#okGbs2gOx!>DP&2HEECiXZ-=&Xf?0e8nLDf>;5wx z91DsBW{VL*ffHI@HyP&Td2q34)QJfti6< zgdj(i_f^!aBi2nnGjI72JRPvk0qYI}CdQeUjjJ;5hN(N19Z2Z>gDBhaW_9qDFHe}rZeDFaW_9sCyA+g7fu&<^W&6aa#e4|>EdpFoKjGwu=nG1 zaW_9qDGsU>_NJUJ?&ilS1#dd+ojG0H&5u(GPA7o9J*SJi`Eg1ST=n(fba6L7OerQ; zsJ=#=F7BqRN|{k02ELgT{axcewY(4i?E~LT@bL$uB=++U);Co?ypT*G0V1Gp=Y%*P zP6!M*!TJZ##|iO1ybz&~fH4cof3#7~hZn+d3Fwj4hAs4hJ@ny)Kn{uxTTs@66G1?Z z=%EH*0K5+`M9RRI2c*Ph8{vF-A&ijFg~ShS5YC4eLSz!~XcS)n2yE<{Vwz(0eU0fO(- z0P2B~%fMts`!nzw)D|Dhr~$=E(03uA8WaQyW;$9m$ic7^9L)^|ycqf2^?=C;(1ikX z76^)iakN$ippxiXD8mXwiMNYxqBy8P&_RGb^^HG!Ha1~C9^Wmj*qI z8-cMDl~#el6sT2TG)1LUU^qpkRbV_trBz@+1!@%<10{#gHt#u&WG2?0V=Ez z=fTT>OtBD)YAnfm@G>flMODQd7z54#sfBQ5cmE zE1=ni*lcqtlpSROQ@+0!W>F>h_u(v{E`Bi3A_oZ0k49R6jvoxQ01ZDHYvCT^$AK-p ziXVoy02MzPZUHKOFx~<*{1w1ufJmhDbq@>*P`diicYdS1Kri(36N(t3j}U~Sk|&@c zV9j1Zili#*y*NOnMN(T&?;vG>*jZ}p?HZ)CQM&oLD~GFXy9rsdc1VrE27?ZyB>eWr z7@Jxq8|tobyw)S8%eCwco9Z5IkI$*z{?x2Zi5r|J?Q5{S$Fez%SGI3F2!A18gw$AV zgL!zImk)8NOFXQ*bmgiVD{Y##t1;xfN9LT%C)YUNxF30b@;xeN!mh)<8Ivzg{W|&8 zA*XpVt1;ERZ14w9E=Kh8zLnH#mj0sInE^2iC-@ekgTnQR`USR*LtYx+TeCZ)O3Q-k zR>uvat7IC)ZPt^uGP&`;W=Ge@nS{l5osZu!3vLi;`=xqdbk^5{H(VdRPl=A!dtWo_ z*F6hk12=VeR>5r0G4s(+eWpJ-)4EFa9rs-(9(g`)^2$B)BJ@S=@|x&piF_{ZO+Z&< zP#@Ygwcgq?_x6W?=LKh@Cd3yuOL^H-npo4fa-CU^TAUwn@k8iBG^$o%vqH;`$&p(+ zPxZI&*L3LgN|$?|xch$1^vSa=!u-TlMy(1wuXr|gMQl)$+xEp3U4_vBNY! zMQEL^yp;u@Kj7SdGO4(b^FY@Y8x|m>8P($?-gB;<{e&TAe!3hiq-z6@f-DW56cas z$JMgv*3zqP{NlY1yBs@z=oq|k(dHG`c0QYt`!csy+vy#YLs!L||9pPJg6)@$=hYu; zaJqhj^o`zaqElC=dyKdIT&c(Ss(7!_QE|?d^?Taya2h&hbo=}?>6 zr;R1+EkcJ3Yqz`Ipu27I5-i`JZ@K>UD(modwhaT1PzL!O!@^Db?7G??dC+g+t!uk3 z2j|{xSmvqa@2k%B){v~*2<9^3a5FuNM*4Mijcfv=?^)|?e6S3m)9@k&Vweuv%esEyD8-T6wl~=r1Y@Ir5OWkUh2>B ztCm=|!vOub9-?bAJ?*cr9OzmQKBHPh$iCi<= zXpr~d?T=P2GVA2q*wXXa+2v0TtX+|L@8k8pUe0!&g{^aPj9>QbneMspf&T3DyOW;S z-?^A`=Tc!-QvR89kyrBy3i2ZD6$j>h-PikL7niWcLvKHFTXiFJZo3|%lAh1n-_?2A zwYq2KUl~)W=WPF(wl9usI%}`*dsMz`d&_PA>lLooqxCL~jJG`SWMNv9ChMIeBRgh> zypHYXedPN2?03ow7gCoK5vdn;x~yA~;CATb;_hQ#WSSrHy76205$4Gq_ar5~N(vd9 za~oTEwEIGA-`V?5Qlf8snr(Lc-HT=uC-%6S-D!*=s8W6VF>l9Zr+J07(Mz7(A}cWb z?Yy^3XBY0+GI8{sEw%HqJ>REyi7$w}dNs0pmxN_E@<;q{-;NLG!#m#@?`=8xi}~Fz zW9&LK8Zfj~jqV%W3e(l6K#4bIpRx&yU#ux^9t|Yt$d|vEc^?-3?4{UhmqDn+@~w=6)uRna=PjXmd-i&CB1X zXY9JV{d%t5z0r1z*7tvKs_**7wj<@MVh2Q5Sn{#9)AmOeR?%&Zw{Ie6h4=fA zvPT)evrSr4^SMrWvx!4)so z9dU8n-IRsD2b^D-L~N5}eEEDhrQ220p`T;-tVpjh=9e`FJvQFl+kaXsr~ctL?zXSG z|8z{3K$}Qgqjq&Xr1RH)@SD}Zfg1ekT{F&g zP4J8>+8kJ~-449N*Gh9oUb>ff@A=6=u@-xZq+_FHpT~cGm?C}uE;-`Kalb9w#OqTo zuNZvDBQ>vIXa7f4{U6SrrQD)4F;UhuTyFQ}NbO|9FAG}kvHjF5*4w;K@ExOM(lYQx z(v3?Ojfa~1-M&82#AMK&+vDCvUC8bF_V||7XI9)y=rnBm-0k{Bd6$>(YSv6X@SJ&v zsv*{T%lj_xJZiBhOt1;;33S-aCi!AI%6m-no|g&W;+Zl5}B@#RiTtq~_$td~zdw^{tf zKErz7rkGu+?|%zCSgT2*<-PrTwtV`$^>&jvjkvP1)Nca8G5i$>eHNZ5|#SJf&@-e{I;7<8q9p)x}6Ueb_Z zS)FYb-jPi_H+$QOE-!vPzyDR;%GC}|t!{D5y~T{iUe&rK4c)gZbjXz(V|=18mkIU% zH)&^!lnSi^qOV;IeEP*@4ZhM%FAi&Z^v?v~~Zq_d{C^UliOTcz@2V^gREk z2YlAoHz0RqPziC*_Y~$ARFhBooEKr5;FGZ@=bd3l=olZ94(62(IESV+GQOp^Ja2<7 zam0bN%-_^%Ta)&;;$Iz_aPxPcp@A>nJiOlCIwiq%LdwRYW81$OK4{pG6yG~Hjn_J_ z^FG@AOlIpQJ>E%jU+TBXd4FeUwXos(iSc7sTex~O8bP#vA0d7={r4+bOQp|FNKaN+ zIXWz~*YTwGJ9eKlt2*|#VFOzFHk)1W;$Fq;&ao#v%=HtWOsM7IdaYknZ1?a!=f{~W zICIm{rkzQ9=fZZTw-1hKwPM}!!>3aG(>M90dd#v}wXN+=d6digAt{r-PEkCy?~+?% zUK_oo}{7JK3zjrXQGoZY)?!&l3=p|-|r-?p44 zpSjFIX{mSAH8ix9(XUdM2A(UY&K>&H+3sZC_@(uhGzvd!(vtF;fH-|d0bJVu{TEQ)T?UOY7^t>S{ulG3JwS8hOF*q_s-ns4KRd%wE zwU7qqKD9Bk&ra-+cer=>XNi4*^O{Gmn#!MyID{VPnW^&)mb{ zM75~B(ekK;rJhwx{k1bjT#u=5d9LBt#uuu7LTs(GCflAe5V=1rTxomM`;Qjb9M{pG z_f(2I8ZqR^tRqda|D8B?R4UA<)m=5_TV$HmMHuhjgQ@8WTB zGbi*IY?M`4w|Uq7qwW|rZFRxCV^;qf>zBRh;rXRejqu9NFQ!Pd{OybCPme+`NozDW zwRv&)Yg6i4*6$OB{C2*%q-E>Y=F5%slcEU2olf`nnm8HO_PgOfq-y0s_|uK)C*L31 zwC0nd+ZIK->F!(J{((_?iQzML-WX+&?R(T9HN9E$i#c(X9^|yWcq*-zdHqUH>#mW6 zpB-z^d)Tg%ZsSAD*PQM&E?zSKbn9D+n95IPAl)BJk@k;W-}9pvRddE(BPbM_bN z*RUw|SXeC#1F6P5;`WbwevI$68vimzdj~>Cxli`5DJu z+jmNCvhHAwqoVMb)$U8?r+&O`Vv9Y^9XQy;SN8Zxr}1`Ad(O|0?mb!Aby{=Ze#uUk z{R6Y@PgHun_vVafo8;*H9s0k8gxtS>*JazatjMM3pU7%R63qs@OHEwhF}QN;PTR%R zWcqHQomR?By$vVVKbRo8Z>azK>T9kapSIgGSbROwDeuyiTHCAla%y?dd{}(OfUzqc zL_Tawp4s2^!=qvI9(!GArGW;bv8XG!srSGF%@A4+xa_!pN#mZ(=ZP#0Kd<}0Mv(2;% zxLvEGb;Szz8#a7APITh%$u|AQ)owrBNbWuTbhqzD>C}QM{{r87|h+HvPvIu)Gi9YTk-O=&-;*lA912-<(9KNWs zWm2=N*ZW;x-@9$mtK7T0t$!WxyG<)An{)R&t~gS8`0m*ghWygcd}Y{|Uo7KRG>wXy z-m5R(!8azoVzA>o^SIlFt#@p7QHUdJPnacc*Wj)7ob;A`yxkM-9QQ55rdCB4L zmW1^_Gd=0dY>(E>Q>t|AZ!)|saQh-n_=e~xvF>DwP)W%)L9%a_IeuJdWd`*A^*Q>HEK_HeObpP6+gEenh6kM`{5*}hpH+w?Jpld3I3XA=VOAWeYv zM=^qdttW_#Acuo+Z`aX*Vq7G32vYhC6w5?XyC7F@Pq(hVqrH{1vumK6(lKK`gAzbd_v*fukV*Anm_HJyng8uS=-##GQ!!j{lcETJe^E?ZoBF*DQX(J zeZjH;%1ymHHaOSqanD1)onJOYxv^76W2IAi`{;9h)1CCrnOvE1bnGJ{WMNX(*d=NA ziFb{YY+Yugof-S4@x)p#tz*9#cyjFH_>f&mhOtp;58~eqO&aJjKkeMuw?ikIxERNN zGw}G!N5LU$lk{Sjrey`cGfnF25}tPUjB~BTXLF3Yn2q(Qh$zzt+2|NnJC;s54F8RGnBkQ~d3~6HOj3 z42emqGzxb_~+h%Uhx^{J=+C;YLXxGNhF|tSG_BKn}46tiuw<*#l z(#EKSfKBA)Hgnt9+10g+j0CZQEwcK&Ynx=3Ig>gY{if~2dYNtfjzvG}6S6d^hF>IA zJg`BM)9fmKQLaawiMP`eybe_HbJ$SDuU^2>JNTXH34s+dcUyD{NjxSE>AWv1=f&~q z2^f-j@kB`HdJl6%hacqhOoD&&4n4?u@OwyN-B{)?e6ew6%j5GVR6q2fnbq!)@KN9o zculMLT0h`q=ll1Yp^q+%eR^@tTf?47L-r|?hRj|-8Bft$bE;y<{QoubbC?I5&ZnZ4 zXQIivydhufA?rP`KM@%$+xpBOymwOYB*J&gVdtkQca&E7AKN;3PN_37v3;(Qf7_Zy#tuf+ z-*)W!TgshtR-Rt{o%D~B!>Vo38`H^PUHb#Zy|?_4(P_(cy!#F!(`-xb!db`MY@%yA zr*7Nvc4NmNa97LAE6KICr`MMxyZH2wbH7bEH2Q$;+3L{~4A$K`uw|Qlu0?|bnK^+Q z$2_n|Hr>@PcA)*~)SQ%k{X4e4UnSjhic*&3RG8B#yQAN>!%kVBv!xF&e(mTC?iar3 zv}|kNyhCwOK4IRgL*h(Vw{1Qww9meUhY~w{(ZBkpH#&3wFeB?8skYRU8{6idK9^{< zsQ20Gvm!e@@p=+=DzPVGYE-ZG)*km_P0bx%?kKvmZ&G1EqEE#0FJq6qKeXj~=L<*p zJSs>;47LbEIb0@|gB=h|962TiTtRSz0gQ{tNIp_&3K@Tef=K`e8z2b!o=_!77YyLL z1Ew+zSHOEpfiV803|v)lF$x#sGQg6jKwMSk0Ero-1u}!HrS~0${mne<(qZa^1Y5=b z#pN`d9o&QjC_O}gZ9$1-+&?kcZ-WtH4>9M5fFTh5PwdP2Az;UarXLD6MQQqB1TaoO z|KsBlGVoSu`q8_9H2uKoP?~-UMTztf8Q8y}A&1~VP}7e9dptD!P#F$h*5Z1>_FAx2 zK*JBmWF_K)HP8}q6;ug7V0;Di48_yKFtS8?7zXykPfT0Wu!pPIt^q;J8$!uZOeQii>ekOz^nZNq#|{7h diff --git a/shared.rb b/shared.rb index 54eafd6..d28a79e 100644 --- a/shared.rb +++ b/shared.rb @@ -8,8 +8,13 @@ def init_pdf pdf = Prawn::Document.new(margin: RIGHT_PAGE_MARGINS, print_scaling: :none) - pdf.font_families.update(FONTS) - pdf.font(FONTS.keys.first) + # Use Helvetica for Linux environments where Futura isn't available + begin + pdf.font_families.update(FONTS) + pdf.font(FONTS.keys.first) + rescue Errno::ENOENT + pdf.font('Helvetica') + end pdf.stroke_color MEDIUM_COLOR pdf.line_width(0.5) pdf