
    )i                      v   S SK r S SKJr  S SKJrJrJr  SSKJrJ	r	J
r
Jr  SSKJr  S\\
   S	\\\	4   4S
 jrS\\
   S	\4S jr\" SSSS5      rS\
S	\4S jrS\S	\\\	4   4S jrS\\   S	\4S jrS\S\S	\\   4S jrS\S	\	4S jrS\
S\S	\\
   4S jrS\\
   S\S	\4S jrS\\
   S\S	\4S jrS\\
   S\S	\4S jrS\\
   S\S	\4S jrS\
S \S!\	S	\
4S" jrS\\
   S#\S$\	S	\4S% jrS\
S&\S!\	S	\
4S' jrS(\
S	\4S) jrS*\
S	\4S+ jr S,\
S	\
4S- jr!S\
S	\4S. jr"   S4S/\\
   S0\\   S1\\   S2\	S	\4
S3 jjr#g)5    N)
itemgetter)DictIterableOptional   )T_bboxT_numT_obj
T_obj_list   )cluster_objectsobjectsreturnc                 *    [        [        U 5      5      $ )z
Given an iterable of objects, return the smallest rectangle (i.e. a
dict with "x0", "top", "x1", and "bottom" keys) that contains them
all.
)bbox_to_rectobjects_to_bboxr   s    Y/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/pdfplumber/utils/geometry.pyobjects_to_rectr   	   s     011    c                 4    [        [        [        U 5      5      $ )zX
Given an iterable of objects, return the smallest bounding box that
contains them all.
)merge_bboxesmapbbox_getterr   s    r   r   r      s    
 K122r   x0topx1bottomobjc                     [        U 5      $ )z(
Return the bounding box for an object.
)r   )r   s    r   obj_to_bboxr!      s     sr   bboxc                 (    U S   U S   U S   U S   S.$ )zX
Return the rectangle (i.e a dict with keys "x0", "top", "x1",
"bottom") for an object.
r   r   r      r   r   r   r    )r"   s    r   r   r   $   s#    
 q'$q'aDGLLr   bboxesc                 l    [        U 6 u  pp4[        U5      [        U5      [        U5      [        U5      4$ )z_
Given an iterable of bounding boxes, return the smallest bounding box
that contains them all.
)zipminmax)r'   r   r   r   r   s        r   r   r   ,   s1    
 v,BRGSXs2wF44r   abc                     U u  p#pEUu  pgp[        X&5      n
[        XH5      n[        XY5      n[        X75      nX-
  nX-
  nUS:  a  US:  a  X-   S:  a  XX4$ g )Nr   )r+   r*   )r,   r-   a_lefta_topa_righta_bottomb_leftb_topb_rightb_bottomo_lefto_righto_bottomo_topo_widtho_heights                   r   get_bbox_overlapr=   5   ss    '($F7'($F7 F'#G8&HEGH1}A(*<q*@w11r   c                 N    U u  pp4X:  d  X$:  a  [        U  S35      eX1-
  XB-
  -  $ )Nz  has a negative width or height.)
ValueError)r"   leftr   rightr   s        r   calculate_arearB   D   s7    #Du|s|D6!ABCCLV\**r   c                     [        [        U 5      U5      nUc  g [        U5      n[        U 5      nS H	  nX5   XE'   M     US   U S   -
  nU S   U-   US'   US   US   -
  US'   US   US   -
  US'   U$ )	Nr%   r   doctopr   r   widthr   height)r=   r!   r   dict)r   r"   overlapdimscopyattrdiffs          r   clip_objrM   K   s    {3/6G D9D-Z
 . ;U#D]T)DNJd+DM(^d5k1DNKr   objsc                 b    U  Vs/ s H  n[        [        U5      U5      c  M  UPM     sn$ s  snf )z2
Filters objs to only those intersecting the bbox
r=   r!   rN   r"   r   s      r   intersects_bboxrR   ^   s+      X4C#3K4Dd#KC4XXX   ,,c                 z    U  Vs/ s H)  n[        [        U5      U5      [        U5      :X  d  M'  UPM+     sn$ s  snf )z2
Filters objs to only those fully within the bbox
rP   rQ   s      r   within_bboxrU   e   sB     CK,d3{37GG 	  s   &88c                 b    U  Vs/ s H  n[        [        U5      U5      b  M  UPM     sn$ s  snf )z3
Filters objs to only those fully outside the bbox
rP   rQ   s      r   outside_bboxrW   p   s+      T4C#3K4Dd#KC4TTTrS   c                 B   ^ [        [        SU4S jU  5       5      5      $ )zd
Filters objs to only those intersecting the bbox,
and crops the extent of the objects to the bbox.
Nc              3   <   >#    U  H  n[        UT5      v   M     g 7f)N)rM   ).0r   r"   s     r   	<genexpr>crop_to_bbox.<locals>.<genexpr>|   s     BTchsD11Ts   )listfilter)rN   r"   s    `r   crop_to_bboxr_   w   s    
 tBTBCDDr   axisvaluec                 D   US;   d   eUS:X  a  SU S   U-   4SU S   U-   4/nUS:X  aE  SU S   U-   4SU S   U-   4/nSU ;   a  USU S   U-   4/-  nS	U ;   a  US	U S	   U-
  4S
U S
   U-
  4/-  nU R                  [        U R                  5       5      [        W5      -   5      $ )N)hvrc   r   r   rd   r   r   rD   y0y1)	__class__tupleitems)r   r`   ra   	new_itemss       r   move_objectrk      s    :s{3t9u$%3t9u$%
	 s{CJ&'s8}u,-
	 s?8S]U%:;<<I3;s4y5()s4y5() I ==syy{+eI.>>??r   rK   	tolerancec                    SSSSS.U   n[        U 5      n[        U[        U5      U5      nU Vs/ s H-  n[        [	        [        U5      U5      5      [        U5      -  PM/     nn[        XW5       VVV	s/ s H'  u  phU V	s/ s H  n	[        XXU   -
  5      PM     sn	PM)     n
nnn	[        [        R                  " U
6 5      $ s  snf s  sn	f s  sn	nnf )Nrc   rd   r   r   r   r   )
r]   r   r   sumr   lenr)   rk   	itertoolschain)rN   rK   rl   r`   	list_objsclustersclusteravgsavgr   snapped_clusterss              r   snap_objectsry      s    S<TBDT
Iy*T*:IFHNVWh7CJt$g./#g,>hDW  //LG =DDGSS$i	0GD/   	!1233 XDs   4C5CCCCkeyc                    US;   d   eX   nX#-
  nX4/nUS:X  a$  X S   ::  d   eUR                  SU S   U-
  45        OUS:X  a#  X S   :  d   eUR                  SX S   -
  45        OUS:X  a\  X S   ::  d   eUR                  SU S   U-   45        UR                  SU S   U-
  45        S	U ;   a  UR                  S	U S	   U-
  45        OHUS:X  aB  X S   :  d   eUR                  SU S   U-   45        S
