
    KwgKL                        d Z dZddlmZmZmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dZd	 Zer	 dd
lmZmZmZmZ  eee      Zd Z G d d      Z G d de      Zy#  ddlZ ej:                  d       Y 0xY w)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)
pdfmetrics)
rtlSupportNc                     | S N text	directions     R/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/pdfgen/textobject.pyfribidiTextr      s    K    )log2visONLTRRTLr   r   c                 Z    |dv r&t        | t        j                  |t              d      S | S )Nr   Tclean)r   directionsMapgetDIR_ONr   s     r   r   r      s,    T]anTn74!2!29V!D4Pxtxxr   z.pyfribidi is not installed - RTL not supportedc                   x    e Zd ZdZd ZdZddZddZddZddZ	ddZ
dd	Zdd
ZddZd Zd Zd Zd Zd Zy)_PDFColorSetterziAbstracts the color setting operations; used in Canvas and Textobject
    asseumes we have a _code objectc                     t        |t              r=| j                  j                  |      \  }}|| j                  vr|| j                  |<   |S y r   )
isinstancer   _docaddColor_colorsUsed)selfcmyknamesnames       r   _checkSeparationz _PDFColorSetter._checkSeparation"   sL    d<(++D1JD4+++).  &K	 )r   Nc                 2    | j                  ||||f|       y)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(   cmykr/   s         r   setFillColorCMYKz _PDFColorSetter.setFillColorCMYK-   s     
		Aa!95		1r   c                 2    | j                  ||||f|       y)zset the stroke color useing negative color values
            (cyan, magenta, yellow and darkness value).
            Takes 4 arguments between 0.0 and 1.0r.   NsetStrokeColorr2   s         r   setStrokeColorCMYKz"_PDFColorSetter.setStrokeColorCMYK3   s     
		a!AYU		3r   c                 0    | j                  |||f|       y)zwSet the fill color using positive color description
           (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r.   Nr0   r(   rgbr/   s        r   setFillColorRGBz_PDFColorSetter.setFillColorRGB9   s     	1Qq'.r   c                 0    | j                  |||f|       y)zySet the stroke color using positive color description
           (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r.   Nr9   r=   s        r   setStrokeColorRGBz!_PDFColorSetter.setStrokeColorRGB>   s     	QqG%0r   c           	         | j                   r| j                  |      }t        |t              r|j                  }||j                  z  ||j
                  z  ||j                  z  ||j                  z  f\  }}}}|| _        | j                  |      }|r-| j                  j                  d|dt        |      d       nY| j                  j                  dt        ||||      z         n-t        |t              rR|j                  |j                  |j                   f}	|| _        | j                  j                  dt        |	      z         nt        |t"        t$        f      rt'        |      }
|
dk(  r/|| _        | j                  j                  dt        |      z         nv|
dk(  r/|| _        | j                  j                  dt        |      z         nBt)        d|z        t+        |      r| j-                  t/        |             nt)        d|z        || j1                  |       y	t3        |d
d	      | j1                  |j4                         y	y	)?Takes a color object, allowing colors to be referred to by name/z cs z scnz%s kz%s rg      Unknown color %rNr/   )_enforceColorSpacer$   r   densitycyanmagentayellowblack_fillColorObjr,   _codeappendr
   r   redgreenbluetuplelistlen
ValueErrorr   r1   r   setFillAlphagetattrr/   r(   aColorr/   dr3   r4   r5   r6   r*   rgbls              r   r1   z_PDFColorSetter.setFillColorC   s   "",,V4Ffi(A}a&6&--6<<XGAa!!'D((0D

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

!!&6!Q1+="=>&::v||V[[9C!'D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           	         | j                   r| j                  |      }t        |t              r|j                  }||j                  z  ||j
                  z  ||j                  z  ||j                  z  f\  }}}}|| _        | j                  |      }|r-| j                  j                  d|dt        |      d       nY| j                  j                  dt        ||||      z         n-t        |t              rR|j                  |j                  |j                   f}	|| _        | j                  j                  dt        |	      z         nt        |t"        t$        f      rt'        |      }
