
    JՁj                       d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZ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 dd
lmZ ddlmZ ddlm Z  ddl!m"Z"m#Z# e	rd dl$m%Z% d dl&m'Z' d dl(m)Z) ddl*m+Z+ 	 d dl,m-Z- d dl.m/Z/m0Z0 dZ1dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ= ed        G d! d"             Z> ed        G d# d$             Z?e G d% d&             Z@y# e2$ r dZ1Y [w xY w)'    )annotationsN)Sequence)	dataclassfield)TYPE_CHECKINGAnyClassVarcast)	ArrayObjectDictionaryObjectFloatObjectIndirectObject
NameObjectNumberObject	PdfObjectStreamObjectTextStringObject   )get_encoding)!encoding_dict_from_named_encodingadobe_glyphs)logger_warning)	FontFlags)LimitReachedErrorPdfReadError)table__h_e_a_d)table__p_o_s_t)table_O_S_2f_2)	PdfWriter)BytesIO)TTFont
TTLibErrorTFi   i             	   
      d   )frozenc                      e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   d
Z	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   eZded<   dZded<   ddZy)FontDescriptorz
    Represents the FontDescriptor dictionary as defined in the PDF specification.
    This contains both descriptive and metric information.

    The defaults are derived from the mean values of the 14 core fonts, rounded
    to 100.
    )g      Y      i     @@g      @z+ClassVar[tuple[float, float, float, float]]_DEFAULT_BBOXUnknownstrnamefamilyweightg     @floatascentr/   descentg     @
cap_heightg     @@x_height        italic_angle    intflagsz!tuple[float, float, float, float]bboxNzStreamObject | None	font_filec                   t        t        d      t        d      t        d      t        d| j                         t        d      t        | j                        t        d      t        | j                  D cg c]  }t        |       c}      t        d      t        | j                        t        d      t        | j                        t        d	      t        | j                        t        d
      t        | j                        t        d      t        | j                        i	      }| j                  r| j                  |t        d      <   |S c c}w )N/Type/FontDescriptor	/FontName//Flags	/FontBBox/ItalicAngle/Ascent/Descent
/CapHeight/XHeight
/FontFile2)r   r   r4   r   r@   r   rA   r   r=   r8   r9   r:   r;   rB   )selfnfont_descriptor_resources      2/tmp/pip-target-jj2dfcxx/lib/python/pypdf/_font.pyas_font_descriptor_resourcez*FontDescriptor.as_font_descriptor_resourceX   s    #3w,=!>{#Z!DII;%@x ,tzz":{#[$))1TQ+a.1T%U~&D4E4E(Fy!;t{{#;z"K$=|$k$//&Bz"K$>
5
 
$  >>AE$Z%=>'' 2Us   6Ereturnr   )__name__
__module____qualname____doc__r1   __annotations__r4   r5   r6   r8   r9   r:   r;   r=   r@   rA   rB   rT        rS   r.   r.   ?   s     BaM>`D#FCFCFEGUJHeL%E3O.;D
+;%)I")(r]   r.   c                  "    e Zd ZU ded<   ded<   y)CoreFontMetricsr.   font_descriptordict[str, int]character_widthsN)rW   rX   rY   r[   r\   r]   rS   r_   r_   l   s    ##$$r]   r_   c                  *   e Zd ZU dZded<   ded<    ee      Zded<   d	Zded
<    ee	      Z
ded<    ed       Zded<   dZded<   dZded<   dZded<   e	 	 	 	 	 	 	 	 	 	 d,d       Zed-d       Zed.d       Zed/d       Ze	 	 	 	 	 	 d0d       Zed1d       Ze	 	 	 	 	 	 	 	 d2d       Zed3d       Zed4d        Ze	 	 	 	 d5d!       Ze	 	 	 	 	 	 	 	 d6d"       Zed7d#       Zed8d9d$       Zd:d%Zd;d&Zd<d'Z 	 	 	 	 	 	 	 	 d=d(Z!d>d?d)Z"d@d*Z#y+)AFonta  
    A font object for use during text extraction and for producing
    text appearance streams.

    Attributes:
        name: Font name, derived from font["/BaseFont"]
        character_map: The font's character map
        encoding: Font encoding
        sub_type: The font type, such as Type1, TrueType, or Type3.
        font_descriptor: Font metrics, including a mapping of characters to widths
        character_widths: A mapping of characters to widths
        space_width: The width of a space, or an approximation
        interpretable: Default True. If False, the font glyphs cannot
            be translated to characters, e.g. Type3 fonts that do not define
            a '/ToUnicode' mapping.

    r3   r4   str | dict[int, str]encoding)default_factorydict[Any, Any]character_mapr2   sub_typer.   r`   c                 
    ddiS )Ndefault  r\   r\   r]   rS   <lambda>zFont.<lambda>   s    iQTEU r]   ra   rb      zfloat | intspace_width 
