U
    NfMF                     @   s  U 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mZ ddlmZmZmZmZmZ eeeeeee	eeeef f eeef ef dd	d
Zeeeeee	eeeef f eeef f dddZddeeeddgd i fZ eeee	eeeef f eeef f e!d< ddddddddddd
Z"eeef e!d< dddddddddddddddddddZ#eeef e!d< eeee	eeeef f ef dd d!Z$eeeeeef eee f dd"d#Z%ee&d$d%d&Z'e&e(e(e	d'eeef f eeef ee ee(e(e	d'eeef f f d(d)d*Z)e&eeef ee e	d'eeef f e	d'eeef f d+d,d-Z*e&eeef ee d'd.d/d0Z+eeeed1d2d3Z,eeeef eee eeeef eee f d4d5d6Z-d'S )7    )	unhexlify)ceil)AnyDictListTupleUnioncast   )adobe_glyphscharset_encoding)b_logger_errorlogger_warning)DecodedStreamObjectDictionaryObjectIndirectObject
NullObjectStreamObject)	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   ftZfont_subtypeZfont_halfspaceZfont_encodingZfont_map r   //tmp/pip-unpacked-wheel-zevpxvmc/pypdf/_cmap.pybuild_char_map   s     r   )r   r   r   c           
      C   s"  t t|d }d}t||\}}t||\}}}|dkrXd|ksL|d dkrRd}qd}n(t|tr|D ]}|dkrft|||< qfztt t|d	  } W n tk
r   Y nX t|trz|	dd
 }W n2 tk
r   |	d}|d
 d|d   }Y nX n|}t
||| }	|t|	d ||fS )aj  
    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
   charmap	utf-16-be   	/BaseFontr         )r	   strparse_encodingparse_to_unicode
isinstancedictchr_default_fonts_space_width	Exceptionencodecompute_space_widthfloat)
r   r   Z	font_type
space_codeencodingmap_dict	int_entryxspsp_widthr   r   r   r   '   s:    



r   Unknowni'  r&   u   �unknown_char_mapr#   gbkgb2312gb18030)
z/Identity-Hz/Identity-Vz	/GB-EUC-Hz	/GB-EUC-Vz/GBpc-EUC-Hz/GBpc-EUC-Vz
/GBK-EUC-Hz
/GBK-EUC-Vz/GBK2K-Hz/GBK2K-V_predefined_cmapiX  i        )z/Courierz/Courier-Boldz/Courier-BoldObliquez/Courier-Obliquez
/Helveticaz/Helvetica-Boldz/Helvetica-BoldObliquez/Helvetica-Obliquez/Helvetica-Narrowz/Helvetica-NarrowBoldz/Helvetica-NarrowBoldObliquez/Helvetica-NarrowObliquez/Times-Romanz/Times-Boldz/Times-BoldItalicz/Times-Italicz/Symbolz/ZapfDingbatsr.   )r   r3   r   c              	   C   sJ  g }d| krzXd| krJt t| d tkrJtttdtt t| d  }nd}|tt t| d  fW S  tk
r   t t| d dkrd|f Y S d|f Y S Y nX | d  }t	|tr.zB|tkrt| 
 }n(|tkrt| }nd|krd	}ntd
W n, tk
r*   td| dt |}Y nX ntt	|trd|krztt t|d  
 }W n4 tk
r   td| dt td 
 }Y nX ntd 
 }d|kr$d}t tt t|d D ]^}t	|tr|}nFzt| ||< W n, tk
r   |||< |dkr|}Y nX |d7 }qt	|trBtttd|}||fS )Nz	/Encodingr%   r&   r"   r   /Type1r    z-UCS2-r#   z	not foundzAdvanced encoding z not implemented yetz/BaseEncodingz/StandardCodingz/Differencesr    r
   )r	   r(   r   r,   zipranger.   r/   
get_objectr+   copyr?   r   __name__r   intr   list)r   r3   r4   encr7   or   r   r   r)      sf    




r)   c                 C   s   i }g }d| kr8|  dddkr.t| |||S i |g fS d}d}d }t| }|dD ]"}t|d|||||\}}}qV| D ]\}	}
|
dkr|	}q|||fS )	N
/ToUnicoder   r    rB   F   
s    	rC   )gettype1_alternative
prepare_cmsplitprocess_cm_linestripitems)r   r3   r5   r6   
process_rgprocess_charmultiline_rgcmlineavaluer   r   r   r*      s0    
	r*   )r   r   c                 C   s*  | d }t |tr*ttt| d  }nt |trB|drBd}t |trT| }|	 
