o
    	&zhI                     @   sr  U d dl Z d dl m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 ddlmZmZ ddlmZmZ dd	lmZmZmZmZmZmZ d
ededede
eeeeeeef f eeef ef fddZdedede
eeeeeeef f eeef f fddZdde e!ddi fZ"e
eeeeeeef f eeef f e#d< i ddddddddddd dd!dd"dd#d$d%d$d&d'd(d'd)d'd*d'd+dd,dd-d$d.d$iZ$eeef e#d/< i d0d1d2d1d3d1d4d1d5d6d7d6d8d6d9d6d:d;d<d;d=d;d>d;d?d@dAd@dBd@dCd@dDd@dEd6iZ%eeef e#dF< dede
eeeeef f eeef f fdGdHZ&dedeeeeef f fdIdJZ'dede
eeef e	e f fdKdLZ(dMedNeeeeef f dOeeef defdPdQZ)dede*fdRdSZ+dTe*dUe,dVe,dWede
eef f dOeeef dXe	e de
e,e,ede
eef f f fdYdZZ-dTe*dOeeef dXe	e dWede
eef f dede
eef f f
d[d\Z.dTe*dOeeef dXe	e ddfd]d^Z/ded_edeeef fd`daZ0dbeeef dcedefdddeZ1dbeeef dfedefdgdhZ2dedOeeef dXe	e de
eeef e	e f fdidjZ3dS )k    N)Error)	unhexlify)ceil)AnyDictListTupleUnioncast   )adobe_glyphscharset_encoding)logger_errorlogger_warning)ArrayObjectDecodedStreamObjectDictionaryObject
NullObjectStreamObjectis_null_or_none	font_namespace_widthobjreturnc                 C   s0   |d d |  }t ||\}}}}|||||fS )a  
    Determine information about a font.

    Args:
        font_name: font name as a string
        space_width: default space width if no data is found.
        obj: XObject or Page where you can find a /Resource dictionary

    Returns:
        Font sub-type, space_width criteria (50% of width), encoding, map character-map, font-dictionary.
        The font-dictionary itself is suitable for the curious.

    z
/Resourcesz/Font)build_char_map_from_dict)r   r   r   ftfont_subtypefont_halfspacefont_encodingfont_map r    F/var/www/html/kangema/venv/lib/python3.10/site-packages/pypdf/_cmap.pybuild_char_map   s
   r"   r   c                 C   sR   t t|d  }t|\}}td||}t|| d }t||d }||||fS )ak  
    Determine information about a font.

    Args:
        space_width: default space with if no data found
             (normally half the width of a character).
        ft: Font Dictionary

    Returns:
        Font sub-type, space_width criteria(50% of width), encoding, map character-map.
        The font-dictionary itself is suitable for the curious.

    /Subtype        @)r
   str
get_objectget_encodingget_actual_str_keybuild_font_width_mapcompute_space_width)r   r   	font_typeencodingmap_dictspace_key_charfont_width_maphalf_space_widthr    r    r!   r   +   s   r   Unknowni'     u   �unknown_char_mapz/Identity-H	utf-16-bez/Identity-Vz	/GB-EUC-Hgbkz	/GB-EUC-Vz/GBpc-EUC-Hgb2312z/GBpc-EUC-Vz
/GBK-EUC-Hz
/GBK-EUC-Vz/GBK2K-Hgb18030z/GBK2K-Vz
/ETen-B5-Hcp950z
/ETen-B5-Vz/ETenms-B5-Hz/ETenms-B5-Vz/UniCNS-UTF16-Hz/UniCNS-UTF16-Vz/UniGB-UTF16-Hz/UniGB-UTF16-V_predefined_cmapz/CourieriX  z/Courier-Boldz/Courier-BoldObliquez/Courier-Obliquez
/Helveticai  z/Helvetica-Boldz/Helvetica-BoldObliquez/Helvetica-Obliquez/Helvetica-Narrow   z/Helvetica-NarrowBoldz/Helvetica-NarrowBoldObliquez/Helvetica-NarrowObliquez/Times-Roman   z/Times-Boldz/Times-BoldItalicz/Times-Italicz/Symbolz/ZapfDingbats_default_fonts_space_widthc                 C   sD   t | }t| \}}t|tr|D ]}|dkrt|||< q||fS )N   )_parse_encoding_parse_to_unicode
isinstancedictchr)r   r-   r.   	int_entryxr    r    r!   r(      s   
r(   c              	   C   s  g }d| vr)d| v r%t t| d tv r%tttdtt t| d  }|S d}|S t ttttf | d 	 }t
|trrz!|tv rHt|  }n|tv rQt| }nd|v rXd}ntdW nI tyq   td| d	t |}Y n6w t
|trd
|v rztt t|d
   }W n ty   td| d	t td  }Y nw td  }t
|trd|v rd}t t|d D ]*}t
|tr|}qz|t|k rt| ||< W n ty   |||< Y nw |d7 }qt
|trtttd|}|S )Nz	/Encoding	/BaseFontr3   charmapz-UCS2-r5   z	not foundzAdvanced encoding z not implemented yetz/BaseEncodingz/StandardEncodingz/Differencesr   r   )r
   r&   r   rB   zipranger	   r   r   r'   rA   copyr:   	Exceptionr   __name__intlenr   list)r   r-   encrE   or    r    r!   r?      sj   





r?   c                 C   s~   i }g }d| vr|  dddkrt| ||S i g fS d}d}d }t| }|dD ]}t|d|||||\}}}q)||fS )N
/ToUnicoder#    z/Type1F   
s    	)get_type1_alternative
prepare_cmsplitprocess_cm_linestrip)r   r.   rD   
process_rgprocess_charmultiline_rgcmliner    r    r!   r@      s*   	r@   
value_charr-   r.   c                    sH   i }t |tr fdd| D }n fdd| D }|  S )Nc                    s"   i | ]\}}| kr|t |qS r    )rC   .0keyvaluer`   r    r!   
<dictcomp>   s   " z&get_actual_str_key.<locals>.<dictcomp>c                    s   i | ]\}}| kr||qS r    r    ra   re   r    r!   rf      s    )rA   rB   itemsrU   )r`   r-   r.   key_dictr    re   r!   r)      s
   
