o
    fDQ                     @   s  U d Z ddlZddlZddlZddl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mZmZmZmZmZmZmZ erEddlmZ ddlZdZeejeejf Zeee	f Z G dd	 d	e!Z"d
ede#fddZ$de!defddZ%dede&defddZ'	dpdee#ef dededefddZ(de&de&de&de&fdd Z)d!e&d"e&d#e&d$e&d%e#de#fd&d'Z*ee+e+f Z,ee+e+e+e+f Z-ee+e+e+e+e+e+f Z.eee eee+e+f eee+e+e+e+f eee+e+e+e+e+e+f f Z/d(Z0e.e1d)< d*e.d+e.de.fd,d-Z2d.e.d/e,de.fd0d1Z3d.e.d/e,de,fd2d3Z4d.e.d/e,de,fd4d5Z5d6e!de6fd7d8Z7ed9Z8d:ee8 dee8 fd;d<Z9d!e
e8ge6f d:ee8 deee8 ee8 f fd=d>Z:d?e+d@e+dAe&de;fdBdCZ<dDee, de-fdEdFZ=	dqdGee8 dHe
e8ge+f dIee8 dee8 fdJdKZ>dLe&dGee8 deee8dMf  fdNdOZ?drde#dPe&de&fdQdRZ@dSAdTdU dVD ZBde#defdWdXZCd6edefdYdZZDd[e-defd\d]ZEd.e.defd^d_ZFd`dadbdade,fdcddZGededadfZHG dgdh dheeH ZIg diZJg djZKdke&defdldmZLdke&defdndoZMdS )sz
Miscellaneous Routines.
    N)escape)AnyBinaryIOCallableDictGenericIterableIteratorListOptionalSetTextIOTupleTypeVarUnionTYPE_CHECKINGcast   )LTComponentic                   @   sR   e Zd ZdZdedededdfddZdefd	d
Zde	de	de	ddfddZ
dS )open_filenamez
    Context manager that allows opening a filename
    (str or pathlib.PurePath type is supported) and closes it on exit,
    (just like `open`), but does nothing for file-like objects.
    filenameargskwargsreturnNc                 O   sr   t |tjr
t|}t |tr t|g|R i || _d| _d S t |tjr1t	t
|| _d| _d S tdt| )NTFzUnsupported input type: %s)
isinstancepathlibPurePathstropenfile_handlerclosingioIOBaser   AnyIO	TypeErrortype)selfr   r   r    r'   G/home/ubuntu/webapp/venv/lib/python3.10/site-packages/pdfminer/utils.py__init__1   s   


zopen_filename.__init__c                 C   s   | j S N)r   r&   r'   r'   r(   	__enter__=   s   zopen_filename.__enter__exc_typeexc_valexc_tbc                 C   s   | j r
| j  d S d S r*   )r    r   close)r&   r-   r.   r/   r'   r'   r(   __exit__@   s   zopen_filename.__exit__)__name__
__module____qualname____doc__
FileOrNamer   r)   r#   r,   objectr1   r'   r'   r'   r(   r   *   s
    r   in_strr   c                 C   s"   t | tsJ tt| |  S )z'Converts to bytes, encoding to unicode.)r   r   r%   encode)r8   r'   r'   r(   make_compat_bytesE   s   r:   oc                 C   sH   t | tr t| }z| |d W S  ty   t|  Y S w t| S )z>Converts everything to string, if bytes guessing the encoding.encoding)r   bytescharset_normalizerdetectdecodeUnicodeDecodeErrorr   )r;   encr'   r'   r(   make_compat_strK   s   

