
    Fg#             /          S SK r S SKrS SKrS SKrS SKr SSKJr   SSKJr  \R                  r
\R                  rSrSrSrSr\R                   r\R$                  \S4   r\R*                  \   r\R*                  \   r\R*                  \   r\R*                  \R8                     r\R*                  \R<                     r         SS
\R@                  SS4S jjr!      SS\4S jjr"SSSS.S
\R@                  S\4S jjr#S
\R@                  S\4S jr$SSS S	SS S	SS SS S S.S jr%SS\RL                  \RN                  -  \RP                  -  \RR                  -  SS.S\*4S jjr+SS\RL                  \RP                  -  \RN                  -  \RR                  -  S4S\RX                  S\S\S\-S\S\S\R\                  S\*4S jjr/    SS
\R@                  S\S\S\R\                  S \-S\*4S! jjr0      SS
\R@                  S\S\S\R\                  S \-S\*4S" jjr1    SS
\R@                  S\S\S\R\                  S\4
S# jjr2 SS
\R@                  S$\S\R\                  S\4S% jjr3  SS
\R@                  S&\S'\S\S\R\                  4
S( jjr4     SS
\R@                  S\S)\S*\S+\-S,\S\R\                  4S- jjr5SS
\R@                  S.\-S/\-S\*4S0 jjr6SS
\R@                  S\*4S1 jjr7       SS
\R@                  S2\S\S\S\R\                  S \-4S3 jjr8     SS\RX                  S\S2\S\S\S\R\                  S \-S\R                   4S4 jjr9\Rt                  S\Rv                  SSS	S5.S
\R@                  S6\S7\Rx                  S\S8\-S9\-S\Rz                  4S: jjr>\Rt                  S\Rv                  SSS	S5.S\RX                  S\S6\S7\Rx                  S\S8\-S9\-S\Rz                  4S; jjr?SS\4S< jjr@S
\R@                  S\*4S= jrA SS\RX                  S>\-S\*4S? jjrBS\RX                  S@\SS4SA jrC        SS\RX                  S@\SB\SC\S\SD\SE\SF\SG\SH\SS4SI jjrDS\4SJ jrESS\RX                  SK\SS4SL jjrFS\SM\S\4SN jrG SS\RX                  SO\*SP\S\4SQ jjrH   SSR\RX                  SS\RX                  ST\SU\SV\SS4SW jjrI   SSX\RX                  SY\RX                  ST\SU\SV\SS4SZ jjrJS
\R@                  S[\S\4S\ jrKS
\R@                  S]\R                  S\R                  4S^ jrMS
\R@                  S[\SS4S_ jrNSS
\R@                  S[\S`\-SS4Sa jjrOSbSS S ScSSSSS S S SSdSS	SSS Se.S
\R@                  S$\Sf\R$                  \\*4   Sg\Sh\Si\Sj\Sk\Sl\Sm\Sn\So\Sp\Sq\Sr\Ss\St\Su\Sv\-Sw\Sx\Sy\S\4.Sz jjrPScSSbSS S SSSdSS S SS	SSS S{.S
\R@                  S|\S\R$                  \\*4   Sk\Sl\Sg\Sh\Si\Sj\Sm\Sn\St\Ss\Sr\Sq\Su\Sv\-Sw\Sx\Sy\4(S} jjrQSS SS S SS	S~.S\4S jjrR   SS\RX                  S\S\S\S\R@                  4
S jjrS       SS\RX                  S\S\R$                  \\*S4   Sk\S\S\Sg\Sh\Sm\S\4S jjrT          SS
\R@                  S&\S'\Sm\S\S\S\S\Sv\-Su\Sw\Sx\S\R                  4S jjrV           SS
\R@                  S&\S'\S\Sm\S\S\S\S\Sv\-Su\Sw\Sx\Sy\S\R                  4S jjrW           SS
\R@                  S&\S'\S\Sm\S\S\S\S\Sv\-Su\Sw\Sx\Sy\S\R                  4S jjrX            SS
\R@                  S$\Sm\Sn\S\S\S\S\Su\Sv\-Sw\Sx\Sy\S\R                  4S jjrY           SS
\R@                  S\Sm\Sn\S\S\S\S\Su\Sv\-Sw\Sx\Sy\S\R                  4S jjrZ            SS
\R@                  S\*Sm\Sn\S\S\Su\S\S\Sv\-S\-Sw\Sx\Sy\S\R                  4S jjr[           SS
\R@                  S\S\Sm\Sn\Su\S\S\S\S\Sv\-Sw\Sx\Sy\S\R                  4S jjr\           SS
\R@                  S$\R$                  \\4   Sm\Sn\S\Su\S\S\S\Sv\-Sw\Sx\Sy\S\R                  4S jjr]            GS S
\R@                  S&\S'\S\Sm\Sn\S\S\Su\S\-S\S\Sv\-Sw\Sx\Sy\S\R                  4"S jjr^            GS S
\R@                  S&\S'\S\S\Sm\Sn\S\S\Su\S\-S\S\Sv\-Sw\Sx\Sy\S\R                  4$S jjr_             GSS
\R@                  S\S|\S\Sm\Sn\S\S\-Su\S\S\-S\S\Sv\-Sw\Sx\Sy\S\R                  4$S jjr`S\*4S jraS\*4S jrbS\4S jrcS\S\d4S jreS\S\d4S jrfS\RX                  S\S\d4S jrg GSS\RX                  S\S\S@\S\S\*4S jjrh " S S5      ri GSS
\R@                  S\S\S\S\-4
S jjrj             GSS\RX                  S\-S\-S\-S\-S\-S\-S\-S\S\-S\-S\-S\-S\-SS4S jjrkS rl        GSS\R                  S$\S\R$                  \\*4   S\S\R*                  \R                     Sk\Sl\Sp\S\-S\-S\-S\d4S jjroS\RX                  S\S\4S jrpS\RX                  S\Sy\SS4S jrq    GSS\RX                  S\S\R$                  \*S4   S\S\R$                  \*S4   S\4S jjrrS\RX                  S\S\4S jrs S rtS ruS rvSS jrwS\4S jrxS\4S jryS\S\4S jrzS r{S r|S\RX                  S\-4S jr}S\RX                  S\-4S jr~S\dS\S\dS\R                  4S jrS\dS\S\R                  4S jrSS\S\*S\R                  4S jjrSS\dS\S\*S\R                  4S jjrS\dS\S\S\R                  4S jrSS\RX                  S\-S\-S\4S jjrSS.S\RX                  S\S\S\*SS4
S jjrg! \ a    S SKr GN4f = f! \ a    S SKr GN>f = f(      N   )pymupdf)mupdf
point_like	rect_likematrix_like	quad_likeTpagereturnc	                     [        U [        R                  5      (       d   eU(       d  [        S5      e[	        U5      [        R
                  L a  US:X  a  Uc  UR                  XXCS9  gU4nUS   R                  n	[        R                  " 5       n
U
R                  U R                  R                  U R                  R                  S9nU H!  nXR                  -  n	UR                  XUS9  M#     Uc  U	nU R                  UU
SUUUU	US9  Sn
Sng)a  Write the text of one or more pymupdf.TextWriter objects.

Args:
    rect: target rectangle. If None, the union of the text writers is used.
    writers: one or more pymupdf.TextWriter objects.
    overlay: put in foreground or background.
    keep_proportion: maintain aspect ratio of rectangle sides.
    rotate: arbitrary rotation angle.
    oc: the xref of an optional content object
z$need at least one pymupdf.TextWriterr   N)opacitycoloroverlaywidthheight)r   r   )r   keep_proportionrotateclipoc)
isinstancer   Page
ValueErrortype
TextWriter
write_text	text_rectDocumentnew_pagerectr   r   show_pdf_page)r
   r    writersr   r   r   r   r   r   r   textdoctpagewriters                ^/Users/admin/workspace/ai/PDFMathTranslate/myenv/lib/python3.13/site-packages/pymupdf/utils.pyr   r   -   s   * dGLL))))?@@G}***Q;4<tESjG1:D G499??499;K;KLE   %>  |	'  	 GE    c	                    SS jn	[         R                  " U 5        U R                  n