|
dk(  r/|| _        | j                  j                  dt        |      z         nv|
dk(  r/|| _        | j                  j                  dt        |      z         nBt)        d|z        t+        |      r| j-                  t/        |             nt)        d|z        || j1                  |       y	t3        |d
d	      | j1                  |j4                         y	y	)rE   rF   z CS z SCNz%s Kz%s RGrG   rH   rI   Nr/   )rJ   r$   r   rK   rL   rM   rN   rO   _strokeColorObjr,   rQ   rR   r
   r   rS   rT   rU   rV   rW   rX   rY   r   r:   r   setStrokeAlphar[   r/   r\   s              r   r:   z_PDFColorSetter.setStrokeColorg   s   "",,V4Ffi(A}a&6&--6<<XGAa!#)D ((0D

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

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

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

!!&6&>"9: !3f!<==6]0/&899&VWd+7- 8r   c                     |||f| _         | j                  j                  dt        |      z         || j	                  |       yy))Sets the gray level; 0.0=black, 1.0=whitez%s gN)rP   rQ   rR   r
   rZ   r(   grayr/   s      r   setFillGrayz_PDFColorSetter.setFillGray   sE    "D$/

&6$</0e$ r   c                     |||f| _         | j                  j                  dt        |      z         || j	                  |       yy)re   z%s GN)rb   rQ   rR   r
   rZ   rf   s      r   setStrokeGrayz_PDFColorSetter.setStrokeGray   sE     $dD1

&6$</0e$ r   c                     t        |t        t        f      rd|cxk  rdk  sn t        d|z         t	        | dd       |       y )Nr      zsetStrokeAlpha invalid value %r_setStrokeAlphac                      y r   r   xs    r   <lambda>z0_PDFColorSetter.setStrokeAlpha.<locals>.<lambda>       r   r$   floatintrY   r[   r(   as     r   rc   z_PDFColorSetter.setStrokeAlpha   s?    1eC[)agAg>BCC6&~6q9r   c                     t        |t        t        f      rd|cxk  rdk  sn t        d|z         t	        | dd       |       y )Nr   rl   zsetFillAlpha invalid value %r_setFillAlphac                      y r   r   ro   s    r   rq   z._PDFColorSetter.setFillAlpha.<locals>.<lambda>   rr   r   rs   rv   s     r   rZ   z_PDFColorSetter.setFillAlpha   s>    1eC[)agAg<q@AA4_^4Q7r   c                 ,     t        | dd       |       y )N_setStrokeOverprintc                      y r   r   ro   s    r   rq   z4_PDFColorSetter.setStrokeOverprint.<locals>.<lambda>   rr   r   r[   rv   s     r   setStrokeOverprintz"_PDFColorSetter.setStrokeOverprint   s    :*>:1=r   c                 ,     t        | dd       |       y )N_setFillOverprintc                      y r   r   ro   s    r   rq   z2_PDFColorSetter.setFillOverprint.<locals>.<lambda>   rr   r   r~   rv   s     r   setFillOverprintz _PDFColorSetter.setFillOverprint       8(8;r   c                 ,     t        | dd       |       y )N_setOverprintMaskc                      y r   r   ro   s    r   rq   z2_PDFColorSetter.setOverprintMask.<locals>.<lambda>   rr   r   r~   rv   s     r   setOverprintMaskz _PDFColorSetter.setOverprintMask   r   r   r   )__name__
__module____qualname____doc__r,   rJ   r7   r;   rA   rC   r1   r:   rh   rj   rc   rZ   r   r   r   r   r   r   r"   r"      sW    ' 24/
1
",H".H%%:
8
><<r   r"   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd dZd Zd Zd Zd Zd Zd Zd Zd!dZd Zd"dZd#dZd Zd Zd Zd Zd Zy)$PDFTextObjecta  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                    dg| _         || _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        t        |dd       | _        t        j                  | j                        }d| _        || _        | j                  ||       d| _        d| _        y )NBTrJ   r   )rQ   _canvas	_fontname	_fontsize_leadingr%   r'   r[   rJ   r   getFont
_curSubsetr   setTextOrigin_textRenderMode	_clipping)r(   canvasrp   r5   r   fonts         r   __init__zPDFTextObject.__init__   s    V
////--LL%%	<<33")&1Ed"K!!$..1"1a  r   c                     | j                   j                  d       | j                  r+| j                   j                  d| j                  dz  z         dj	                  | j                         S )z#pack onto one line; used internallyET%d TrrH    )rQ   rR   r   r   joinr(   s    r   getCodezPDFTextObject.getCode   sP    

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

##r   c                 
   | j                   j                  r)| j                  j                  dt	        ||      z         n(| j                  j                  dt	        ||      z         |x| _        | _        |x| _        | _        y )Nz1 0 0 1 %s Tmz1 0 0 -1 %s Tm	r   bottomuprQ   rR   r
   _x0_x_y0_y)r(   rp   r5   s      r   r   zPDFTextObject.setTextOrigin   sh    <<  JJoq!<=JJ.1=> 4747r   c                     | j                   j                  s| }| }| j                  j                  dt	        ||||||      z         |x| _        | _        |x| _        | _        y)z3Like setTextOrigin, but does rotation, scaling etc.z%s TmNr   )r(   rw   r@   r3   r^   efs          r   setTextTransformzPDFTextObject.setTextTransform   sa    ||$$AA

'F1aAq!$<<= 4747r   c                    | j                   r| j                   d   dd dk(  r| j                   d   j                         }t        |      dk(  r| j                   d= n!dj                  |dd       | j                   d<   t	        |d         }t	        |d         }||z  }||z  }| xj
                  |z  c_        | xj                  |z  c_        | j                   j                  d	t        ||       z         | xj
                  |z  c_        | xj                  |z  c_        | j
                  | _	        | j                  | _
        y)
