Ë
    vl�j/_  ã                   ól  — d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dZdZdZdZeeeeef   f   Zed	eeef   f   Zerdd
lm Z  eefdedededefd„Z!efdedededefd„Z"dedededededefd„Z#efdede$defd„Z%efdede$defd„Z&	 d0dedededefd„Z'dede	e   fd„Z(de	e   de	e	e      fd „Z) G d!„ d"e*«      Z+ G d#„ d$e+«      Z, G d%„ d&e+«      Z- G d'„ d(e*«      Z.g d)¢Z/g d*¢Z0 G d+„ d,e1«      Z2 e2d «      Z3e G d-„ d	«      «       Z4 G d.„ d/e*«      Z5y)1é    N)Ú	dataclass)Ú
itemgetter)	ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnioné   )Úutils)ÚT_bboxÚT_numÚT_objÚ
T_obj_iterÚ
T_obj_listÚT_pointé   ÚTableSettings)ÚPageÚedgesÚx_toleranceÚy_toleranceÚreturnc                 óº   — g g dœ}| D ]  }||d      j                  |«       Œ t        j                  |d   d|«      }t        j                  |d   d|«      }||z   S )zs
    Given a list of edges, snap any within `tolerance` pixels of one another
    to their positional average.
    ©ÚvÚhÚorientationr   Úx0r    Útop)Úappendr   Úsnap_objects)r   r   r   Úby_orientationÚeÚ	snapped_vÚ	snapped_hs          úF/var/www/html/pp/venv/lib/python3.12/site-packages/pdfplumber/table.pyÚ
snap_edgesr+      st   € ð 35¸2Ñ,>€NØò 3ˆØ�q˜Ñ'Ñ(×/Ñ/°Õ2ð3ô ×"Ñ" >°#Ñ#6¸¸kÓJ€IÜ×"Ñ" >°#Ñ#6¸¸{ÓK€IØ�yÑ Ð ó    r!   Ú	tolerancec                 óB  — |dk(  rd\  }}n|dk(  rd\  }}nt        d«      ‚t        t        | t        |«      ¬«      «      }|d   g}|dd	 D ]P  }|d
   }||   ||   |z   k  r*||   ||   kD  sŒ"t	        j
                  ||||   «      |d
<   Œ@|j                  |«       ŒR |S )z
    Given a list of edges along the same infinite line, join those that
    are within `tolerance` pixels of one another.
    r    )r"   Úx1r   )r#   ÚbottomzOrientation must be 'v' or 'h'©Úkeyr   r   Néÿÿÿÿ)Ú
ValueErrorÚlistÚsortedr   r   Úresize_objectr$   )	r   r!   r-   Úmin_propÚmax_propÚsorted_edgesÚjoinedr'   Úlasts	            r*   Újoin_edge_groupr=   '   sË   € ð �cÒØ'Ñˆ‘(Ø	˜Ò	Ø,Ñˆ‘(äÐ9Ó:Ð:äœ˜u¬*°XÓ*>Ô?Ó@€LØ˜1‰oÐ€FØ˜!˜"Ðò ˆØ�b‰zˆØˆX‰;˜4 ™>¨IÑ5Ò6Ø�‰{˜T (™^Ó+ä"×0Ñ0°°xÀÀ8ÁÓM��r’
ð �M‰M˜!Õðð €Mr,   Úsnap_x_toleranceÚsnap_y_toleranceÚjoin_x_toleranceÚjoin_y_tolerancec                 ó  ‡‡— dt         dt        t        t        f   fd„}|dkD  s|dkD  rt	        | ||«      } t        | |¬«      }t        j                  ||¬«      }ˆˆfd„|D «       }t        t        j                  |Ž «      } | S )z|
    Using the `snap_edges` and `join_edge_group` methods above,
    merge a list of edges into a more "seamless" list.
    Úedger   c                 ó.   — | d   dk(  rd| d   fS d| d   fS )Nr!   r    r#   r   r"   © )rC   s    r*   Ú	get_groupzmerge_edges.<locals>.get_groupP   s-   € Ø�Ñ #Ò%Ø˜˜e™Ð%Ð%à˜˜d™Ð$Ð$r,   r   r1   c              3   óX   •K  — | ]!  \  }}t        ||d    |d    dk(  r‰n‰«      –— Œ# y­w)r   r    N)r=   )Ú.0ÚkÚitemsr@   rA   s      €€r*   ú	<genexpr>zmerge_edges.<locals>.<genexpr>[   s=   øè ø€ ò ñ ˆAˆuô 	Ø�1�Q‘4¨a°©d°cªkÑ*Ð?O÷	
ñùs   ƒ'*)
r   r   Ústrr   r+   r6   Ú	itertoolsÚgroupbyr5   Úchain)	r   r>   r?   r@   rA   rF   Ú_sortedÚedge_groupsÚedge_gens	      ``    r*   Úmerge_edgesrS   D   sŠ   ù€ ð%œð %¤%¬¬U¨
Ñ"3ó %ð ˜!ÒÐ/°!Ò3Ü˜5Ð"2Ð4DÓEˆä�U 	Ô*€GÜ×#Ñ# G°Ô;€Kôð $ô	€Hô ”—‘ (Ð+Ó,€EØ€Lr,   ÚwordsÚword_thresholdc           
      ó¤  ‡— t        j                  | t        d«      d«      }t        ˆfd„|«      }t	        t        t         j                  |«      «      }t        |«      dk(  rg S t        t        t        d«      |«      «      }t        t        t        d«      |«      «      }g }|D ])  }||||d   |d   ||z
  ddœ|||d	   |d	   ||z
  ddœgz  }Œ+ |S )