U
R                  (       a  UR                  (       d  [	        S5      eUR
                  (       d  UR                  (       a  [	        S5      eUS:  a  X2R                  -  nUS:  a  M  X#   nUR                  5       / :X  a  [	        S5      eXR                  ) -  nU(       d  UR                  OUR                  U-  nUR
                  (       d  UR                  (       a  [	        S5      eXR                  ) -  nU	" XXGS9nU
R                  U R                  5       Vs/ s H  oS   PM	     nnUU
R                  U R                  5       Vs/ s H  oS	   PM	     sn-  nUU
R                  U R                  5       Vs/ s H  oS
   PM	     sn-  nSnSnUS-   nUU;   a  US-  nU[        U5      -   nUU;   a  M  UR                   nU
R                   U:X  a  [	        S5      eU
R"                  R%                  US5      nUc%  [         R&                  " U
5      nUU
R"                  U'   UU4nU
R(                  R%                  US5      nU(       a  U R+                  5         U R-                  UUUUUUUUS9nUU
R(                  U'   U$ s  snf s  snf s  snf )a  Show page number 'pno' of PDF 'src' in rectangle 'rect'.

Args:
    rect: (rect-like) where to place the source image
    src: (document) source PDF
    pno: (int) source page number
    keep_proportion: (bool) do not change width-height-ratio
    overlay: (bool) put in foreground
    oc: (xref) make visibility dependent on this OCG / OCMD (which must be defined in the target PDF)
    rotate: (int) degrees (multiple of 90)
    clip: (rect-like) part of source page rectangle
Returns:
    xref of inserted object (for reuse)
r   c           	      V   U R                   U R                  -   S-  nUR                   UR                  -   S-  n[        R                  " SSSSUR                  * UR
                  * 5      [        R                  " U5      -  nX-  nUR                  UR                  -  nUR                  UR                  -  n	U(       a  [        X5      =pU[        R                  " X5      -  nU[        R                  " SSSSUR                  UR
                  5      -  n[        R                  " U5      $ )a  Calculate transformation matrix from source to target rect.

Notes:
    The product of four matrices in this sequence: (1) translate correct
    source corner to origin, (2) rotate, (3) scale, (4) translate to
    target's top-left corner.
Args:
    sr: source rect in PDF (!) coordinate system
    tr: target rect in PDF coordinate system
    keep: whether to keep source ratio of width to height
    rotate: rotation angle in degrees
Returns:
    Transformation matrix.
g       @r   r   )
tlbrr   Matrixxyr   r   minJM_TUPLE)
srtrkeepr   smptmpmsr1fwfhs
             r&   calc_matrix"show_pdf_page.<locals>.calc_matrixz   s      uuruu}#uuruu}# NN1aAvv69OOfXX		!YY#"k!B	W^^B##	W^^Aq!Qsuu55""r'   	is no PDF!rect must be finite and not emptyz#nothing to show - source page emptyz!clip must be finite and not empty)r3   r   r         fzFrm0z%source document must not equal targetN)r   matrixxrefr   r   graftmap_imgname)Tr   )r   CheckParentparentis_pdfr   is_emptyis_infinite
page_countget_contentstransformation_matrixr    get_page_xobjectsnumberget_page_imagesget_page_fontsstr	_graft_id	GraftmapsgetGraftmap
ShownPageswrap_contents_show_pdf_page)r
   r    srcpnor   r   r   r   r   r:   docsrc_pagetar_rectsrc_rectrB   iilstnrE   isrcgmappno_idrC   s                          r&   r!   r!   a   s   2 #D 
++C::SZZ%%}}((<==
'~~ 'xH"$>??1111H$(x}}hmmd.BHH00<==9999H/QF //<=<QaD<D=3..t{{;<;aqT;<<D3--dkk:;:aqT:;;D 	A	A3wH
d
	Qs1v: d
 ==D
}}@AA ==T4(D|$"d C[F>>fa(D  	D "CNN6KQ ><;s   J7 J<1K)filenamepixmapstreamrC   c                d   U R                   nUR                  U5      (       d  [        S5      e[        U5      [        U5      -   [        U5      -   S:w  a  [        S5      eU R	                  U R
                  X$US9nUR                  Xa5        U R                  5       S   nUR                  US5        g)a  Replace the image referred to by xref.

Replace the image by changing the object definition stored under xref. This
will leave the pages appearance instructions intact, so the new image is
being displayed with the same bbox, rotation etc.
By providing a small fully transparent image, an effect as if the image had
been deleted can be achieved.
A typical use may include replacing large images by a smaller version,
e.g. with a lower resolution or graylevel instead of colored.

Args:
    xref: the xref of the image to replace.
    filename, pixmap, stream: exactly one of these must be provided. The
        meaning being the same as in Page.insert_image.
zxref not an imager   z3Exactly one of filename/stream/pixmap must be given)rf   rh   rg       N)	rG   xref_is_imager   boolinsert_imager    	xref_copyrL   update_stream)r
   rC   rf   rg   rh   r\   new_xreflast_contents_xrefs           r&   replace_imagers      s      ++CT"",--H~V$tF|3q8NOO  		HF ! H MM(!**,R0 ($/r'   c                     [         R                  " [         R                  SS5      nUR                  5         U R	                  XS9  g)zDelete the image referred to by xef.

Actually replaces by a small transparent Pixmap using method Page.replace_image.

Args:
    xref: xref of the image to delete.
)r   r   r   r   r   )rg   N)r   PixmapcsGRAY
clear_withrs   )r
   rC   pixs      r&   delete_imagery      s5     ..q
9CNNt(r'   rj   )alpharf   r   r   maskr   r   rg   r   rh   r   rC   c                   [         R                  " U 5        U R                  nUR                  (       d  [	        S5      eUS:X  a2  [        U5      [        U5      -   [        U	5      -   S:w  a  [	        S5      eU(       aY  [        U5      [        L a  OF[        US5      (       a  [        U5      nO)[        US5      (       a  UR                  nO[	        S5      eU(       a2  [        R                  R                  U5      (       d  [        SU-  5      eU(       a3  [        U5      [        [        [         R"                  4;  a  [	        S	5      eU	(       a'  [        U	5      [         R$                  La  [	        S
5      eU(       a  U(       d  U(       d  [	        S5      eU(       a3  [        U5      [        [        [         R"                  4;  a  [	        S5      eU
S:  a  U
S-  n
U
S:  a  M  U
S:  a  U
S-  n
U
S:  a  M  U
S;  a  [	        S5      e[         R&                  " U5      nUR(                  (       d  UR*                  (       a  [	        S5      eXR,                  ) -  nUR/                  U R0                  5       Vs/ s H  nUS   PM
     nnUUR3                  U R0                  5       Vs/ s H  nUS   PM
     sn-  nUUR5                  U R0                  5       Vs/ s H  nUS   PM
     sn-  nSnSnUS-   nUU;   a  US-  nU[        U5      -   nUU;   a  M  U(       a  U R7                  5         UR8                  nU R;                  UU	UUUUUUU
UUUUUUS9u  nnUb  UUl        U$ s  snf s  snf s  snf )a  Insert an image for display in a rectangle.

Args:
    rect: (rect_like) position of image on the page.
    alpha: (int, optional) set to 0 if image has no transparency.
    filename: (str, Path, file object) image filename.
    height: (int)
    keep_proportion: (bool) keep width / height ratio (default).
    mask: (bytes, optional) image consisting of alpha values to use.
    oc: (int) xref of OCG or OCMD to declare as Optional Content.
    overlay: (bool) put in foreground (default) or background.
    pixmap: (pymupdf.Pixmap) use this as image.
    rotate: (int) rotate by 0, 90, 180 or 270 degrees.
    stream: (bytes) use this as image.
    width: (int)
    xref: (int) use this as image.

'page' and 'rect' are positional, all other parameters are keywords.

If 'xref' is given, that image is used. Other input options are ignored.
Else, exactly one of pixmap, stream or filename must be given.

'alpha=0' for non-transparent images improves performance significantly.
Affects stream and filename only.

Optimum transparent insertions are possible by using filename / stream in
conjunction with a 'mask' image of alpha values.

Returns:
    xref (int) of inserted image. Re-use as argument for multiple insertions.
r<   r   r   z4xref=0 needs exactly one of filename, pixmap, streamabsolutenamezbad filenamezNo such file: '%s'z#stream must be bytes-like / BytesIOzpixmap must be a pymupdf.Pixmapz mask requires stream or filenamez!mask must be bytes-like / BytesIOh  )r   Z        bad rotate valuer=   r>   r?   fzImgrA   )rf   rg   rh   imaskr   r   r   rC   r   r   r   r   rz   rE   digests)r   rF   rG   rH   r   rm   r   rR   hasattrr~   ospathexistsFileNotFoundErrorbytes	bytearrayioBytesIOru   RectrI   rJ   rM   rP   rO   rN   rQ   rX   InsertedImages_insert_image)r
   r    rz   rf   r   r   r{   r   r   rg   r   rh   r   rC   r\   rr   r`   ra   rb   rE   r   s                         r&   rn   rn     s   ` 
++C::%%qyd8ntF|3d6lBaGOPP>S Xz**8}HXv&&}}H^,,x00 4x ?@@	DL	2::(FF>??	DL6:;;Vx;<<T
5)RZZ"@@<==
1*# 1*
C-# C-&&+,,TAzzQ]]<==****D --dkk:;:QAaD:D;300=>=aQqT=>>D3--dkk:;:aQqT:;;DA	A3wH
d
	Qs1v: d
   G&&' ' MD'" $KC <>;s   8M&'M+M0F)r   quadsflagstextpagec                    Ub  [         R                  " U5      n[         R                  " U 5        UnUc  U R                  X$S9nO[	        US5      U :w  a  [        S5      eUR                  XS9nUc  AU$ )aZ  Search for a string on a page.

Args:
    text: string to be searched for
    clip: restrict search to this rectangle
    quads: (bool) return quads instead of rectangles
    flags: bit switches, default: join hyphened words
    textpage: a pre-created pymupdf.TextPage
Returns:
    a list of rectangles or quads, each containing one occurrence.
r   r   rG   not a textpage of this page)r   )r   r   rF   get_textpagegetattrr   search)r
   textr   r   r   r   tprlists           r&   
search_forr     s|    0 ||D!	B	zD6	X	$	&677IIdI(ELr'   r\   r[   r   r   r   r   r   c                 ,    X   R                  UUUUUS9$ )ai  Search for a string on a page.

Args:
    pno: page number
    text: string to be searched for
    clip: restrict search to this rectangle
    quads: (bool) return quads instead of rectangles
    flags: bit switches, default: join hyphened words
    textpage: reuse a prepared textpage
Returns:
    a list of rectangles or quads, each containing an occurrence.
)r   r   r   r   )r   )r\   r[   r   r   r   r   r   s          r&   search_page_forr     s-    4 8   r'   sortc                    [         R                  " U 5        Uc  [         R                  nUnUc  U R                  XS9nO[	        US5      U :w  a  [        S5      eUR                  5       nUc  AU(       a  UR                  S S9  U$ )a?  Return the text blocks on a page.

Notes:
    Lines in a block are concatenated with line breaks.
Args:
    flags: (int) control the amount of data parsed into the textpage.
Returns:
    A list of the blocks. Each item contains the containing rectangle
    coordinates, text lines, running block number and block type.
r   rG   r   c                     U S   U S   4$ N   r    )bs    r&   <lambda>!get_text_blocks.<locals>.<lambda>  s    1Q41,r'   key)r   rF   TEXTFLAGS_BLOCKSr   r   r   extractBLOCKSr   )r
   r   r   r   r   r   blockss          r&   get_text_blocksr     s    " }((	B	zD6	X	$	&677F./Mr'   c                   ^ U4S jn[         R                  " U 5        Uc  [         R                  nUnUc  U R                  XS9nO[	        US5      U :w  a  [        S5      eUR                  U5      n	Ubd  Uba  [         R                  " U5      nU	 V
s/ s H>  n
[        XSS -  5      S[        [         R                  " U
SS 5      5      -  :  d  M<  U
PM@     n	n
Uc  AU	(       a  U(       a  U" U	5      n	U	$ s  sn
f )ah  Return the text words as a list with the bbox for each word.

Args:
    page: pymupdf.Page
    clip: (rect-like) area on page to consider
    flags: (int) control the amount of data parsed into the textpage.
    textpage: (pymupdf.TextPage) either passed-in or None.
    sort: (bool) sort the words in reading sequence.
    delimiters: (str,list) characters to use as word delimiters.
    tolerance: (float) consider words to be part of the same line if
        top or bottom coordinate are not larger than this. Relevant
        only if sort=True.

Returns:
    Word tuples (x0, y0, x1, y1, "word", bno, lno, wno).
c                   > U R                  S S9  / nU S   /n[        R                  " U S   SS 5      nU SS  H  n[        R                  " USS 5      n[        UR                  UR                  -
  5      T::  d&  [        UR
                  UR
                  -
  5      T::  a  UR                  U5        X5-  nM  UR                  S S9  UR                  U5        U/nUnM     UR                  S S9  UR                  U5        U$ )	z1Sort words line-wise, forgiving small deviations.c                     U S   U S   4$ r   r   ws    r&   r   4get_text_words.<locals>.sort_words.<locals>.<lambda>  s    !A$!r'   r   r   Nr?   r   c                     U S   $ Nr   r   r   s    r&   r   r     s    !r'   c                     U S   $ r   r   r   s    r&   r   r   $  s    !r'   )r   r   r   absy0y1appendextend)wordsnwordslinelrectr   wrect	tolerances         r&   
sort_words"get_text_words.<locals>.sort_words  s    

-
.azU1Xbq\*qrALL2A'EEHHuxx'(I5uxx%((*+y8A		n	-d#s  			n	%dr'   Nr   rG   r   r?         ?)	r   rF   TEXTFLAGS_WORDSr   r   r   extractWORDSr   r   )r
   r   r   r   r   
delimitersr   r   r   r   r   s         `    r&   get_text_wordsr     s    42 }''	B	zD6	X	$	&677OOJ'E  0||D!
!DRa5L 1S3w||AbqE?R;S5S SAu 	 
 5!L
s   ;C5C5c           	         S n[        U UUUSUS9 Vs/ s H!  n[        R                  " USS 5      US   4PM#     nnU(       d  g[        R                  " 5       nU H	  u  pX-  nM     / nUS   /nUS   S   nUSS  H  u  pUS	   u  p[	        UR
                  U	R
                  -
  5      U::  d&  [	        UR                  U	R                  -
  5      U::  a  UR                  X45        X-  nMp  U" X5      nUR                  UU45        X4/nU	nM     U" X5      nUR                  UU45        UR                  S
 S9  US   S   n
US   S   R                  nUSS  HZ  u  nn[        [        [        UR
                  U-
  UR                  -  5      5      S5      nSUS-   -  nU
UU-   -  n
UR                  nM\     U
$ s  snf )ag  Extract plain text avoiding unacceptable line breaks.

Text contained in clip will be sorted in reading sequence. Some effort
is also spent to simulate layout vertically and horizontally.

Args:
    page: pymupdf.Page
    clip: (rect-like) only consider text inside
    flags: (int) text extraction flags
    textpage: pymupdf.TextPage
    tolerance: (float) consider words to be on the same line if their top
        or bottom coordinates do not differ more than this.

Notes:
    If a TextPage is provided, all text is checked for being inside clip
    with at least 50% of its bbox.
    This allows to use some "global" TextPage in conjunction with sub-
    selecting words in parts of the defined TextPage rectangle.

Returns:
    A text string in reading sequence. Left indentation of each line,
    inter-line and inter-word distances strive to reflect the layout.
c                    UR                  S S9  SnU R                  n[        R                  " 5       nU H  u  pVXE-  n[	        [        [        UR                  U-
  UR                  -  [        U5      -  5      5      X0R                  :X  d  UR                  U::  a  SOS5      nUSU-  U-   -  nUR                  nM     U$ )a  Create the string of one text line.

We are trying to simulate some horizontal layout here, too.

Args:
    clip: (pymupdf.Rect) the area from which all text is being read.
    line: (list) word tuples (rect, text) contained in the line
Returns:
    Text in this line. Generated from words in 'line'. Distance from
    predecessor is translated to multiple spaces, thus simulating
    text indentations and large horizontal distances.
c                      U S   R                   $ r   )x0r   s    r&   r   4get_sorted_text.<locals>.line_text.<locals>.<lambda>q  s    !r'   r    r   r    )
r   r   r   
EMPTY_RECTmaxintroundr   lenx1)r   r   ltextr   r   r   tdists           r&   	line_text"get_sorted_text.<locals>.line_textd  s     			'	(WW""$DAJEE144"9/#a&89:GGmqttrzD
 S4Z!^#EB  r'   T)r   r   r   r   r   Nr?   r   r   r   rj   c                      U S   R                   $ r   )r   )ls    r&   r   !get_sorted_text.<locals>.<lambda>  s    adggr'   r      
)r   r   r   r   r   r   r   r   r   r/   r   r   r   )r
   r   r   r   r   r   r   r   totalboxwrr   linesr   r   w0r_r   r   distancebreakss                       r&   get_sorted_textr   E  s   >@  


A 
ae	ad#
 
 
 !!#H  E!H:D!HQKE !"Ib uxx"%% I-UXX5E1F)1SKK
#KE h-ELL%(J<DE  h%E	LL%  
JJ&J'8A;D	q!Bab	us5%((R-5<<!?@A1EA&XX	 " Kk
s   (F>r    c                     UnUc  U R                  5       nO[        US5      U :w  a  [        S5      eUR                  U5      nUc  AU$ )NrG   r   )r   r   r   extractTextbox)r
   r    r   r   rcs        r&   get_textboxr     sU    
 
B	z 	X	$	&677			4	 BIr'   p1p2c                     [         R                  " U 5        UnUc  U R                  U[         R                  S9nO[	        US5      U :w  a  [        S5      eUR                  X5      nUc  AU$ )Nr   rG   r   )r   rF   r   TEXT_DEHYPHENATEr   r   extractSelection)r
   r   r   r   r   r   r   s          r&   get_text_selectionr     sp     	B	zD0H0HI	X	$	&677			R	$BIr'   languagedpifulltessdatac           	      T  ^ [         R                  " U 5        [         R                  " T5      mU4S jnU(       a	  U" XX!5      $ U R                  US9nU R	                  S[         R
                  S9S    GHk  nUS   S:w  a  M  [         R                  " US   5      n	U	R                  S::  d  U	R                  S::  a  MJ   [         R                  " US	   5      n
U
R                  U
R                  -
  S:w  a%  [         R                  " [         R                  U
5      n
U
R                  (       a  [         R                  " U
S
5      n
[         R                  " SU
R                  UTS95      nUR                  S
5      nSn
UR                   n[         R"                  " SUR                  -  SUR                  -  5      nXS   -  nUR%                  US
US9  UR'                  5         GMn     U$ ! [(        [*        R,                  4 a'     Sn[         R2                  " S5        U" XX!5      s s  $ f = f)a[  Create a Textpage from combined results of normal and OCR text parsing.

Args:
    flags: (int) control content becoming part of the result.
    language: (str) specify expected language(s). Default is "eng" (English).
    dpi: (int) resolution in dpi, default 72.
    full: (bool) whether to OCR the full page image, or only its images (default)
c           	        > US-  n[         R                  " XD5      nU R                  US9n[         R                  " SUR	                  SUTS95      nUR                  S5      nU R                  R                  UR                  R                  -  n	[         R                  " X5      U R                  -  n
UR                  X:S9nUR                  5         S n[        R                  " U 5      Ul        U$ )NH   )rB   pdfF)compressr   r   r   r   rB   )r   r,   
get_pixmapr   pdfocr_tobytes	load_pager    r   derotation_matrixr   closeweakrefproxyrG   )r
   r   r   r   zoommatrx   ocr_pdfocr_pageunzoomctmr$   r   s               r&   full_ocr"get_textpage_ocr.<locals>.full_ocr  s    RxnnT(ooSo)"""""%% #  $$Q'8==#6#66nnV,t/E/EE%%E%>}}T*r'   r   dictr   r   r   bboxr   imager   r   )r   r   N	transformr   zFalling back to full page OCR)r   rF   get_tessdatar   get_textTEXT_PRESERVE_IMAGESr   r   r   ru   rb   rz   csRGBr   r  r  r    r,   extend_textpager  RuntimeErrorr   FzErrorBaseg_exceptions_verboseexception_infomessage)r
   r   r   r   r   r   r  r$   blockr  rx   imgdocimgpageimgrectshrinkr  s        `          r&   get_textpage_ocrr#    s     ##H-H, 833
 E*EvW-I-IJ8T=A||E&M*::?dkkQ.	8..w0Cuusyy A%nnW]]C8yynnS!,%%&&8&LF &&q)GCllG^^A$5q7>>7IJF--C##E3#?LLN/ UB L e//0 	8 EOO;<Dx77	8s   ?D G&&<H'&H'hashesxrefsc                 j   U R                   nU(       a  UR                  (       a  SnUR                  (       d  Sn[        U SS5      nU(       a	  U(       d  U$ U(       d:  U R                  [        R
                  S9nUR                  US9nAU(       a  X@l        U(       a  UR                  (       d  U$ U R                  5       n0 nU H-  nUS   n	[        R                  " X95      n
XU
R                  '   A
M/     [        [        U5      5       H$  nXK   nUR                  US   S5      n	XS	'   XU'   M&     U$ )
zExtract image information only from a pymupdf.TextPage.

Args:
    hashes: (bool) include MD5 hash for each image.
    xrefs: (bool) try to find the xref for each image. Sets hashes to true.
TF_image_infoNr  r$  r   digestrC   )rG   rH   r   r   r   r  extractIMGINFOr'  
get_imagesru   r)  ranger   rU   )r
   r$  r%  r\   imginfor   imglistr   itemrC   rx   r`   s               r&   get_image_infor0  1  s    ++C::dM40GuW%A%AB##6#2&

ooGGAwnnS'"

	 
 3w< z{{4>1-V
	 !
 Nr'   c                    [        U5      [        [        4;   a  US   nOr[        U5      [        L a  UnO]U R	                  5        Vs/ s H  oDS   U:X  d  M  UPM     nnU/ :X  a  [        S5      e[        U5      S:w  a  [        S5      eUS   S   n[        R                  " U R                  U5      nUR                  nAU R                  SS9nU(       d5  U V	s/ s H&  oS   U:X  d  M  [        R                  " U	S	   5      PM(     n
n	U
$ U V	s/ s H@  n	U	S   U:X  d  M  [        R                  " U	S	   5      [        R                  " U	S
   5      4PMB     n
n	U
$ s  snf s  sn	f s  sn	f )ay  Return list of image positions on a page.

Args:
    name: (str, list, int) image identification. May be reference name, an
          item of the page's image list or an xref.
    transform: (bool) whether to also return the transformation matrix.
Returns:
    A list of pymupdf.Rect objects or tuples of (pymupdf.Rect, pymupdf.Matrix)
    for all image locations on the page.
r   r>   zbad image namer   zmultiple image names foundTr(  r)  r  r  )r   listtupler   r+  r   r   r   ru   rG   r)  r0  r   r,   )r
   r~   r  rC   r`   r.  rx   r)  infosimbboxess              r&   get_image_rectsr7  W  s]    DzdE]"Aw	ds	"oo/@/Q44<1/@b=-..\Q9::qz!}
..d
+CZZFt,E5:UUrlf>T*',,r&z*UU M 
(|v% HW\\"V*%w~~bo'FG 	 

 M% A V
s$   EEE*EE$ 6E$optionc                    [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  [         R                  S.
nUR                  5       nX;   d   eX;  a  SnUc  X   nUS:X  a  [        U UUUUUS9$ US:X  a  [        XX4US9$ US:X  a  U(       a  [        U UUUUS9$ [         R                  " U 5        Sn	US	;   a  U R                  nUb  [         R                  " U5      nSn	O([!        U 5      [         R"                  L a  U R                  n	Un
U
c  U R%                  X#S
9n
O['        U
S5      U :w  a  [)        S5      eUS:X  a  U
R+                  XS9nOUS:X  a  U
R-                  XS9nOUS:X  a  U
R/                  XS9nOjUS:X  a  U
R1                  XS9nOTUS:X  a  U
R3                  5       nO=US:X  a  U
R5                  5       nO&US:X  a  U
R7                  5       nOU
R9                  US9nUc  A
U$ )a  Extract text from a page or an annotation.

This is a unifying wrapper for various methods of the pymupdf.TextPage class.

Args:
    option: (str) text, words, blocks, html, dict, json, rawdict, xhtml or xml.
    clip: (rect-like) restrict output to this area.
    flags: bit switches to e.g. exclude images or decompose ligatures.
    textpage: reuse this pymupdf.TextPage and make no new one. If specified,
        'flags' and 'clip' are ignored.

Returns:
    the output of methods get_text_words / get_text_blocks or pymupdf.TextPage
    methods extractText, extractHTML, extractDICT, extractJSON, extractRAWDICT,
    extractXHTML or etractXML respectively.
    Default and misspelling choice is "text".
)
r   htmljsonrawjsonxmlxhtmlr  rawdictr   r   r   Nr   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r:  r=  r>  r   rG   r   r;  )cbr   r<  r  r?  r:  r=  r>  )r   )r   TEXTFLAGS_TEXTTEXTFLAGS_HTMLTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_XMLTEXTFLAGS_XHTMLr   r   lowerr   r   r   rF   cropboxr   r   r   r   r   r   extractJSONextractRAWJSONextractDICTextractRAWDICTextractHTML
extractXMLextractXHTMLextractText)r
   r8  r   r   r   r   r   r   formatsr@  r   r   s               r&   r  r  |  sQ   8 &&&&&&,,$$((&&,,((**G \\^F}!
 	
 5$
 	
 D
 	
 	B))||||D!	dw||	#\\	B	zD6	X	$	&677NNbN,	9	/	6	NNbN,	9	/	6	NN	5MMO	7	OONNN%Hr'   c                 &    X   R                  X#XFS9$ )zExtract a document page's text by page number.

Notes:
    Convenience function calling page.get_text().
Args:
    pno: page number
    option: (str) text, words, blocks, html, dict, json, rawdict, xhtml or xml.
Returns:
    output from page.TextPage().
)r   r   r   )r  )r\   r[   r8  r   r   r   r   s          r&   get_page_textrS    s    & 8VeGGr'   rB   r   
colorspacer   rz   annotsrB   rU  rz   rV  c                   U(       a  US-  n[         R                  " Xw5      n[        U5      [        L aZ  UR	                  5       S:X  a  [         R
                  nO5UR	                  5       S:X  a  [         R                  nO[         R                  nUR                  S;  a  [        S5      eU R                  US9nUR                  XXTS9n	SnU(       a  U	R                  X"5        U	$ )	a  Create pixmap of page.

Keyword args:
    matrix: Matrix for transformation (default: Identity).
    dpi: desired dots per inch. If given, matrix is ignored.
    colorspace: (str/Colorspace) cmyk, rgb, gray - case ignored, default csRGB.
    clip: (irect-like) restrict rendering to this area.
    alpha: (bool) whether to include alpha channel
    annots: (bool) whether to also render annotations
r   GRAYCMYK)r   r   r?   zunsupported colorspace)rV  )rB   rU  rz   r   N)r   r,   r   rR   upperrv   csCMYKr  rb   r   get_displaylistr   set_dpi)
r
   rB   r   rU  r   rz   rV  r  dlrx   s
             r&   r   r     s    ( Rx+J3' J6) J J||9$122			V		,B
--vE-
UC	B
CJr'   c          	      ,    X   R                  UX4UUUS9$ )a  Create pixmap of document page by page number.

Notes:
    Convenience function calling page.get_pixmap.
Args:
    pno: (int) page number
    matrix: pymupdf.Matrix for transformation (default: pymupdf.Identity).
    colorspace: (str,pymupdf.Colorspace) rgb, rgb, gray - case ignored, default csRGB.
    clip: (irect-like) restrict rendering to this area.
    alpha: (bool) include alpha channel
    annots: (bool) also render annotations
rT  )r   )r\   r[   rB   r   rU  r   rz   rV  s           r&   get_page_pixmapr`  '  s-    . 8   r'   c                 <   [        U [        R                  5      (       a  U R                  U5      nOA[        U [        R                  5      (       a  U R
                  nO S[        U 5      < S35       eUR                  SS.n [        U S5      (       a  U R                  US'   [        R                  " SS5      nUR                  [        R                  -  (       a  UR                   R"                  Ul        UR                  [        R$                  -  (       a  UR                   R&                  Ul        UR                  [        R(                  :X  a  UR*                  US'   U$ UR                  [        R,                  :X  aX  UR.                  US	'   XCS
'   UR                  [        R0                  -  (       a  UR2                  R"                  US'   U$ SUS'    U$ UR                  [        R4                  :X  a  UR6                  R9                  SS5      US'   UR.                  US	'   UR.                  S:  a  UR
                  US
'   U$ XCS
'   UR                  [        R0                  -  (       a  UR2                  R"                  US'   U$ SUS'    U$ UR                  [        R:                  :X  a!  UR6                  R9                  SS5      US'   U$ UR                  [        R<                  :X  aq  UR>                  RA                  5       URA                  5       -  (       a   eURC                  UR>                  5        S
U;   a  [        R                  " US
   5      US
'   U$ UR.                  US	'   U$ ! [         a#    [        S:  a  [        R                  " 5          GNf = f)Nr   zUnexpected type(ln)=.)kindrC   r    from   urir
   tor  g        \/file)"r   r   OutlinedestinationLinkdestr   rc  r   r    	Exceptionr  r  Pointr   LINK_FLAG_L_VALIDltr-   LINK_FLAG_T_VALIDr.   LINK_URIrf  	LINK_GOTOr
   LINK_FLAG_R_IS_ZOOMrb
LINK_GOTOR	file_specreplaceLINK_LAUNCH
LINK_NAMEDnamedkeysupdate)lndocumentrn  nlpnts        r&   getLinkDictr  G  s   "goo&&~~h'	B	%	%ww,)R{!,,q))Q	'B2vBvJ
 --1
CzzG---		zzG---		yyG$$$HH5	D IA 
g''	'YY6
4::333BvJ8 I5 BvJ4 I1 
g((	(^^++D#66
YY6
99q=yyBtH( I% tHzzG777!WWYY6
  I !6
 I 
g))	)^^++D#66
 I 
g((	(JJOO%	122
		$**2:}}RX.BtH I YY6
I[  1$(>(>(@s    M. .)NNc                 2   [         R                  " U 5        U R                  n/ nU(       a;  [        XR                  5      nUR                  U5        UR                  nU(       a  M;  U/ :w  a  U R                  R                  (       a  [         R                  " U 5       Vs/ s H  nUS   [         R                  :X  d  M  UPM      nn[        U5      [        U5      :X  a3  [        [        U5      5       H  nXV   S   X&   S'   XV   S   X&   S'   M     U$ s  snf )zfCreate a list of all links contained in a PDF page.

Notes:
    see PyMuPDF ducmentation for details.
r   r   rC   re  id)r   rF   
first_linkr  rG   r   nextrH   JM_get_annot_xref_list2PDF_ANNOT_LINKr   r,  )r
   r  linksr  r-   	linkxrefsr`   s          r&   	get_linksr    s     	BE
[[)RWW " {t{{)) //55  Q47111 5 	 
 y>SZ'3y>*#,<? !*a + Ls    D?Dsimplec                 
  ^ ^^ U UU4S jmT R                   (       a  [        S5      eT R                  5         T R                  nU(       d  / $ Sn/ nT" X$U5      nT R                  (       a  T(       d  T R                  U5        U$ )zCreate a table of contents.

Args:
    simple: a bool to control output. Returns a list, where each entry consists of outline level, title, page number and link destination (if simple = False). For details see PyMuPDF's documentation.
c                   > U (       Ga9  U R                   R                  (       Ga  U R                  (       a  U R                  nOSnU R                  (       dX  U R                  (       aD  U R
                  S:X  a$  TR                  U R                  5      nUS   S-   nOU R
                  S-   nOSnOSnT	(       d   [        U T5      nUR                  X#XV/5        OUR                  X#U/5        U R                  (       a  T" U R                  XS-   5      nU R                  n U (       a  U R                   R                  (       a  GM  U$ )zPRecursively follow the outline item chain and record item information in a list.r   rj   r   r   )this
m_internaltitleis_externalrf  r
   resolve_linkr  r   downr  )
olItemlistelvlr  resolver
   linkr\   recurser  s
          r&   r  get_toc.<locals>.recurse  s    ///||%%::{{b("%"2"26::">&qzA~%{{QD"63/c$56c$/0{{U!G<[[F5 ///6 r'   document closedr   )	is_closedr   init_docoutlinerH   _extend_toc_items)r\   r  r  r  r  tocr  s   ``    @r&   get_tocr    sj    @ }}*++LLN[[F	
CE
&
%C
zz&c"Jr'   idxc                 L    U R                  5       U   nU R                  U5        g)z$Delete TOC / bookmark item by index.N)get_outline_xrefs_remove_toc_item)r\   r  rC   s      r&   del_toc_itemr    s%    
   "3'Dr'   	dest_dictrc  rf  r  rg  rf   r  c
           	         U R                  5       U   n
Sn[        U5      [        L Gao  US   [        R                  :X  ao  US   nU R                  U5      nU R                  U5      R                  nUR                  S[        R                  " SS5      5      nXR                  -
  Ul
        XrS'   [        X5      nUR                  S5      (       d  [        S5      eUR                  S	5      nU(       aQ  [        [        [         U5      5      n[#        U5      S
:w  d  [%        U5      S:  d  ['        U5      S:  a  [        S5      eUR                  SS5      nUR                  SS5      nUSU-  -   nUR                  S5      nU R)                  U
USS UUUUS9$ U[        R*                  :X  a  U R-                  U5      $ Uc  Uc  gUc  U R)                  U
SUS9$ U[        R                  :X  a  Ub  U[/        SU R0                  S-   5      ;  a  [        S5      eU R                  US-
  5      nU R                  US-
  5      R                  nUc  [        R                  " SUS-
  5      nO)[        R                  " U5      nXR                  -
  Ul
        UUUUUU	S.n[        UU5      nUS:X  d  UR                  S5      (       d  [        S5      eU R)                  XSS US9$ )a  Update TOC item by index.

It allows changing the item's title and link destination.

Args:
    idx:
        (int) desired index of the TOC list, as created by get_toc.
    dest_dict:
        (dict) destination dictionary as created by get_toc(False).
        Outrules all other parameters. If None, the remaining parameters
        are used to make a dest dictionary.
    kind:
        (int) kind of link (pymupdf.LINK_GOTO, etc.). If None, then only
        the title will be updated. If pymupdf.LINK_NONE, the TOC item will
        be deleted.
    pno:
        (int) page number (1-based like in get_toc). Required if
        pymupdf.LINK_GOTO.
    uri:
        (str) the URL, required if pymupdf.LINK_URI.
    title:
        (str) the new title. No change if None.
    to:
        (point-like) destination on the target page. If omitted, (72, 36)
        will be used as target coordinates.
    filename:
        (str) destination filename, required for pymupdf.LINK_GOTOR and
        pymupdf.LINK_LAUNCH.
    name:
        (str) a destination name for pymupdf.LINK_NAMED.
    zoom:
        (float) a zoom factor for the target location (pymupdf.LINK_GOTO).
r   rc  r
   rg  r   $   z/Azbad bookmark destr   r   r   zbad color valueboldFitalicre  collapseN)actionr  r   r   r  )r  r  zbad page number)rc  rg  rf  r
   rj  r  r   )r  r   r  r   ru  	page_xrefpage_cropboxr   rU   rp  r.   
getDestStr
startswithr   r2  mapfloatr   r/   r   _update_toc_item	LINK_NONEr  r,  rK   )r\   r  r  rc  r[   rf  r  rg  rf   r  rC   r  page_heightr  r   r  r  r   r  ddicts                       r&   set_toc_itemr    s   Z   "3'DII$V 1 11F#Cc*I**3/66KtW]]2r%:;B%BD dOI1  &&011g&UE*+E5zQ#e*q.CJN !233}}VU+x/T!==,##!": $ 
 	
 w   $$||##DU#CCw   ;#U1cnnq.@%AA.//MM#'*	&&sQw/66:r;#34Br"B%BD E 	5)F|6,,T22,--ABZuEEr'   c                      U S   n[        U 5      S:  a  U S   nOSnSSSSS.nX2   S   X2   S   -  S	-  nXAR                  -  UR                  -  $ )
zUCalculate area of rectangle.
parameter is one of 'px' (default), 'in', 'cm', or 'mm'.r   r   px)r   r   )      ?      R@)gRQ@r  )gffffff9@r  )r  incmmmre  )r   r   r   )argsr    unitufs        r&   get_arear  J  sb    7D
4y1}Aw[LQA	
agaj	 Q&Azz>DKK''r'   r6   c                 4   U R                   (       d  [        S5      eU R                  (       d  U R                  (       a  [        S5      eUc  0 nO[	        U5      [
        La  [        S5      eSSSSSSS	S
SSSS.n[        UR                  5       5      n[        UR                  5       5      R                  U5      nU[        5       :w  a  SU-  n[        U5      eU R                  SS5      u  pgUS:w  a  SnO[        UR                  SS5      5      nU0 :X  a  US:X  a  gUS:X  a9  U R                  5       nU R                  US5        U R                  SSSU-  5        O*U0 :X  a$  U R                  SSS5        U R                  5         gUR!                  5        V	V
s/ s H  u  pX)   c  M  X4PM     sn
n	 HJ  u  pX+   n[#        U5      (       a  US;   a  SnO[$        R&                  " U5      nU R                  XU5        ML     U R                  5         gs  sn
n	f )zKUpdate the PDF /Info object.

Args:
    m: a dictionary like doc.metadata.
r<   document closed or encryptedNzbad metadataAuthorProducerCreatorTitleCreationDateModDateSubjectKeywordsTrapped)authorproducercreatorr  format
encryptioncreationDatemodDatesubjectkeywordstrappedzbad dict key(s): %srj   InforC   r   0 Rr   <<>>%i 0 Rnull)noner  )rH   r   r  is_encryptedr   r  setr~  
differencexref_get_keyr   rz  get_new_xrefupdate_objectxref_set_keyr  itemsrm   r   get_pdf_str)r\   r6   keymap
valid_keysdiff_setmsgr   temp	info_xrefkvr   valpdf_keys                 r&   set_metadatar  V  s    ::%%
}}((788y	a	((&F V[[]#J1668}''
3H35#h.or6*GAF{	UB/0	Bw9>A~$$&	)V,VX	%9:	
bVV,()	K	VYVaV	K+CyyC#33C%%c*CS1 L LLN
 Ls   H*Hr  c                    U(       d  gS nS nS nS nS n[        U5      [        [        4;   a  U" U SUS5      nU$ UR                  S[        R
                  5      nU[        R
                  :X  a  gUS   [        R                  :X  aH  UR                  S	S5      n	UR                  S
[        R                  " SS5      5      n
U
u  pU" XX5      nU$ US   [        R                  :X  a!  U" [        R                  " US   5      5      nU$ US   [        R                  :X  a#  [        R                  " US   5      nU" X5      nU$ US   [        R                  :X  aD  US   S:  a;  [        R                  " US   5      nU" [        R                  " US
   5      X5      nU$ US   [        R                  :X  aQ  US   S:  aH  [        R                  " US   5      nU" US   US
   R                  US
   R                  US	   UU5      nU$ g)zfCalculate the PDF action string.

Notes:
    Supports Link annotations and outline items (bookmarks).
r   c                 *    SU  S[        XU45       S3$ )Nz/A<</S/GoTo/D[z	 0 R/XYZ z]>>	_format_gar   cds       r&   r   getDestStr.<locals>.<lambda>  s    N1#Yy!PQ?S>TTW"Xr'   c           	      6    SU  S[        XU45       SU SU S3	$ )Nz/A<</S/GoToR/D[z /XYZ z]/F<</F/UF/Type/Filespec>>>>r  r  r   r  r  er  s         r&   r   r    s2    OA3fYPQVWyEYDZZabcaddghigjj|*}r'   c                     SU  SU SU S3$ )Nz/A<</S/GoToR/Dz/F<</Fr  r  r   )r  r   r  s      r&   r   r    s    >!F1#SCU!Vr'   c                     SU  SU S3$ )Nz/A<</S/Launch/F<</Fr  r  r   r  r   s     r&   r   r    s     3A3c!<NOr'   c                     SU  S3$ )Nz/A<</S/URI/URI>>r   r  s    r&   r   r    s    .2.r'   r   rc  r  rg  rf  rj  r
   )r   r   r  rU   r   r  ru  rp  rt  r  r{  rx  r-   r.   )rC   r  str_goto
str_gotor1
str_gotor2
str_launchstr_urirn  d_kindd_zoomrg  d_leftd_topfspecs                 r&   r  r    s    XH}JVJOJ.GE{sEl"a*YYvw001F"""V})))61%YYtW]]1a01e4V}(((w**5<8:V}+++##E&M2%'V}***uV}q/@##E&M2'--eDk:EIV}***uV}/A##E&M2&M$KMM$KMM&M
 r'   r  r  c           	         U R                   (       d  U R                  (       a  [        S5      eU R                  (       d  [        S5      eU(       d  [	        U R                  5       5      $ [        U5      [        [        4;  a  [        S5      e[	        U5      nU R                  nUS   n[        U5      [        [        4;  a  [        S5      eUS   S:w  a  [        S5      e[        [        US-
  5      5       H  nX   nXS-      nSUS	   s=::  a  U::  d  O  [        S
U-  5      e[        U5      [        [        4;  d  [	        U5      S;  a  [        SUS-   -  5      e[        US   5      [        Ld	  US   S:  a  [        SUS-   -  5      eUS   US   S-   :  d  M  [        SUS-   -  5      e   U R                  5       n	/ n	S/U	-   n
U R                  5       U
S'   U[	        U	5      :  a=  [        U[	        U	5      -
  5       H"  nU
R                  U R                  5       5        M$     SS0nSSSU
S   S./n[        U5       GH  nX   nUS   n[        R                   " US   5      n[#        U R                  S-
  [%        SUS	   S-
  5      5      nU R'                  U5      nU R)                  U5      R*                  n[        R,                  " SUS-
  5      nU[        R.                  S.nUS	   S:  a  [        R0                  US'   [	        U5      S:  a  [        US   5      [        [2        4;   a!  [        R,                  " SUUS   -
  5      US'   O[        US   5      [4        L a  US   R7                  5       OUnSU;  a  UUS'   OpU U   n[        R,                  " US   5      nUR8                  R*                  UR:                  -
  Ul        UUR<                  -  nUR>                  UR:                  4US'   0 nSUS'   SUS'   SUS'   SUS'   SUS'   [A        UU5      US'   US   US'   UUS'   XS-
     US'   XS-      US'   URC                  S5      US'   URC                  S S5      S	URC                  S!S5      -  -   US"'   US-   X'   XUS-
        nURC                  S#5      (       d  U(       a  X:  a  US==   S-  ss'   OUS==   S-  ss'   US   S:X  a  US-   US'   US-   US'   O US   US'   UUS      nUS-   US'   US-   US'   UR                  U5        GM     [E        U5       GH5  u  nnS$nUS   S:w  a  US%US   -  -  n UUS   -  n US   S:  a  US&U
US      -  -  n US   S:  a  US'U
US      -  -  n US   S:  a  US(U
US      -  -  n US   S:  a  US)U
US      -  -  n US   S:  a  US*U
US      -  -  n US+US   -   -  nURC                  S5      (       a0  [	        US   5      S:X  a  US,[M        [        US   5      5       S-3-  nURC                  S"S5      S:  a  US.US"   -  -  nUS:X  a  US/-  nUS0-  nU RO                  X   U5        GM8     U RQ                  5         U$ ! [F         a#    [H        S	:  a  [        RJ                  " 5          GNRf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNjf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNf = f! [F         a#    [H        S	:  a  [        RJ                  " 5          GNf = f)1a  Create new outline tree (table of contents, TOC).

Args:
    toc: (list, tuple) each entry must contain level, title, page and
        optionally top margin on the page. None or '()' remove the TOC.
    collapse: (int) collapses entries beyond this level. Zero or None
        shows all entries unfolded.
Returns:
    the number of inserted items, or the number of removed items respectively.
r  r<   z'toc' must be list or tupler   z'items must be sequences of 3 or 4 itemsr   z#hierarchy level of item 0 must be 1rj   re  z row %i: page number out of range)r   r?   z
bad row %izbad hierarchy level in row %i)countfirstlastrC   r   r  )rg  rc  rc  r   rg  r  r  r  prevr  rn  topr  rG   rC   r   r  r  r   r  z<<z	/Count %iz/First %i 0 Rz/Last %i 0 Rz/Next %i 0 Rz/Parent %i 0 Rz/Prev %i 0 Rz/Titlez/C[ ]z/F %iz/Type/Outlinesr	  ))r  r  r   rH   r   _delToCr   r2  r3  rK   r,  r   _getOLRootNumberr   r  r   r  r/   r   r  r  r   rp  ru  r  r  r  copyrH  r.   rotation_matrixr-   r  rU   	enumeratero  r  r  r  r  r  )r\   r  r  toclenrK   t0r`   t1t2	old_xrefsrC   lvltabolitemsor  r  r[   r  r  r  r  r
   pointr  rG   r  oltxts                               r&   set_tocr,    s    }}((788::%%3;;=!! Cyu%677XFJ	QBBxe}$BCC	!uz>??%
#$VQZRU(j(?!CDDHT5M)c"gV.C\QU344AKs"r!uqy<AFGGa52a519<AFGG %  I I3?D""$DGIY/1AKK((*+ 2 VF
 RT!WEFG 6]Fd##AaD)#..1$c!QqTAX&67MM#&	&&s+22mmBb 01(9(9:	Q4!8 ' 1 1Ifq6A:AaDzc5\)")--K!A$4F"G	$ ,0!:+=AaDIIK9	y(&)IdOs8D#MM)D/:E"ll11EGG;EG!D$8$88E',ww&8IdO'
'
&	&	&	y)4&	T?%'
1Wo(QK&	]]7+'
]]8Q/!immFA6N2NN'
!ea) MM*%%cn7Oq O7Oq O'?b !eF7OUF6NvAfI6&>*Dq5DLUF6Nqq z 7#2g;!;G,,C	2f:C
	'{Rbk):::	&zB~RZ(888	&zB~RZ(888
	(|b '$r(|*<<<
	&zB~RZ(888
	8bk))C 66'??s2g;/14T)E"W+$678::C66'1!7R[((C6##Ct$'3'u $x LLNMo  	#q(G,B,B,D	  	#q(G,B,B,D	  	#q(G,B,B,D	  	#q(G,B,B,D	  	#q(G,B,B,D	  	#q(G,B,B,D	  	#q(G,B,B,D	s~   Y9Z),[\	\94])^9)Z&%Z&))[[)\\	)\65\69)]&%]&))^^)__tarrZ   	from_pageto_pagestart_atc           	      
   UR                   (       d  gS n[        R                  " U 5      n[        R                  " U5      nU R                   (       a  U" U 5      n	[        R                  " U	[        R
                  " S5      5      n
[        R                  " U	[        R
                  " S5      5      n[        R                  " U5      (       d,  [        R                  " U	[        R
                  " S5      S5      nGO[        R                  " U" U5      5      n	[        R                  " U	[        R
                  " S5      5        [        R                  " U	[        R
                  " S5      S5        [        R                  " U	[        R
                  " S5      5        [        R                  " U	[        R
                  " S5      S5        [        R                  " X)5      n[        R                  " X|5      n[        R                  " U[        R
                  " S5      5      n
[        R                  " U[        R
                  " S5      5      n[        R                  " U5      n[        R                  " X~S5      n[        R                  " [        R                  " U5      [        R
                  " S5      5      n[        R                  " U[        R
                  " S5      U5        X4::  a  [!        X4S	-   5      nO[!        X4S	-
  S
5      n[!        [#        U5      5       GH@  nXU-      n[        R$                  " U5      n[        R                  " UR'                  5       [        R
                  " S5      5      n[        R                  " U5      (       d:  [        R                  " UR'                  5       [        R
                  " S5      S5      nUUU      nUR)                  5        VVVs/ s H  u  nnnU[        R*                  :X  d  M  UPM!     nnnnU HE  n[        R,                  " UU5      n[        R                  " U[        R
                  " S5      5        MG     U H  n[        R,                  " UU5      n[        R.                  " US5      n[        R0                  " U5      (       a  SnOSn[        R                  " UU5      n[        R                  " UU5      n[        R                  " U5      n[        R                  " X~S5      n [        R2                  " UU 5        [        R2                  " U
U 5        U(       d  M  [        R2                  " UU 5        M     GMC     gs  snnnf )zInsert widgets contained in copied page range into destination PDF.

Parameter values **must** equal those of method insert_pdf(). Method
insert_pdf() which must have been previously executed.
Nc                     [         R                  " U 5      n[         R                  " [         R                  " U5      S5      $ )z,Retrieve the AcroForm dictionary form a PDF.zRoot/AcroForm)r   pdf_document_from_fz_documentpdf_dict_getppdf_trailer)r\   r   s     r&   get_acroform do_widgets.<locals>.get_acroform  s0    11#6""5#4#4S#9?KKr'   FieldsCOr   r   RootAcroFormr   rj   AnnotsPzAA/CTF)is_form_pdfr   r3  pdf_dict_getr   PDF_NAMEpdf_is_arraypdf_dict_put_arraypdf_deep_copy_objpdf_dict_delpdf_graft_mapped_objectpdf_add_object
pdf_to_numpdf_new_indirectr5  pdf_dict_putr,  r   pdf_page_from_fz_pageobjannot_xrefsPDF_ANNOT_WIDGETpdf_load_objectr4  pdf_is_dictpdf_array_push)!r-  rZ   rD   r.  r/  r0  r6  tarpdfsrcpdfacro
tar_fieldstar_co
acro_graftacro_tartar_xrefacro_tar_indroot	src_ranger`   tar_pagetar_page_pdf
tar_annotsr]   rC   wtyper   w_xrefsw_objr  is_aacw_obj_graft	w_obj_tarw_obj_tar_inds!                                    r&   
do_widgetsrf    s    ??L 005F005F
C ''g.>.>x.HI
##D'*:*:4*@A!!&))--dG4D4DT4JANF &&|C'89 	4!1!1(!;<  w'7'7'A1E4!1!1$!78  w'7'7'=qA 228B
 '';'''2B2B82LM
##Hg.>.>t.DE ##H---fB!!%"3"3F";W=M=Mf=UV4!1!1*!=|L)q[1	)q["5	3y>"!|$ 228< ''(8(8(:G<L<LX<VW
!!*--11  "G$4$4X$>J
 y|$
 #+"6"6"8
"8eQ000 "8 	 
 D))&$7Eug&6&6s&;<  D))&$7E &&uf5D  &&  77%HK ,,V[AI ''	2H "226QGM   ];   ];v$$V];; = #$
s    U
 U
doc1doc2c                    S nUS:  a  SnO!X!R                   :  a  UR                   S-
  nOUnUS:  d  X1R                   :  a  UR                   S-
  nOUnUS:  a  [        S5      eUnXg::  a  SOSn	[        [        XgU	-   U	5      5      n
[        [	        U
5      5       Vs/ s H  oU-   PM	     nn/ n/ n[        [	        U
5      5       HO  nX   nX   nUR                  U5      nU R                  U5      nUR                  U5        UR                  U5        MQ     [        [	        U5      5       H  nXU      nUR                  5       n[	        U5      S:X  a  SnM-  UR                  ) nXU      n/ nU HI  nUS   [        R                  :X  a  US   U
;  a  M%  U" UXU5      nU(       d  M8  UR                  U5        MK     U/ :w  d  M  UR                  [        U5      5        M     gs  snf )	zInsert links contained in copied page range into destination PDF.

Parameter values **must** equal those of method insert_pdf(), which must
have been previously executed.
c           	         U S   U-  n[        [        U5      5      nU S   [        R                  :X  aV  [        R                  S   nUR                  U S   5      nU S   U-  nU" X   UR                  UR                  U S   U5      n	U	$ U S   [        R                  :X  a  U S   S:  a  [        R                  S   nU R                  S[        R                  " SS5      5      n
[        U
5      [        R                  La  [        R                  " SS5      n
U" U S   U
R                  U
R                  U S   U S	   U S	   U5      n	U	$ [        R                  S
   n[        R                  " U S   5      nUSS nU S	   nU" XU5      n	 U	$ U S   [        R                  :X  a%  [        R                  S   nU" U S	   U S	   U5      n	U	$ U S   [        R                  :X  a!  [        R                  S   nU" U S   U5      n	U	$ Sn	U	$ )z5Create annotation object string for a passed-in link.rd  rc  goto1r
   rg  r  r   gotor1rj  gotor2r   rj   launchrf  r   )r  r3  r   ru  
annot_skelindexr-   r.   rx  rU   rp  r   r  r{  rt  )lnkxref_dstpno_srcr  r   r    r+  r  pannotr  rg  r  s                r&   	cre_annotdo_links.<locals>.cre_annot  s    K#q"v;'+++$$W-C--F,CD	CAqssACCVdCEF C [G...6{a((2ggdGMM!Q$789GMM1!--1-CKEEEEKKK6 # ((2((T3"XKB4(  [G///$$X.CFS[$7E  [G,,,$$U+CE
D)E
  Er'   r   r   z'start_at' must be >= 0rj   Nrc  r
   )rK   r   r2  r,  r   r  r   r  rM   r   ru  _addAnnot_FromStringr3  )rg  rh  r.  r/  r0  rv  fpr   saincrrs  r`   pno_dstxref_srcrr  p_srcp_dstold_xrefrq   page_srcr  r  page_dstlink_tabr   
annot_texts                             r&   do_linksr    s    ,b 1}	oo	%__q {g0__q !|233	B1bD 5$Y-.G$S\232!Av2G3 HH3w< 

>>%(>>%(!! ! 3x=!
#""$
 u:?H---
#AyG---1V9G3K"1h=Jz
+  r>))5?;) " 4s   G'rq  c           	         U R                   nU) nUS   n[        [        XC-  5      5      nSnUS   [        R                  :X  a  US   S:  a  [        R
                  S   nUS   nU R                  R                  U5      n	UR                  S[        R                  " SS5      5      n
U R                  U   nUR                   nU) nX-  nU" XR                  UR                  UR                  SS5      U5      nGO[        R
                  S	   nU" [        R                  " US   5      U5      nGOUS   [        R                  :X  a  US   S:  a  [        R
                  S
   nUR                  S[        R                  " SS5      5      n
[        U
5      [        R                  La  [        R                  " SS5      n
U" US   U
R                  U
R                  UR                  SS5      US   US   U5      nO[        R
                  S   nU" [        R                  " US   5      US   U5      nOUS   [        R                  :X  a$  [        R
                  S   nU" US   US   U5      nOUS   [        R                   :X  a   [        R
                  S   nU" US   U5      nOKUS   [        R"                  :X  a4  [        R
                  S   nUR                  S5      nUc  US   nU" X5      nU(       d  U$ [%        U R'                  5        Vs/ s H&  nUS   [        R(                  :X  d  M  US   US   4PM(     sn5      nUR                  SS5      nU(       a  US   U4UR+                  5       ;   a  UnOESn[        R,                  R/                  5       S-   n UU-  nUUR1                  5       ;  a  OUS-  nM!  UR3                  SSU-  5      nU$ s  snf )Nrd  r   rc  r
   r   rk  rg  r  goto2rl  rj  rm  rn  rf  r}  r~   	nameddestr   re  r  rC   z-L%iz/Linkz/Link/NM(%s))rM   r  r3  r   ru  ro  rG   r  rU   rp  r-   r.   r  rx  r   r{  rt  r|  r  rL  r  r  TOOLSset_annot_stemvaluesrz  )r
   rq  r  ictmr   r    ru  r+  r[   rC   r  	dest_pagedest_ctm	dest_ictmipntlnamer-   
link_namesold_namer~   r`   stems                         r&   getLinkTextr    s    
$
$C4DFAU18_%DE
6{g'''v;!$$W-Cf+C;;((-D''$a 34CC(I 66H!	I?Dffdffcggfa.@$GE$$W-C++CI6=E	V**	*v;!$$X.C''$a 34CCy-mmAq)F"FFE $$X.C++CI6FTJE	V++	+  *CKVd3	V((	(  'CJ%	V**	*  )=$EE  #//1T1!QqTW=S=S5S!A$!1TJ wwtR HS[(+z/?/?/AA}}++-6!8D:,,..FA	  MM'>D#89EL# 	Us   O,Owidgetc                 6   [         R                  " U 5        [        USS5      nUc  [        S5      eUR                  nU R                  U5        SUR                  l        [        UR                  R                  5       5      nU H  nUR                  U	 M     U$ )z0Delete widget from page and return the next one._annotNzbad type: widget)r   rF   r   r   r  delete_annotr  rG   r2  __dict__r~  )r
   r  ru  
nextwidgetkeylistr   s         r&   delete_widgetr    s    FHd+E}+,,JeFMM6??'')*GOOC  r'   c                     [         R                  " U 5        [        X5      nUS:X  a  [        S5      eU R                  R                  US   X S9  g)z"Update a link on the current page.r   link kind not supportedrC   )r
   N)r   rF   r  r   rG   r  )r
   rq  ru  s      r&   update_linkr    sH    "E{233KKc&k5<r'   markc                     [         R                  " U 5        [        X5      nUS:X  a  [        S5      eU R	                  U45        g)z'Insert a new link for the current page.r   r  N)r   rF   r  r   rx  )r
   rq  r  ru  s       r&   insert_linkr    s=    "E{233uh'r'   helv   皙?)fontnamefontfile
set_simpleencodingfontsize
lineheightr   fill
expandtabsalignr   render_modemiter_limitborder_widthmorphr   stroke_opacityfill_opacityr   bufferr  r  r  r  r  r  r   r  r  r  r   r  r  r  r  r   r  r  r   c                    U R                  5       nUR                  UUUUUUUUU	U
UUUUUUUUUUS9nUS:  a  UR                  U5        U$ )a  Insert text into a given rectangle.

Notes:
    Creates a Shape object, uses its same-named method and commits it.
Parameters:
    rect: (rect-like) area to use for text.
    buffer: text to be inserted
    fontname: a Base-14 font, font name or '/name'
    fontfile: name of a font file
    fontsize: font size
    lineheight: overwrite the font property
    color: RGB color triple
    expandtabs: handles tabulators with string function
    align: left, center, right, justified
    rotate: 0, 90, 180, or 270 degrees
    morph: morph box with a matrix and a fixpoint
    overlay: put text in foreground or background
Returns:
    unused or deficit rectangle area (float)
)r  r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r   r   )	new_shapeinsert_textboxcommit)r
   r    r  r  r  r  r  r  r  r   r  r  r  r   r  r  r  r  r   r  r  r   imgr   s                           r&   r  r    s|    Z ..
C			!%!) 
 
B, 
Qw

7Ir'   )r  r  r  r  r  r  r   r  r  r  r  r   r  r   r  r  r   r)  c                    U R                  5       nUR                  UUUUUUUUU	U
UUUUUUUUS9nUS:  a  UR                  U5        U$ )N)r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r   r   )r  insert_textr  )r
   r)  r   r  r  r  r  r  r  r   r  r  r  r  r   r  r   r  r  r   r  r   s                         r&   r  r  D  ss    0 ..
C	!%!% 
 
B( 
Qw

7Ir'   )css	scale_lowarchiver   r   r   r   c          	      \  ^ US-  S:X  d  [        S5      eUS:  a  US-  nUS:  a  M  US:  a  US-  nUS:  a  M  SUs=::  a  S::  d  O  [        S5      eUc  Sn[        R                  " U5      nUS	;   a.  [        R                  " SSUR                  UR                  5      n
O-[        R                  " SSUR                  UR                  5      n
S
U-   n[        U[        5      (       a  [        R                  " X+US9nO-[        U[        R                  5      (       a  UnO[        S5      eUS:X  a  SOSU-  nUR                  U
SUS9mTR                  (       d  SU4$ TR                  nSTR                  -  nTR                  R                  US   -
  nUS:w  d  US:  a  SnU4S jnUR                  U5      nSUs=::  a  S:  aL  O  OIUS   nUR                  XS9nSU S3n[        R                   R#                  UUR%                  5       S5        U R'                  UUSXgU	S9  TR                  R(                  TR                  R*                  -   S-  U-  nUR(                  UR*                  -   S-  n[        R,                  " USSUUR.                  * UR0                  * 5      [        R,                  " U* 5      -  [        R,                  " SSSSUR.                  UR0                  5      -  nUS   R3                  5        H!  nUS==   U-  ss'   U R5                  U5        M#     UU4$ )a  Insert text with optional HTML tags and stylings into a rectangle.

Args:
    rect: (rect-like) rectangle into which the text should be placed.
    text: (str) text with optional HTML tags and stylings.
    css: (str) CSS styling commands.
    scale_low: (float) force-fit content by scaling it down. Must be in
        range [0, 1]. If 1, no scaling will take place. If 0, arbitrary
        down-scaling is acceptable. A value of 0.1 would mean that content
        may be scaled down by at most 90%.
    archive: Archive object pointing to locations of used fonts or images
    rotate: (int) rotate the text in the box by a multiple of 90 degrees.
    oc: (int) the xref of an OCG / OCMD (Optional Content).
    opacity: (float) set opacity of inserted content.
    overlay: (bool) put text on top of page content.
Returns:
    A tuple of floats (spare_height, scale).
    spare_height: -1 if content did not fit, else >= 0. It is the height of the
           unused (still available) rectangle stripe. Positive only if
           scale_min = 1 (no down scaling).
    scale: downscaling factor, 0 < scale <= 1. Set to 0 if spare_height = -1 (no fit).
r   r   zbad rotation angler   r   z'scale_low' must be in [0, 1]Nr   )r   r   zbody {margin:1px;})r:  user_cssr  z"'text' must be a string or a Story)	scale_min	scale_maxrj   r   c                  R   > TR                   TR                   [        R                  4$ N)r    r   Identity)r  fits    r&   rect_function%insert_htmlbox.<locals>.rect_function  s    xx7#3#333r'   CAcari  z gs
)r   r   r   re  rd  )r   r   r   r   r   r   rR   Story	fit_scale
big_enoughfilled	parameterr    r   write_with_links_set_opacityr  _insert_contentsencoder!   r*   r+   r,   r-   r.   r  r  )r
   r    r   r  r  r  r   r   r   r   	temp_rectmycssstoryr  r  scalespare_heightr  r\   r$   alp0smp1mp2r  r  r  s                             @r&   insert_htmlboxr  v  s   J B;!-..
1*# 1*
C-# C- 	Q899
{<<DLLAt{{DJJ?	LLAtzz4;;?	 !3&E $4I	D'--	(	(=>> "QA	MI
//)qI/
FC>>IZZFE88;;*Lz\A%4 
 
 
/C 	GaA!!W!9vUO&&uahhj!< 	tS!F7K 88;;$
)E
1C 77TWW
!C 	uaECEE6CEE6:
..&
!	"
..Aq!SUUCEE
2	3  A  "V # r'   r   r   c                 *    U R                  XUS9  X   $ )a   Create and return a new page object.

Args:
    pno: (int) insert before this page. Default: after last page.
    width: (float) page width in points. Default: 595 (ISO A4 width).
    height: (float) page height in points. Default 842 (ISO A4 height).
Returns:
    A pymupdf.Page object.
r   )_newPage)r\   r[   r   r   s       r&   r   r     s     LL&L18Or'   c	           	      p    U R                  XUS9n	[        U5      (       d  gU	R                  SUUUUUS9n
U
$ )zCreate a new PDF page and insert some text.

Notes:
    Function combining pymupdf.Document.new_page() and pymupdf.Page.insert_text().
    For parameter details see these methods.
)r[   r   r   r   )2   r   )r  r  r  r   )r   rm   r  )r\   r[   r   r  r   r   r  r  r   r
   r   s              r&   insert_pager  		  sP    " <<CV<<D::			 
 
B Ir'   dasheslineCaplineJoinc                     U R                  5       nUR                  [        R                  " U5      [        R                  " U5      5      nUR	                  UUUSUUU	U
UUS9
  UR                  U5        U$ )z&Draw a line from point p1 to point p2.F
r   r  r   	closePathr  r  r  r  r  r   )r  	draw_liner   rp  finishr  )r
   r   r   r   r  r   r  r  r   r  r  r  r   r  rt  s                  r&   r  r  (	  st      ..
CgmmB'r):;AJJ%!   JJwHr'   breadthc                     U R                  5       nUR                  [        R                  " U5      [        R                  " U5      US9nUR	                  UUUSUUU
UUUS9
  UR                  U	5        U$ )z/Draw a squiggly line from point p1 to point p2.r  Fr  )r  draw_squiggler   rp  r  r  r
   r   r   r  r   r  r   r  r  r   r  r  r  r   r  rt  s                   r&   r  r  K	  s{    " ..
C'--+W]]2->PAJJ%!   JJwHr'   c                     U R                  5       nUR                  [        R                  " U5      [        R                  " U5      US9nUR	                  UUUSUUU
UUUS9
  UR                  U	5        U$ )z-Draw a zigzag line from point p1 to point p2.r  Fr  )r  draw_zigzagr   rp  r  r  r  s                   r&   r  r  o	  sx    " ..
Cb)7==+<gNAJJ%!   JJwHr'   c                     U R                  5       nUR                  [        R                  " U5      US9nUR	                  UUUUUUUU
UUS9
  UR                  U	5        U$ )z7
Draw a rectangle. See Shape class method for details.
radius
r   r  r  r   r  r  r  r  r  r   )r  	draw_rectr   r   r  r  )r
   r    r   r  r  r   r  r  r  r   r  r  r   r  r  Qs                   r&   r  r  	  sm    & ..
Cgll4(8AJJ%!   JJwHr'   quadc                     U R                  5       nUR                  [        R                  " U5      5      nUR	                  UUUUUUUU
UUS9
  UR                  U	5        U$ )zDraw a quadrilateral.r  )r  	draw_quadr   Quadr  r  )r
   r  r   r  r  r   r  r  r  r   r  r  r   r  r  s                  r&   r  r  	  si      ..
Cgll4()AJJ%!   JJwHr'   pointsr  c                     U R                  5       nUR                  U5      nUR                  UUUUUUUU
UUUS9  UR                  U	5        U$ )z&Draw multiple connected line segments.r   r  r  r   r  r  r  r  r  r  r   )r  draw_polyliner  r  )r
   r  r   r  r  r   r  r  r  r   r  r  r  r   r  r  s                   r&   r  r  	  se    " ..
C&!AJJ%!   JJwHr'   centerr  c                     U R                  5       nUR                  [        R                  " U5      U5      nUR	                  UUUUUU	UUUUS9
  UR                  U
5        U$ )*Draw a circle given its center and radius.r  )r  draw_circler   rp  r  r  )r
   r  r  r   r  r  r  r   r  r  r   r  r  r   r  r  s                   r&   r  r  
  sk    " ..
Cf-v6AJJ%!   JJwHr'   c                     U R                  5       nUR                  U5      nUR                  UUUUUUUU
UUS9
  UR                  U	5        U$ )z4Draw an oval given its containing rectangle or quad.r  )r  	draw_ovalr  r  )r
   r    r   r  r  r  r   r  r  r   r  r  r   r  r  s                  r&   r  r  $
  s`      ..
CdAJJ%!   JJwHr'   p3c                    U R                  5       nUR                  [        R                  " U5      [        R                  " U5      [        R                  " U5      5      nUR	                  UUUUU
UUU	UUUS9  UR                  U5        U$ )zdDraw a special Bezier curve from p1 to p3, generating control points on lines p1 to p2 and p2 to p3.r  )r  
draw_curver   rp  r  r  )r
   r   r   r	  r   r  r  r   r  r  r  r  r   r  r  r   r  r  s                     r&   r  r  G
  s    & ..
Cw}}R('--*;W]]2=NOAJJ%!   JJwHr'   p4c                 B   U R                  5       nUR                  [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      5      nUR	                  UUUUUUU	U
UUUS9  UR                  U5        U$ )zODraw a general cubic Bezier curve from p1 to p4 using control points p2 and p3.r  )r  draw_bezierr   rp  r  r  )r
   r   r   r	  r  r   r  r  r   r  r  r  r  r   r  r  r   r  r  s                      r&   r  r  n
  s    ( ..
Cb)7==+<gmmB>OQXQ^Q^_aQbcAJJ%!   JJwHr'   beta
fullSectorc                     U R                  5       nUR                  [        R                  " U5      [        R                  " U5      X7S9nUR	                  UUUU	UUUU
UUUS9  UR                  U5        U$ )zDraw a circle sector given circle center, one arc end point and the angle of the arc.

Parameters:
    center -- center of circle
    point -- arc end point
    beta -- angle of arc (degrees)
    fullSector -- connect arc ends with center
r  r  )r  draw_sectorr   rp  r  r  )r
   r  r)  r  r   r  r  r  r  r   r  r  r  r   r  r  r   r  r  s                      r&   r  r  
  s{    6 ..
Cf-w}}U/CTaAJJ%!   JJwHr'   c                  F    [        5        V s/ s H  o S   PM	     sn $ s  sn f )zV
Returns a list of just the colour names used by this module.
:rtype: list of strings
r   )getColorInfoListr-   s    r&   getColorListr  
  s#     +,-,QaD,---s   c                  
    / SQ$ )zZ
Returns the list of colour name/value tuples used by this module.
:rtype: list of tuples
(!  )	ALICEBLUE         )ANTIQUEWHITE         )ANTIQUEWHITE1r        )ANTIQUEWHITE2         )ANTIQUEWHITE3         )ANTIQUEWHITE4      x   )
AQUAMARINE   r     )AQUAMARINE1r1  r  r2  )AQUAMARINE2v   r%     )AQUAMARINE3f   r)     )AQUAMARINE4E   r-  t   )AZUREr  r  r  )AZURE1r  r  r  )AZURE2   r%  r%  )AZURE3   r)  r)  )AZURE4r.  r-  r-  )BEIGE   rE     )BISQUEr        )BISQUE1r  rH  rI  )BISQUE2r%        )BISQUE3r)  rM     )BISQUE4r-  }   k   )BLACKr   r   r   )BLANCHEDALMONDr  r  r)  )BLUEr   r   r  )BLUE1r   r   r  )BLUE2r   r   r%  )BLUE3r   r   r)  )BLUE4r   r   r-  )
BLUEVIOLET   +      )BROWN   *   r`  )BROWN1r  @   rb  )BROWN2r%  ;   rd  )BROWN3r)  3   rf  )BROWN4r-  #   rh  )	BURLYWOOD         )
BURLYWOOD1r        )
BURLYWOOD2r%        )
BURLYWOOD3r)  r9  rQ  )
BURLYWOOD4r-  s   U   )	CADETBLUE_   rO     )
CADETBLUE1   rE  r  )
CADETBLUE2      r%  )
CADETBLUE3z   rq  r)  )
CADETBLUE4S      r-  )
CHARTREUSEr1  r  r   )CHARTREUSE1r1  r  r   )CHARTREUSE2r5  r%  r   )CHARTREUSE3r8  r)  r   )CHARTREUSE4r;  r-  r   )	CHOCOLATE   i      )
CHOCOLATE1r  r1  r  )
CHOCOLATE2r%  r5  !   )
CHOCOLATE3r)  r8     )
CHOCOLATE4r-  r;     )COFFEE   O   r   )CORALr  r1  P   )CORAL1r  r   V   )CORAL2r%  j   r  )CORAL3r)  [   r;  )CORAL4r-  >   /   )CORNFLOWERBLUEd         )CORNSILKr  r  rF  )	CORNSILK1r  r  rF  )	CORNSILK2r%     r)  )	CORNSILK3r)        )	CORNSILK4r-     r/  )CYANr   r  r  )CYAN1r   r  r  )CYAN2r   r%  r%  )CYAN3r   r)  r)  )CYAN4r   r-  r-  )DARKBLUEr   r   r-  )DARKCYANr   r-  r-  )DARKGOLDENRODrk  r  r  )DARKGOLDENROD1r        )DARKGOLDENROD2r%        )DARKGOLDENROD3r)  r     )DARKGOLDENROD4r-  e      )	DARKGREENr   r  r   )DARKGRAY   r  r  )	DARKKHAKI   rM  rR  )DARKMAGENTAr-  r   r-  )DARKOLIVEGREENrv  rR  r  )DARKOLIVEGREEN1   r  p   )DARKOLIVEGREEN2   r%  h   )DARKOLIVEGREEN3   r)  r   )DARKOLIVEGREEN4n   r-  =   )
DARKORANGEr     r   )DARKORANGE1r  r1  r   )DARKORANGE2r%  r5  r   )DARKORANGE3r)  r8  r   )DARKORANGE4r-  r;  r   )
DARKORCHID   r  r'  )DARKORCHID1   r  r  )DARKORCHID2   :   r%  )DARKORCHID3   r  r)  )DARKORCHID4r  "   r-  )DARKREDr-  r   r   )
DARKSALMON      r  )DARKSEAGREEN   r  r  )DARKSEAGREEN1rB  r  rB  )DARKSEAGREEN2r   r%  r   )DARKSEAGREEN3ro  r)  ro  )DARKSEAGREEN4r  r-  r  )DARKSLATEBLUEr   r  r-  )DARKSLATEGRAYr  r  r  )DARKTURQUOISEr         )
DARKVIOLET   r   rn  )DEEPPINKr        )	DEEPPINK1r  r  r  )	DEEPPINK2r%        )	DEEPPINK3r)     r5  )	DEEPPINK4r-  
   r  )DEEPSKYBLUEr   r  r  )DEEPSKYBLUE1r   r  r  )DEEPSKYBLUE2r   r  r%  )DEEPSKYBLUE3r   r  r)  )DEEPSKYBLUE4r   r  r-  )DIMGRAYr  r  r  )