space_charTboolinterpretablec                    t        t        | d         }| j                  dd      }t        |      D ]  \  }}t	        |      |t        ||z         <   ! y)zcParses a TrueType or Type1 font's /Widths array from a font dictionary and updates character widths/Widthsz
/FirstCharr   N)r
   r   get	enumerater?   chr)pdf_font_dictchar_maprf   current_widthswidths_array
first_charidxwidths           rS   _collect_tt_t1_character_widthsz$Font._collect_tt_t1_character_widths   sW     Ky)AB"&&|Q7
#L1 	?JC47JN3sZ/01	?r]   c                z    || k  rt        d|  d| d      || z
  }|t        kD  rt        d| dt         d      y )NzInvalid CID width range: z...zCID width range too large:  > )r   MAX_CID_WIDTH_ENTRY_COUNT)startendcounts      rS   __check_range_lengthzFont.__check_range_length   s_    ;#+E7"SE;  e,,#&A%LeKffg$hii -r]   c                B    | t         kD  rt        d|  dt          d      y )NzToo many character widths: r   r   )MAX_WIDTH_ENTRY_COUNTr   )r   s    rS   __check_entry_countzFont.__check_entry_count   s.    ((#&A%LaKbbc$dee )r]   c           
        d}d}| j                  dt                     j                         }t        |      }t	        |      D ]  \  }}|r|dz  }|j                         }t        |t        t        f      st        dt        |       H|dz   |k  r||dz      j                         nd}t        |t              rt        |      |}
}	|	t        |
      z   }t        j                  |	|       |||	z
  z  }t        j                  |       |j                  t        t!        |	|d      |
      D ci c]  \  }}t#        |      | c}}       d}t        |t        t        f      r|dz   |k  rt        ||dz      j                         t        t        f      rt        |      t        |      ||dz      j                         }}}	t        j                  |	|dz          |||	z
  dz   z  }t        j                  |       |j                  t!        |	|dz   d      D ci c]  }t#        |      | c}       d}t        dt        |       	 yc c}}w c c}w )	zRParses the /W array from a DescendantFont dictionary and updates character widths.r   /Wr   z?Expected numeric value for width, got %(w_entry)s. Ignoring it.)sourcew_entryNr$   z9Invalid font width definition. Last element: %(w_entry)s.)rw   r   
get_objectlenrx   
isinstancer?   r7   r   rW   r   rd   _Font__check_range_length_Font__check_entry_countupdateziprangery   )d_fontr|   
skip_countentry_count_w	_w_lengthr   r   w_next_entry	start_idx
width_liststop_idx_cidx_widthconst_widths                  rS   _collect_cid_character_widthsz"Font._collect_cid_character_widths   sU    
ZZkm,779G	%bM >	LCa
((*GgU|4 U##
 7:Qw7J2cAg;113PTL,1(+Gl:	$s:6)))X>9 45((5%% .1!)Xq9&.)E6 E
F* 
 <#u6!Gi'r#'{557#uF L%sQwK**, &18	
 )))X\B9 4q 89((5%% &+%x!|Q&! E
K/ 
 O##u>	.0s   .II
c                    d}t        | t              r*| j                         D ]  \  }}||k(  st        |      c S  |j                         D ]  \  }}||k(  st	        |      c S  |S )Nrq   )r   dictitemsry   r3   )rf   ri   rr   	char_codechar_strglyph_ids         rS   _get_space_charzFont._get_space_char   sy    
 
