
    Q?h~                     &   S r SrSSKJrJrJrJr  SSKJrJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJrJr  SSKJr  SS	KJr   SS
Kr\R<                  r " S S\5      r S r! " S S\"5      r#S r$S r%SSKJ&r&  SSK'J(r(  \&" 5       r)S(S jr*S r+S r, " S S5      r-SS
K.r.\.R^                  " S\.R`                  5      r1C.S)S jr2S*S jr3S+S jr4Sr5 " S$ S%5      r8 " S& S'\85      r9g
!   SS
K6r6Sr7S  rS! =r!r$\r \"r#S" r%S*S# jr3\%=r2=r+=r,=r4=r*r-Sr5 NB= f),z3.3.0z
PDFTextObject is an efficient way to add text to a Canvas. Do not
instantiate directly, obtain one from the Canvas instead.

Progress Reports:
8.83, 2000-01-13, gmcm: created from pdfgen.py
    )Color	CMYKColorCMYKColorSeptoColor)isBytesisStr	asUnicode)fp_str)getFontstringWidth
unicode2T1)	ShapedStr	ShapeData	_sdGuardLshapeStr)groupby)
itemgetterNc                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )BidiStr   z6A str with indices visual __bidiV__, logical __bidiL__c                 >   > [         TU ]  X5      nX$l        X4l        U$ N)super__new__	__bidiV__	__bidiL__)clssbidiVbidiLself	__class__s        M/var/www/html/env/lib/python3.13/site-packages/reportlab/pdfgen/textobject.pyr   BidiStr.__new__   s     7?3)D"N"NK    r   r   r(   )__name__
__module____qualname____firstlineno____doc__r   __static_attributes____classcell__r"   s   @r#   r   r      s    D	 	r%   r   c                 "    [        U [        5      $ r   )
isinstancer   _s    r#   <lambda>r5      s    *Qw/r%   c                   <   ^  \ rS rSrSrSU 4S jjrU 4S jrSrU =r$ )BidiList    z7A list with indices visual __bidiV__, logical __bidiL__c                 <   > [         TU ]  U5        X l        X0l        g r   )r   __init__r   r   )r!   Lr   r    r"   s       r#   r:   BidiList.__init__"   s    GQ"N"Nr%   c                    > U R                   R                   S[        TU ]  5        SU R                   SU R
                   S3$ )N(,))r"   r)   r   __repr__r   r   )r!   r"   s    r#   rA   BidiList.__repr__&   sE    nn--.a0@0B/C1T^^DTTUVZVdVdUeefggr%   r&   r'   )	r)   r*   r+   r,   r-   r:   rA   r.   r/   r0   s   @r#   r7   r7       s    E	#	h 	hr%   r7   c                 "    [        U [        5      $ r   )r2   r7   r3   s    r#   r5   r5   (   s    :a1r%   c                 T    U(       a  UR                  5       nUS;   a
  [        XSS9$ U $ )NLTRRTLT)clean)upperlog2vis)text	directions     r#   bidiTextrM   )   s*    )//"3i6?=6PwtT2ZVZZr%   )