r)   c                 C   s  | d }t |trtt| d  }nd}t |tr| }| ddddddd	d
dddd}|	d}t
t|D ]0}|| d}|dkru|dkrYd}n|| d | dd}|d || |d d   ||< qEd|dddddd}|S )NrR   s,   beginbfrange
<0000> <0001> <0000>
endbfrange   beginbfchars   
beginbfchar
	   endbfchars   
endbfchar
   beginbfranges   
beginbfrange

   endbfranges   
endbfrange
s   <<s   
{
s   >>s   
}
   <   >r      .        r      [s    [    ]s    ]
    rT   )rA   r   r
   r   get_datar&   encoderZ   replacerX   rI   rN   findjoin)r   tur^   llijcontentr    r    r!   rW      s:   


	 rW   r_   r[   r\   r]   rD   c              
   C   s   | dks
| d dkr|||fS |  dd} d| v rd}nGd| v r#d	}n@d
| v r*d}n9d| v r1d	}n2|r[z	t| |||}W n& tjyZ } ztd| d| t W Y d }~nd }~ww |rct| || |||fS )Nrq   r   %      	rp   rk   Trl   Fri   rj   zSkipping broken line z: )rw   parse_bfrangebinasciir   r   rL   parse_bfchar)r_   r[   r\   r]   r.   rD   errorr    r    r!   rY   #  s*   
"
rY   c                 C   s
  dd |  dD }d}|d urQd|d d  }|d }|d	 }|D ]-}	|	d
kr,d} n$t|	dd|t|| |d d	krBdndd< || |d	7 }q"nt|d d}t|d	 d}tt|d t|d	 }
t|
d |d< d|d d  }|d dkr|dd  D ]-}	|	d
krd} n$t|	dd|t|| |d d	krdndd< || |d	7 }qnEt|d d}dtdt|d  }d}||krt|| dd|t|| |d d	krdndd< || |d	7 }|d	7 }||ks|rd S ||fS )Nc                 S      g | ]}|r|qS r    r    rb   rE   r    r    r!   
<listcomp>F      z!parse_bfrange.<locals>.<listcomp>rp   Fs   %%0%dX   r   r   rs   Tr5   surrogatepassrG      rr         )rX   r   decodeappendrM   maxrN   r   )r_   r.   rD   r]   lstclosure_foundfmtabsqnbicfmt2r    r    r!   r   @  sp   