h%'/~~'7 *#	8z)y>)* #0"5"5"7 	%Hh:%8}$	% r]   c                D   | sd| d<   y || v rJ| |   dk7  rB|t         j                  z  t         j                  k(  r	| |   | d<   y t        d| |   z        | d<   y | j                         D cg c]
  }|dkD  s	| }}|rt	        |      t        |      z  | d<   y d| d<   y c c}w )Nrm   rl   r   r$   )r   FIXED_PITCHr?   valuessumr   )r|   r@   rr   wvalid_widthss        rS   _add_default_widthzFont._add_default_width
  s    (+N9%'N:,F!,K	---)2G2GG,::,Fy)(+Az0J,J(KN9% $2#8#8#:Daa!eDDNZC$5\9J$Jy!`cy! Es   )
B4Bc                    | j                  |d      }|dk7  r|S |t        j                  z  t        j                  k(  r| d   S | d   dz  S )Nr   rl   r$   )rw   r   r   )rb   r@   rr   rp   s       rS   _add_space_widthzFont._add_space_width  sX     '**:q9!I)))i.C.CC#I..	*a//r]   c                    	 | D cg c]  }t        |       }}t        |      dk7  ry|d   |d   |d   |d   fS c c}w # t        t        f$ r Y yw xY w)a  
        Convert a raw /FontBBox value into four floats.

        Args:
            raw_bbox: The raw /FontBBox value read from the PDF.

        Returns:
            The four bounding box values, or ``None`` when the value is not
            a sequence of exactly four numbers, so that a malformed entry
            falls back to the default bounding box rather than raising.

        Nr&   r   r   r$   r%   )r7   	TypeError
ValueErrorr   )raw_bboxvaluerA   s      rS   _parse_bboxzFont._parse_bbox,  si    	.67UE%L7D7 t9>AwQa$q'11 8:& 		s   A  ;A  A   AAc           	     H   i }dD ]  \  }}|| v s| |   ||<    d|v r#t         j                  |d         }||d= n||d<   dD ]2  }|| v sd|v rt        d|        	 | |   j                         }||d<   4 |S # t        $ r}t	        dt
        || |       Y d }~Yd }~ww xY w)N)
)rF   r4   )z/FontFamilyr5   )z/FontWeightr6   )rK   r8   )rL   r9   )rM   r:   )rN   r;   )rJ   r=   )rH   r@   )rI   rA   rA   z	/FontFilerO   z
/FontFile3rB   z!More than one /FontFile found in zBFailed to get %(source_key)r in %(font_descriptor_obj)s: %(error)s)r   
source_keyfont_descriptor_objerror)rd   r   r   r   r   rW   )r   font_descriptor_kwargsr   
target_keyrA   rB   es          rS   _parse_font_descriptorzFont._parse_font_descriptorB  s   13'
 	U"J
 005H5T&z2	U ++##$:6$BCD|*6215&v. D 	J00"88&)JK^J_'`aa
 3J ? J J LI:C*;7	  &% $ "\'#-,? s   A::	B!BB!c                   ddl m} |j                  dd      j                  d      }|j                  dd      j                  d      }t	        |      \  }}d }i }d}	|j                  d      dv r|d	k(  r)d
|vr%t        d |j                  d      xs g D              }	|	r<d|v r| j                  ||||       n||v r||   j                  }t        |t              rI|j                         D ]5  \  }
}|||   j                  v s||   j                  |   |t        |
      <   7 nBt        d      D ]4  }
t        |
      }|||   j                  v s ||   j                  |   ||<   6 d|v rl|j                  dt                     j                         }d|v r$t!        t"        |d   j                               |d<   t%        di | j'                  |      }nd|v r d|i}| j)                  |d         }|||d<   t%        di |}nt+        t!        t,        |d               D ]  \  }}t!        t        |j                               }|t!        t,        |d         |<   | j/                  ||       d|v r$t!        t"        |d   j                               |d<   |j                  dt                     j                         }t%        di | j'                  |      } |st%        |      }| j1                  ||      }|j                  dd      dk(  r| j3                  ||j4                  |       | j7                  ||j4                  |      } | |||||||||		      S )Nr   CORE_FONT_METRICS	/BaseFontr2   rG   /SubtypeT)/Type1z/MMType1z	/TrueTypez/Type3Type3