zi
    Find (imaginary) horizontal lines that connect the tops
    of at least `word_threshold` words.
    r#   r   c                 ó    •— t        | «      ‰k\  S ©N©Úlen©ÚxrU   s    €r*   ú<lambda>z"words_to_edges_h.<locals>.<lambda>m   ó   ø€ ¤c¨!£f°Ñ&>€ r,   r   r"   r/   r    )r"   r/   r#   r0   Úwidthr!   r0   )
r   Úcluster_objectsr   Úfilterr5   ÚmapÚobjects_to_rectrZ   ÚminÚmax)	rT   rU   Úby_topÚlarge_clustersÚrectsÚmin_x0Úmax_x1r   Úrs	    `       r*   Úwords_to_edges_hrl   e   sò   ø€ ô ×"Ñ" 5¬*°UÓ*;¸QÓ?€FÜÓ>ÀÓG€NÜ””U×*Ñ*¨NÓ;Ó<€EÜ
ˆ5ƒz�Q‚Øˆ	Ü””Z Ó% uÓ-Ó.€FÜ””Z Ó% uÓ-Ó.€Fà€EØò 
ˆØð ØØ˜‘xØ˜E™(Ø &™Ø"ñð ØØ˜‘{Ø˜H™+Ø &™Ø"ñð
ñ 	
‰ð
ð0 €Lr,   c           
      ór  ‡‡— t        j                  | t        d«      d«      }t        j                  | t        d«      d«      }dt        dt        fd„}t        j                  | |d«      }||z   |z   }t        |d„ ¬«      }t        ˆfd	„|«      }t        t        t         j                  |«      «      }	g }
|	D ]*  Št        ˆfd
„|
D «       «      }|rŒ|
j                  ‰«       Œ, t        |
«      dk(  rg S t        t         j                  |
«      }t        t        |t        d«      ¬«      «      }t        t        t        d«      |«      «      }t        t        t        d«      |«      «      }t        t        t        d«      |«      «      }|D �cg c]  }|d   |d   ||||z
  ddœ‘Œ c}||||||z
  ddœgz   S c c}w )zy
    Find (imaginary) vertical lines that connect the left, right, or
    center of at least `word_threshold` words.
    r"   r   r/   Úwordr   c                 ó0   — t        | d   | d   z   «      dz  S )Nr"   r/   é   )Úfloat)rn   s    r*   Ú
get_centerz$words_to_edges_v.<locals>.get_center›   s   € Ü�T˜$‘Z $ t¡*Ñ,Ó-°Ñ1Ð1r,   c                 ó   — t        | «       S rX   rY   )r\   s    r*   r]   z"words_to_edges_v.<locals>.<lambda>¢   s   € ´c¸!³f°W€ r,   r1   c                 ó    •— t        | «      ‰k\  S rX   rY   r[   s    €r*   r]   z"words_to_edges_v.<locals>.<lambda>£   r^   r,   c              3   óJ   •K  — | ]  }t        j                  ‰|«      –— Œ y ­wrX   )r   Úget_bbox_overlap)rH   ÚcÚbboxs     €r*   rK   z#words_to_edges_v.<locals>.<genexpr>«   s   øè ø€ ÒP¸!”e×,Ñ,¨T°1×5ÑPùs   ƒ #r   r#   r0   r   ©r"   r/   r#   r0   Úheightr!   )r   r`   r   r   r   r6   ra   r5   rb   Úobjects_to_bboxÚanyr$   rZ   Úbbox_to_rectre   rd   )rT   rU   Úby_x0Úby_x1rr   Ú	by_centerÚclustersÚsorted_clustersrg   ÚbboxesÚcondensed_bboxesÚoverlapÚcondensed_rectsÚsorted_rectsrj   Úmin_topÚ
max_bottomÚbrx   s    `                @r*   Úwords_to_edges_vr‹   �   sÉ  ù€ ô ×!Ñ! %¬°DÓ)9¸1Ó=€EÜ×!Ñ! %¬°DÓ)9¸1Ó=€Eð2œð 2¤5ó 2ô ×%Ñ% e¨Z¸Ó;€IØ�u‰}˜yÑ(€Hô ˜XÑ+<Ô=€OÜÓ>ÀÓP€Nô ”#”e×+Ñ+¨^Ó<Ó=€Fð &(ÐØò *ˆÜÓPÐ?OÔPÓPˆÚØ×#Ñ# DÕ)ð*ô
 ÐÓ Ò!Øˆ	äœ%×,Ñ,Ð.>Ó?€OÜœ˜´J¸tÓ4DÔEÓF€Lä””Z Ó% |Ó4Ó5€FÜ”#”j Ó'¨Ó6Ó7€GÜ”Sœ HÓ-¨|Ó<Ó=€Jð ö
ð ð �D‘'Ø�D‘'ØØ Ø  7Ñ*Øó	
ò
ð ØØØ Ø  7Ñ*Øñ	
ð		ñð ùò 
s   Æ
F4c           	      óÚ  ‡— i }dD �‡cg c]  Št        t        ˆfd„| «      «      ‘Œ c}\  }}t        |t        dd«      ¬«      D ]ž  }t        |t        dd«      ¬«      D ]‚  }|d   |d   |z   k  sŒ|d   |d   |z
  k\  sŒ!|d   |d   |z
  k\  sŒ0|d   |d   |z   k  sŒ?|d   |d   f}	|	|vrg g dœ||	<   ||	   d   j	                  |«       ||	   d	   j	                  |«       Œ„ Œ  |S c c}w )
zi
    Given a list of edges, return the points at which they intersect
    within `tolerance` pixels.
    r   c                 ó   •— | d   ‰k(  S )Nr!   rE   )r\   Úos    €r*   r]   z(edges_to_intersections.<locals>.<lambda>Ø   s   ø€ ˜a Ñ.°!Ñ3€ r,   r"   r#   r1   r0   r/   r   r    )r5   ra   r6   r   r$   )
r   r   r   ÚintersectionsrŽ   Úv_edgesÚh_edgesr   r    Úvertexs
       `     r*   Úedges_to_intersectionsr“   Ï   s'  ø€ ð &(€MàFP÷ØABŒŒVÓ3°UÓ;Õ<òÑ€GˆWô �G¤¨D°%Ó!8Ô9ò 5ˆÜ˜¤Z°°tÓ%<Ô=ò 	5ˆAà�5‘˜a ™h¨Ñ4Ó5Ø�x‘[ Q u¡X°Ñ%;Ó<Ø�t‘W  4¡¨;Ñ!6Ó7Ø�t‘W  4¡¨;Ñ!6Ó7à˜D™' 1 U¡8Ð,�Ø Ñ.Ø24¸2Ñ,>�M &Ñ)Ø˜fÑ% cÑ*×1Ñ1°!Ô4Ø˜fÑ% cÑ*×1Ñ1°!Õ4ñ	5ð5ð Ðùò!s   ‰C(r�   c                 óL  ‡ ‡‡‡‡— dt         dt         dt        fˆ fd„Št        t        ‰ j	                  «       «      «      Št        ‰«      Šdt        t            dt        dt        t           fˆˆ ˆfd„Šˆˆfd„t        t        ‰«      «      D «       }t        t        d	|«      «      S )