DODGERBLUEr     r  )DODGERBLUE1r  r	  r  )DODGERBLUE2   r  r%  )DODGERBLUE3   r<  r)  )DODGERBLUE4r  N   r-  )	FIREBRICKr  r  r  )
FIREBRICK1r  0   r  )
FIREBRICK2r%  ,   r  )
FIREBRICK3r)  &   r  )
FIREBRICK4r-     r  )FLORALWHITEr  r  r  )FORESTGREENr  r-  r  )	GAINSBOROrF  rF  rF  )
GHOSTWHITEr  r  r  )GOLDr  r   r   )GOLD1r  r   r   )GOLD2r%     r   )GOLD3r)  r  r   )GOLD4r-  u   r   )	GOLDENROD   r_      )
GOLDENROD1r  rB  %   )
GOLDENROD2r%  r   r  )
GOLDENROD3r)  ro  r  )
GOLDENROD4r-  r  r  )zGREEN YELLOWr  r  r  )GREENr   r  r   )GREEN1r   r  r   )GREEN2r   r%  r   )GREEN3r   r)  r   )GREEN4r   r-  r   )GREENYELLOWr  r  r  )rX     r3  r3  )GRAY0r   r   r   )GRAY1r   r   r   )GRAY10r  r  r  )GRAY100r  r  r  )GRAY11r  r  r  )GRAY12   r:  r:  )GRAY13r  r  r  )GRAY14r  r  r  )GRAY15r  r  r  )GRAY16)   r?  r?  )GRAY17r\  r\  r\  )GRAY18.   rB  rB  )GRAY19r  r  r  )GRAY2r   r   r   )GRAY20rf  rf  rf  )GRAY216   rG  rG  )GRAY228   rI  rI  )GRAY23rd  rd  rd  )GRAY24r  r  r  )GRAY25rb  rb  rb  )GRAY26B   rN  rN  )GRAY27r;  r;  r;  )GRAY28G   rQ  rQ  )GRAY29J   rS  rS  )GRAY3r  r  r  )GRAY30M   rV  rV  )GRAY31r  r  r  )GRAY32R   rY  rY  )GRAY33T   r[  r[  )GRAY34W   r]  r]  )GRAY35Y   r_  r_  )GRAY36\   ra  ra  )GRAY37^   rc  rc  )GRAY38a   re  re  )GRAY39c   rg  rg  )GRAY4r  r  r  )GRAY40r8  r8  r8  )GRAY41r  r  r  )GRAY42rR  rR  rR  )GRAY43r  r  r  )GRAY44r  r  r  )GRAY45ru  ru  ru  )GRAY46r$  r$  r$  )GRAY47r/  r/  r/  )GRAY48r  r  r  )GRAY49rQ  rQ  rQ  )GRAY5   rt  rt  )GRAY50r1  r1  r1  )GRAY51   rw  rw  )GRAY52   ry  ry  )GRAY53rl  rl  rl  )GRAY54r[  r[  r[  )GRAY55r  r  r  )GRAY56r  r  r  )GRAY57rr  rr  rr  )GRAY58r  r  r  )GRAY59r  r  r  )GRAY6r  r  r  )GRAY60r  r  r  )GRAY61r  r  r  )GRAY62rO  rO  rO  )GRAY63   r  r  )GRAY64   r  r  )GRAY65   r  r  )GRAY66   r  r  )GRAY67   r  r  )GRAY68r  r  r  )GRAY69r+  r+  r+  )GRAY7r  r  r  )GRAY70   r  r  )GRAY71   r  r  )GRAY72rk  rk  rk  )GRAY73   r  r  )GRAY74r  r  r  )GRAY75r  r  r  )GRAY76   r  r  )GRAY77rI  rI  rI  )GRAY78   r  r  )GRAY79r!  r!  r!  )GRAY8r  r  r  )GRAY80r'  r'  r'  )GRAY81   r  r  )GRAY82r  r  r  )GRAY83r2  r2  r2  )GRAY84   r  r  )GRAY85   r  r  )GRAY86r#  r#  r#  )GRAY87rj  rj  rj  )GRAY88r@  r@  r@  )GRAY89   r  r  )GRAY9   r  r  )GRAY90r~  r~  r~  )GRAY91r  r  r  )GRAY92r  r  r  )GRAY93r  r  r  )GRAY94r  r  r  )GRAY95   r  r  )GRAY96rE  rE  rE  )GRAY97   r  r  )GRAY98r  r  r  )GRAY99   r  r  )HONEYDEWr  r  r  )	HONEYDEW1r  r  r  )	HONEYDEW2r@  r%  r@  )	HONEYDEW3rB  r)  rB  )	HONEYDEW4r.  r-  r.  )HOTPINKr  r  r   )HOTPINK1r  r  r   )HOTPINK2r%  r     )HOTPINK3r)  `   r	  )HOTPINK4r-  r  b   )	INDIANREDr)  ra  ra  )
INDIANRED1r  r  r  )
INDIANRED2r%  rg  rg  )
INDIANRED3r)  rv  rv  )
INDIANRED4r-  r  r  )IVORYr  r  r  )IVORY1r  r  r  )IVORY2r%  r%  r@  )IVORY3r)  r)  rB  )IVORY4r-  r-  r.  )KHAKIr     r  )KHAKI1r     r  )KHAKI2r%  r  ry  )KHAKI3r)  r6  ru  )KHAKI4r-  r  r  )LAVENDERr  r  r  )LAVENDERBLUSHr  r  rE  )LAVENDERBLUSH1r  r  rE  )LAVENDERBLUSH2r%  r@  r~  )LAVENDERBLUSH3r)  rB  rq  )LAVENDERBLUSH4r-  r.  r  )	LAWNGREEN|   r  r   )LEMONCHIFFONr  r  r)  )LEMONCHIFFON1r  r  r)  )LEMONCHIFFON2r%  r  r  )LEMONCHIFFON3r)  r!  r_  )LEMONCHIFFON4r-  r  r  )	LIGHTBLUEr     r  )
LIGHTBLUE1r  r"  r  )
LIGHTBLUE2r  r&  r%  )
LIGHTBLUE3r  r*  r)  )
LIGHTBLUE4r  r.  r-  )
LIGHTCORALr     r  )	LIGHTCYANr@  r  r  )
LIGHTCYAN1r@  r  r  )
LIGHTCYAN2r  r%  r%  )
LIGHTCYAN3r   r)  r)  )
LIGHTCYAN4r  r-  r-  )LIGHTGOLDENRODr%     rw  )LIGHTGOLDENROD1r     r-  )LIGHTGOLDENROD2r%  rF  rw  )LIGHTGOLDENROD3r)  r3  r  )LIGHTGOLDENROD4r-     L   )LIGHTGOLDENRODYELLOWr  r  r  )
LIGHTGREENr	  r%  r	  )	LIGHTGRAYrn  rn  rn  )	LIGHTPINKr     rB  )
LIGHTPINK1r     r  )
LIGHTPINK2r%  r  r  )
LIGHTPINK3r)  r  r  )
LIGHTPINK4r-  rx  r  )LIGHTSALMONr  ry  r  )LIGHTSALMON1r  ry  r  )LIGHTSALMON2r%  r  r  )LIGHTSALMON3r)  r  r  )LIGHTSALMON4r-  r]  rN  )LIGHTSEAGREENr'  r  r9  )LIGHTSKYBLUErl  r  r  )LIGHTSKYBLUE1r+  r]  r  )LIGHTSKYBLUE2   rn  r%  )LIGHTSKYBLUE3   r  r)  )LIGHTSKYBLUE4r  {   r-  )LIGHTSLATEBLUE   r  r  )LIGHTSLATEGRAYw   r  r  )LIGHTSTEELBLUEr+  rI  rj  )LIGHTSTEELBLUE1r     r  )LIGHTSTEELBLUE2r  r  r%  )LIGHTSTEELBLUE3r  r  r)  )LIGHTSTEELBLUE4r  r  r-  )LIGHTYELLOWr  r  r@  )LIGHTYELLOW1r  r  r@  )LIGHTYELLOW2r%  r%  r  )LIGHTYELLOW3r)  r)  r   )LIGHTYELLOW4r-  r-  r  )	LIMEGREENr  r)  r  )LINENr  r  r  )MAGENTAr  r   r  )MAGENTA1r  r   r  )MAGENTA2r%  r   r%  )MAGENTA3r)  r   r)  )MAGENTA4r-  r   r-  )MAROONr+  r  r  )MAROON1r  4   r  )MAROON2r%  r  r  )MAROON3r)  r?  r	  )MAROON4r-  r  r  )MEDIUMAQUAMARINEr8  r)  r9  )
MEDIUMBLUEr   r   r)  )MEDIUMORCHIDr  rv  rn  )MEDIUMORCHID1r@  r8  r  )MEDIUMORCHID2r  rx  r%  )MEDIUMORCHID3r   rY  r)  )MEDIUMORCHID4r  7   r-  )MEDIUMPURPLEr  r  r#  )MEDIUMPURPLE1r  rw  r  )MEDIUMPURPLE2   y   r%  )MEDIUMPURPLE3r  r  r)  )MEDIUMPURPLE4]   rQ  r-  )MEDIUMSEAGREEN<   r  q   )MEDIUMSLATEBLUEr  r  r%  )MEDIUMSPRINGGREENr   r  r  )MEDIUMTURQUOISEr   r  r'  )MEDIUMVIOLETREDr     ry  )MIDNIGHTBLUE   rM  r  )	MINTCREAMrE  r  r  )	MISTYROSEr  rH  r  )
MISTYROSE1r  rH  r  )
MISTYROSE2r%  rL  r  )
MISTYROSE3r)  rM  r  )
MISTYROSE4r-  rQ  r  )MOCCASINr  rH  r  )	MUPDFBLUEr)  r     )NAVAJOWHITEr  rj  r  )NAVAJOWHITE1r  rj  r  )NAVAJOWHITE2r%  r  r  )NAVAJOWHITE3r)  r  r-  )NAVAJOWHITE4r-  r@  rc  )NAVYr   r   r  )NAVYBLUEr   r   r  )OLDLACE   rE  r  )	OLIVEDRABrR  r}  rh  )
OLIVEDRAB1r*  r  r  )
OLIVEDRAB2r  r%  r  )
OLIVEDRAB3r  r)  r  )
OLIVEDRAB4r  r-  r  )ORANGEr  r_  r   )ORANGE1r  r_  r   )ORANGE2r%  r  r   )ORANGE3r)  ry  r   )ORANGE4r-  r   r   )	ORANGEREDr  r;  r   )
ORANGERED1r  r;  r   )
ORANGERED2r%  rb  r   )
ORANGERED3r)  r;  r   )
ORANGERED4r-  r)  r   )ORCHIDr&  r  r  )ORCHID1r  r.  r  )ORCHID2r%  r  r  )ORCHID3r)  r  r!  )ORCHID4r-  rQ  r  )PALEGOLDENRODr%  r  r9  )	PALEGREENr{     r{  )
PALEGREEN1r  r  r  )
PALEGREEN2r	  r%  r	  )
PALEGREEN3r  r)  r  )
PALEGREEN4r[  r-  r[  )PALETURQUOISE   r%  r%  )PALETURQUOISE1   r  r  )PALETURQUOISE2r  r%  r%  )PALETURQUOISE3r  r)  r)  )PALETURQUOISE4r8  r-  r-  )PALEVIOLETREDr#  r  r  )PALEVIOLETRED1r  rw  r  )PALEVIOLETRED2r%  r@  r?  )PALEVIOLETRED3r)  r  r  )PALEVIOLETRED4r-  rQ  rC  )
PAPAYAWHIPr  r"  rL  )	PEACHPUFFr  r&  r  )
PEACHPUFF1r  r&  r  )
PEACHPUFF2r%     r  )
PEACHPUFF3r)  r|  r  )
PEACHPUFF4r-  r  r  )PERUr)  ry  ?   )PINKr  r*  r  )PINK1r  r  rq  )PINK2r%  r  rk  )PINK3r)  rr  rO  )PINK4r-  rg  l   )PLUMr  ry  r  )PLUM1r  r~  r  )PLUM2r%  r  r%  )PLUM3r)  r  r)  )PLUM4r-  r8  r-  )
POWDERBLUEr+  r@  r  )PURPLEry  r'  r  )PURPLE1ro  r  r  )PURPLE2rr  r  r%  )PURPLE3rQ  r  r)  )PURPLE4rv  r  r-  )PY_COLORr  r  r  )REDr  r   r   )RED1r  r   r   )RED2r%  r   r   )RED3r)  r   r   )RED4r-  r   r   )	ROSYBROWNr  r  r  )
ROSYBROWN1r  rB  rB  )
ROSYBROWN2r%  r   r   )
ROSYBROWN3r)  ro  ro  )
ROSYBROWN4r-  r  r  )	ROYALBLUEA   r  r  )
ROYALBLUE1r   r5  r  )
ROYALBLUE2C   r  r%  )
ROYALBLUE3r  rx  r)  )
ROYALBLUE4'   rb  r-  )SADDLEBROWNr-  r;  r  )SALMONr  r  r  )SALMON1r  r  r  )SALMON2r%  rw  r  )SALMON3r)  r  r[  )SALMON4r-  r  9   )
SANDYBROWN   r  r  )SEAGREENrB  r-  r]  )	SEAGREEN1r[  r  r?  )	SEAGREEN2r  r%  r  )	SEAGREEN3r  r)  r  )	SEAGREEN4rB  r-  r]  )SEASHELLr  rE  r%  )	SEASHELL1r  rE  r%  )	SEASHELL2r%  r~  rj  )	SEASHELL3r)  rq  r  )	SEASHELL4r-  r  rw  )SIENNAry  rY  -   )SIENNA1r  rw  rQ  )SIENNA2r%  r@  rN  )SIENNA3r)  r  r  )SIENNA4r-  rQ  r  )SKYBLUErl  r  r  )SKYBLUE1rl  r  r  )SKYBLUE2~   r*  r%  )SKYBLUE3r  r  r)  )SKYBLUE4rS  r  r-  )	SLATEBLUEr  r   r)  )
SLATEBLUE1r.  o   r  )
SLATEBLUE2r  g   r%  )
SLATEBLUE3r  r_  r)  )
SLATEBLUE4rQ  rE  r-  )	SLATEGRAYr  r  r	  )SNOWr  r  r  )SNOW1r  r  r  )SNOW2r%  r  r  )SNOW3r)  r!  r!  )SNOW4r-  r  r  )SPRINGGREENr   r  r1  )SPRINGGREEN1r   r  r1  )SPRINGGREEN2r   r%  r5  )SPRINGGREEN3r   r)  r8  )SPRINGGREEN4r   r-  r;  )	STEELBLUEF   rw  r   )
STEELBLUE1rg  rk  r  )
STEELBLUE2ra  rV  r%  )
STEELBLUE3r  r  r)  )
STEELBLUE4rG  r  r-  )TANr  r   r  )TAN1r  r_  r  )TAN2r%  r  I   )TAN3r)  ry  r  )TAN4r-  r   r\  )THISTLEr  r  r  )THISTLE1r  r  r  )THISTLE2r%  r  r%  )THISTLE3r)  r  r)  )THISTLE4r-  r  r-  )TOMATOr  rg  rQ  )TOMATO1r  rg  rQ  )TOMATO2r%  ra  rN  )TOMATO3r)  r  r  )TOMATO4r-  rG  r  )	TURQUOISErb  r@     )
TURQUOISE1r   rE  r  )
TURQUOISE2r   r~  r%  )
TURQUOISE3r   rq  r)  )
TURQUOISE4r   r  r-  )VIOLETr%  rw  r%  )	VIOLETREDr  r'  r	  )
VIOLETRED1r  r  r  )
VIOLETRED2r%  r  r  )
VIOLETRED3r)  r  r/  )
VIOLETRED4r-  r  rY  )WHEATrE  rj  r  )WHEAT1r     r  )WHEAT2r%  r  r  )WHEAT3r)  r  r  )WHEAT4r-  r  r8  )WHITEr  r  r  )
WHITESMOKErE  rE  rE  )YELLOWr  r  r   )YELLOW1r  r  r   )YELLOW2r%  r%  r   )YELLOW3r)  r)  r   )YELLOW4r-  r-  r   )YELLOWGREENr  r)  r  r   r   r'   r&   r  r  
  s    b br'   c                  \    0 n [        5        H  nUSS  XS   R                  5       '   M     U $ )Nr   r   )r  rG  )r  r/  s     r&   getColorInfoDictr    s1    