/ToUnicodec              3  ,   K   | ]  }|t         v   y wNr   ).0cnames     rS   	<genexpr>z*Font.from_font_resource.<locals>.<genexpr>  s      $ \)$s   z
/CharProcsrv      rE   z/MissingWidthrl   rI   r4   rA   /DescendantFonts)r   r|   /DW)r4   	r4   rj   rf   r`   ri   rb   rp   rr   rt   r\   )pypdf._codecs.core_font_metricsr   rw   removeprefixr   allr   r`   r   r   r   rb   ry   r   r   r   r
   r?   r.   r   r   rx   r   r   r   r   r@   r   )clsrz   r   r4   rj   rf   ri   r`   rb   rt   code	characterr   r   rA   
d_font_idxr   rr   rp   s                      rS   from_font_resourcezFont.from_font_resourcen  s   
 	F   i8EEcJ $$Z;HHM".}"=-+- Z(,YY
 7"|='H # $!.!2!2<!@!FB$ ! -77%}h@P ..&7&=&M&MO!(D1/7~~/? rOD)(,=d,C,T,TT>OPT>U>f>fgp>q 0T ;r
 %*#J rD(+D	I(,=d,C,T,TT>OPT>U>f>fgp>q 0 ;r %5*7*;*;<MO_Oa*b*m*m*o'&*==6:3@STc@d@o@o@q6r(3&4&gs7Q7QRe7f&gO M1>Dd^*??=+EFD'9=.v6&4&N7M&NO '0[-0B"CD' 	d"
F .0A0A0CDSY[-0B"CDZP11P`1aF?26sF5M<T<T<V2W$Y/&,jj1BDTDV&W&b&b&d#"0"c33M3MNa3b"c	d ,$7O((=A
	1-2""#3_5J5JJW**+;_=R=RT^_+'-#!'

 
	
r]   c                   |r|j                   }|j                  dz	  }d}| j                  t        z  s|r&|j                  t
        z  r|t        j                  z  }|r$|j                  }|dk7  r|t        j                  z  }|rj                  t        k(  s|r"|j                  dkD  r|t        j                  z  }|r/t        k(  sj                  t        k(  r|t        j                   z  }|r<dj"                  cxk  rdk  sn dcxk  rdk  sn |dk(  r|t        j$                  z  }|r6t&        k(  sj                  t(        t*        hv r|t        j,                  z  }|S |t        j.                  z  }|S )	N   r   r<   r$   r)   r   r'      )panosesFamilyClassmacStyleHEADER_MACSTYLE_ITALICfsSelectionOS2_FSSELECTION_ITALICr   ITALICitalicAnglebProportion!OS2_PANOSE_BPROPORTION_MONOSPACEDisFixedPitchr   OS2_SFAMILYSCLASS_SCRIPTSbFamilyTypeOS2_PANOSE_BFAMILYTYPE_SCRIPTSCRIPTbSerifStyleSERIFOS2_SFAMILYSCLASS_SYMBOLIC!OS2_PANOSE_BFAMILYTYPE_DECORATIVE OS2_PANOSE_BFAMILYTYPE_PICTORIALSYMBOLICNONSYMBOLIC)header