a8  
    Given a list of points (`intersections`), return all rectangular "cells"
    that those points describe.

    `intersections` should be a dictionary with (x0, top) tuples as keys,
    and a list of edge objects as values. The edge objects should correspond
    to the edges that touch the intersection.
    Úp1Úp2r   c                 ó4  •— dt         dt        t           fd„}| d   |d   k(  r5 |‰|    d   «      j                   |‰|   d   «      «      }t	        |«      ry| d   |d   k(  r5 |‰|    d   «      j                   |‰|   d   «      «      }t	        |«      ryy	)
Nr   r   c                 óH   — t        t        t        j                  | «      «      S rX   )Úsetrb   r   Úobj_to_bbox)r   s    r*   Úedges_to_setzCintersections_to_cells.<locals>.edge_connects.<locals>.edges_to_setõ   s   € Ü”sœ5×,Ñ,¨eÓ4Ó5Ð5r,   r   r   Tr   r    F)r   r
   r   ÚintersectionrZ   )r•   r–   r›   Úcommonr�   s       €r*   Úedge_connectsz-intersections_to_cells.<locals>.edge_connectsô   s·   ø€ ð	6¤
ð 	6¬s´6©{ó 	6ð ˆa‰5�B�q‘EŠ>Ù! -°Ñ"3°CÑ"8Ó9×FÑFÙ˜]¨2Ñ.¨sÑ3Ó4óˆFô �6Œ{Øàˆa‰5�B�q‘EŠ>Ù! -°Ñ"3°CÑ"8Ó9×FÑFÙ˜]¨2Ñ.¨sÑ3Ó4óˆFô �6Œ{ØØr,   ÚpointsÚic                 óf  •— |‰dz
  k(  ry | |   }| |dz   d  }|D �cg c]  }|d   |d   k(  sŒ|‘Œ }}|D �cg c]  }|d   |d   k(  sŒ|‘Œ }}|D ]U  } ‰