rC   ssizec                 C   sN   |dk r
| d | S t | |kr%|d d }d| d | | | d  S | S )N         z	{} ... {})lenformat)rD   rE   lengthr'   r'   r(   shorten_strW   s   rL   utf-8ignorebytesorstringr<   	erractionc                 C   s4   t | tr| S t | tsJ tt| | ||S )z^When Py2 str.encode is called, it often means bytes.encode in Py3.

    This does either.
    )r   r   r=   r%   r@   )rO   r<   rP   r'   r'   r(   compatible_encode_methoda   s   
rQ   leftabove
upper_leftc                 C   sT   | | | }t ||  }t || }t || }||kr"||kr"| S ||kr(|S |S r*   )abs)rR   rS   rT   ppapbpcr'   r'   r(   paeth_predictorn   s   rZ   predcolorscolumnsbitspercomponentdatac                 C   s.  |dvrd| }t ||| | d }|| d }d}d| }	tdt||d D ]}
||
 }||
d |
d |  }d}|dkrG||7 }n|dkrst|D ]"\}}|| dk r\d}nt|||  }|| d@ }|t|f7 }qOn|d	krt||	D ]\}}|| d@ }|t|f7 }q|n|d
krt|D ],\}}|| dk rd}nt|||  }t|	| }||| d	  d@ }|t|f7 }qnI|dkrt|D ]8\}}|| dk rd}d}nt|||  }t|	||  }t|	| }t|||}|| d@ }|t|f7 }qnt d| ||7 }|}	q*|S )zxReverse the effect of the PNG predictor

    Documentation: http://www.libpng.org/pub/png/spec/1.2/PNG-Filters.html
    )   r   z"Unsupported `bitspercomponent': %dr`           r   r      rH         zUnsupported predictor value: %d)
ValueErrorrangerI   	enumerateintr=   ziprZ   )r[   r\   r]   r^   r_   msgnbytesbppbuf
line_above
scanline_ifilter_typeline_encodedrawjsub_x	raw_x_bppraw_xup_xprior_x	average_xpaeth_xprior_x_bpppaethr'   r'   r(   apply_png_predictor   sf   
	
		r~   )r   r   r   r   r   r   MATRIX_IDENTITYm1m0c                 C   s   | \}}}}}}|\}}	}
}}}	 || |
|  |	| ||  || |
|  |	| ||  || |
|  | |	| ||  | fS r*   r'   )r   r   a1b1c1d1e1f1a0b0c0d0e0f0r'   r'   r(   mult_matrix   s   r   mvc           
      C   sH   | \}}}}}}|\}}	|||||| |	|  | || |	|  | fS )zTranslates a matrix by (x, y).r'   
r   r   abcdefxyr'   r'   r(   translate_matrix   s   0r   c           
      C   sB   | \}}}}}}|\}}		 || ||	  | || ||	  | fS r*   r'   r   r'   r'   r(   apply_matrix_pt  s   (r   c           
      C   s8   | \}}}}}}|\}}	|| ||	  || ||	  fS )zCEquivalent to apply_matrix_pt(M, (p,q)) - apply_matrix_pt(M, (0,0))r'   )