U ;   a  UR                  S
U S
   U-
  45        U R                  [        U R                  5       5      [        U5      -   5      $ )Nrn   r   r   rE   r   r   rD   rF   rf   re   )appendrg   rh   ri   )r   rz   ra   	old_valuerL   rj   s         r   resize_objectr~      s   ////ID	I d{D	!!!'3t9u#456	D	!!!'5t9#456	H%%%(CMD$89:(CMD$89:3;dCI$456	E
"""(CMD$89:3;dCI$456==syy{+eI.>>??r   curvec                    [        U S   U S   SS  5      nU VVs/ s H  u  p#S[        US   US   5      [        US   US   5      [        US   US   5      [        US   US   5      U S   U S   -
  -   [        US   US   5      [        US   US   -
  5      [        US   US   -
  5      US   US   :X  a  SOUS   US   :X  a  SOS S	.	PM     snn$ s  snnf )
Nptsr   
curve_edger   rD   r   rd   rc   )	object_typer   r   r   rD   r   rE   rF   orientation)r)   r*   r+   abs)r   point_pairsp0p1s       r   curve_to_edgesr      s   eElE%L$45K " "FB (beRU#beRU#r!ube$"Q%A'5?U5\+IJ"Q%A'AA'"Q%"Q%-("$Q%2a5.3ber!unsRV
	
 "  s   B4Crectc           	      \   [        S5       Vs/ s H  n[        U 5      PM     snu  p#pEUR                  SSU S   U S   SS.5        UR                  SSU S   U S   U S	   -   U S
   U S	   -   SS.5        UR                  SSU S   SS.5        UR                  SSU S   SS.5        X#XE/$ s  snf )N   	rect_edger   rf   r   rc   )r   rF   re   r   r   re   rF   rD   )r   rF   rf   r   rD   r   r   rd   )r   rE   r   r   r   )r   rE   r   r   )rangerG   update)r   xr   r   r@   rA   s         r   rect_to_edgesr      s    49!H=HqT
H=CJJ&t*5k	
 MM&t*;h/8ntH~5	
	 	KK&t*		
 
LL&t*		
 %%I  >s   B)linec                 B    [        U 5      nU S   U S   :X  a  SOSUS'   U$ )Nr   r   rc   rd   r   )rG   )r   edges     r   line_to_edger      s+    :D"&u+h"?#cDKr   c                 n    U S   nSU;   a  U /$ US:X  a  [        U 5      /$ [        [        S.U   " U 5      $ )Nr   _edger   )r   r   )r   r   r   )r   ts     r   obj_to_edgesr      sD    MA!|u	
fS!""%?B3GGr   edgesr   	edge_type
min_lengthc                 ~   ^^^ TS;  a  [        S5      eS[        S[        4UUU4S jjn[        [	        X@5      5      $ )N)rd   rc   NzOrientation must be 'v' or 'h'er   c                    > U S   S:X  a  SOSnTb  U S   T:H  OSnTS L =(       d    U S   T:H  n[        U=(       a    U=(       a    X   T:  5      $ )Nr   rd   rF   rE   r   T)bool)r   dim
et_correctorient_correctr   r   r   s       r   testfilter_edges.<locals>.test  sb    M*c1hw6?6KQ}%2QU
$,O-0@K0OJL>Lqv7KMMr   )r?   r
   r   r]   r^   )r   r   r   r   r   s    ``` r   filter_edgesr     sH     **9::N N$ N N t#$$r   )NNr   )$rq   operatorr   typingr   r   r   _typingr   r	   r
   r   
clusteringr   strr   r   r   r!   r   r   r=   rB   rM   rR   rU   rW   r_   rk   ry   r~   r   r   r   r   r   r&   r   r   <module>r      s     + + 6 6 '2Xe_ 2c5j1A 23Xe_ 3 3 udH5U v Mv M$sEz"2 M5&) 5f 5 6 hv.> + +E +% v (5/ &Y(5/ Y YJ Yhuo V 
 Ux Uf U UEx Ef E E@U @# @e @ @,	4x 	4c 	4e 	4
 	4@u @3 @u @ @6% J $%& %&* %&Pu  He H
 H "&#	%E?%#% }% 	%
 %r   