ax  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   Nz TdrG    z%s Td)rQ   splitrX   r   rt   r   r   rR   r
   r   r   )r(   dxdyLlastDxlastDys         r   
moveCursorzPDFTextObject.moveCursor   s	    ::$**R.-u4

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

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

'F2sO34 	BB((((r   c                 (    | j                  |d       y)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)r   )r(   r   s     r   setXPoszPDFTextObject.setXPos  s     	1r   c                 2    | j                   | j                  fS )z:Returns current text position relative to the last origin.)r   r   r   s    r   	getCursorzPDFTextObject.getCursor  s    !!r   c                 2    | j                   | j                  fS )zRReturns a tuple giving the text position of the start of the
        current line.)r   r   r   s    r   getStartOfLinezPDFTextObject.getStartOfLine  s     $((##r   c                     | j                   S )z7Returns current x position relative to the last origin.)r   r   s    r   getXzPDFTextObject.getX      wwr   c                     | j                   S )z7Returns current y position relative to the last origin.)r   r   s    r   getYzPDFTextObject.getY!  r   r   c                 $   || _         || _        t        j                  | j                         }|j                  rd| _        y| j                  j                  j                  |      }| j                  j                  |dt        |      d       y)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   r   z TfN)r   r   r   r   _dynamicFontr   r   r%   getInternalFontNamerQ   rR   r
   )r(   
psfontnamesizer   pdffontnames        r   _setFontzPDFTextObject._setFont%  sk    
 $!!$..1 DO,,++??
KKJJKFGr   c           	      X   || _         || _        ||dz  }|| _        t        j                  | j                         }|j
                  rd| _        y| j                  j                  j                  |      }| j                  j                  |dt        |      dt        |      d       y)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   r    Tf  TL)r   r   r   r   r   r   r   r   r%   r   rQ   rR   r
   )r(   r   r   leadingr   r   s         r   setFontzPDFTextObject.setFont4  s    
 $?SjG!!$..1 DO,,++??
KKJJ+vd|VT[_]^r   c                 `    || _         | j                  j                  dt        |      z         y)zAdjusts inter-character spacingz%s TcN)
_charSpacerQ   rR   r
   )r(   	charSpaces     r   setCharSpacezPDFTextObject.setCharSpaceE  s%    $			7VI%66	7r   c                 `    || _         | j                  j                  dt        |      z         y)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)