r   r   r   r   r   r   r   r   rV   qr'   r'   r(   apply_matrix_norm  s    r   r   c                 C   s   t | ttfS r*   )r   ri   floatr   r'   r'   r(   isnumber  s   r   _Tobjsc                 c   s0    t  }| D ]}||v rq|| |V  qdS )zEliminates duplicated elements.N)setadd)r   doneobjr'   r'   r(   uniq  s   
r   c                 C   s8   g }g }|D ]}| |r| | q| | q||fS )z9Split a list into two classes according to the predicate.)append)r[   r   tr   r   r'   r'   r(   fsplit'  s   r   v0v1r   c                 C   s   t t| | t|| | S )zReturns a discrete range.)rg   ri   )r   r   r   r'   r'   r(   drange3  s   r   ptsc                 C   s^   t t t  t  f}|\}}}}| D ]\}}t||}t||}t||}t||}q||||fS )z7Compute a minimal rectangle that covers all the points.)INFminmax)r   limitx0y0x1y1r   r   r'   r'   r(   	get_bound8  s   


r   seqfuncmaxobjc                 C   s4   d}| D ]}||}|du s||k r||}}q|S )z;Picks the object obj where func(obj) has the highest value.Nr'   )r   r   r   maxscorer   scorer'   r'   r(   pickD  s   
r   n.c                 c   s8    g }|D ]}| | t|| krt|V  g }qdS )z$Groups every n elements of the list.N)r   rI   tuple)r   r   rr   r'   r'   r(   choplistP  s   

r   defaultc                 C   s   t | }|s|S |dkrt| S |dkrtttd| d S |dkr0tttdd|  d S |dkr?tttd| d S |d	krNtttd
| d S td| )z/Unpacks 1 to 4 or 8 byte integers (big endian).r   rH   z>Hr   rd   z>Lrb   re   r`   z>Qzinvalid length: %d)rI   ordr   ri   structunpackr$   )rD   r   rK   r'   r'   r(   nunpack[  s   r    c                 c   s    | ]}t |V  qd S r*   )chr).0r   r'   r'   r(   	<genexpr>n  s
    
r   (   r   r   rH   rd   re   rG      rF   r`   	   
                                       r   i  i  i  i  i  i  i  i      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~   r   i"   i    i!   i&   i   i   i  iD   i9   i:   i"  i0   i   i   i   i   i   i   i"!  i  i  iA  iR  i`  ix  i}  i1  iB  iS  ia  i~  r   i                                       r                                                                                                                                                                                                                                                      rc   c                 C   s2   |  drt| dd ddS ddd | D S )	z+Decodes a PDFDocEncoding string to Unicode.s   rH   Nzutf-16berN   r   c                 s   s    | ]}t | V  qd S r*   )PDFDocEncoding)r   r   r'   r'   r(   r   z  s    zdecode_text.<locals>.<genexpr>)
