
    Ng                         d dl Z d dlmZ d dlmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZ dee
         d	eee	f         fd
Zdee
         d	efdZ edddd          Zde
d	efdZded	eee	f         fdZdee         d	efdZdeded	ee         fdZded	e	fdZde
ded	ee
         fdZdee
         ded	efdZdee
         ded	efdZdee
         ded	efdZdee
         ded	efdZde
d ed!e	d	e
fd"Zdee
         d#ed$e	d	efd%Zde
d&ed!e	d	e
fd'Zd(e
d	efd)Zd*e
d	efd+Z d,e
d	e
fd-Z!de
d	efd.Z"	 	 	 d4d/ee
         d0ee         d1ee         d2e	d	ef
d3Z#dS )5    N)
itemgetter)DictIterableOptional   )T_bboxT_numT_obj
T_obj_list   )cluster_objectsobjectsreturnc                 :    t          t          |                     S )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    U/var/www/html/ai-engine/env/lib/python3.11/site-packages/pdfplumber/utils/geometry.pyobjects_to_rectr   	   s     00111    c                 F    t          t          t          |                     S )zd
    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1222r   x0topx1bottomobjc                 $    t          |           }|S )z0
    Return the bounding box for an object.
    )r   )r   bboxs     r   obj_to_bboxr"      s     s##DKr   r!   c                 @    | d         | d         | d         | d         dS )zd
    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LLr   bboxesc                     t          |  \  }}}}t          |          t          |          t          |          t          |          fS )zk
    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   -   s=    
 v,BRGGSXXs2wwF44r   abc                     | \  }}}}|\  }}}}	t          ||          }
t          ||          }t          ||	          }t          ||          }||
z
  }||z
  }|dk    r|dk    r||z   dk    r|
|||fS d S )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=   6   s    '($FE7H'($FE7H  F'7##G8X&&HuEG%H1}}A(W*<q*@*@w11tr   c                 b    | \  }}}}||k    s||k    rt          |  d          ||z
  ||z
  z  S )Nz  has a negative width or height.)
ValueError)r!   leftr   rightr   s        r   calculate_arearB   E   sK    #D#ufe||sV||DBBBCCCDLVc\**r   c                 :   t          t          |           |          }|d S t          |          }t          |           }dD ]}||         ||<   |d         | d         z
  }d|v r| d         |z   |d<   |d         |d         z
  |d<   |d         |d         z
  |d<   |S )	Nr%   r   doctopr   r   widthr   height)r=   r"   r   dict)r   r!   overlapdimscopyattrdiffs          r   clip_objrM   L   s    {3//66Gt  D99D-    $ZT

;U#D4X-XJd+DM(^d5k1DNKr   objsc                      fd| D             S )z:
    Filters objs to only those intersecting the bbox
    c                 N    g | ]!}t          t          |                    |"S Nr=   r"   .0r   r!   s     r   
<listcomp>z#intersects_bbox.<locals>.<listcomp>d   s1    XXXC#3K4D4Dd#K#K#WC#W#W#Wr   r&   rN   r!   s    `r   intersects_bboxrW   `   s      YXXX4XXXXr   c                      fd| D             S )z:
    Filters objs to only those fully within the bbox
    c                 p    g | ]2}t          t          |                    t          |          k    0|3S r&   rR   rS   s     r   rU   zwithin_bbox.<locals>.<listcomp>k   sH       K,,d33{37G7GGG 	GGGr   r&   rV   s    `r   within_bboxrZ   g   s.          r   c                      fd| D             S )z;
    Filters objs to only those fully outside the bbox
    c                 N    g | ]!}t          t          |                    |"S rQ   rR   rS   s     r   rU   z outside_bbox.<locals>.<listcomp>v   s1    TTTC#3K4D4Dd#K#K#SC#S#S#Sr   r&   rV   s    `r   outside_bboxr]   r   s      UTTT4TTTTr   c                 V    t          t          dfd| D                                 S )zp
    Filters objs to only those intersecting the bbox,
    and crops the extent of the objects to the bbox.
    Nc              3   8   K   | ]}t          |          V  d S rQ   )rM   rS   s     r   	<genexpr>zcrop_to_bbox.<locals>.<genexpr>~   s-      BBchsD11BBBBBBr   )listfilterrV   s    `r   crop_to_bboxrc   y   s2    
 tBBBBTBBBCCDDDr   axisvaluec                    |dv sJ |dk    rd| d         |z   fd| d         |z   fg}|dk    rPd| d         |z   fd| d         |z   fg}d| v r|d| d         |z   fgz  }d	| v r|d	| d	         |z
  fd
| d
         |z
  fgz  }|                      t          |                                           t          |          z             S )N)hvrg   r   r   rh   r   r   rD   y0y1)	__class__tupleitems)r   rd   re   	new_itemss       r   move_objectro      s
   :s{{3t9u$%3t9u$%
	 s{{CJ&'s8}u,-
	 s??8S]U%:;<<I3;;s4y5()s4y5() I ==syy{{++eI.>.>>???r   rK   	tolerancec                    ddddd         t          |           }t          |t                    |          }fd|D             }fdt          ||          D             }t          t	          j        |           S )Nrg   rh   r   r   r   r   c           	          g | ]<}t          t          t                    |                    t          |          z  =S r&   )sumr   r   len)rT   clusterrK   s     r   rU   z snap_objects.<locals>.<listcomp>   s>    WWW7CJt$$g..//#g,,>WWWr   c                 8    g | ]\  }fd |D             S )c           	      D    g | ]}t          ||         z
            S r&   )ro   )rT   r   rK   avgrd   s     r   rU   z+snap_objects.<locals>.<listcomp>.<listcomp>   s-    DDDSS$c$i	0	0DDDr   r&   )rT   rv   ry   rK   rd   s     @r   rU   z snap_objects.<locals>.<listcomp>   sI       GS 	EDDDDDGDDD  r   )ra   r   r   r)   	itertoolschain)rN   rK   rp   	list_objsclustersavgssnapped_clustersrd   s    `     @r   snap_objectsr      s    S<<TBDT