_wordSpacerQ   rR   r
   )r(   	wordSpaces     r   setWordSpacezPDFTextObject.setWordSpaceJ  s'     $

'F9$556r   c                 f    d|z   | _         | j                  j                  dt        |      z         y)zStretches text out horizontallyd   z%s TzN)_horizScalerQ   rR   r
   )r(   
horizScales     r   setHorizScalezPDFTextObject.setHorizScaleQ  s+    +

'F:$667r   c                 `    || _         | j                  j                  dt        |      z         y)z*How far to move down at the end of a line.z%s TLN)r   rQ   rR   r
   )r(   r   s     r   
setLeadingzPDFTextObject.setLeadingV  s$    

'F7O34r   c                     |dv sJ d       |dz  | j                   k7  r|dz  }|dz  | _         | j                  |k7  r&|| _        | j                  j                  d|z         yy)a  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   rl      rG   rH            z!mode must be in (0,1,2,3,4,5,6,7)rH   r   N)r   r   rQ   rR   )r(   modes     r   setTextRenderModezPDFTextObject.setTextRenderMode[  sn     ((M*MM(1Ht~~%AID!AXDN%#'D JJgn- &r   c                     || _         | j                  |z
  | _        | j                  j                  dt	        |      z         y)z=Move text baseline up or down to allow superscript/subscriptsz%s TsN)_riser   rQ   rR   r
   )r(   rises     r   setRisezPDFTextObject.setRiser  s3    
''D.

'F4L01r   c                    t         r>| j                  dv r0t        |t        j                  | j                  t              d      }| j
                  }t        j                  | j                        }g }|j                  r|j                  ||j                        D ]  \  }}|| j                  k7  rc|j                  ||j                        }|j                  |dt        | j                         dt        | j"                        d       || _        |j                  d|j%                  |      z          n|j&                  r|j                  |j                  j)                  |j*                        dt        | j                         dt        | j"                        d       |j                  d|j-                  |      z         n@|}t/        |      r	 |j1                  d      }t        j8                  ||g|j:                  z         D ]  \  }}||k7  re|j                  |j                  j)                  |j*                        dt        | j                         dt        | j"                        d       |}|j                  d|j%                  |      z          ||k7  rc|j                  |j                  j)                  | j                        dt        | j                         dt        | j"                        d       dj=                  |      S # t2        $ ra}	|	j4                  d	d
 \  }
}t3        |	j4                  dd
 |	j4                  d
   d|t7        |
dz
  d      |
 d||
| d|||dz    fz    d}	~	ww xY w)z%Generates PDF text output operator(s)r   Tr   r   r   r   z(%s) Tjutf8r   rH   N

   r   z-->z<--)r   r   r   r   r    r   r   r   r   r   splitStringr%   r   getSubsetInternalNamerR   r
   r   r   _escape
