From dc5ce2f3479c42c01c3d05000cec9e455ff48c10 Mon Sep 17 00:00:00 2001 From: "Johnny.H" Date: Thu, 10 Aug 2023 16:23:19 +0800 Subject: [PATCH 1/3] fix issue 964 --- pdfplumber/utils/text.py | 16 ++++++++++++++++ tests/pdfs/issue-964-example.pdf | Bin 0 -> 59962 bytes tests/test_issues.py | 10 ++++++++++ 3 files changed, 26 insertions(+) create mode 100644 tests/pdfs/issue-964-example.pdf diff --git a/pdfplumber/utils/text.py b/pdfplumber/utils/text.py index 1196f7e7..a131a8ee 100644 --- a/pdfplumber/utils/text.py +++ b/pdfplumber/utils/text.py @@ -2,6 +2,7 @@ import itertools import re import string +from copy import deepcopy from operator import itemgetter from typing import Any, Dict, Generator, List, Match, Optional, Pattern, Tuple, Union @@ -455,6 +456,18 @@ def iter_sort_chars(self, chars: T_obj_iter) -> Generator[T_obj, None, None]: def upright_key(x: T_obj) -> int: return -int(x["upright"]) + def remove_overlapped_blank_char(sub_cluster): + sc_cpy = deepcopy(sub_cluster) + for idx, c in enumerate(sc_cpy): + if c["text"] == " ": + for next_char in sc_cpy[idx:]: + if next_char["text"] != " ": + if next_char["x0"] < c["x0"]: + # this blank char is overlapped with the following chars + sub_cluster.remove(c) + break + return sub_cluster + for upright_cluster in cluster_objects(list(chars), upright_key, 0): upright = upright_cluster[0]["upright"] cluster_key = "doctop" if upright else "x0" @@ -467,6 +480,9 @@ def upright_key(x: T_obj) -> int: for sc in subclusters: # Sort within line sort_key = "x0" if upright else "doctop" + if upright: + sc = remove_overlapped_blank_char(sc) + to_yield = sorted(sc, key=itemgetter(sort_key)) # Reverse order if necessary diff --git a/tests/pdfs/issue-964-example.pdf b/tests/pdfs/issue-964-example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3d21a73810402ca00de8382c3cba864b41b75f90 GIT binary patch literal 59962 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%0Af@6tQl)b&Y3}mQpLqGTT&D`-m$zLzdB;%Q!MX~m z@&%OTXENz|(kC|$w@V4G;7Hxnu9DHyrXb(}ihC$M=@LGq%1H1qWSeuXb288I2Q=<# zc22kYbal=RIIEI63N>`}Flp^&1WP^v9-Ry5S58FV)SPfctpNyHLy_LWlQF&_Wps|O zb>_V(X@NXvfjriYZzz5?tRQi^#?f_M-ib&Rxz4+LqS8+}ckLhoQu6 ztt?8wMkyYxXc^iClZk({UrP;&z%;%3{gcmsB@UXozDTjyc!$vmkv>24R+ zff|Hqu)K2GJ6)D7;ky3*6?PcP@Ljx^&P|kWmD=wB*-KRG2>P^M0_PQ8wGtj<{7yU? zSjYwx>%=HYf_6dJ(P|v+_gi(~2xDehl9;W{2UWrfmKP9%*Kuua_^SxYAbSbJqijq- zX~MEZo5Vg;uf}>TD>>=L!mH=AJOZLeiXdZBD-9vurJ&adV;!h|)^F9!rZS z)jtTG!5t&wm-?CY5Vz=~T(1dquomb(jNJo@r6N9>0j%B1J_;62Y1aoZYR!um3x zTpvSv*J|OxU=U{!gHqMTboflrlQjZTEdk@OGpW8HHFUDHhiSpGGkU~ z37xrbO^U!UW1-0v5k&1*CC~rvx$8hh=!8<6vYtcOA})m)e|8E=6@}9&E7Ic zm+BNNA2y_}vosvlSiaQn+H85q6pAH^W1dDn&VEL zR`e3yv}YOf>lE(Hvua54EHH}PKJbcLjHo5$H*XS(k;b=hUI$dN`raJ_9sF+a?%b|I zVH7P)IDj-ADIFc-Bk;V>R)d9w?&?MU1mU}na79L#*nK;$!%9Gc14jbY6&k3%${svP zSVY*xb!xL_ez6Ed5^Czo1+tWN6qH|$>fjE-5SyA&_)EAy8?3I&yG9}F!F`C^glMFx z;e2Z3#q*Zzn8jc>2d@}tIosJ5XSMlK>R)4))2-LwJW*(isS|r3I9UVj&lu)BL#GTa z-zpZn^l_Pk9SfrGFAH=sM$k!u^qo{qi`4#GWxi2q$UupaEQBwfR2A|>KBax9A@X<9 zauZq{9fkYN9?J`Rj#U-A5i|V3P3yzDK?Pc4sy|LX)oB&t;iSc!pcf!5f#2QcEIk6T`gx4d4aiMeEr z9n#slH>P09ez2eytejo=o-rJGYcktA9SLhJ`OvGa4>3e+WmJhU>I+O%l2&b0ohSN= zUd(53sZEb3X_$K!s~g{kzk+n{>~gtHP*Zt^;c1_Y{eR+THG1g$8;S3Q!MZ2RD+Hs* z#h(&Y*yj7HkQ}4Mn0@SiMUNUQTR2e#*9>%s=l}99Wh^P_%XA&(6srVIrojf=m(~@$G zkyXJWziP3u#K|B|h=_X>(&^YD;?S%>B!yk&@PVLwdJ06RK&yvc9f;#JXM z{c!YH!Q34K8UgCqZRA4T^*3!clf|VBBvtruZf3kNH(6SkK3PGTE;lDb0=;uy!JBen zpIOJ@NoDfaV1<-Zm>z-jJk}_?{VoqHA>czH%z|@KX0SA-S#%f+N2;PEoFcrBpk5kP z)djH51*Ox-Sk`LgQBWL|*>h9FwOD-6$j(L9gMPYCn`&%Sh1?OU53RKBMgd z1@R}iI-}SuqPNUV(R0|&`H^~;8OSz2#BM;*H$~vIH)lwvE5x?fe(2WK zRm$34<9Zm46lUS=S60?bQo96%J}vC-d6@Io%q-j5&QLek$4BMnk-6h2o;$LS;P2^g zGfAVr`p)AMyH)AUwDk#1>Sp*@n%ixU9(C%kf3E0X@Scbly7gt%`9|1=b$ry$;ak-m zitrNJV%h{S!Wib53utVJzKr2f^m}7}>%|Q}n{V9uB7nQ^hC%zaXxFn$LkXp-7vCpA z4jvxp@!`XVf%Y1-ivQdk+;6Q3m{F4mou`L`&N|^>vEAD9qr@j6Y@$_%UqKepWR}Qj z+qjvq#xmy>`-?e-eL>Bt3TB`MN_I>$st%~yk4dZlIhJcJY?tleH)7gPl+eHBiOK~l z7@TdGqG8zyW?>`}wPlbDrHkOK;1}kB8$i^Fa|K~P?Ci;-4uB{TQXlefxtn5Bnb=(! zjnL!{$v0z;!v^ljD$Ig81Eiz80g#@G_>LtH*j%%JP~IPZuCld1gILC}0(*XDjdBev z4{^O*<ItSOPlmhKXk{7RY>}d6_SyJY8c+4snx4dCh_p-BU6sB+y1%k^K zRmFjS#Rjv&QfpLMY^YrA_BbhWJ|uJPDPwN0K&v?q7vj@5@htFGwQ`=Ui~W?)YTX1t zGspA@bI3b}lD1*gxvs0>8_HNRukcqDz&c3nKWo@^L&*-`OU}!YO#CgdD%r09^LwuE zHz5$AWUO9`8D1fP6Q+hNr-r!=!KAzyjIb0CLH9>|eis@&@aYq$b8Y}&JIUx)&J5PV z{WG_;RK|qMs^uirt)yi$Qn?Fiz#>?sVbGwJV!zPskp@7Z@8lk9dA+*T3sL!Ce|ep% zWqtC*CPU+jjX6wYzER#5E{JQuhn|e^HYvlCdUP>p;D?edZMpO=cG;s#Y(tyDL{-Tt9M0l|CjDm{7;F!Jg=0k{FF2dqR9y**Hci07%)1HjEqKSAl*j4OpG z4Cy1s?l38z;eAo4uU(vMC5sD!^FdC#5?meiVT#dMc4=r2{{l(vPmuG3tOWUQ&hx)P z<-~fHjz;kWEPjy6w=$8!nv8t`N1@~IQ+aNZbA_OYB~$%mUSqLuuF3SV*aAR z%I#W1RTisG({4dVgO{H446HQ-hi`uk6mGpkCa;~aYFze1syE{#U|7)6hr<`qx;GDY zBA@I=RGV+xs+!KPz217pv7k433*LbYC{^<1m8_)JU`9falywzrpl{Upl2%U9H@}?F zec!%H%M&gD3L59o1WME09;TC?gWB(Vdk6&XxB)(d{=AhcHJ^Mf8{aLSp1~Fj@*jV& ze-j^fTf`0MilC;n?q$0E=I8SoSO8iOX_K?A8F0cch5vYYd!(JA^Dc$lJ*>cea5jQ$?H{Np2J^68>DRt*#U9EfF!hqJYE(i{5chfd7MSq$dIqlIm;gw7Rm0HRGw=mUH5<*M_ zu9t$GBorYoVc&lT3W?E{xTFd3myu)a!o3XV2#p{Ln}2~3=%^R1L_O$LH9zokjqk5r zwX7v`P?gZRzlF!qEF@%V?ONjmSnd{if-f+viE~DzX;WUkX4-)+Oqzd=H!Z zle_#TZNWz9})r{-HWgoE)W?nVi_)C z52D5UYQ&LL@cO>74uG)xIY5k}rW~vkc0&Wgq0d(|^TV-7hY0IZB7u~aXvCy)S(Okb zid$SakGHsDz2Z{{IPPAT`8l16T&|Iu`FTD2k-^haqJ6$Hr(wfQhu@|%@8VXnr;ubJ|M#7P>`3ic(+^jT%bH6@z{o!vtPOq#iZ(?XFlS21XO zy2NNfT|I-vYvnR&z>b~6lEIeGt;58D4BHU&UYb*Me|IEb@$0*HYoeV&fIM2zZp#kV z1ya~|w`!wws&CnLUC4yLJLEz>ka-^=Gh9uhX z;=Z4@rK_;r#1k6(cQ37@43UkDm>tO{xS+z~cc~M|Np+TLWqhP&o4tr|;&guk5jYls zGHtn+;* zTX#HZN`iAYh3-#UsX-DUGE&KuIMpU8DA8Yncj;o(Hfc-;K4N@y8m%m2J_b}YN0)fe zubX1QDTfzZMjryKN9swuI~({M{On*(JOLks<+P)XbBjt&h;wee2+%*eP@lOO7D;_$ zlg8bCC#AwH)|uJy+P57iBL$UirKnyN#L|QPJc?yf76Ggh%PBolf;u&Tuf%P)=E-^R z&{MvhbT;OlE?{dbocB0%{D+uxhnbfwA2D|VLScr<0jr(lobaXIT*Bw*9$TV5B)n;u z2{5jfi@ZOolu466GiQI+UP-Fr9{bUCvleHiV*f|4`7$NyF)d&9`pZMLbX%W}Ie|8meTs=a zMI>^v$3{z=hwY>6qV;2Ok;sjb>{W ztpli+6cfw%qhgI^$e&JUc@03 z6cz)=kp0zYJDJS`79?W7m2Q784dN@{!b#Nuj&hPW8c8L=N)f!ug6S%|G&L>}=yHcn zUN)SCyRBc|yMgw6G5|2lePI^5zi=&bTM1f58FPIM>-Vdvv}@T_jucG#@0Jw2pC7rU zwlE*u1h%kgRuMn)G*v~Cwx#sOHyC|r@QD)PS<}9$;^$6Oq2Qok@Q(ld{@TZ*-Z{!| z?cU)%VJ#3Q&8wD?Y)P{Aw$M-zKsOlkO0-6`n!AuXBSD4_pv@@Uh_|+?B*@;RjziVG ziDjsg>FF>RrB{x)N49xi!w@zpWKLaBYthMS^_la{*|piF>eQ1a3rb=iEhawYl=KjZ zn;=07+b2UJ)!{F2&@Av3eidfSr3UGptyGXwF%hzXZpjoZPa9pT;cA~YeO`BxaRE)bJZHL=%VoNl z+sVi2(mjS0*=(29EB7Y+Z9U8lAL9lZBvr0ryyZ@z@14g|@jTFZU1cWUGbUGD`*tA! z%+Fgds3tlW%JHxb@n=53z(q<>)>vB#AM=TdwtuV*;vt?V@B_vfZHuLiABE&g^674}8hwCb#eXXCPe4|)1vvCEPZkH4HOPa0w(^vnO zx6qS!@7|p0brtu*Tthb?{w$WN@$xd@ei!XK#}~0HI#lS^c0(qqV+LtOzmogd8gSdX z0##@{>mGnyTnDu%X)01t_FyXiqJHn3b1Vnr?KNApZC6;oSoZo}?b+(v?ogh_F}qo&Cesy*1Mnc)t|1vPoulLg>zNvq-f<$hn;8o^#$Pr zN`wm{L{$>eLYWS{gC7=za2vQh(sVBD^R&*GC}Y}WP%p5v&)I}qO zA1k)bYTf>TP1tNSSj7A9hG#qx)u*l6r`TWn9ExwRPn9OZ6f>W92jGA2j=$X6TDj3a zsFk+F=)!)|0?M74=?h3cXx4VC_Mn;)@k)}YfePA6gSrS-OX^$cu270h@&lY)g714tEwhF1Us4PS99VgtR%##^*HS#Mb8TuwOL3STmO0# z!aT1T-5#yENrVBlPC4eEa4D&*_2oBSru2Rg4w}-_IS5aw1#7SKQ8coWxe2n?8VpKC z(Q@oL57)queX=zXE6>XR-B@}-{x>{wUOV!I#(M)|2oOOdF>|my(KzYMy6A#T^1T93 z6GOOJ0kXVKs_ztTQaGwq*Mk^YpYt)O&*zyb!}BQpifdB>x3xf&o;vc<@s&y=`FBXsy>3Fz3$^%u?A>*3hrjr)enNXgWcD_om0EB@P`@*Uhlma)}c$DhK zn;;CC$5Uh4DrdxMF?)OEx=Z&8QJlHGxOiD&wi+_C_yw5EZVEj9@emL_9DIIyjdsjUk)20W2zc_lD<|pwtPNKUG^7gc^ zrr=)tMcQmS_XDvi%g*{KmYrR6p0n0!<_}mOkeU5?jV!hsb(Lqm+uo*|FX(ie%dYn- z$>QZJ#*dndvtcJ?r}WpIyBn36eE587IKhO zGcz+YGcz+YGk<1#%sgfsU;n#FHrd_WN>WLcs=9U5t(Lk@sno5b_sLVe6G^FBMtwl< zy#FoN^UycClaqcQB*{GtU7zQHFk#sat4^MHZBn98UHZ7QA2GGJby@-2UD<`KbFF!< z8QIZ__v%i7SJv@I<}QQ{3hGVeRg3a5l*19^ueIi*$$=-7#j3 zhcG$wD)`RH5)X^9ARU##4f`_I+bDomO{pru>V=*_=dB=L;%3Jp9mrqim|Ym!iN4_8 z16kFzf@8g5=ag5}$y*Td^yCDAddZ@nxwY+Q>khcX z)8+6t_(V^}+|+q2zg()l;-}KQ>$b7|F_bM|NB#)5O~g>pJy4S0CB=>PItD%t z*m&B?cQTR}m0+qY@wZEKxgs7UDp4ATK>%}fkT`hRLD>}7&Io3U@%VTH%2_=8yx&~! zb-Xqjak*Rf^w+PA5_f01ZxiMy8`VwtWV)N)=)^9q+E?P} z@t%Npj_I4J?BMlDV)2P_;h;um)sldasNcQD8+gCgf0pVMiKfF&rz-?rTlWK=Hs}<7 z;B58~+3M^?Nov)93Pfc(cvLE_<)v1~XUXWVHNDu~JSX+To59?SPZEFh2^|p>B=qYy zaBt9n9*{rfP~g}kv&u!k@wnz^T=uK$Hk^%%9I(o%@tVn!C&dpNj>BTvU9aHl9}8Ge zU@QSBE8>8vcyV>&__`4Jv75B3teAOs1K)}YMNkwLvX^|#{So=Yr?zlL{9fryFrJLt z&8!uV3IpE>5a^sf_Uye-<>n>Ne9g5JS?2L?)~Bp&W)5AuzgjTbGVJs0A67oPfu&`Q z93ChB)ypwMw+kK7I)5&@O6`Sq#_w_K(dMR9V}2 zk5GlAGk#=^a_1^u+y}9oO_CRVtg@Cgj}QhX!Mt3HM>lEgw}klP zhc_AG1SOnWLB9E{{O$ASX`h@Zz4k)&sG>hHdL5}Q;ZRW-@J8?)Vm<6OC0K(eHru9x zw{BON=D-;UbR1wL!eUHXCodyJzYWsP5anz%gq=g%yNc>c&FzX^1HGEx_f?`CRJHLo zq*tp<(M4USj-flI=sPabu(kGwMFb*6{gDj1B2@zWF`<8|H|K)m8bFA3-H@HKb(SNn zyY>`_$2%~3Fg{|WMIiN2QwvaZu#&UR?wwFv$MLd;8t$7&u)LF%Sk$L-b0zwRYDbOC z+1;j}oelUQ*yGm{^sMQZN=Fk8^YRxyqvQE6Yr;>hza(lB!z|KUq^EX)svrG0&NZlE z(ekL$jnw>7Q9^X>o5_*S?8b0_rz040YaO-qbX8(7aNrx;j%~G<$kQV6$k1f2tQ>c} zpYLXE`}Ci>3X{$bJ3x$?VtA7!y%(=g+x3cb*p9msL$90z_WBUjNos%q*o-I`7{{Ltm>z))kd`))eBqd3{rJcp zN~^Kl?G{0DS5R+_WYJ=HjzEcC1zrm29=0mx`2|Ibb(fEfAWchpEqFj)aAWe*eZ!~2 zi(1&BgBek&A>ZT&GL=FuWPX9^Jb=S}5?)%8%x?Un2nM0g&QD0Wo$U{up3Bhu!>2c0 z44vy$6&BKSRKEW7T^n{30%lE~2?&Qkz1?;!`?KJn>NHLbZ*o0~oNchxw=B7$?aBVm zx~Kcdf|>3?5d`#MPV|SvisdVLk-Rp=T@i2N<=rd)-#;suNgH)-U9@m`=~Jmm9f#)} z9+9ym!ZbxD+qwEEBl@SF8^{rw1f;UeGT7&t?G1hmhwGz}Y4RXa#WrEUh$M@QMy?fD zNGvN$wUwt(7g~%nR;1V|Av`XbOUYZ3lZnPU0t(Csj^h2(#4zc;(=0aW5ognB)8~YU z$}Uh=kMnmn4d|KWJtp`QMP_{vP85Hs<))=M{K0IIhZx)=5k-sAtW;YcLEKtbeb`k6 zrgfa}Twm6wG$lV?orZ5L0m)L=RiLs!8yVBq=g#P~T=(f>z29wz+Fl3ALh;(1f4N(V z)sJHv=x*E%=v0bcx!WB3*KQ)DtfYorrOsp!pxm^6lj6Js!4!QzSDsMntP8^9Da$h4G;gJm#Rav;E+#65h;OTD8nuOe z`8ZH+jMjZ;?QMx)F$Zkix!~iO6(JN0F4X)~O@AikHP zILEuj`7_+Ig{PsEW4pJs(%Fzxz4;;kQtJwrj@Wcp_2M%2V{DaOF%@`jt+~UQOhI$C zKA*ncMQyiHJ!;!ewYu4mU*Pn-?r*%Y`hW@55yHCSiicY*fp{sgY^AwK74*7dW5Sy1 zqT10~746)_3SnWJ_30$?d28IyujOeAJXl`s%SzcFm!~-s*!k{WEr*DGJ{Ueo(Zv(Y zrP#(AJV=p6bkckp8F9b5yjOW{=ZkAoGZ@aP4TY2g45jDz-paqUI*UT|6)ek}>X|uW zdXnjwoUHAHSeUp{Kf_^_JB=F3j)(Fab3A2lw!GLV-X(c-v~t*%Y)+Z=m~k!(hft`L zX@wz%pIw7L>L5W}d3a$=X*q$w?B$KEM>+E=9Q7n5dXlKC*x+Fv)su*7(O5J&p#N)a z7_%C`46E1M8s=Psx30!w)!T5sH0$B#If4`7HMbM_6#VNRb6mN* zf5TWK-#|^FLZH0BdiM7?s(3qj2Z}Q+LLwxX%QQyw4}vqK%HddE=5%v>5JE*Q6ouA{ znz72!)uh4LraG8mvTn4?B*J7+6_tQuG`S&GWxE*n;@vp?8w4D{OUmA}2Jvk<>W!yU zYee0zGIu2Tc{(-zPIE zrzjz$a2h)%w!>3mrfIfA>cPa2qF8o$0$Z&t4t%PX%F%GtOZXHuacMp4clH`9ya+#g z!c&%INQxf`Ed=(9Xrz14d4F2AWOE`H64djLfiXl5}M#aIcOyEKC=8BEI zkqY);euw4P^*jDH$LxlazmN5tCFBSB{Em@t_EYc=vmgo7cS`T?`9mAf$vh$Q5Ph<| zf$}O$UU_uOb0v^xtNo23?1It5H~y}y?O)+!(ejaa`Kl*MKR15x_|RIHA)@XllsQ4vwMcDsI9~CMrx?A@Fxsk+e)7O{+>;$#>o)R@97@ zZ0D0O4^${mdeale(o)Y6Q@8G<<6BjJjFm8lT!@u4$7sJGD{3mpLkzutq?0l?7HEfU zUh5?;ULLb~EBmT)yI;bb2G41&xCxOYOX;h|3)yzQIsz9TS;?OY-Jf>{YW(PR+zOoekp){W5hAh#|Mfag!R%rD>N5z zP_oMl(Hz_7{Bw!f51k>ng?}846P864tck*}9ul{Z0<;=@Y!u{5|8)eu$Ym}E`UWWF zYk0%|7gw-nHn|K^ao(#2G?pu(zyqe#W?0_e9RP_mVxefk-iy(!&$B$Q6dcGW% z`&2}v1-vdb-xeiq=rY_}tz8(3>>_n_Zc*eJUGt)E-jn)n9mz3jBUcJ$o_;AfA(|WH zE8yfi5|fbfbob$UrkK{Pq5I9jEx83OC37}zWc|0S9_U4QU{jP!ZAB?jxe}b3 z18N&5>SJ0p`EDCM&`7C{hlm+`@P-MNsFaC2g#ff25iuRmG%olX*W?6sZX=7h z06pLH@d^qtcG^Q1Y^jPT@n9l@s60>IT7|{|A0ks=PFCN#BePl~73GWG1vsG)6}2N8 z6K{@r%e8$bZ6p_klE{X1uly6X?yHHW0+Z-4JovZUVq--94lBnG80;`P#eDDCp_o=$ zpo+)VGXHd)N5-F+H9$7q*AlMTB94|SI>OL&%pVOVCQ|QAX+ah9MmV6N{XO&}xFu7N zUG$HgdV)mobBeoFEVC_=ye z8AUuooF32lHlvtrSf2Ev>mADO-T;HM?_Kp+_Z|s8SYRNh>r@=k&I$CVrKNB?K(qm3=wn+h`1Az zs_iXN#nmWei40#lGLmPPiAHvWt5=20Kw^EVAV!iyG7`k>g6Ay}G4e+nxXV!K+U0|unRIs)R9$I4Y!1b=lRg*kjfS8{zoev!4jErb`WDgKCUue_-q2o)U*_JGK%>lt#~8^ko@VW z*AVV+VoR!g6ZnWER>M!zGneYXixG%*e;W3YG=&r6!|I`!6`EoM4T{yl^Az6hfdX32S*) zF6C~V_Y(HByw8S4p8l||ZN7JU0`u}7Hw~O|xcFd^@Si}Z6r)@3xZ?){-PhxK&9c2= z1q_RfVeW3f@ItiM&d*S%q~?Bo3(Lr~bjp){Ru7VE?Y_xnc|%M8EB1TWgL?9p)_LSH z>{|DDv|R8o&+?)6TWnXPW#onwiY8TK9($7XhPGt^N-AMZ>-Z6G<7}=MJT#s-{11VN zVo!1>dkmc(#OGWGzp5P%c}(vPY-b@G9_8)Z{qX%ZViYI+4Ac!Bn)K?L_Dzy zlGUXiWl(3;#hkK14DhQearlLdH9ujP%ctG zmgAYvgOXSh$}Lcpp`q=x!fJ+7J?cu3Meyi=9SZscMS3nv?T|lNfjA6;^on_O;OIRm zx)psMd~7jyQ|`>#l$TCY#6TN;YXtLXN;ncf)oeo&>_&e5d+0P}V5|0#`#8fz9bxJF z+Y>_uKFkl4x{S*_B`l93#0*74FFv`Ut+TK|q45Io>to->#6%>j?DVkYX`73Jy(Deh zlOgDbr+-An#Z*<`+mCJ%ximlR?_t7n`~H)XfY}* z*Q{g-#uM*k9#hPxm2*oYinlCnEz|y73A*BCmF^i&t?U=LP(-eb=f$e^07f7^k*esu+85)<8sHpW1l{PpST4>?f6C7QniXM zne65binU_VMd?=cNfSl!lGw;na-@=Iw%j$~4=b#b$^jYWSW->u5-!mzR%W=81jQr+ z*%UJ6kxrzGDJXI+X9^@4($3foK}420ZJmso6S~8a^eA%86fE(=%vd^6YgpqgL5hhn z=?&R-nKqPvXwJQ%d zoIDjI($*CQ78wQ2Y?k$D7)twSl|#%-7AF)O+@;ZJCL;H38j4uq=hGp0OPY&+!s^XA zOUS!nln&@0vx>1ws5#od*7$7$E>wi;qr{~xV}C>@8^JvoEe5q?mqBg(b5xD={!j=iB5*muXa`T_STYnE@c^BAZHor{oAG zhdXte5R{f{$U>APFea$OI#kGea_3yguiqG<;|_*tM&!s-zvO+1r}cxA&0&N9t6DkH zm4s4SmIU>^>s1GoI7XD$iNj?{GDbWKd?vA^c42-ZM-9)(ys$TmcLszDF_qP$GnDke z1FHd$O~Qy21-qxMN?HyDh1SSmxQkH})m}E%V5VJob`R-}gDfX%+n^o&iIxrMDI0UHUb@s$HJL|8-Lz{(#4%vtUU5dF z$YLs}XbwMS<;Y51VIw;^Z8ypgMolzvS$h9a-#<`ww z>B}hEj<6v5Eqgu-)<7c5MD`bkxk4o7+L3eAF#ck8G+S_rTMsQ3*Mwqy_>XFi*Z_9hY?L4_Zp-Cfp zdMUjVYQ<51LcZfERZTsHT7I)o7l_GgCEP3muRymIN>n_zEu&QRa>Neokr#&nNB8wM z%-#uQ_Z2eE);zRLt5MF=76SQo?Qr-V;|o1T(?%T!z81JfSKFu3@B(@WT33JaJqtq(i9THaSHC{G3!PyYtq-UeqLN6G{@E zT3YxlZQV%szHa?wxNd#hHhbuvKl3bnaCIw8KAn3~JV>H*xSOHgLGkzT_Nqj^v|io4SY4j_<;ELh0zf ziS%%0S;P1=NxS@kau0D5+5O6W&vDW?_b_LgCnt0runp4<=D`IyKl>43iS!*3D^nX@ z8#V{xLnl%p(at!(%kHrA+F8Z_M_pfe9^dW6=lq`H61jH7Tiwr=pOhx#mRq3>96{6l zR;u+H<0cT9w5*droFNmeOj%Ybpi`a30O|CIfnftjoJ@pFf=qx6S0;PruoXuAJg}+W z+<0+7)DYDW)p&7=bl?bt6%I(P$CNw$*XpP~eX=Bc8i%zJIAu`S0MiIl57Ur7UJ@_k zCj*x0!Rl;f0i4qNZK^bA!kKBo%FC)^MF~`{`_n*S$`n2AWA$jHd2}>37Q6H9kv>21SU_jvl;@U^qDfIX{}sL8c{QGffs$E z`oHy=BBsSziPzBTv1UwuWae9i)KM5I^^xXIKUzUHjvFRUl7>zbumY_h8^#S1$4$6c z!PcxMO@6X|0PhVG`$wil>+Bz}>*J?wt$d8{;4*W8??XpotbBDZIn%CIJ;rwknYBQ# z;Ug*5Uv)28)23Fu#&$xRy0`1kO6z$PqJLZ}oTh=m)DGwd zOC3%~lqj@+h(D45LmgyE(glZ~NGXVckw%Q;Im$phK&KK-XS_5~x_EMOLXvzt3}6`W zTf&6|ON=qa2wsIJ!w9p&(KI1j+@+|(l|Z2^E7S;WTs#38AOaY?+(U@d2MAs6fsTDo z5R9NE7%v^Wlz>b;P|&26KomhF8YjgPH`f5912z=aK@zMbTIxet1Yb7>O$1-#jpU0m z1p|f-!`8%aGZRJLCG&rY`;fkbFZdMAApv$0y~J*-zm!p4M)0r$ykzog#d`oR0SmmP zbEbgY1TR5z{6sI|c>Dw}{#)L0&!j^g*lwZxR*HL!@l3!^@=Jt-Rf=1d1T_g=LihBB zF5!Gk3EjHTsSs{kq;v@Pm;;RnZMj?c@kM}~LW(m$PVoR05Sz#?dP{EX9(14|;T3iu zkN_oqMb;kcuq~DEDSk!T9=UJ@Xb&W^C2Nm9P)*PhUs0UNq;NtVj|Q;CRn^0l3Rrd8 z;Tf?=AdNo&R^zp$91tYf#+O|PXDsc}mmNsP(UV*_#*G1~3EF}V4C5jI%mi)z{gg7@!T~M{I@5APkMivA}HNMHrl_-3Vt8 zCrjCrR1|0gBatyg#87S#7=bUI&;VBu2T)1L%en;ECkz83#hoZuMHeJ_Ec5rVC88We zB{C$408nw%01f`Y966qiFMmYvpjFutMwli{m)Xh|K`2+2N&^U^0MgBmQ-!cEy?}y! zGpUoE{WE-MinhmceoG1|nh97gyjKtda{1T^r)V11$F+XX7w^P`DlUH|#f!6hVHNd} zYC_y3zC1Pl!W3!bsdFt=@NLaqCaxTybiv)u{76dCcvm9y*l>5mPrBjmNa(4!{^hwF z?!$3g$T#DIT z^2V^s`-E5`hoT8l1QbMAvW!zR*+^Ix$FzR%^^TZ=uoAH1w-PO6Ske%;W&E@vM{)4~ z;>jG1NB!E zAHkL94em3BSKxDPznb_P${tKJg`S5Fa?c-&4P5peD~XqQzYo*fylC zKO1r@=qscfZdb@n<(yjIY-eBgZj3*a zhYh}&o6S!%4;x%FcN#}sZLr!fH6W>hlMSS9w86UHXhqW_^Ds?l9<@PydEec4wVxg3SAk{c)Jx8!`!gV= zfs1|RyJ&Wd6WKwpvQt(!S#el5IJv+x4%$1$+4^)fH^kYsVMle*^kaF2BMxDmV!X|6 zNu6?+@-I>3r7GI^WtAnB4QF{Z*HtQ=!@$;Y?HXDoq%++TmkQjog)77d)hFZ{jHkWB zw=$`YMT=f1pLI!7uSAS3bA@CK)Wv~I$>Wk_rxAWB7Ujkbc^%Qh`iT>USD8x&)*m*h zga>@Oy(8qM3@n-}RiYD! z@|Y>pYM4&5YEN{Tl{4o#m8{9r3Z}%LRSk6&E}_fvKxvjW9wme%mNJB}TDnS=^RJK^ zEMu06-cHeMUDfJWdbicEP2`ENC~csB2=YmIrMU7}#3bFi{Jn?*pPGW){FVq-pks(< zNayGwJZiGPJ`so2VI69S@d3OJ+ma5ileWF{Oq{dO_K(|_IG>GFBrG+>OUfx4Wmu*x z--@a_UhT`1Cdvf~Pfo)Jv@7Ng&QksZG&k7Ip4l%>Uk!Xd^d3rkTomXnT{;>>&RG;! z(7RO5YiAJqJUZU5P8UBa^$n&xd)-*}3e(iMcj{b@R@2Nv5ACx}cSlt?d#^={y&CwZ zgVmWVslCBit{Ikwf)-OFvzToAy|7#XeVZ-OPS!Tn=EQ|K2*`okDlSheZU1 z3RKY}Q3vhlbFlla4$0ZCI0u^I$6V(Jg9uI$2M#lbxUa{c4(>DusVM+A#}6+oz!c^O z)+bm8G6nS(=&na=_RX=+iXN_v0A7#)+9W{qI|xD^-jcs2J=n7VLK z9*#8Fo4xSkT(hH&I+pmECG8{dFd%^R5 z!w*2}d)wu?p>>1mLfHOh8-TEjaKq__&;_dtN*9>g7r6^@!|jI14Yv|#+PAp-&&UIl z0}>lJ+E=)Xd_(UB%?*tQ@)Y>i*S(8p$JPe733CO~8o1F{y^B$Yu?cVUjV<73AGTiL zavqd6QVrN@fF(a$8@4t?4Y-=$WWVvQq8&`z4{dN-a7@3u{;z?=4w3z57Q_s=so!G1 z`L41ZEIU>fxGXrC-|v3=UG*C}J9u_%9EccjF~30_hHFay54yTfh{xW(znE*E-`;-d zeZpP%{?CoUpmvbZS)kuc{ra#7{;!_?w^qD;^ZccE4R_(~-%VHd1o7C@w~e{>W&Et= z4gK8Xlks(i`n$(RySTY;KCpfJ(r@T;GaD z(ALUGM*05;DZ{`9OQ&XTSdg3K^7uzltJe+VzEjO<^87q%~S4?X=qgqN?r{SSl}rhj_<-*amI#qeLdBW-MB z>SV_7Mde|jr~i7Yxs{W#1HnH}cQO_>HncS|hNb)0YrY6FYz)l*1L5V;3r<~ox%p=O zILn<8Y>>Y1CJPKTWR#x(To8{r3p4~=0>odKRB{kR=!Z}m419P!OStOKuid5Id=_)6 z(X}Q&3}6{lmwL2n>oqOAFRlNoR<;~1w)E7HPW3+WnnIi1TV8)|eRe**W$EX3KW?9Q zujsyIfkHxq{LrVnnOk4b)y&y^Sf-zON7Qn?X0?sOKd=N5XNj@B+CoMtoaJqS93=x` z-umdL*@!tL;|0m10+X-ZW^Akc^n1&P@e3m0H#qm3-DoX7xy1w-!Yca3>W6x?wXSCO zjvRxDUo+x*X`QOV@X$kK?+pzJAmVC|jG)_IEPgz5133141JZoSpdF+QD4bJY^$>g{0R$^QG4l6OnAL>N0e6}-19p_-}-Gw%q_4qzg>p^kqu{<#q{cMkF*Pd z`zIuhRCtWUthW&U+Rb6Ben0HmkaSj5{#>#=C%Q zbbPVGVfn$7Hg@~x2cAg~SW2E)hJq}T7g$b6ZvW2i^=8fqo;utm`HL7JGHl2n&o^D_ zw~J%v3#LAU=0@;(%zyy2p>Rw;>J8xaXlD=5B})wm%o6h$i$1u{@<0Ebb9}uYdqW2! z><0Z|9m;*L0DTo&cq8S8m_tT+@Jm#4d>FuQL%c&u)=vM#`jnrC-b3g`l%>F7A~)lM zVja_iq$(cjY)5e+u;T+ox(EIK^Bwyy;-?={SU5Eq*nutzDcSf&R?Os~W*dPkl`G%V zkDaNVF}|+}V)KCN9><=_GMma9i|+KrDU^wAhPTyY@X1plUEPPCh%IxT7~N=98-7jz zX8fD&-qVd(2H%)3I#9SLLQ!;V`M~7%#|yH%|2srA_~Xo>s{I2wOCLgEZq2UEzK!VV z?C&@5C(0+!tJ=-Cu87&g)IS?9o-g!#!@0Yk)M?FF8R&YSxx6dc@%}mo-SO|5 zgGc*Sd$Akus4ucQ;}fhaEQ{RXWmn>_0k+%BXSf%_Cc>fXqgvtF?J>S7zS-Wf-u~Y4 z+<~%USl~dJUAbN8O`e^wn?SQ{Gs4bOd5+?AnXY`cYPPE5nUix#hq8D5YusxrcC$%( ziHc+N5y>=PlR$z*guJ7@PxJ1A9g>M7k|Tyb5=StqhOi%a(`LB6*{IGRq_RCz2HHPP zxXw~X3qb(M@)U4xvbOK;-zdjp^0aD{B8=!Re6`x%kNR-8{ ze}fkgM<3|$BkVflBlWxvtHf3Hp!Tx%>U96I4Br>&SU3fy`c740BI*)sTk5blC@0^=-25Z0iSt*maB#aR(K) z-!Fp8(V{dj=@EM|X+jZ}ceEY0KHG7h%}~ppwV7GZ>BoNf_h5AiJc`i|JIOD>J^qKf zv#>L$isL1zxec`eowRx1A*+=_i0+$j?-0BI%_tdcG$DwyP8{d!Ac2`dJ{V^JZa|wU zTwTm6Wl9u5D%G5)>u(<)l&6tSbu!woX)#q0ak-fS-NY(UF6sT9$&e2S@iPKrIFq+} zbL4KVnJc%(Ot5@TP?pVb1xq032jbtT?HI=HhnKupTpB#Ldvvmkux9Us-#9*#I{s@(4U&hNKD6fP8Yg2xjfI(~$Ri@0csdWuqym(L! zq|ZHmd<@o_y>?nPJveZaj2JAcS=~m3^t5L0AD7RI35TgXAHXIRy;ri->t$EqW^%bq zg7N6c4&n98eJYrtzkZO%3YSgN!k6v7XE_HFGP12YUuE`Y^vAYW`@|!Tjy#6%rQdNK z*B;GPjs|karA%6$;92s|uNI(Yu8Sm%=p3HHCsxWAiPPk(jz7L!*l;d-*Z)`nT3&(~ zV!9fdEsPG#wNQ~ImRNEoaSBq!{{C>30+ zg+GHs(Em6F>uG0!WN?CIX`XgZk&nKJPW!H3uO=+Rd1^`X7rh^exOJbW}?Qul)Xsq)xZCq?^%h5soJnc<_z8KIBr5YkJfl2*#@KEC7x%iUF zDe|P=y1!8p13~QW{j!q8pPdxCaxafc+_53wL*oKPjyScn97fY4=>pF|Z=l~u`0x%JOeDO$?%*6bC3 zj|d`C@$Xrx!>Lea35nb@m>GSlgly8fx4nfqE{7>yM%Jxegu%w`&-{VFYj3&4Dezsz zB2uz=<*fL=YT1L5h?b{PFn9D%m*$*I{BOlB&B1bTFY+a9MWsdkh&#zIObedMBTA06 zeIy`TMr^{#(>d$vM=Lb=&|ElWfn?;HMeTAp?}?@_>1ANe<+ZbQYmT|g+u3InVmYhI zs&Xw~vYD=eruWEc)pn`o#ilC|>4~OgLDsOMX8UOnU$)HLDCUIHX$02JBPA)m#7^5& ziTx)S3xbyuYXSQGXhGvi`68-?K8Lsa*dr~O=i$N4Gbx7zcdduTBb4VX&KAp?p$)o* z!u=h7;zMI%g<CYLc@+`SdH8awPOGx z2gHd~C!Mwo)#=o83Tk@OS}$xar^$J4(?86k?8ix?flRH8`8-UYU1*2Mw8TdE(DujyQPxZl{EYN%dI;$m4f2@<_bv8Cr@ zi$dDaT~Dr;j8NOs#KJHRLYT4dt} zwA;9JRet$(IY;36qMj(p_d)4o0l*3|-X$@E@@9%vC;hiRh&$K{CqS~xozZ~~VE)Dj7liVwEqhrerk4l|T>q!Gk@J764P*NAdY(r_u6v~%f7VZU)#5Byhgfl9SL)*GC~BM+|>$tAP=z;mMKDDdjz%g ztLs)BZK^jkZP~)S%=J5KI_+%t`UkEn@Rzvt+_XR12({e`ZjAJ~(NZv4_6L-LeaV$E zB~R1QS=hHHF;p^e1QK(S1N(X=%Cf>8E3>sPbfKI7h~*P0`D-uX=~V5tih7!f+Obqs zpW*`M&zE<;gFBd)miO)#?t{n|G-B39Q5oRjEO#%xr=otrq3IbEM9v+A_k#M}qkYZ9MuLzksii_~oiFVw9S!H9*^d%h;#fsc~a8mQ`oqL=8{@xyM?6zj&dk^E6buT?57 zuWUaXBCVnLgCLv8??|8!CI#xYV3aq^z$=1+se&U*IFFW)U{l;td_Y^l zu7}&|AaLHPdWB0>fA$-Plco|mjH`y^+9I5lMnwS+Omew2*lFzrwB@0+LS_ob#cL(2 zfDGz%qI@Vi`P@#qfDoglGDRWIR`;dI_k8eNJfphWu>^cU%u5W*B*v)DC*tu)Z=!DzdtUFa!Z7ISJlbGrI~3Z5#FYGLO0 zIl?i?YUx(~qQ;4;{BW@n+t8@_J_Bo>98DA(r_2`(ern!e>vXH>2Cmz{5dNaLdx$Z`udN7AK%NVPvZK09}Mp9m<` zLmo5gG|}v5#hK28n{_gCGtw-2x4b$JTi&%IoUo+=gPHjBvtm9aX3igDqwo(Z;G%y< z@&2Z35!{&+u1bNO+4GOe6(mq39XwWv;W!w>Y49B1&b6bBVPW_w!@eNI*ekCTa6nRzyzLgs$LsVq%NPEjvwibTK^mS0re|X2|A7 zG~4lC`ln)TXW5#5a_G~gn9)D)!NvE09BG@?w0fNk6SBRL5IHE6CDK1C3l}U~>uTa)diKpbi{7q8(oo`iFV>+ zCDb(fD_SLa)f4Soq3;W6GzllfJKW1$wN!FQ+U+0b;aq!PUn}X*r+m`d+L`1@O*qFE zb7r2lUoNo}&<1{EqwNNruZMzIFo*&*)t7@8y*BTR<-exUdk6L}uM|7G%T@?_n z3Yeey7GAPp@EXaC3HogxOSMh5l3jkfX6}ua;A{CBdH`QjUTH41By351i)1x(nz&!M z@7yU6RAc*X=c<_1ij_59vMaJ--jsKwzqBvnUiy>F@8;2TxI29(%JM#bn@EYgD-vf* zOxEam3mOFf`GL$IYdo6u0}7=eAjqxm9)$4VNB=REHi{BU(9FInIg4T+`HqRPnFF=? zX?9J!hp=sB)^)an;B@*^hpwZ+)OKOL!$j-RMkll*nMYzu4rQ`p+zl_Oh&toj>hm_n zr?F>C%Oe?TRwCO_~W!kftELgA}RKdnZ&05AM73-uGSanao;y|8w?Q zlRf90$?W8}_K1ZOKqQ6Y!|`sM8Ez^d8;h`S7L6H%o!HAqGf_joRWabY*;%snnIOMc z4wjrxAZ$a%YVB4;B_%i4sQ#vGe}K~o z``&Nolb_u1s9lJc-S1twsP(I#@n?Z6vM;oMQ2E4eP)2T~UjVSxrmMn z@oIL#^oC{EPufg*AGvq^4+yh-<8%9 zb6c4xE~s5kpNTJVwS1oamOz2@wXta$LI~aH_cV-+m%1!aMJWHnTOQW2K7;7w3HxK3 zSILyQ*h=(IiHi`+m!ci*Be)tRDF?uw4Qx#LC+a_@HG114bJrY{| zv`LOUc)U@(fuF5Et%R(EuNcP?@UX?&aaP?;+f0q?bOEHd>YUBg#7M~+oRRR`gx|+iC~%@lVq_@ucXJ8JoBjvjbIx#sjn8|Pi*jF<_Jzn+{B&i zl@9uL_H~KGQ7jIB^4d|1sR;}(eoU%S%tf)hF5JL8Zg{Z7w`%2IFLB1)gp1vS({q5N za--j+u((dTpGaJTairV9P?_nX|I1YsR4K*+8L>LFoG^RL5*3fg3@y zkP6ht3i1rB*60W-`}&YddxK)quDZk};XIzIA2x8Vn=DfPmF}+c^~bN0lS$~juln|H z(Yar_1oXWK%An!~p`r+@1Q=!6sxr=a=yVeND->0e^72BD>JF@OanzPVKjiqhMK~=$ zHQQXr3{y*ph^Wv+$CgLe46~2Ao@iX7#af9VuDSJ9NULFnn3Wd?0%JU`hG;xD@#oAm z0neprr1f<#Vmp{R<%++p^4ePeq=m>ahaGMd`nP^leMl(F9Fa9;vY&VdzJpUK?Jn-h zC&G=u_!;4VOIz#`VNDQs0pzoAlkBf4?8}XS7fnl*g^-7xxt%*~3c28J5ej!`KEaqAc*LEn4vbppt z)oAMkRYto77pFk{M>+}Gc782xf%ep^`sj{o4((9ELIpNlkmfZ|heP0^s5s=?gSbIM z9H_Ly7;t>xsKqDiy5?wmWT2{7;NJZ0i=Qu2|2e}QKu<1F%A*I5=>;&Pw&k;Z0mT5g+*nv~d|>J*4SGl_*WWT3u1 z$*?z{iPCUU8+f?fOz00|W(1t$zA0i10PHG=M?1E8dVGiM^qO%#PN>(U01DGLcHNJz zW9~ua(e=PVwOn;;3w9W`8=D-L<(_?Pn|Lx+miwNl4ci;!kg`*%?y+rCA334(yK`)y zssfueQ18Y2Ca)i`MqlO~fpltxGU-)F;?} zrJm+6M#KnM4ByevoYCV;@Y$) z>#1eMbEX2)aIMExnU+`8Xb)(r+U{}UQeM#0`?l{nE9#|5DVN0{&x~0CtcBeP+ zdOm3{yZ=>{W{K^41i5?E5Ti)K)!7L*I9XsGPlHkB?NFaCuKucjqFB5-cW=IV?V{~v zG5sf7=OSsNu%8WdESu&Gc(oSWifjL6K7k#<5A$m+bciot}YOBLD-o^v7K*p{N*O#Xj1nYj% zISPElo9K)$=#P9T+$ZD?Ix@kylKJkFed@`ZEVX0&OUECC^RCn>nP~Ki?wOD1m`~^P zlb%2hwsLw?I+lR2&P^Mc-aXku$38v6Q!~M%PpRL6R77MNI%S$%3H8h2Qx)HflC)|o z)4C^nd@5n>9kHH226&?ZM%+4nF6d{o99AFv62V>h=V|QL4VF{Cxs%Vc%fc;Ii~P!B z4@j$4Jq|50-Zs(4Ho-EPU#Z|orNd31&05x@&MC5>72bT;imRC)JWRUZFKSykn^Qyb zx05Vvju2Y@D^*##xco;gbZh!x62Xfctx+rdYN4KFA3HwnMz@pj*n{7$aqSsVjeRE} zS`n5yIk5h?JlAD4nHQU}WdrxPAljs(2S=8@T$f?OByeN#K}C_)%1AWMk7npgDBRz&^r;0sh)cv|w&U~B{=Xq;T) zJ>%yq&=OVY#xdGX>7cLGQv~BsYSf_Rc^p;K(UXuN&=1S{m#2b+7Hi`@I65=2bXaAJ z8J7v#%`7pQ6t-9760m^_yO-()N}{a}5p<;t?Yo}Y8FPcL*Y`6}EIg`FRKEV8?zOew zp64weFp)>jymP$6W0ZDZhjIKSestK-xF^hY*DUlvZ??^Hk{VcMfi_fT4KjOUN<@t_ z&*A!XbW2X{PsLf@D|IJksuZLbz5i19Ft6HW-AZVtt31=ZR&Z|1-G~0f1qY_}W1$b1 zPTP;TG_11GCjaI>qD>ao9IwV&Yljem9LBm>J4B3NaPV@Au7UUcJ!l7P^XZD1K%M`S zL0koG&=Fuo&3~NpG}GD12kWFfdSYO?A+5i%w!beD_j#(byD)L_a(hg<5CduuY8}xL zz4@7B-nQIBkg?2qDg$Loe^OoyS!u!5lbFOG4ts~{8}V6{`n)LYu=5c7&@q|r<3k%_ z6caVdWdXJ7Qbqbsi5RWI$8Pz z8gAn7kk1nJw)41T_rAeRX{tOyZojjx?i-a)QM8mWP1VE`C8jl`>(gKg?hoFlaGHlKbQw z8W43Q>%jDOc#Y8i>J>|@aobB^I9a2G-Q@Jz^eX)v7w(13yacj4S;*Si4Dpmle{YYT zM5Bp7>>^UJILR7nPodL5ll?&Qc8iw4xMm#aBRfAy&eV^9d6Ic17wpyHi0POB$8Q}%G)5n<74`Y@ zJ`Hh7=T8Z3D=b~cw4=>uSkqRUu;vzc?S#FThWKbiSV34)b&$wn?M5d{?Y`iCf|57B zR;(eMYT7ycLlR$zGk23uvx7;cv>!qE5V}r!J}0peYH(@B*$*Cc1FzY4kE3wcj~nB- zbcJFZ7>yW?ExCFsIX{`#*XD+6(zrU9BkOpF*7k~;U=UXE7~FUw;3#is*$b$gIOH*V zGLI~w>hL~*ky3T}k!88xMn;Ly9WJdoP)yN#G6}pp)6HL@A2#4^a>a3#idg!X@A*KN z0dh!eiS*92`Jk7zpLKgUcX#l&_xrhr^rP1+%r1t4fRgE)JtJKqpz_TF-pPzP|40(; z1D5-0Y=&6w!96d|W9c59P8)unoEsT(4=wHI1=q%wJM+@gZq1@BnoH?B&)XMq;^`fY zz+TbO!>bOv`_a6_d8I#Dz@p#@Q0(r&IN0|^!{i7XxWd(VV!fljWA%$S?IvydM0AbP z#7x-QBbHrxtEpjTtx$qesIP=|?cA*HXUeFGsSfXW`Ya1%E)xF!(CJYjA98GLd{{rK zrb^vuc4&NRWEXmX>Z+|r*5?uz)J-&`OHjg}WsuL(x-->&@-8>(l&`<35aX=Y@+C$0 zsnODh8v4bl6mOJEMwvI@K%yDBCIUhm5-t9z~1;UD+Jnf zaF>-QjYtryZW!Fu+Vd%wGue6PCw*wK6gDp)vSfTs>9hAVn``w`xY;|Z1OLTxoT{sB zduy~B7M!?0d+F0^_HuBSOvJ=%oVshN7P<4o(M5h4UUc?_J@U5%f?q}uJ%9chN!P?L zBZ@xMUi#ZT)jQ&sftZ|iyZ1?$z6|)iQq+0tWOhd_XVTXK4v&IYyJ2(qBPCU@W^ETd ze}#>SZZp`1XR_SaRRu{CH%DCQo?(2PZ#_SEq@`~E{l2Db{#zCosG_>kP`Gb1<$0!0 zP{j$M2&q%6gL$$BI}dpZVbVTDuChKdq;e@^utvR_UDfU70#CWKY_)ADQPSPusgvT-hVNR?$%@b;yx_FvdX=s_wAWH-!Qu`yQrSDj`BQI~3_%pq-K@1V z+L?~_9@+JJeuqAvy18pDLON-YCp%$)3E{z+&R<_2xaW=rG-jH{jKbu>LmP^01s5LU z{KgMX3sm(PhkJTyRO|bb6RZj*#g#O2D4oR2B%*gXogAL61J1B&Ilx&m-{(R0i2G5O ziJD=(t@HP=YZ@7|Iw{*b;3ubW-qSXTp12UhAX_cloW+*5VxhA=CY?Jb>XRoH5^+2J zPF#0?p_p#MFyvmk?MVMRyF7cr!j|4$u(lT}H7SmMqQrD;3b8qxW>@bM^HpPGO;+V2 z4<@X(SYqn?6h-YsSJ?#UcEKhYPG^3gnnsw;hB{bb`#uj-*;7=w+4|DGkqn%I(ENS% zR+;nNl^8Sr>$qLV#7Y9{G!cVdqhZ2SjD?`zq?3aA4amWcX3z_oO@`)sV$5UOAJhbr z_Z0j^qfOe_mzpZ#eGfP_5`v_%NvMgOMacMjspEmbWO%!GV{$I*KD79&Nv|XG3itru z#A2W&KntXZYIta&!WW#>5;JkLkblCgTf)1bYywLh6IOl5=G}3K#fLQ?YU7h*=L@c6_i8OKr z9RimjH{U-hWHYqTT6Yg67BFgG-5sq~Nyw2aqDB322GtZEyLFf;5?l(MuA2{BpW&>P8a z+dP(H%gVEDrAprI%7rwxO5(exp1auIWT(uhjx;V8>H%ff5hF51$JcD9!_>RsjhuC+ z!{~hOw=d}5JFmXHhX+`!W3RK#CBipZDJ-U(ajmy6{)VQYJ2jVyztY-Tgv?%e zysy2@*jZ9TaLJ-_Ew?MK?!J3Dqp6>8WyP9RLYiP_=PRC9ID5*>1T$21?yTQ)hdp|j zCr#;|zqFmJ+{tXzO5O!?JN3*}O6lJo@jOj>a>&3O-^N{yC+usQA0q@Ih44)k)?>|J zb{jreQGPIj6=+~$p!^f7F^xSXT4xa}ulKt#3}=}s>N0g2Ho-*->0@vrtHqiT1>|yV zKYRt&Y!IJ}op8tXUJ~tM`dVu5f-=S(bJLS01e5r0churdn>eMu3Ykzv1`$tBAdNe0 z9#2A%JKr5{YV0v-VJ9+oafB%W{%TVzyisOshjM;N%%i6%_F3SwHf2A*@_bL;FB zVs!Iw4RkmLSgv$y;_@gs4HNT{HIu{;5QQy%(vU*LWOKBtEE8Q|zJSWK{h1Fr+L(7m|}eC(Nql8*IF`EO7!emRftMe6AXQ>!7+Tl*MW zH#ZRityOGs^~4RqaE_G52J^n2EFpW&sei{1;oL#_)rXX}NjZQZJyLei^77^>smHlO zfd7HAU$)=8Uz=vkykD6(HOEDh@foA8Oo1-FZuT?Jn+=hKD<8%b;JBDgNcjcf(K0am zm78l2>xFu7BL;LA8^TK8kUf392TWXx?b23Qb_3MsM%Q`G&@dxZ*dJ3w#k_se{Y&5Z z1&&cNOR%VJ;TEhp(;-$o~s5vKQ7p3kOV-PtwOsav`>2miaq&Tb0nB;M7DXjPys!67QPn zcM5}yzSjbV2Vj!~NKfb?J+R>}&dP$r{f+Pm#GrODWp~mxV47>&gQb=NXhe7}vM*2k zKuwAQJazQ8ct~P2Uz?&d6agVvd36Pq# zxO6U%du%=>D(>Ck!uj075bQ>0K|FsX zXuh2BX{g==4u`WG3vJS2+7Wle27EppI(WlhxJXwbUUi z`+}LJC9a*DT`g9Q2_Kcbd3WOP!T%tI$&G36QFmy`LE}Nv0hj1iLM@)#$O(p&3QNJg zeNvBv?{uMNU08>ovvM0>u)H@=+ZV^lcmneb7YGg-|H-;~4CzeZc&cHn)h1fo8BpGP(t?QqK2JkjT%&+J@i;h7lyVfkys5 zn82c|b(-i`>9E{}?L{`BQ_4{*hNu;06i$$5|*1}bjyVO#VdJwnR|Hsb)||zguucC4<0Byg%bP^M1P)= literal 0 HcmV?d00001 diff --git a/tests/test_issues.py b/tests/test_issues.py index cfbaedda..53904d1b 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -257,3 +257,13 @@ def test_issue_683(self): with pdfplumber.open(path) as pdf: page = pdf.pages[0] page.search(r"\d+", regex=True) + + def test_issue_964(self): + """ + extracted word is broken due to multi overlapped blank chars + """ + path = os.path.join(HERE, "pdfs/issue-964-example.pdf") + with pdfplumber.open(path) as pdf: + page = pdf.pages[0] + lines = page.extract_text().splitlines() + assert lines[5].startswith("VLHDU8SHRR Homeowner Discount") From 79a3be2ae9ec514391232215264558399b9305e1 Mon Sep 17 00:00:00 2001 From: "Johnny.H" Date: Thu, 17 Aug 2023 11:47:41 +0800 Subject: [PATCH 2/3] Added `utils.remove_overlapped_whitespace(...)` Added `page.remove_whitespace(only_overlapping=False, ...)` --- pdfplumber/page.py | 18 +++++++++++++++ pdfplumber/utils/__init__.py | 1 + pdfplumber/utils/text.py | 45 ++++++++++++++++++++++++------------ tests/test_issues.py | 8 +++++++ 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/pdfplumber/page.py b/pdfplumber/page.py index 521002f4..6a4fe848 100644 --- a/pdfplumber/page.py +++ b/pdfplumber/page.py @@ -455,6 +455,24 @@ def dedupe_chars(self, **kwargs: Any) -> "FilteredPage": p._objects["char"] = utils.dedupe_chars(self.chars, **kwargs) return p + def remove_whitespace( + self, only_overlapping=False, **kwargs: Any + ) -> "FilteredPage": + """ + Removes all the whitespace chars. + When `only_overlapping=True`: only remove the whitespace chars in lines + which are overlapped with the following non whitespace chars. + """ + if only_overlapping: + p = FilteredPage(self, lambda x: True) + p._objects = {kind: objs for kind, objs in self.objects.items()} + p._objects["char"] = list( + utils.remove_overlapped_whitespace(self.chars, **kwargs) + ) + else: + p = FilteredPage(self, lambda obj: obj.get("text") != " ") + return p + def to_image( self, resolution: Optional[Union[int, float]] = None, diff --git a/pdfplumber/utils/__init__.py b/pdfplumber/utils/__init__.py index 537253a8..bce0d304 100644 --- a/pdfplumber/utils/__init__.py +++ b/pdfplumber/utils/__init__.py @@ -40,4 +40,5 @@ extract_text, extract_text_simple, extract_words, + remove_overlapped_whitespace, ) diff --git a/pdfplumber/utils/text.py b/pdfplumber/utils/text.py index a131a8ee..ceccf5e5 100644 --- a/pdfplumber/utils/text.py +++ b/pdfplumber/utils/text.py @@ -456,18 +456,6 @@ def iter_sort_chars(self, chars: T_obj_iter) -> Generator[T_obj, None, None]: def upright_key(x: T_obj) -> int: return -int(x["upright"]) - def remove_overlapped_blank_char(sub_cluster): - sc_cpy = deepcopy(sub_cluster) - for idx, c in enumerate(sc_cpy): - if c["text"] == " ": - for next_char in sc_cpy[idx:]: - if next_char["text"] != " ": - if next_char["x0"] < c["x0"]: - # this blank char is overlapped with the following chars - sub_cluster.remove(c) - break - return sub_cluster - for upright_cluster in cluster_objects(list(chars), upright_key, 0): upright = upright_cluster[0]["upright"] cluster_key = "doctop" if upright else "x0" @@ -480,9 +468,6 @@ def remove_overlapped_blank_char(sub_cluster): for sc in subclusters: # Sort within line sort_key = "x0" if upright else "doctop" - if upright: - sc = remove_overlapped_blank_char(sc) - to_yield = sorted(sc, key=itemgetter(sort_key)) # Reverse order if necessary @@ -596,3 +581,33 @@ def yield_unique_chars(chars: T_obj_list) -> Generator[T_obj, None, None]: deduped = yield_unique_chars(chars) return sorted(deduped, key=chars.index) + + +def remove_overlapped_whitespace( + chars: T_obj_list, y_tolerance: T_num = DEFAULT_Y_TOLERANCE +) -> T_obj_list: + """ + Remove the whitespace chars in lines which are overlapped with the following non whitespace chars. + """ + + def upright_key(x: T_obj) -> int: + return -int(x["upright"]) + + for upright_cluster in cluster_objects(list(chars), upright_key, 0): + upright = upright_cluster[0]["upright"] + if upright: + # Cluster by line + subclusters = cluster_objects( + upright_cluster, itemgetter("doctop"), y_tolerance + ) + for sc in subclusters: + sc_cpy = deepcopy(sc) + for idx, c in enumerate(sc_cpy): + if c["text"] == " ": + for next_char in sc_cpy[idx:]: + if next_char["text"] != " ": + if next_char["x0"] < c["x0"]: + # this whitespace char is overlapped with the following chars + sc.remove(c) + break + yield from sc diff --git a/tests/test_issues.py b/tests/test_issues.py index 53904d1b..3c26a942 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -266,4 +266,12 @@ def test_issue_964(self): with pdfplumber.open(path) as pdf: page = pdf.pages[0] lines = page.extract_text().splitlines() + assert lines[5].startswith("VLHDU8SHRR H o m e o w ner Discount") + lines = ( + page.remove_whitespace(only_overlapping=True) + .extract_text() + .splitlines() + ) assert lines[5].startswith("VLHDU8SHRR Homeowner Discount") + lines = page.remove_whitespace().extract_text().splitlines() + assert lines[5].startswith("VLHDU8SHRR HomeownerDiscount") From e48aa70f80430d745161cb7f198743987ecacb6f Mon Sep 17 00:00:00 2001 From: "Johnny.H" Date: Mon, 28 Aug 2023 10:04:45 +0800 Subject: [PATCH 3/3] fix lint error --- pdfplumber/page.py | 6 +++--- pdfplumber/utils/text.py | 43 ++++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/pdfplumber/page.py b/pdfplumber/page.py index 6a4fe848..62ff7b2b 100644 --- a/pdfplumber/page.py +++ b/pdfplumber/page.py @@ -456,7 +456,7 @@ def dedupe_chars(self, **kwargs: Any) -> "FilteredPage": return p def remove_whitespace( - self, only_overlapping=False, **kwargs: Any + self, only_overlapping: bool = False, **kwargs: Any ) -> "FilteredPage": """ Removes all the whitespace chars. @@ -466,8 +466,8 @@ def remove_whitespace( if only_overlapping: p = FilteredPage(self, lambda x: True) p._objects = {kind: objs for kind, objs in self.objects.items()} - p._objects["char"] = list( - utils.remove_overlapped_whitespace(self.chars, **kwargs) + p._objects["char"] = utils.remove_overlapped_whitespace( + self.chars, **kwargs ) else: p = FilteredPage(self, lambda obj: obj.get("text") != " ") diff --git a/pdfplumber/utils/text.py b/pdfplumber/utils/text.py index ceccf5e5..ab784eb3 100644 --- a/pdfplumber/utils/text.py +++ b/pdfplumber/utils/text.py @@ -587,27 +587,32 @@ def remove_overlapped_whitespace( chars: T_obj_list, y_tolerance: T_num = DEFAULT_Y_TOLERANCE ) -> T_obj_list: """ - Remove the whitespace chars in lines which are overlapped with the following non whitespace chars. + Remove the whitespace chars in lines which are overlapped with the following non + whitespace chars. """ def upright_key(x: T_obj) -> int: return -int(x["upright"]) - for upright_cluster in cluster_objects(list(chars), upright_key, 0): - upright = upright_cluster[0]["upright"] - if upright: - # Cluster by line - subclusters = cluster_objects( - upright_cluster, itemgetter("doctop"), y_tolerance - ) - for sc in subclusters: - sc_cpy = deepcopy(sc) - for idx, c in enumerate(sc_cpy): - if c["text"] == " ": - for next_char in sc_cpy[idx:]: - if next_char["text"] != " ": - if next_char["x0"] < c["x0"]: - # this whitespace char is overlapped with the following chars - sc.remove(c) - break - yield from sc + def yield_overlapped_whitespace() -> Generator[T_obj, None, None]: + for upright_cluster in cluster_objects(list(chars), upright_key, 0): + upright = upright_cluster[0]["upright"] + if upright: + # Cluster by line + subclusters = cluster_objects( + upright_cluster, itemgetter("doctop"), y_tolerance + ) + for sc in subclusters: + sc_cpy = deepcopy(sc) + for idx, c in enumerate(sc_cpy): + if c["text"] == " ": + for next_char in sc_cpy[idx:]: + if next_char["text"] != " ": + if next_char["x0"] < c["x0"]: + # this whitespace char is overlapped with the + # following chars + sc.remove(c) + break + yield from sc + + return list(yield_overlapped_whitespace())