||«      sŒ|D ]D  } ‰
||«      sŒ|d   |d   f}	|	‰v sŒ ‰
|	|«      sŒ& ‰
|	|«      sŒ0|d   |d   |	d   |	d   fc c S  ŒW y c c}w c c}w )Nr   r   rE   )rŸ   r    ÚptÚrestr\   ÚbelowÚrightÚbelow_ptÚright_ptÚbottom_rightrž   r�   Ún_pointss             €€€r*   Úfind_smallest_cellz2intersections_to_cells.<locals>.find_smallest_cell
  s  ø€ Ø�˜1‘ÒØØ�A‰YˆØ�a˜!‘e�gˆˆà Ö2�q A a¡D¨B¨q©E£M’Ð2ˆÐ2Ø Ö2�q A a¡D¨B¨q©E£M’Ð2ˆÐ2Øò 	LˆHÙ   XÔ.Øà!ò L�Ù$ R¨Ô2Øà (¨¡¨X°a©[Ð9�ð " ]Ò2Ù% l°HÕ=Ù% l°HÕ=ð ˜q™E 2 a¡5¨,°q©/¸<È¹?ÐKÔKñLð		Lð" ùò' 3ùÚ2s   œB)­B)·B.ÁB.c              3   ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wrX   rE   )rH   r    rª   rŸ   s     €€r*   rK   z)intersections_to_cells.<locals>.<genexpr>%  s   øè ø€ ÒJ°!Ñ" 6¨1×-ÑJùs   ƒN)r   Úboolr5   r6   ÚkeysrZ   r   Úintr	   r   Úrangera   )r�   Úcell_genrž   rª   r©   rŸ   s   ` @@@@r*   Úintersections_to_cellsr±   ê   s‹   ü€ ðœ'ð ¤wð ´4õ ô& ”&˜×+Ñ+Ó-Ó.Ó/€FÜ�6‹{€Hð¤4¬¡=ð ´Sð ¼XÄfÑ=M÷ ô6 K´u¼SÀ»[Ó7IÔJ€HÜ”�t˜XÓ&Ó'Ð'r,   Úcellsc                 óN  ‡— dt         dt        t        t        t        t        f   fd„}t        | «      }t	        «       Šg }g }t        |«      �rt        |«      }t        |«      D ]“  } ||«      }t        |«      dk(  r1‰t	        |«      z  Š|j                  |«       |j                  |«       ŒJt        ˆfd„|D «       «      }|dkD  sŒd‰t	        |«      z  Š|j                  |«       |j                  |«       Œ• t        |«      |k(  r:|j                  t        |«      «       ‰j                  «        |j                  «        t        |«      r�Œt        |«      r|j                  t        |«      «       t        |d„ ¬«      }	|	D �
cg c]  }
t        |
«      dkD  sŒ|
‘Œ }}
|S c c}
w )	z…
    Given a list of bounding boxes (`cells`), return a list of tables that
    hold those cells most simply (and contiguously).
    rx   r   c                 ó,   — | \  }}}}||f||f||f||ffS rX   rE   )rx   r"   r#   r/   r0   s        r*   Úbbox_to_cornersz(cells_to_tables.<locals>.bbox_to_corners/  s/   € Ø"ÑˆˆC��VØ�S�	˜B ˜<¨"¨c¨°R¸°LÐAÐAr,   r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrX   rE   )rH   rw   Úcurrent_cornerss     €r*   rK   z"cells_to_tables.<locals>.<genexpr>H  s   øè ø€ Ò"N¸A 1¨Ô#7Ñ"Nùs   ƒc                 ó&   — t        d„ | D «       «      S )Nc              3   ó0   K  — | ]  }|d    |d   f–— Œ y­w)r   r   NrE   )rH   rw   s     r*   rK   z4cells_to_tables.<locals>.<lambda>.<locals>.<genexpr>a  s   è ø€ Ò.GÀ°°!±°a¸±d¬|Ñ.Gùs   ‚)rd   )Úts    r*   r]   z!cells_to_tables.<locals>.<lambda>a  s   € ¬3Ñ.GÀQÔ.GÓ+G€ r,   r1   r   )r   r   r   r5   r™   rZ   r$   ÚremoveÚsumÚclearr6   )r²   rµ   Úremaining_cellsÚcurrent_cellsÚtablesÚinitial_cell_countÚcellÚcell_cornersÚcorner_countrP   rº   Úfilteredr·   s               @r*   Úcells_to_tablesrÆ   )  s‰  ø€ ðBœfð B¬¬w¼ÄÌ'Ð/QÑ)Ró Bô ˜5“k€Oô
 %(£E€OØ"$€Mà€FÜ
ˆoÕ
Ü  Ó/ÐÜ˜Ó)ò 	1ˆDÙ*¨4Ó0ˆLä�=Ó! QÒ&à¤3 |Ó#4Ñ4�Ø×$Ñ$ TÔ*Ø×&Ñ& tÕ,ô  #Ó"NÀÔ"NÓN�ð   !Ó#à#¤s¨<Ó'8Ñ8�OØ!×(Ñ(¨Ô.Ø#×*Ñ*¨4Õ0ð#	1ô( ˆ}ÓÐ!3Ò3à�M‰Mœ$˜}Ó-Ô.Ø×!Ñ!Ô#Ø×ÑÔ!ô5 ˆoÖ
ô> ˆ=Ôà�‰”d˜=Ó)Ô*ô �VÑ!GÔH€GØ"Ö1�a¤c¨!£f¨q£j’Ð1€HÐ1Ø€Oùò 2s   ÆF"ÆF"c                   ó$   — e Zd Zdeee      fd„Zy)Ú	CellGroupr²   c                 óX  — || _         t        t        t        d«      t	        d |«      «      «      t        t        t        d«      t	        d |«      «      «      t        t        t        d«      t	        d |«      «      «      t        t        t        d«      t	        d |«      «      «      f| _        y ©Nr   r   rp   r   )r²   rd   rb   r   ra   re   rx   )Úselfr²   s     r*   Ú__init__zCellGroup.__init__g  sz   € ØˆŒ
ä””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8ð	
ˆ�	r,   N)Ú__name__Ú
__module__Ú__qualname__r   r	   r   rÌ   rE   r,   r*   rÈ   rÈ   f  s   „ ð
˜d 8¨FÑ#3Ñ4ô 
r,   rÈ   c                   ó   — e Zd Zy)ÚRowN©rÍ   rÎ   rÏ   rE   r,   r*   rÑ   rÑ   q  ó   „ Ør,   rÑ   c                   ó   — e Zd Zy)ÚColumnNrÒ   rE   r,   r*   rÕ   rÕ   u  rÓ   r,   rÕ   c                   ó®   — e Zd Zdddee   fd„Zedefd„«       Zdee	   dee	   fd„Z
edee	   fd	„«       Zedee	   fd
„«       Zdedeeee         fd„Zy)ÚTableÚpager   r²   c                 ó    — || _         || _        y rX   )rØ   r²   )rË   rØ   r²   s      r*   rÌ   zTable.__init__z  s   € ØˆŒ	Øˆ�
r,   r   c           
      ó  — | j                   }t        t        t        d«      |«      «      t        t        t        d«      |«      «      t	        t        t        d«      |«      «      t	        t        t        d«      |«      «      fS rÊ   )r²   rd   rb   r   re   )rË   rw   s     r*   rx   z