startswithr   join)rD   r'   r'   r(   decode_textu  s   
r  c                 C   s   t | trdS t| S )z"Encodes a string for SGML/XML/HTMLr   )r   r=   r   r   r'   r'   r(   rB   }  s   
rB   bboxc                 C   s   | \}}}}d ||||S )Nz{:.3f},{:.3f},{:.3f},{:.3f}rJ   )r  r   r   r   r   r'   r'   r(   bbox2str  s   r  c                 C   s$   | \}}}}}}d ||||||S )Nz.[{:.2f},{:.2f},{:.2f},{:.2f}, ({:.2f},{:.2f})]r  )r   r   r   r   r   r   r   r'   r'   r(   
matrix2str  s   r  obj1r   obj2c                 C   s   t | j|jt | j|j}}t| j|jt| j|j}}|| || }}|| j |j || j |j }}	|dk rj|	dk rj| j| j d | j| j d }
}|j|j d |j|j d }}|
| || fS td|td|	fS )a  A distance function between two TextBoxes.

    Consider the bounding rectangle for obj1 and obj2.
    Return vector between 2 boxes boundaries if they don't overlap, otherwise
    returns vector betweeen boxes centers

             +------+..........+ (x1, y1)
             | obj1 |          :
             +------+www+------+
             :          | obj2 |
    (x0, y0) +..........+------+
    r   rH   )r   r   r   r   r   r   widthheight)r  r  r   r   r   r   owohiwihxc1yc1xc2yc2r'   r'   r(   vecBetweenBoxes  s   """r  LTComponentT)boundc                   @   s   e Zd ZdZddededdfddZdefd	d
Zde	e
 fddZdefddZdedefddZdede	e fddZdee
 ddfddZde
ddfddZde
ddfddZdede	e
 fddZdS )PlanezA set-like data structure for objects placed on a plane.

    Can efficiently find objects in a certain rectangular area.
    It maintains two parallel lists of objects, each of
    which is sorted by its x or y coordinate.
    r   r  gridsizer   Nc                 C   s2   g | _ t | _i | _|| _|\| _| _| _| _d S r*   )	_seqr   _objs_gridr  r   r   r   r   )r&   r  r  r'   r'   r(   r)     s
   zPlane.__init__c                 C   s   dt |  S )Nz<Plane objs=%r>)listr+   r'   r'   r(   __repr__  s   zPlane.__repr__c                    s    fdd j D S )Nc                 3   s    | ]
}| j v r|V  qd S r*   r  )r   r   r+   r'   r(   r     s    z!Plane.__iter__.<locals>.<genexpr>)r  r+   r'   r+   r(   __iter__  s   zPlane.__iter__c                 C   s
   t | jS r*   )rI   r  r+   r'   r'   r(   __len__     
zPlane.__len__r   c                 C   s
   || j v S r*   r  )r&   r   r'   r'   r(   __contains__  r  zPlane.__contains__c                 c   s    |\}}}}|| j ks| j|ks|| jks| j|krd S t| j |}t| j|}t| j|}t| j|}t||| jD ]}t||| jD ]}||fV  qEq<d S r*   )r   r   r   r   r   r   r   r  )r&   r  r   r   r   r   grid_ygrid_xr'   r'   r(   	_getrange  s   (zPlane._getranger   c                 C   s   |D ]}|  | qd S r*   )r   )r&   r   r   r'   r'   r(   extend  s   zPlane.extendc                 C   sj   |  |j|j|j|jfD ]}|| jvrg }|| j|< n| j| }|| q| j| | j	| dS )zplace an object.N)
r  r   r   r   r   r  r   r  r  r   )r&   r   kr   r'   r'   r(   r     s   

z	Plane.addc              
   C   sZ   |  |j|j|j|jfD ]}z
| j| | W q ttfy$   Y qw | j	| dS )zdisplace an object.N)
r  r   r   r   r   r  removeKeyErrorrf   r  )r&   r   r  r'   r'   r(   r    s   zPlane.removec           	      c   s    |\}}}}t  }| |D ]2}|| jvrq| j| D ]$}||v r#q|| |j|ks<||jks<|j|ks<||jkr=q|V  qqdS )z)finds objects that are in a certain area.N)r   r  r  r   r   r   r   r   )	r&   r  r   r   r   r   r   r  r   r'   r'   r(   find  s   

(z
Plane.find)r   )r2   r3   r4   r5   Rectri   r)   r   r  r	   r  r  r  r7   boolr  Pointr  r   r  r   r  r  r'   r'   r'   r(   r    s    	r  )ir   r   r   )r   lr   valuec                 C   s   d|   k rdk sJ  J g }d}| dkrqt | d\} }|dkr4|dt|  |dt|d   n5|dkrI|dt|  |dt|  n |dk}|r[|dt|  |d8 }||radndt| |  |d7 }| dksd|S )	z,Format a number as lowercase Roman numerals.r   i  r   r   r   re   rG   r   )divmodinsert
ROMAN_ONESROMAN_FIVESr  )r  resultindex	remainder	over_fiver'   r'   r(   format_int_roman  s&   
r  c                 C   sZ   | dksJ g }| dkr$t | d ttj\} }|tj|  | dks|  d|S )z5Format a number as lowercase letters a-z, aa-zz, etc.r   r   r   )r  rI   stringascii_lowercaser   reverser  )r  r  r  r'   r'   r(   format_int_alpha  s   
r  )rM   rN   r*   )r   )Nr5   r!   r   r  r   htmlr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   layoutr   r>   r   r   r   r"   r6   r#   r7   r   r=   r:   rC   ri   rL   rQ   rZ   r~   r   r  r  MatrixPathSegmentr   __annotations__r   r   r   r   r  r   r   r   r   rg   r   r   r   r   r   r  r  r  rB   r  r  r  r  r  r  r  r  r  r'   r'   r'   r(   <module>   s    H


a
4
&
  	P