Iy*T*:*:IFFHWWWWhWWWD    $//   	!12333r   keyc                 2   |dv sJ | |         }||z
  }||fg}|dk    r0|| d         k    sJ |                     d| d         |z
  f           n|dk    r/|| d         k    sJ |                     d|| d         z
  f           n|dk    rs|| d         k    sJ |                     d| d         |z   f           |                     d| d         |z
  f           d	| v r |                     d	| d	         |z
  f           nX|dk    rR|| d         k    sJ |                     d| d         |z   f           d
| v r |                     d
| d
         |z
  f           |                     t          |                                           t          |          z             S )Nrr   r   r   rE   r   r   rD   rF   rj   ri   )appendrk   rl   rm   )r   r   re   	old_valuerL   rn   s         r   resize_objectr      s   /////CI9D	eI d{{D	!!!!'3t9u#456666	D	!!!!'53t9#456666	H%%%%(CMD$89:::(CMD$89:::3;;dCI$45666	E
""""(CMD$89:::3;;dCI$45666==syy{{++eI.>.>>???r   curvec                 h     t           d          d         dd                    } fd|D             S )Nptsr   c                    g | ]\  }}d t          |d         |d                   t          |d         |d                   t          |d         |d                   t          |d         |d                   d         d         z
  z   t          |d         |d                   t          |d         |d         z
            t          |d         |d         z
            |d         |d         k    rdn|d         |d         k    rdndd	S )	
curve_edger   r   rD   r   rh   rg   N)	object_typer   r   r   rD   r   rE   rF   orientation)r*   r+   abs)rT   p0p1r   s      r   rU   z"curve_to_edges.<locals>.<listcomp>   s       B (beRU##beRU##r!ube$$"Q%A''5?U5\+IJ"Q%A''AA''"Q%"Q%-(("$Q%2a5..33ber!unnssRV
	
 
	
  r   )r)   )r   point_pairss   ` r   curve_to_edgesr      sP    eElE%L$455K    "   r   rectc           	           fdt          d          D             \  }}}}|                    dd d          d         dd           |                    dd d	          d          d
         z    d          d
         z   dd           |                    dd d         dd           |                    dd d         dd           ||||gS )Nc                 .    g | ]}t                    S r&   rG   )rT   xr   s     r   rU   z!rect_to_edges.<locals>.<listcomp>   s    ===qT

===r      	rect_edger   rj   r   rg   )r   rF   ri   r   r   ri   rF   rD   )r   rF   rj   r   rD   r   r   rh   )r   rE   r   r   r   )r   rE   r   r   )rangeupdate)r   r   r   r@   rA   s   `    r   rect_to_edgesr      s)   ====E!HH===CuJJ&t*5k	
 	
   MM&t*;h/8ntH~5	
 	
	 	 	 	KK&t*		
 	
   
LL&t*		
 	
   u%%r   linec                 V    t          |           }| d         | d         k    rdnd|d<   |S )Nr   r   rg   rh   r   r   )r   edges     r   line_to_edger      s2    ::D"&u+h"?"?##cDKr   c                     | d         }d|v r| gS |dk    rt          |           gS t          t          d|         |           S )Nr   _edger   )r   r   )r   r   r   )r   ts     r   obj_to_edgesr      sQ    MA!||u	
fS!!""%??B3GGGr   edgesr   	edge_type
min_lengthc                     dvrt          d          dt          dt          ffd}t          t	          ||                     S )N)rh   rg   NzOrientation must be 'v' or 'h'er   c                     | d         dk    rdnd}| d         k    nd}d u p| d         k    }t          |o|o| |         k              S )Nr   rh   rF   rE   r   T)bool)r   dim
et_correctorient_correctr   r   r   s       r   testzfilter_edges.<locals>.test  so    M*c11hhw6?6KQ}%22QU
$,O-0@K0OJL>Lqv7KMMMr   )r?   r
   r   ra   rb   )r   r   r   r   r   s    ``` r   filter_edgesr     s|     ***9:::N N$ N N N N N N N N tU##$$$r   )NNr   )$rz   operatorr   typingr   r   r   _typingr   r	   r
   r   
clusteringr   strr   r   r   r"   r   r   r=   rB   rM   rW   rZ   r]   rc   ro   r   r   r   r   r   r   r   r&   r   r   <module>r      s>             + + + + + + + + + + 6 6 6 6 6 6 6 6 6 6 6 6 ' ' ' ' ' '2Xe_ 2c5j1A 2 2 2 23Xe_ 3 3 3 3 3 judH55U v    Mv M$sEz"2 M M M M5&) 5f 5 5 5 5 6 hv.>    + +E + + + +% v (5/    (Y(5/ Y YJ Y Y Y Yhuo V 
    Ux Uf U U U U UEx Ef E E E E E@U @# @e @ @ @ @ @,	4x 	4c 	4e 	4
 	4 	4 	4 	4@u @3 @u @ @ @ @ @6% J    $%& %&* %& %& %& %&Pu     He H
 H H H H "&#	% %E?%#% }% 	%
 % % % % % %r   