Table.bbox~  sa   € à�J‰Jˆä””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&ð	
ð 	
r,   Úkindc                 óè  — |t         u rdnd}t        | «      }t        | j                  t	        ||«      ¬«      }t        t        t        t        t	        |«      | j                  «      «      «      «      }t        j                  |t	        |«      «      }g }|D ]N  \  }}	|	D �
ci c]  }
|
|   |
“Œ
 }}
 ||D �cg c]  }|j                  |«      ‘Œ c}«      }|j                  |«       ŒP |S c c}
w c c}w )Nr   r   r1   )rÑ   r®   r6   r²   r   r5   r™   rb   rM   rN   Úgetr$   )rË   rÛ   ÚaxisÚantiaxisrP   ÚxsÚgroupedÚrowsÚyÚ	row_cellsrÂ   Úxdictr\   Úrows                 r*   Ú_get_rows_or_colszTable._get_rows_or_colsˆ  sÞ   € ØœC‘K‰q QˆÜ˜4�x“=ˆô ˜Ÿ™¬°H¸dÓ)CÔDˆô ”&œœS¤¨DÓ!1°4·:±:Ó>Ó?Ó@ÓAˆô ×#Ñ# G¬Z¸Ó-AÓBˆàˆà#ò 	‰LˆAˆyØ2;Ö<¨$�T˜$‘Z Ñ%Ð<ˆEÐ<Ù¨bÖ1¨˜Ÿ	™	 !�Ò1Ó2ˆCØ�K‰K˜Õð	ð ˆùò =ùÚ1s   Â!C*Â6C/
c                 ó,   — | j                  t        «      S rX   )rç   rÑ   ©rË   s    r*   râ   z
Table.rows�  s   € à×%Ñ%¤cÓ*Ð*r,   c                 ó,   — | j                  t        «      S rX   )rç   rÕ   ré   s    r*   ÚcolumnszTable.columns¡  s   € à×%Ñ%¤fÓ-Ð-r,   Úkwargsc           	      ó  — | j                   j                  }g }dt        dt        dt        fd„}| j
                  D ]Á  }g }|D �cg c]  } |||j                  «      sŒ|‘Œ }}|j                  D ]z  }	|	€d }
nb|D �cg c]  } |||	«      sŒ|‘Œ }}t        |«      r<d|v r!|	d   |	d   z
  |d<   |	d	   |	d
   z
  |d<   |	|d<   t        j                  |fi |¤Ž}