dd
dd
dd	
d
d
dd
dd}|d}tt|D ]`}|| d}|dkr|dkrd}n|| d | 
dd}|d || |d d   ||< qd|
dd
dd
dd}|S )NrM   z	/Identitys,   beginbfrange
<0000> <0001> <0000>
endbfrange   beginbfchars   
beginbfchar
	   endbfchars   
endbfchar
   beginbfranges   
beginbfrange

   endbfranges   
endbfrange
s   <<s   
{
s   >>s   
}
   <   >r      .        r
      [s    [    ]s    ]
    rN   )r+   r   r   r	   r   get_datar(   
startswithr0   rT   replacerR   rE   lenfindjoin)r   ZturY   Zllijcontentr   r   r   rQ      s^    

      	
"
   rQ   N)rZ   rV   rW   rX   r5   r6   r   c                 C   s   | dks| d dkr|||fS |  dd} d| kr8d}nNd| krFd	}n@d
| krTd}n2d| krbd	}n$|rvt| |||}n|rt| || |||fS )Nre   r   %      	rd   r_   Tr`   Fr]   r^   )rk   parse_bfrangeparse_bfchar)rZ   rV   rW   rX   r5   r6   r   r   r   rS   %  s     
rS   )rZ   r5   r6   rX   r   c                 C   s  dd |  dD }d}|d k	rd|d d  }|d }|d	 }|dd  D ]Z}	|	d
kr`d} qt|	dd|t|| |d d	krdndd< || |d	7 }qLn`t|d d}t|d	 d}tt|d t|d	 }
t|
d |d< d|d d  }|d dkr|dd  D ]b}	|	d
kr4d} qt|	dd|t|| |d d	krbdndd< || |d	7 }qnt|d d}dtdt|d  }d}||krt|| dd|t|| |d d	krdndd< || |d	7 }|d	7 }q|rd S ||fS )Nc                 S   s   g | ]}|r|qS r   r   .0r7   r   r   r   
<listcomp>E  s      z!parse_bfrange.<locals>.<listcomp>rd   Fs   %%0%dXr!   r'   r   r
   rg   Tr#   surrogatepassr"      rf         )rR   r   decodeappendrI   maxrl   r   )rZ   r5   r6   rX   lstZclosure_foundfmtr[   bsqZnbicZfmt2r   r   r   rt   ?  sj    




rt   )rZ   r5   r6   r   c                 C   s   dd |  dD }t|d d |d< t|dkrd}|d d	krlt|d t|d d
k rddndd}||t|d |d dkrdndd< |t|d d |dd  }q(d S )Nc                 S   s   g | ]}|r|qS r   r   rv   r   r   r   rx   |  s      z parse_bfchar.<locals>.<listcomp>rd   r   r'   r!   r
   r    rc   r|   r"   r#   ry   rz   )rR   rl   r   r}   r~   rI   )rZ   r5   r6   r   Zmap_tor   r   r   ru   {  s$      ru   )r   r3   r   r   c                 C   s  |d }g }i }d}d| krn| d d   }ztt|d |d< W n tk
r`   d|d< Y nX d|krxt|d }ng }t|dkr<t|d tr|d n
|d   }|d   }t|trt||D ]}	|d	 ||	< q|d
d  }q|t|tr |D ]}
|
||< |d7 }q|d	d  }q|t	d|d 
  t q<q|z|| }W n" tk
rj   |d d }Y nX nd| krjt| d }zbtt| d }tt| d }||ks||k rtd|||  dkrtd|||  }W n tk
rh   d| kr$dtt| d kr$| d d }n@d}d}|D ] }	|	dkr0||	7 }|d7 }q0|td| d	 }Y nX t|tr|  }|d kst|trdS |S |S )Ng       @r   z/DescendantFontsz/DWr!   g     @@z/Wr
   r'   r{   zunknown widths : 
z/Widthsz
/FirstCharz	/LastCharzNot in rangez
null width/FontDescriptorz/MissingWidthg        )rF   r	   r2   r/   rJ   rl   r+   rI   rE   r   __repr__rH   r   r   r   r   )r   r3   r   r9   wZw1stZft1secondr7   yenmZcptr   r   r   r   r1     s    
"




 
r1   )r   r5   r3   r6   r   c                 C   s  d| kr|||fS t t| d d}|d kr8|||fS |  }|dd }|dd }|ddd}|D ]}|d	rvd
d |dD }t|dkr|d dkrqvzt	|d }	W n t
k
r   Y qvY nX zt|d   }
W nh tk
rZ   |d drRztt	|d dd  d}
W n t
k
rN   Y Y qvY nX nY qvY nX |d  dkrr|	}|
|t|	< ||	 qv|||fS )Nr   z	/FontFiles   eexec
r   s	   /Encodingr
   rh   rN   s   dupc                 S   s   g | ]}|d kr|qS )re   r   )rw   _wr   r   r   rx     s      z%type1_alternative.<locals>.<listcomp>rd   r{   s   putr'   s   /unir|   rz   )r	   r   rO   rF   ri   rR   rk   rj   rl   rI   
ValueErrorr   r}   KeyErrorr-   r~   )r   r5   r3   r6   Zft_desctxtlinesliwordsro   vr   r   r   rP     s@    





rP   ).binasciir   mathr   typingr   r   r   r   r   r	   _codecsr   r   _utilsr   r   r   Zgenericr   r   r   r   r   r(   r2   rI   r   r   r,   rD   rE   r;   __annotations__r?   r.   r)   r*   bytesrQ   boolrS   rt   ru   r1   rP   r   r   r   r   <module>   s       ( &C0	 A %*

<   P