A "!!"Xq'--/ #Hr'   r~   c                      [        5       [        5       R                  U R                  5       5         nUS   S-  US   S-  US   S-  4$ ! [         a    [
        R                  " 5          gf = f)zRetrieve RGB color in PDF format by name.

Returns:
    a triple of floats in range 0 to 1. In case of name-not-found, "white" is returned.
r        o@re  r   )r   r   r   )r  r  rp  rZ  ro  r   r  )r~   r  s     r&   getColorr    sj    |~33DJJLAB!uadUlAaD5L99  s   AA A-,A-c                 >    [        5       [        5       R                  U R                  5       5         nUS   S-  nUS   S-  nUS   S-  n[        X#U5      n[        US-  S5      n[        X#U5      nXW-
  nUS:X  a  Sn	O3XR:X  a  SX4-
  U-  S	-  -  n	O XS:X  a  SXB-
  U-  S-   -  n	OSX#-
  U-  S
-   -  n	[        [        U	5      5      n
US:X  a  SnOX-  n[        [        US-  5      5      nXU4$ ! [         a#    [
        (       a  [        R                  " 5          gf = f)zRetrieve the hue, saturation, value triple of a color name.

Returns:
    a triple (degree, percent, percent). If not found (-1, -1, -1) is returned.
rj   rj   rj   r   r  re  r   r  r   g      N@   r?   )r  r  rp  rZ  ro  r  r   r  r   r   r/   r   )r~   r-   r   gr   cmaxVcmindeltahueHsatSs                r&   getColorHSVr&    s4   |~33DJJLAB
 	
!uA	!uA	!uAqQ<DdSj!AqQ<DKEz	!+,	!+,!+,E#JAqylE#)A!99  G$:$:$<s   2C/ /*DDc                 j   U R                  U5      u  p#pESnSnUS:X  a  X#XFU4$ U(       ag   [        R                  " US9nUR                  nUR                  nUR
                  n	Xg-
  S:  a!  U	R                  U:  a  U	R                  nSU-
  nX#XFU4$ US:w  a0   [        R                  " U5      nUR                  nUR                  nO
US-  nUS-  nX#XFU4$ ! [         a"    [        R                  " 5         US-  nUS-  n Nuf = f! [         a"    [        R                  " 5         US-  nUS-  n N_f = f)Ng?gɿr   
fontbufferr   333333?zn/a)	extract_fontr   Fontascender	descenderr  r   ro  r  )
r\   rC   r  extstyper  ascdscfontr  s
             r&   _get_font_propertiesr4  C  sE   #&#3#3D#9 H5
C
C
bye#--	<<62D--C..C99Dy1}77S=''C#g
 e#--
e|	<<)D--C..C 	s
s
%c))#  	""$3JC3JC	  	""$3JC3JC	s$   A!C .D )DD)D21D2limitfontdictc                    [         R                  " X5      nUc  Uc  [        X5      u  pgpn
UUUU	U
S.nOUS   nUS   nUS   nUS   nUS   nUS:X  a  [        S	5      eUS
;   a  SnOSnUS;   a  SnOUS;   a  SnOUS;   a  SnOUS;   a  SnOSnXS'   US:X  a  [         R                  nOUS:X  a  [         R
                  nOSnXS'   XS'   X/nU R                  R                  U5        OUS   nUS   nUS   nUS   nUc  SnO[        U5      n[        SU5      nX::  a  U$ US:  a  U R                  XS   US   US   X5      nOSnXS'   XES'   [         R                  " X5        U$ )aa  Get list of glyph information of a font.

Notes:
    Must be provided by its XREF number. If we already dealt with the
    font, it will be recorded in doc.FontInfos. Otherwise we insert an
    entry there.
    Finally we return the glyphs for the font. This is a list of
    (glyph, width) where glyph is an integer controlling the char
    appearance, and width is a float controlling the char's spacing:
    width * fontsize is the actual space.
    For 'simple' fonts, glyph == ord(char) will usually be true.
    Exceptions are 'Symbol' and 'ZapfDingbats'. We are providing data for these directly here.
N)r~   r   r/  r-  r.  r~   r/  r   orderingr  r   zxref is not a font)Type1MMType1TrueTypeTF)FangtiMingr   )HeitiSongr   )GothicMinchore  )DotumBatangr   rj   ZapfDingbatsSymbolglyphs   )r   CheckFontInfor4  r   zapf_glyphssymbol_glyphs	FontInfosr   r   r   _get_char_widthsUpdateFontInfo)r\   rC   r5  r  r6  fontinfor~   r/  r0  r1  r2  r8  r  rF  oldlimitmylimits                   r&   get_char_widthsrQ  h  s     $$S/H)=c)H&Du3 H F#D5/CV$E
+Hh'F"9122 44FF %%H&&H))H((HH#>!((FX**FF#'#X&A;(#(#J'~v;#uoG!|%%6"HUOXj5I7
 XQK3)Mr'   c            +          \ rS rSrSr\S 5       rS\R                  4S jr	S r