_multiByter   fontNameformatForPdfr   decodeUnicodeDecodeErrorargsmax
unicode2T1substitutionFontsr   )r(   r   canvr   Rsubsettr   fcr   ijr   s                r   _formatTextzPDFTextObject._formatTextx  s-   t~~64!2!24>>&!IPTUD||!!$..1!--dDII> 6	4??*"&"<"<VTYY"OKHHfT^^>TV\]a]j]jVklm&,DOT\\!_456 __HH		--dmm<t~~&t}}% 
 HHY!2!24!889 Bt}K;;v.D
 #--dD6$:P:P3PQ 61b5HH1N1Nqzz1Z\bcgcqcq\rtz{  |I  |I  uJ  K  LBT\\!_45	6
 RxTYY-J-J4>>-Z\bcgcqcq\rtz{  |I  |I  uJ  K  Lxx{ * K&&1+CAa,qvvbqzQRQWQWXYQZ[_`cdefhdhij`klm[nostuvwoxy}~  AB  CE  AE  zF  <G  ;I  0I  K  KKs   L 	N'ANNc                 p    | j                   j                  | j                  |      |xr dxs d       y)z3prints string at current point, ignores text cursorz T*r   N)rQ   rR   r  )r(   r   TStars      r   _textOutzPDFTextObject._textOut  s1    

D$4$4T$:U_u=RPR=RTUr   c                     | j                   | j                  j                  || j                  | j                        z   | _         | j
                  j                  | j                  |             y)z9prints string at current point, text cursor moves across.N)r   r   stringWidthr   r   rQ   rR   r  r(   r   s     r   textOutzPDFTextObject.textOut  sJ    ''DLL44T4>>4>>ZZ

$**401r   c                 H   | j                   | _        | j                  j                  r| j                  | j
                  z
  | _        n| j                  | j
                  z   | _        | j                  | _        | j                  j                  d| j                  |      z         y)zyprints string at current point, text cursor moves down.
        Can work with no argument to simply move the cursor down.z%s T*N)
r   r   r   r   r   r   r   rQ   rR   r  r
  s     r   textLinezPDFTextObject.textLine  su     ((<<  gg-DGgg-DG 77 	

'D$4$4T$::;r   c                 4   t        |      rKt        |      j                         j                  d      }|dk(  rC|D cg c]  }|j                          }}n%t	        |t
        t        f      r|}nddk(  sJ d       D ]  }| j                  |        yc c}w )a  prints 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   rl   r   z4argument to textlines must be string,, list or tupleN)r   r	   stripr   r$   rV   rW   r  )r(   stufftrimlinesslines         r   	textLineszPDFTextObject.textLines  s     <e$**,2259EQw,12q22uTl+Ea4OOO4  	 DMM$	  3s   Bc                 "    | j                   dgk7  S )z=PDFTextObject is true if it has something done after the initr   )rQ   r   s    r   __nonzero__zPDFTextObject.__nonzero__  s    zzdV##r   c                     | j                   j                  j                  d       | j                   j                  j	                  | d|       y )Ntransparencyca)r   r%   ensureMinPdfVersion
_extgstatesetr(   vs     r   ry   zPDFTextObject._setFillAlpha  s6    --n=##Da0r   c                 R    | j                   j                  j                  | d|       y )NOPr   r  r  r  s     r   r|   z!PDFTextObject._setStrokeOverprint      ##Da0r   c                 R    | j                   j                  j                  | d|       y )Nopr"  r  s     r   r   zPDFTextObject._setFillOverprint  r#  r   c                 b    | j                   j                  j                  | d|xr dxs d       y )NOPMrl   r   r"  r  s     r   r   zPDFTextObject._setOverprintMask  s&    ##DqwQ|!<r   )r   r   Nr   )r   )r   )rl   ) r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  ry   r|   r   r   r   r   r   r   r      s    E $&P"$
H_"8
78
5
..2)VV2
<" ($111=r   r   ) __version__r   reportlab.lib.colorsr   r   r   r   reportlab.lib.utilsr   r   r	   reportlab.lib.rl_accelr
   reportlab.pdfbaser   reportlab.rl_configr   r   r   
pyfribidi2r   r    r   DIR_LTRr   DIR_RTLdictr   warningswarnr"   r   r   r   r   <module>r4     s    	 I H 9 9 ) ( *
HTTW5	yK< K<Zt=O t=cHFGs   A$ $A>