nd}
|j                  |
«       Œ| |j                  |«       ŒÃ |S c c}w c c}w )NÚcharrx   r   c                 óŽ   — | d   | d   z   dz  }| d   | d   z   dz  }|\  }}}}t        ||k\  xr ||k  xr ||k\  xr ||k  «      S )Nr#   r0   rp   r"   r/   )r¬   )rî   rx   Úv_midÚh_midr"   r#   r/   r0   s           r*   Úchar_in_bboxz#Table.extract.<locals>.char_in_bboxª  sm   € Ø˜%‘[ 4¨¡>Ñ1°QÑ6ˆEØ˜$‘Z $ t¡*Ñ,°Ñ1ˆEØ"&ÑˆB��R˜ÜØ˜"‘ÒV 5¨2¡:ÒV°E¸S±LÒVÀuÈvÁ~óð r,   Úlayoutrp   r   Úlayout_widthr   r   Úlayout_heightÚlayout_bboxÚ )rØ   Úcharsr   r   r¬   râ   rx   r²   rZ   r   Úextract_textr$   )rË   rì   rø   Ú	table_arrrò   ræ   Úarrrî   Ú	row_charsrÂ   Ú	cell_textÚ
cell_charss               r*   ÚextractzTable.extract¥  s<  € à—	‘	—‘ˆØˆ	ð	œuð 	¬Fð 	´tó 	ð —9‘9ò 	"ˆCØˆCØ*/ÖP $±<ÀÀcÇhÁhÕ3OšÐPˆIÐPàŸ	™	ò &�Ø�<Ø $‘Ið *3ö"Ø!%±lÀ4ÈÕ6Nšð"�Jð "ô ˜:”Ø# vÑ-Ø59¸!±W¸tÀA¹wÑ5F˜F >Ñ2Ø6:¸1±gÀÀQÁÑ6G˜F ?Ñ3Ø48˜F =Ñ1Ü$)×$6Ñ$6°zÑ$LÀVÑ$L™	à$&˜	Ø—
‘
˜9Õ%ð!&ð" ×Ñ˜SÕ!ð+	"ð. Ðùò+ Qùò"s   ÁDÁDÁ;DÂ
DN)rÍ   rÎ   rÏ   r   r   rÌ   Úpropertyrx   r   rÈ   rç   râ   rë   r   r	   rL   rÿ   rE   r,   r*   r×   r×   y  s®   „ ð˜Vð ¨D°©Ló ð ð
�fò 
ó ð
ð d¨9¡oð ¸$¸y¹/ó ð* ð+�d˜9‘oò +ó ð+ð ð.˜˜i™ò .ó ð.ð$ ð $¨¨T°(¸3±-Ñ-@Ñ(Aô $r,   r×   )ÚlinesÚlines_strictÚtextÚexplicit)Úsnap_tolerancer>   r?   Újoin_tolerancer@   rA   Úedge_min_lengthÚedge_min_length_prefilterÚmin_words_verticalÚmin_words_horizontalÚintersection_toleranceÚintersection_x_toleranceÚintersection_y_tolerancec                   ó   — e Zd Zy)Ú
UnsetFloatNrÒ   rE   r,   r*   r  r  Þ  rÓ   r,   r  c                   ón  — e Zd ZU dZeed<   dZeed<   dZee	e
eef         ed<   dZee	e
eef         ed<   eZeed<   eZeed<   eZeed	<   eZeed
<   eZeed<   eZeed<   dZeed<   dZeed<   eZeed<   eZeed<   dZeed<   eZeed<   eZ eed<   dZ!ee"ee#f      ed<   dd„Z$e%dee&   dd fd„«       Z'y)r   r  Úvertical_strategyÚhorizontal_strategyNÚexplicit_vertical_linesÚexplicit_horizontal_linesr  r>   r?   r  r@   rA   r   r  r   r  r	  r
  r  r  r  Útext_settingsr   c           	      ó$  — t         D ]$  }t        | |«      xs ddk  sŒt        d|› d�«      ‚ dD ]=  }t        | |dz   «      }|t        vsŒt        |› ddj	                  t        «      › d�«      ‚ | j
                  €i | _        d
D ]:  }|| j
                  vsŒ| j
                  j                  dd«      | j
                  |<   Œ< d| j
                  v r| j
                  d= dD ]/  \  }}t        | |«      t        u sŒt        | |t        | |«      «       Œ1 y	)a¿  Clean up user-provided table settings.

        Validates that the table settings provided consists of acceptable values and
        returns a cleaned up version. The cleaned up version fills out the missing
        values with the default values in the provided settings.

        TODO: Can be further used to validate that the values are of the correct
            type. For example, raising a value error when a non-boolean input is
            provided for the key ``keep_blank_chars``.

        :param table_settings: User-provided table settings.
        :returns: A cleaned up version of the user-provided table settings.
        :raises ValueError: When an unrecognised key is provided.
        r   zTable setting 'z' cannot be negative)Ú