S\S\S	\R                  4S
 jrS\S	\R                  4S jrS\S\S\S\S	\R                  4
S jrS\R$                  \\4   S	\R                  4S jrS\S\S	\R                  4S jrS\S\S\S	\R                  4S jr SIS\S\S\S\S	\R                  4
S jjrSS.S\S	\R                  4S jjrS\S	\R                  4S jr SJS\S\S \S	\R                  4S! jjr SJS\S\S	\R                  4S" jjrS#SS$SS%S%SSS%S&S'S%SS'S'S%S(.S\S)\R$                  \\4   S*\S+\ S,\S-\!S.\S/\"S0\#S1\#S2\"S3\S4\S5\"S6\#S7\S8\S9\"S	\"4&S: jjr$S$SS#SS%S%SSS'S&S'S%S%S%SS'S'S%S;.S\S)\R$                  \\4   S,\!S-\!S*\S+\ S.\S/\"S0\#S1\#S<\"S3\S4\S=\"S2\"S5\"S6\#S7\S8\S9\"S	\4*S> jjr%            SKS?\S0\#S1\#S@\"SA\"SB\!SC\S6\#SD\S8\S7\S9\"S	S4SE jjr&SISF\S	S4SG jjr'SHr(g)LShapei  zCreate a new shape.c                 `   [         R                  " X-
  5      R                  n[        R                  " [        UR                  5      5      nUR                  S:  a<  UR                  S::  a  [        R                  U-
  * nU$ [        R                  U-
  n U$ UR                  S:  a   U$ U* nU$ )zReturn the angle to the horizontal for the connection from C to P.
This uses the arcus sine function and resolves its inherent ambiguity by
looking up in which quadrant vector S = P - C is located.
r   )	r   rp  r  mathasinr   r.   r-   pi)Cr=  r%  alfas       r&   horizontal_angleShape.horizontal_angle  s     MM!% %%yyQSS"337ssax4(  ww~ 	 ssax  ur'   r
   c                    [         R                  " U5        Xl        UR                  U l        U R                  R
                  (       d  [        S5      eUR                  R                  U l	        UR                  R                  U l        UR                  R                  U l
        UR                  R                  U l        UR                  U l        U R                  ) U l        SU l        SU l        SU l        S U l        S U l        g )Nr<   r   )r   rF   r
   rG   r\   rH   r   mediabox_sizer.   r   r-   r   cropbox_positionrM   pctmipctm	draw_cont	text_cont	totalcont
last_pointr    )selfr
   s     r&   __init__Shape.__init__  s    D!	;;xx[))((**''))
&&((&&((..	iiZ
	r'   c                    U R                   cG  [        U5      S:X  a  [        R                  " X5      U l         g [        R                  " U5      U l         g [        U5      S:X  a  [        R                  " U5      n[        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        g [        R                  " U5      n[        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        [        U R                   R                  UR                  5      U R                   l        g )Nre  )r    r   r   r   rp  r/   r   r-   r   r.   r   r   r   )re  r-   s     r&   
updateRectShape.updateRect  sN   991v{#LL.	#LLO	 1v{MM!$"499<<5		"499<<5		"499<<5		"499<<5		LLO"499<<6		"499<<6		"499<<6		"499<<6		r'   r   r   r   c                    [         R                  " U5      n[         R                  " U5      nU R                  U:X  dX  U =R                  [	        [         R
                  " XR                  -  5      5      S-   -  sl        Xl        U R                  U5        U =R                  [	        [         R
                  " X R                  -  5      5      S-   -  sl        U R                  U5        X l        U R                  $ )zDraw a line between two points. m
 l
)r   rp  rd  ra  r  r0   r`  ri  )re  r   r   s      r&   r  Shape.draw_line
  s    ]]2]]22%NNi(8(8jj(IJVSSN OOOB)G$4$4R**_$EFOOr'   r  c           
         [        U5       GH	  u  p#US:X  a  U R                  [        R                  " U5      :X  dq  U =R                  [        [        R                  " [        R                  " U5      U R                  -  5      5      S-   -  sl        [        R                  " U5      U l        OVU =R                  [        [        R                  " [        R                  " U5      U R                  -  5      5      S-   -  sl        U R                  U5        GM     [        R                  " US   5      U l        U R                  $ )z%Draw several connected line segments.r   rl  rm  rj   )	r   rd  r   rp  ra  r  r0   r`  ri  )re  r  r`   rt  s       r&   r  Shape.draw_polyline  s    f%DAAv7==+;;NNi0@0@qAQTXT^T^A^0_&`ci&iiN&-mmA&6DO)G,<,<W]]1=MPTPZPZ=Z,["\_e"eeOOA & "--r
3r'   r	  r  c                    [         R                  " U5      n[         R                  " U5      n[         R                  " U5      n[         R                  " U5      nU R                  U:X  dA  U =R                  [	        [         R
                  " XR                  -  5      5      S-   -  sl        [         R
                  " [        X R                  -  5      [        X0R                  -  5      -   [        X@R                  -  5      -   5      nU =R                  [	        U5      S-   -  sl        U R                  U5        U R                  U5        U R                  U5        U R                  U5        X@l        U R                  $ )z#Draw a standard cubic Bezier curve.rl   c
)	r   rp  rd  ra  r  r0   r`  r2  ri  )re  r   r   r	  r  r  s         r&   r  Shape.draw_bezier&  s    ]]2]]2]]2]]22%NNi(8(8jj(IJVSSNR**_ 5R**_8M MPTUWZdZdUdPe ef)D/F22r'   tetrac                    [        U5      S:w  a  [        S5      e[        US   S5      (       a!  [        R                  " U5      R
                  nO[        R                  " U5      nUR                  UR                  UR                  -
  S-  -   nUR                  UR                  UR                  -
  S-  -   nUR                  UR                  UR                  -
  S-  -   nUR                  UR                  UR                  -
  S-  -   nU R                  U:X  dG  U =R                  [        [        R                  " X`R                  -  5      5      S-   -  sl        X`l        U R!                  XbR                  U5        U R!                  XRR                  U5        U R!                  XBR                  U5        U R!                  X2R                  U5        U R#                  UR$                  5        X`l        U R                  $ )z"Draw an ellipse inside a tetrapod.r?   zinvalid arg lengthr   	__float__r   rl  )r   r   r   r   r   r  r  ulurlrllrd  ra  r  r0   r`  r  ri  r    )re  rt  qmtmrmbmls          r&   r  Shape.draw_oval=  si   u:?12258[))U#((AU#ATTQTTADD[C''TTQTTADD[C''TTQTTADD[C''TTQTTADD[C''2%NNi(8(8jj(IJVSSN ODD"%DD"%DD"%DD"%r'   r  r  c                     U[         R                  :  d  [        S5      e[         R                  " U5      nXS4-
  nU R	                  XSSS9$ )r  radius must be positiver   r   Fr  )r   EPSILONr   rp  r  )re  r  r  r   s       r&   r  Shape.draw_circleU  sL    '677v&qk!CEBBr'   c                     Sn[         R                  " U5      n[         R                  " U5      n[         R                  " U5      nXU-
  U-  -   nX2U-
  U-  -   nU R                  XXc5      $ )z4Draw a curve between points using one control point.g7.SQ?)r   rp  r  )re  r   r   r	  kappak1k2s          r&   r  Shape.draw_curve]  sh     ]]2]]2]]27e##7e##//r'   r)  r  r  c                    [         R                  " U5      n[         R                  " U5      nS nS nS n[        R                  " U* 5      n[        R                  " [        R                  " SU5      5      S-  n	[        R                  " [        R                  " SU5      5      n