r   c              
   C   s  dd |  dD }t|d d |d< t|dkrd}|d d	krYzt|d t|d d
k r3dndd}W n  tyX } ztd|d|d dt W Y d }~nd }~ww ||t|d |d dkridndd< |t|d d |dd  }t|dksd S d S )Nc                 S   r   r    r    r   r    r    r!   r   }  r   z parse_bfchar.<locals>.<listcomp>rp   r   r   r   r   rS   ro   r   rG   r5   r   zGot invalid hex string: z ()r   )	rX   rN   r   r   BinasciiErrorr   rL   r   rM   )r_   r.   rD   r   map_to	exceptionr    r    r!   r   |  s,   (r   default_font_widthc              
   C   s  i }d}d}zt tt| d   d }W n	 ty   Y nw d| v r| d d  }d|v r;tt|d  |d< n||d< d|v rJ|d  }ng }t|dkrt|d tr]|d n|d  }|d  }t|tr|}|d	  }t|ttfst	d
| dt
 |dd  }qLt||d D ]}	||t|	< q|dd  }n-t|tr|}	|D ]}
|
 }||t|	< |	d7 }	q|d	d  }nt	d|d   t
 nt|dksRnd| v rXtt| d  }d| v rdtt| d v r| d d  |d< n$d}d}|D ]}| }|dkr||7 }|d7 }q|td| |d< tt| d }tt| d }t||d D ] }	z||	|   }||t|	< W q7 ttfyW   Y q7w t|dri|re|nd|d< |S )Nr   rF   r%   z/DescendantFontsz/DWdefaultz/Wr   r   z&Expected numeric value for width, got z. Ignoring it.r   zunknown widths : 
z/Widths/FontDescriptorz/MissingWidthz
/FirstCharz	/LastChar        )r=   r
   r&   r'   KeyErrorfloatrN   rA   rM   r   rL   rI   rC   rO   __repr__r   r   r   
IndexErrorr   rU   )r   r   r0   stenft1wsecondwidthc_codewwmcptxxr    r    r!   r*     s   "




r*   r0   
space_charc              	   C   sD   z| | }|dkrt dW |S  tt fy!   | d d }Y |S w )Nr   z
Zero widthr   r%   )
ValueErrorr   )r0   r   sp_widthr    r    r!   r+     s   
r+   charc                 C   s0   d}z| | }W |S  t y   | d }Y |S w )Nr   r   )r   )r0   r   
char_widthr    r    r!   compute_font_width  s   
r   c           
      C   sp  d| vr||fS t t| d d}t|r||fS |d us"J d|  }|dd }|dd }|dd	d	}|D ]r}|d
rdd |dD }t	|dkr_|d dkr_qAzt
|d }W n	 typ   Y qAw z
t|d   }	W n, ty   |d drztt
|d dd  d}	W n ty   Y Y qAw Y qAY nw |	|t|< || qA||fS )Nr   z	/FontFilemypys   eexec
r   s	   /Encodingr   rt   rT   s   dupc                 S   s   g | ]}|d kr|qS )rq   r    )rb   _wr    r    r!   r     s    z&_type1_alternative.<locals>.<listcomp>rp   r   s   putr   s   /unir   r   )r
   r   rU   r   r'   ru   rX   rw   
startswithrN   rM   r   r   r   r   rC   r   )
r   r.   rD   ft_desctxtlinesliwordsr|   vr    r    r!   rV     sH   

rV   )4r   r   r   r   mathr   typingr   r   r   r   r	   r
   _codecsr   r   _utilsr   r   genericr   r   r   r   r   r   r&   r   rM   r"   r   rB   fromkeysrI   r4   __annotations__r:   r=   r(   r?   r@   r)   bytesrW   boolrY   r   r   r*   r+   r   rV   r    r    r    r!   <module>   sr  
   (
&
"0	
	
"

;
!

)



&<

R