horizontalÚverticalÚ	_strategyz_strategy must be one of{ú,ú}N)r   r   r-   r   ))r>   r  )r?   r  )r@   r  )rA   r  )r  r  )r  r  )	ÚNON_NEGATIVE_SETTINGSÚgetattrr4   ÚTABLE_STRATEGIESÚjoinr  rÝ   ÚUNSETÚsetattr)rË   Úsettingr!   ÚstrategyÚattrÚfallbacks         r*   Ú__post_init__zTableSettings.__post_init__ú  sH  € ô  -ò 	RˆGÜ˜˜gÓ&Ò+¨!¨qÓ0Ü  ?°7°)Ð;OÐ!PÓQÐQð	Rð 6ò 	ˆKÜ˜t [°;Ñ%>Ó?ˆHØÔ/Ò/Ü Ø"�mð $ØŸ™Ô"2Ó3Ð4°Bð8óð ð	ð ×ÑÐ%Ø!#ˆDÔð 3ò 	RˆDØ˜4×-Ñ-Ò-Ø+/×+=Ñ+=×+AÑ+AÀ+ÈqÓ+Q�×"Ñ" 4Ò(ð	Rð ˜$×,Ñ,Ñ,Ø×"Ñ" ;Ð/ð
ò 		=‰NˆD�(ô �t˜TÓ"¤eÒ+Ü˜˜d¤G¨D°(Ó$;Õ<ñ		=r,   Úsettingsc                 óê   — |€ | «       S t        || «      r|S t        |t        «      r?i }i }|j                  «       D ]  \  }}|d d dk(  r	|||dd  <   Œ|||<   Œ ||d<    | di |¤ŽS t        d|› �«      ‚)Né   Útext_r  zCannot resolve settings: rE   )Ú
isinstanceÚdictrJ   r4   )Úclsr'  Úcore_settingsr  rI   r   s         r*   ÚresolvezTableSettings.resolve-  s¡   € àÐÙ“5ˆLÜ˜ #Ô&ØˆOÜ˜¤$Ô'ØˆMØˆMØ Ÿ™Ó(ò )‘��1Ø�R�a�5˜GÒ#Ø+,�M ! A B %Ò(à'(�M !Ò$ð	)ð
 .;ˆM˜/Ñ*ÙÑ'˜Ñ'Ð'äÐ8¸¸
ÐCÓDÐDr,   )r   N)(rÍ   rÎ   rÏ   r  rL   Ú__annotations__r  r  r	   r   r   r   r   r  ÚDEFAULT_SNAP_TOLERANCEr  r   r>   r?   ÚDEFAULT_JOIN_TOLERANCEr  r@   rA   r  r  ÚDEFAULT_MIN_WORDS_VERTICALr	  r®   ÚDEFAULT_MIN_WORDS_HORIZONTALr
  r  r  r  r  r   r   r&  ÚclassmethodÚT_table_settingsr/  rE   r,   r*   r   r   å  s)  … à$Ð�sÓ$Ø&Ð˜Ó&ØCGÐ˜X d¨5°¸°Ñ+>Ñ&?Ñ@ÓGØEIÐ˜x¨¨U°5¸%°<Ñ-@Ñ(AÑBÓIØ2€N�EÓ2Ø#Ð�eÓ#Ø#Ð�eÓ#Ø2€N�EÓ2Ø#Ð�eÓ#Ø#Ð�eÓ#Ø€O�UÓØ'(Ð˜uÓ(Ø8Ð˜Ó8Ø <Ð˜#Ó<Ø$%Ð˜EÓ%Ø&+Ð˜eÓ+Ø&+Ð˜eÓ+Ø.2€M�8˜D  c ™NÑ+Ó2ó1=ðf ðE˜xÐ(8Ñ9ð E¸oò Eó ñEr,   c                   ó4   — e Zd ZdZd	dddee   fd„Zdefd„Zy)
ÚTableFindera0  
    Given a PDF page, find plausible table structures.

    Largely borrowed from Anssi Nurminen's master's thesis:
    http://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/21520/Nurminen.pdf?sequence=3

    ... and inspired by Tabula:
    https://github.com/tabulapdf/tabula-extractor/issues/16
    NrØ   r   r'  c                 ó®  — || _         t        j                  |«      | _        | j	                  «       | _        t        | j
                  | j                  j                  | j                  j                  «      | _	        t        | j                  «      | _        t        | j                  «      D �cg c]  }t        | j                   |«      ‘Œ c}| _        y c c}w rX   )rØ   r   r/  r'  Ú	get_edgesr   r“   r  r  r�   r±   r²   rÆ   r×   rÀ   )rË   rØ   r'  Ú
cell_groups       r*   rÌ   zTableFinder.__init__L  s›   € ØˆŒ	Ü%×-Ñ-¨hÓ7ˆŒØ—^‘^Ó%ˆŒ
Ü3Ø�J‰JØ�M‰M×2Ñ2Ø�M‰M×2Ñ2ó
ˆÔô
 ,¨D×,>Ñ,>Ó?ˆŒ
ä;JÈ4Ï:É:Ó;Vö
Ø-7ŒE�$—)‘)˜ZÕ(ò
ˆ�ùò 
s   Â,Cr   c           
      ó  — | j                   }dD ]I  }t        ||dz   «      }|dk(  sŒt        |d|z   dz   «      }t        |«      dk  sŒ9t        d|› d|› d	�«      ‚ |j                  }|j
                  }|d
k(  s|d
k(  r* | j                  j                  di |j                  xs i ¤Ž}g }|j                  xs g D ]¾  }	t        |	t        «      r5t        j                  |	«      D ]  }
|
d   dk(  sŒ|j                  |
«       Œ ŒH|j                  |	|	| j                  j                  d   | j                  j                  d   | j                  j                  d   | j                  j                  d   z
  ddœ«       ŒÀ |dk(  r7t        j                   | j                  j"                  d|j$                  ¬«      }na|dk(  r8t        j                   | j                  j"                  dd|j$                  ¬«      }n$|d
k(  rt'        |j(                  ¬«      }n|dk(  rg }|z   }g }|j*                  xs g D ]¾  }	t        |	t        «      r5t        j                  |	«      D ]  }
|
d   dk(  sŒ|j                  |
«       Œ ŒH|j                  | j                  j                  d   | j                  j                  d   | j                  j                  d   | j                  j                  d   z
  |	|	ddœ«       ŒÀ |dk(  r7t        j                   | j                  j"                  d|j$                  ¬«      }na|dk(  r8t        j                   | j                  j"                  dd|j$                  ¬«      }n$|d
k(  rt-        |j.                  ¬«      }n|dk(  rg }|z   }t1        |«      t1        |«      z   }t3        ||j4                  |j6                  |j8                  |j:                  ¬«      }t        j                   ||j<                  ¬«      S )N)r  r  r  r  Ú	explicit_Ú_linesrp   zIf z"_strategy == 'explicit', explicit_zD_lines must be specified as a list/tuple of two or more floats/ints.r  r!   r   r   r   ry   r  )Ú
min_lengthr  Úline)Ú	edge_typer?  )rU   r    r   )r"   r/   r_   r#   r0   r!   )r>   r?   r@   rA   rE   )r'  r  rZ   r4   r  r  rØ   Úextract_wordsr  r  r+  r,  r   Úobj_to_edgesr$   rx   Úfilter_edgesr   r  r‹   r	  r  rl   r
  r5   rS   r>   r?   r@   rA   r  )rË   r'  r!   r#  r  Úv_stratÚh_stratrT   Ú