U
S-  n[        U5      S[        R                  -  :  a&  X-  n[        U5      S[        R                  -  :  a  M&  U R                  U:X  d>  U =R                  U" [         R                  " X R                  -  5      6 -  sl        X l        [         R                  " SS5      nUnUnX-
  n[        U5      nU[         R                  :  d  [        S	5      eU R                  X5      n[        U5      [        U
5      :  Ga  UR                  [        R                  " UU
-   5      U-  -   nUR                   [        R"                  " UU
-   5      U-  -   n[         R                  " UU5      nUR                  [        R                  " UU-   5      U-  [        R                  " U5      -  -   nUR                   [        R"                  " UU-   5      U-  [        R                  " U5      -  -   n[         R                  " UU5      nS
[        R                  " U5      -
  S-  S-  [        UU-
  5      -  nU[        X-
  5      -  nUUU-
  U-  -   nUUU-
  U-  -   nU =R                  U" [         R                  " [%        UU R                  -  5      [%        UU R                  -  5      -   [%        XR                  -  5      -   5      6 -  sl        X-  nUU
-  nUn[        U5      [        U
5      :  a  GM  [        U5      S:  Ga  US-  nUR                  [        R                  " UU-   5      U-  -   nUR                   [        R"                  " UU-   5      U-  -   n[         R                  " UU5      nUR                  [        R                  " UU-   5      U-  [        R                  " U5      -  -   nUR                   [        R"                  " UU-   5      U-  [        R                  " U5      -  -   n[         R                  " UU5      nS
[        R                  " U5      -
  S-  S-  [        UU-
  5      -  nU[        X-
  5      -  S
[        R                  " U5      -
  -  nUUU-
  U-  -   nUUU-
  U-  -   nU =R                  U" [         R                  " [%        UU R                  -  5      [%        UU R                  -  5      -   [%        XR                  -  5      -   5      6 -  sl        U(       a  U =R                  U" [         R                  " X R                  -  5      6 -  sl        U =R                  U" [         R                  " XR                  -  5      6 -  sl        U =R                  U" [         R                  " XR                  -  5      6 -  sl        Xl        U R                  $ )zDraw a circle sector.c                      [        X45      S-   $ )Nrl  r  r  s     r&   r   #Shape.draw_sector.<locals>.<lambda>v      )QF+f4r'   c                 $    [        XX#XE45      S-   $ )Nrr  r  r  s         r&   r   r  w  s    iqQ0B&Cf&Lr'   c                      [        X45      S-   $ )Nrm  r  r  s     r&   r   r  x  r  r'   r   rj   r   re  r   r  r   r?   r   gMbP?)r   rp  rU  radianscopysignr   rW  rd  ra  r0   r`  r  r   rZ  r-   cosr.   sinr2  )re  r  r)  r  r  l3l4l5betarw360w90w45r  rX  r=  r%  radrY  q1q2r1r2Rkappahr  cp1cp2beta2s                               r&   r  Shape.draw_sectorl  s    v&e$4L4dU#||DMM#u56"=ll4==U34Ag%j1tww;&ME %j1tww;&5(NNb'"2"25::3E"FGGN#OMM!QE!fW__$677$$V3%j3s8#txxs
+c11Btxxs
+c11Bb"%Atxxs
+c1DHHSMAABtxxs
+c1DHHSMAABb"%A$((3-'1,q03q1u:=FSZ'Eq1uo%Cq1uo%CNNb'"2"2S4::%&cDJJ.>)??$q::~BVV#  N LECKDA# %j3s8#& u:AIEtxxu-33Btxxu-33Bb"%Atxxu-3dhhuoEEBtxxu-3dhhuoEEBb"%A$((5/)Q.2SQZ?FSZ'1txx+>?Eq1uo%Cq1uo%CNNb'"2"2S4::%&cDJJ.>)??$q::~BVV#  N NNb'"2"25::3E"FGGNNNb'"2"26JJ3F"GHHNNNb'"2"21zz>"BCCNr'   Nr  r    c          
         [         R                  " U5      nUc  U =R                  [        [         R                  " [        UR                  U R                  -  5      UR                  UR                  /-   5      5      S-   -  sl        U R                  U5        UR                  U l        U R                  $ [        US5      (       aG  US::  d  US:  a  [        SU S35      e[        UR                  UR                  5      U-  nUS4nSU4nO[        US5      (       aa  [!        U5      S:X  aR  Uu  pxXsR                  -  S4nSXR                  -  4n[        Xx5      S::  d  [#        Xx5      S:  a  [        SU S35      eO[        SU S35      eU R%                  UR                  U-   UR                  U-
  5      n	U R'                  XR                  UR                  U-   5      n	U R%                  XR(                  U-
  5      n	U R'                  XR(                  UR(                  U-
  5      n	U R%                  XR*                  U-   5      n	U R'                  XR*                  UR*                  U-
  5      n	U R%                  XR                  U-   5      n	U R'                  XR                  UR                  U-   5      U l        U R                  U5        U R                  $ )	a  Draw a rectangle.

Args:
    radius: if not None, the rectangle will have rounded corners.
        This is the radius of the curvature, given as percentage of
        the rectangle width or height. Valid are values 0 < v <= 0.5.
        For a sequence of two values, the corners will have different
        radii. Otherwise, the percentage will be computed from the
        shorter side. A value of (0.5, 0.5) will draw an ellipse.
z re
rv  r   r   zbad radius value rb  __len__re  )r   r   ra  r  r0   r2  blr`  r   r   ri  r*   rd  r   r   r/   r   r   r  r  r+   r2   )
re  r    r  r   r  r  pyrxrylps
             r&   r  Shape.draw_rect  sX    LL>NNi(8(8QTTDJJ&'177AHH*==)  N OOAddDO??" 6;''{fsl #4VHA!>??AGGQXX&/AQBQBVY''CK1,<FBww,"BR((]#B2{a3r;#4 #4VHA!>?? $5 0:;;^^ADD2Iqttby1__Rqttby1^^Br	*__Rqttby1^^Br	*__Rqttby1^^Br	*//"ddADD2I>r'   r  c                     [         R                  " U5      nU R                  UR                  UR                  UR
                  UR                  UR                  /5      $ )zDraw a Quad.)r   r  r  rw  rz  ry  rx  )re  r  r{  s      r&   r  Shape.draw_quad  s@    LL!!144qttQTT144"@AAr'   r  c                 R   [         R                  " U5      n[         R                  " U5      nX!-
  n[        U5      nS[        [	        USU-  -  S5      5      -  nUS:  a  [        S5      eXV-  n[         R                  " [         R                  " X5      5      nU) n	/ n
[        SU5       H`  nUS-  S:X  a  [         R                  " US5      U-  nO&US-  S:X  a  [         R                  " US5      U-  nOMM  U
R                  X-  5        Mb     U R                  U/U
-   U/-   5        U$ )z%Draw a zig-zagged line from p1 to p2.r?   r   points too closer   rj   r   )r   rp  r   r   r   r   r,   util_hor_matrixr,  r   r  )re  r   r   r  r%  r  cntr~  rB   i_matr  r`   rt  s                r&   r  Shape.draw_zigzag  s    ]]2]]2G!f#eC1w;/3447/00Y 7 7 ?@q#A1uzMM!R(2-Q!MM!Q'",MM!)$  	B4&=B4/0	r'   c                    [         R                  " U5      n[         R                  " U5      nX!-
  n[        U5      nS[        [	        USU-  -  S5      5      -  nUS:  a  [        S5      eXV-  n[         R                  " [         R                  " X5      5      nU) n	Sn
/ n[        SU5       Hw  nUS-  S:X  a  [         R                  " X* 5      U-  nO=US-  S:X  a  [         R                  " X5      U-  nO[         R                  " US5      U-  nUR                  X-  5        My     U/U-   U/-   n[        U5      nSnUS-   U:  a/  U R                  X   XS-      XS-      5        US-  nUS-   U:  a  M/  U$ )z#Draw a squiggly line from p1 to p2.r?   r   r  gh?3OP@r   r   re  )r   rp  r   r   r   r   r,   r  r,  r   r   r  )re  r   r   r  r%  r  r  r~  rB   r  r  r  r`   rt  s                 r&   r  Shape.draw_squiggle  sl    ]]2]]2G!f#eC1w;/3447/00Y 7 7 ?@q#A1uzMM!R(2-Q!MM!'",MM!Q'",MM!)$  "%&k!eckOOFIv!e}fUmDFA !eck 	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  r  r   r  r  r  r  r   r  r  r  r   c          
      
   [        U5      (       d  g[        U5      [        [        4;  a  UR	                  5       nOUn[        U5      S:  d  g[        R                  " U5      n [        SR                  U5       Vs/ s H  n[        U5      PM     sn5      nUnUR                  S5      (       a  USS  nU R                  R                  UXhUS9n[        R                   " U R"                  U5      nUS   nUS   nUS   nUS   nUS	   nUS
   nU(       a  X4-  nOUU-
  S::  a  US-  nOUUU-
  -  nUS:  a   U R"                  R%                  UUS-   5      n OUS   n / n!U H=  n"U(       a	  US;  a  S n#OU n#U!R'                  [        R(                  " U"U#UU5      5        M?     U!n[        R*                  " U	S5      n$[        R*                  " U
S5      n%U
(       d  US:X  a  U	n
[        R*                  " U	S5      n%[        R,                  " U5      n&Un'U'S-  S:w  a  [/        S5      eU'S:  a  U'S-  n'U'S:  a  M  U'S-  n'S n(S n)Sn*Sn+Sn,U R0                  n-U R2                  n.U&(       a  [        R4                  " SSSSUS   R6                  U R6                  -   U-US   R8                  -
  U R8                  -
  5      n/U/) US   -  U/-  n0[;        [        R<                  " U05      5      S-   n1OSn1U-UR8                  -
  U R8                  -
  n2UR6                  U R6                  -   n3U2n4U'S:X  aJ  U-UR8                  -
  U R8                  -
  n3UR6                  * U R6                  -
  n2U1U*-  n1U.[?        U25      -
  n4OU'S:X  aG  U-* UR8                  -   U R8                  -   n3UR6                  U R6                  -   n2U1U+-  n1[?        U25      n4OdU'S:X  a^  UR6                  * U R6                  -
  n3U-* UR8                  -   U R8                  -   n2U1U,-  n1[?        UR8                  U R8                  -   5      n4U R                  RA                  U5      n5U5b  SU5-  n6Sn7OS=n6n7U R                  RC                  UUS9n8U8c  Sn8OS U8-  n8U(" U6U8U1U3U2UU5      n9US:  a/  U9S!U-  -  n9U9[;        X-  5      S"-   -  n9Ub  U9[;        U5      S#-   -  n9U	b  U9U$-  n9U
b  U9U%-  n9U9US   -  n9Sn:[        U5      S:  a  U9U)" U5      -  n9OU9S$-  n9[E        S[        U5      5       H+  n;U4U:  a    O$U;S:  a  U9S%-  n9U9UU;   S$-   -  n9U4U-  n4U:S-  n:M-     U9S&U7-  -  n9U =RF                  U9-  sl#        U:$ s  snf ! [         a    [        R                  " 5          gf = f)'Nr   r   ri  r   r  r  r  r  r8  r  r~   r-  r.  r*  r  rF  rE  rD  r  r  r   r   r   c                 P    SU  U SU S[        X445       SU S[        U5       S3$ )N
q
BT
1 0 0 1 z Tm
/r    Tf r  )r  r   r  r  r  r  r  s          r&   r   #Shape.insert_text.<locals>.<lambda>  s@    uQCs$qc)UVTZJ[I\\bcdbeefgpqrgsfttx-yr'   c                      S[        U 5       S3$ )NzTJ
0 -z TD
r  r
  s    r&   r   r    s    WYq\N%8r'   0 1 -1 0 0 0 cm
0 -1 1 0 0 0 cm
-1 0 0 -1 0 0 cm
 cm
r   r   r   /OC /%s BDC
EMC
r  /%s gs
%i Tr  w  M TJz
T* z
ET
%sQ
)$rm   r   r2  r3  
splitlinesr   r   rp  r   joinordro  r  r  r
   insert_fontrH  r\   rQ  r   getTJstr	ColorCode
CheckMorphr   r   r   r,   r-   r.   r  r0   r   _get_optional_contentr  r,  rb  )<re  r)  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r   r   r  maxcodefnamerC   rN  r6  r8  r  bfnamer-  r.  lheightrF  tabr   r  	color_strfill_strmorphingrottempl1templ2cmp90cmm90cm180r   r   m1r  r  r  leftspaceoptcontbdcemcrz   nresnlinesr`   s<                                                               r&   r  Shape.insert_text3  s   0 F||<e},$$&DD4y1}e$	388D>:>a3q6>:;G C  !"IEyy$$XZ % 
 ((48A;J'(#&!J'[)	+G	!Q&nG(Y"67GS=XX--dGaK@Fh'FA&(BBJJw''1fh?@  %%eS1	$$T3/q(D((4H%%e,8q=/00Ag3JC AgCiy8##$

 1aE!HJJ,?%PQ(**ATW[W]W]A]^B#a.2%C7++C01G;BBuww'ww"9EGG#dff,D77(TVV#C%KBCH$E CZ7UWW$tvv-D''DFF"C%KBHE CZGG8dff$D'EGG#dff,C%KB$&&()E ))11"5!G+CCNC#		&&.\&J=E&Ec5"dCA?H{**DIl56>>D&	+.66IDHD
 	Qt9q=F7O#DDLDq#d)$Aw1uDGdN"DWEaKF % 	## 	$g ; 	""$	s$   %U =UU U U98U9)r  r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r   r  r  c          
        ^^P^Q [         R                  " U5      nUR                  (       d  UR                  (       a  [	        S5      e[         R
                  " U	S5      n[         R
                  " U
S5      nU
c  US:X  a  U	n
[         R
                  " U	S5      nU R                  R                  U5      nUb  SU-  nSnOS=nnU R                  R                  UUS	9nUc  SnOS
U-  nUS-  S:w  a  [	        S5      eUnUS:  a  US-  nUS:  a  M  US-  n[        U5      (       d  US;   a  UR                  $ UR                  $ SnSnSnU R                  nUn U R                  S5      (       a  U SS n U R                  R                  U XHUS9n![         R                  " U R                  U!5      n"U"S   n#U#S   mQU#S   n$U#S   mPU#S   n%U#S   n&U#S   n'U(       a  Un(OU&U'-
  S::  a  Sn(OU&U'-
  n(TU(-  n)[!        U5      ["        [$        4;   a  SR'                  U5      n*OUn*[)        U* V+s/ s H  n+[+        U+5      PM     sn+5      n,U$(       a9  U,S:  a3  SR'                  U* V+s/ s H  n+[+        U+5      S:  a  U+OSPM     sn+5      n*U*R-                  5       n*U R                  R/                  U!U,S-   5      mPU$(       a	  U%S ;  a  Sn-OTPn-UUPUQ4S! jn.TQS:  a  TPS"   S   T-  n/OTn/Sn0[         R0                  " U5      (       a  [         R2                  " SSSSUS   R4                  U R4                  -   U R                  US   R6                  -
  U R6                  -
  5      n1U1) US   -  U1-  n2[9        [         R:                  " U25      5      S#-   n3OSn3Sn4[         R<                  " STU&-  5      n5US:X  a(  UR>                  U5-   n6UR                  n7UR                  n8OUS:X  aG  [         R<                  " TU&-  S5      n5UR@                  U5-   n6UR                  n7UR                  n8U3U-  n3OUS$:X  aJ  [         R<                  " STU&-  5      * n5URB                  U5-   n6UR                  n7S%n4UR                  n8U3U-  n3OI[         R<                  " TU&-  S5      * n5URD                  U5-   n6UR                  n7S%n4UR                  n8U3U-  n3/ n9[G        U*5       GHa  u  n:n;U;RI                  U5      RK                  S&5      n<[M        U<5      n=Sn>U7n?[O        U=5       H  n@U<U@   nAU." UA5      nBU?UB:  a  U>WAS&-   -  n>U?WBU/-   -  n?M(  U>(       a)  U>RQ                  5       S-   n>U0U>-  n0U9RS                  S'5        Sn>U7n?WBU7::  a  WAS&-   n>U7WB-
  U/-
  n?Mq  [M        U95      S:  a  S(U9S%'   WA H<  n+U." U>5      U7U." U+5      -
  ::  a  U>U+-  n>M  U>S-  n>U0U>-  n0U9RS                  S(5        U+n>M>     U>S&-  n>U7U." U>5      -
  n?M     U>(       a$  U0U>RQ                  5       -  n0U9RS                  S(5        U:[M        U*5      S-
  :  d  GM\  U0S-  n0GMd     U0RU                  S5      (       a  U0SS% n0U0RW                  S5      S-   nCU)UC-  U'T-  -
  nDUDU8-
  nEUE[         RX                  :  a  S%WE-  $ [[        WE5      nEUE[         RX                  :  a  SnES)U< U< S*3U3-   nFS+ nGU0R-                  5       nHS(U9S%'   [G        UH5       GHZ  u  n:nISnJU7U." UI5      -
  nKU6U5U:U(-  -  -   nLUS:X  aH  US;   a!  WL[         R<                  " WKS,-  S5      U4-  -   nLOWL[         R<                  " SWKS,-  5      U4-  -
  nLOwUS,:X  aB  US;   a  WL[         R<                  " WKS5      U4-  -   nLOMWL[         R<                  " SWK5      U4-  -
  nLO/US-:X  a)  WIRW                  S&5      nMUMS:  a  U9U:   (       a  WKWM-  nJOSnJUWLR6                  -
  U R6                  -
  nNULR4                  U R4                  -   nOUS:X  a7  UWLR6                  -
  U R6                  -
  nOULR4                  * U R4                  -
  nNOzUS.:X  a7  U* WLR6                  -   U R6                  -   nOULR4                  U R4                  -   nNO=US$:X  a7  WLR4                  * U R4                  -
  nOU* ULR6                  -   U R6                  -   nNWFWG" WOWNU T5      -  nFUS:  a0  WFS/U-  -  nFUF[9        UT-  5      S0-   -  nFUb  WF[9        U5      S1-   -  nFUS-:X  a  WF[9        WJ5      S2-   -  nFU	b  WFU-  nFU
b  WFU-  nFWFS3[         R\                  " WIU-U$TQ5      -  -  nFGM]     WFS4U-  -  nFU =R^                  UF-  sl/        U Ra                  U5        WE$ s  sn+f s  sn+f )5a  Insert text into a given rectangle.

Args:
    rect -- the textbox to fill
    buffer -- text to be inserted
    fontname -- a Base-14 font, font name or '/name'
    fontfile -- name of a font file
    fontsize -- font size
    lineheight -- overwrite the font property
    color -- RGB stroke color triple
    fill -- RGB fill color triple
    render_mode -- text rendering control
    border_width -- thickness of glyph borders as percentage of fontsize
    expandtabs -- handles tabulators with string function
    align -- left, center, right, justified
    rotate -- 0, 90, 180, or 270 degrees
    morph -- morph box with a matrix and a fixpoint
Returns:
    unused or deficit rectangle area (float)
z%text box must be finite and not emptyr  r  Nr   r  r  r   r  r  r   zrotate must be multiple of 90r   )r   r   r  r  r  ri  r   r  r8  r  rF  r~   r-  r.  r*  r   r  rG  ?r  c           	         > TS:  a.  [        U  Vs/ s H  nT[        U5         S   PM     sn5      T-  $ [        U 5      T-  $ s  snf )zCalculate pixel length of x.r   r   )sumr  r   )r-   r  r  rF  r8  s     r&   pixlen$Shape.insert_textbox.<locals>.pixlent  sJ    !|q9q!F3q6N1-q9:XEE1v(( :s   Ar'  r  r   rj   r   TFr  r  c                 @    S[        X45       SU S[        U5       S3$ )Nr  z Tm /r   r  r  r  s       r&   r   &Shape.insert_textbox.<locals>.<lambda>  s'    Xi.?-@aS)TU,W[#\r'   re  r   r   r  r  r  z Tw z%sTJ
zET
%sQ
)1r   r   rI   rJ   r   r  r
   r  r  rm   r   r   r  r  rH  r\   r   r2  r3  r  r   r  r  rQ  r  r,   r-   r.   r  r0   rp  r*   r  r+   r2   r   r  splitr   r,  rstripr   endswithr  r  r   r  rb  ri  )Rre  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  rz   r  r  r  r  r   r  rC   rN  r6  r  r  r-  r.  lheight_factorr  r"  r  r  	tj_glyphsr  blenr   r  r  r  progrc_pntr)  maxwidth	maxheightjust_tabr`   r   line_t	num_wordslbuffrestjwordpl_wlb_counttext_heightmorer  templtext_tr   spacingplr  spacesr  r  rF  r8  sR        `                                                                          @@r&   r  Shape.insert_textbox  s	   X ||D!==D,,DEE%%eS1	$$T3/<K1,D((4H))11"5!G+CCNC# 		&&.\&J=E&EB;!<==Ag3JC AgCi F||"%/4;;AtzzA##$C  !"IEyy$$XZ % 
 ((48A;J'(#(#&!J'[)	'N	!Q& N%	1N^+ <D%=(6"BBr*r!s1vr*+gmbAbs1v|!4bABB]]_))$!<f$>>II
	) a<":a=8+DDe$$1aE!HJJ/uQxzz1IDFF1RB #a.2%C7++C01G;BB
 aH!45!8GGeOEzzHIBYMM(X"5q9EGGeOE{{H

I%KBCZ]]1h&9::EGGeOEzzHE{{I%KB ]]8h#6::EGGeOE{{HE

I%KB
  }GAt__Z066s;FFIED 9%ayd|4<TCZ'ED4K'D !LLNT1EEMDOOD)8# 3JE#d?T1D x=1$#(HRLAe}6!9(<<
 . !  &-/G &J &&3r7Q;e %j ==9D::d#a' (9x+??Y&'//!$;4y'//!D"%u-2\"f%DAqGF1I%B%1~#566Cz(?b1fa 85 @@Caa 85 @@C!(?b! 4u <<Ca 4u <<C!A:(1+ 6kGG355.466)C55466>Dby~.uuftvvow/eedffnvgo.E$UH55DQ;..	,"9:UBB*Ik2U::Dz	'*V33 	! Hw//9fhOOOD_ &b 	c!!$] + Bs   &e$e)r   r  r  r  even_oddr  c           
          U R                   S:X  a  gUS:X  a  SnOUc  Sn[        R                  " US5      n[        R                  " US5      nU R                  R	                  U5      nUb  SU-  U R                   -   U l         SnOSnU R                  R                  XS9nUb  S	U-  U R                   -   U l         US
:w  a'  US:w  a!  U =R                   [        U5      S-   -  sl         US:w  a  SU-  U R                   -   U l         US:w  a  SU-  U R                   -   U l         US;  a  SU-  U R                   -   U l         U	(       a  U =R                   S-  sl         SU l        Ub  U =R                   U-  sl         Ub~  U =R                   U-  sl         Ub3  U(       d  U =R                   S-  sl         O^U =R                   S-  sl         OHU(       d  U =R                   S-  sl         O+U =R                   S-  sl         OU =R                   S-  sl         U =R                   U-  sl         [        R                  " U5      (       a  [        R                  " S
SSS
US   R                  U R                  -   U R                  US   R                  -
  U R                  -
  5      nU) US
   -  U-  n[        [        R                  " U5      5      S-   U R                   -   U l         U =R                  SU R                   -   S-   -  sl        SU l         SU l        g)zFinish the current drawing segment.

Notes:
    Apply colors, opacity, dashes, line style and width, or
    morphing. Also whether to close the path
    by connecting last to first point.
r   Nr   r  r  r  r  r  r  r   z w
z%i J
z%i j
)Nr   z[] 0z%s d
zh
zB
zB*
zf
zf*
zS
r  r  zQ
)ra  r   r  r
   r  r  r  rd  r  r,   r-   r   r.   r0   rc  )re  r   r   r  r  r  r  r  r  r  r  r  r   r  r  r  r  rz   r  r  s                       r&   r  Shape.finish4  s   , >>RA:E]E %%eS1	$$T3/))11"5,w6GDNCC		&&.&J'%/$..@DNA:%1*NNi.77Na<%/$..@DNq=%04>>ADN++%.?DNNNe#N"DONNi'NNNh&N NNe+NNNf,NNNe+NNNf,NNNe#N#e$$1aE!HJJ/uQxzz1IDFF1RB #a.2%C&w'7'7'<=G$..XDN'DNN2U::r'   r   c                 
   [         R                  " U R                  5        U =R                  U R                  -  sl        U R                  R                  5       U l        U R                  (       aq  U(       a  U R                  R                  5         [         R                  R                  U R                  SU5      nU R                  R                  X R                  5        SU l        SU l        SU l        SU l        SU l        g)zUpdate the page's /Contents object with Shape data.

The argument controls whether data appear in foreground (default)
or background.
rk   Nr   )r   rF   r
   rc  rb  r  rX   r  r  r\   rp   rd  r    ra  )re  r   rC   s      r&   r  Shape.commit  s     	DII&$..(..0>>		'')==11$))T7KDHH""48	r'   )r\   ra  r   r`  rd  r
   r_  r    rb  rc  r   r-   r.   T)re  )r   r   Nr   r   NFNTr   r   r   ))__name__
__module____qualname____firstlineno____doc__staticmethodrZ  r   r   rf  ri  r   rp  r  r2  r  r  typingUnionr	   r   r  r  r  r  rm   r  r  r  r  r  rR   OptFloatOptStrr   OptSeqr  r  r  r  __static_attributes__r   r'   r&   rS  rS    s    &W\\ (7*J J 7== D W]]   	
  
.v||Iy,@A gmm 0C* Ce C C00 0 	0
 
0(  HH H 	H
 H 
HT 48 1i 1GMM 1fBi BGMM B 	  	
 
B 	## #
 
#Z #" !)xx S$Y'x
 x x x x x x x x x x x  !x" #x$ %x& 'x( )x* 
+xD "#" !-BB S$Y'B
 B B B B B B B B B B B  !B" #B$ %B& 'B( )B* +B, -B. 
/BL
  !YY Y 	Y
 Y Y Y Y Y Y Y Y Y 
Yvd d  r'   rS  imagesgraphicsc           
      x   S n[         R                  " U 5        U R                  nUR                  (       d  UR                  (       a  [        S5      eUR                  (       d  [        S5      e/ nU R                  [         R                  4S9 H"  nUR                  UR                  5       5        M$     U/ :X  a  gU R                  X1U5      nU(       d  [        S5      eU R                  5       n	U H  n
U
S   nU
S   nU(       a   U	R                  U5        U	R                  XS	9  S
U
R                  5       ;   d  MJ  U
S
   nU
R!                  SS5      nU
S   nU
S   nU
S   nU" XUU5      nSnUS:  d  M  US:  d  M  U	R#                  UUUUUUS9nUS-  nUS:  d  M  US:  a  M)  M     U	R%                  5         g)a  Apply the redaction annotations of the page.

Args:
    page: the PDF page.
    images:
          0 - ignore images
          1 - remove all overlapping images
          2 - blank out overlapping image parts
          3 - remove image unless invisible
    graphics:
          0 - ignore graphics
          1 - remove graphics if contained in rectangle
          2 - remove all overlapping graphics
    text:
          0 - remove text
          1 - ignore text
c                    U(       a  U R                   [        R                  ::  a  U $  [        R                  " XU5      nUS-  nU R                   n[        R                  " XF-  5      U-  nXpR                  :  a  U $ U nU R                  R                  U R                  R                  -   U-
  S-  n	Xl        U$ ! [        [
        R                  4 a%    [        (       a  [        R                  " 5         U s $ f = f)a   Calculate minimal sub-rectangle for the overlay text.

Notes:
    Because 'insert_textbox' supports no vertical text centering,
    we calculate an approximate number of lines here and return a
    sub-rect with smaller height, which should still be sufficient.
Args:
    annot_rect: the annotation rectangle
    new_text: the text to insert.
    font: the fontname. Must be one of the CJK or Base-14 set, else
        the rectangle is returned unchanged.
    fsize: the fontsize
Returns:
    A rectangle to use instead of the annot rectangle.
r*  r   )r   r   r  get_text_lengthr   r   r  r  r  rU  ceilr   r*   r.   r  r   )

annot_rectnew_textr3  fsize
text_widthline_heightr5  hr   r.   s
             r&   center_rect%apply_redactions.<locals>.center_rect  s      :++w>	 00GJ
 ck  IIj()K7!!!]]__z}}.2c9 E--. 	##&&(	s   B: :<C98C9r  r<   )typesFzError applying redactions.r    r  )r  r   r   r  r   r  r  
text_colorrj   r?   )r  r  r   r  r   T)r   rF   rG   r  r  r   rH   rV  PDF_ANNOT_REDACTr   _get_redact_values_apply_redactionsr  r  r  r~  rU   r  r  )r
   r"  r#  r   r.  r\   redact_annotsru  r   shaperedactr(  r  r)  r  r  r*  r   trects                      r&   apply_redactionsr9    s   * D 
++C
3==788::%%M'')   	U5578	 			h	7B566 NNEF^
f~OOJ'LLdL/V[[]"f~HJJw*E:&E:&E<(E
eUCEBq&UaZ))"" *   q&UaZ!  6 
LLNr'   attached_filesclean_pagesembedded_fileshidden_text
javascriptmetadata
redactionsredact_imagesremove_linksreset_fieldsreset_responses
thumbnailsxml_metadatac                    S nU R                   (       d  [        S5      eU R                  (       d  U R                  (       a  [        S5      eU(       d  SnSnU(       a  U R	                  0 5        U  GH  nU
(       a'  UR                  5        H  nUR                  5         M     U	(       a*  UR                  5       nU H  nUR                  U5        M     SnUR                  5        Hv  nUR                  S   [        R                  :X  a  U(       a  UR                  SS9  U(       a  UR                  5         UR                  S   [        R                   :X  d  Mt  SnMx     U(       a  U(       a  UR#                  US	9  U(       d
  U(       d  GM  UR%                  5         UR'                  5       (       d  GME  U(       ad  UR'                  5       S   nU R)                  U5      nU" UR+                  5       5      nU(       a#  S
R-                  U5      nU R/                  UU5        U(       d  GM  U R1                  UR2                  S5      S   S:w  d  GM  U R5                  UR2                  SS5        GM      U(       a(  U R7                  5        H  nU R9                  U5        M     U(       a  U R;                  5         U(       d
  U(       d  SnOU R=                  5       n[?        SU5       H  nU RA                  U5      (       d  SU-  n[        U5      eU(       a/  U R1                  US5      S   S:X  a  SnU RC                  UU5        M_  U(       d  Mh  U R1                  US5      S   S:X  a%  U RC                  US5        U R/                  USSS9  M  U R1                  US5      S   S:w  d  M  U R5                  USS5        M     g )Nc                    / nSnSnSnU  H  nUS:X  a  SnUR                  U5        M  US:X  a  SnUR                  U5        M9  US:X  a  SnSnME  USS S:X  a  US	   S
:w  a  SnUR                  U5        Ml  US:X  a  SnUR                  U5        M  U(       a	  U(       a  M  UR                  U5        M     U(       a  U$ g)a  Remove hidden text from a PDF page.

Args:
    cont_lines: list of lines with /Contents content. Should have status
        from after page.cleanContents().

Returns:
    List of /Contents lines from which hidden text has been removed.

Notes:
    The input must have been created after the page's /Contents object(s)
    have been cleaned with page.cleanContents(). This ensures a standard
    formatting: one command per line, single spaces between operators.
    This allows for drastic simplification of this code.
Fs   BTTs   ETs   3 TrNs   Trr      3   Qr   )
cont_lines	out_linesin_textsuppressmake_returnr   s         r&   remove_hiddenscrub.<locals>.remove_hidden)  s      	Du}  &u}  &w"BCyE!d1go   &t|   &GT"/ 0 r'   r<   zclosed or encrypted docFr   rk   )r  T)r"     
Thumbr  r   z(bad xref %i - clean PDF before scrubbingr%  z/JavaScriptz<</S/JavaScript/JS()>>Typez	/Metadatar  s   deleted)newMetadata)"rH   r   r  r  r  widgetsresetr  delete_linkrV  r   r   PDF_ANNOT_FILE_ATTACHMENTupdate_filedelete_responsesr   r2  r9  clean_contentsrL   xref_streamr  r  rp   r  rC   r  embfile_namesembfile_deldel_xml_metadataxref_lengthr,  xref_objectr  )r\   r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rR  r
   r  r  r  found_redactsru  rC   contrM  r~   
xref_limitr  rK  s                               r&   scrubri    s    /b ::%%
3==233
,,. ) NN$E  &  [[]Ezz!} ? ??N!!!.&&(zz!} 8 88 $ # -!!!7{  ""$$&q)D??4(D&t'89Jzz*-!!$-:		73A6&@  GV<O V %%'DOOD! ( J
__&
a$t$$<tCCS/!#**45a8MI*CdC(D&)!,;dF+dJD9D*-a0F:T:v6) %r'   c                     SnSnU R                   R                  n U(       d  O!US-  nX#R                  -  nUR                  nM)  SU SU 3$ )Nr   r   z
num_spans=z num_chars=)r  headr   r  )r   	num_spans	num_charsspans       r&   _show_fz_textro    s^    
 II??D
Q	XX	yy  	{+i[99r'   r%   posr3  warnright_to_left
small_capsc                 	  ^ ^^^
^%^&^'^( [         R                  " U5      nUR                  (       a  [        S5      e[	        T5      [         R
                  La  [         R
                  " S5      mUUU
4S jm(UUU
4S jm&UUU
U 4S jm%TS-  nT(" S5      nUR                  U-
  m'UR                  U-   nU&4S jnU%U'U(4S	 jnTR                  nTR                  nU(       d  UU-
  S
::  a  SnOUU-
  nOUnTU-  nT'nUb  [         R                  " U5      nOUR                  UTU-  4-   nX1;  a  [        S5      eU[         R                  :X  a  SnOU[         R                  :X  a  SnOSn[	        U5      [        L a  UR                  5       nO*/ nU H"  nUR!                  UR                  5       5        M$     [#        UR$                  UR&                  -
  U-  5      S
-   n/ n/ n[)        U5       GH|  u  nnUS;   aA  UR+                  UU45        UR                  U-
  nUR+                  [-        U5      S
-
  5        MN  US:X  a  UR.                  UR0                  -
  nOUR                  U-
  nU	(       a  T R3                  U5      nT(" U5      nUU::  a2  UR+                  UU45        UR+                  [-        U5      S
-
  5        M  UR5                  S5      nU" T'U5      u  nn[-        U5      n SR7                  USU 5      n [9        USU 5      U[-        USU 5      S
-
  -  -   n!U!U::  a+  UR+                  U U!45        UUS nUUS n[-        U5      nSn OUS
-  n[-        U5      S:X  a  GM}  M     [-        U5      n"U"U:  a7  SUU"4-  n#Uc  O,U(       a  [         R:                  " SU#-   5        O[        U#5      e[         R                  " 5       n$U[-        U5      S
-
  /-  n[=        U5       H  n UR?                  S5      u  nnU	(       a  SR7                  [G        U5      5      nUS:X  a  Un$U[         RH                  :X  a3  UU;  a-  UT':  a'  U" U$U5        UU$l        U$=R&                  U-  sl        M  US:  d  UR0                  U:X  a  U$=R0                  UU-
  U-  -  sl        T%" U$U5        UU$l        U$=R&                  U-  sl        M     U$ ! [@         a$    [B        S:  a  [         RD                  " 5            U$ f = f)a  Fill a rectangle with text.

Args:
    writer: pymupdf.TextWriter object (= "self")
    rect: rect-like to receive the text.
    text: string or list/tuple of strings.
    pos: point-like start position of first word.
    font: pymupdf.Font object (default pymupdf.Font('helv')).
    fontsize: the fontsize.
    lineheight: overwrite the font property
    align: (int) 0 = left, 1 = center, 2 = right, 3 = justify
    warn: (bool) text overflow action: none, warn, or exception
    right_to_left: (bool) indicate right-to-left language.
zfill rect must not empty.r  c                 &   > TR                  U TTS9$ )zReturn length of a string.r  rs  )text_lengthr-   r3  r  rs  s    r&   textlenfill_textbox.<locals>.textlen  s"    Z   
 	
r'   c                 &   > TR                  U TTS9$ )z5Return list of single character lengths for a string.rv  )char_lengthsrx  s    r&   r|  "fill_textbox.<locals>.char_lengths  s      X* MMr'   c                 ,   > TR                  XTTTS9nU$ )N)r3  r  rs  rL  )rp  r   retr3  r  rs  r%   s      r&   append_this!fill_textbox.<locals>.append_this  s&    mmxJ   
r'   g?r   c                 t  > / n/ nU H  nT" U5      n[        U5      nX`::  a$  UR                  U5        UR                  U5        M?  [        U5      nUS:  d  MR  [        USU 5      nX`::  a9  UR                  USU 5        UR                  U5        XGS nXWS n[        U5      nOUS-  nUS:  a  MY  M     X#4$ )z.Cut any word in pieces no longer than 'width'.r   Nr   )r  r   r   )	r   r   r   word_lengthsr   wl_lstwlrb   r|  s	           r&   
norm_words fill_textbox.<locals>.norm_words  s    A!!_FVB{a ##B' FAa%_;MM!BQ%( ''+"A#BZFFAFA a% ( ##r'   c                 ^  > UR                  S5       Vs/ s H  o"S:w  d  M
  UPM     nn[        U5      nUS:X  a  gUS:X  a  T
" XS   5        g[        U Vs/ s H  nT" U5      PM     sn5      nUS-
  nTU-
  U-  nU H!  nT
" X5      u  pU	R                  U-   U l        M#     gs  snf s  snf )zJustified output of a line.r   r   r   Nr   )r  r   r  r-   )startr   r   r   r   r*   gapsgaplr   r  r  	std_widthry  s             r&   output_justify$fill_textbox.<locals>.output_justify  s     !JJsO7OqBwO7UQ;Q;Qx(e,e'!*e,-zB$&A)EAddTkEG  	 8 -s   	B%B%B*r   r*  NzText must start in rectangle.r   r  r   )r   r   zOnly fitting %i of %i lines.z	Warning: re  r   )%r   r   rI   r   r   r,  r   r   r-  r.  rp  r*   TEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTrR   r  r   r   r   r.   r   r   r   r   r-   	clean_rtlr  r  r  r  r,  pop
IndexErrorr  r  reversedTEXT_ALIGN_JUSTIFY))r%   r    r   rp  r3  r  r  r  rq  rr  rs  r   	space_len	std_startr  r  r1  r2  r  
LINEHEIGHTr   factor	textlinesr   	max_lines	new_lines
no_justifyr`   r*   r   r  rb   line0r  r  r  r  r  r|  r  ry  s)   `   ``    `                          @@@@r&   fill_textboxr    s   6 <<D}}455Dz%||F#
N  3II

Y&I)#I$4$ --C
..C9>GCiGG#JE mmC ggHsN33
899 )))	'**	* DzSOO%		DT__./  TWWsuu_
23a7IIJY'49dI./JJ*Es9~136GGceeOEJJ*E##D)DT];dBZ(s9~13 

3 )E:|JHHU2AY'E\"1%&c,r:J6Ka6O)PPBU{  %-ab	+AB/JQ5zQ 5 (\ ^F	,	6/BB<OOK#-.S/!MMOE3y>A%&&J9	 }}Q'HD"
 778D>*D6EG...1J3F2PY>5$'EGGGz!Gq5CEEY&GG
f,,GE4 :1 4 /  	#q(G,B,B,D* /	s   *S

)S87S8c                 (   U R                   (       d  U R                  (       a  [        S5      eU R                  US5      u  p#US:w  d  US;  a  [        SU-  5      eU R                  US5      u  p$US:w  a  g[	        UR                  S	S
5      5      nU$ )zReturn optional content object xref for an image or form xobject.

Args:
    xref: (int) xref number of an image or form xobject.
document close or encryptedSubtyper~   z/Imagez/Formbad object type at xref %iOCrC   r   r  r   )r  r  r   r  r   rz  )r\   rC   r   r~   r   r   s         r&   get_ocr    s     }}((677tY/GAF{d"555<==T4(EAF{	RZZr"	#BIr'   c                    U R                   (       d  U R                  (       a  [        S5      eU R                  US5      u  p4US:w  d  US;  a  [        SU-  5      eUS:  a.  U R                  US5      u  p4US:w  d  US;  a  [        SU-  5      eUS:X  a)  S	U R	                  U5      ;   a  U R                  US	S
5        gU R                  US	SU-  5        g)zAttach optional content object to image or form xobject.

Args:
    xref: (int) xref number of an image or form xobject
    oc: (int) xref number of an OCG or OCMD
r  r  r~   r  r  r   rV  )z/OCGz/OCMDr  r  Nr  )r  r  r   r  xref_get_keysr  )r\   rC   r   r   r~   s        r&   set_ocr    s     }}((677tY/GAF{d"555<==	Av""2v.;$&779B>??	Qw43,,T22tV,T4B/r'   ocgspolicyvec                   ^	^
 [        U R                  5       R                  5       5      m	U	U
4S jm
SnU(       av  [        U5      [        [
        4;   a]  [        U5      R                  T	5      nU[        5       :w  a  SU-  n[        U5      eUSSR                  [        S U5      5      -   S-   -  nU(       a>  [        U5      R                  5       nSS	S
SS.nUS;  a  [        SU-  5      eUSX   -  -  nU(       a  UST
" U5      -  -  nUS-  nUS:X  a  U R                  5       nOSU R                  USS9;  a  [        S5      eU R                  X5        U$ )a  Create or update an OCMD object in a PDF document.

Args:
    xref: (int) 0 for creating a new object, otherwise update existing one.
    ocgs: (list) OCG xref numbers, which shall be subject to 'policy'.
    policy: one of 'AllOn', 'AllOff', 'AnyOn', 'AnyOff' (any casing).
    ve: (list) visibility expression. Use instead of 'ocgs' with 'policy'.

Returns:
    Xref of the created or updated OCMD.
c                   > [        U 5      [        [        4;  d  [        U 5      S:  a  [	        SU -  5      eU S   R                  5       S;  a  [	        SU S   -  5      eU S   R                  5       S:X  a  [        U 5      S:w  a  [	        SU -  5      eSU S   R                  5       -  nU SS   HA  n[        U5      [        L a  UT;  a  [	        S	U-  5      eUS
U-  -  nM3  UST" U5      -  -  nMC     US-  nU$ )Nre  zbad 've' format: %sr   )andornotzbad operand: %sr  z[/%sr   z
bad OCG %iz %i 0 Rz %sr  )r   r2  r3  r   r   rG  r  r   )r  r/  r-   all_ocgsve_makers      r&   r  set_ocmd.<locals>.ve_maker  s    8D%=(CGaK2R788a5;;= 44.A677a5;;=E!c"gl2R7881%ABAAw#~H$$\A%566	A%++  	r'   z<</Type/OCMDzbad OCGs: %s/OCGs[r   c                     SU -  $ )Nr  r   r  s    r&   r   set_ocmd.<locals>.<lambda>  s    (Q,r'   r  AnyOnAllOnAnyOffAllOff)anyonallonanyoffalloffzbad policy: %sz/P/%sz/VE%sr	  r   
/Type/OCMDT
compressedzbad xref or not an OCMD)r  get_ocgsr~  r   r2  r3  r  r   r  r  rR   rG  r  re  r  )r\   rC   r  r  r  r   r  r  polsr  r  s            @@r&   set_ocmdr    sQ   & 3<<>&&()H$ DT
tUm+I  *: 1$CS/!388C(>$EFFLLV""$	
 ??-677$,&&	(2,&&DLD qy!	S__Td_C	C233d!Kr'   c                    U[        U R                  5       5      ;  a  [        S5      eU R                  USS9nSU;  a  [        S5      e[	        U5      nUR                  S5      nUR                  SU5      nUS:  d  US:  a  S	nO>X$S
-   U R                  SS5      R                  5       n[        [        [        U5      5      nUR                  S5      nUS:  a  S	nOEUR                  SU5      nUS:  a  UR                  SU5      nUS:  a  [        S5      eX$S-   US-    nUR                  S5      nUS:  a  S	nOS=pUnU	S:  d  X:w  a>  US-  nXS:  d  [        S5      eX%   S:X  a  U	S-  n	X%   S:X  a  U
S-  n
U	S:  a  M7  X:w  a  M>  X$S-   US-    nUR                  SS5      R                  SS5      R                  SS5      nUR                  SS5      R                  SS5      R                  SS 5      nSS	Kn UR                  U5      nXXxS".$ ! [         a1    [        R                  " 5         [        R                   " S!U< 35        e f = f)#a`  Return the definition of an OCMD (optional content membership dictionary).

Recognizes PDF dict keys /OCGs (PDF array of OCGs), /P (policy string) and
/VE (visibility expression, PDF array). Via string manipulation, this
info is converted to a Python dictionary with keys "xref", "ocgs", "policy"
and "ve" - ready to recycle as input for 'set_ocmd()'.
zbad xrefTr  r  zbad object typer  r  r   Nr  r  r   z/P/ffonzbad object at xrefr   re  z/VE[r   [z/Andz"and",z/Notz"not",z/Orz"or",z 0 R] 0 R,z][z],[zbad /VE key: )rC   r  r  r  )r,  rd  r   re  r   findrz  r  r2  r  r   r;  loadsro  r   r  r  )r\   rC   r   ry  p0r   r  r  r  r  rpr;  s               r&   get_ocmdr    sX    5*++$$??4D?1D4*++$iG	8	B	3	B	AvaFR ((4::<CTN#	5	B	AvYYtR 64$B6122q&26*F	6	B	Av1f!GB< !566x3ax3a 1f q&26"JJvx(WVX&WUG$ 	
 ZZ%--fc:BB4O	BB
 &CC	  	""$OOmB623	s   ?H ;Ic                    U u  pUSS R                  S5      SS nUSSS.nSn[        U5       H  u  pPU(       a  SnM  U S	:X  a  X%S-      US
'   SnM$  U R                  S5      (       a+  U SS R                  SS5      R                  SS5      nXcS'   Me  U R                  S5      (       d  M}  [	        U SS 5      nXcS'   M     U$ )a  Make a Python dict from a PDF page label rule.

Args:
    item -- a tuple (pno, rule) with the start page number and the rule
            string like <</S/D...>>.
Returns:
    A dict like
    {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
re  rI  ri  r   Nr   )	startpageprefixfirstpagenumFr%  styleTr=  ()r  Str  )r  r   r  rz  r   )r/  r[   ruler  skipr`   r-   s          r&   	rule_dictr  p  s     IC":C $DR;ADT?D3;!eAgJD??3QR  b)11#r:AhK??4  DHA !n # Hr'   c                     U Vs/ s H  o"S   U ::  d  M  UPM     snS   n[        U5      nUR                  SS5      nUR                  SS5      nUS;   a  SOSnXS   -
  US   -   U-   n[        XeU5      $ s  snf )	zReturn the label for this page number.

Args:
    pgNo: page number, 0-based.
    labels: result of doc._get_page_labels().
Returns:
    The label (str) of the page number. Errors return an empty string.
r   rj   r  r   r  )r  Ar  r  )r  rU   construct_label)	pgNolabelsr-   r/  r  r  r  r!  
pagenumbers	            r&   get_label_pnor    s     .v!1Av.r2DT?DXXh#FHHWb!E:%B1E[))D,@@5HJ5*55 /s
   A6A6c                     U R                   R                  5       nU(       d  gUR                  5         [        U R                  U5      $ )zReturn the label for this PDF page.

Args:
    page: page object.
Returns:
    The label (str) of the page. Errors return an empty string.
r   )rG   _get_page_labelsr   r  rO   )r
   r  s     r&   	get_labelr    s6     [[))+F
KKMf--r'   c                     / nU(       d  U$ U R                  5       nU/ :X  a  U$ [        U R                  5       H0  n[        XT5      nXa:X  d  M  UR	                  U5        U(       d  M/    U$    U$ )zReturn a list of page numbers with the given label.

Args:
    doc: PDF document object (resp. 'self').
    label: (str) label.
    only_one: (bool) stop searching after first hit.
Returns:
    List of page numbers having this label.
)r  r,  rK   r  r   )r\   labelonly_onenumbersr  r`   plabels          r&   get_page_numbersr    sm     G!!#F|3>>"q)?NN1xN # Nr'   c                 4   SnU S:X  a  [        U5      nOU S:X  a  [        U5      R                  5       nO_U S:X  a  [        U5      R                  5       nO?U S:X  a  [	        U5      R                  5       nOU S:X  a  [	        U5      R                  5       nX-   nU$ )z9Construct a label based on style, prefix and page number.r   Dr   r  r  r  )rR   integerToRomanrG  rZ  integerToLetter)r  r  r[   n_strresults        r&   r  r    s     E|C	#s#))+	#s#))+	#$**,	#$**,^FMr'   c           
      d   SSK nUR                  nSU pC[        SU5      U::  a:  U[        [        R                  " SU5      5      -  nUS-  n[        SU5      U::  a  M:  Sn[        [        U5      5       H8  n[        U[        [        R                  " SU5      5      5      u  pxXRU   -  nUnM:     U$ )z-Returns letter sequence string for integer i.r   Nr   r  r   )stringascii_uppercasepowr   rU  r  r,  divmod)	r`   r  lsrb   r  str_tr  r  r  s	            r&   r  r    s     			Baq
b!*/	S"a!!	Q b!*/ EeAhaTXXb!_-.A   Lr'   numc                 l   ^ SmU4S jnSR                  U" U 5       Vs/ s H  o"PM     sn5      $ s  snf )z$Return roman numeral for an integer.))i  M)i  CM)i  r  )i  CD)r  rX  )r   XC)r  L)(   XL)r  X)	   IX)r   r  )r?   IV)r   Ic              3   h   >#    T H'  u  p[        X5      u  p4X#-  v   XU-  -  n U S::  d  M'    g    g 7fr   )r  )r  r   ltrr-   r   romans        r&   	roman_num!integerToRoman.<locals>.roman_num  s9     FA#>DA'Mq5LCax s   &22r   )r  )r  r
  r  r	  s      @r&   r  r    s6    E  77y~.~!A~.//.s   1c                 `    U R                  5        Vs/ s H  n[        U5      PM     sn$ s  snf )zReturn page label definitions in PDF document.

Args:
    doc: PDF document (resp. 'self').
Returns:
    A list of dictionaries with the following format:
    {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
)r  r  )r\   r/  s     r&   get_page_labelsr    s+     ),(<(<(>?(>IdO(>???s   +c                 F   ^ S mU4S jnU R                  U" U5      5        g)a   Add / replace page label definitions in PDF document.

Args:
    doc: PDF document (resp. 'self').
    labels: list of label dictionaries like:
    {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int},
    as returned by get_page_labels().
c                     SU S   -  nU R                  SS5      S:w  a  USU S   -  -  nU R                  SS5      S:w  a  USU S   -  -  nU R                  SS	5      S	:  a  US
U S   -  -  nUS-  nU$ )zConvert Python label dict to corresponding PDF rule string.

Args:
    label: (dict) build rule for the label.
Returns:
    PDF label rule string wrapped in "<<", ">>".
z%i<<r  r  r   z/P(%s)r  z/S/%sr  r   z/St %ir	  )rU   )r  r  s     r&   create_label_str)set_page_labels.<locals>.create_label_str/  s     U;''99Xr"b(E(O++A99Wb!R'5>))A99^Q'!+E.111A	T	r'   c                    > U R                  S S9  SR                  U  Vs/ s H  nT" U5      PM     sn5      nU$ s  snf )zReturn concatenated string of all labels rules.

Args:
    labels: (list) dictionaries as created by function 'rule_dict'.
Returns:
    PDF compatible string for page label definitions, ready to be
    enclosed in PDF array 'Nums[...]'.
c                     U S   $ )Nr  r   r  s    r&   r   6set_page_labels.<locals>.create_nums.<locals>.<lambda>J  s    !K.r'   r   r   )r   r  )r  r  r  r  s      r&   create_nums$set_page_labels.<locals>.create_numsA  sB     	01GG&A&%e,&AB Bs   <N)_set_page_labels)r\   r  r  r  s      @r&   set_page_labelsr  $  s"    $ V,-r'   c                    U R                   (       a  [        S5      eU R                  (       d  [        S5      e[        U R                  5       H5  nU R                  U5       H  nUS   [        R                  :X  d  M      g   M7     g)z*Check whether there are links on any page.r  r<   r   TF)r  r   rH   r,  rK   page_annot_xrefsr   r  r\   r`   r/  s      r&   	has_linksr  T  si    
}}*++::%%3>>"((+DAw'000 , # r'   c                 B   U R                   (       a  [        S5      eU R                  (       d  [        S5      e[        U R                  5       HN  nU R                  U5       H6  nUS   [        R                  :X  a  M  US   [        R                  :X  a  M5      g   MP     g)z0Check whether there are annotations on any page.r  r<   r   TF)	r  r   rH   r,  rK   r  r   r  rM  r  s      r&   
has_annotsr  a  sz    
}}*++::%%3>>"((+DGw555aGD\D\9\ , #
 r'   line_dirrn  r  c                 b   U c  US   n U u  p4[         R                  " U5      n[         R                  R                  5       (       a  SnOUS   US   -
  nXQS   -  nXd-  nXc-  nUS:  aK  US::  aE  UR                  SU4-
  n	UR
                  US4-   n
UR                  US4-
  nUR
                  SU4-   nOUS::  aK  US::  aE  UR                  US4-   n	UR                  SU4-
  n
UR                  SU4-   nUR                  US4-
  nOUS::  aK  US:  aE  UR
                  SU4-
  n	UR                  US4-   n
UR
                  US4-
  nUR                  SU4-   nODUR                  US4-   n	UR                  SU4-
  n
UR                  SU4-   nUR                  US4-
  n[         R                  " XX5      $ )ao  Compute the quad located inside the bbox.

The bbox may be any of the resp. tuples occurring inside the given span.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line or None.
    span: (dict) the span. May be from get_texttrace() method.
    bbox: (tuple) the bbox of the span or any of its characters.
Returns:
    The quad which is wrapped by the bbox.
dirr   r-  r.  sizer   )	r   r   r  set_small_glyph_heightsr  r2   r+   r*   r  )r  rn  r  r  r  r  r   hshcrw  rx  rz  ry  s                r&   recover_bbox_quadr&  r  s    ;HC<<D}},,..tK00fF 
B	B	Qw27WW2wWWAwWWAwWW2w	qR1WWWAwWW2wWW2wWWAw	qR1WWW2wWWAwWWAwWW2wWWAwWW2wWW2wWWAw<<''r'   c                     [        U 5      [        Ld  [        U 5      S:w  a  [        S5      e[        U5      [        La  [        S5      e[        XUS   5      $ )zRecover the quadrilateral of a text span.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line.
    span: the span.
Returns:
    The quadrilateral enveloping the span's text.
re  bad line dir argumentbad span argumentr  )r   r3  r   r   r  r&  )r  rn  s     r&   recover_quadr*    sP     H~U"c(mq&8011Dz,--XT&\::r'   r   spansc           	      2   Uc  U S   n[        U5      S:X  a  [        S5      eU S   nUu  p4[        X!S   5      n[        U5      S:  a  [        X!S   5      nOUnUR                  nUR                  n[
        R                  " Xx5      n	X-  n
[
        R                  R                  5       n[        U Vs/ s H  oS   U(       a  SO
US   US	   -
  -  PM     sn5      n[
        R                  " SU* U
R                  S5      nUR                  nX) -  nU$ s  snf )
a  Calculate the line quad for 'dict' / 'rawdict' text extractions.

The lower quad points are those of the first, resp. last span quad.
The upper points are determined by the maximum span quad height.
From this, compute a rect with bottom-left in (0, 0), convert this to a
quad and rotate and shift back to cover the text of the spans.

Args:
    spans: (list, optional) sub-list of spans to consider.
Returns:
    pymupdf.Quad covering selected spans.
r+  r   zbad span listr!  r   rj   r"  r-  r.  )r   r   r*  rz  ry  r   planish_liner  r#  r   r   r-   r  )r   r+  r  r  r  q0r  line_llline_lrmat0x_lrsmallr  r-  	line_rect	line_quads                   r&   recover_line_quadr6    s    }W
5zQ))E{HHC	ha	)B
5zA~("I.eeGeeG1D >DMM113EQVWQVA65aq}q~'E	GQVW	A QDFFA.III 	Xs   3#Dcharsc                    U c  US   n Uc  [        X5      $ SUR                  5       ;  a  [        S5      e[        XUS   5      n[	        U5      S:  a  [        XUS   5      nOUnUR
                  nUR                  n[        R                  " XV5      nXg-  n[        R                  R                  5       n	US   U	(       a  SO
US   US	   -
  -  n
[        R                  " SU
* UR                  S5      nUR                  nX) -  nU$ )
a*  Calculate the span quad for 'dict' / 'rawdict' text extractions.

Notes:
    There are two execution paths:
    1. For the full span quad, the result of 'recover_quad' is returned.
    2. For the quad of a sub-list of characters, the char quads are
       computed and joined. This is only supported for the "rawdict"
       extraction option.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line.
    span: (dict) the span.
    chars: (list, optional) sub-list of characters to consider.
Returns:
    pymupdf.Quad covering selected characters.
r!  r7  z)need 'rawdict' option to sub-select charsr   r   rj   r"  r-  r.  )r*  r~  r   recover_char_quadr   rz  ry  r   r-  r  r#  r   r-   r  )r  rn  r7  r.  r  span_llspan_lrr1  r2  r3  r-  	span_rect	span_quads                r&   recover_span_quadr>    s    " ;}H++diik!DEE	858	4B
5zA~xuRy9eeGeeG1D>DMM113EVUj)9D<M)MOAQDFFA.IIIr'   charc                    U c  US   n [        U 5      [        Ld  [        U 5      S:w  a  [        S5      e[        U5      [        La  [        S5      e[        U5      [        L a  [
        R                  " US   5      nO7[        U5      [        L a  [
        R                  " US   5      nO[        S5      e[        XU5      $ )a$  Recover the quadrilateral of a text character.

This requires the "rawdict" option of text extraction.

Args:
    line_dir: (tuple) 'line["dir"]' of the span's line.
    span: (dict) the span dict.
    char: (dict) the character dict.
Returns:
    The quadrilateral enveloping the character.
r!  re  r(  r)  r  r   )r   r3  r   r   r  r   r   r&  )r  rn  r?  r  s       r&   r9  r9    s     ;H~U"c(mq&8011Dz,--DzT||DL)	du	||DG$,--XT22r'   verbosefallbackc                   ^ ^ U(       dJ  [         R                  " T 5      n[         R                  " U[        [	        T R
                  5      5      5        g0 mU 4S jnU 4S jnU 4S jnS nU4S jnU4S jn	U" T 5        T(       d  U(       a  [        R                  " S5        g	S	n
S	nTR                  5        H  nU
[        U5      -  n
M     T  H  nUR                  5        Hv  n[        U5      [        La  M  US
   SS nU	" U5      nUc  M,  TU   u  nnu  nnUS    H+  nUR                  US	   5        UR                  US   5        M-     UUUU44TU'   Mx     M     TR                  5        GH  u  nu  nnnU" UUS	   US   5      n[        U5      S	   nUb  [        U5      [        U5      :  a$  U(       a  [        R                  " SU< S35        Mh  U(       a  [        R                  " SU< S35        T R                  US9nUS	   nU" U5        T R!                  USS9nU H:  nU" U5      u  nnT R#                  UU5        U(       d	  U(       d  M0  U" UUU5        M<     U[        U5      -  nGM     X-
  $ )a4  Build font subsets in a PDF.

Eligible fonts are potentially replaced by smaller versions. Page text is
NOT rewritten and thus should retain properties like being hidden or
controlled by optional content.

This method by default uses MuPDF's own internal feature to create subset
fonts. As this is a new function, errors may still occur. In this case,
please fall back to using the previous version by using "fallback=True".
Fallback mode requires the external package 'fontTools'.

Args:
    fallback: use the older deprecated implementation.
    verbose: only used by fallback mode.

Returns:
    The new MuPDF-based code returns None.  The deprecated fallback
    mode returns 0 if there are no fonts to subset.  Otherwise, it
    returns the decrease in fontsize (the difference in fontsize),
    measured in bytes.
Nc                   > TR                  U S5      nUS   S:w  a  g[        US   SS R                  SS5      5      nTR                  US	5      nUS   S:w  a  S
nOUS   nTR                  US5      nUS   S:w  a  S
nX44$ US   nX44$ )z(Retrieve old font '/W' and '/DW' values.DescendantFontsr   arrayNNr   rj   r  r   WNDWr   )r  r   rz  )rC   dfdf_xrefwidthsdwidthsr\   s        r&   get_old_widths$subset_fonts.<locals>.get_old_widthsP  s    d$56a5GbeAbk))%45!!'3/!9FAYF""7D11:G  ajGr'   c                   > TR                  U S5      nUS   S:w  a  g[        US   SS R                  SS5      5      n[        U5      [        Ld  U(       d-  TR                  US	5      S   S
:w  a  TR                  US	S
5        OTR                  US	U5        [        U5      [        Ld  U(       d-  TR                  US5      S   S
:w  a  TR                  USS
5        gTR                  USU5        g)zRestore the old '/W' and '/DW' in subsetted font.

If either parameter is None or evaluates to False, the corresponding
dictionary key will be set to null.
rE  r   rF  Nr   rj   r  r   rH  r  rI  )r  r   rz  r   rR   r  )rC   rL  rM  rJ  rK  r\   s        r&   set_old_widths$subset_fonts.<locals>.set_old_widthsb  s     d$56a5GbeAbk))%45L#6s7G7GQT7U8
8 Wc62Wc62M$G9I9IT:

:: WdF3  WdG4r'   c                 B  > SSK nSSKnSR                  UR                  [	        UR
                  5      SS95      S-   nT
R                  U SS9nUR                  S	S	U-   5      nT
R                  U S
5      nUS   S:X  a  [        US   SS R                  SS5      5      nT
R                  US5      nUS   S:X  aT  [        US   R                  SS5      5      nT
R                  USS9n	U	R                  SSU-   5      n	T
R                  X5        T
R                  X5        g)zGenerate a name prefix to tag a font as subset.

We use a random generator to select 6 upper case ASCII characters.
The prefixed name must be put in the font xref as the "/BaseFont" value
and in the FontDescriptor object as the '/FontName' value.
r   Nr   r  )r  +Tr  z
/BaseFont/rE  rF  r   rj   r  FontDescriptorrC   z
/FontName/)randomr  r  choicesr3  r  re  rz  r  r   r  )rq   rV  r  r  font_strrJ  rK  fdfd_xreffd_strr\   s             r&   set_subset_fontname)subset_fonts.<locals>.set_subset_fontnamez  s    	f.D.D(EKLsR??8?=##L,2GHh(9:a5G"Q%"+--eR89G!!'+;<B!ubemmE267TBlV6KL!!'2(-r'   c           	      X    SSK Jn  SSKnUR                  5        nU S3nU S3nU S3nUSSU 3S	S
SSS/n	[        U S3SSS9 n
SU;   aN  U	R                  SU 35        UR                  S5        [        U5      nU H  nU
R                  SU-  5        M     OMU	R                  SU 35        UR                  S5        [        U5      nU H  nU
R                  SU-  5        M     SSS5        [        US5       nUR                  U 5        SSS5         [        R                  " U5         UR#                  U	5        [        R$                  " US9nUR&                  nUR(                  S:X  a  SnSSS5        U$ ! [         a8    [        (       a  [        R
                  " 5         [        R                  " S5        e f = f! , (       d  f       N= f! , (       d  f       N= f! [          a     Nf = f! [          a    [        R
                  " 5         Sn Nf = f! , (       d  f       W$ = f)zBuild font subset using fontTools.

Args:
    buffer: (bytes) the font given as a binary buffer.
    unc_set: (set) required glyph ids.
Returns:
    Either None if subsetting is unsuccessful or the subset font buffer.
r   Nz/This method requires fontTools to be installed.z/oldfont.ttfz/newfont.ttfz/uncfile.txtz--retain-gidsz--output-file=z--layout-features=*z--passthrough-tablesz--ignore-missing-glyphsz--ignore-missing-unicodesz--symbol-cmapr   utf8)r  i  z--gids-file=r  z%i
z--unicodes-file=r  z%04x
wb)r  )fontTools.subsetsubsetImportErrorr  r   r  r  tempfileTemporaryDirectoryopenr   addr2  writer   removero  mainr,  r  glyph_count)r  unc_setgid_setftsrd  tmp_diroldfont_pathnewfont_pathuncfile_pathr  unc_fileunc_listuncr  r3  
new_buffers                   r&   build_subset"subset_fonts.<locals>.build_subset  s   	*
 	((*g%Yl3L%Yl3L%Yl3L /%&)+	D 	.fEW$KK,|n =>KK$#G}H' v|4  ( KK"2<. ABKK$#G}H' x#~6  ( F lD)Xv& *		,'"||\:![[
##q(!%JU +\ g  	##(>(>(@OOMN	* FE *)    "&&(!
"W +*\ s   E< +HB"G)H=GHG#/AG3<AF>
G	H
G 	H#
G0-H/G00H3!HHHH
H)c           
      Z  >^ S mU4S jn[        U R                  5       GH  nU R                  USS9 H  nUS   nUS   nUS   nUS;  a  M  [        U5      S	:  a  US	   S
:X  a  M4  U R	                  U5      nUS   nU" X5      n	TR                  U[        5       [        5       [        5       [        5       445      u  pnUR                  U5        U	 H  nU
R                  U5        M     [        R                  " US9nU
R                  UR                  5        AXU4TU'   M     GM	     g)zPopulate 'font_buffers'.

For each font candidate, store its xref and the list of names
by which PDF text may refer to it (there may be multiple).
c                     SU ;   aM  U R                  S5      n[        XS-   US-    S5      nU R                  XUS-    [        U5      5      n SU ;   a  MM  U $ )zLRecreate font name that contains PDF hex codes.

E.g. #20 -> space, chr(32)
#r   r   r  )r  r   rz  chr)r~   rt  r  s      r&   	norm_name7subset_fonts.<locals>.repl_fontnames.<locals>.norm_name  s]    
 +IIcNUQU+R0||DQUOSV< + Kr'   c                 H  > US   nU/nU R                  US   S5      S   SS nT" U5      nX#;  a  UR                  U5        U R                  US   S5      nUS   S:w  a  U$ US   SS nUR                  S	5      (       a  [        USS
 5      nU R	                  USS9nUR                  S5      nUS:  al  UR                  SUS-   5      n[        UR                  SUS-   5      UR                  SUS-   5      5      nXGS-   U nT" U5      nX#;  a  UR                  U5        U$ )zoReturn a list of fontnames for an item of page.get_fonts().

There may be multiple names e.g. for Type0 fonts.
r   r   BaseFontr   NrE  rF  rj   r  Tr  z	/BaseFontri  r	  )r  r   r  r   re  r  r/   )	r\   r/  r  namesdescendentsrC   r   r   r}  s	           r&   get_fontnames;subset_fonts.<locals>.repl_fontnames.<locals>.get_fontnames  sJ   
 AwHJE''Q<Q?CH *H$X&**474EFK1~(%a.2.K##F++;s+,!oodtoD!!+.BQw %%c262))#rAv68H8HrTUv8VW&Av3$X.(LL*Lr'   T)r   r   r   r   )otfttfwoffwoff2r  rT  rj   r(  N)r,  rK   rQ   r   r+  rU   r  rg  r   r,  r~   )r\   r  r`   r  	font_xreffont_extbasenameextrr)  r  name_setxref_setsubsetsr~   r3  r}  font_bufferss                  @r&   repl_fontnames$subset_fonts.<locals>.repl_fontnames  s'   			8 s~~&A'''5aD	Q4Q4 $  x=1$!);''	2!"X
%c-.:.>.>su~ >/+G Y'!DLL& "||z:TYY',4+HZ(9 6 'r'   c                 T   > TR                  5        H  u  nu  n  nX;   d  M  Us  $    g r  )r  )r~   r  r  r   r  s       r&   find_buffer_by_name)subset_fonts.<locals>.find_buffer_by_name  s2    (4(:(:(<$F$Xq! )= r'   zNo fonts to subset.r   r3  r  r7  r   zCannot subset rb  zBuilt subset of font r(  Tr  )r   r3  pdf_subset_fonts2r2  r,  rK   r   r  r~  r   get_texttracer   r  rg  r  _insert_fontre  r  ) r\   rA  rB  r   rN  rQ  r\  rw  r  r  old_fontsizenew_fontsizer)  r
   rn  r  r  r  r  set_ucsset_gidr  
old_bufferr  rv  r  rq   rX  r  width_table	def_widthr  s    `                              @r&   subset_fontsr  -  s   8 11#6T%*?%@AL$0.0>@KIZ 3OO13LL"'')
J' *  &&(DDz%F|CR(H(2F~5A&5I2Hh 2'']AaD!AaD! # %-h'8J#KL  ) " 6B5G5G5I1
1Xx!*gaj'!*E
>!$ZC
O!C.A >?OO3H<qAB*5q6H%?? # 

 "I%3I%>"Ki2iiy+yA " 	J'9 6J< &&r'   )r3   sourcetargetr3   c                ^   U R                  U5      (       a#  U R                  U5      nU R                  UUSSS9  Uc  / nU R                  U5       H  nXS;   a  M
  U R	                  X%S5        M     U R                  U5       H)  nU R                  X5      nU R	                  X%US   5        M+     g)a  Copy a PDF dictionary object to another one given their xref numbers.

Args:
    doc: PDF document object
    source: source xref number
    target: target xref number, the xref must already exist
    keep: an optional list of 1st level keys in target that should not be
          removed before copying.
Notes:
    This works similar to the copy() method of dictionaries in Python. The
    source may be a stream object.
FT)r   rW  Nr  r   )xref_is_streamxref_stream_rawrp   r  r  r  )r\   r  r  r3   rh   r   r/  s          r&   ro   ro   i  s     &!!$$V,	 	 	
 |  (;f- )
   (,d1g. )r'   )NNTNNTr   r   )r   TTr   r   N)NNNF)NNNFNr   )NNNr   r  rG  )r   engr   FN)FF)F)r   NNNFNr   )r   NNNFr  )NNNNNNNr   )r   r  )rj   S  J  )Nr  r  r  r  Nr  )
r  Nr   r   r   TNr   r   r   )re  r  Nr   r   r   TNr   r   r   )r  NNr   r   r   NTr   r   r   N)r  NNr   r   r   NTr   r   r   )r  NNr   Nr   r   TFr   r   r   )r  NNNr   r   r   Tr   r   r   )r  NNr   NFr   r   Tr   r   r   )r  NNTNr   Fr   r   Tr   r   r   )rG  r   N)re  r   r   )TTTTTTTr   TTTTT)NNr  Nr   NFF)r   NNN)r   rU  r   r  r  r   r   ro  r   format_gr  r  r   r   r   r	   AnyAnyTyper  r   OptIntOptionalr  r  rR   r  r  OptDict
ByteStringOptBytesSequencer   r   r   r!   rs   ry   rn   r   TEXT_PRESERVE_WHITESPACETEXT_PRESERVE_LIGATURESTEXT_MEDIABOX_CLIPr2  r   r   rm   TextPager   r   r   r   r   r   r#  r0  r7  r  rS  r  r  
Colorspaceru   r   r`  r  r  r  r  r  r  r  r  r,  rf  r  r  Widgetr  r  r  r  r  r  r   r  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r  r&  r4  rQ  rS  r9  ri  ro  r   r,  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r*  r6  r>  r9  r  ro   r   r'   r&   <module>r     s   
  	   	33 
		
**	c4i	 ??5!		
//$
??6,,-		) 1ll1 1p | |~ >B$W[ 0 0C 0>)w|| )3 )$ zB &&../--. (()
 $ $V ))--.../ (()
 "& 			 	    	 
       
 J !%
,,
  	
  
H !%L
,,L
L L 	L
 L 
Lb !%r
,,r
r r 	r 	rp "&
,,
  		( !%
,, 	 	
 * Q
,,QQ Q 
	Q
 Q Q Qh# #t #D #UY #L"',, "$ "N !%i
,,ii i 	i
 i i^ !%H			H	H H 	H
 H H H ZZH0 $,,'.}}'ll' '
 &&' ' ' ' ^^'\ "**%,]]				 	 ""    ^^@8d 8vGLL T : 4			44 
4n				 
 jF			jF	jF jF 	jF
 
jF 
jF jF 	jF jF jF 
jFZ	(u 	(;g&& ;4 ;4 ;|7S 7 7# 7z }			}	} } 		}H z<			z<			z< 	z<
 z< z< 
z<@ w<


w<


w< w< 	w<
 w< 
w<vPgll P P# Pf gnn  =gll = =$ =(gll ( (T (T ( /F
,,F
F LLd#F
 F F F F F F F F F F F  !F" #F$ %F& 'F( )F* +F, -F. 	/F0 1F\ +/
,,// ,,sDy
!/
 / / / / / / / / / / /  !/" #/$ %/& '/( )/* 	+/n 	} }D 					  	
 \\, +/				 ,,sD$
' 	
      	F  
,,   	  	 
                 ]] N !
,,!! 	! 	!
 ! ! ! ! ! ! ! ! ! 	! ]]!P !
,,!! 	! 	!
 ! ! ! ! ! ! ! ! ! 	! ]]!N  !#ll## # 	#
 # # # # # # # # # ]]#R  
,, 
    	 
                 	  ]] L "
,,"" " 	"
 " " " " " " " " " 	" ]]"R  
,,     	 
                   	  ]] L  
,, 
,,y)+
,    	 
                 	  ]] P !$
,,$$ 	$ 		$
 $ $ $ $ $ $ $ $ $ $ $  	!$" ]]#$Z #%
,,%% 	% 		%
 	% % % % % % % % % % %  !%" 	#%$ ]]%%Z #,
,,,, , 	,
 , , , , , , , , , , ,  !," 	#,$ ]]%,z.d .h$ hV$ 3 5 $c $e $N"*g.. "*c "*e "*L [__			_!$_-0_=@_PW_	_D[ [~ IJj
,,j #j36jBEj	jf   V7			V7V7 V7 	V7
 V7 V7 V7 V7 V7 V7 V7 V7 V7 V7 
V7r:( *.__
_ ,,sDy
!_ 
	_
 //',,
'_ _ _ _ _ _ _ _J     $      2 %)#'G			G
G ,,tTz
"G 	G
 	T4Z G 	GTAD'"" AD# AD$ ADH$D6*."63 &# $0 0 0>
@*.`
7## 
 
G$$  "/( /(T /( /(7<< /(d;5 ; ; ; *D * * *Z* *T *$ *',, *Z3 3T 3 3',, 3>v'g&& v' v' v'Z` v'x	 PT !/7## !/S !/# !/ !/X\ !/qz    s"   q q 
qq
q"!q"