KlassStore)deepcopyc                 V   [        U [        5      (       a  U $ [        U 5      [        L a  [        nOsU R                  R
                  nSU 3nU[        ;  aE  [        [        XPR                  [        S9n[        SU S3U5        [        R                  XVU   5        [        U   nU" XUS9$ )NBidiIndexed)r   	klassNameklassrO   class z(klass,BidiStr):
	def __new__(cls,s,bidiV=-1,bidiL=-1):
		self = super(cls,cls).__new__(cls,s)
		if hasattr(s,'__dict__'): self.__dict__=deepcopy(s.__dict__)
		self.__bidiV__ = bidiV
		self.__bidiL__ = bidiL
		return self
)r   r    )r2   r   typestrr"   r)   _bidiKSdictrO   execadd)r   r   r    rS   
sklassNamerR   NSs          r#   innerBidiStrWrapr]   /   s    a  (7c>E--J%j\2I')++W_`F9+ .0 0  Im4I&EQ//r%   c                 p    [        U[        5      (       d  U $ [        XR                  UR                  5      $ r   )r2   r   r]   r   r   )r   origs     r#   bidiStrWrapr`   C   s(    $w''..@@r%   c                    [        U[        [        45      (       a  [        U [        5      (       a  U $ [        U 5      [        L a  [        nOsU R
                  R                  nSU 3nU[        ;  aE  [        [        X@R
                  [        S9n[        SU S3U5        [        R                  XEU   5        [        U   nU" XR                  UR                  5      $ )NrQ   )r7   rR   rS   rO   rT   z(klass,BidiList):
	def __init__(self,L,bidiV=-1,bidiL=-1):
		klass.__init__(self,L)
		if hasattr(L,'__dict__'): self.__dict__=deepcopy(L.__dict__)
		self.__bidiV__ = bidiV
		self.__bidiL__ = bidiL
)r2   r7   	BidiIndexrU   listr"   r)   rW   rX   rO   rY   rZ   r   r   )r;   r_   rS   
lklassNamerR   r\   s         r#   bidiListWrapre   F   s    $344
1X8N8NWXPX7d?E--J%j\2I'IKKYabF9+ .; ;  Im4I&EQ~~dnn55r%   c                       \ rS rSrSS jrSrg)rb   Z   c                     Xl         X l        g r   )r   r   )r!   r   r    s      r#   r:   BidiIndex.__init__[   s    "N"Nr%   r&   Nr'   )r)   r*   r+   r,   r:   r.    r%   r#   rb   rb   Z   s    	#r%   rb   z[^ ]+TFc           	         U(       a  UR                  5       nUS;  a  U $ [        U [        [        45      (       d  [	        S5      eSR                  U 5      n/ n[        XAX%S9n0 n[        [        R                  U5      5       HB  u  pU	R                  S5      U4n
U	R                  5       u  p[        X5       H	  nXX]   '   M     MD     / R                  n[        [        R                  U5      5       HL  u  p[        U	R                  5       6  H-  nX;   d  M
  X}   u  nnU" U(       a  UO[        UX5      5          MJ     MN     UR                  $ )zntakes words (list of strings) returns bidi associated lists
if wx is True then the V2L index only is returned
rE   z@bidiWordList argument words should be a list or tuple of strings base_directionrH   positions_V_to_Lr   )rI   r2   rc   tuple
ValueErrorjoinrJ   	enumeratewordpatfinditergroupspanrangeappendr   __self__)wordsrL   rH   wxrawV2LbidiVMAPimtstartendjreswr   s                    r#   bidiWordListr   a   s"    )//"3iM)%<%e--_``hhuosEXg..t45DAQAJE5% SV & 6 iig..s34DAAFFH%97DAqRWQq^4	 &  5 ||r%   c           	         [        U 5      n U(       a  [        U5      nUR                  (       d  SnU(       a  UR                  5       nUS;   GaG  U(       Ga4  U R	                  5       n[        U 5      [        U5      -
  nUR                  5       n [        U5      [        U 5      -
  n	[        R                  U 5       V
s/ s H  o[        U
R                  5       6    PM     nn
[        XSS9nU Vs/ s H  n[        X   X45      PM     nn[        U5      S:  a  US   US   :  a  Xp[        US-  X4SS	9n U H8  n[        US
5      (       d  [        XsUSS	9nX~S   La  U [        SX4SS	9-  n X-  n M:     U	(       a  U [        U	S-  X45      -  n O[        XUS9n OU(       a  [        XU5      n [        U [         5      (       a"  [#        S U R$                   5       5      U-  S-  O['        XU5      nX4$ s  sn
f s  snf )zIreturn shaped/bidi text and width; assumes text is aways in logical orderFrG   rF   T)rL   r|      r   r(   rl   )force__shapeData__)rn   rH   c              3   8   #    U  H  oR                   v   M     g 7fr   )	x_advance).0r4   s     r#   	<genexpr>!bidiShapedText.<locals>.<genexpr>   s     >+=akk+=s     )r	   pdfmetrics_getFontshapablerI   lstriplenrstriprt   ru   slicerw   r   r   hasattrrJ   r2   r   sumr   pdfmetrics_stringWidth)rK   rL   rH   fontNamefontSizeshapingfontr   bLbRr   LWVXr   SWwidths                   r#   bidiShapedTextr      s   %h/D==E')//"3i%KKMYQ'xxzVc$i'6=6F6Ft6LM6L5!&&(+,6LM!"DAACDAhruX7Dr719Ar"v3xEA"1_558Ax^b;cq1~txHUY/Z'ZtID  HRVH>>Dt5I9Q[\`ajQkQk>4+=+=>?HM/I 	{' NDs   <"G/.G4c           	        ^^ US;  a  U $ Sn/ R                   n/ R                   m[        U SS  5       H8  u  nu  p[        US5      (       a
  U" U5        M#  U	 H  n
T" U5        XZ-  nM     M:     [        U5      S::  a  U $ TR                  m/ m[        XQUTS9n[        UU4S j[        U5       5       [        S5      S9 VVs/ s H(  u  pU SU-      S   SR                  S	 U 5       5      4PM*     nnn[        S
 U 5       5      /U-   nUR                  nU(       a  TS   TS   :  aP  [        U5       H@  nXS-      nUR                  [        U 5      U-
  U5        US==   [        USS5      -  ss'   MB     OO[        [        U5      5       H7  nXS-      nUR                  US-   U5        US==   [        USS5      -  ss'   M9     U R                  U5      n[        U[!        X#5      5      $ s  snnf )Nr    r   cbDefnrm   c              3   <   >#    U  H  u  pTTU      U4v   M     g 7fr   rj   )r   r   vr~   fLs      r#   r   bidiFragWord.<locals>.<genexpr>   s'     Lwgv`c`abQTUVQWjYZ^gvs   r   )keyc              3   *   #    U  H	  oS    v   M     g7f)r   Nrj   )r   kss     r#   r   r      s     "51Ra51s   c              3   f   #    U  H'  u  p[        X!R                  UR                  5      v   M)     g 7fr   )r   r   r   )r   fr   s      r#   r   r      s%     Ss*1ZZ

CCss   /1r(   r   )ry   rs   r   r   rz   rJ   r   r   rr   r   sortedinsertgetattrreversedr"   re   rb   )r   rL   r   r    rH   rK   cbdr   r   r   ur   kgfsLbfwfsr~   r   s                    @@r#   bidiFragWordr      s   M)!8iiYY"1QR5)IAvq""AAqEID 	 * t9a<[[tUUXYDKLwgpqugvLw  }G  HI  }J  EK  L  EKDA!A#q	"''"51"567  EK  LSsSTUX[[ll1vc"g~AQ3BJJs1vax+Fgb33F %
 "&+.AQ3BJJqs2&Fgb33F / kk#C5!788! Ls   /G/z/rlbidi is not installed - RTL/LTR not supportedc                       [        [        5      er   )rq   
_rlbidiMsg)argskwdss     r#   rJ   rJ      s    $$r%   c                     g)NFrj   r3   s    r#   r5   r5      s    ur%   c                      UR                  SS 5      nU(       a  UR                  5       nUS;   a  [        R                  " [        SS9  U S   $ )NrL   rE   r   )
stacklevel)poprI   warningswarnr   )r   r   rL   s      r#   rM   rM      s?    HH[.	)//"3i%MM*2Awr%   c                 0    [        X5      [        XU5      4$ r   )rM   r   )rK   rL   rH   r   r   r   s         r#   r   r      s    ')?h)WWWr%   c                       \ rS rSrSrS rSrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrS rS rS rS rS rSrg)_PDFColorSetter   zeAbstracts the color setting operations; used in Canvas and Textobject
asseumes we have a _code objectc                     [        U[        5      (       a<  U R                  R                  U5      u  p#X R                  ;  a  X0R                  U'   U$ g r   )r2   r   _docaddColor_colorsUsed)r!   cmyknamesnames       r#   _checkSeparation _PDFColorSetter._checkSeparation   sI    d<((++D1JD+++).  &K	 )r%   Nc                 (    U R                  XX44US9  g)zset the fill color useing negative color values
(cyan, magenta, yellow and darkness value).
Takes 4 arguments between 0.0 and 1.0alphaNsetFillColorr!   cr   yr   r   s         r#   setFillColorCMYK _PDFColorSetter.setFillColorCMYK   s     
		A95		1r%   c                 (    U R                  XX44US9  g)zset the stroke color useing negative color values
(cyan, magenta, yellow and darkness value).
Takes 4 arguments between 0.0 and 1.0r   NsetStrokeColorr   s         r#   setStrokeColorCMYK"_PDFColorSetter.setStrokeColorCMYK   s     
		a!YU		3r%   c                 (    U R                  XU4US9  g)zlSet the fill color using positive color description
(Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r   Nr   r!   rr   br   s        r#   setFillColorRGB_PDFColorSetter.setFillColorRGB   s     	1q'.r%   c                 (    U R                  XU4US9  g)znSet the stroke color using positive color description
(Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r   Nr   r   s        r#   setStrokeColorRGB!_PDFColorSetter.setStrokeColorRGB   s     	QG%0r%   c           	         U R                   (       a  U R                  U5      n[        U[        5      (       a  UR                  nX1R                  -  X1R
                  -  X1R                  -  X1R                  -  4u  pEpgXl        U R                  U5      nU(       a/  U R                  R                  SU< S[        U5      < S35        GOeU R                  R                  S[        XEXg5      -  5        GO;[        U[        5      (       aQ  UR                  UR                  UR                   4n	Xl        U R                  R                  S[        U	5      -  5        O[        U["        [$        45      (       a  ['        U5      n
U
S:X  a.  Xl        U R                  R                  S[        U5      -  5        O{U
S:X  a.  Xl        U R                  R                  S[        U5      -  5        OG[)        SU-  5      e[+        U5      (       a  U R-                  [/        U5      5        O[)        SU-  5      eUb  U R1                  U5        g	[3        US
S	5      b  U R1                  UR4                  5        g	g	)?Takes a color object, allowing colors to be referred to by name/z cs z scnz%s kz%s rg      Unknown color %rNr   )_enforceColorSpacer2   r   densitycyanmagentayellowblack_fillColorObjr   _codery   r
   r   redgreenbluerp   rc   r   rq   r   r   r   setFillAlphar   r   r!   aColorr   dr   r   r   r   r   rgbls              r#   r   _PDFColorSetter.setFillColor   s   "",,V4Ffi((A}a&6--<<XGA!'((0D

!!T&)"DE

!!&6!+="=>&&::v||V[[9C!'JJgs35d|,,FA!t%+"

!!'F6N":<A%+"

!!&6&>"9: !3f!<==6]]gfo./&899e$VWd+7fll+ 8r%   c           	         U R                   (       a  U R                  U5      n[        U[        5      (       a  UR                  nX1R                  -  X1R
                  -  X1R                  -  X1R                  -  4u  pEpgXl        U R                  U5      nU(       a/  U R                  R                  SU< S[        U5      < S35        GOeU R                  R                  S[        XEXg5      -  5        GO;[        U[        5      (       aQ  UR                  UR                  UR                   4n	Xl        U R                  R                  S[        U	5      -  5        O[        U["        [$        45      (       a  ['        U5      n
U
S:X  a.  Xl        U R                  R                  S[        U5      -  5        O{U
S:X  a.  Xl        U R                  R                  S[        U5      -  5        OG[)        SU-  5      e[+        U5      (       a  U R-                  [/        U5      5        O[)        SU-  5      eUb  U R1                  U5        g	[3        US
S	5      b  U R1                  UR4                  5        g	g	)r   r   z CS z SCNz%s Kz%s RGr   r   r   Nr   )r   r2   r   r   r   r   r   r   _strokeColorObjr   r   ry   r
   r   r   r   r   rp   rc   r   rq   r   r   r   setStrokeAlphar   r   r  s              r#   r   _PDFColorSetter.setStrokeColor  s   "",,V4Ffi((A}a&6--<<XGA#) ((0D

!!T&)"DE

!!&6!+="=>&&::v||V[[9C#) JJgs35d|,,FA!t'-$

!!'F6N":<A'-$

!!&6&>"9: !3f!<==6]]0/&899&VWd+7- 8r%   c                     XU4U l         U R                  R                  S[        U5      -  5        Ub  U R	                  U5        gg))Sets the gray level; 0.0=black, 1.0=whitez%s gN)r   r   ry   r
   r  r!   grayr   s      r#   setFillGray_PDFColorSetter.setFillGrayB  sC    "$/

&6$</0e$ r%   c                     XU4U l         U R                  R                  S[        U5      -  5        Ub  U R	                  U5        gg)r  z%s GN)r	  r   ry   r
   r  r  s      r#   setStrokeGray_PDFColorSetter.setStrokeGrayI  sC     $D1

&6$</0e$ r%   c                     [        U[        [        45      (       a  SUs=::  a  S::  d  O  [        SU-  5      e[	        U SS 5      " U5        g )Nr   r   zsetStrokeAlpha invalid value %r_setStrokeAlphac                     g r   rj   xs    r#   r5   0_PDFColorSetter.setStrokeAlpha.<locals>.<lambda>S  s    r%   r2   floatintrq   r   r!   as     r#   r
  _PDFColorSetter.setStrokeAlphaP  s@    1eC[))agAg>BCC&~6q9r%   c                     [        U[        [        45      (       a  SUs=::  a  S::  d  O  [        SU-  5      e[	        U SS 5      " U5        g )Nr   r   zsetFillAlpha invalid value %r_setFillAlphac                     g r   rj   r  s    r#   r5   ._PDFColorSetter.setFillAlpha.<locals>.<lambda>X  s    tr%   r  r  s     r#   r  _PDFColorSetter.setFillAlphaU  s?    1eC[))agAg<q@AA_^4Q7r%   c                 ,    [        U SS 5      " U5        g )N_setStrokeOverprintc                     g r   rj   r  s    r#   r5   4_PDFColorSetter.setStrokeOverprint.<locals>.<lambda>[  s    Tr%   r   r  s     r#   setStrokeOverprint"_PDFColorSetter.setStrokeOverprintZ  s    *>:1=r%   c                 ,    [        U SS 5      " U5        g )N_setFillOverprintc                     g r   rj   r  s    r#   r5   2_PDFColorSetter.setFillOverprint.<locals>.<lambda>^      4r%   r*  r  s     r#   setFillOverprint _PDFColorSetter.setFillOverprint]      (8;r%   c                 ,    [        U SS 5      " U5        g )N_setOverprintMaskc                     g r   rj   r  s    r#   r5   2_PDFColorSetter.setOverprintMask.<locals>.<lambda>a  r1  r%   r*  r  s     r#   setOverprintMask _PDFColorSetter.setOverprintMask`  r4  r%   )r   r	  r   )r)   r*   r+   r,   r-   r   r   r   r   r   r   r   r   r  r  r
  r  r+  r2  r9  r.   rj   r%   r#   r   r      sW    ' 24/
1
",H".H%%:
8
><<r%   r   c                       \ rS rSrSrS"S jrS rS rS rS r	S	 r
S
 rS rS rS rS rS#S jrS rS rS rS rS rS rS rS rS$S jrS rS%S jrS&S jrS rS rS rS r S  r!S!r"g)'PDFTextObjectic  a  PDF logically separates text and graphics drawing; text
operations need to be bracketed between BT (Begin text) and
ET operators. This class ensures text operations are
properly encapusalted. Ask the canvas for a text object
with beginText(x, y).  Do not construct one directly.
Do not use multiple text objects in parallel; PDF is
not multi-threaded!

It keeps track of x and y coordinates relative to its origin.Nc                    S/U l         Xl        U R                  R                  U l        U R                  R                  U l        U R                  R                  U l        U R                  R
                  U l        U R                  R                  U l        [        USS 5      U l        [        U R                  5      nSU l
        X@l        U R                  X#5        SU l        SU l        SU l        g )NBTr   r(   r   )r   _canvas	_fontname	_fontsize_leadingr   r   r   r   r   
_curSubsetrL   setTextOrigin_textRenderMode	_clipping_rise)r!   canvasr  r   rL   r   s         r#   r:   PDFTextObject.__init__n  s    V
////--LL%%	<<33")&1Ed"K!$..1"1  
r%   c                     U R                   R                  S5        U R                  (       a+  U R                   R                  SU R                  S-  -  5        SR	                  U R                   5      $ )z#pack onto one line; used internallyET%d Trr   rl   )r   ry   rF  rE  rr   r!   s    r#   getCodePDFTextObject.getCode  sP    

$>>JJg)=)=a)?@Axx

##r%   c                    U R                   R                  (       a(  U R                  R                  S[	        X5      -  5        O'U R                  R                  S[	        X5      -  5        U=U l        U l        U=U l        U l        g )Nz1 0 0 1 %s Tmz1 0 0 -1 %s Tm	r?  bottomupr   ry   r
   _x0_x_y0_y)r!   r  r   s      r#   rD  PDFTextObject.setTextOrigin  sd    <<  JJoq<=JJ.=> 4747r%   c                     U R                   R                  (       d  U* nU* nU R                  R                  S[	        XX4XV5      -  5        U=U l        U l        U=U l        U l        g)z3Like setTextOrigin, but does rotation, scaling etc.z%s TmNrQ  )r!   r  r   r   r  er   s          r#   setTextTransformPDFTextObject.setTextTransform  s[    ||$$AA

'F1q$<<= 4747r%   c                    U R                   (       a  U R                   S   R                  S5      (       a  U R                   S   R                  5       n[        U5      S:X  a  U R                   S	 O!SR	                  USS 5      U R                   S'   [        US   5      n[        US   5      nX-  nX%-  nU =R                  U-  sl        U =R                  U-  sl        U R                   R                  S	[        X* 5      -  5        U =R                  U-  sl        U =R                  U-  sl        U R                  U l
        U R                  U l        g)
aP  Starts a new line at an offset dx,dy from the start of the
current line. This does not move the cursor relative to the
current position, and it changes the current offset of every
future line drawn (i.e. if you next do a textLine() call, it
will move the cursor to a position one line lower than the
position specificied in this call.  r(   z Tdr   r   Nz%s Td)r   endswithsplitr   rr   r  rS  rU  ry   r
   rT  rV  )r!   dxdyr;   lastDxlastDys         r#   
moveCursorPDFTextObject.moveCursor  s    ::$**R.11%88

2$$&A1vqyJJrN!#3B

2 1R5\F1R5\F LBLB
 HHHHHH 	

'F2sO34 	BB((((r%   c                 (    U R                  US5        g)zStarts a new line dx away from the start of the
current line - NOT from the current point! So if
you call it in mid-sentence, watch out.r   N)rf  )r!   rb  s     r#   setXPosPDFTextObject.setXPos  s     	1r%   c                 2    U R                   U R                  4$ )z:Returns current text position relative to the last origin.)rT  rV  rM  s    r#   	getCursorPDFTextObject.getCursor  s    !!r%   c                 2    U R                   U R                  4$ )zJReturns a tuple giving the text position of the start of the
current line.)rS  rU  rM  s    r#   getStartOfLinePDFTextObject.getStartOfLine  s     $((##r%   c                     U R                   $ )z7Returns current x position relative to the last origin.)rT  rM  s    r#   getXPDFTextObject.getX      wwr%   c                     U R                   $ )z7Returns current y position relative to the last origin.)rV  rM  s    r#   getYPDFTextObject.getY  rt  r%   c                    Xl         X l        [        U R                   5      nUR                  (       a  SU l        gU R
                  R                  R                  U5      nU R                  R                  U< S[        U5      < S35        g)zSets the font and fontSize
Raises a readable exception if an illegal font
is supplied.  Font names are case-sensitive! Keeps track
of font anme and size for metrics.r(   rl   z TfN)r@  rA  r   _dynamicFontrC  r?  r   getInternalFontNamer   ry   r
   )r!   
psfontnamesizer   pdffontnames        r#   _setFontPDFTextObject._setFont  sa    
 $!$..1 DO,,++??
KKJJKFGr%   c           	      P   Xl         X l        Uc  US-  nX0l        [        U R                   5      nUR                  (       a  SU l        gU R                  R                  R                  U5      nU R                  R                  U< S[        U5      < S[        U5      < S35        g)zSets the font.  If leading not specified, defaults to 1.2 x
font size. Raises a readable exception if an illegal font
is supplied.  Font names are case-sensitive! Keeps track
of font anme and size for metrics.Ng333333?r(   rl    Tf  TL)r@  rA  rB  r   ry  rC  r?  r   rz  r   ry   r
   )r!   r{  r|  leadingr   r}  s         r#   setFontPDFTextObject.setFont  s{    
 $?SjG!$..1 DO,,++??
KKJJ+vd|VT[_]^r%   c                 ^    Xl         U R                  R                  S[        U5      -  5        g)zAdjusts inter-character spacingz%s TcN)
_charSpacer   ry   r
   )r!   	charSpaces     r#   setCharSpacePDFTextObject.setCharSpace  s#    $			7VI%66	7r%   c                 ^    Xl         U R                  R                  S[        U5      -  5        g)zAdjust inter-word spacing.  This can be used
to flush-justify text - you get the width of the
words, and add some space between them.z%s TwN)
_wordSpacer   ry   r
   )r!   	wordSpaces     r#   setWordSpacePDFTextObject.setWordSpace  s%     $

'F9$556r%   c                 f    SU-   U l         U R                  R                  S[        U5      -  5        g)zStretches text out horizontallyd   z%s TzN)_horizScaler   ry   r
   )r!   
horizScales     r#   setHorizScalePDFTextObject.setHorizScale	  s+    +

'F:$667r%   c                 ^    Xl         U R                  R                  S[        U5      -  5        g)z*How far to move down at the end of a line.z%s TLN)rB  r   ry   r
   )r!   r  s     r#   
setLeadingPDFTextObject.setLeading  s"    

'F7O34r%   c                     US;   d   S5       eUS-  U R                   :w  a  US-  nUS-  U l         U R                  U:w  a%  Xl        U R                  R                  SU-  5        gg)aB  Set the text rendering mode.

0 = Fill text
1 = Stroke text
2 = Fill then stroke
3 = Invisible
4 = Fill text and add to clipping path
5 = Stroke text and add to clipping path
6 = Fill then stroke and add to clipping path
7 = Add to clipping path

after we start clipping we mustn't change the mode back until after the ET
)r   r      r   r            z!mode must be in (0,1,2,3,4,5,6,7)r   rL  N)rF  rE  r   ry   )r!   modes     r#   setTextRenderModePDFTextObject.setTextRenderMode  sl     ((M*MM(1Ht~~%AID!AXDN%#' JJgn- &r%   c                 .   [        U5       S3nU R                  S   R                  S5      (       a.  U =R                  U R                  -  sl        X R                  S'   gXl        U =R                  U-  sl        U R                  R                  U5        g)z=Move text baseline up or down to allow superscript/subscripts Tsr(   N)r
   r   r`  rV  rG  ry   )r!   riser   s      r#   setRisePDFTextObject.setRise*  sl    d|nC ::b>""5))GGtzz!GJJrNJGGtOGJJa r%   c                   ^ U R                   n[        U R                  5      nU R                  U R                  U R
                  4n / U l        U R                  R                  nUR                  (       Ga  UR                  mSnU R                  nUR                  (       Ga  [        U[        5      (       Ga  SnU R                  nUR                  n	U R                  n
UR                  XR                   5       GHI  u  pSnXR"                  :w  aW  U(       d$  [%        U
5       S[%        U R&                  5       S3nU" UR)                  XR                   5       SU 35        Xl        U[+        U5      -   nXU [,        -   nUn[/        U5       GH  u  nnXzUR0                  -  S-  -   nUb!  UR2                  S:  d  UU R                  :w  Ga  Ub  U4S j[5        [7        SWR8                  5      S 5       5        Vs/ s H  nUS	:w  d  M  UPM     nn[+        U5      S
:X  a(  US   R;                  S5      (       a  U" US    S35        OU" SSR=                  U5       S35        U R                  U:w  a  U R?                  U5        UR2                  S:  a    GM  UU R                  :w  a  U R?                  U5        UR2                  n/ R                  nW" UR@                  * 5        U" [C        [E        UU   5      RG                  S5      5      5        U" URH                  URJ                  -
  UR@                  -   5        GM     GML     U R                  U:w  a  U R?                  U5        GO_UR                  XR                   5       H  u  pXR"                  :w  aa  U(       d.  [%        U R                  5       S[%        U R&                  5       S3nU" UR)                  XR                   5       SU 35        Xl        U" ST" U5       S35        M     GOURL                  (       ay  U" UR                   RO                  URP                  5      < S[%        U R                  5      < S[%        U R&                  5      < S35        U" SURS                  U5      -  5        GO-Un[U        U5      (       a   URW                  S5      nUR                  m[_        X/UR`                  -   5       H}  u  nnUU:w  a_  U" UR                   RO                  URP                  5      < S[%        U R                  5      < S[%        U R&                  5      < S35        UnU" ST" U5       S35        M     UU:w  a]  U" UR                   RO                  U R                  5      < S[%        U R                  5      < S[%        U R&                  5      < S35        Uu  U l        U l        U l        SR=                  UR8                  5      $ s  snf ! [X         ae  nURZ                  SS u  nn[Y        URZ                  SS URZ                  S   < SU[]        US-
  S5      U < SUUU < SUUUS-    < 34-   6 eSnAff = f! Uu  U l        U l        U l        f = f)z%Generates PDF text output operator(s)Nr   r  r  rl   r   c              3      >#    U  H<  u  pU(       a  S T" SR                  U5      5      -  O[        [        U5      5      v   M>     g7f)z(%s)r%   N)rr   r
   r   )r   r   r   canv_escapes      r#   r   ,PDFTextObject._formatText.<locals>.<genexpr>Z  sD      5|<zDA ^_vCHHUVK@X7Xdjknopkqdr6r<zs   AAc                 "    [        U [        5      $ r   )r2   bytesr  s    r#   r5   +PDFTextObject._formatText.<locals>.<lambda>[  s    fpqrsxfyr%   0r   r>   z Tj[z] TJlatin1z) Tjz(%s) Tjutf8r  r   

   z-->z<--)1r?  r   r@  r   rT  rV  ry   ry  _escaperG  r   r2   r   r   rA  splitStringr   rC  r
   rB  getSubsetInternalNamer   r   rs   y_offsetclusterr   filterrz   
startswithrr   r  x_offsetr  chrencoder   r   
_multiByterz  r   formatForPdfr   decodeUnicodeDecodeErrorr   maxpdfmetrics_unicode2T1substitutionFonts)r!   rK   canvr   stateRtmplr0sd0	shapeDatafontsizesubsetr   r  sd1SDr   sdr   Ar   fcrY  r   r   r  s                            @r#   _formatTextPDFTextObject._formatText6  s   
 ||!$..1TWWdgg.\	1DJ

!!A   "llZZ===ZY%?%?CB $ 2 2I#~~H%)%5%5dII%F	"&!??2#'*0*:);4t}}@U?VVY'Z!;!;FII!N OqQUPVWX.4O!CFl&3/);!%.r]EAr "bkk%9$%> >A&"**Q,!TZZ-#*#65|<CF4PQPZPZD[\y<z5| )G 5|q @A  CF  @F *+ 5|A )G'*1vqyQqT__S5I5I()QqTF#,()Achhqk]$*?(@'+zz2~t||B7G')zz!|U $%djj=$,,q/*,**$&II r{{lOeC!I$4$4X$>?@ bhh5CDA &3 &GV zz2~t||B'7%)%5%5dII%F	!??2#'*0*@)AfT]]F[E\\_'`!;!;FII!N OqQUPVWX.4OAk!n-T23 &G II11$--@4>>*4==) 
 )d//556 4==O#{{62
 #ll1$vd>T>T7TUDAq"udii.K.KAJJ.WY_`d`n`nYoqwx|  yF  yF  rG  H  I+a.)./	 V
 8$))*G*G*WY_`d`n`nYoqwx|  yF  yF  rG  H  I+0(DJxx

##C)Gf . OffQqk!0166"1:UVU[U[\]U^_cdghijlhlmndopq_rswxyz{s|  ~B  CD  EF  GI  EI  ~J  @K  ?M  4M  O  OO ,1(DJsL   F5Y0 <
W9
W9JY0 /W>  D	Y0 9Y0 >
Y-A Y((Y--Y0 0Zc           
         U R                   R                  nU R                  n[        U R                  5      nUR
                  nUR                  XR                  5       GH)  u  pXR                  :w  ah  UR                  XR                  5      n
[        R                  U
< S[        U R                  5      < S[        U R                  5      < S35        Xl        U(       aR  [        U S3SS9  X6R                  R                   -  U R                  -  n[        U 5        U" [        U5       S35        U(       a-  U" S[        UR#                  U5      5       S	U" U	5       S
35        U(       d  GM  U" [        U* 5       S35        GM,     g )Nrl   r  r  z -->r   )r   r  r  z (z)] TJ)r   ry   r?  r   r@  r  r  r   rC  r  r  r
   rA  rB  printface
unitsPerEmpdfScale)r!   rK   rb  rc  rZ   r  r   r  r  r   r}  s              r#   _shapedTextOutPDFTextObject._shapedTextOut  s*   jj||!$..1ll))$		:IF&"88K[&:PRXY]YfYfRghi"(Dkb)99///4>>Avbzl#&'at}}R012"[^4DEJKrvrc{m3'( ;r%   c                     U R                   R                  U R                  U5      < U=(       a    S=(       d    S< 35        g)z3prints string at current point, ignores text cursorz T*r   N)r   ry   r  )r!   rK   TStars      r#   _textOutPDFTextObject._textOut  s1    

D$4$4T$:U_u=RPR=RTUr%   c                     U R                   U R                  R                  XR                  U R                  5      -   U l         U R
                  R                  U R                  U5      5        g)z9prints string at current point, text cursor moves across.N)rT  r?  r   r@  rA  r   ry   r  r!   rK   s     r#   textOutPDFTextObject.textOut  sH    ''DLL44T>>4>>ZZ

$**401r%   c                 R   U R                   U l        U R                  R                  (       a  U R                  U R
                  -
  U l        OU R                  U R
                  -   U l        U R                  U l        U R                  R                  SU R                  U5      -  5        g)zqprints string at current point, text cursor moves down.
Can work with no argument to simply move the cursor down.z%s T*N)
rS  rT  r?  rR  rV  rB  rU  r   ry   r  r  s     r#   textLinePDFTextObject.textLine  su     ((<<  gg-DGgg-DG 77 	

'D$4$4T$::;r%   c                 T   [        U5      (       aN  [        U5      R                  5       R                  S5      nUS:X  a  U Vs/ s H  oDR                  5       PM     nnO+[	        U[
        [        45      (       a  UnOSS:X  d   S5       eW H  nU R                  U5        M     gs  snf )zprints multi-line or newlined strings, moving down.  One
comon use is to quote a multi-line block in your Python code;
since this may be indented, by default it trims whitespace
off each line and from the beginning; set trim=0 to preserve
whitespace.r  r   r   z4argument to textlines must be string,, list or tupleN)r   r	   stripra  r2   rp   rc   r  )r!   stufftrimlinesr   lines         r#   	textLinesPDFTextObject.textLines  s     <<e$**,2259EQw,12EqE2uTl++Ea4OOO4 DMM$  3s   B%c                 "    U R                   S/:g  $ )z=PDFTextObject is true if it has something done after the initr>  )r   rM  s    r#   __nonzero__PDFTextObject.__nonzero__  s    zzdV##r%   c                     U R                   R                  R                  S5        U R                   R                  R	                  U SU5        g )Ntransparencyca)r?  r   ensureMinPdfVersion
_extgstatesetr!   r   s     r#   r"  PDFTextObject._setFillAlpha  s6    --n=##Da0r%   c                 R    U R                   R                  R                  U SU5        g )NOPr?  r  r  r  s     r#   r'  !PDFTextObject._setStrokeOverprint      ##Da0r%   c                 R    U R                   R                  R                  U SU5        g )Nopr  r  s     r#   r.  PDFTextObject._setFillOverprint  r  r%   c                 v    U R                   R                  R                  U SU=(       a    S=(       d    S5        g )NOPMr   r   r  r  s     r#   r6  PDFTextObject._setOverprintMask  s&    ##DqwQ|!<r%   )r?  r  rF  r   r   rC  r   r   r@  rA  r  rB  rG  rE  r  rT  rS  rV  rU  rL   )r   r   Nr   )r   )r   )r   )#r)   r*   r+   r,   r-   r:   rN  rD  rZ  rf  ri  rl  ro  rr  rv  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r'  r.  r6  r.   rj   r%   r#   r<  r<  c  s    E"$&P"$
H_"8
78
5
..
!e$N)*V2
<" ($111=r%   r<  r'   )rG   TF)rG   T	Helveticar  F)Nr(   r(   T):__version__r-   reportlab.lib.colorsr   r   r   r   reportlab.lib.utilsr   r   r	   reportlab.lib.rl_accelr
   reportlab.pdfbase.pdfmetricsr   r   r   r   r   r  reportlab.pdfbase.ttfontsr   r   r   r   	itertoolsr   operatorr   rlbidirJ   rV   r   	isBidiStrrc   r7   
isBidiListrM   rN   copyrO   rW   r]   r`   re   rb   recompileMrt   r   r   r   
rtlSupportr   r   r   r<  rj   r%   r#   <module>r     sN   	 I H 9 9 ) S  S O O  nnG#  0Ih4 h 2J[ /lG0(A6(# # jj"$$'G
> B 9B J(K< K<ZL=O L=ABJ%,,I
GHX^ffLf;fff?OR[Js   B
C$ $*D