v_explicitÚdescr'   Úv_baser   Ú
h_explicitÚh_baser    r   s                    r*   r:  zTableFinder.get_edgesZ  sÒ  € Ø—=‘=ˆà5ò 
	ˆKÜ˜x¨°{Ñ)BÓCˆHØ˜:Ó%Ü ¨+¸Ñ*CÀhÑ*NÓO�Ü�u“: “>Ü$Ø˜k˜]ð +$Ø$/ =ð 1'ð(óð ð
	ð ×,Ñ,ˆØ×.Ñ.ˆà�fÒ ¨6Ò 1Ø+�D—I‘I×+Ñ+ÑM¨x×/EÑ/EÒ/KÈÑMˆEàˆ
Ø×4Ñ4Ò:¸ò 	ˆDÜ˜$¤Ô%Ü×+Ñ+¨DÓ1ò -�AØ˜Ñ'¨3Ó.Ø"×)Ñ)¨!Õ,ñ-ð ×!Ñ!à"Ø"Ø#Ÿy™yŸ~™~¨aÑ0Ø"&§)¡)§.¡.°Ñ"3Ø"&§)¡)§.¡.°Ñ"3°d·i±i·n±nÀQÑ6GÑ"GØ'*ñõ	ð	ð" �gÒÜ×'Ñ'Ø—	‘	—‘ °×1SÑ1Sô‰Fð ˜Ò&Ü×'Ñ'Ø—	‘	—‘ØØ Ø#×=Ñ=ô	‰Fð ˜ÒÜ% e¸H×<WÑ<WÔX‰FØ˜
Ò"ØˆFà�ZÑˆàˆ
Ø×6Ñ6Ò<¸"ò 	ˆDÜ˜$¤Ô%Ü×+Ñ+¨DÓ1ò -�AØ˜Ñ'¨3Ó.Ø"×)Ñ)¨!Õ,ñ-ð ×!Ñ!à"Ÿi™iŸn™n¨QÑ/Ø"Ÿi™iŸn™n¨QÑ/Ø!%§¡§¡°Ñ!2°T·Y±Y·^±^ÀAÑ5FÑ!FØ#Ø"&Ø'*ñõ	ð	ð" �gÒÜ×'Ñ'Ø—	‘	—‘ °×1SÑ1Sô‰Fð ˜Ò&Ü×'Ñ'Ø—	‘	—‘ØØ Ø#×=Ñ=ô	‰Fð ˜ÒÜ%Ø h×&CÑ&Cô‰Fð ˜
Ò"ØˆFà�ZÑˆä�Q“œ$˜q›'Ñ!ˆäØØ%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6ô
ˆô ×!Ñ! %°H×4LÑ4LÔMÐMr,   rX   )	rÍ   rÎ   rÏ   Ú__doc__r	   r6  rÌ   r   r:  rE   r,   r*   r8  r8  A  s0   „ ññ
˜Vð 
¨xÐ8HÑ/Ió 
ðiN˜:ô iNr,   r8  )r   r   )6rM   Údataclassesr   Úoperatorr   Útypingr   r   r   r   r	   r
   r   r   r   r÷   r   Ú_typingr   r   r   r   r   r   r1  r2  r3  r4  rL   ÚT_intersectionsr6  rØ   r   r+   r=   rS   r®   rl   r‹   r“   r±   rÆ   ÚobjectrÈ   rÑ   rÕ   r×   r  r  rq   r  r   r   r8  rE   r,   r*   ú<module>rS     s@  ðÛ Ý !Ý ß T× TÕ Tå ß J× JàÐ ØÐ ØÐ Ø Ð à�w  S¨* _Ñ 5Ð5Ñ6€Ø˜¨$¨s°C¨x©.Ð8Ñ9Ð áÝð
 0Ø/ñ!Øð!àð!ð ð!ð ó	!ð& =SñØðØ$'ðØ49ðàóð:Øðàðð ðð ð	ð
 ðð óðD .Jñ(Øð(Ø'*ð(àó(ðX .Hñ<Øð<Ø'*ð<àó<ð@ EFñØðØ$)ðØ<Aðàóð6<(¨/ð <(¸dÀ6¹ló <(ð~:˜4 ™<ð :¨D°°f±Ñ,>ó :ôz
�ô 
ô	ˆ)ô 	ô	ˆYô 	ôPˆFô Pòf AÐ òÐ ô"	�ô 	ñ 	�1‹€ð ÷XEð XEó ðXEôvBN�&õ BNr,   