postscriptos2r   family_classr@   r=   s          rS   %_font_flags_from_truetype_font_tablesz*Font._font_flags_from_truetype_font_tables  sd    ZZF ++q0L ??33Rh@hY%%%E%11Ls"))) V''+LLJ33a7Y***E 559K9KOl9lY%%%E ##)r)L%A%):Y__$E 66#DFf"ggY'''E  Y***Er]   c                $   t         st        d      t        |      5 }|d   }|d   }|d   j                  }|j	                  dd       }|j	                  dd       }|j
                  }|st        d      d|z  }	i }
|j	                  d	d       }|r9|j                         |
d	<   |j                         |
d
<   |j                         |
d<   t        t        |j                  |	z  d            |
d<   t        t        |j                  |	z  d            |
d<   |rK	 t        t        |j                  |	z  d            |
d<   t        t        |j                  |	z  d            |
d<   | j#                  |||      |
d<   t        |j$                  |	z  d      t        |j&                  |	z  d      t        |j(                  |	z  d      t        |j*                  |	z  d      f|
d<   t-               }|j/                         }|j1                  |       |j3                  t5        d      t7        t9        |            i       ||
d<   t;        di |
}d}i }i }|j=                         }|j	                  d      }|r|j?                         }tA        |      D ]  \  }}|j	                  |      }|tC        |      }|jE                  |      }|jG                  dd      }|jI                  dd      }|||<   t        t        ||   d   |	z  d            ||<    nt        d      | jK                  ||      }| jM                  ||
d   |       | jO                  ||
d   |      }d d d         | jP                  d|d	      S # t         $ r Y #w xY w# 1 sw Y   4xY w) NzDThe 'fontTools' library is required to use 'from_truetype_font_file'headhheahmtxpostzOS/2z(Font file has an invalid unitsPerEm of 0r0   r4   r5   r6   r   r8   r9   r:   r;   r@   rA   z/Length1rB   	utf_16_becmapr$   big	utf-16-besurrogatepassz$Font file does not have a cmap tableType0Tr   r\   ))HAS_FONTTOOLSImportErrorr"   metricsrw   
unitsPerEmr   getBestFullNamegetBestFamilyNamegetBestSubFamilyNamer?   roundr8   r9   
sCapHeightsxHeightAttributeErrorr   xMinyMinxMaxyMaxr   getvalueset_datar   r   r   r   r.   getGlyphOrderbuildReversedMinrx   ry   
getGlyphIDto_bytesdecoder   r   r   r4   )r   rB   tt_font_objectr   horizontal_headerr	  r   r   units_per_emscale_factorr   namesfont_file_datafont_file_raw_bytesr`   rf   rb   ri   glyph_ordertt_font_cmap_tablereverse_cmapgidglyphr   char	gid_bytesgid_key_stringrr   rp   s                                rS   from_truetype_font_filezFont.from_truetype_font_file   s   deeI P	.
 $F+F .v 6$V,44G (++FD9J $$VT2C ",,L"#MNN!L0L 68""&&vt4E161F1F1H&v.383J3J3L&x0383M3M3O&x0/259J9Q9QT`9`bc3d/e"8,03E:K:S:SVb:bde4f0g"9-;>uS^^VbEbde?f;g*<89<U3<<R^C^`a=b9c*:6 /2.W.WX^`jlo.p"7+ fkkL0!4fkkL0!4fkkL0!4fkkL0!4	."6* *^N"+"4"4"6##$78!!:j#9<L_H`;a"bc2@";/,F/EFO"H/1,.M(668K "0!3!3F!;!1BBD"+K"8 
gJC , 0 0 7I ( y>D(33E:C #Q 6I%.%5%5k?%SN48M.17:5PQARUaAacd;e7f$^4
g ##IJJ,,X}EJ""#35KG5TV`a.. "8"A:K]P	d  %%+'-#!

 
	
e & AP	 P	s2   C7NA
M6G4N6	N?NNNNc                X   ddl m} |j                  d      }||   }t        d      } | |i |d|j                  |j                         D ci c].  \  }}t        |      x}|j                  v r||j                  |   0 c}}      }	|j                  d   |	j                  d<   |	S c c}}w )Nr   r   rG   cp1252Type1)r4   ri   rf   rj   r`   rb   rl   )r   r   r   r   r`   r   ry   rb   )
r   core_font_namer   	font_namecore_font_metricswin_ansi_encodingr   r   r)  fonts
             rS   from_core_font_namezFont.from_core_font_nameb  s    E"//4	-i8=hG&-== (9'>'>'@#D)I%D*;*L*LL '88CC
 ,=+M+Mi+Xi(s   3B&c           	     b   i }i }t         r#t        | j                  dd      rt        | j                  t
              r	 t        t        | j                  j                        j                         }t        t        |            5 }|j                  d      }|j                         }|j                         D ]h  \  }}|j                  |      }	|	j!                  dd      }
|
j#                  dd      }t%        |      }|||<   |j'                  | j                        ||<   j 	 ddd       ||fS t        | j                  t
              rT| j.                  j                         D ]3  \  }}t        |      }|||<   |j'                  | j                        ||<   5 ||fS | j                  j                         D ]$  \  }}t%        |      }|||<   t1        |f      ||<   & | j                  j                         D ci c]  \  }}|t1        |f       }}}| j.                  j                         D ]2  \  }}|||<   |j                  |t1        t3        |      f            ||<   4 ||fS # 1 sw Y   GxY w# t(        t*        f$ r$ |j-                          |j-                          Y xw xY wc c}}w )z
        Generates maps to translate input unicode text to bytes in two steps:
        Unicode code point -> raw_character (reverse cmap) -> PDF bytes (encoding cmap).
        rB   Nr  r$   r  r  r  )r  getattrr`   r   rf   r3   r
   r   rB   get_datar"   r!   rw   getBestCmapr   r  r  r  ry   encoder  r#   clearri   bytesord)rP   r&  encoding_cmapr"  r  r%  	best_cmapunicode_int
glyph_namer'  r*  r+  unicode_charr   glyph_id_strcharacter_codecharacter_strunicode_to_bytescharacter_code_strs                      rS   _get_typographic_mapszFont._get_typographic_mapsz  s   
 ,,k4@4==#.&!%lD4H4H4R4R!S!\!\!^GN34 	])7););F)C& 2 > > @I3<??3D ]/Z,77
C$'LLE$:	)2)9)9+)W'*;'75C\28F8M8Mdmm8\n5]	] $]22 dmmS)*.*<*<*B*B*D Q&,"8}-9\*.:.A.A$--.Pl+Q( ]** 150C0C0E H, #N 3-:\*/4n5F/Gm,H \`[h[h[n[n[p ;W><e^$566    594F4F4L4L4N 0"L-?\*4D4H4H 31245501 ]**M	] 	] #J/ &""$##%& s1   AI5 BI(#I5 ;J+(I2-I5 5/J('J(c                   ddl m} g }g }g }| j                  dk(  rdnd}| j                  dk(  rdnd}| j                  dk(  rdnd	}| j                  dk(  rd
nd}| j                  dk(  rdnd}	| j                  xs' t	        t
        t        t        f   | j                        j                         }
|
D ]  \  }}t        j                  d|      }|D cg c]  }t        |       }}t        d |D              sHt        |t              rt        |      n|}|j                  |      }dj!                  d |D              }|j#                  d| d| d       | j$                  |vs| j&                  j)                  t	        t        |      | j&                  d         }|j+                  t-        |      t/        t-        |      g      g        |d t0         x}rT|d t0        = |j#                  t3        |       d       |j+                  |       |j#                  d       |d t0         x}rTt5               }|j7                  d|	 d| d| d| d	dj!                  |      z   dz   j9                  d             ||fS c c}w )Nr   r   r  z	{cid:04X}z	{cid:02X}000000FFFFFFzAdobe-Identity-UCSzCustom-Simple-8BitzI/CIDSystemInfo <<
/Registry (Adobe)
/Ordering (UCS)
/Supplement 0
>> def
 NFKCc              3  &   K   | ]	  }|d k    yw)i  Nr\   r   	uni_points     rS   r   z>Font._create_widths_list_and_unicode_stream.<locals>.<genexpr>  s     C99&Cs   )cidc              3  $   K   | ]  }|d  
 yw)04XNr\   rQ  s     rS   r   z>Font._create_widths_list_and_unicode_stream.<locals>.<genexpr>  s     !QYsO"4!Qs   <z> <>rl   z beginbfchar	endbfcharz=/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
z/CMapName /z, def
/CMapType 2 def
1 begincodespacerange <z> endcodespacerange

z>
endcmap
CMapName currentdict /CMap defineresource pop
end endascii)r   r   rj   ri   r
   r   r?   r3   rf   r   unicodedata	normalizer=  r   r   formatjoinappendr4   rb   rw   extendr   r   CMAP_MAX_ENTRIES_PER_GROUPr   r   r  r:  )rP   r   widths_listunicode_map
bfchar_mapsrc_hex_formatcodespace_mincodespace_max	cmap_namecid_system_infomapping_sourcesrc_idactual_charnormalized_charsr)  
uni_pointsrS  cid_hexuni_hexr   partial_listto_unicode_streams                         rS   &_create_widths_list_and_unicode_streamz+Font._create_widths_list_and_unicode_stream  s   E "
 )-(@k"&--7":"&--7":,0MMW,D(J^	 }}' ]-/ 	 ,,ST#s(^T]]0SZZ\ $2 	`FK  +44V[I0@A#d)AJA C
CC%/%<c&k&(//C/8''!Qj!QQ!!AgYc'!"<= 99$55 !1155d36GI^I^_hIijE&&S(9;UZH[G\;]'^_)	`, ))D*DEElE6667#l"3!4LAB|,{+	 ))D*DEElE )N"" ##i[ )**7M?J_a ))K(),
 fWo	
  ---S Bs   I?c                   | j                   j                  r| j                  dk(  r| j                         \  }}t	        t        d      t        d      t        d      t        d      t        d      t        d| j                         t        d      t	        t        d	      t        d
      t        d      t        d      t        d      t        d      i      t        d      | j                   j                         t        d      t        |      t        d      t        | j                  d         t        d      t        d      i      }t	        t        d      t        d      t        d      t        d      t        d      t        d| j                         t        d      t        d      t        d      t        |g      t        d      |i      S t        d      }g }t        j                         D ci c]  \  }}||
 }}}t        t         t"        t$        f   | j&                        }	|j                         D ]G  \  }
}|	j)                  |
      }|s||k7  s |j+                  t        |
      t        ||         g       I |r4t	        t        d      t        d      t        d      t        |      i      }nt        d      }t	        t        d      t        d      t        d      t        d      t        d      t        d| j                         t        d      t        d| j                         t        d      |i      }|r!| j                         \  }}||t        d      <   |S c c}}w ) Nr  rD   z/Fontr   z/CIDFontType2r   rG   z/CIDSystemInfoz	/RegistryAdobez	/OrderingIdentityz/Supplementr   rE   r   r   rl   z/CIDToGIDMapz	/Identityz/Type0z	/Encodingz/Identity-Hr   r   r.  z/BaseEncodingz/WinAnsiEncodingz/Differencesr   z/Name)r`   rB   rj   rs  r   r   r4   r   r   rT   r   rb   r   r   r   r
   r   r?   r3   rf   rw   r`  )rP   rb  rr  cid_fontr3  differences_listkeyr   reverse_adobe_glyphsown_encodingr   rD  encoding_charrf   simple_font_s                   rS   as_font_resourcezFont.as_font_resource  s    ))dmmw.F .2-X-X-Z*K* (7#Z%8:&
?(C;'a		{O)D+,.>{+-=g-F{+-=j-I}-|A@ /
 ,-t/C/C/_/_/a4 +k":5!<0E0Ei0P#Q>*J{,C) H  $7#Z%8:&
8(<;'a		{O)D;'M)B-.XJ0G<(*;%   >hG<>=I=O=O=QRzsEs
RR'+DcNDMM'J#4#:#:#< 	nC(,,S1M.!@ ''c):JG[\iGj<k(lm	n
 6F?+Z8J-K>*K8H,IH 7H
 ""45H'wG!4z"Jx$8wa		{O!<{#Z!DII;%@{#X)
  #'#N#N#P A 4EK
<017  Ss   7M.c                   | j                         }d|v r |j                  |d         |t        d      <   d|v r't        t        |d         }t        t
        |d         }n|}d|v r_t        t
        |d         }dD ]'  }||v s|j                  ||         |t        |      <   ) |j                  |d         |t        d      <   |j                  |      }	|	||<   |	S )a  
        Some objects in a font resource need to be indirect objects. This method
        ensures that ToUnicode, FontDescriptor, FontFile, and, ultimately, the font
        resource itself, are registered with the PdfWriter instance as indirect objects.
        r   r   r   rE   r   )r  _add_objectr   r
   r   r   )
rP   writertarget_resource_dictfont_resource_namefont_resourcedescendant_fontsfont_resource_dictr   ry  font_resource_refs
             rS   _add_to_writerzFont._add_to_writer8  s    --/=(6<6H6HWcId6eM*\23.#K?Q1RS!%&68H8K!L!. 22"&'79KL]9^"_@ h--;A;M;MNabeNf;g'
38h AG@R@R"#45Az*;<= #..}=3D/0  r]   c           
         t        |D cg c]+  }| j                  j                  || j                  d         - c}d      S c c}w )zDSum of character widths specified in PDF font for the supplied text.rl   r<   )r   rb   rw   )rP   textr)  s      rS   get_text_widthzFont.get_text_widthY  sB    [_`SWT""&&tT-B-B9-MN`be
 	
`s   0Ac                .   | j                   r7t        | j                   j                               t        fd|D              S t	        | j
                  t              r7t        | j
                  j                               t        fd|D              S y)z7Check whether the font is able to encode a text string.c              3  &   K   | ]  }|v  
 y wr   r\   r   r)  supported_charss     rS   r   z"Font.can_encode.<locals>.<genexpr>c       @4t.@   c              3  &   K   | ]  }|v  
 y wr   r\   r  s     rS   r   z"Font.can_encode.<locals>.<genexpr>g  r  r  F)ri   setr   r   r   rf   r   )rP   r  r  s     @rS   
can_encodezFont.can_encode_  sq    !$"4"4";";"=>O@4@@@dmmT*!$--"6"6"89O@4@@@ r]   N)
rz   r   r{   rh   rf   re   r|   ra   rV   None)r   r?   r   r?   rV   r  )r   r?   rV   r  )r   r   r|   ra   rV   r  )rf   re   ri   rh   rV   r3   )r|   ra   r@   r?   rr   r3   rV   r  )rb   ra   r@   r?   rr   r3   rV   r?   )r   r   rV   z(tuple[float, float, float, float] | None)r   r   rV   zdict[str, Any])rz   r   rV   rd   )r   r   r   r   r   r   rV   r?   )rB   r!   rV   rd   )z
/Helvetica)r0  r3   rV   rd   )rV   z'tuple[dict[str, str], dict[str, bytes]])rV   z$tuple[list[PdfObject], StreamObject]rU   )r  r    r  r   r  r   rV   r   )rN  )r  r3   rV   r7   )r  r3   rV   rs   )$rW   rX   rY   rZ   r[   r   r   ri   rj   r.   r`   rb   rp   rr   rt   staticmethodr   r   r   r   r   r   r   r   r   classmethodr   r   r,  r5  rH  rs  r  r  r  r  r\   r]   rS   rd   rd   r   sl   $ I""$)$$?M>?Hc&+N&KO^K',=U'VnV"K"JM4
?'
? 
? '
? '	
?
 

? 
? j j f f I IV &% 
   d d$ 0(00 0 
	0 0 2 2* )& )&V Z
'Z
 
Z
 Z
x 2"2&2  2 	2 2h _
 _
B  .4+lD.L@D!! /! '	!
 
!B
r]   rd   )A
__future__r   r[  collections.abcr   dataclassesr   r   typingr   r   r	   r
   pypdf.genericr   r   r   r   r   r   r   r   r   _cmapr   _codecsr   _codecs.adobe_glyphsr   _utilsr   	constantsr   errorsr   r   fontTools.ttLib.tables._h_e_a_dr   fontTools.ttLib.tables._p_o_s_tr   fontTools.ttLib.tables.O_S_2f_2r   _writerr    ior!   fontTools.ttLibr"   r#   r  r  r   r   r   r   r   r   r   r   r   r   ra  r.   r_   rd   r\   r]   rS   <module>r     s   "  $ ( 5 5
 
 
   6 . "   3>>>"2M #      ! $% !#$  $% !   !  $)( )( )(X $% % %
 x x xY  Ms   <C C('C(