
    9i                    (   % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKr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rSSSSSSSSSSS.
S jr\" \R0                  R3                  S5      \R4                  S9q\" \R0                  R3                  S	5      \R4                  S9q\" 5       rS
qS r S r!S r"SSSSSSSSSS.	S jr#SSSSSSSSSS.	S jr$GS_S jr%GS`S jr&S r'\(" \RR                  S-   \*" S5      -   5      r+S r,S r-\-" SS5      r.\," SS5      r/ " S S5      r0\0" 5       r1Sr2\Rf                  \Rh                     \5S'   Sq6S r7S r8\R0                  R3                  S 5      r9\9b  \%" \: S!\9< S"35        \%" \: S#\R0                  S$    35        \9S:X  a  SSK9r9O.SSKr\Rv                  Ry                  S%\95      R{                  5       r9\9R|                  R~                  R                  r@O7 SS&KJ@r@  \B" \@S'5      (       a  \@R                  " 5         \@R                  " 5         S( rESS)KFJGrG  SS*KFJHrH  SS+KFJIrI  SS,KFJJrJ  SS-KFJKrK  SS.KFJLrL  SS/KFJMrM  SS0KFJNrN  \@R                  rPSrQ\R" \PR                  S15       V s/ s H  n \E" U 5      PM     sn 5      rT\T\@R                  \@R                  \@R                  4:X  d0   S2\T< S3\@R                  \@R                  \@R                  4< 35       e\K\PS4rX\PrY\KrZSr[S4S5.S6 jr\\\r] \R                  r^\Rf                  \^   rc\Rf                  \d   re\Rf                  \f   rg\R                  \iS4   rj\Rf                  \R                     rl\Rf                  \m   rnS7roS8rpS9rqS:rrS;rsS<rtS= ruGSaS> jrvS? rwGSaS@ jrxSA rySrz " SB SC5      r{ " SD SE5      r| " SF SG5      r} " SH SI5      r~ " SJ SK5      r " SL SM5      r\/(       a  \GR                  r " SN SO5      r\r " SP SQ5      r " SR SS5      r " ST SU5      r " SV SW5      r " SX SY5      r " SZ S[\5      r\" 5       r " S\ S]5      r " S^ S_5      rSS`KJr   " Sa Sb5      r      GSbSc jr " Sd Se5      ro " Sf Sg5      rCp " Sh Si5      rp " Sj Sk5      r " Sl Sm5      r " Sn So5      r " Sp Sq5      r " Sr Ss5      r " St Su5      r " Sv Sw5      r \GR2                  \   r \@GR8                  GR;                  5        HB  u  rr\GRA                  Sx5      (       d  M  \GRA                  Sy5      (       a  M8  \" \\\5        MD     S\@GRF                  -  \@GRH                  -  \@GRJ                  -  \@GRL                  -  \@GRN                  -  \@GRP                  -  r\@GRT                  S:X  d   e\\@GRV                  :X  d   e\\@GRX                  :X  d   eCCC\GRZ                  rSzr0 r\ H  r\\\GRe                  5       '   M     S{\S|'   S}\S~'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   SrSrSrSrSq/ qSqSq\@GRv                  r\@GRx                  r\@GRz                  r\@GR|                  r\@GR~                  r\@GR                  r\@GR                  r\@GR                  rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr\@GR                  r\@GR                  r\@GR                  r\@GR                  r\@GR                  r\@GR                  r\@GR                  r\@GR                  Gr \@GR                  Gr\@GR                  Gr\@GR
                  Gr\@GR                  Gr\@GR                  Gr
\TS:  ab  \@GR                  Gr\@GR                  Gr\@GR                  Gr\@GR"                  Gr\@GR&                  Gr\@GR*                  Gr\@GR.                  GrG\
GrG\ GrS\-  \-  \-  G\ -  GrS\-  \-  \-  G\ -  GrS\-  \-  \-  \-  G\ -  GrG\GrS\-  \-  \-  G\ -  GrS\-  \-  \-  \-  G\ -  Gr S\-  \-  \-  \-  G\ -  Gr!S\-  \-  \-  G\ -  Gr"S\-  \-  \-  G\ -  Gr#SGr$SGr%SGr&SGq'SGr(SGr)SGr*SGr+SGr,SGr-SGr.SGr/SGr0SGr1SGr2SGr3SGr4SGr5SGr6SGr7SGr8SGr9SGr:S S S S S S S S.Gr; " S SG\<5      Gr= " S SG\<5      Gr> " S SG\=5      Gr?\~" G\(5      Gr@\~" G\)5      GrA\~" G\*5      GrBSGrCSGrDSGrESGrFSGrGSGrHSGrISGrJSGrKSGrLSGrMSGrNSGrOSGrPSGrQSGrRSGrSSGrTSGrUSGrVSGrWSGrXSGrYSGrZSGr[SGr\SGr]SGr^SGr_SGr`SGraSGrbSGrcSGrdSGreSGrfSGrgSGrhSGriSGrjSGrkSGrlSGrmSGrnSGroSGrpSGrqSGrrSGrsSGrtSGruSGrvSGrw SSGKxGJyGryGJzGrz  G\yGR                  " 5       Gr|G\|GR                  5        H  Gr~G\zG\~   G\|G\~   S'   M     GCyGCzGS GrGSGrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS	 GrGS
 GrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS\R                  GS\R4GS jGrGS\R                  GS\R4GS jGrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS  GrGS! GrGS" GrGS# GrGS$ GrGS% GrGS& GrGS' GrGS( GrGS) GrGS* GrGS+ GrGS, GrGS- GrGS. GrGS/ GrGS0 GrGS1 GrGS2 GrGS3 GrGS4 GrGS5 GrGS6 GrGS7 GrGS8 GrGS9 GrGS: GrGS; GrGS< GrGS= GrGS> GrGS? GrGS@\@GR|                  GSA\i4GSB jGrGSC\@GR                  GS@\@GR|                  GSA\i4GSD jGrGSE GrGSF GrGSG GrGSH GrGSI GrGSJ GrGSK GrGSL GrGSM GrGSN GrGSO GrGSP GrGSQ GrGSR GrGSS GrGST GrGSU GrGSV GrSGqGSW GrGSX GrGSY GrGSZ GrGS[ GrGS\ GrGS] GrGS^ GrGS_ GrGS` GrGSa GrGSb GrGSc GrGSd GrGSe GrGSf GrGSg GrGSh GrGSi GrGSj GrGSk GrGSl GrGSm GrGSn GrGSo GrGSp GrGSq GrGSr GrGSs GrGSt GrGSu GrGSv GrGSw GrGSx GrGSy GrGSz GrGS{ GrGS| GrGS} GrGS~ GrGS GrGS GrGS GrGS Gr GS GrGS GrGS GrGS GrGS GrGS GrGS GrGS GrGS Gr	GS Gr
GS GrGS GrGS GrGS GrGS GrGS GrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGrGSGr GSGr!GSGr"GSGr#GSGr$GSGr%GSGr&GSGr'GSGr(GSGr)GSGr*GSGr+SGr,GSGr-GS Gr.GScGS jGr/S\l4GS jGr0GS\oGS\mGS\R4GS jGr1GSC\S\iGS\4GS jGr2GS\GRZ                  GS\R4GS jGr3GS\GRZ                  GSG\44GS jGr5GS\GRZ                  4GS jGr6GS\GRZ                  GSG\44GS jGr7GS\GRZ                  GSG\44GS jGr8S\R                  \\R\fS4   GS\mGS\m4GS jGr9GS Gr:GS Gr;GSC\GS\R                  4GS jGr<GS Gr=GS Gr>GS Gr?GS Gr@S\mGS\R                  \\RS4   GSG\4GS\iGS\m4
GS jGrAGS\mGS\m4GS jGrBGSdGS jGrCSSSGS.GS\mGS\nGS\S\nGS\m4
GS jjGrDGSeS\mGS\mGS\fGS\iGS\f4
GS jjGrEGS\^GS\d4GS jGrFGS GrGGS GrHGS GrIGS GrJGS GrKGS GrLGS GrMGS GrNGS GrOGS GrPGS GrQGS GrRGS GrSGS GrTGS GrUGS GrVGS GrWGS GrXGS GrY " GS GS\@GR                  5      Gr[GS Gr\GS Gr]GS Gr^GS Gr_GS Gr`GS GraGS GrbGS GrcGS GrdGS GreGS GrfGS GrgGS GrhGS GriGS GrjGS\rGS\rGS\4GS jGrk " GS  GS\@GR                  5      Grm " GS GS\@GR                  5      Gro " GS GS\@GR                  5      GrqGS Grr " GS GS\@GR                  5      Grs " GS	 GS
\@GR                  5      GrtGSfGS\mS\n4GS jjGruGS\m4GS jGrvGSSeGS\i4GS jGrwGSgGS jGrxGS GryGS GrzGS Gr{GS Gr|GS Gr}GS\m4GS jGr~ " GS GSG\5      GrGS GrGShGS\rGS\rGS\tGS\4GS jjGrS\mGS\i4GS jGrGS GrGSiS\tGS\iGS \iGS\4GS! jjGrGS" GrSSSSSSGS#.GS$ jGrSSSSSSGS#.GS% jGrGS& GrGS' GrGS( GrGS) GrGS* GrGS+ GrGS, GrGS- GrGS. GrGS/ GrGS0 GrGS1 GrGS2 GrGS3 GrGS4 GrGS5 GrGS\mGS\4GS6 jGrGS\mGS\R4GS7 jGrGS8 GrGS9 GrGS`GS: jGrGSjGS; jGrGS<\iGS\R4GS= jGrGS<\iGS\R4GS> jGrGS? GrGS@ GrGSA GrSGrSGrSGrSGrGSB\iGS\m4GSC jGrGSD GrGSE\d" 5       SGSE\d" 5       SGSFSS
GSG.	GSH jGrSGSFSSSSSS
SS
GSI.
GSJ jGr " GSK GSL5      Gr\9(       d(  \@GRZ                  " G\5        \@GR\                  " G\5        GSM Gr\GR`                  " G\5        SGSNKGJGr  G\GRb                  Gr\d" 5       GrG\ H4  u  GrGrGrGrG\GSO-  G\GSO-  G\GSO-  4G\G\GRe                  5       '   M6     GSP GrGSQ GrGSaGSR jGrSGSSKGJGr  G\GRv                  GrG\GRx                  GrG\GRz                  GrG\GR|                  GrG\GR~                  GrSGSTGKGJGr  G\\oGl         " GSU GSVG\5      GrGSW Gr \ZGrGSX\Z GSY\Y GSZ\GR                  S    S1\GR                  S    GS[\GR                   GS\\GR                  GS]:  a  SOS GS^3r g! \A a    SSK@r@ GN%f = fs  sn f ! \_ a    \`\a-  \b-  r^ GN(f = f! G\ a    0 Gr| G	Nf = f(k  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   )extra
textfdstreampathpath_append	pyloggingpylogging_loggerpylogging_levelpylogging_namedefaultc        
         (  ^^ U Gb  U R                  S5      (       a  [        U SS 5      nOU R                  S5      (       a  U SS nOU R                  S5      (       a  U SS nOU R                  S5      (       a  Sn[        5       n
U S	S R                  S
5      nU HA  nU(       d  M  UR                  SS5      n[	        U5      S:X  d   SU< S35       eUu  pXU'   MC     U
R                  S5      mTb  [        T5      mU
R                  SS5      nO SU < S35       eUb  [        R                  " USSS9nU$ Ub*  [        US5      (       d   e[        US5      (       d   eUnU$ Ub  [        R                  " US5      nU$ Ub  [        R                  " US5      nU$  Uc	  Tc  Tc  Ubd  SSK	nTc  Uc  SnUR                  U5      m[        TUR                  5      (       d   eTc  TR                  5       m " UU4S jS5      nU" 5       nU$ U	nU$ )a  
Returns a stream that writes to a specified destination, which can be a
file descriptor, a file, an existing stream or Python's `logging' system.

Args:
    text: text specification of destination.
        fd:<int> - write to file descriptor.
        path:<str> - write to file.
        path+:<str> - append to file.
        logging:<items> - write to Python `logging` module.
            items: comma-separated <name=value> pairs.
                level=<int>
                name=<str>.
            Other names are ignored.
    
    fd: an int file descriptor.
    stream: something with methods .write(text) and .flush().
        If specified we simply return <stream>.
    path: a file path.
        If specified we return a stream that writes to this file.
    path_append: a file path.
        If specified we return a stream that appends to this file.
    pylogging*:
        if any of these args is not None, we return a stream that writes to
        Python's `logging` module.
        
        pylogging:
            Unused other than to activate use of logging module.
        pylogging_logger:
            A logging.Logger; If None, set from <pylogging_name>.
        pylogging_level:
            An int log level, if None we use
            pylogging_logger.getEffectiveLevel().
        pylogging_name:
            Only used if <pylogging_logger> is None:
                If <pylogging_name> is None, we set it to 'pymupdf'.
                Then we do: pylogging_logger = logging.getLogger(pylogging_name)
Nzfd:   zpath:   zpath+zlogging:T   ,=r      zNeed `=` in item=.levelnamepymupdfr   z?Expected prefix `fd:`, `path:`. `path+:` or `logging:` in text=wF)modeclosefdwriteflushac                   *   > \ rS rSrU U4S jrS rSrg)_make_output.<locals>.Out   c                 \   > UR                  S5      nU(       a  TR                  TU5        g g )N
)rstriplog)selfr   r   r   s     P/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/pymupdf/__init__.pyr   _make_output.<locals>.Out.write   s+     {{4($(($?     c                     g N r(   s    r)   r   _make_output.<locals>.Out.flush   s    r+   r.   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__)r   r   s   r)   Outr"      s    @r+   r6   )
startswithintdictsplitlengetioopenhasattrlogging	getLogger
isinstanceLoggergetEffectiveLevel)r   r   r   r	   r
   r   r   r   r   r   items_ditemsitemnvnvretr@   r6   s         ``           r)   _make_outputrL   ,   sN   f ??5!!T!"XB__W%%8D__W%%qr(K__Z((IfGHNN3'EZZQ'2w!|<'9D7!%<<|
  &kk'2O*"%o"6$[[;N[XSWRYYZ[[1	~ggbsE2H JG 
	vw''''vw''''@ J? 
	ggdC < J; 
	 ggk3'8 J7 $+*)#%!*&00@*GNN;;;;".@@BO		 		 e J Jr+   PYMUPDF_MESSAGE)r   r   PYMUPDF_LOGFc                      [         $ r-   _g_log_itemsr.   r+   r)   
_log_itemsrR      s    r+   c                     U q g r-   )_g_log_items_active)actives    r)   _log_items_activerV      s     r+   c                      [         S S 2	 g r-   rP   r.   r+   r)   _log_items_clearrX      s	    Qr+   	r   r   r   r	   r
   r   r   r   r   c        	         0    [        U UUUUUUUU[        S9
qg)zG
Sets destination of PyMuPDF messages. See _make_output() for details.
r   N)rL   _g_out_messagerY   s	            r)   set_messagesr\      s,      "#-+)"Nr+   c        	         0    [        U UUUUUUUU[        S9
qg)z\
Sets destination of PyMuPDF development/debugging logging. See
_make_output() for details.
r   N)rL   
_g_out_logrY   s	            r)   set_logr_      s,    " #-+)Jr+    c                     [         R                  " SS9nX!   n [        R                  R	                  UR
                  5      nUR                  nUR                  nU SU SU SU  3n [        (       a  [        R                  U 5        [        (       a  [        U [        SS9  gg! [         a    UR
                  n Nyf = f! [         a     Ndf = f)z(
For development/debugging diagnostics.
r   )context:z(): r   filer   N)inspectstackosr	   relpathfilename	ExceptionlinenofunctionStopIterationrT   rQ   appendr^   print)r   callerrg   frame_recordrj   linerm   s          r)   r'   r'      s    9a( }	-ww|'<'<=H ""((1TF!H:T$8D!zd1-   	-#,,H	-  s"   C )B% %B>=B>
CCc                 :    [         (       a  [        U [         SS9  gg)z
For user messages.
r   rd   N)r[   rp   r   s    r)   messagerv     s     ~dq1 r+   c                  T    SS K n [        S5        [        U R                  5       5        g )Nr   zexception_info:)	tracebackr'   
format_exc)rx   s    r)   exception_inforz     s    /	r+   z
()<>[]{}/%c                     [         R                  R                  U 5      nUc  UnO US:X  a  SnOUS:X  a  SnO SU  SU< 35       eX1:w  a  [        SU  SU< 35        U$ )q
Returns `True`, `False` or `default` depending on whether $<name> is '1',
'0' or unset. Otherwise assert-fails.
1T0FzUnrecognised value for : Using non-default setting from )rh   environr<   r'   r   r   rJ   rK   s       r)   get_env_boolr     sp    
 	

Ay	
c	
c9+D6A599q
~-dV2aU;<Jr+   c                     [         R                  R                  U 5      nUc  UnO[        U5      nX1:w  a  [	        SU  SU 35        U$ )r|   r   r   )rh   r   r<   r8   r'   r   s       r)   get_env_intr   -  sI    
 	

Ay!f
~-dV2aS9:Jr+   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                       \ rS rSrS rSrg)_GlobalsiG  c                 <    SU l         SU l        SU l        SU l        g Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsr/   s    r)   __init___Globals.__init__H  s"    !"#$  !%&"r+   )r   r   r   r   Nr1   r2   r3   r4   r   r5   r.   r+   r)   r   r   G  s    'r+   r   _get_layoutc                      Sq g)z:For users who never want to see the layout recommendation.FN)_recommend_layoutr.   r+   r)   no_recommend_layoutr   V  s
     r+   c                      Sn  [         (       aV  [        cN  [        R                  " S5      S:w  a3  [        R
                  R                  S5      (       d  [        U 5        Sq ggggg)z;Check if we should recommend installing the layout package.zVConsider using the pymupdf_layout package for a greatly improved page layout analysis.NPYMUPDF_SUGGEST_LAYOUT_ANALYZERr~   zpymupdf.layoutF)r   r   rh   getenv	importlibutil	find_specrp   )msgs    r)   _warn_layout_oncer   \  sf    dC 	
 II78C? (()9::c
! ; @   r+   MUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATHmupdf_cppyy)mupdfinternal_check_ndebugc                 P    U R                  S5      nUS:  a  U SU n [        U 5      $ )z4
Converts string to int, ignoring trailing 'rc...'.
rcr   N)findr8   )r   r   s     r)   _int_rcr     s-     
4B	QwCRyt9r+   )mupdf_location)pymupdf_git_branch)pymupdf_git_diff)pymupdf_git_sha)pymupdf_version)pymupdf_version_tuple)swig_version)swig_version_tupler   z8Inconsistent MuPDF version numbers: mupdf_version_tuple=zM != (mupdf.FZ_VERSION_MAJOR, mupdf.FZ_VERSION_MINOR, mupdf.FZ_VERSION_PATCH)=z%gfmtc                    [        U [        [        45      (       a%  SnU  H  nU(       a  US-  nU[        X1S9-  nM     U$ [        R
                  " X5      $ )z
Returns `value` formatted with mupdf.fz_format_double() if available,
otherwise with Python's `%`.

If `value` is a list or tuple, we return a space-separated string of
formatted values.
r`    r   )rB   listtuple	_format_gr   fz_format_double)valuer   rK   rJ   s       r)   r   r     sW     %$''As
9Q((C  
%%c11r+   Page_forward_declPoint_forward_declmatrix_like
point_like	quad_like	rect_likec                 X   [        U [        5      (       a(  U R                  (       a  [        S5      eU R                  n [        U [
        R                  5      (       a  U $ [        U [
        R                  5      (       a  U R                  5       $ U c   S5       e S[        U 5      < 35       e)zn
Returns document as a mupdf.FzDocument, upcasting as required. Raises
'document closed' exception if closed.
document closeddocument is NoneUnrecognised type(document)=)
rB   Document	is_closed
ValueErrorthisr   
FzDocumentPdfDocumentsupertype)documents    r)   _as_fz_documentr     s    
 (H%%.//==(E,,--	He//	0	0~~		%$%q31$x.!233qr+   c                    [        U [        5      (       a(  U R                  (       a  [        S5      eU R                  n [        U [
        R                  5      (       a  U $ [        U [
        R                  5      (       a2  [
        R                  " U 5      nU(       a  UR                  (       d   eU$ U c   S5       e S[        U 5      < 35       e)z
Returns `document` downcast to a mupdf.PdfDocument. If downcast fails (i.e.
`document` is not actually a `PdfDocument`) then we assert-fail if `required`
is true (the default) else return a `mupdf.PdfDocument` with `.m_internal`
false.
r   r   r   )
rB   r   r   r   r   r   r   r   
m_internalr   )r   requiredrK   s      r)   _as_pdf_documentr     s     (H%%.//==(E--..	He..	/	/)>>!>
		%$%q31$x.!233qr+   c                     [        U [        5      (       a  U R                  n [        U [        R                  5      (       a  U R                  5       $ [        U [        R                  5      (       a  U $ U c   S5       e S[        U 5      < 35       e)z8
Returns page as a mupdf.FzPage, upcasting as required.
page is NoneUnrecognised type(page)=)rB   Pager   r   PdfPager   FzPager   pages    r)   _as_fz_pager     sr     $yy$&&zz|	D%,,	'	'	!L!q/-$t*//qr+   c                 d   [        U [        5      (       a  U R                  n [        U [        R                  5      (       a  U $ [        U [        R
                  5      (       a2  [        R                  " U 5      nU(       a  UR                  (       d   eU$ U c   S5       e S[        U 5      < 35       e)z
Returns `page` downcast to a mupdf.PdfPage. If downcast fails (i.e. `page`
is not actually a `PdfPage`) then we assert-fail if `required` is true (the
default) else return a `mupdf.PdfPage` with `.m_internal` false.
r   r   )	rB   r   r   r   r   r   pdf_page_from_fz_pager   r   )r   r   rK   s      r)   _as_pdf_pager     s     $yy$&&	D%,,	'	'))$/>>!>
	!L!q/-$t*//qr+   c                 j    [         R                  " U 5      nUR                  (       d  [        S5      eU$ )a   
Wrapper for mupdf.pdf_annot_page() which raises an exception if <annot>
is not bound to a page instead of returning a mupdf.PdfPage with
`.m_internal=None`.

[Some other MuPDF functions such as pdf_update_annot()` already raise a
similar exception if a pdf_annot's .page field is null.]
Annot is not bound to a page)r   pdf_annot_pager   RuntimeError)annotr   s     r)   _pdf_annot_pager   4  s,     &D??9::Kr+   c                      \ rS rSrS rS rS rS rS rS r	SJS jr
SKS
 jr\S 5       r\S 5       r\S 5       r\S 5       rSLS jr\S 5       rS r\S 5       r\S 5       rS rS rS rSMS jrS rS rS rSNS jr\S 5       r\S 5       r\S 5       r \S 5       r!\S  5       r"\S! 5       r#\S" 5       r$\S# 5       r%\S$ 5       r&\S% 5       r'\S& 5       r(\S' 5       r)\S( 5       r*S) r+S* r,S+ r-SOS, jr.SPS- jr/S. r0SQS/ jr1S0 r2SRS1 jr3S2 r4S3 r5SJS4 jr6S5 r7S6 r8S7 r9S8 r:SJS9 jr;\S: 5       r<         SSS;\=S<\>S=\?S>\=S?\@S@\@SA\@SB\ASC\B4SD jjrCSTSE jrD\ESF 5       rF\SG 5       rG\SH 5       rHSIrIg	)UAnnotiI  c                 R    [        U[        R                  5      (       d   eXl        g r-   )rB   r   PdfAnnotr   r(   r   s     r)   r   Annot.__init__K  s    5%..1111	r+   c                 \    [        U SS5      nSU R                  S   < S[        U5      < 3$ )Nparentz<>'r   z' annotation on )getattrr   str)r(   r   s     r)   __repr__Annot.__repr__O  s'    x.*.))A,FDDr+   c                 "    U R                  5       $ r-   )r   r/   s    r)   __str__Annot.__str__S  s    }}r+   c                 8    [        U SS5      (       a  SU l        g g )NthisownF)r   r   r/   s    r)   _eraseAnnot._eraseV  s    4E** DL +r+   c                    U R                   n[        R                  " U5      [        R                  :w  a  g [	        5       n [        R
                  " [        R                  " U5      S5      nUR                  (       a)  [        S5        [        R                  " U5      nXB[        '   [        R
                  " [        R                  " U5      S5      nUR                  (       a)  [        R                  " U5      n[        U5      U[        '   O	SU[        '   [        R                  " [        R                  " U5      [        S5      5      nSnUR                  (       a  [        R                   " U5      nXb["        '   UnU(       d  U$ U R*                  US'   [,        R/                  U 5      u  pn
XS'   XS	'   XS
'   U R0                  S   nXS'   U$ ! [$         a    [&        (       a
  [)        5          g f = f)NROzIgnoring redaction key '/RO'.OverlayTextr`   Qr   rect
text_colorfontnamefontsizefill)r   r   pdf_annot_typePDF_ANNOT_REDACTr9   pdf_dict_getspdf_annot_objr   message_warning
pdf_to_numdictkey_xrefpdf_to_text_stringJM_UnicodeFromStrdictkey_textpdf_dict_getPDF_NAME
pdf_to_intdictkey_alignrk   g_exceptions_verboserz   r   TOOLS	_parse_dacolors)r(   r   valuesobjxrefr   alignvalr   r   r   r   s               r)   _get_redact_valuesAnnot._get_redact_valuesZ  s   		&%*@*@@	%%e&9&9%&@$GC~~ ?@'','+|$%%e&9&9%&@-PC~~//4'8'>|$')|$$$U%8%8%?#OCE~~((-$)=! JiiF).)>&
h&L"J"J{{6"F
  	##(8	s   D8G G.-G.c                 n   [         (       ad  [        U R                  [        R                  5      (       d   e[
        R                  " U R                  5      n[        U[        5      (       d   eU$ S nS nU R                  n[        U[        R                  5      (       d   e[        R                  " U5      n[        R                  " U[        S5      [        S5      5      n[        R                  " U5      (       a  [        R                  " U5      nU(       a  UR                  (       a  [        U5      nU$ )NAPN)g_use_extrarB   r   r   r   r   Annot_getAPbytesr  pdf_dict_getlr  pdf_is_streampdf_load_streamr   JM_BinFromBuffer)r(   rK   rresr   	annot_objaps          r)   _getAPAnnot._getAP  s    ;tyy%..9999##DII.CsE****JACIIEuenn5555++U3I$$i$#OB""B''++R0s~~$S)Hr+   c                     U R                   n[        R                  " U5      n[        U5      n[        R                  " U[        S5      [        S5      5      nUR                  (       d  [        [        5      e[        R                  " U5      (       d  [        [        5      e[        U5      nUR                  (       d  [        [        5      e[        UR                  5       XgS5        U(       aB  [        R                  " U[        S5      5      n[        R                   " U[        S5      U5        g g ! ["         a    [$        (       a  ['        5          g  g f = f)Nr  r  r   RectBBox)r   r   r  r   r  r  r   r   MSG_BAD_APNr   JM_BufferFromBytesr   MSG_BAD_BUFFERJM_update_streamdocpdf_dict_get_rectpdf_dict_put_rectrk   r  rz   )	r(   buffer_r   r   r%  r   apobjr$  bboxs	            r)   _setAPAnnot._setAP  s    	9IIE++U3I"5)D''HTNHSMRE##"K00&&.."K00$g.C>> .11dhhj%a8..	8F;KL''0@$G   	9##(8#	9s   D/D3 3EENc                 
   U R                   nUR                  (       d   e[        R                  " U5      n[	        U5      nUR                  5       n[        R                  " U5      n	[        U5      u  p U
S:X  dQ  U	[        R                  [        R                  [        R                  [        R                  [        R                  4;  a!  [        R                  " U[        S5      5        OU
S:  a  [        R                  " X[S U
 5        US:  a  SOSnU	[        R                   [        R                  [        R"                  [        R$                  [        R&                  [        R                  [        R                  [        R                  [        R                  [        R(                  [        R*                  4;  a  SnU(       a!  [        R,                  " U[        S5      U5        U	[        R"                  :X  a   U
S:  a  [        R.                  " X[S U
 5        OwU
S:  aq  [        R0                  " UR                  5       U
5      n[3        U
5       H  n[        R4                  " XU   5        M     [        R6                  " U[        S5      U5        [        R8                  " U5        [        R:                  " U5        SUl        US:  d  US:  a  U(       d  g [        RF                  " [        R                  " U5      [        S5      [        S5      5      nUR                  (       d  [I        [J        5      e[        RL                  " U[        S	5      5      nUR                  (       d!  [        RN                  " U[        S	5      S
5      n[        RP                  " UR                  5       S5      nUS:  ai  US:  ac  [        RR                  " U[        S5      U5        [        RR                  " U[        S5      U5        [        RR                  " U[        S5      U5        U(       aB  [        RT                  " U[        S5      U5        [        RT                  " U[        S5      U5        [        RL                  " U[        S5      5      nUR                  (       d!  [        RN                  " U[        S5      S
5      n[        R6                  " U[        S5      U5        g! [>         a)  n[@        (       a
  [C        5         [E        SU 35        e S nAff = f! [>         a)  n[@        (       a
  [C        5         [E        SU 35        e S nAff = f)Nr   ICr   Rotatezcannot update annot: Tr  r  	Resourcesr   r   CAcaBM	ExtGStateHz#cannot set opacity or blend mode
: )+r   r   r   r  r   r0  r   JM_color_FromSequencePDF_ANNOT_SQUAREPDF_ANNOT_CIRCLEPDF_ANNOT_LINEPDF_ANNOT_POLY_LINEPDF_ANNOT_POLYGONpdf_dict_delr  pdf_set_annot_interior_colorPDF_ANNOT_CARETPDF_ANNOT_FREE_TEXTPDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_STAMPPDF_ANNOT_TEXTpdf_dict_put_intpdf_set_annot_colorpdf_new_arrayrangepdf_array_push_realpdf_dict_putpdf_dirty_annotpdf_update_annotresynth_requiredrk   r  rz   rv   r  r   r,  r
  pdf_dict_put_dictpdf_new_dictpdf_dict_put_realpdf_dict_put_name)r(   opacity
blend_mode
fill_colorrotater   r%  r   pdftype_nfcolfcol
insert_rotcolier&  	resourcesalp0extgs                       r)   _update_appearanceAnnot._update_appearance  s   		''/	u%hhj$$e,+J71	 zU****((--+++  ""Ix~>22E<H$kqJ))**--33''((--++**))((  
&&y(82DfM 11119--e&5\B))$((*e<A--c7; '""9htncB!!%(""5)#$C  aK7a< 	$$''.TNSMB
 =="K00**B0EFI''!33R+9NPQR	%%txxz15D!|!''x~wG''x~wG''HTNGL''x~zJ''HTNJO%%y(;2GHD??..	8K;PRSThsmT: W  	## ,QC01		L  	##(8;A3?@	s2   5IS H T 
T)$TT
U$UUc                     [        U 5        U R                  n[        R                  " U5      n[        R                  " U[        S5      [        S5      5      nUR                  (       d8  [        [        R                  " [        R                  R                  5      5      nO+[        R                  " U[        S5      5      n[        U5      n[        U5      U R                  5       R                  -  nX@R                  5       R                  -  nU$ )zannotation appearance bboxr  r  r+  )CheckParentr   r   r  r  r  r   JM_py_from_rectFzRectFixed_INFINITEr1  r*  
get_parenttransformation_matrixderotation_matrix)r(   r   r%  r&  r  r   s         r)   apn_bboxAnnot.apn_bbox  s     	D		''.	  HTNHSMJ}}!%,,u||/J/J"KLC**2x/?@D!$'C3i$//+AAA 222
r+   c                 $    [        U 5        U R                  n[        U[        R                  5      (       d   e[        R
                  " [        R                  " U5      [        R                  [        R                  5      nUR                  (       d  [        [        R                  " 5       5      $ [        R                  " U[        R                  5      n[        U5      n[        U5      nU$ ! [         a    [         (       a
  [#        5         e f = f)zannotation appearance matrix)rn  r   rB   r   r   r  r  PDF_ENUM_NAME_APPDF_ENUM_NAME_Nr   JM_py_from_matrixFzMatrixpdf_dict_get_matrixPDF_ENUM_NAME_MatrixMatrixrk   r  rz   )r(   r   r&  matr  s        r)   
apn_matrixAnnot.apn_matrix  s    	IIEeU^^4444$$''.**))B
 ==()9::++B0J0JKC#C(C+CJ 	##(8	s   B.C. 1<C. .!Dc           
         [        U 5        U R                  n[        R                  " U5      n[        R                  " U[        S5      5      nSnUR                  (       a!  [        [        R                  " U5      5      nU$ [        R                  " U[        S5      [        S5      [        S5      [        S5      5      n[        R                  " U5      (       a  [        R                  " U5      n[        U5       H  n[        R                  " X65      n[        R                  " U5      (       d  M6  [        R                  " U5      n[        U5       Hv  n	[        R                  " Xy5      n
[        R                  " U
[        S5      5      S:X  d  M?  [        [        R                  " [        R                  " Xy5      5      5      nUs  s  $    M     U$ )zannotation BlendModer>  Nr  r  r;  r?  r   )rn  r   r   r  r
  r  r   r  pdf_to_namer  pdf_is_dictpdf_dict_lenrR  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r(   r   r%  r  r]  rI   rf  obj1mjobj2s              r)   	blendmodeAnnot.blendmode4  s[    	D		''.	  HTN;
>>*5+<+<S+ABJ!!%% S!!""3'A1X--c5$$T****40A"1X$55d> ++D(4.AQF):5;L;LUMcMcdhMl;m)nJ#--	 &	  r+   c                    [        U 5        U R                  S   nU[        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  [        R                  4;  a
  [        5       $ [        R                  " U R                  5      n[        U5      nU$ )zBorder information.r   )rn  r   r   rC  rJ  rL  rD  rE  rF  rB  r9   r  r   JM_annot_border)r(   atypeaorK   s       r)   borderAnnot.borderT  s     	D		!&&))##$$))''&&  6M  +b!
r+   c                     [        U 5        U R                  n[        R                  " [        R                  " U5      5      n[        SSSUS9n[        R                  " X2U5        g)z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)rn  r   r   pdf_get_bound_documentr  _make_PdfFilterOptionspdf_filter_annot_contents)r(   r  r   r`  filter_s        r)   clean_contentsAnnot.clean_contentsg  sO    D		**5+>+>u+EF(1AX`a''G<r+   c                      [        U 5        U R                  n[        U[        R                  5      (       d   e[        [        R                  " U5      5      $ ! [         a    [        (       a
  [        5         e f = f)zColor definitions.)
rn  r   rB   r   r   JM_annot_colorsr  rk   r  rz   r   s     r)   r  Annot.colorso  sb    	IIEeU^^4444"5#6#6u#=>> 	##(8	s   AA !A:c                 0   [        U 5        U R                  n[        R                  " U5      n[	        U5      n [        U5      nU(       d  O[        R                  " X45        M+  [        R                  " U[        S5      5        [        R                  " UR                  5       [        S5      5      n[        R                  " U5      nSn[        US-
  SS5       H  n[        R                  " XX5      n	[        R                  " U	[        S5      5      n
U	R                  (       d  ML  [        R                  " X5      (       a  Mi  [        R                   " XX5        SnM     U(       a0  [        R"                  " UR                  5       [        S5      U5        gg)z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   ParentN)rn  r   r   r  r   JM_find_annot_irtpdf_delete_annotrG  r  r
  r  pdf_array_lenrR  pdf_array_getr   r  pdf_array_deleterT  )r(   r   r%  r   	irt_annotannotsrI   foundrf  ops              r)   delete_responsesAnnot.delete_responses{  s/   D		''.	u%)%0I""43	 
 	9hw&78##DHHJ0BC'qsB#A##F.A""1hx&89A<<##A11&&v1 $ txxz8H+=vF r+   c                     [        U 5        [        5       nSnSnSnU R                  n[        R                  " U5      n[        R
                  " U5      nU[        R                  :w  a  [        [        5      e[        R                  " U[        S5      [        S5      [        S5      5      nUR                  (       d  [        S[        5        [        R                  " U[        S5      5      n	[        R                  " U	[        S5      5      n
U
R                  (       a  [        R                  " U
5      nOG[        R                  " U	[        S5      5      n
U
R                  (       a  [        R                  " U
5      n[        R                  " U	[        S5      5      n
U
R                  (       a  [        R                  " U
5      n[        R                  " U[        S	5      5      n
U
R                  (       a  [        R                   " U
5      n[        R                  " U[        S
5      [        S5      5      n
U
R                  (       a  [        R                   " U
5      n[#        W5      U[$        '   ['        U5      U[(        '   X![*        '   X1[,        '   U$ )zAttached file information.r  NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)rn  r9   r   r   r  r   rK  	TypeErrorMSG_BAD_ANNOT_TYPEr  r  r   RAISEPYJM_Exc_FileDataErrorr
  r  r  JM_EscapeStrFromStrdictkey_filenamer  dictkey_descrdictkey_lengthdictkey_size)r(   r$  lengthsizedescr   r%  ra  r   fsr  rj   s               r)   	file_infoAnnot.file_info  s    	Df		''.	$$U+E333/00$$	   46JK	8D>:r8D>2<<//2H""2x}5A|| 33A6r8F#34<<++A.Dvx'9:<<%%a(F(:HV<LM<<##A&D!4X!>/5]%^!\
r+   c                 \    [        U 5        U R                  n[        R                  " U5      $ )zFlags field.)rn  r   r   pdf_annot_flagsr   s     r)   flagsAnnot.flags  s&     	D		$$U++r+   c                    [        U 5        U R                  n[        R                  " U5      n[        R                  " U5      nU[        R
                  :w  a  [        [        5      e[        R                  " U[        S5      [        S5      [        S5      5      nUR                  (       d  [        S[        5        [        R                  " U5      n[        U5      nU$ )zRetrieve attached file content.r  r  r  r  )rn  r   r   r  r   rK  r  r  r  r  r   r  r  r!  r"  )r(   r   r%  r   r   bufr$  s          r)   get_fileAnnot.get_file  s    D		''.	##E*5222/00$$YPXY\P]^  46JK##F+s#
r+   c                     [        U 5        SnU R                  n[        R                  " U5      n[        R                  " U[        S5      5      nUR                  (       a  [        R                  " U5      nU$ )z*Get annotation optional content reference.r   OCrn  r   r   r  r
  r  r   r  )r(   ocr   r%  r  s        r)   get_ocAnnot.get_oc  sZ    D		''.	  HTN;>>!!#&B	r+   c                 (    [        U S5      nU$ ! [         aw    [        U R                  5      n[	        U[
        R                  5      (       d   eUR                  (       a  [        UR                  5       5      OS n[        X#5      nXl         U$ f = f)Nr   )r   AttributeErrorr   r   rB   r   r   r   r   r0  r   r   )r(   rK   r   r   s       r)   rr  Annot.get_parent  s~    	4*C 
  	"499-DtU]]333304x,THt&CK 
	s    A=BBc                    [        U 5        [        [        [        S.n[	        U5      [
        L a   UR                  UR                  5       S5      nU(       a  [        US-  US-  5      n[        U5      nUnU(       d  [        R                  " 5       n[        R                  " U R                  Xg[        R                  " S5      U5      n[        U5      n	U(       a  U	R!                  X"5        U	$ )zannotation Pixmap)grayrgbcmykNH   r   )rn  csGRAYcsRGBcsCMYKr   r   r<   lowerr~  JM_matrix_from_pyr   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
r(   matrixdpi
colorspacealphacspacesctmcspixrK   s
             r)   
get_pixmapAnnot.get_pixmap  s     	D!%@
s" Z%5%5%7>JC"HcBh/F'$$&B--dii%BUBUVWBXZ_`SkKK!
r+   c                    [        U 5        U R                  n[        R                  " U5      n[        R                  " U5      n[        R
                  " U[        S5      5      nU[        R                  :w  d  UR                  (       d  [        [        5      e[        R
                  " U[        S5      5      R                  (       a  [        S[        5        [        5       n[        R
                  " U[        S5      5      nUR                  (       a  [        R                  " U5      US'   [        R
                  " U[        S5      5      nUR                  (       a  [        R                  " U5      US'   [        R
                  " U[        S5      5      nUR                  (       a  [        R                  " U5      US	'   [        R
                  " U[        S
5      5      nUR                  (       a  [        R                   " U5      US'   [        R"                  " US5      nUR                  (       a  [        R                   " U5      US'   [        R$                  " U5      n['        U5      nXS'   U$ )zRetrieve sound stream.Soundr  zunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionr   )rn  r   r   r  r   r
  r  PDF_ANNOT_SOUNDr   r  r  r  r  r9   pdf_to_realr  r  r  r!  r"  )	r(   r   r%  r   soundr$  r  r  r   s	            r)   	get_soundAnnot.get_sound  s   D		''.	##E*""9hw.?@5(((0@0@/00eXc]3>>/1EFf  6>>++C0CK  6>>#..s3C
O  6>>))#.CJ  6>>#//4C
O!!%.>>!&!2!23!7C##E*!#&H
r+   c                 6    [         R                  " U /UQ70 UD6$ r-   utilsget_textr(   argskwargss      r)   r  Annot.get_text.      ~~d4T4V44r+   c                 6    [         R                  " U /UQ70 UD6$ r-   )r
  get_textboxr  s      r)   r  Annot.get_textbox1  s      7777r+   c                 "   [        U 5        [        R                  " U5      nU(       ag  [        [        S5      (       d   S[         S35       e[        U5      nUR                  5       Ul        U=R                  [        R                  -  sl        U R                  n[        R                  " XS5      n[        U5      nU R                  5       n[        U[        R                   5      (       a  Xl        U$ [        R$                  " U5      Ul        U$ )zMake annotation TextPage.FZ_STEXT_CLIP_RECTzMuPDF-z% does not support FZ_STEXT_CLIP_RECT.)rn  r   FzStextOptionsr?   mupdf_versionJM_rect_from_pyinternalclipr  r  r   FzStextPageTextPagerr  rB   weakref	ProxyTyper   proxy)	r(   r  r  optionsclip2r   	stextpagerK   r  s	            r)   get_textpageAnnot.get_textpage4  s    D&&u-5"677v6-Pu9vv7#D)E >>+GLMMU555M		%%e5	y!OOa**++J 
 !q)CJ
r+   c                     [        U 5        U R                  n[        R                  " [        R                  " U5      [        S5      5      nUR                  (       a  S$ S$ )z Check if annotation has a Popup.r  TF)rn  r   r   r
  r  r  r   )r(   r   r  s      r)   	has_popupAnnot.has_popupG  sH     	D		  !4!4U!;Xg=NO~~t050r+   c                    [        U 5        U R                  n[        5       n[        [        R
                  " U5      5      U[        '   [        R                  " [        R                  " U5      [        S5      5      n[        [        R                  " U5      5      U[        '   [        R                  " [        R                  " U5      [        S5      5      n[        [        R                  " U5      5      U[        '   [        R                  " [        R                  " U5      S5      n[        [        R                  " U5      5      U[        '   [        R                  " [        R                  " U5      [        S5      5      n[        [        R                  " U5      5      U[         '   [        R                  " [        R                  " U5      S5      n[        R                  " U5      U["        '   [        R                  " [        R                  " U5      S5      n[        [        R                  " U5      5      U[$        '   U$ )zVarious information details.NameTCreationDateMSubjNM)rn  r   r9   r  r   pdf_annot_contentsdictkey_contentr
  r  r  r  dictkey_namer  dictkey_titler  dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)r(   r   r$  r  s       r)   info
Annot.infoO  s    	D		f01I1I%1PQOu22598F;KL-e.?.?.BCL u22598C=I.u/G/G/JKM  3 3E :NK$5e6N6Nq6Q$R ! u22598C=I01I1I!1LMO  3 3E :FC$77:O  3 3E :DA+E,D,DQ,GHJ
r+   c                     U R                   n[        R                  " U5      n[        R                  " U[	        S5      5      nUR
                  (       d  g[        R                  " U5      $ )z
annotation IRT xref
IRTr   )r   r   r  r
  r  r   r  )r(   r   r%  irts       r)   irt_xrefAnnot.irt_xrefq  sN    
 		''/	  )Xe_=~~%%r+   c                 X    [        U 5        [        R                  " U R                  5      $ )z-Get 'open' status of annotation or its Popup.)rn  r   pdf_annot_is_openr   r/   s    r)   is_openAnnot.is_open}  s!     	D&&tyy11r+   c                     U R                   n[        R                  " U5      nU[        R                  :X  a  g[	        [        S5      (       d   e[        R
                  " U5      $ )zannotation languageNfz_string_from_text_language2)r   r   pdf_annot_languageFZ_LANG_UNSETr?   rC  )r(   
this_annotlangs      r)   languageAnnot.language  sS     YY
''
35&&&u=>>>>22488r+   c                     [        U 5        U R                  n[        R                  " U5      (       d  g[        R                  " U5      n[        R
                  " U5      nX#4$ )zLine end codes.N)rn  r   r    pdf_annot_has_line_ending_stylespdf_annot_line_start_stylepdf_annot_line_end_style)r(   r   lstartlends       r)   	line_endsAnnot.line_ends  sQ     	D		55e<<11%8--e4|r+   c                    [        U 5        U R                  n[        U[        R                  5      (       d   eUR
                  (       d   e[        R                  " U5      nU[        R                  :w  a  [        R                  " U5      nO[        R                  " U5      nUR
                  (       a  [        U5      OSnU(       d  gSUl        UR                  5       R                  R                  5       U R                  5       R                  R                  5       :X  d   eXDR                  R                  [!        U5      '   UR"                  S   [        R                  :X  a!  [%        5       n[&        R)                  XE5        UnU$ )zNext annotation.NTr   )rn  r   rB   r   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   rr  m_internal_valuer   _annot_refsidr   Widgetr  _fill_widget)r(   rF  ra  r   r  widgets         r)   next
Annot.next  s    	DYY
*enn5555$$$$$$Z0E***((4E))*5E#..eElD~~$$5574??;L;Q;Q;b;b;dddd*-

r#w'88A;%000XFs+C
r+   c                    [        U 5        U R                  nSn[        R                  " [        R                  " U5      [        R
                  5      n[        R                  " U5      (       a  [        R                  " U5      nU$ )zOpacity.r  )rn  r   r   r
  r  PDF_ENUM_NAME_CApdf_is_numberr  )r(   r   opyr=  s       r)   r\  Annot.opacity  sc     	D		!4!4U!;U=S=STr""##B'C
r+   c                    [        U 5        [        R                  " [        R                  R                  5      nU R                  n[        R
                  " U5      n[        R                  " U[        S5      5      nUR                  (       a   [        R                  " U[        S5      5      n[        U5      n[        U5      U R                  5       R                  -  nXPR                  5       R                  -  nU$ )zannotation 'Popup' rectangler  r*  )rn  r   rp  rq  r   r  r
  r  r   r1  ro  r*  rr  rs  rt  )r(   r   r   r%  r  r  s         r)   
popup_rectAnnot.popup_rect  s     	D||ELL778		''/	  )Xg->?>>**30@ADd# 3i$//+AAA 222
r+   c                     [        U 5        SnU R                  n[        R                  " U5      n[        R                  " U[        S5      5      nUR                  (       a  [        R                  " U5      nU$ )zannotation 'Popup' xrefr   r  r  )r(   r  r   r%  r  s        r)   
popup_xrefAnnot.popup_xref  s]     	D		''.	  HW,=>>>##C(Dr+   c                     [         (       a!  [        R                  " U R                  5      nO [        R
                  " U R                  5      n[        U5      nU R                  5       nXR                  -  nU$ )zannotation rectangle)	r  r   Annot_rect3r   r   pdf_bound_annotr*  rr  rt  )r(   r  r  s      r)   r   
Annot.rect  s]     ;##TYY/C''		2C3i OO 	"""
r+   c           	         [         R                  " U R                  5      n[         R                  " U[	        S5      5      n[         R
                  " U5      S:X  a  [         R                  " [         R                  " US5      5      [         R                  " [         R                  " US5      5      [         R                  " [         R                  " US5      5      * [         R                  " [         R                  " US5      5      * 4$ g)z&
annotation delta values to rectangle
RD   r   r   r   r   N)r   r  r   r
  r  r  r  r  )r(   r%  arrs      r)   
rect_deltaAnnot.rect_delta  s    
 ''		2	  )Xd^<$)%%u':':C'CD%%u':':C'CD&&(;(;S!(DEE&&(;(;S!(DEE	  *r+   c                     [        U 5        U R                  n[        R                  " [        R                  " U5      [        R
                  5      nUR                  (       d  g[        R                  " U5      $ )zannotation rotationr  )rn  r   r   r
  r  PDF_ENUM_NAME_Rotater   r  )r(   r   rotations      r)   ru  Annot.rotation   sU     	D		%%u':':5'A5C]C]^""**r+   c                    [        U 5        U R                  5       nUR                  nUR                  nXU) -  -  nU R                  n[
        R                  " U5      n[
        R                  " U[        S5      [        S5      5      nUR                  (       d  [        [        5      e[        U5      n[
        R                  " U[        S5      U5        g)z!
Set annotation appearance bbox.
r  r  r+  N)rn  rr  rotation_matrixrs  r   r   r  r  r  r   r   r,  r  r2  )	r(   r5  r   rotr  r   r%  r&  r   s	            r)   set_apn_bboxAnnot.set_apn_bbox
  s     	D ""((sd
		''.	  HTNHSMJ}},,t$HV$4d;r+   c                 J   [        U 5        U R                  n[        R                  " U5      n[        R                  " U[        S5      [        S5      5      nUR                  (       d  [        [        5      e[        U5      n[        R                  " U[        S5      U5        g)z!Set annotation appearance matrix.r  r  r~  N)rn  r   r   r  r  r  r   r   r,  r  pdf_dict_put_matrix)r(   r  r   r%  r&  r  s         r)   set_apn_matrixAnnot.set_apn_matrix  sr    D		''.	  HTNHSMJ}},,'!!"hx&8#>r+   c                     [        U 5        U R                  n[        R                  " U5      n[        R                  " U[        S5      U5        g)zSet annotation BlendMode.r>  Nrn  r   r   r  r[  r  )r(   r]  r   r%  s       r)   set_blendmodeAnnot.set_blendmode&  s9    D		''.		8D>:Fr+   c                    [        U 5        U R                  SS u  pgU[        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  [        R                  4;  a  [        SU S35        gU[        R                  [        R                  [        R                  [        R                  4;  a  US:  a  [        SU S35        Sn[        U5      [        La  X#XES.nUR                  S	S5        UR                  S
S5        UR                  SS5        UR                  SS5        US	   c  SUS	'   US   c  SUS'   [        US   S5      (       a9  [        US   5      US'   US    H  n[        U[         5      (       a  M  SUS'     O   U R"                  n	[        R$                  " U	5      n
[        R&                  " U
5      n[)        XU
5      $ )zZSet border properties.

Either a dict, or direct arguments width, style, dashes or clouds.Nr   zCannot set border for ''.r   zCannot set cloudy border for 'r  )widthstyledashescloudsr  r  r  r  __getitem__)rn  r   r   rC  rJ  rL  rD  rE  rF  rB  rv   r9   
setdefaultr?   r   rB   r8   r   r  r  JM_annot_set_border)r(   r  r  r  r  r  r  atnamerG   r   r%  r`  s               r)   
set_borderAnnot.set_border-  s    	D		"1&&))##$$))''&&  -fXR89&&))''&&	  z8CD<t#$YF'2&'4((D)(B''?" F7O(#!F86(#]33$VH%56F8x(!$,,'+F8$ ) 		''/	**I6"F;;r+   c                 t   U R                   S   [        R                  :X  a  [        S5      e[	        U 5        U R                  5       R                  n[        U5      [        La  X2S.nUR                  S5      nUR                  S5      n[        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4nU/ S4;   a  UR                  U R                   SS5        OhUbe  [#        US
5      (       a  [%        U5      /n['        U5        [)        U5      S;   d   eS[+        U5       S3nUR                  U R                   SU5        U(       a/  U R                   S   U;  a  [-        SU R                   S   -  5        g	U/ S4;   a  UR                  U R                   SS5        g	Ubf  [#        US
5      (       a  [%        U5      /n['        U5        [)        U5      S;   d   eS[+        U5       S3nUR                  U R                   SU5        g	g	)zLSet 'stroke' and 'fill' colors.

Use either a dict or the direct arguments.
r   z'cannot be used for FreeText annotationsr   stroker   r  r.   r  []N	__float__r   r   ro  []z0Warning: fill color ignored for annot type '%s'.r   r9  )r   r   rJ  r   rn  rr  r   r9   r<   rC  rB  rD  rE  rF  r  xref_set_keyr  r?   float
CheckColorr;   r   rv   )r(   r  r  r   r0  fill_annotsss          r)   
set_colorsAnnot.set_colors\  s   
 99Q<5444FGGDoo&&<t#"5Fzz&!H%--u/E/EuG[G[]b]v]vx}  yP  yP--0 b"XTYYT2v{++-vv;)+++If%&a(ATYYQ/DIIaL3FSTUVB8TYYd3t[))d}tt9	)))IdO$A&ATYYa0 r+   c                 ^    [        U 5        U R                  n[        R                  " X!5        g)zSet annotation flags.N)rn  r   r   pdf_set_annot_flags)r(   r  r   s      r)   	set_flagsAnnot.set_flags  s!    D		!!%/r+   c                 >   [        U 5        [        U5      [        L a\  UR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nSnU R                  n[
        R                  " U5      nU(       a  [
        R                  " Xr5        U(       a  U(       a  [
        R                  " Xs5        U(       a5  [
        R                  " [
        R                  " U5      [        S5      U5        U(       a5  [
        R                  " [
        R                  " U5      [        S5      U5        U(       aA  [
        R                  " [
        R                  " U5      S	[
        R                  " U5      5        ggg)
zSet various properties.contentNtitlecreationDatemodDatesubjectr+  r,  r-  )rn  r   r9   r<   r   r   pdf_annot_has_authorpdf_set_annot_contentspdf_set_annot_authorpdf_dict_put_text_stringr  r  pdf_dict_putspdf_new_text_string)	r(   r7  r  r  r  r  r  r   	is_markups	            r)   set_infoAnnot.set_info  s,   D:hhy$/GHHWd+E88ND9Lhhy$/Ghhy$/GD		..u5	((8**58..u/B/B5/I8TbKceqr..u/B/B5/I8TW=Zab##E$7$7$>HaHabiHjk  r+   c                 $   U R                   n[        R                  " U5      n[        U5      nUS:  d(  U[        R                  " UR                  5       5      :  a  [        [        5      e[        R                  " UR                  5       US5      n[        R                  " U[        S5      5      n[        R                  " [        R                  " U5      5      nUS:  a  [        [        5      e[        R                  " U[        S5      U5        g)z
Set annotation IRT xref
r   r   Subtyper:  N)r   r   r  r   pdf_xref_lenr0  r   MSG_BAD_XREFpdf_new_indirectr
  r  pdf_annot_type_from_stringr  MSG_IS_NO_ANNOTrT  )r(   r  r   r%  r   r;  subtirt_subts           r)   set_irt_xrefAnnot.set_irt_xref  s     		''/	u%!8tu11488:>>l++$$dhhj$:!!3(;<33U5F5F5MNa<o..Ix<r+   c                     [        U 5        U R                  nU(       d  [        R                  nO[        R                  " U5      n[        R
                  " X#5        g)zSet annotation language.N)rn  r   r   rE  fz_text_language_from_stringpdf_set_annot_language)r(   rH  rF  rG  s       r)   set_languageAnnot.set_language  s?    DYY
&&D55h?D$$Z6r+   c                     [        U 5        U R                  n[        R                  " U5      (       a  [        R                  " X1U5        g[        S5        g)zSet line end codes.zbad annot type for line endsN)rn  r   r   rK   pdf_set_annot_line_ending_stylesr  )r(   startendr   s       r)   set_line_endsAnnot.set_line_ends  s=    D		11%88225E:;r+   c                     [        U 5        U R                  n[        R                  " U5      n[        R                  " U[        S5      U5        g)zSet /Name (icon) of annotation.r)  Nr  )r(   r   r   r%  s       r)   set_nameAnnot.set_name  s:    D		''.		8F+;TBr+   c                     [        U 5        U R                  n[        R                  " U5      nU(       d!  [        R                  " U[        S5      5        g[        [        R                  " U5      X15        g)z Set / remove annotation OC xref.r  N)rn  r   r   r  rG  r  JM_add_oc_objectr  )r(   r  r   r%  s       r)   set_ocAnnot.set_oc  sO    D		''.	y(4.9U99)DiTr+   c                     [        U 5        U R                  n[        USS5      (       d  [        R                  " US5        g[        R                  " X!5        US:  a  [        U5      nSUl        gg)zSet opacity.              ?r   N)rn  r   _INRANGEr   pdf_set_annot_opacityr   transparency)r(   r\  r   r   s       r)   set_opacityAnnot.set_opacity  sa    D		c**''q1##E3S="5)D !D r+   c                 ^    [        U 5        U R                  n[        R                  " X!5        g)z-Set 'open' status of annotation or its Popup.N)rn  r   r   pdf_set_annot_is_open)r(   r@  r   s      r)   set_openAnnot.set_open  s!    D		##E3r+   c                     [        U 5        U R                  n[        U5      n[        U5      n[        R
                  " [        U5      U5      n[        R                  " X%5        g)z0
Create annotation 'Popup' or update rectangle.
N)rn  r   r   JM_rotate_page_matrixr   fz_transform_rectr  pdf_set_annot_popup)r(   r   r   pdfpagery  r#  s         r)   	set_popupAnnot.set_popup  sN     	D		!%(#G,##OD$93?!!%+r+   c                    [        U 5        U R                  n[        U5      n[        U5      n[        R
                  " [        U5      U5      n[        R                  " U5      (       d  [        R                  " U5      (       a  [        [        5      e [        R                  " X%5        g! [         a  n[        SU 35         SnAgSnAff = f)zSet annotation rectangle.zcannot set rect: NF)rn  r   r   r  r   r  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectrk   rv   )r(   r   r   r  ry  r#  rg  s          r)   set_rectAnnot.set_rect  s    D		!%(#G,##OD$93?!!!$$(A(A!(D(Dl++	$$U. 	's+,	s   B+ +
C5CCc                    [        U 5        U R                  n[        R                  " U5      nU[        R                  [        R
                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4;  a  gUnUS:  a  US-  nUS:  a  M  US:  a  US-  nUS:  a  M  U[        R                  :X  a  US-  S:w  a  Sn[        R                  " U5      n[        R                   " U[#        S5      U5        g)zSet annotation rotation.Nr   h  Z   r:  )rn  r   r   r   rI  rC  rJ  rK  rL  rD  rE  rF  rB  rM  rN  r  rO  r  )r(   r_  r   r   ry  r%  s         r)   set_rotationAnnot.set_rotation
  s   D		##E*%%&&))//##$$))''&&%%$$  Ag3JC AgSj3JC Sj5,,,rQC''.	y(8*<cBr+   c                    [        U 5        U R                  R                  (       d  g[        R                  " U R                  5      n[        R
                  " U5      n[        R                  " [        R                  " U R                  5      S5      nUR                  (       a  [        R                  " U5      (       a  X4$ [        R                  " U5      nXU4$ )zannotation typenullIT)
rn  r   r   r   r   pdf_string_from_annot_typer  r  pdf_is_namer  )r(   ra  cr  its        r)   r   
Annot.type(  s     	Dyy##$$TYY/,,U3!4!4TYY!?F||u0033:q!"~r+   r]  r\  r   r   r   border_colorr^  	cross_outr_  c
                    [         R                  " U R                  5      n
U(       a2  [         R                  " U
[	        S5      5      nU(       d  [        S5      e[        R                  5         [        U 5        S nU R                  S   nU R                  R                  SS5      nU R                  R                  SS5      nU R                  S	   nUb  UnOU R                  S
   nSnU R                  nU	S:w  aE  U	S:  a  U	S-  n	U	S:  a  M  U	S:  a  U	S-  n	U	S:  a  M  U[         R                  :X  a  U	S-  S:w  a  Sn	Uc  U R                  n[!        US5      (       d  U R"                  nSUs=::  a  S:  d	  O  U(       a  SnOSnU[         R                  :X  ak  [%        U5        [%        U5        [&        R)                  U 5      u  nnnUS::  a  SnU(       a  UnU(       a  UnUS:  a  Un[+        U [-        U5      UUU5        SnU R/                  UUUU	S9nUSL a  [1        S5      eU[         R                  :X  aK  U R3                  5       nSUs=::  a  S:  a-  O  gUR5                  S5      (       d  U R7                  SU-   5        gU" US5      nU" US5      nU R9                  5       R:                  nU) nU(       a7  SSR=                  [?        [@        U5      5      -   S-   nURC                  S5      nOSnU RD                  (       a  U RD                  u  nn OSu  nn U R3                  5       nURG                  5       n!Sn"U[         RH                  :X  Ga  U(       au  Sn"U!SS n!U!u  n#n$n%n&n'U!RK                  U%5        U!RK                  U$5        U!RK                  U&5        U!RK                  U$5        U!RK                  U'5        U!RK                  S5        US:  d  US :w  a|  Sn"US:  a  [M        U5      RC                  5       S!-   /O/ n(U! HM  n)U)RO                  S"5      (       a  M  U)RO                  S#5      (       a  US :w  a  USS n)U(RK                  U)5        MO     U(n!S$R=                  U!5      nU[         RP                  [         RR                  4;   a  S$R=                  U!SS 5      S$-   nSn"US :w  a7  U[         RP                  :X  a	  UU-   S%-   nOMU[         RR                  :X  a  US-   nO3U[         RP                  :X  a  US&-   nOU[         RR                  :X  a  US-   nUb  UU-   nURU                  S'S(S5      nSn"U(       a  URC                  S5      U-   nSn"S)U-   S*-   nUU -   S:  Ga  U[         RP                  [         RR                  4;   Gar  S[&        RV                  [&        RX                  [&        RZ                  [&        R\                  [&        R^                  [&        R`                  [&        Rb                  [&        Rd                  [&        Rf                  4
n*[i        S[-        U*5      5      n+S+[k        SU R                  S   5      -  n,U Rl                  U,* U,* U,U,4-   nSn"U Rn                  n-UU+;   aD  [q        U-S   5      U-  n.[q        U-S   5      U-  n/U*U   " U U.U/SU5      n0UU0RC                  5       -  nU U+;   aD  [q        U-S,   5      U-  n.[q        U-S   5      U-  n/U*U    " U U.U/SU5      n0UU0RC                  5       -  nU"(       a9  U(       a"  U Rs                  U5        U R7                  USS-9  OU R7                  USS-9  U[         Rt                  [         Rv                  [         Rx                  [         Rz                  [         R|                  [         RR                  [         RP                  [         R~                  [         R                  [         R                  4
;  a  gU R                  n1U1S:X  a  gU Rl                  R                  U Rl                  R                  -   S+-  n2U1S:X  aq  [        U[        SS5      -
  5      S.:  a  gU Rl                  R                  U2U) 5      n3U R                  U3Rl                  5        U R                  [        SS5      5        g[        U15      n4U Rl                  R                  U2U45      n3U Rs                  U3Rl                  5        U R                  UU4-  5        g)/a  Update annot appearance.

Notes:
    Depending on the annot type, some parameters make no sense,
    while others are only available in this method to achieve the
    desired result. This is especially true for 'FreeText' annots.
Args:
    blend_mode: set the blend mode, all annotations.
    opacity: set the opacity, all annotations.
    fontsize: set fontsize, 'FreeText' only.
    fontname: set the font, 'FreeText' only.
    border_color: set border color, 'FreeText' only.
    text_color: set text color, 'FreeText' only.
    fill_color: set fill color, all annotations.
    cross_out: draw diagonal lines, 'Redact' only.
    rotate: set rotation, 'FreeText' and some others.
RC-cannot set border_color if rich_text is Falsec                 N    [        X5      nU(       d  gUS-   R                  5       $ )zHReturn valid PDF color operator for a given color sequence.
            r+   r%   )	ColorCodeencode)r  codeccs      r)   color_string"Annot.update.<locals>.color_stringZ  s'     2$BI%%''r+   r   r  Nr  r  r  r   r  r  r  r   /H gs
r`      )r\  r]  r^  r_  FzError updating annotation.s   /H gss   /H gs
fr  r  r   z] 0 d
utf-8r   r   T   Sr+   s    w   ws   RG   
   b   ss   
S
s
   
S
[] 0 d
   q
s   
Q
r   r   h㈵>)Jr   r  r   r
  r  r   r   update_timing_testrn  r   r  r<   r  r  rJ  r  r?   r\  r  r  r  JM_make_annot_DAr;   rk  r   r'  r7   r6  rr  rs  joinmapr   r  rP  
splitlinesr  ro   r   endswithrF  rE  replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashrR  maxr   verticesPointr  rI  rC  rK  rL  rD  rB  rM  rN  ru  tlbrabsr~  morphsetRectr~  )5r(   r]  r\  r   r   r   r  r^  r  r_  r%  is_rich_textr   
annot_typedtbwidthr  r   r   apnmatopa_codetcolfnamefsizer  r&  bfillbstrokep_ctmimatr  line_end_leline_end_riap_tab
ap_updated_LLLRURULntabrs   le_funcsle_funcs_rangedpointsp1p2leftry  r,  quadr  s5                                                        r)   updateAnnot.update6  s   8 ''		2	 --i$HL !PQQ  "D	( YYq\
[[__Xt,"-X&!D;;v&DR<1*# 1*C-# C-U6666B;!;K
 Jw,,llG!z HH222z"z"!&!6D% z! !| T3t9dE5AJ
 %%!	 & 
 %<;<<222BGa )+h(?(?JO,T3'vs+!77v388CRL11I=F]]7+FF>>'+~~$K'+$K [[]
///!
$*!2r2rb!b!b!b!b!d#zW^!
?Ez	&)002U:;r"D}}T** }}U++3&s|KK% # F#B%1153L3LMMF3BK(50BJ|!8!88ed*B5#<#<<dB!8!88dB5#<#<<dB"BH&6:BJ)B.BJb[8# $q(ZE<S<SUZUnUn;o-oe..0@0@))5+>+>--u~~,,e.D.D	)H
 #1c(m4NC4;;w/00A99QB1~-DJ]]Fn,6!9%,6!9%,,T2r5*Mdkkm#n,6":&-6":&-,T2r4Ldkkm#d#BQ'BQ'
 %%&&//##$$))''&&%%$$  mm"9YY\\DIILL(A-!86F1aL()D099??1vg.DLL#q!-Skyyq#&dii FSL)r+   c                    [        U 5        U R                  n[        R                  " U5      n[        R                  " U5      n[        R
                  " U5      nU[        R                  :w  a  [        [        5      e[        R                  " U[        S5      [        S5      [        S5      5      n	U	R                  (       d  [        S[        5        [        R                  " U[        S5      5      n
[        U5      nU(       a   UR                  (       d  [!        ["        5      eU(       a  [%        XyUS5        [        R&                  " U5      u  p[        R(                  " U5      n[        R*                  " U	[        S5      U5        [        R,                  " X[        S5      [        S5      5        U(       a  [        R.                  " U	[        S5      U5        [        R.                  " U
[        S5      U5        [        R.                  " U	[        S	5      U5        [        R.                  " U
[        S	5      U5        [        R.                  " U[        S
5      U5        U(       aB  [        R.                  " U	[        S	5      U5        [        R.                  " U
[        S	5      U5        U(       aC  [        R.                  " U	[        S5      U5        [        R.                  " U
[        S5      U5        gg)zUpdate attached file.r  r  r  bad PDF: no /EF objectr   DLr  r  r  Contentsr  N)rn  r   r   r  r  r   rK  r  r  r  r  r   r  r  r
  r-  r   r.  r/  fz_buffer_storagepdf_new_intrT  pdf_dict_putlr  )r(   r3  rj   	ufilenamer  r   r%  r`  r   r   r  r$  r;   r9  ls                  r)   update_fileAnnot.update_file3  s   D		''.	**95##E*5222/00$$YPXY\P]^  -/CD	8D>: !)3>>n--S#q1,,S1FC!!#&Avx~q98H+=x?OP**68C=(K**2x}hG**68D>8L**2x~xH**9hz6JHU**68D>9M**2x~yI**68F3CTJ**2x/?F r+   c                  6    Sn [        S5       H  nX-  n M	     U $ )Nr   i0u  )rR  )totalrf  s     r)   r  Annot.update_timing_test^  s!    AJE !r+   c           	      :   [        U 5        U R                  n[        U[        R                  5      (       d   e[        R
                  " U5      n[        U5      n[        R                  " 5       n[        R                  " 5       n[        R                  " X5U5        [        U5      n[        R                  " XF5      n[        R                  " U[        S5      5      nUR                  (       d   [        R                  " U[        S5      5      nUR                  (       d   [        R                  " U[        S5      5      nUR                  (       d  [        R                  " US5      nUR                  (       a  / n[!        S[        R"                  " U5      S5       H  n	[        R$                  " [        R&                  " Xy5      5      n
[        R$                  " [        R&                  " XyS-   5      5      n[        R(                  " X5      n[        R*                  " X5      nUR-                  UR.                  UR0                  45        M     U$ [        R                  " US5      nUR                  (       Ga&  / n[!        [        R"                  " U5      5       H  n	/ n[        R&                  " Xy5      n[!        S[        R"                  " U5      S5       H  n[        R$                  " [        R&                  " X5      5      n
[        R$                  " [        R&                  " XS-   5      5      n[        R(                  " X5      n[        R*                  " X5      nUR-                  UR.                  UR0                  45        M     UR-                  U5        GM     U$ g	)
zannotation vertex pointsVerticesL
QuadPointsCLr   r   r   InkListN)rn  r   rB   r   r   r  r   r{  rp  pdf_page_transformJM_derotate_page_matrix	fz_concatr
  r  r   r  rR  r  r  r  FzPointfz_transform_pointro   xy)r(   r   r%  r   page_ctmdummyderotr  r$  rf  rb  rc  pointres1o1r  s                   r)   r!  Annot.verticese  s    	D		%0000''.	u%>>#  h7'-??83 y(:*>?||E$6$6y(3-$P||E$6$6y(<BX$Y||E$7$7	4$H<< C1e11!4a8%%e&9&9!&?@%%e&9&9!qS&ABa+00A

UWWegg./ 9 J	95<<< C5..q12((.q%"5"5b"91=A))%*=*=b*DEA))%*=*=bA#*FGA!MM!/E!44UEEKK%''577!34 > 

4  3 J r+   c                     [        U 5        U R                  n[        R                  " [        R                  " U5      5      $ )zannotation xref number)rn  r   r   r  r  r   s     r)   r  
Annot.xref  s1     	D		 3 3E :;;r+   r   r   r   r   )r  NNr  r   )NNNr   r   )Nr  NNr  NNNNNNNNNr-   )	NNr   NNNNTr  NNNN)Jr1   r2   r3   r4   r   r   r   r   r  r'  r6  rk  propertyru  r  r  r  r  r  r  r  r  r  r  rr  r  r  r  r  r#  r&  r7  r<  r@  rH  rP  r\  r\  rd  rg  r   rq  ru  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   OptStrOptFloatr  OptSeqboolr8   rG  rR  staticmethodr  r!  r  r5   r.   r+   r)   r   r   I  s+   E!%N&9(aF     .  >  $= 	 	G6 / /b , ,	(@58& 1 1  B 	& 	& 2 2
 9 9 	 	  2    $ 	 	  &   + +<"	?G-<^'1R0l<= 7<CU
"4	, C<   !%#" $"& $!{*{*{* {* 	{*
 {* !{* {* {* {*z)GV   3 3j < <r+   r   c                   x    \ rS rSrS rS rSS jrSS jrSS jrSS jr	SS	 jr
SS
 jr\S 5       rS rS rSrg)Archivei  c                     [        5       U l        [        R                  " 5       U l        U(       a  U R
                  " U6   gg)z
Archive(dirname [, path]) - from folder
Archive(file [, path]) - from file name or object
Archive(data, name) - from memory item
Archive() - empty archive
Archive(archive [, path]) - from archive
N)r   _subarchivesr   fz_new_multi_archiver   addr(   r  s     r)   r   Archive.__init__  s2     !F..0	HHt r+   c                 2    S[        U R                  5       3$ )NzArchive, sub-archives: )r;   r|  r/   s    r)   r   Archive.__repr__  s    (T->->)?(@AAr+   Nc                 F    [         R                  " U R                  X5        g r-   )r   fz_mount_multi_archiver   )r(   subarchr	   s      r)   	_add_archArchive._add_arch  s    $$dii?r+   c                 r    [         R                  " U5      n[         R                  " U R                  X25        g r-   )r   fz_open_directoryr  r   )r(   folderr	   subs       r)   _add_dirArchive._add_dir  s&    %%v.$$dii;r+   c                     [        U5      n[        R                  " [        R                  " 5       5      n[        R                  " XRU5        [        R
                  " U R                  XS5        g r-   )r-  r   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferr  r   )r(   memoryr   r	   buffr  s         r)   _add_treeitemArchive._add_treeitem  sF    !6*''8((#T:$$dii;r+   c                     US:X  a  [         R                  " U5      nO[         R                  " U5      n[         R                  " U R                  XC5        g Nr   )r   fz_open_zip_archivefz_open_tar_archiver  r   )r(   filepathra  r	   r  s        r)   _add_ziptarfileArchive._add_ziptarfile  s=    A:++X6C++X6C$$dii;r+   c                     [        U5      n[        R                  " U5      nUS:X  a  [        R                  " U5      nO[        R                  " U5      n[        R
                  " U R                  Xc5        g r  )r-  r   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamr  r   )r(   r  ra  r	   r  r   r  s          r)   _add_ziptarmemoryArchive._add_ziptarmemory  sW    !6*%%t,!877@C77@C$$dii;r+   c                   ^  S nU 4S jn[        U[        R                  5      (       a  [        U5      n[        U[        5      (       a  [        R
                  R                  U5      (       a/  T R                  X5        U" [        R                  " U5      US5      $ [        R
                  R                  U5      (       at  [        U[        5      (       a  US:w  d   SU< S35       e[        R                  " US5       nUR                  5       nSSS5        T R                  WU5        U" U/SS	5      $ [        S
U< 35      eU" U5      (       a>  [        U[        5      (       a  USU< S3:w  d   eT R                  X5        U" U/SS	5      $ [        U[        R                   5      (       ai  [#        USS5      nUc.  UR$                  R'                  5       nT R)                  USU5        OT R+                  USU5        U" UR-                  5       US5      $ [        U[.        R0                  5      (       a  [#        UR2                  SS5      nUcY  UR2                  n[        U[        R4                  5      (       d  UR2                  nT R)                  UR'                  5       SU5        OT R+                  USU5        U" UR7                  5       US5      $ [        U[8        5      (       a  T R;                  X5        U" / US5      $ [        U[<        5      (       a  [?        U5      S:X  a  Uu  p[        U
[        5      (       d   S[A        U
5      < 35       eU" U	5      (       a  T R                  XUS9  O[        U	[        5      (       ae  [        R
                  R                  U	5      (       a@  [        R                  " U	S5       nUR                  5       nSSS5        T R                  WXS9  O S[A        U	5      < S35       eU" U
/US	5      $ [C        US5      (       a  U H  nT RE                  X5        M     g[G        S[A        U5       S35      e! , (       d  f       GNH= f! , (       d  f       N= f)a9  
Add a sub-archive.

Args:
    content:
        The content to be added. May be one of:
            `str` - must be path of directory or file.
            `bytes`, `bytearray`, `io.BytesIO` - raw data.
            `zipfile.Zipfile`.
            `tarfile.TarFile`.
            `pymupdf.Archive`.
            A two-item tuple `(data, name)`.
            List or tuple (but not tuple with length 2) of the above.
    path: (str) a "virtual" path name, under which the elements
        of content can be retrieved. Use it to e.g. cope with
        duplicate element names.
c                 L    [        U [        [        [        R                  45      $ r-   )rB   r  	bytearrayr=   BytesIOrb  s    r)   is_binary_data#Archive.add.<locals>.is_binary_data  s    a%BJJ!?@@r+   c                 J  > [        X US9nUS:w  d  TR                  / :X  a  TR                  R                  U5        g TR                  S   nUS   S:w  d  US   US   :w  a  TR                  R                  U5        g US   R                  US   5        UTR                  S'   g )N)r   entriesr	   treer  r   r	   r  )r9   r|  ro   extend)r  mountr   r  ltreer(   s        r)   make_subarch!Archive.add.<locals>.make_subarch  s    s%@Gf} 1 1R 7!!((1))"-<6)U6]gfo-M%%,,W5)$++GI,>?,1D%%b)r+   dirr`   z'Need name for binary content, but path=r   rbNr  zNot a file or directory: rj   r   zipr   r   tarmultir   zUnexpected type(name)=)r	   zUnexpected type(data)=r  zUnrecognised type )$rB   pathlibPathr   rh   r	   isdirr  listdirisfiler=   r>   readr  r   zipfileZipFiler   fpgetvaluer  r  namelisttarfileTarFilefileobjr  getnamesrz  r  r   r;   r   r?   r~  r  )r(   r  r	   r  r  r  ffrj   r  datar   rG   s   `           r)   r~  Archive.add  s   $	A
	2 gw||,,'lGgs##ww}}W%%g,#BJJw$7uEE((!$,, FBTG1EF;WWWd+qB ,""2t,#TFD&99 #<WK!HIIG$$dC((T 6?9=q6B .B B Bw-f5511w
D9HZZ((*&&r1d3$$Xq$7 0 0 2D%@@11w=H__!"bjj11B&&r{{}a>$$Xq$7 0 0 2D%@@))NN7)D'22gu%%#g,!*; JDdC((E,CT
}*EE(d##""4D"9D#&&77>>$''t,VVX -&&r4&;63T
}A66qf55Wm,,$   0gqABBw ,+Z -,s   ?QQ#
Q #
Q1c                     U R                   $ )z
List of sub archives.
)r|  r/   s    r)   
entry_listArchive.entry_list:  s    
    r+   c                 D    [         R                  " U R                  U5      $ r-   )r   fz_has_archive_entryr   r(   r   s     r)   	has_entryArchive.has_entryA  s    ))499d;;r+   c                 Z    [         R                  " U R                  U5      n[        U5      $ r-   )r   fz_read_archive_entryr   r"  )r(   r   r  s      r)   
read_entryArchive.read_entryD  s#    **DIIt<&&r+   )r|  r   r-   )r1   r2   r3   r4   r   r   r  r  r  r  r  r~  rs  r  r  r  r5   r.   r+   r)   rz  rz    sL    B@<<<<gR ! !<'r+   rz  c                   x   \ rS rSrS rS rS rS rS rS r	SJS	 jr
S
 rS rS rSKS jrS rSLS jrSJS jrS rSMS jrS rS rS rSJS jrSJS jrS rS rS rS rS r\S 5       rS r S r!S  r"S! r#S" r$\%S# 5       r&S$ r'S% r(S& r)S' r*S( r+\%S) 5       r,\%S* 5       r-\%S+ 5       r.\%S, 5       r/\%S- 5       r0S. r1S/ r2\%S0 5       r3S1 r4S2 r5S3 r6SNS4 jr7S5 r8S6 r9S7 r:S8 r;S9 r<SNS: jr=S; r>S< r?S= r@S> rAS? rBS@ rCSA rD                  SOSB jrESC rFSPSD jrGSE rHSF rI\%SG 5       rJ\%SH 5       rK\
rL\
rM\
rNSIrOg)QXmliI  c                     U $ r-   r.   r/   s    r)   	__enter__Xml.__enter__K      r+   c                     g r-   r.   r  s     r)   __exit__Xml.__exit__N      r+   c                    [        U[        R                  5      (       a  Xl        g [        U[        5      (       a2  [        R
                  " U5      n[        R                  " U5      U l        g  S[        U5       35       e)NzUnsupported type for rhs: )rB   r   FzXmlr   r   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r(   rhsr  s      r)   r   Xml.__init__Q  s]    c5;;''IS!!77<D55d;DI>249+>>1r+   c                 .   ^ U4S jmSn/ nT" XU5      nU$ )Nc           	        > U b  U R                   (       a/  UR                  USU R                   S345        U R                  n MC  UR                  USU R                   345        U R                  5       R                  5        H  u  p4UR                  USU SU S345        M!     U R                  nU(       a  T" XQUS-   5      nUR                  USU R                   345        U R                  n U b  M  U$ )N"(r   z 'r   r   ))is_textro   r   r\  tagnameget_attributesrF   first_child)noderF   shiftkrJ   child	show_nodes         r)   r  %Xml._get_node_tree.<locals>.show_node[  s    "<<LL%1TYYKq)9!:;99Deq%789 //1779DALL%1QCr!A!78 :((%eEAI>Eeq%789yy " Lr+   r   r.   )r(   r  rF   r  s      @r)   _get_node_treeXml._get_node_treeZ  s%    	  $u-r+   c                 J    U R                  S5      nU R                  U5        U$ )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childr(   r  s     r)   add_bullet_listXml.add_bullet_listp  %    ##D)% r+   c                     U R                  S5      nUb  X;   a  U $ U R                  S5        Uc  UnOUSU-   -  nU R                  SU5        U $ )z5Set some class via CSS. Replaces complete class spec.classr   get_attribute_valueremove_attributeset_attribute)r(   r   clss      r)   	add_classXml.add_classv  s[    &&w/?t{Kg&;C3:C7C(r+   Nc                     U R                  S5      n[        U5      [        L a   UR                  U R	                  U5      5        U R                  5       nUc  U nUR                  U5        U $ )zAdd a "code" tagr  r  r   r   r  create_text_nodespan_bottomr(   r   r  prevs       r)   add_codeXml.add_code  sb    ##F+:t44T:;!<D% r+   c                 J    U R                  S5      nU R                  U5        U$ )z!Add monospaced lines ("pre" node)prer  r  s     r)   add_codeblockXml.add_codeblock  %    ##E*% r+   c                 J    U R                  S5      nU R                  U5        U$ )zAdd description list ("dl" tag)dlr  r  s     r)   add_description_listXml.add_description_list  r  r+   c                 J    U R                  S5      nU R                  U5        U$ )zAdd "div" tagdivr  r  s     r)   add_divisionXml.add_division  r  r+   c                     U[        SS5      ;  a  [        S5      eU R                  nSU 3nU R                  U5      nUS;  a  U R	                  U5        U$ U R
                  R	                  U5        U$ )zAdd header tagr      zHeader level must be in [1, 6]h)h1h2h3h4h5h6r  )rR  r   r  r  r  r   )r(   r   this_tagnew_tagr  s        r)   
add_headerXml.add_header  ss    a#=>><<eW+##G,DDe$L  'r+   c                 J    U R                  S5      nU R                  U5        U$ )zAdd horizontal line ("hr" tag)hrr  r  s     r)   add_horizontal_lineXml.add_horizontal_line  r  r+   c                 $   U R                  S5      nUb  UR                  SU 5        Ub  UR                  SU 5        Ub  UR                  SSU 35        Ub  UR                  SU 5        UR                  SU 5        U R                  U5        U$ )zAdd image node (tag "img").imgr  heightr  zfloat: r  src)r  r  r  )r(   r   r  r0  imgfloatr  r  s          r)   	add_imageXml.add_image  s    ##E*E74VH678*)=>E74EdV-% r+   c                    U R                  S5      n[        U[        5      (       d  UnUR                  SU5        UR	                  U R                  U5      5        U R                  5       nUc  U nUR	                  U5        U $ )zAdd a hyperlink ("a" tag)r    href)r  rB   r   r  r  r
  r  )r(   r6  r   r  r  s        r)   add_linkXml.add_link  sx    ##C($$$DFD)40067!<D% r+   c                     U R                   S;  a  [        SU R                   5      eU R                  S5      nU R                  U5        U$ )z8Add item ("li" tag) under a (numbered or bulleted) list.)olr  zcannot add list item toli)r  r   r  r  r  s     r)   add_list_itemXml.add_list_item  sC    <<|+6EE##D)% r+   c                     U R                  S5      nUS:  a  UR                  S[        U5      5        Ub  UR                  SU5        U R                  U5        U$ )zAdd numbered list ("ol" tag)r:  r   r  r   )r  r  r   r  )r(   r  numtyper  s       r)   add_number_listXml.add_number_list  sV    ##D)19U40% r+   c                     U R                  S5      nU R                  S:w  a  U R                  U5        U$ U R                  R                  U5        U$ )zAdd "p" tagr  )r  r  r  r   r  s     r)   add_paragraphXml.add_paragraph  sL    ##C(<<3e$  KK$$U+r+   c                 J    U R                  S5      nU R                  U5        U$ Nspanr  r  s     r)   add_spanXml.add_span  s%    ##F+% r+   c                     U R                  S5      nUb  X;   a  U $ U R                  S5        Uc  UnOUSU-   -  nU R                  SU5        U $ )z;Set some style via CSS style. Replaces complete style spec.r  ;r  )r(   r   r  s      r)   	add_styleXml.add_style  s\    ((1Kg&=ES4ZE7E*r+   c                     U R                  S5      n[        U5      [        L a   UR                  U R	                  U5      5        U R                  5       nUc  U nUR                  U5        U $ )zAdd a subscript ("sub" tag)r  r	  r  s       r)   add_subscriptXml.add_subscript  b    ##E*:t44T:;!<D% r+   c                     U R                  S5      n[        U5      [        L a   UR                  U R	                  U5      5        U R                  5       nUc  U nUR                  U5        U $ )zAdd a superscript ("sup" tag)supr	  r  s       r)   add_superscriptXml.add_superscript	  rQ  r+   c                 "   UR                  5       n[        U5      nU R                  5       nUc  U n[        U5       HO  u  pVUR	                  U R                  U5      5        XSS-
  :  d  M/  UR	                  U R                  S5      5        MQ     U $ )z"Add text. Line breaks are honored.r   r$  )r  r;   r  	enumerater  r
  r  )r(   r   lines
line_countr  rf  rs   s          r)   add_textXml.add_text	  s    !Z
!<D 'GAd33D9:>!!!$"5"5d";< ( r+   c                 Z    [         R                  " U R                  UR                  5        g r-   )r   fz_dom_append_childr   r  s     r)   r  Xml.append_child 	  s    !!499ejj9r+   c                     U R                  S5      nUR                  U5        U R                  5       nUc  U nUR                  U5        U$ rF  )r  rL  r  r  )r(   r  rG  r  s       r)   append_styled_spanXml.append_styled_span#	  sI    ""6*u!<D$r+   c                 T    [        [        R                  " U R                  5      5      $ r-   )r  r   fz_dom_bodyr   r/   s    r)   bodytagXml.bodytag,	  s    E%%tyy122r+   c                 X    [         R                  " U R                  5      n[        U5      $ r-   )r   fz_dom_cloner   r  r(   rK   s     r)   clone	Xml.clone/	  s       $)),Cyr+   c                     [        U 5      [        L a  U $ [        U 5      [        L a  S[        U 5       S3$ [        U 5      [        [
        4;   a  S[	        U 5       3$ U $ )Nzrgb(r  r  )r   r   r8   sRGB_to_rgbr   r   )colors    r)   
color_textXml.color_text3	  sZ    ;#L;#+e,-Q//;5$-'u''r+   c                 V    [        [        R                  " U R                  U5      5      $ r-   )r  r   fz_dom_create_elementr   )r(   tags     r)   r  Xml.create_element=	  s    E//C@AAr+   c                 V    [        [        R                  " U R                  U5      5      $ r-   )r  r   fz_dom_create_text_noder   r(   r   s     r)   r
  Xml.create_text_node@	  s    E11499dCDDr+   c                     U R                  5       nU H*  n[        SUS   -  US   R                  SS5      -   5        M,     g)z)Print a list of the node tree below self.z  r   r   r%   \nN)r  rv   r  )r(   rF   rG   s      r)   debug	Xml.debugC	  s>    ##%DD47NT!W__T5%AAB r+   c                     [         R                  " U R                  XU5      nUR                  (       a  [	        U5      $ g r-   )r   fz_dom_findr   r   r  r(   rr  attmatchrK   s        r)   r   Xml.findI	  s0    Ce<>>9 r+   c                     [         R                  " U R                  XU5      nUR                  (       a  [	        U5      $ g r-   )r   fz_dom_find_nextr   r   r  r~  s        r)   	find_nextXml.find_nextN	  s0    $$dii5A>>9 r+   c                     [         R                  " U R                  5      (       a  g [         R                  " U 5      nUR                  (       a  [        U5      $ g r-   )r   fz_xml_textr   fz_dom_first_childr   r  rh  s     r)   r  Xml.first_childS	  s@    dii((&&->>9 r+   c                 V    U(       d   e[         R                  " U R                  U5      $ r-   )r   fz_dom_attributer   r(   keys     r)   r  Xml.get_attribute_value\	  s     
s%%tyy#66r+   c                     [         R                  " U R                  5      (       a  g [        5       nSn [         R                  " U R                  U5      u  p4U(       a  U(       d   U$ X1U'   US-  nM?  Nr   r   )r   r  r   r9   fz_dom_get_attribute)r(   resultrf  r  r  s        r)   r  Xml.get_attributes`	  sg    dii((11499a@HCc  CLFA r+   c                 Z    [         R                  " U R                  UR                  5        g r-   )r   fz_dom_insert_afterr   r(   r  s     r)   insert_afterXml.insert_aftern	  s    !!499dii8r+   c                 Z    [         R                  " U R                  UR                  5        g r-   )r   fz_dom_insert_beforer   r  s     r)   insert_beforeXml.insert_beforeq	  s    ""DIItyy9r+   c                     UR                  5       n[        U5      n[        U5       HO  u  pEU R                  U R	                  U5      5        XCS-
  :  d  M/  U R                  U R                  S5      5        MQ     U $ )Nr   r$  )r  r;   rW  r  r
  r  )r(   r   rX  rY  rf  rs   s         r)   insert_textXml.insert_textt	  sk    !Z
 'GAd33D9:>!!!$"5"5d";< ( r+   c                     U R                   SL$ )zCheck if this is a text node.Nru   r/   s    r)   r  Xml.is_text}	  s     yy$$r+   c                 V    U R                   nUc  g UR                  nU(       d  U$ UnM  )zReturn last child node.N)r  r\  )r(   r  r\  s      r)   
last_childXml.last_child	  s5       =::DE	 r+   c                 |    [         R                  " U R                  5      nUR                  (       a  [	        U5      $ g r-   )r   fz_dom_nextr   r   r  rh  s     r)   r\  Xml.next	  s,    +>>9 r+   c                 |    [         R                  " U R                  5      nUR                  (       a  [	        U5      $ g r-   )r   fz_dom_parentr   r   r  rh  s     r)   r   
Xml.parent	  s,    !!499->>9 r+   c                 |    [         R                  " U R                  5      nUR                  (       a  [	        U5      $ g r-   )r   fz_dom_previousr   r   r  rh  s     r)   previousXml.previous	  s,    ##TYY/>>9 r+   c                 D    [         R                  " U R                  5        g r-   )r   fz_dom_remover   r/   s    r)   remove
Xml.remove	  s    TYY'r+   c                 X    U(       d   e[         R                  " U R                  U5        g r-   )r   fz_dom_remove_attributer   r  s     r)   r  Xml.remove_attribute	  s    
s%%tyy#6r+   c                 T    [        [        R                  " U R                  5      5      $ r-   )r  r   fz_xml_rootr   r/   s    r)   rootXml.root	  s    E%%tyy122r+   c                     Sn[        U[        5      (       a  UnOCU[        :X  a  SnO6U[        :X  a  SnO)U[        :X  a  SnOU[
        :X  a  SnO[        SU< 35      eX#-  nU R                  U5        U $ )z Set text alignment via CSS styleztext-align: %srE  centerrightjustifyzUnrecognised align=)rB   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   rL  )r(   r  r   ts       r)   	set_alignXml.set_align	  s{    uc""Ao%A''A&&A((A3UH566xtr+   c                 X    U(       d   e[         R                  " U R                  X5        g r-   )r   fz_dom_add_attributer   )r(   r  r   s      r)   r  Xml.set_attribute	  s    
s""DIIs:r+   c                 P    SU R                  U5      -  nU R                  U5        U $ )z"Set background color via CSS stylezbackground-color: %s)rn  rL  r(   rm  r   s      r)   set_bgcolorXml.set_bgcolor	  s&    %)??tr+   c                 J    U(       a  SnOSnSU-  nU R                  U5        U $ )zSet bold on / off via CSS styleboldnormalzfont-weight: %sr`  r(   r  r   s      r)   set_boldXml.set_bold	  s,    CC 3&%r+   c                 P    SU R                  U5      -  nU R                  U5        U $ )zSet text color via CSS stylez	color: %s)rn  r`  r  s      r)   	set_colorXml.set_color	  s(    dooe44%r+   c                 2    SU 3nU R                  U5        U $ )z(Set number of text columns via CSS stylez	columns: r  )r(   colsr   s      r)   set_columnsXml.set_columns	  s!    4&!%r+   c                 2    SU-  nU R                  U5        U $ )z"Set font-family name via CSS stylezfont-family: %sr  )r(   fontr   s      r)   set_fontXml.set_font	  s     4'%r+   c                 d    [        U5      [        L a  SnOSnSU U 3nU R                  U5        U $ )z Set font size name via CSS styler`   pxzfont-size: )r   r   r`  )r(   r   r  r   s       r)   set_fontsizeXml.set_fontsize	  s;    >S BBXJrd+%r+   c                     U R                   nUR                  SSU5      (       a  [        SU S35      eU R                  SU5        U $ )zSet a unique id.NrX  zid 'z' already exists)r  r   r   r  )r(   uniquer  s      r)   set_id
Xml.set_id	  sJ     yy99T4((tF8+;<==4(r+   c                 J    U(       a  SnOSnSU-  nU R                  U5        U $ )z!Set italic on / off via CSS styleitalicr  zfont-style: %sr  r  s      r)   
set_italicXml.set_italic	  s,    CC#%%r+   c                 2    SU 3nU R                  U5        U $ )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: rL  )r(   leadingr   s      r)   set_leadingXml.set_leading
  s    !'+tr+   c                 2    SU 3nU R                  U5        U $ )z,Set inter-letter spacing value via CSS stylezletter-spacing: r  r(   spacingr   s      r)   set_letter_spacingXml.set_letter_spacing
  s!    !'+%r+   c                 2    SU 3nU R                  U5        U $ )z6Set line height name via CSS style - block-level only.zline-height: r  )r(   
lineheightr   s      r)   set_lineheightXml.set_lineheight
  s    zl+tr+   c                 2    SU-  nU R                  U5        U $ )zSet margin values via CSS stylezmargins: %sr  r  s      r)   set_marginsXml.set_margins
  s    s"%r+   c                 2    SU 3nU R                  U5        U $ )zSet opacity via CSS stylez	opacity: r  )r(   r\  r   s      r)   r  Xml.set_opacity
  s!    7)$%r+   c                 ,    SnU R                  U5        U $ )z$Insert a page break after this node.zpage-break-after: alwaysr  rv  s     r)   set_pagebreak_afterXml.set_pagebreak_after
  s    )tr+   c                 ,    SnU R                  U5        U $ )z%Insert a page break before this node.zpage-break-before: alwaysr  rv  s     r)   set_pagebreak_beforeXml.set_pagebreak_before%
  s    *tr+   c                 J   U R                   nUR                  5       nUb  UR                  U5        Ub  UR                  U5        Ub  UR	                  U5        Ub  UR                  U5        Ub  UR                  U5        Ub  UR                  U5        Ub  UR                  U5        Ub  UR                  U5        U	b  UR                  U	5        U
b  UR                  U
5        Ub  UR                  U5        Ub  UR                  U5        Ub  UR                  U5        Ub  UR                  5         Ub  UR!                  5         Ub  UR#                  U5        Ub  U R%                  U5        Ub  U R'                  U5        / nUR)                  S5      nUb  UR+                  U5        UR,                  nU(       a5  UR+                  UR)                  S5      5        UR,                  nU(       a  M5  U R/                  SSR1                  U5      5        UR3                  5         U $ )zPSet any or all properties of a node.

To be used for existing nodes preferably.
r  rK  )r  r  r  r  r  r  r  r  r  set_text_indentr  r  r  r  r  r  r  set_word_spacingr  r  r  ro   r  r  r  r  )r(   r  bgcolorr  rm  columnsr  r   indentr  r  letter_spacingr  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r  tempstyles	top_styler  s                           r)   set_propertiesXml.set_properties+
  s   2 yy  "NN5!W%MM$NN5!W%MM$h'  (OOF#W%%##N3!
+W%&$$&'%%'#!!,/KK?NN3,,W5	 MM)$  MM%33G<=%%E e 	7CHHV$45r+   c                 2    SU 3nU R                  U5        U $ )z;Set text indentation name via CSS style - block-level only.ztext-indent: r  )r(   r  r   s      r)   r  Xml.set_text_indentw
  s    vh'tr+   c                 2    SU-  nU R                  U5        U $ )Nztext-decoration: %sr  r  s      r)   set_underlineXml.set_underline}
  s    $s*%r+   c                 2    SU 3nU R                  U5        U $ )z*Set inter-word spacing value via CSS stylezword-spacing: r  r  s      r)   r  Xml.set_word_spacing
  s!    y)%r+   c                 f   U nU R                   nUc  gUR                  (       a#  UR                  nUc  OUR                  (       a  M#  Ub  UR                  S:w  a  g Uc  U$ UR                  S;   d  UR                  (       a  UR                  nM5  UR                  S:X  a  UnUR
                  nOU$ MW  )z$Find deepest level in stacked spans.NrG  )r    r  rS  body)r  r  r  r  r\  r  )r(   r   r  s      r)   r  Xml.span_bottom
  s    =mmNNE} mmm =EMMV3}}} 99U]]

}}&)) r+   c                 B    [         R                  " U R                  5      $ r-   )r   
fz_xml_tagr   r/   s    r)   r  Xml.tagname
  s    ++r+   c                 B    [         R                  " U R                  5      $ r-   )r   r  r   r/   s    r)   r   Xml.text
  s      $)),,r+   r   r-   ro  rr  r   NT)NNNNNNNNNNNNNNNNNN)	underline)Pr1   r2   r3   r4   r  r  r   r  r  r  r  r  r  r  r(  r,  r3  r7  r<  r@  rC  rH  rL  rO  rT  rZ  r  r`  rd  ri  rx  rn  r  r
  rz  r   r  rs  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   add_varadd_sampadd_kbdr5   r.   r+   r)   r  r  I  sD   ?,	
		:3  BEC

  79: % % 	 	  
  
  
(7 3 3&;  !'JX
2 , , - - GHGr+   r  c                   F    \ rS rSrS rS rS r\S 5       r\S 5       r	Sr
g)	
Colorspacei
  c                 *   [        U[        R                  5      (       a  Xl        gU[        :X  a4  [        R                  " [        R                  R
                  5      U l        gU[        :X  a4  [        R                  " [        R                  R                  5      U l        gU[        :X  a4  [        R                  " [        R                  R                  5      U l        g[        R                  " [        R                  R                  5      U l        g)z!Supported are GRAY, RGB and CMYK.N)
rB   r   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r(   ra  s     r)   r   Colorspace.__init__
  s    ue0011Ig**5+=+=+H+HIDIg**5+=+=+H+HIDIf_**5+=+=+G+GHDI**5+=+=+G+GHDIr+   c                 H    SU R                      nSU< SU R                  < 3$ )N)r`   GRAYr`   RGBCMYKzColorspace(CS_z) - )rI   r   r(   rb  s     r)   r   Colorspace.__repr__
  s    +DFF3+,dii88r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_colorspace_namer   r/   s    r)   _nameColorspace._name
  s    ''		22r+   c                 B    [         R                  " U R                  5      $ )zSize of one pixel.)r   fz_colorspace_nr   r/   s    r)   rI   Colorspace.n
       $$TYY//r+   c                 "    U R                  5       $ )zName of the Colorspace.r=  r/   s    r)   r   Colorspace.name
  s     zz|r+   r#  N)r1   r2   r3   r4   r   r   r=  rs  rI   r   r5   r.   r+   r)   r+  r+  
  s:    I93 0 0  r+   r+  c                       \ rS rSrS rSrg)DeviceWrapperi
  c                    [        U[        R                  5      (       a  Uu  nX l        g [        U[        S 5      (       a  Uu  p4[        U5      n[        R                  " U5      (       a0  [        R                  " [        R                  " 5       U5      U l        g [        R                  " [        R                  " 5       X55      U l        g [        U[        R                  5      (       a   Uu  n[        R                  " U5      U l        g [        U[        R                  S 5      (       a6  Uu  px[        R                  " U5      n	[        R                  " Xy5      U l        g [        SU< 35      e)Nz%Unrecognised args for DeviceWrapper: )
args_matchr   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicer{  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicerk   )
r(   r  devicepmr  r5  r  tpr  optss
             r)   r   DeviceWrapper.__init__
  s   tU^^,,GFIvt,,HB#T*D))400!44enn6FK	!>>@PRT[	u2233CB00"5DIu00$77IB''/D112<DIDTHMNNr+   r#  Nr   r.   r+   r)   rG  rG  
  s    Or+   rG  c                   J    \ rS rSrS rS rS
S jrSS jr\S 5       r	S r
S	rg)DisplayListi
  c                 8    [        U 5      [        La  g SU l        g NF)r   rX  r   r/   s    r)   __del__DisplayList.__del__
  s    Dz[(&r+   c                 0   [        U5      S:X  aA  [        US   [        R                  5      (       a  [        R                  " US   5      U l        g [        U5      S:X  a-  [        US   [        R                  5      (       a  US   U l        g  SU< 35       e)Nr   r   zUnrecognised args=)r;   rB   r   rp  rO  r   r  s     r)   r   DisplayList.__init__
  su    t9>ja%,,??++DG4DIY!^
47E4G4G H HQDI-+dW--1r+   Nc                     [        U[        5      (       a  UR                  nO.[        R                  " [        R                  R
                  5      n[        U R                  XX4S 5      nSUl        U$ NT)rB   r+  r   r   r-  r3  JM_pixmap_from_display_listr   )r(   r  r  r  r  r  s         r)   r  DisplayList.get_pixmap
  sU    j*--#J++E,>,>,H,HIJ)$))VVZ[
r+   c                     [         R                  " 5       nXl        [         R                  " U R                  U5      nSUl        U$ )z#Make a TextPage from a DisplayList.T)r   r  r  r  r   r   )r(   r  stext_optionsr  s       r)   r#  DisplayList.get_textpage
  s8    ,,.#		=9
r+   c                 n    [        [        R                  " U R                  5      5      n[	        U5      nU$ r-   )ro  r   fz_bound_display_listr   r*  r(   r  s     r)   r   DisplayList.rect  s)    e99$))DE3i
r+   c                     [         R                  " U R                  UR                  [	        U5      [        U5      [         R                  " 5       5        g r-   )r   fz_run_display_listr   rR  r  r  FzCookie)r(   dwr  areas       r)   runDisplayList.run
  s8    !!				!!$% 	r+   r   r   )NNr   N)r   )r1   r2   r3   r4   r[  r   r  r#  rs  r   ro  r5   r.   r+   r)   rX  rX  
  s/    .  
r+   rX  c                      \ rS rSrS\4S jrGSS jrS rS r\	R                  SS	\S\4S
 jj5       r\R                  S:  a8  \	R                  S	\S\\   4S j5       r\	R                  S	\\\4   S\4S j5       rSS jrGSS jrS\4S jrS\4S jrS rS\SS4S jrS rS rS r   GSSS SS S\S\S\SS4S jjr    GSSS S S S\S\S\SS4S! jjrS" rS#\	R>                  \\4   S\4S$ jr GSS% jr!S& r"S' r#S( r$GSS) jr%S* r&S+\4S, jr'SS-\S.\S/\S0\S1\S\4S2 jjr(S3 r)S4 r*S5 r+S6 r,S7 r-GS S8 jr.S9 r/S: r0S; r1GS!S< jr2S= r3S> r4S? r5S@ r6GS"SA jr7\8SB 5       r9GS SC jr:GS#SE jr;SF r<SG r=SHSHSI.SJ\SK\SS4SL jjr>\8SM 5       r?SN r@SO rAGS$SP jrBGS%SQ\SR\4SS jjrCST rDGS%SQ\4SU jjrESV rF   GSSW\SX\GSY\HSZ\HS[\HSS4S\ jjrIS\4S] jrJS#\	R>                  \\4   4S^ jrKS#\	R>                  \\4   S\L4S_ jrMS#\	R>                  \\4   S\N4S` jrOS\4Sa jrP    GSS#\	R>                  \\4   SX\QSY\HSZ\HS[\HSS4Sb jjrRGS&Sc jrSSd rT                  GS'Sf jrUSg rVGS%Sh jrW   GS(SiS S-\S1\S\Sj\XS\4Sk jjrYGS%Sl jrZSm r[Sn r\SiS S-\S\4So jr]Sp r^SiS S-\S\N4Sq jr_Sr r`GS)SQ\Ss\S\4St jjraGS)SQ\Ss\S\4Su jjrbSv rcGS)Sw jrdSSSSSeSHSx.SiS SQ\Sy\eSz\fS{\gS|\SJ\SS}4S~ jjrh     GS*SiS SQ\S\S{\gS\iSSS\S\	R                  4S jjrkSQ\S\4S jrlS rm GS+SiS S\S\4S jjrnS roSiS S\4S jrpSiS S\4S jrqS rr        GS,S jrs       GS-SiS SQ\S\	R>                  \\S4   S\tS\tS\tS\S\HS\uS\4S jjrvSSSSSDSDSDSSSDSS.S jrw\8S 5       rx\8S 5       ry\8S 5       rz\8S 5       r{\8S 5       r|\8S 5       r}S r~S rS rS rS rS rS rS rGS.S jrS rS r\8S 5       r\8S 5       rS rGS/S jrS rS rS r\8S\N4S j5       rGS%SQ\SR\4S jjr\8S 5       rGS.S jr\8S 5       r   GS!SiS SQ\S\tS\tS\4
S jjrS rS r\8S 5       rS rS rS r\8S\4S j5       r\8S\4S j5       r\GR<                  GR>                  S:  a  \GRB                  GRD                  rO\GRB                  GRD                  \   rGSS\iS\iS\iS\4S jjrS rGS0S jr\8S 5       rS rS+\S\4S jrGS1S jr          GS2S jrGS3S jrS r                   GS4S jrS rS r             GS5SiS S\S\S\S\S\S\S\S\S\S\S\S\S\SS4S jjr    GS6SiS SQ\S\S\S{\gS\SSS\4S jjrS rGS.S jrGS7S jrSS jrS\NS\4S jrGS.SiS S\NSS4S jjrSiS S-\S\SS4S jr    GS8SiS S-\S\	R>                  \S4   S\HS\	R>                  \S4   S\4S jjrS\4S jrS\4S jrS r GS3SiS S\S\S\4S jjr        GS9SiS S\S\XS\iSQ\iS\HS\HSR\SY\HS\tSS4S jjrS rGS:SiS S\S\S\i4S jjrSS jrGS.GS  jrGS;GS jr\8GS 5       r                   GS<GS jrGS r\8GS 5       rSGS.SiS GS\GS\GS	\SS4
GS
 jjrGS rGS rGS rGS rSGS jrGS rGS rGS0GS jrGS rGS rGS rGS rGSr\8" GS 5      r\rGSrg(=  r   i  returnc                 ^   [        U5      [        L a  XR                  :  a  gg[        U5      [        [        4;  d  [        U5      S:w  a  gUu  p# [        U[        5      (       a  US:  d  X R                  :  a  g [        U[        5      (       a  US:  d  X0R                  U5      :  a  gg)NTFr   r   )	r   r8   
page_countr   r   r;   rB   chapter_countchapter_page_count)r(   locchapterpnos       r)   __contains__Document.__contains__  s    9__$9UDM)SX]!'3//Q;000!#s++711'::r+   Nc                    U R                   (       d  [        S5      e[        U5      [        L a  U R	                  U5      $ [        U5      [
        [        [        4;   a  U R                  U5      $ [        U5      [        La  [        S5      eU R                  nUR                  (       a  UR                  OSnUR                  (       a  UR                  OUnUR                  (       a  UR                  OSnUS:  a  X2-  nUS:  a  M  X2:  a  [        S5      eUS:  a  XB-  nUS:  a  M  XB:  a  [        S5      eU R                  [        X4U5      5      $ )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r   r8   delete_pager   r   rR  delete_pagessliceru  r  stopstep)r(   rf  pcr  r  r  s         r)   __delitem__Document.__delitem__/  s   {{[))7c>##A&&7tUE**$$Q''7%011__77qvvRqvvQaiKE ai;122QhJD Qh9122  uD!9::r+   c                     U $ r-   r.   r/   s    r)   r  Document.__enter__F  r  r+   c                 $    U R                  5         g r-   closer  s     r)   r  Document.__exit__I      

r+   r   rf  c                     g r-   r.   r(   rf  s     r)   r  Document.__getitem__L  s    r+   )r   	   c                     g r-   r.   r  s     r)   r  r  Q      r+   c                     g r-   r.   r  s     r)   r  r  U  r  r+   c                    [        U[        5      (       a3  [        UR                  [	        U 5      5      6  Vs/ s H  o U   PM	     sn$ [        U[
        5      (       dG  [        U[        5      (       a&  [	        U5      S:X  a  [        S U 5       5      (       d   SU< S35       eX;  a  [        SU S35      eU R                  U5      $ s  snf )Nr   c              3   B   #    U  H  n[        U[        5      v   M     g 7fr-   )rB   r8   ).0rb  s     r)   	<genexpr>'Document.__getitem__.<locals>.<genexpr>\  s      RqopjkS]^_adSeSeops   zInvalid item number: i=r   page z not in document)
rB   r  rR  indicesr;   r8   r   all
IndexError	load_page)r(   rf  r  s      r)   r  r  Y  s    a%*AIIc$i,@%AB%AG%ABB!S!!jE&:&:s1v{sRqopRqOqOq 	.*t1-	.r=uQC'7899~~a   Cs   C
c                 $   [         nSq  SU l        SU l        SU l        SU l        / U l        0 U l        0 U l        0 U l        [        R                  " 5       U l
        [        U[        R                  5      (       a  Un	Xl        SU l         Uq gUn
Un[!        U5      n[        R"                  " U5      (       d2  UR$                  UR&                  -
  n
UR(                  UR*                  -
  nXl        X l        UGb"  Ub  Uc  Un[        U[0        [2        45      (       a  Oj[        U[4        5      (       a  [1        U5      nOI[        U[6        R8                  5      (       a  UR;                  5       nO[=        S[?        U5      < S35      eX l        [        U[0        [2        45      (       d   e[A        U5      S:X  a  [C        S5      e[        RD                  " [        RF                  " U5      [A        U5      5      n [        RH                  " U(       a  UOSU5      nGOU(       Gad  U(       a   e[        U[R        5      (       a  OX[U        US5      (       a  [S        U5      nO;[U        US5      (       a  URV                  nO[=        S[?        U5      < SU< S35      eXl        [X        RZ                  R]                  U5      (       d  [_        SU S35      e[X        RZ                  Ra                  U5      (       d  [Q        SU S35      e[X        RZ                  Rc                  U5      S:X  a  [C        SU< S35      eU(       a/   [        Rd                  " U5      n[        RH                  " UU5      nOC [        Rf                  " U5      nO+[        R                  " 5       n[        Rh                  " U5      nU
S:  a  US:  a  [        Rj                  " XX5        O4[        Rl                  " U5      (       a  [        Rj                  " USSS5        Xl        SU l7        U Rn                  (       a  [p        Rs                  5       U l:        U Rv                  (       a  SU l        OU Ry                  5         U(       a$  UR{                  5       R}                  S5      (       d  U(       a%  SUR{                  5       ;   a   U R                  5       n[        (       ae  [        U R                  [        R                  5      U l        U R                  (       a  [        R                  U lC        O[        R                  U lC        Uq g! [J         a%  n[L        S	:  a
  [O        5         [Q        S
5      UeSnAff = f! [J         a.  n[L        S	:  a
  [O        5         [Q        SU< SU< S35      UeSnAff = f! [J         a*  n[L        S	:  a
  [O        5         [Q        SU< S35      UeSnAff = f! [J         a%  n[L        S	:  a
  [O        5         [Q        S5      UeSnAff = f! Uq f = f)a  Creates a document. Use 'open' as a synonym.

Notes:
    Basic usages:
    open() - new PDF document
    open(filename) - string or pathlib.Path, must have supported
            file extension.
    open(type, buffer) - type: valid extension, buffer: bytes object.
    open(stream=buffer, filetype=type) - keyword version of previous.
    open(filename, fileype=type) - filename with unrecognized extension.
    rect, width, height, fontsize: layout reflowable document
    on open (e.g. EPUB). Ignored if n/a.
r   FNTzbad stream: type(stream)=r   zCannot open empty stream.r`   r   zFailed to open streamabsoluter   zbad filename: type(filename)=z
 filename=zno such file: 'r   z' is no filez!Cannot open empty file: filename=zFailed to open file z	 as type i  iX     svgcannot open broken document)EJM_mupdf_show_errorsr   is_encryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsrB   r   r   r   this_is_pdfr  r  x1x0y1y0r=  r   r  
memoryviewr  r=   r  r  r  r   r;   EmptyFileErrorfz_open_memorypython_buffer_datafz_open_document_with_streamrk   r  rz   FileDataErrorr   r?   r   rh   r	   existsFileNotFoundErrorr  getsizefz_open_filefz_open_documentr   fz_layout_documentfz_is_document_reflowabler   r  gen_id	_graft_id
needs_passinit_docr  r  convert_to_pdfr  r   page_count_pdfpage_count2page_count_fz)r(   rj   r   filetyper   r  r0  r   JM_mupdf_show_errors_oldpdf_documentr   r  r#  stream2r0  rg  	fz_streamr`  r9  s                      r)   r   Document.__init__b  s   $ $8  B	< %DN %D %D#DM!DN!DN!DO#%D&::<DO(E$5$566'(	#' h $< e AA%A,,Q//DD144KDD144K!J K!'H,<  (Hfuj&9::	22"6]F

33#__.F#&@4</$CDD$!&5**=>>>>v;!# ))DEE..u/G/G/OQTU[Q\]H<<XWY[bcC
 !!zh,,Xz22"8}HXv..'}}H#&DT(^4E[xkQR$STT%
 ww~~h//+ohZq,IJJ11'!H:\(BCCWW__X.!3(+MH;a)PQQn$)$6$6x$@	#@@9U
Y#44X> '')&&s+1uQ((=0055((c3;I  DL||!&??(,D%MMO  0 9 9% @ @HQVZbZhZhZjQjR //1
 {#-tyy%:K:K#L ##',';';D$',':':D$#; ] ! H+a/N4D'(?@aGH> % n/!38H+.B8,iX`Wccd,eflmmn % Y/!38H+.B8,a,PQWXXY< % R/!38H+,IJPQQR $< s   B X E+X : T5 D'X -U' /X 1V" D*X 2W A0X 5
U$? UU$$X '
V1)VVX "
W,%WWX 
X# XXX Xc                     U R                   $ r-   )ru  r/   s    r)   __len__Document.__len__  s    r+   c                     U R                   (       a  SOSnU R                  c6  U R                  S:X  a  USU R                  -  -   $ USU R                  < S3-   $ USU R                  U R                  4-  -   $ )Nzclosed r`   zDocument(<new PDF, doc# %i>)z
Document('z')z!Document('%s', <memory, doc# %i>))r   r   r   r  r(   r  s     r)   r   Document.__repr__  si    IR;;yyB9DNNJJJ4996666$))T^^9TTTTr+   c           	         U R                   (       d  U R                  (       a  [        S5      e[        U SS9nUR                  (       d  g[
        R                  " [
        R                  " U5      [        S5      [        S5      [        S5      [        S5      5      nUR                  (       a  [
        R                  " U5      (       d  [        S	5      e[
        R                  " U5      n[        X25      n[
        R                  " XEU5        g)
zAdd new form font.document closed or encryptedr   r   NRootAcroFormDRFontzPDF has no form fonts yet)r   r  r   r   r   r   r  pdf_trailerr  r  r   pdf_new_nameJM_pdf_obj_from_strrT  )r(   r   r  r`  fontsr  rJ   s          r)   _addFormFontDocument._addFormFont  s    >>T..;<<ta0~~##!!3' $  u'8'8%'@'@ ;<<%+Ea(r+   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  r  s      r)   del_toc_itemDocument.del_toc_item  s%    
 %%',d#r+   c                     U R                   (       d  U R                  (       a  [        S5      e/ n[        U SS9nUR                  (       d  U$ [
        R                  " [
        R                  " U5      [        S5      5      n[
        R                  " U[        S5      5      nUR                  (       d  U$ [
        R                  " U[        S5      5      n[        XQ5      n[        U5      n[
        R                  " U5      n[
        R                  " X'5        [
        R                  " U[        S5      5        [        U5       H&  n[        X5      u  p[
        R                  " X*5        M(     UR!                  U5        UnU R#                  5         U$ )zDelete the TOC.r  r   r  r  OutlinesFirst)r   r  r   r   r   r   r
  r  r  JM_outline_xrefsr;   r  pdf_delete_objectrG  rR  JM_INT_ITEMro   r  )r(   xrefsr`  r  olrootfirst
xref_countolroot_xrefrf  r9  r  r  s               r)   _delToCDocument._delToC"  s(   >>T..;<<ta0~~L!!%"3"3C"8(6:JK##D(:*>?  L""68G+<= .Z
&&v.14*!56z"A!%+GA##C. # 	[!
r+   c                     [        U 5      n[        R                  " X!5        UR                  R                  (       a!  [        R
                  " UR                  5        g g r-   )r   r   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)r(   rz  r`  s      r)   _delete_pageDocument._delete_pageB  s>    t$s(>>&&''8 'r+   c                     [        U 5      n[        US[        R                  " U5      S-
  5      (       d  [	        [
        5      e[        R                  " X!5        g)zDelete object.r   N)r   r  r   r  r   r  r  r(   r  r`  s      r)   _deleteObjectDocument._deleteObjectH  sD    t$a!3!3C!8!:;;l++*r+   r  doc1doc2	from_pageto_pagestart_atc                    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 H?  nUS   [        :X  a  US   U
;  a  M  U" UXU5      nU(       d  M.  UR                  U5        MA     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   [        :X  aL  [        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   [        :X  a  U S   S:  as  [        S   nU R                  S[        SS5      5      n
[        U
5      [        La  [        SS5      n
U" U S   U
R
                  U
R                  U S   U S	   U S	   U5      n	U	$ [        S
   n[        U S   5      nUSS nU S	   nU" XU5      n	 U	$ U S   [        :X  a  [        S   nU" U S	   U S	   U5      n	U	$ U S   [        :X  a  [        S   nU" U S   U5      n	U	$ Sn	U	$ )z5Create annotation object string for a passed-in link.fromkindgoto1r   tozoomr   gotor1re   gotor2r   r  launchurir`   )r   r   	LINK_GOTO
annot_skelindexrb  rc  
LINK_GOTORr<   r"  r   get_pdf_strLINK_LAUNCHLINK_URI)lnkxref_dstpno_srcr  r#  r   txtr  r  r   pntr	  r  s                r)   	cre_annot%Document._do_links.<locals>.cre_annot_  s    Fc!AU1X&D6{i' )mmCK0IOHM133S[$GF LC V
*v;!#$X.C''$a4CCy-#AqkFFFFE6 L# %X.C$SY/BAbBFAt,E L V+ *CKVd; L V( 'CJ-
 L Lr+   r   r   z'start_at' must be >= 0r  Nr  r   )ru  r   r   rR  r;   	page_xrefro   	get_linksrs  r  _addAnnot_FromStringr   )r  r   r  r  r  r  r  rT  saincrr  rf  pno_dstxref_srcr  p_srcp_dstold_xrefnew_xrefpage_srclinksr  page_dstlink_tabrQ  
annot_texts                             r)   	_do_linksDocument._do_linksO  s    ,	b q=B//)1$BBQ;'__41$BBa<677Hq" uRdD12#(W#67#6a6#67 s7|$AJEJE~~e,H~~e,HOOH%OOH% % s8}%AAJ'H&&(E
 5zQ111CAJ'HHV9	)qy/G&q(SA
:OOJ/  2~--uX?) & 8s   Gr  r1  c           	        ^.^/^0 UR                   (       d  gS m.S m0U/4S jm/U/4S jnSU.U04S jjnS n	[        R                  " U 5      n
[        R                  " U5      nU R                   (       an  U	" U 5      nUR                  [	        S5      5      nUR                  [	        S	5      5      nUR                  5       (       d  UR                  [	        S	5      S
5      nGO][        R                  " U	" U5      5      nUR                  [	        S5      5        UR                  [	        S5      S
5        UR                  [	        S	5      5        UR                  [	        S	5      S
5        [        R                  " X,5      n[        R                  " X5      nUR                  [	        S5      5      nUR                  [	        S	5      5      nUR                  5       n[        R                  " U
US5      n[        R                  " [        R                  " U
5      [	        S5      5      nUR                  [	        S5      U5        X4::  a  [        X4S-   5      nO[        X4S-
  S5      n0 nU H  nUU   nUR!                  5        VVVs/ s H  u  nnnU[        R"                  :X  d  M  UPM!     snnn HQ  n[        R$                  " UU5      nUR                  [	        S5      5        U" U5      u  nnU(       d  MH  SU/ S.UU'   MS     M     UR'                  5        H  n[        R$                  " UU5      n[        R                  " UU5      n[        R                  " U
U5      n T/" U / 5      n!U R                  5       n"[        R                  " U
U"S5      n#UR)                  U#5        U"UU   S'   U!UU   S'   M     [        [+        U5      5       GH`  nXU-      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%(       d  MZ  [        R,                  " U$5      n&[        R                  " U&R/                  5       [	        S5      5      n'[        R
                  " U'5      (       d/  [        R                  " U&R/                  5       [	        S5      S
5      n'U% GHq  n[        R$                  " UU5      n[        R0                  " [        R2                  " US5      5      n([        R                  " UR                  [	        S5      5      5      nUS:X  a   [        R                  " UU5      n)[        R                  " U
U)5      n+U+R                  5       n[        R                  " U
US5      n,[        R(                  " U'U,5        [        R(                  " UU,5        OPUU   nUS   R9                  U5      n-US   U-   n[        R                  " U
US5      n,[        R(                  " U'U,5        U((       d  GMZ  [        R(                  " UU,5        GMt     GMc     U" XUS9  gs  snnnf s  snnnf ! [4         a  n*[7        SU< SU* 35         Sn*A*GM  Sn*A*ff = f)zInsert widgets of copied page range into target PDF.

Parameter values **must** equal those of method insert_pdf() which
must have been previously executed.
Nc                 2   [        U R                  5       5       Hz  nU R                  U5      nUR                  [	        S5      5      n[        UR                  5       5       H/  nUR                  U5      nUR                  [	        S5      U5        M1     M|     g)z2Make sure all kids have correct "Parent" pointers.Kidsr  N)rR  r  r  r
  r  rT  )acro_fieldsrf  r   kidsr  kids         r)   clean_kid_parents/Document._do_widgets.<locals>.clean_kid_parents  s|    ;4467$2215**8F+;<t1134A,,Q/C$$Xh%7@ 5 8r+   c           	      f   S nS n[         R                  " X5      n[         R                  " X5      nUR                  [        S5      5      n	UR                  [        S5      5      n
U	R	                  5       (       a  U" XX)X:5        gU
R	                  5       (       a  U" XX:X)5        gU" XX'X8U5        g)a  Called for each pair of widgets having the same name.

Args:
    pdf: target MuPDF document
    acro_fields: object Root/AcroForm/Fields
    xref1, xref2: widget xrefs having same names
    name: (str) the name

Result:
    Defined or updated widget parent that points to both widgets.
c                    [         R                  " XS5      n[         R                  " XS5      nUR                  U5      nUR                  U5        UR	                  5       (       d]  [         R
                  " X5      n	U	R                  [        S5      5        U	R                  [        S5      U5        UR                  U5        g[        UR                  5       5       He  n
UR                  U
5      nUR                  [        S5      U5        [         R                  " XR                  5       S5      nUR                  U5        Mg     g)zMerge widget in xref2 into "Kids" list of widget xref1.

Args:
    xref1, kids1: target widget and its "Kids" array.
    xref2, kids2: source wwidget and its "Kids" array (may be empty).
r   r*  r  N)r   r  pdf_array_findr  pdf_is_arraypdf_load_objectrG  r  rT  pdf_array_pushrR  r  r  r  )r`  r2  xref1kids1xref2kids2w1_indw2_indr  r[  rf  r4  kid_inds                r)   	re_target=Document._do_widgets.<locals>.join_widgets.<locals>.re_target  s    //A>//A>!008,,S1))++"223>F ''6''(:FC ((0"5#6#6#89#11!4((();VD"'"8"8nn>NPQ"R,,W5	 :r+   c                 r   [         R                  " U S5      nUR                  [        S5      U5        UR	                  [        S5      S5      n[         R
                  " X5      n	U	R                  5       n
[         R                  " X
S5      nUR                  [        S5      5      nUR                  [        S5      5        U	R                  [        S5      U5        UR                  [        S5      5      nUR                  [        S5      5        U	R                  [        S5      U5        UR                  [        S5      5        UR                  [        S5      U5        UR                  [        S5      5        UR                  [        S5      U5        [         R                  " XS5      n[         R                  " XS5      nUR                  U5        UR                  U5        UR                  U5      nUR                  U5        UR                  U5      nUR                  U5        UR                  U5        g	)
a@  Make new "Parent" for two widgets with same name.

Args:
    xref1, w1: first widget
    xref2, w2: second widget
    name: field name

Result:
    Both widgets have no "Kids". We create a new object with the
    name and a "Kids" array containing the widgets.
    Original widgets must be removed from AcroForm/Fields.
r   r*  r1  r   r   FTAAr  N)r   rY  r  r  pdf_dict_put_arraypdf_add_objectr  r  r
  rG  rT  r<  r9  r  )r`  r2  r=  w1r?  w2r   newr3  new_objnew_obj_xrefnew_indftaaind1ind2r  s                    r)   
new_target>Document._do_widgets.<locals>.join_widgets.<locals>.new_target  s    ((a0,,Xc]DA--hv.>B..s8&11300AF __Xd^4/$$Xd^R8__Xd^4/$$Xd^R8 . 2G<. 2G< --c!<--c!<##D)##D) "006,,S1!006,,S1**73r+   r1  N)r   r;  r
  r  r:  )r`  r2  r=  r?  r   rD  rU  rK  rL  r>  r@  s              r)   join_widgets*Document._do_widgets.<locals>.join_widgets  s    6<04d &&s2B&&s2BOOHV$45EOOHV$45E !!###E%G##%%#E%G3U4Hr+   c           	        > [         R                  " U [        S5      5      nUR                  5       (       d  U$ [	        UR                  5       5       Hv  nUR                  U5      n[         R                  " [         R                  " U[        S5      5      5      (       a
  T" XA5      nMW  UR                  UR                  5       5        Mx     U$ )zFReturn xref list of leaf kids for a parent.

Call with an empty list.
r1  )
r   r
  r  r:  rR  r  r  r  ro   r  )r   	kids_listr3  rf  r4  get_kidss        r)   r[  &Document._do_widgets.<locals>.get_kidsM  s    
 %%fhv.>?D$$&&  4--/0((+$$U%7%7Xf=M%NOO ( 8I$$S^^%56 1 r+   c                    > / n[         R                  " U [        S5      5      nUR                  5       nUS:X  a  X14$ T" X!5      nX14$ )z:Get the xref of top "Parent" and the list of leaf widgets.r  r   )r   r
  r  r  )r[  rZ  r   parent_xrefr[  s       r)   
kids_xrefs(Document._do_widgets.<locals>.kids_xrefs]  sQ    I''0BCF ++-Ka"-- 3I))r+   c                 <  > 0 n[        [        R                  " U5      5       Hp  n[        R                  " X5      nUR	                  5       n[        R
                  " U[        S5      5      nUR                  U/ 5      nUR                  U5        XU'   Mr     UR                  5        Hj  u  p[        U5      S:  a  M  USS u  pU(       a  T" XXU	5        M0  U	SU S3-   n[        R                  " X5      nUR                  [        S5      U5        Ml     T" U5        g)z6Handle any widget name duplicates caused by the merge.r*  r   Nz [r  )rR  r   r  r  r  pdf_dict_get_text_stringr  r<   ro   rF   r;   r;  r  )r`  r2  join_duplicatesnamesrf  wobjectr  r*  r  r   xref0r=  newnamer5  rW  s                r)   deduplicate_names/Document._do_widgets.<locals>.deduplicate_namesg  s    E 5..{;<--k=))+ 227HSMJ		!R(T" a =  %{{}u:>$Ray" 5F"r%]2G#33C?G44Xc]GL  - k*r+   c                     [         R                  " U 5      n[         R                  " [         R                  " U5      S5      $ )z,Retrieve the AcroForm dictionary form a PDF.Root/AcroForm)r   pdf_document_from_fz_documentpdf_dict_getpr  )r0  r`  s     r)   get_acroform*Document._do_widgets.<locals>.get_acroform  s0    55c:C&&u'8'8'=OOr+   Fieldsr  r   r   r  r  r   r  P)r'  old_kidsnew_kidsr'  rs  r  zAA/Cr  zcannot copy widget at xref=r   rr  )rc  F)is_form_pdfr   rl  r
  r  r:  rI  pdf_deep_copy_objrG  pdf_graft_mapped_objectrJ  r  r  r  rT  rR  annot_xrefsrS  r;  keysr<  r;   r   r  r  rm  rk   r  r  )1r  r1  graftmapr  r  r  rc  r_  rh  rn  tarpdfsrcpdfacror2  tar_co
acro_graftacro_tartar_xrefacro_tar_indr  	src_rangeparentsrf  src_pager  wtyper9  w_objr^  rr  r   parent_graft
parent_tarkids_xrefs_newparent_xref_new
parent_indtar_pagew_xrefstar_page_pdf
tar_annotsis_aacw_obj_graftrg  	w_obj_tarw_obj_tar_indr  r5  r[  rW  s1                                                 @@@r)   _do_widgetsDocument._do_widgets  s    	Ah	IT	 	*	+ 	+8	P 44S944S9??$D++HX,>?K&&x~6F&&((00$C **<+<=D hx01##HX$6:htn-##HTNA6 66xFJ ++F?H"//0BCK**8D>:F  **,H 11&(AFL%%e&7&7&?&AQRDhz2LAi15Ii1b9I A1vH '/&:&:&<&<ND%E222 &<
 --fd;""8C=1 )35(9%X;$%$,$&,GK( & LLND**648F 886JL--flCJ%j"5N(335O//KJ&&z2(7GDM*%(6GDM*% # s9~&Aa<(H 9Q<(H
 '/&:&:&<&<ND%E222 &<  
  !66x@L ++L,<,<,>@RSJ%%j11"55 $$&(:A
  --fd; **5+>+>uf+MN $..&&x'9: !#!&+&C&CHe&T !& 4 4V[ II(335H$)$:$:68Q$OM((]C((mD$[1F ,2248C%j1#6H$)$:$:68Q$OM((]C 6((?=  5 't 	&OmH> % !'*Fr!(MN !s0   ?X2
X2
,X9
X9
*Y  
Y(
Y##Y(c           	         [        U 5      n[        R                  " [        R                  " U5      [	        S5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " USU-  S-   5      n[        R                  " U[	        S5      [	        S5      5      n[        R                  " U5      n[        U5      nU$ )Nr  NamesEmbeddedFilesr   r   r  r  )r   r   r  r  r  r  r!  r"  )r(   r  r`  rd  entryfilespecr  conts           r)   _embeddedFileGetDocument._embeddedFileGet  s    t$##!!#& !)! ##E1S573&&uhtnhsmL##H-$r+   rG   c                     U R                  5       nS[        U5      -  nX;   a  UR                  U5      nU$ U[        [	        U5      5      ;   a  UnU$ [        U5      e)Nz '%s' not in EmbeddedFiles array.)embfile_namesr   r  rR  r;   r   )r(   rG   	filenamesr   r  s        r)   _embeddedFileIndexDocument._embeddedFileIndex  sd    &&(	03t9<//$'C
 
	 U3y>**C 
 S/!r+   c           	      f   [        U 5      n[        U5      nUR                  (       d  [        [        5      e[
        R                  " [
        R                  " U5      [        S5      [        S5      [        S5      [        S5      5      n[
        R                  " U5      (       d  [
        R                  " [
        R                  " U5      [        S5      5      n	[
        R                  " US5      n[
        R                  " U	U[        S5      [        S5      [        S5      5        [        XgX4US5      n
[
        R                  " [
        R                  " U
[        S5      [        S5      5      5      n[
        R                  " U[
        R                   " U5      5        [
        R                  " X5        U$ )Nr  r  r     r   r  r  )r   r-  r   r  r.  r   r  r  r  r:  r
  rQ  rO  JM_embed_filer  r<  r  )r(   r   r3  rj   rP  r  r`  r  rd  r  	fileentryr  s               r)   _embfile_addDocument._embfile_add)  sE   t$!'*^,,##!!#& !)! !!%((%%e&7&7&<hv>NOD''Q/EW%_-W% "#X$J	##Ix~x}M 	UE$=$=d$CDU.r+   c           	         [        U 5      n[        R                  " [        R                  " U5      [	        S5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " X1S-   5        [        R
                  " X15        g )Nr  r  r  r   )r   r   r  r  r  r  )r(   r  r`  rd  s       r)   _embfile_delDocument._embfile_delH  sl    t$##!!#& !)! 	uAg.u*r+   c           	         [        U 5      nSnSn[        R                  " U5      n[        R                  " U[	        S5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " USU-  S-   5      n[        R                  " U[	        S5      5      n	U	R                  (       a  [        R                  " U	5      nXRS'   [        R                  " [        R                  " U[	        S	5      5      5      n
[        U
5      U[        '   [        R                  " [        R                  " U[	        S
5      5      5      n
[        U
5      U[        '   [        R                  " [        R                  " U[	        S5      5      5      n
[        U
5      U[        '   SnSn[        R                  " U[	        S5      [	        S	5      5      n[        R                  " U5      n[        R                  " U[	        S5      5      nUR                  (       a  [        R                  " U5      n[        R                  " U[	        S5      5      nUR                  (       a  [        R                  " U5      nOQ[        R                  " U[	        S5      [	        S5      5      nUR                  (       a  [        R                  " U5      nX[         '   X["        '   U$ )Nr   r  r  r  r   r   CI
collectionr  r  r  r  r  r  rK  r  r  )r   r   r  r  r  r  r
  r   r  r  r  r  dictkey_ufilenamer  r  r  r  r  )r(   r  infodictr`  r  ci_xreftrailerrd  r  cir   len_rK  r  s                 r)   _embfile_infoDocument._embfile_infoT  s   t$##C(## !)! quQw/8D>2==&&r*G!(''(:(:1hsm(LM%8%>!"''(:(:1htn(MN&9$&?"#''(:(:1hv>N(OP"3D"9''8D>8C=I		*y(8*<=<<##A&Dy(4.9<<!!!$B##Ix/A8FCSTA||%%a(!##' r+   c           	         [        U 5      n[        R                  " [        R                  " U5      [	        S5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " U5      (       ao  [        R                  " U5      n[        SUS5       HG  n[        [        R                  " [        R                  " X55      5      5      nUR                  U5        MI     gg)z Get list of embedded file names.r  r  r  r   r   N)r   r   r  r  r  r:  r  rR  r  r  r  ro   )r(   r  r`  rd  rI   rf  r  s          r)   _embfile_namesDocument._embfile_names  s    t$##!!#& !)! e$$##E*A1a^)00!//9
 $ $ %r+   c           	         [        U 5      nSn[        R                  " [        R                  " U5      [	        S5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " USU-  S-   5      n	[        R                  " U	[	        S5      [	        S5      5      n
U
R                  (       d  [        S	[        5        [        U5      nU(       a1  UR                  (       a   UR                  (       d  [        [        5      eUR                  (       a  U(       a  UR                  (       a  [        XjUS5        [        R                  " U5      u  p[        R                  " U5      n[        R                  " U
[	        S
5      U5        [        R                   " X[	        S5      [	        S5      5        [        R"                  " U
5      nU(       a!  [        R$                  " U	[	        S5      U5        U(       a!  [        R$                  " U	[	        S5      U5        U(       a!  [        R$                  " U	[	        S5      U5        U$ )Nr   r  r  r  r   r   r  r  rJ  rK  r  r  r  r  )r   r   r  r  r  r  r   r  r  r-  r  r.  r/  rM  rN  rT  rO  r  r  )r(   r  r3  rj   rP  r  r`  r  rd  r  r  r$  r;   r9  rQ  s                  r)   _embfile_updDocument._embfile_upd  s   t$##!!#& !)! ##E1S573&&uhtnhsmL""-/CD )w))#..^,,>>g'*<*<SC3,,S1FC!!#&Ax$;Xh-?&AQR)**5(3-J**5(4.)L**5(62BDIr+   c           	      B   U R                   (       a  [        S5      e[        (       a!  [        R                  " U R
                  U5      $ [        U 5      nSnSnSnSn[        R                  " [        R                  " U5      [        S5      5      nUR                  (       d  g[        R                  " U[        S5      5      nUR                  (       d  g[        R                  " U[        S	5      5      n	U	R                  (       d  g/ n
[        X5      n
[        U
5      n[        U5      nU(       d  gX:w  a  [        S
5      e[        U5       GH  n[!        X   5      nX   nUS   n[#        U[$        5      (       d  [        S5      eX   U[&        '   [        R(                  " X.5      n[        R*                  " [        R                  " U[        S5      5      5      nUS:X  a  SUU'   OUS:X  a  SUU'   OUS:X  a
  SUU'   SUU'   [        R*                  " [        R                  " U[        S5      5      5      nUS:  a  SUU'   OUS:  a  SUU'   [        R                  " U[        S5      5      n[        R,                  " U5      (       a  [        R.                  " U5      S:X  a  [        R0                  " [        R2                  " US5      5      [        R0                  " [        R2                  " US5      5      [        R0                  " [        R2                  " US5      5      4nUU[4        '   Sn[        R                  " U[        S5      5      nUR                  (       a  [        R,                  " U5      (       d*  [        R6                  " U[        S5      [        S5      5      n[        R,                  " U5      (       aE  [        R.                  " U5      S:X  a+  [        R0                  " [        R2                  " US5      5      n[9        U5      UU'   UUS'   XU'   GM     g)z4Add color info to all items of an extended TOC list.r   r
  r  r  collapser  Nr  r  z$internal error finding outline xrefsr   zneed non-simple TOC formatr  r   Tr   Countr   Fr  DestADr   ro  )r   r   r  r   Document_extend_toc_itemsr   r   r   r
  r  r  r   r  r;   r  rR  r8   rB   r9   r  r;  r  r:  r  r  r  dictkey_colorr  r  )r(   rF   r`  r
  r  r  r  r  r  r  r  rI   r  rf  r  rG   itemdictbmr  countre  rm  zr  s                           r)   _extend_toc_itemsDocument._extend_toc_items  sC   >>.//;22DIIuEEt$!!%"3"3C"8(6:JK##D(:*>?  ""68G+<= .JJ6DEE qAux=D8DAwHh-- ">??%*XH\"&&s1B$$e&8&8Xc]&KLEz#' !!%!#' !%$$e&8&8Xg=N&OPEqy%)"%*"$$R#7C!!#&&5+>+>s+Cq+H))%*=*=c1*EF))%*=*=c1*EF))%*=*=c1*EF
 +0'A$$R&)9:C>>););C)@)@))"hsmXc]K!!#&&5+>+>s+Cq+H%%e&9&9#q&AB"1XHTNDG!HK r+   r   c                 T    [        U5      nX R                  ;   a  U R                  U	 gg)z&Remove a page from document page dict.N)rX  r  )r(   r   pids      r)   _forget_pageDocument._forget_page  s&    h//!$ "r+   r  bfnameextorderinglimitc                    [        U 5      nUnUS:  a  SnUS:  a3  [        R                  " U5      u  pn[        R                  " S XUS5      nO{[        R                  " U5      u  pU	(       a  [        R                  " X)U
SS5      nOB[        Xq5      nUR                  (       d  [        SU-  5      e[        R                  " S XS5      n/ n[        U5       Hg  n[        R                  " X5      n[        R                  " UUS5      nUS:  a  UnUS:  a  UR                  UU45        MT  UR                  US45        Mi     U$ )N   r   z font at xref %d is not supportedr  )r   r   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   rk   fz_new_font_from_bufferrR  fz_encode_characterfz_advance_glyphro   )r(   r  r  r  r  r  r  r`  mylimitr  r  r  r  r  wlistrf  glyphadvs                     r)   _get_char_widthsDocument._get_char_widths  s!   t$S=Gq= % 8 8 BD00t5!LD44V<JD44V4AN'2~~#$F$MNN44T3QGwA--d6E((ua8C1}qyucl+ucl+   r+   c           	         [        U 5      n/ n[        R                  " S5      n[        R                  " [        R                  " U5      [        S5      U5      nUR                  (       d  U$ [        R                  " [        R                  " U[        S5      5      5      nUR                  (       a  [        X%5        U$ [        R                  " [        R                  " U[        S5      [        S5      5      5      nUR                  (       a  [        X%5        U$ [        R                  " [        R                  " U[        S5      5      5      nUR                  (       a  [        R                  " U5      (       d  U$ [        R                  " U5      n[        U5       HV  n[        R                  " [        R                  " [        R                  " Xh5      [        S5      5      5      n[        X%5        MX     U$ )N
PageLabelsr  Numsr1  )r   r   r  r  r  r  r   pdf_resolve_indirectr
  JM_get_page_labelsr:  r  rR  r  )	r(   r`  r   
pagelabelsr  numsr3  rI   rf  s	            r)   _get_page_labelsDocument._get_page_labels&  sg   t$''5
!!5#4#4S#98F;KZX~~I))5+=+=sHVDT+UV??r(I))5+>+>sHVDTV^_eVf+gh??r(I))5+=+=sHVDT+UVe&8&8&>&>I%qA--&&++D4 (D r(  	r+   c                      [         R                  " U R                  U5      $ ! [         a    [        S:  a
  [        5          gf = f)zGet metadata.r   r`   )r   fz_lookup_metadata2r   rk   r  rz   r  s     r)   _getMetadataDocument._getMetadataF  s=    	,,dii== 	#a'N,<	s    # AAc                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " [        R                  " U5      [        S5      5      n[        R
                  " U[        S5      5      nUR                  (       d  [        R                  " US5      n[        R                  " U[        S5      [        S5      5        [        R                  " X5      n[        R                  " U[        S5      U5        [        R
                  " U[        S5      5      n[        R                  " U5      $ )z/Get xref of Outline Root, create it if missing.r  r  r  ro  Type)r   r  r   r   r   r
  r  r  r   rY  rT  rJ  r  )r(   r`  r  r  ind_objs        r)   _getOLRootNumberDocument._getOLRootNumberN  s    >>T..;<<t$!!5#4#4c#:HV<LM##T8J+?@  ''a0F(8(::NO**C8Ghz&:GD''x
/CDF((r+   c                    [        U SS9nUR                  (       d  g/ n[        R                  " [        R                  " U5      [        S5      5      nUR                  (       a{  [        R                  " U5      n[        U5       HV  n[        R                  " X55      n[        R                  " U5      n[        R                  " U5      nUR                  U5        MX     U$ )zGet PDF file id.r   r  NID)r   r   r   r
  r  r  r  rR  r  r  binasciihexlifyro   )	r(   r`  idlistidentityrI   rf  r  r   hex_s	            r)   _getPDFfileidDocument._getPDFfileid_  s    ta0~~%%e&7&7&<htnM##H-A1X''4//2''-d#	 
 r+   c                 0   U R                   (       d  U R                  (       a  [        S5      eU R                  n[	        U[
        R                  5      (       a  [
        R                  " U5      O[
        R                  " U5      nUnUS:  a  XT-  nUS:  a  M  XT:  a  [        [        5      e[        U 5      n[
        R                  " Xe5      n[
        R                  " U[
        R                  5      n/ n	/ n
UR                  (       a  [        XhXSU
5        U	$ )z,List fonts, images, XObjects used on a page.r  r   )r   r  r   r   rB   r   r   pdf_count_pagesfz_count_pagesMSG_BAD_PAGENOr   pdf_lookup_page_objpdf_dict_get_inheritablePDF_ENUM_NAME_Resourcesr   JM_scan_resources)r(   rz  whatr0  	pageCountrI   r`  pagerefrsrclistetracers              r)   _getPageInfoDocument._getPageInfoo  s    >>T..;<<ii2<S%BSBS2T2TE))#.Z_ZnZnorZs	!eNA !e>n--t$++C3--gu7T7TU??ca@r+   c                 |    [        U 5      nU(       d  U(       d  [        [        5      e[        USXSSSSSS5
      nU$ )z+
Utility: insert font from file or binary.
Nr   r  )r   r   MSG_FILE_OR_BUFFERJM_insert_font)r(   fontfile
fontbufferr`  r   s        r)   _insert_fontDocument._insert_font  s>     t$
011sD(1aArRr+   c                     U R                   n[        U[        R                  5      (       d   e [        R                  " U5      n[        U5      $ ! [
         a    [        S:  a
  [        5          gf = f)zLoad first outline.r   N)	r   rB   r   r   fz_load_outlinerk   r  rz   Outline)r(   r0  r:  s      r)   _loadOutlineDocument._loadOutline  sf    ii3 0 01111	&&,B |  	#a'N,<	s   A A10A1c                 H    U R                   (       a  [        S5      e S5       e)z)Make an array page number -> page object.r   z_make_page_map() is no-op)r   r   r/   s    r)   _make_page_mapDocument._make_page_map  s     >>.//.-.qr+   c                 @   [        U 5      nSn[        XQ5      u  pxn	[        R                  " U[	        S5      5      n
[        XR5      u  pn[        R                  " U[	        S5      5      nU(       a  UnOUS-   n[        R
                  " X5      nU(       d'  US:w  a!  [        R                  " U[	        S5      U5        [        R                  " XU5        US:w  Ga2  UnUR                  (       aw  [        R                  " U[	        S5      5      n[        R                  " U[	        S5      US-   5        [        R                  " U[	        S5      5      nUR                  (       a  Mw  U(       d  [        R                  " X5        UnUR                  (       aw  [        R                  " U[	        S5      5      n[        R                  " U[	        S5      US-
  5        [        R                  " U[	        S5      5      nUR                  (       a  Mw  OU(       a  UnUR                  (       aw  [        R                  " U[	        S5      5      n[        R                  " U[	        S5      US-   5        [        R                  " U[	        S5      5      nUR                  (       a  Mw  O5X:  a  [        R                  " X5        O[        R                  " XS-   5        UR                  R                  (       a   [        R                  " UR                  5        U R                  5         g)z"Move or copy a PDF page reference.r   r1  r   r  r  N)r   pdf_lookup_page_locr   r
  r  r  rT  pdf_array_insertr   pdf_dict_get_intrO  r  r  r  _reset_page_refs)r(   rz  nbbeforecopyr`  samepage1parent1i1r>  page2parent2i2r@  posr   r  s                     r)   _move_copy_pageDocument._move_copy_page  sV   t$ 1#;""GXf-=>0#:""GXf-=>Cq&C . 	x'97Cc219F##..8IJ&&0A519M++VXh5GH ### &&2 ''!22FHW<MNE**FHW4EuqyQ"//(9KLF '''
  ''!22FHW<MNE**FHW4EuqyQ"//(9KLF '''
 8**E6**E6:>>&&''8r+   c                 J   U R                   (       d  U R                  (       a  [        S5      e[        (       a#  [        R
                  " U R                  XU5        O[        U 5      n[        R                  " [        R                  R                  5      nX%l        X5l        [        R                  " 5       nUS:  a  [        [        5      e[        R                  " US5      n[        R                   " XESXv5      n[        R"                  " XAU5        U R%                  5         X   $ )zMake a new PDF page.r  r  r   r   )r   r  r   r  r   _newPager   r   r   rp  
Fixed_UNITr  r  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager!  )	r(   rz  r  r0  r`  mediaboxcontentsrh  page_objs	            r)   r0  Document._newPage  s    >>T..;<<;NNDIIs6:"4(C||ELL$;$;<HK K~~'HRx .11 ..sA6I))3!YQH!!3X6 	yr+   c                 0    [        U 5      n[        X!5        g r-   )r   _remove_dest_range)r(   numbersr`  s      r)   _remove_links_toDocument._remove_links_to  s    t$3(r+   c                    [        U 5      n[        R                  " X!S5      n[        R                  " U[	        S5      5        [        R                  " U[	        S5      5        [        R
                  " US5      n[        S5       H  n[        R                  " US5        M     [        R                  " U[	        S5      U5        g )Nr   r  r  r   皙?r  )	r   r   r  rG  r  rQ  rR  rS  rT  )r(   r  r`  rG   rm  rf  s         r)   r  Document._remove_toc_item  s    t$%%c3D(6"23D(3-0##S!,qA%%uc2 D(3-7r+   c                    [        U SS5      (       a  gU R                  R                  5        Vs/ s H  oPM     nnU H  nU(       d  M  UR                  5         SnM      U R                  R	                  5         gs  snf )z,Invalidate all pages in document dictionary.r   TN)r   r  r  r   clear)r(   r  pagesr   s       r)   r!  Document._reset_page_refs  sk    4d++ OO22454q45Dt  	 6s   A<c                    [        U 5      n[        R                  " S5      n[        R                  " [        R                  " U5      [        S5      5      n[        R                  " XC5        [        R                  " U[        R                  " US5      U[        S5      5        U R                  5       nU R                  USS9nUR                  SSU-  5      nU R                  XV5        g )	Nr  r  r   r  T
compressedz/Nums[]z	/Nums[%s])r   r   r  r
  r  r  rG  rO  rQ  pdf_catalogxref_objectr  update_object)r(   labelsr`  r  r  r  r   s          r)   _set_page_labelsDocument._set_page_labels  s    t$''5
!!%"3"3C"8(6:JK4,D%"5"5c1"=z8TZK[\!6||I{V';<4&r+   c                    [        U 5      n[        R                  " XqS5      nU(       a!  [        R                  " U[	        S5      U5        U(       aL  [        R
                  " U[	        S5      5        [        Xr5      n	[        R                  " U[	        S5      U	5        [        R                  " U[	        S5      U5        U(       ae  [        R                  " US5      n
[        S5       H  nXk   n[        R                  " X5        M     [        R                  " U[	        S5      U
5        O#Ub   [        R
                  " U[	        S5      5        Ub  [        R                  " U[	        S	5      5      R                  (       a_  [        R                  " U[	        S	5      5      nUS:  a  US
L d  US:  a-  USL a'  US-  n[        R                  " U[	        S	5      U5        ggggg)z2
"update" bookmark by letting it point to nowhere
r   Titler  r  r  r   r  Nr  FTr  )r   r   r  r  r  rG  r  rT  rO  rQ  rR  rS  r
  r   r   )r(   r  actionr  r  r  rm  r`  rG   r  r  rf  r  s                r)   _update_toc_itemDocument._update_toc_item  sy    t$%%s!4**D(72CUKhv&67%s3ChsmS9hsmU;##S!,A1XH))10  hsmQ7hsm4!!4'):;FF**D(72CDEh%/QUx4?ORA**D(72CQG @PU G  r+   c           	      &   [        U SS9nUR                  (       d  g[        R                  " [        R                  " U5      [        S5      [        S5      [        S5      [        S5      5      n[        5       nUR                  (       a  [        R                  " U5      (       al  [        R                  " U5      n[        U5       HG  n[        R                  " X%5      nUR                  [        [        R                  " U5      5      5        MI     U$ )z&Get list of field font resource names.r   r  Nr  r  r  r  )r   r   r   r  r  r  r   r  r  rR  r  ro   r  r  )r(   r`  r  r
  rI   rf  r  s          r)   	FormFontsDocument.FormFonts0  s     ta0~~##!!#& $   1 1% 8 8""5)A1X**54.u/@/@/CDE  r+   c                 r    [        U 5      n[        XAX#5        [        R                  " UR                  5        g)zAdd a new OC layer.N)r   JM_add_layer_configr   ll_pdf_read_ocgr   )r(   r   creatoronr`  s        r)   	add_layerDocument.add_layerE  s(    t$S4s~~.r+   r   c                 \   Sn[        U 5      n[        R                  " US5      n[        R                  " U[	        S5      [	        S5      5        [        R
                  " U[	        S5      U5        [        R                  " U[	        S5      S5      n	U(       d!  [        R                  " U	[	        S5      5        O\[        U[        5      (       d   S	[        U5      < S
[        < 35       e[        R                  " U	[        R                  " U5      5        [        R                  " U[	        S5      S5      n
[        R                  " S5      n[        R                  " XS5      n[        R
                  " U[	        S5      S5        U(       a"  [        R                  " U[	        S5      U5        O![        R                  " U[	        S5      S5        [        R                  " Xx5      n[        U5      n[        R                   " U[	        S5      5      n[        R                  " X5        US:  a  [        R                   " U[	        S5      5      n[        R"                  " U5      (       d  [%        [&        5      e[        R(                  " X5      nUR*                  (       d  [%        [&        5      eO [        R                   " U[	        S5      5      n[        R                   " U[	        S5      5      nUR*                  (       d!  [        R                  " U[	        S5      S5      n[        R                  " X5        U(       aS  [        R                   " U[	        S5      5      nUR*                  (       d!  [        R                  " U[	        S5      S5      nOR[        R                   " U[	        S5      5      nUR*                  (       d!  [        R                  " U[	        S5      S5      n[        R                  " X5        [        R,                  " UR*                  5        [        R.                  " U5      nU$ )zAdd new optional content group.r   r   r  OCGr)  Intentr   Viewz)fixme: intent is not a str. type(intent)= type=UsageCreatorInfoCreatorPyMuPDFr  ArtworkOCGsr  Configsr  Orderr   ONOFF)r   r   r3  rT  r  r  rI  r<  rB   r   r   r  rX  r[  rJ  JM_ensure_ocpropertiesr
  r:  r   MSG_BAD_OC_CONFIGr  r   rY  r  )r(   r   configr[  intentusager  r`  ocgintentsuse_forci_namecre_infoindocgocpr  cfgs                    r)   add_ocgDocument.add_ocgK  s   t$ $$S!,3 0(5/B&&sHV,<dC**30BAF  (6*:;FC((LBT&\O7TGLL1   %*<*<V*DE))#x/@!D$$]3**7Q?&&x)1DiP##Hhy.A5I##Hhy.A9M%%c/ %S)  hv&67S)B;$$S(9*=>C%%c** "344%%c2C>> "344 " $$S(3-8C  hw&78~~**30A1ECS)$$S(4.9C>>..sHTNAF##C%9C>>--c8E?AFS) 	cnn-'r+   c                     U R                   (       a  [        S5      e[        R                  " U R                  U5      nU(       a%  SU l        SU l        U R                  5         SU l        U$ )zDecrypt document.r   FT)r   r   r   fz_authenticate_passwordr   r  r  r   )r(   passwordr  s      r)   authenticateDocument.authenticate  sS    >>.//,,TYYA %D %DMMODL
r+   c                 f    [        U SS9nUR                  (       d  g[        R                  " U5      $ )z-Check whether incremental saves are possible.r   r  F)r   r   r   pdf_can_be_saved_incrementallyr(   r`  s     r)   can_save_incrementallyDocument.can_save_incrementally  s)    ta0~~33C88r+   T)r  widgetsr  r  c                n    [        U 5      n[        R                  " U[        U5      [        U5      5        g)a  Convert annotations or fields to permanent content.

Notes:
    Converts annotations or widgets to permanent page content, like
    text and vector graphics, as appropriate.
    After execution, pages will still look the same, but no longer
    have annotations, respectively no fields.
    If widgets are selected the PDF will no longer be a Form PDF.

Args:
    annots: convert annotations
    widgets: convert form fields

N)r   r   pdf_bake_documentr8   )r(   r  r  r`  s       r)   bakeDocument.bake  s(     t$S[#g,?r+   c                 z    U R                   (       a  [        S5      e[        R                  " U R                  5      $ )zNumber of chapters.r   )r   r   r   fz_count_chaptersr   r/   s    r)   rv  Document.chapter_count  s,     >>.//&&		22r+   c                     U R                   (       a  [        S5      e[        R                  " U R                  5      nUS:  d  X:  a  [        S5      e[        R
                  " U R                  U5      nU$ )zPage count of chapter.r   r   zbad chapter number)r   r   r   r  r   fz_count_chapter_pages)r(   ry  chaptersrD  s       r)   rw  Document.chapter_page_count  s\    >>.//**DII6Q;'-233,,diiAr+   c                     [        U SS5      (       a  [        S5      e[        U S5      (       a  U R                  (       a  SU l        U R	                  5         SU l        0 U l        SU l        g)zClose document.r   Tr   _outlineN)r   r   r?   r  r!  r   r  r   r/   s    r)   r  Document.close  s\    4d++.//4$$ DM ! 	r+   c                    U R                   (       d  U R                  (       a  [        S5      eU R                  nUnUn[        R
                  " U5      nUS:  a  SnXWS-
  :  a  US-
  nUS:  a  US-
  nXgS-
  :  a  US-
  n[        [        5      n[        XEXc5      n	[        [        5      n
[        X5       H  n[        [        U    5        M     U	$ )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r  r   r   )r   r  r   r   r   r   r;   JM_mupdf_warnings_storeJM_convert_to_pdfrR  rv   )r(   r  r  r_  fz_docr  rT  srcCountlen0r0  len1rf  s               r)   r  Document.convert_to_pdf  s    >>T..;<<''/6B1AB6AB1AB*+B7*+t"A.q124 #
r+   rz  r	  c                     U R                   (       a  [        S5      e[        U 5      nU[        U5      ;  d  U[        SU5      ;  a  [        S5      eSnSnUS:X  a  US-
  nSnU R	                  XXE5      $ )zCopy a page within a PDF document.

This will only create another reference of the same page object.
Args:
    pno: source page number
    to: put before this page, '-1' means after last page.
r   r  r  r   r   r   r   r;   rR  r-  r(   rz  r	  ru  r#  r$  s         r)   	copy_pageDocument.copy_page  sz     >>.//Y
5,,U2z221228aBF##CV::r+   c                 @   U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " [        R                  " U5      [        S5      5      nUR                  (       a!  [        R                  " U[        S5      5        gg)zDelete XML metadata.r  r  MetadataN)
r   r  r   r   r   r
  r  r  r   rG  )r(   r`  r  s      r)   del_xml_metadataDocument.del_xml_metadata	  sj    >>T..;<<t$!!5#4#4c#:HV<LM??hz&:; r+   c                 $    U R                  U5      $ )z$Delete one page from a PDF.
        )r  )r(   rz  s     r)   r  Document.delete_page  s       %%r+   c                 r   U R                   (       d  [        S5      eU R                  (       a  [        S5      eU R                  nS=pEU(       a  U(       a  [        S5      eUR	                  SS5      nUR	                  SS5      nUS:  a  XC-  nUS:  a  M  US:  a  XS-  nUS:  a  M  XEs=::  a  U:  d  O  [        S5      e[        [        XES	-   5      5      nO[        U5      S
:  d  U/ :X  a  [        S5      e[        U5      S
:X  ak  Uu  pE[        U5      [        L a  [        U5      [        L d  [        S5      eXE:  a  XTpTXEs=::  a  U:  d  O  [        S5      e[        [        XES	-   5      5      nOA[        US   [        5      (       a  US   nUS:  a  Xs-  nUS:  a  M  U4nO[        US   5      n[        [        [        [        U5      5      5      nU/ :X  a  [        S5        gUR                  5         US   S:  d	  US   U:  a  [        S5      e[!        U5      nU R#                  5       n	[%        U R'                  5       5       H&  u  pX   S
   S	-
  U;   d  M  U R)                  U5        M(     U R+                  U5        [-        U5       H  n
U R/                  U
5        M     U R1                  5         g)zDelete pages from a PDF.

Args:
    Either keywords 'from_page'/'to_page', or two integers to
    specify the first/last page to delete.
    Or a list/tuple/range object, which can contain arbitrary
    page numbers.
    Or a single integer page number.
r~  r   r  z*cannot mix keyword and positional argumentr  r  r   r  r   r   z need 1 or 2 positional argumentszboth arguments must be intznothing to deleteN)r  r   r   ru  r<   r   rR  r;   r   r8   rB   r   r  setrv   sort	frozensetget_tocrW  r  r  r=  reversedr  r!  )r(   r  kwru  r  r  r<  rz  frozen_numberstocrf  r  s               r)   r  Document.delete_pages  sh    {{[))>>.//__

 !MNN{B'Ay"%Aa% a%a% a%&J& !566E!UO,G4y1}
 !CDD4yA~Q347c>$%ABB5q*
*$%9::aQ0DGS))1gAg%C Ag&Q.s3G-.b='(1:>WR[J6122"7+lln !7!7!9:GAvay1}.%%d+ ; 	n-'"Aa  # 	r+   r   r3  rj   rP  r  c                 P   U R                  5       nS[        U5      -  nX;   a  [        U5      eUc  UnUc  UnUc  UnU R                  UUUUUS9n[	        5       n	U R                  USS5        U R                  US[        U	5      5        U R                  US[        U	5      5        U$ )a$  Add an item to the EmbeddedFiles array.

Args:
    name: name of the new item, must not already exist.
    buffer_: (binary data) the file content.
    filename: (str) the file name, default: the name
    ufilename: (unicode) the file name, default: filename
    desc: (str) the description.
zName '%s' already exists.r3  rj   rP  r  r  z/EmbeddedFileParams/CreationDateParams/ModDate)r  r   r   r  get_pdf_nowr  r  )
r(   r   r3  rj   rP  r  r  r   r  dates
             r)   embfile_addDocument.embfile_add\  s      &&(	)CI5S/!H I<D  !# !  }$8$ 5{47HI$ 0+d2CDr+   c                 4    [        U R                  5       5      $ )zGet number of EmbeddedFiles.)r;   r  r/   s    r)   embfile_countDocument.embfile_count  s    4%%'((r+   c                 F    U R                  U5      nU R                  U5      $ )a  Delete an entry from EmbeddedFiles.

Notes:
    The argument must be name or index of an EmbeddedFiles item.
    Physical deletion of data will happen on save to a new
    file with appropriate garbage option.
Args:
    item: name or number of item.
Returns:
    None
)r  r  r(   rG   r  s      r)   embfile_delDocument.embfile_del  s%     %%d+  %%r+   c                 F    U R                  U5      nU R                  U5      $ )zGet the content of an item in the EmbeddedFiles array.

Args:
    item: number or name of item.
Returns:
    (bytes) The file content.
)r  r  r  s      r)   embfile_getDocument.embfile_get  s%     %%d+$$S))r+   c                    U R                  U5      nSU R                  5       U   0nU R                  X#5      nU R                  US5      u  pVUS:w  a  XcS'   U R                  US5      u  pVUS:w  a  XcS'   U R                  US5      u  pWUS:w  a5  [        R
                  " UR                  5       5      R                  5       US'   U$ )	zGet information of an item in the EmbeddedFiles array.

Args:
    item: number or name of item.
Returns:
    Information dictionary.
r   r  r  r  r  r  zParams/CheckSumchecksum)r  r  r  xref_get_keyr  r  r  decode)r(   rG   r  r  r  r  r  md5s           r)   embfile_infoDocument.embfile_info  s     %%d+D..056!!#0##D*?@;'+^$##D*:;;"&Y""4):;;#+#3#3CJJL#A#H#H#JHZ r+   c                 ,    / nU R                  U5        U$ )z#Get list of names of EmbeddedFiles.)r  )r(   r  s     r)   r  Document.embfile_names  s    	I&r+   c                     U R                  U5      nU R                  UUUUUS9n[        5       nU R                  US[	        U5      5        U$ )a]  Change an item of the EmbeddedFiles array.

Notes:
    Only provided parameters are changed. If all are omitted,
    the method is a no-op.
Args:
    item: number or name of item.
    buffer_: (binary data) the new file content.
    filename: (str) the new file name.
    ufilename: (unicode) the new filen ame.
    desc: (str) the new description.
r  r  )r  r  r  r  r  )	r(   rG   r3  rj   rP  r  r  r  r  s	            r)   embfile_updDocument.embfile_upd  s^    & %%d+  !# !  }$ 0+d2CDr+   c           
      X   [        U 5      n[        R                  " XA5      n[        R                  " U[	        S5      5      n[        R                  " U[	        S5      5      n[        R
                  " U[	        S5      5      (       Ga}  [        R                  " U5      R                  S5      (       GdR  [        R                  " U[	        S5      5      nUR                  (       a  [        R                  " U5      (       a!  [        R                  " U[	        S5      5      n	OUn	[        XA5      n
U
S:w  a  U(       d  [        XA5      n[        U5      nOSnU(       dK  [        [        R                  " U	5      5      [        U
5      [        [        R                  " U5      5      U4nU$ [        [        [        R                  " U	5      5      [         [        U
5      ["        [        [        R                  " U5      5      [$        U0n U$ U(       d  S	nU$ [        S
[         S
["        S
[$        S0nU$ )z4
Get a font by xref. Returns a tuple or dictionary.
r  r  r  CIDFontTypeBaseFontr)  n/ar+   )r`   r`   r`   r+   r`   )r   r   r;  r
  r  pdf_name_eqr  r7   r   pdf_is_nullJM_get_fontextensionr  r"  r  r  r1  dictkey_extdictkey_typer0  )r(   r  	info_onlynamedr`  r  ra  subtypebasefontbnamer  r3  bytes_r   s                 r)   extract_fontDocument.extract_font  s   
 t$##C.""3(89$$S(9*=>eXf%566))73>>}MM))#x
/CDH&&%*;*;H*E*E**30@A &s1Ce|I+C6)'2+E,=,=e,DE)#.)%*;*;G*DE	. 	 %&9%:K:KE:R&S#%6s%;$&78I8I'8R&S'	  	 $ 	 %b#R$b'	 	r+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[	        US[
        R                  " U5      S-
  5      (       d  [        [        5      e[
        R                  " X!S5      n[
        R                  " U[        S5      5      n[
        R                  " U[        S5      5      (       d  [        S5      e[
        R                  " U[        S5      [        S5      5      nUR                  (       a  [
        R                  " U5      nOSn[
        R                  " X#5      n[!        5       n[#        Xx5        Xh[$        '   [
        R&                  " UR)                  5       5      U[*        '   U$ )	z(Get image by xref. Returns a dictionary.r  r   r   r  Imageznot an imageSMaskMask)r   r  r   r   r  r   r  r  r  r
  r  r  pdf_dict_getar   r  pdf_load_imager9   _make_image_dictdictkey_smaskr<  r  dictkey_cs_name)	r(   r  r`  r  r  r  smaskr/  r   s	            r)   extract_imageDocument.extract_image  s!   >>T..;<<t$a!3!3C!8!:;;l++$$S2$$S(9*=>  (7*;<<n--Xg%68HI<<$$Q'EE ""3,V!!=#66s~~7GH?	r+   Fc                 D    U R                  UUUUUUUUU	U
UUUUUUUUUS9$ )z(
Save PDF using some different defaults
)garbagecleandeflatedeflate_imagesdeflate_fontsincrementalr  expandlinearpretty
encryptionpermissionsowner_pwuser_pw	no_new_idpreserve_metadatause_objstmscompression_effort)save)r(   rj   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s                       r)   ez_saveDocument.ez_save,  sS    2 yy-+'%'!#"3'#5'   	r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        R                  " U R
                  U5      nUR                  UR                  4$ )z-Find new location after layouting a document.r  )r   r  r   r   fz_lookup_bookmark2r   ry  r   )r(   r  locations      r)   find_bookmarkDocument.find_bookmark[  sH    >>T..;<<,,dii<..r+   c                 v   [        U 5      n[        R                  " U5      n [        USUS-
  5      (       a  [        USUS-
  5      (       d  [	        [
        5      e[        R                  " [        R                  " X15      5      n[        R                  " U5      n[        R                  " U[        S5      5      nUR                  (       Ga  [        R                  " U5      n[        R                  " X85      n	[        U5       GHM  n
[        R                  " Xz5      n[        R                  " U[        S5      5      n[        R                   " U[        S5      5      (       a  Ma  [        R"                  " US5      R                  (       a  M  [        R                  " [        R                  " U5      5      n[        R$                  " U5      n[        R&                  " X>U5        [        R(                  " X>S5      n[        R*                  " U[        S5      5        [        R*                  " U[        S5      5        [        R,                  " X5        GMP     [        R.                  " U[        S5      U	5        [1        U5      nU(       a  UR                  (       ao  [        R2                  " U[        R4                  " S	5      [        R6                  " 5       S5      n[9        UUUS5        [        R.                  " U[        S
5      U5        [        R$                  " U5      n[        R&                  " X>U5        [        R(                  " X>S5      n[        R:                  " X2U5        [        R<                  " UR                  5        U R?                  5         g! [        R<                  " UR                  5        f = f)zMake a full page duplicate.r   r   r  r  r  r  r:  rq      rL  N) r   r   r  r  r   r  r  r  rv  r
  r  r   r  rQ  rR  r  r  r  pdf_create_objectpdf_update_objectr  rG  r<  rT  JM_read_contentspdf_add_streamr  PdfObjr/  r5  r  r!  )r(   rz  r	  r`  ru  r&  r)  
old_annotsrI   
new_annotsrf  r  r  copy_or  r$  r7  s                    r)   fullcopy_pageDocument.fullcopy_pageb  s   t$**C0
0	9S!Z!^44#BJN;; .11..0I0I30TUE++U3E++UHX4FGJ $$$''4"00#9
qA++Z;A#00!Xi5HIG(('8G3DEE **Au5@@ "44e6P6PRS6TUF 22C8D++S?"33SBF&&0AB&&>((*= " ""E8H+=zJ #E*C s~~ //e6Z6Z\`6achcococqstu #xa8""E8J+?J **C0D##S6**Cq9E!!3E2''8 ''8s   MN "N8r0  fontdictc                    [        X5      nUc  Uc#  [        R                  " 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  [        nOUS:X  a  [
        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'   [        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  ascender	descenderr   r  r   r  simpler`   zxref is not a font)Type1MMType1TrueTypeTF)FangtiMingr   )HeitiSongr   )GothicMinchor   )DotumBatangr   r  ZapfDingbatsSymbolglyphsr  )CheckFontInfor
  _get_font_propertiesr   zapf_glyphssymbol_glyphsr  ro   r;   r   r  UpdateFontInfo)r0  r  r  r  r  fontinfor   r  stypeascdscr  r  r%  oldlimitr  s                   r)   get_char_widthsDocument.get_char_widths  s   ( !+-2-G-G-R*5s ! #!$  'uo (#J/!(+by !566 88 ))**--,,!'X~%$!&!'X#+Z 'HMM  *{Hh'Fh'F
+H>H6{Hc5/Ma<))v&*9MwF F#s%r+   c                    [        U 5      n[        R                  " [        R                  " U5      [	        S5      [	        S5      5      nUR
                  (       d  gUS:X  a!  [        R                  " U[	        S5      5      nO5[        R                  " [        R                  " U[	        S5      5      U5      nUR
                  (       d  [        [        5      e[        U5      nU$ )z,Content of ON, OFF, RBGroups of an OC layer.r  OCPropertiesNr  r  ri  )r   r   r  r  r  r   r
  r  r   rn  JM_get_ocg_arrays)r(   ro  r`  rx  r  r   s         r)   	get_layerDocument.get_layer  s    t$!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/00$	r+   c                    [        U 5      n[        R                  " U5      nUS:X  ae  [        R                  " [        R                  " U5      [        S5      [        S5      [        S5      5      n[        R                  " U5      (       d  Sn/ n[        R                  " 5       n[        U5       HE  n[        R                  " XU5        UUR                  UR                  S.nUR                  U5        MG     U$ )zShow optional OC layers.r   r  r3  ri  r   )numberr   rZ  )r   r   pdf_count_layer_configsr  r  r  r:  PdfLayerConfigrR  pdf_layer_config_infor   rZ  ro   )r(   r`  rI   r  r   r7  rf  rG   s           r)   
get_layersDocument.get_layers  s    t$))3/6%%%%s+V$^,Y'	C %%s++##%qA''6 II#||D
 IIt  	r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      nSn[	        U5        [
        R                  " U5      nU$ )zMake new xref.r  r   )r   r  r   r   ENSURE_OPERATIONr   r	  )r(   r`  r  s      r)   get_new_xrefDocument.get_new_xref.  sI    >>T..;<<t$&&s+r+   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 encryptedr  r   /Image/Formbad object type at xref %ir  r  r   0 Rr`   )r   r  r   r  r8   r  )r0  r  r  r   r  r   s         r)   r  Document.get_oc8  s     ==C,,:;;""43;$&999D@AA  t,;E2&'	r+   c           	      $   [         R                  " S5      n[        U 5      n[         R                  " [         R                  " [         R
                  " U5      [        S5      5      [        S5      [        S5      5      n[        5       n[         R                  " U5      (       d  U$ [         R                  " U5      n[        U5       GHE  n[         R                  " X65      n[         R                  " U5      n[         R                  " [         R                  " U[        S5      5      5      n	[         R                  " U[        S5      U[        S5      5      n
SnU
R                  (       a  [         R                  " U
5      n[!        5       n[         R                  " U[        S	5      5      nUR                  (       a  [         R"                  " U5      (       a&  UR%                  [         R                  " U5      5        O[         R                  " U5      (       a  [         R                  " U5      n[        U5       H[  n[         R                  " X5      n[         R"                  " U5      (       d  M6  UR%                  [         R                  " U5      5        M]     [&        S
:  a.  [         R(                  " 5       n[         R*                  " UUX5      nO+[         R*                  " U[         R,                  " 5       X5      nU	UU(       + US.nUnUUU'   GMH     U$ )z&Show existing optional content groups.rd  r  r3  rh  r)  rc  r  Nr`  )r      r  )r   rp  r[  rq  )r   r  r   r  r
  r  r  r9   r:  r  rR  r  r  r  r   r  r   r  ro   mupdf_version_tuplePdfResourceStackpdf_is_ocg_hiddenr  )r(   r  r`  ocgsr   rI   rf  rr  r  r   r  rq  rs  rp  r  r  r  resource_stackhiddenrG   r  s                        r)   get_ocgsDocument.get_ocgsI  s@   /t$""""E$5$5s$;Xf=MN( 
 V!!4((I&qA%%t/C##S)D++U-?-?hvFV-WXD%%sHW,=r8ICVWCE~~))3/fG''hx.@AF  $$f--NNE$5$5v$>?''00++V4A"1X!//; ,,a00#NNE,=,=q,AB & #k1!&!7!7!900#~uR00#u||~uR %$*"	D DBI? @ 	r+   c                 z   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".$ ! [         a    [        5         [        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()'.
bad xrefTrG  
/Type/OCMDzbad object type/OCGs[r  r   Nr  rH  r   z/P/r  r[  zbad object at xrefr   r   z/VE[r   r  z/Andz"and",z/Notz"not",z/Orz"or",z 0 R] 0 Rr   z][z],[zbad /VE key: )r  rO  policyve)rR  xref_lengthr   rJ  r;   r   r  r:   r   r  r8   jsonloadsrk   rz   rv   )r0  r  r   textlenp0rC  rO  rY  rZ  lprpr\  s               r)   get_ocmdDocument.get_ocmdx  sN    uS__.//Z((t5t#.//d)YYx YYsB6R!VDQ$,,UC8>>@DC'DYYu6F4$BAvYYtR(Av !5661frAv.YYv6BKBBq&BHa|$%9::8s?!GB8s?!GB q&BH 1frAv&B

68,*( 
 GS)11&#>FFtUSBZZ^
 fGG	   -v./s   ?H %H:c                    / n[        U SS9nUR                  (       d  U$ [        R                  " [        R                  " U5      [        S5      5      nUR                  (       d  U$ [        R                  " U[        S5      5      nUR                  (       d  U$ [        R                  " U[        S5      5      nUR                  (       d  U$ [        XQ5      nU$ )z!Get list of outline xref numbers.r   r  r  r  r  )r   r   r   r
  r  r  r  )r(   r  r`  r  r  r  s         r)   r  Document.get_outline_xrefs  s    ta0~~L!!%"3"3C"8(6:JKL##D(:*>?  L""68G+<=L .r+   fullc                 n   U R                   (       d  U R                  (       a  [        S5      eU R                  (       d  g[	        U5      [
        La   UR                  nU R                  US5      nU(       d  U Vs/ s H  oDSS PM	     sn$ U$ ! [         a    [        5         [        S5      ef = fs  snf )z1Retrieve a list of fonts used on a page.
        r  r.   zneed a Page or page numberr   Nr  )
r   r  r   r  r   r8   r8  rk   rz   r  r(   rz  rf  r  rJ   s        r)   get_page_fontsDocument.get_page_fonts  s     >>T..;<<{{9C?jj Q'$'(CqcrFC((
  ?  !=>>?
 )s   B <B2 B/c                     U R                   (       d  U R                  (       a  [        S5      eU R                  (       d  gU R	                  US5      nU(       d  U Vs/ s H  oDSS PM	     sn$ U$ s  snf )z2Retrieve a list of images used on a page.
        r  r.   r   Nr  r   r  r   r  r  rh  s        r)   get_page_imagesDocument.get_page_images  sa     >>T..;<<{{Q'$'(CqcrFC((
 )s   A0c                 v    U R                  5        Vs/ s H  n[        R                  " U5      PM     sn$ s  snf )zReturn page label definitions in PDF document.

Returns:
    A list of dictionaries with the following format:
    {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
)r  r
  	rule_dict)r(   rG   s     r)   get_page_labelsDocument.get_page_labels  s0     372G2G2IJ2I$%2IJJJs    6c                     / nU(       d  U$ U R                  5       nU/ :X  a  U$ [        U R                  5       H;  n[        R                  " 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  rR  ru  r
  get_label_pnoro   )r0  labelonly_oner<  rL  rf  plabels          r)   get_page_numbersDocument.get_page_numbers  ss     N%%'R<Ns~~&A((3Fq!8 ' r+   r  r  r  r  r  r  r  r  r  r  r  c          	      P    Uc  [         nUc  [        n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
rz  )Identityr  r  )r0  rz  r  r  r  r  r  r  s           r)   get_page_pixmapDocument.get_page_pixmap  sB    . >FJx"" #  	r+   r   optionr  textpager  r  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  )r0  rz  r  r  r  r  r  s          r)   get_page_textDocument.get_page_text2  s    & x  % KKr+   c                     U R                   (       d  U R                  (       a  [        S5      eU R                  (       d  gU R	                  US5      nU$ )z4Retrieve a list of XObjects used on a page.
        r  r.   r   rl  )r(   rz  r  s      r)   get_page_xobjectsDocument.get_page_xobjectsG  s@     >>T..;<<{{Q'
r+   c                     [        U SS9nUR                  (       d  g[        R                  " [        R                  " U5      [        S5      [        S5      [        S5      5      nSnUR                  (       a  [        R                  " U5      nU$ )zGet the /SigFlags value.r   r  r  r  r  SigFlags)r   r   r   r  r  r  r  )r(   r`  sigflagssigflags       r)   get_sigflagsDocument.get_sigflagsQ  ss    ta0~~&&!!#& $$	 &&x0Gr+   r  c                 
  ^ ^^ 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aD  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+  [        R                  " 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   r  r   r   )r   r   r  is_externalr  r   resolve_linkr
  getLinkDictro   downr\  )
olItemr
  lvlr  resolver   linkr0  r  r  s
          r)   r  !Document.get_toc.<locals>.recursej  s    V[[333<<"LLEE))zz!;;",&)&6&6vzz&BG#*1:>D#);;?D!D ,,VS9DLL#d!9:LL#d!34;;#FKKa@E5 V[[3336 Lr+   r   r   )r   r   r  outliner  r  )r0  r  r  r  r
  r  r  s   ``    @r)   r  Document.get_toca  sj    	@ ==.//IfS)::f!!#&
r+   c                 .   Sn[        U SS9nUR                  (       a>  [        R                  " [        R                  " U5      [        S5      [        S5      5      nUb4  UR                  (       a#  [        R                  " U5      n[        U5      nU$ SnU$ )zGet document XML metadata.Nr   r  r  r  r`   )r   r   r   r  r  r  r!  JM_UnicodeFromBuffer)r(   xmlr`  r  r   s        r)   get_xml_metadataDocument.get_xml_metadata  s    ta0>>%%%%c*V$Z(C
 ?s~~((-D%d+B 	 B	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   r  rR  ru  page_annot_xrefsr   PDF_ANNOT_LINKrS  r0  rf  rG   s      r)   
has_annotsDocument.has_annots  sz    ==.//zz[))s~~&A,,Q/Q5#7#7747eF\F\;\ 0 '
 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   r  rR  ru  r  r   r  r  s      r)   	has_linksDocument.has_links  si    ==.//zz[))s~~&A,,Q/7e222 0 ' r+   c                 x   U R                   (       a  [        S5      eU R                  5       U l        [	        SSSSSSSS	S
SS.
R                  5        VVs/ s H  u  pXR                  U5      4PM     snn5      U l        U R                  S5      S:X  a  S OU R                  S5      U R                  S'   g s  snnf )Nz,cannot initialize - document still encryptedformatz
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
r  r  authorr  keywordsrZ  producerr  r  trappedr  None)r  r   r  r  r9   rF   r  r  )r(   r  rJ   s      r)   r  Document.init_doc  s    KLL))+ &.$0%2&4'6&4'6+>&4&4= $eg=&=&SQ,,Q/0 =&  /3.?.?.Mv.Ud[_[l[lmy[zl#s   B6
c
                    Sn
[        U[        5      (       aE  UR                  R                  S:  a  [        [        U5      n[        SUR                  5       5      n
O#[        U[
        5      (       a  Un
O[        U5      n
U
(       d  [        S5      eU
R                  (       d  U
R                  5       n[        SU5      n
U R                  U
UUUUUUUU	S9	$ )z
Insert an arbitrary supported document to an existing PDF.

The infile may be given as a filename, a Document or a Pixmap. Other
parameters - where applicable - equal those of insert_pdf().
Nr   pngzbad infile parameterr`  )r  r  r  r_  r)  r  show_progressfinal)rB   r  r  rI   r  r   tobytesr   r  r  
insert_pdf)r(   infiler  r  r  r_  r)  r  r  r  r1  pdfbytess               r)   insert_fileDocument.insert_file  s    " ff%%  ""Q&v.5&.."23C))C6"C344zz))+H5(+C#!+  
 
	r+   rn  r   r  r0  r   r  rm  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.
)rz  r  r0  r   )2   r  )r   r   r  rm  )new_pagerw  r  )r0  rz  r   r   r  r0  r   r  rm  r   r   s              r)   insert_pageDocument.insert_page  sP    " |||@Dzz  
 	r+   )r  r  r  r_  r)  r  r  rc  r  r  _gmapc                   U R                   (       d  U R                  (       a  [        S5      eU R                  UR                  :X  a  [        S5      eUnUS:  a  U R                  nU R                  nUR                  nUnUnUn[        US5      n[        UUS-
  5      nUS:  a  US-
  n[        UUS-
  5      nUS:  a  Un[        X5      n[        U5      U
s=:  a  S:  a{  O  Ox[        R                  R                  UR                  5      nU(       d  Sn[        R                  R                  U R                  5      nU(       d  Sn[        SU< SU< S35        UR                  nU R                  R                  US	5      nUc  [        U 5      nXR                  U'   [         (       a*  [#        U R$                  UR$                  UUUUUUU
UU5        O_['        U 5      n['        U5      nUR(                  (       a  UR(                  (       d  [+        S
5      e[-        U5        [/        UUUUXXgX5
        U R1                  5         U(       a  U R3                  UUUUS9  U(       a  U R5                  XUUXS9  US:X  a  S	U R                  U'   g	g	)aM  Insert a page range from another PDF.

Args:
    docsrc: PDF to copy from. Must be different object, but may be same file.
    from_page: (int) first source page to copy, 0-based, default 0.
    to_page: (int) last source page to copy, 0-based, default last page.
    start_at: (int) from_page will become this page number in target.
    rotate: (int) rotate copied pages, default -1 is no change.
    links: (int/bool) whether to also copy links.
    annots: (int/bool) whether to also copy annotations.
    widgets: (int/bool) whether to also copy form fields.
    join_duplicates: (int/bool) join or rename duplicate widget names.
    show_progress: (int) progress message interval, 0 is no messages.
    final: (bool) indicates last insertion from this source PDF.
    _gmap: internal use only

Copy sequence reversed if from_page > to_page.r  z'source and target cannot be same objectr   r   z
memory PDFzInserting 'z' at 'r   Nzsource or target not a PDF)r  r  r  )r  r  r  rc  )r   r  r   r  ru  r   minr;   rh   r	   basenamer   rv   r  r<   Graftmapr  extra_FzDocument_insert_pdfr   r   r   r  r?  JM_merge_ranger!  r-  r  )r(   docsrcr  r  r  r_  r)  r  r  rc  r  r  r  r   outCountr  r  rT  innameoutnameisrtpdfoutpdfsrcs                          r)   r  Document.insert_pdf   sD   L >>T..;<<>>V---FGG6B??$$  QZX\"6ABX\"6Bv;**WW%%fkk2F%gg&&tyy1G&@A ""4.=TNE#(NN4 ;'IIKK! &d+F%f-F$$F,=,=!=>>V$662r2umc 	NN6RbNIVb"rsA:#'DNN4  r+   c                 |    [        U SS9nUR                  (       d  g[        R                  " U5      nU(       a  S$ S$ )Nr   r  FT)r   r   r   pdf_has_unsaved_changesr(   r`  r#  s      r)   is_dirtyDocument.is_dirty  s5    ta0~~))#.t#e#r+   c                 f    [        U SS9nUR                  (       a  [        R                  " U5      $ g)z)
Check whether we have a linearized PDF.
r   r  F)r   r   r   pdf_doc_was_linearizedr  s     r)   is_fast_webaccessDocument.is_fast_webaccess  s+    
 ta0>>//44r+   c                    [        U SS9nUR                  (       d  gSn [        R                  " [        R                  " U5      [        R
                  [        R                  [        R                  5      n[        R                  " U5      (       a  [        R                  " U5      nUS:  a  U$ g! [         a    [        (       a
  [        5          gf = f)z Either False or PDF field count.r   r  Fr  )r   r   r   r  r  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr:  r  rk   r  rz   )r(   r`  r  fieldss       r)   ru  Document.is_form_pdf  s     ta0~~	((%%c*,,00..	F !!&))++F3 A:L  	##(8	s   BB1 1CCc                     [        U R                  [        R                  5      (       a  g[        R                  " U R                  R
                  5      (       a  SnU$ SnU$ )zCheck for PDF.TF)rB   r   r   r   ll_pdf_specificsr   rh  s     r)   r  Document.is_pdf  sS     dii!2!233
 !!$))"6"677C 
 C
r+   c                 x    U R                   (       a  [        S5      e[        [        R                  " U 5      5      $ )z Check if document is layoutable.r   )r   r   rw  r   r  r/   s    r)   is_reflowableDocument.is_reflowable  s-     >>.//E33D9::r+   c                 x    [        U SS9nUR                  (       d  g[        R                  " U5      nU(       a  gg)zCheck whether PDF was repaired.r   r  FT)r   r   r   pdf_was_repairedr  s      r)   is_repairedDocument.is_repaired  s3     ta0~~""3'r+   c                     U R                   (       d  U R                  (       a  [        S5      eSnSn[        U 5      n[        R
                  " U5      n[        R                  " U5      n[        U5      [        U5      S.$ )z(Show if undo and / or redo are possible.r  r   )undoredo)r   r  r   r   r   pdf_can_undopdf_can_redorw  )r(   r  r  r`  s       r)   journal_can_doDocument.journal_can_do  sd    >>T..;<<t$!!#&!!#&T
DJ77r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5        g)zActivate document journalling.r  N)r   r  r   r   r   pdf_enable_journalr  s     r)   journal_enableDocument.journal_enable  s5    >>T..;<<t$  %r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      nUR                  =(       a    UR                  R
                  nU$ )z Check if journalling is enabled.r  )r   r  r   r   r   journal)r(   r`  enableds      r)   journal_is_enabledDocument.journal_is_enabled  sD    >>T..;<<t$..;S^^%;%;r+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[	        U[
        5      (       a  [        R                  " X!5        O7[        U5      n[        R                  " U5      n[        R                  " X$5        UR                  R                  (       d  [        S[        5        gg)zLoad a journal from a file.r  z!Journal and document do not matchN)r   r  r   r   rB   r   r   pdf_load_journalr-  r  pdf_deserialise_journalr   r  r  r  )r(   rj   r`  r$  stms        r)   journal_loadDocument.journal_load  s    >>T..;<<t$h$$""31$X.C&&s+C))#3~~%%8:NO &r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " X!5      nU$ )z#Show operation name for given step.r  )r   r  r   r   r   pdf_undoredo_step)r(   r  r`  r   s       r)   journal_op_nameDocument.journal_op_name	  s<    >>T..;<<t$&&s1r+   c                     U R                   (       d  U R                  (       a  [        S5      eSn[        U 5      n[        R
                  " U5      u  p1X14$ )zShow journalling state.r  r   )r   r  r   r   r   pdf_undoredo_state)r(   stepsr`  r   s       r)   journal_positionDocument.journal_position  sF    >>T..;<<t$,,S1	yr+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5        g)zMove forward in the journal.r  T)r   r  r   r   r   pdf_redor  s     r)   journal_redoDocument.journal_redo  6    >>T..;<<t$sr+   c                 .   U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[	        U[
        5      (       a  [        R                  " X!5        g[        U5      n[        R                  " X#5        UR                  5         g)zSave journal to a file.r  N)r   r  r   r   rB   r   r   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)r(   rj   r`  outs       r)   journal_saveDocument.journal_save"  sf    >>T..;<<t$h$$""31'1C##C-!r+   c                 (   U R                   (       d  U R                  (       a  [        S5      e[        U 5      nUR                  R
                  (       d  [        S5      eU(       a  [        R                  " X!5        g[        R                  " U5        g)zBegin a journalling operation.r  zJournalling not enabledN)
r   r  r   r   r   r  r   r   pdf_begin_operationpdf_begin_implicit_operation)r(   r   r`  s      r)   journal_start_opDocument.journal_start_op.  s_    >>T..;<<t$~~%% 9::%%c0..s3r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5        g)zEnd a journalling operation.r  N)r   r  r   r   r   pdf_end_operationr  s     r)   journal_stop_opDocument.journal_stop_op:  s5    >>T..;<<t$$r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5        g)zMove backwards in the journal.r  T)r   r  r   r   r   pdf_undor  s     r)   journal_undoDocument.journal_undoA  r
	  r+   c                     [        U SS9nUR                  (       d  g[        R                  " U5      nU[        R                  :X  a  g[        R
                  " U5      $ )zDocument language.r   r  N)r   r   r   pdf_document_languagerE  rC  )r(   r`  rG  s      r)   rH  Document.languageI  sL     ta0~~**3/5&&&22488r+   c                     U R                   (       a  [        S5      e[        R                  " U R                  5      nUR
                  UR                  4$ )z Id (chapter, page) of last page.r   )r   r   r   fz_last_pager   ry  r   )r(   last_locs     r)   last_locationDocument.last_locationT  s@     >>.//%%dii0..r+   c                    [        U 5      n[        R                  " 5       n[        R                  " U5      n/ n[	        U5       H  n[        R
                  " XU5        UR                  S:X  a  SnOUR                  S:X  a  SnOSnUUR                  UR                  UUR                  UR                  S.nUR                  U5        M     U$ )z-Show OC visibility status modifiable by user.r   checkboxr   radioboxru  )r8  r   depthr   r[  locked)r   r   PdfLayerConfigUipdf_count_layer_config_uirR  pdf_layer_config_ui_infor   r   r+	  selectedr,	  ro   )r(   r`  r7  rI   r   rf  ra  rG   s           r)   layer_ui_configsDocument.layer_ui_configs\  s    t$%%'++S1qA**CD9yyA~"a" II!ZZ!--"kkD IIdO! " 	r+   c                    U R                   (       d  U R                  (       a  [        S5      eU R                  n[        R
                  " U5      (       d  gUnUn[        U5      n[        R                  " U5      (       d2  UR                  UR                  -
  nUR                  UR                  -
  nUS::  d  US::  a  [        S5      e[        R                  " XVXt5        U R                  5         U R                  5         g)z Re-layout a reflowable document.r  Nr  zbad page size)r   r  r   r   r   r  r  r  r  r  r  r  r  r!  r  )	r(   r   r  r0  r   r0  r   r  r#  s	            r)   layoutDocument.layoutu  s    >>T..;<<ii..44D!((++qttAqttA8qCxo..  #!6r+   c                 L   U R                   (       d  U R                  (       a  [        S5      eUc  SnX;  a  [        S5      e[        U5      [        L a$  US:  a  U R
                  nUS:  a  X-  nUS:  a  M  [        U[        5      (       a"  [        R                  " U R                  U5      nO%Uu  pE[        R                  " U R                  XE5      n[        X05      nSUl        Xl        X`R                  [        U5      '   [         R"                  " 5       Ul        Xl        U$ )zLoad a page.

'page_id' is either a 0-based page number or a tuple (chapter, pno),
with chapter number and page number within that chapter.
r  r   zpage not in documentT)r   r  r   r   r8   ru  rB   r   fz_load_pager   fz_load_chapter_pager   r   r   r  rX  r  r  rW  r8  )r(   page_idnpr   ry  pagenumr  s          r)   r  Document.load_page  s     >>T..;<<?G344=CGaKBA+ A+gs##%%dii9D&G--diiJD4
#&3 !557

r+   c                 T   U R                   (       a  [        S5      eU R                  n[        R                  " SS5      n[        R
                  " U5      nUS:  a  X-  nUS:  a  M  X:  a  [        [        5      e[        R                  " X!5      nUR                  UR                  4$ )zConvert pno to (chapter, page).r   r  r   )
r   r   r   r   fz_make_locationr   r  fz_location_from_page_numberry  r   )r(   rz  this_docrx  ru  s        r)   location_from_page_number"Document.location_from_page_number  s    >>.//99$$R,))(3
AgC Agn--00?{{CHH$$r+   c                     U R                   (       d  U R                  (       a  [        S5      e[        R                  " U6 n[        R
                  " U R                  R                  UR                  5       5      nU$ )z.Make a page pointer before layouting document.r  )	r   r  r   r   
FzLocationll_fz_make_bookmark2r   r   r  )r(   rx  marks      r)   make_bookmarkDocument.make_bookmark  sT    >>T..;<<$))499+?+?Pr+   c                 
   U R                  5       nUS:X  a  gU R                  US5      nUS   S:X  a  0 $ US   S:X  a0  [        US   R                  5       S   5      nU R	                  USS9nOUS   S	:X  a  US   nOSnUb  USS
 S:X  a	  USS S:X  d  0 $ SSSS.nUS
S R                  S5      nUSS  H"  n UR                  5       u  pgUS:X  d  M  SXF'   M$     U$ ! [
         a    [        S:  a
  [        5         Us s  $ f = f)zReturn the PDF MarkInfo value.r   NMarkInfor  r  r   TrG  r9   r   <<r  >>FMarkedUserPropertiesSuspects/true)rI  r  r8   r:   rJ  rk   r  rz   )r(   r  r   r  validrJ   r  r   s           r)   markinfoDocument.markinfo  s/    !19tZ0a5F?Ia5F?r!u{{}Q'(D""4D"9CUf_Q%CC;s2Aw$3rs8t3CI EuM!Biooc"QRAWWY
 !
    '!+0@s   9C DDc                     U R                   (       a  [        S5      e[        U 5      nU[        U5      ;  d  U[        SU5      ;  a  [        S5      eSnSnUS:X  a  US-
  nSnU R	                  XXE5      $ )zMove a page within a PDF document.

Args:
    pno: source page number.
    to: put before this page, '-1' means after last page.
r   r  r  r   r   r  r  s         r)   	move_pageDocument.move_page  sy     >>.//Y
uZ((BeB
6K,K1228aBF##CV::r+   c                     U R                   $ r-   rD  r/   s    r)   r   Document.name  s    zzr+   c                    U R                   (       d  g[        U 5      nSnSn[        R                  " [        R                  " U5      S5      n[        R
                  " XT5      n[        R                  " U5      (       a  [        R                  " U5      nU(       a&  [        R                  " XT[        R                  5        O%[        R                  " XT[        R                  5        Uc  US:  $ U$ )z"Get/set the NeedAppearances value.Nr  NeedAppearancesrk  r   )ru  r   r   rm  r  r  pdf_is_boolpdf_to_boolr  PDF_TRUE	PDF_FALSE)r(   r   r`  oldvalappkeyformapps          r)   need_appearancesDocument.need_appearances  s    t$"""!!#& !!$/S!!&&s+Fenn=eoo>=Q;r+   c                    U R                   (       a  [        S5      e[        U R                  [        R
                  5      (       a  U R                  OU R                  R                  5       n[        R                  " U5      nU$ )zIndicate password required.r   )r   r   rB   r   r   r   r   fz_needs_password)r(   r   rK   s      r)   r  Document.needs_pass  sX     >>.// *499e6F6F G G499TYY__M^%%x0
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  r0  )r0  )r0  rz  r  r0  s       r)   r  Document.new_page  s     	Sf5xr+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U5      [        L a  SU4nX;  a  [        S5      e[        U5      U R                  :X  a  g[        U 5      nUS   n[        U[        5      (       d  [        [        [        5        UnUS   nUn[        R                  " XE5      n[        R                  " X&5      nUR                  UR                   4$ )z!Get (chapter, page) of next page.r  r   page id not in documentr.   r   )r   r  r   r   r8   r   r&	  r   rB   r  MSG_BAD_PAGEIDPyExc_ValueErrorr   r>	  fz_next_pagery  r   )r(   r9	  r@	  r  ry  rz  rx  next_locs           r)   next_locationDocument.next_location&  s    >>T..;<<=C'lG677>T///"4(qk#s##N$45qk$$W2%%x5..r+   c                    [         (       a!  [        R                  " U R                  U5      $ [	        U R                  [
        R                  5      (       a-  [
        R                  " U R                  5      nU R                  nO+[
        R                  " U R                  5      n[        U 5      nUS:  a  X-  nUS:  a  M  X:  a  [        [        5      e[
        R                  " X15      n[        U5      nU$ r   )r  r   r  r   rB   r   r   r  r   r   r   r  r  JM_get_annot_xref_list)r(   rI   ru  r  r8  r  s         r)   r  Document.page_annot_xrefs;  s    ;))499a88dii!2!233..tyy9J99L--dii8J+D1L!eOA !e>n--,,\='1r+   c                 D   U R                   (       a  [        S5      e[        (       a  U R                  U 5      $ [	        U R
                  [        R                  5      (       a   [        R                  " U R
                  5      $ [        R                  " U R
                  5      $ )zNumber of pages.r   )
r   r   r  r  rB   r   r   r   r   r  r/   s    r)   ru  Document.page_countM  sn     >>.//;##D))tyy%"2"233''33(($))44r+   c                 V   U R                   (       a  [        S5      eU R                  n[        R                  " U5      nUnUS:  a  XC-  nUS:  a  M  [        U 5      nXC:  a  [        [        5      e[        R                  " XT5      n[        U5      n[        U5      n[        U5      nU$ )z2Get CropBox of page number (without loading page).r   r   )r   r   r   r   r   r   r  r  
JM_cropboxro  r*  )	r(   rz  r@	  ru  rI   r`  r  cropboxr  s	            r)   page_cropboxDocument.page_cropboxY  s    >>.//99))84
!eOA !et$?n--++S4W%g&3i
r+   c                    [        U5      [        L a"  U R                  nUS:  a  X-  nUS:  a  M  SU4nX;  a  [        S5      eUu  p4[        R
                  " X45      n[        R                  " U R                  U5      nU$ )z&Convert (chapter, pno) to page number.r   rn	  )r   r8   ru  r   r   r>	  fz_page_number_from_locationr   )r(   r9	  r:	  ry  rz  rx  page_ns          r)   page_number_from_location"Document.page_number_from_locationm  s{    =CBA+ A+'lG677$$g333TYYDr+   c                    [         (       a!  [        R                  " U R                  U5      $ U R                  (       a  [        S5      e[        R                  " U R                  5      nUnUS:  a  X2-  nUS:  a  M  [        U 5      nSnX2:  a  [        [        5      e[        R                  " [        R                  " XC5      5      nU$ )zGet xref of page number.r   r   )r  r   r  r   r   r   r   r   r   r  r  r  )r(   rz  ru  rI   r`  r  s         r)   r  Document.page_xref{  s    ;??DIIs33>>.//))$))4
!eOA !et$?n-- 9 9# ABr+   c                     U R                  5       nUS:X  a  gU R                  US5      nUS   S:X  a  gUS   S:X  a  US   SS $ g)z)Return the PDF PageLayout value.
        r   N
PageLayoutr  
SinglePager   r   rI  r  r(   r  r   s      r)   
pagelayoutDocument.pagelayout  sZ     !19t\2a5F?a5F?a59r+   c                     U R                  5       nUS:X  a  gU R                  US5      nUS   S:X  a  gUS   S:X  a  US   SS $ g)z'Return the PDF PageMode value.
        r   NPageModer  UseNoner   r   r	  r	  s      r)   pagemodeDocument.pagemode  sZ     !19tZ0a5F?a5F?a59r+   r  r  r  c              #     #    U R                   (       d  gU=(       d    SnUS:  a  XR                   -  nUS:  a  M  U[        U R                   5      ;  a  [        S5      eUb  X R                   ::  a  UOU R                   nUS:X  a  [        S5      eUc
  X:  a  SnOSn[        XU5       H  nU R                  U5      v   M     g7f)zmReturn a generator iterator over a page range.

Arguments have the same meaning as for the range() built-in.
Nr   zbad start page numberzarg 3 must not be zeror  r   )ru  rR  r   r  )r(   r  r  r  rz  s        r)   rD  Document.pages  s     
 
ai__$E aidoo..455 'DOO,Ct 19566<|d+C>>#&' ,s   8CB	Cc                     [        U SS9nSnUR                  (       d  U$ [        R                  " [        R                  " U5      [        S5      5      n[        R                  " U5      nU$ )zGet xref of PDF catalog.r   r  r  )r   r   r   r
  r  r  r  )r(   r`  r  r  s       r)   rI  Document.pdf_catalog  sV    ta0~~K!!%"3"3C"8(6:JK%r+   c                 "    U R                  SXS9$ )zGet PDF trailer as a string.r  )rH  r  )rJ  )r(   rH  r  s      r)   r  Document.pdf_trailer  s    zGGr+   c                    U R                   (       a  gU R                  n[        R                  " U5      nUR                  (       a  [        R
                  " U5      $ Sn[        R                  " U[        R                  5      (       d  U[        R                  -  n[        R                  " U[        R                  5      (       d  U[        R                  -  n[        R                  " U[        R                  5      (       d  U[        R                  -  n[        R                  " U[        R                  5      (       d  U[        R                  -  nU$ )zDocument permissions.r   l    )r  r   r   rl  r   pdf_document_permissionsfz_has_permissionFZ_PERMISSION_PRINTPDF_PERM_PRINTFZ_PERMISSION_EDITPDF_PERM_MODIFYFZ_PERMISSION_COPYPDF_PERM_COPYFZ_PERMISSION_ANNOTATEPDF_PERM_ANNOTATE)r(   r0  r`  perms       r)   r  Document.permissions  s     YY11#6 >>11#66 &&sE,E,EFF%...D&&sE,D,DEE%///D&&sE,D,DEE%---D&&sE,H,HII%111Dr+   c                 \   U R                   (       d  U R                  (       a  [        S5      e[        U5      [        L a  SU4nX;  a  [        S5      eUS:X  a  gUu  p#[
        R                  " X#5      n[
        R                  " U R                  U5      nUR                  UR                  4$ )z%Get (chapter, page) of previous page.r  r   rn	  r  r.   )r   r  r   r   r8   r   r>	  fz_previous_pager   ry  r   )r(   r9	  ry  rz  rx  prev_locs         r)   prev_locationDocument.prev_location  s     >>T..;<<=C'lG677v$$W2))$))S9..r+   c                 .   0 nUR                   nUR                  R                  5        H	  u  pEXRU'   M     UR                  R                  R
                  nUR                  R                  5       nSUl        UR                  5         Sn[        R                  S5        U R                  U5      nUR                  5        H  u  pEX$   nXR                  U'   M     US:X  a   U$ UR                  R                  5       n	X:w  d   SU< SUS SU	S 35       eU$ )zMake a fresh copy of a page.Nd   r   z	refs_old=z m_internal_old=z#xz m_internal_new=)r8  rW  rF   r   r   refsrV  r   r  store_shrinkr  )
r(   r   r  rz  r  rJ   refs_oldm_internal_oldr   m_internal_news
             r)   reload_pageDocument.reload_page  s   
kk$$**,DAqM -6 99'',,335	3~~c" $$&DAME"'Q ' q=
   "YY779N!3 M xk!2>2"66G7KLM3r+   c                 T   U(       d	  U(       a  gg [         R                  " U R                  U5      u  p4nU(       a  UR                  UR                  4XE4$ [         R                  " U R                  U5      nXdU4$ ! [         a!    [        (       a
  [        5         U(       a   g gf = f)a  Calculate internal link destination.

Args:
    uri: (str) some Link.uri
    chapters: (bool) whether to use (chapter, page) format
Returns:
    (page_id, x, y) where x, y are point coordinates on the page.
    page_id is either page number (if chapters=0), or (chapter, pno).
)r  r  r   r   )r  r   r   )	r   fz_resolve_linkr   rk   r  rz   ry  r   r	  )r(   r  r  rx  xpyprz  s          r)   r  Document.resolve_link=  s     %	//		3?KCR KK*B2200C@{  	##(8%		s   $A< <&B'&B'c                 t   [        U5      nU(       d  S=pUS:  a  X!:  a  [        S5      e[        R                  " 5       n[	        [        U5      5      nU
(       Gds  [        R                  " 5       nU(       a<  [        R                  Ul        [        R                  Ul	        X.l
        Xl        Xl        U(       a  U(       a<  [        R                  Ul        [        R                  Ul        X.l        Xl        Xl        U(       a<  [        R                  Ul        [        R                  Ul        Xl        X.l        Xl        U(       a  U(       a<  [        R                  Ul        [        R                  Ul        X.l        Xl        Xl        U(       a<  [        R                  Ul        [        R                  Ul        Xl        X.l         Xl!        OU
n[	        [        U5      5      nX-
  nU(       a  [        SU 35      eU	(       a  U RE                  S5        [G        U 5      n[        RH                  " UU5        g)a  Rewrite images in a PDF document.

The typical use case is to reduce the size of the PDF by recompressing
images. Default parameters will convert all images to JPEG where
possible, using the specified resolutions and quality. Exclude
undesired images by setting parameters to False.
Args:
    dpi_threshold: look at images with a larger DPI only.
    dpi_target: change eligible images to this DPI.
    quality: Quality of the recompressed images (0-100).
    lossy: process lossy image types (e.g. JPEG).
    lossless: process lossless image types (e.g. PNG).
    bitonal: process black-and-white images (e.g. FAX)
    color: process colored images.
    gray: process gray images.
    set_to_gray: whether to change the PDF to gray at process start.
    options: (PdfImageRewriterOptions) Custom options for image
            rewriting (optional). Expert use only. If provided, other
            parameters are ignored, except set_to_gray.
r   z0{dpi_target=} must be less than {dpi_threshold=}zInvalid options: r   N)%r   r   r   PdfImageRewriterOptionsr  r  FZ_RECOMPRESS_FAXbitonal_image_recompress_methodFZ_SUBSAMPLE_AVERAGEbitonal_image_subsample_methodbitonal_image_subsample_to bitonal_image_recompress_quality!bitonal_image_subsample_thresholdFZ_RECOMPRESS_JPEG&color_lossless_image_recompress_method%color_lossless_image_subsample_method!color_lossless_image_subsample_to(color_lossless_image_subsample_threshold'color_lossless_image_recompress_quality#color_lossy_image_recompress_method"color_lossy_image_subsample_method%color_lossy_image_subsample_thresholdcolor_lossy_image_subsample_to$color_lossy_image_recompress_quality%gray_lossless_image_recompress_method$gray_lossless_image_subsample_method gray_lossless_image_subsample_to'gray_lossless_image_subsample_threshold&gray_lossless_image_recompress_quality"gray_lossy_image_recompress_method!gray_lossy_image_subsample_method$gray_lossy_image_subsample_thresholdgray_lossy_image_subsample_to#gray_lossy_image_recompress_qualityrecolorr   pdf_rewrite_images)r(   dpi_threshold
dpi_targetqualitylossylosslessbitonalrm  r  set_to_grayr   quality_strtemplate_optsdir1rU  dir2invalid_optionsr`  s                     r)   rewrite_imagesDocument.rewrite_imagesW  s   B 'l)**M>j9OPP5573}%&002D7<7N7N46;6P6P32</8C59F6BGBZBZD?AFA[A[D>=G:DQACN@?D?W?WD<>C>X>XD;AN>:D7@K=AFAYAYD>@E@Z@ZD=<F9CP@BM?>C>V>VD;=B=W=WD:@M=9C6?J<D3t9~+00ABCCLLOt$  d+r+   c                     U R                   (       d  [        S5      e[        U R                  5       H#  nU R	                  U5      R                  U5        M%     g)zChange the color component count on all pages.

Args:
    components: (int) desired color component count, one of 1, 3, 4.

Invokes the same-named method for all pages.
r~  N)r  r   rR  ru  r  r	  )r(   
componentsrf  s      r)   r	  Document.recolor  s@     {{[))t'ANN1%%j1 (r+   c                 d  ^	^
^ [        U S5      (       a  U R                  $ [        U R                  5       Vs0 s H  oR	                  U5      U_M     snmS m
U
U4S jm	U	4S jn[
        R                  " U 5      n[
        R                  " [
        R                  " U5      S5      n0 n[
        R                  " S5      n[
        R                  " XF5      nUR                  5       (       a  U" XW5        [
        R                  " X65      nUR                  5       (       a  U" XX5        XPl        U$ s  snf )a  Convert the PDF's destination names into a Python dict.

The only parameter is the pymupdf.Document.
All names found in the catalog under keys "/Dests" and "/Names/Dests" are
being included.

Returns:
    A dcitionary with the following layout:
    - key: (str) the name
    - value: (dict) with the following layout:
        * "page":  target page number (0-based). If no page number found -1.
        * "to": (x, y) target point on page - currently in PDF coordinates,
                i.e. point (0,0) is the bottom-left of the page.
        * "zoom": (float) the zoom factor
        * "dest": (str) only occurs if the target location on the page has
                not been provided as "/XYZ" or if no page number was found.
    Examples:
    {'__bookmark_1': {'page': 0, 'to': (0.0, 541.0), 'zoom': 0.0},
    '__bookmark_2': {'page': 0, 'to': (0.0, 481.45), 'zoom': 0.0}}

    or

    '21154a7c20684ceb91f9c9adc3b677c40': {'page': -1, 'dest': '/XYZ 15.75 1486 0'}, ...
_resolved_namesc                     [         R                  " S5      n[         R                  " U5      n[         R                  " X SS5        UR	                  5         [        U5      $ )z1Return string version of a PDF object definition.   r   r   )r   fz_new_bufferFzOutputpdf_print_objr	  r  )r  bufferoutputs      r)   
obj_string*Document.resolve_names.<locals>.obj_string  sI    ((-F^^F+FQ2""$'//r+   c                 h  > SSS.nU R                  5       (       a  [        R                  " U 5      n U R                  5       (       a	  T" U 5      nO5U R	                  5       (       a  T" [        R
                  " U S5      5      nOU$ UR                  SS5      SS nUR                  S5      nUS:  a  X!S	'   U$ US
U R                  5       nX#S
 nX!S	'   UR                  S5      (       au  US		 UR                  5       SS n[        U5      S:  a"  UR                  S5        [        U5      S:  a  M"  [        [        [        U5      5      nUS   US   4US'   US   US'   UR!                  S5      (       a1  TR#                  [%        UR                  5       S   5      S5      US'   U$ [%        U5      US'   U$ )z3Generate value of one item of the names dictionary.r  r`   )r   destr  r  r~   r   rQ	  r	  Nz/XYZro  r   r   r	  r   r
  rH  r   )pdf_is_indirectr   r  r:  r  r  r  r   stripr7   r:   r;   ro   r   r  r  r  r<   r8   )	r  
templ_dictarrayr  subval
array_listr  r	  
page_xrefss	          r)   	get_array)Document.resolve_names.<locals>.get_array  s   "$b1J""$$005!!"3"""5#6#6sC#@A!! MM&#.q4E **S/CQw%*6"!!4C[&&(F$KE!&v ''v& #[[]1Q/
 *o)%%c* *o) UJ/0$%aD!A$<
4 %&qT
6" u%%%/^^Cq8I4J2%N
6"  &)[
6"r+   c                 B  > [         R                  " U5      n[        U5       Hy  n[         R                  " X5      n[         R                  " X5      nUR                  5       (       a  UR                  5       nO[        SU S35        SnU(       d  Mo  T" U5      X'   M{     g)zaGenerate name resolution items for pdf_dict.

This may be either "/Names/Dests" or just "/Dests"
zkey z is no /NameN)r   r  rR  r  r  r  r  rv   )	dest_dictpdf_dict
name_countrf  r  r  dict_keyr	  s          r)   	fill_dict)Document.resolve_names.<locals>.fill_dict  s     ++H5J :&,,X9,,X9??$$"0Hd1#\23#H8*3C.I' 'r+   r  Dests)r?   r	  rR  ru  r  r   rl  r  r  r  r
  r  pdf_load_name_tree)r(   rf  r
  r`  catalogr
  dests	old_destsr  r	  r	  r	  s            @@@r)   resolve_namesDocument.resolve_names  s   2 4*++'''49$//4JK4JqnnQ'*4JK
	0.	`	9, 11$7 %%e&7&7&<fE	 ""7+ &&w6	  ""i+ ''3i&(K Ls   D-c                    U R                   (       d  U R                  (       a  [        S5      e[        U5      [        L a  OW[        US5      (       a  [	        U5      nO:[        US5      (       a  UR                  nO[        US5      (       d  [        S5      eXR                  :X  a  U(       d  [        S5      eU
(       a  U(       a  [        S5      eU R                  S:  a  [        S	5      eU(       a,  U R                  U:w  d  U R                  (       a  [        S
5      eU(       a  [        U5      S:  d  U(       a  [        U5      S:  a  [        S5      e[        U 5      n[        R                  " 5       nUUl        UUl        UUl        UUl        UUl        U	Ul        UUl        UUl        U
Ul        UUl        UUl        UUl        UUl        UUl        UUl        Ub  UR9                  U5        OUb  UR9                  U5        Ub  UR;                  U5        UUl        UUl        UUl         SnSURB                  l"        [G        U5        US:X  a  [I        U5        [K        U[        5      (       a  [        RL                  " UUU5        g[O        U5      n[        RP                  " UUU5        URS                  5         g)z/Save PDF to file, pathlib.Path or file pointer.r  r>   r   seek)filename must be str, Path or file objectz$save to original must be incrementalz3'linear' and 'use_objstms' cannot both be requestedr   zcannot save with zero pageszincremental needs original file(   z"password length must not exceed 40Nr   )*r   r  r   r   r   r?   r   ru  r   r;   r   r   PdfWriteOptionsdo_incrementaldo_asciido_compressdo_compress_imagesdo_compress_fontsdo_decompress
do_garbage	do_pretty	do_lineardo_cleando_sanitizedont_regenerate_iddo_appearance
do_encryptr  opwd_utf8_set_valueupwd_utf8_set_valuedo_preserve_metadatado_use_objstmsr  r   rW  JM_embedded_cleanJM_ensure_identityrB   pdf_save_documentr	  pdf_write_documentr	  )r(   rj   r  r  r  r  r  r  r  r  r  r  
appearancer  r  r  r  r  r  r  r  r`  rU  r	  s                           r)   r  Document.save>  sI   4 >>T..;<<>S Xv&&8}HXv&&}}H6**HIIyy CDDkRSS??Q:;;yyH$ !BCCs7|b(HX9KABBt$$$&)""0!.#! "+'$&$$X. $$W-$$W-$5!)"4*+'#>s#h$$##C48'1C$$S#t4!r+   c                 d   U R                   (       a  [        S5      e[        U5      [        L a  OF[	        US5      (       a  [        U5      nO)[	        US5      (       a  UR
                  nO[        S5      eXR
                  :X  a  [        S5      e[        U 5      n[        R                  " X!5        g)z.Save a file snapshot suitable for journalling.zdoc is closedr>   r   r
  zcannot snapshot to originalN)	r   r   r   r   r?   r   r   r   pdf_save_snapshot)r(   rj   r`  s      r)   save_snapshotDocument.save_snapshot  s    >>_-->S Xv&&8}HXv&&}}HHIIyy :;;t$.r+   c                 T    U R                  U R                  S[        R                  S9$ )zSave PDF incrementallyT)r  r  )r  r   r   PDF_ENCRYPT_KEEPr/   s    r)   saveIncrDocument.saveIncr  s!    yyAWAWyXXr+   attached_filesclean_pagesembedded_fileshidden_text
javascriptr  
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(       aw  UR%                  5       n['        U5      S
:X  d   eU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 Trr  Ns   Trr      3   Qro   )
cont_lines	out_linesin_textsuppressmake_returnrs   s         r)   remove_hidden%Document.scrub.<locals>.remove_hidden  s      IGHK"5="G$$T*5=#G$$T*7?#H"&K9%$q'T/$H$$T*4<$H$$T*  &/ #0   r+   r~  zclosed or encrypted docFr   r  )r3  T)imagesr   r	  Thumbr  z(bad xref %i - clean PDF before scrubbingSz/JavaScriptz<</S/JavaScript/JS()>>r  z	/Metadata<<>>s   deleted)rM  r  )"r  r   r  r   set_metadatar  resetr  delete_linkr  r   r   rK  rR  r  r  apply_redactionsr  get_contentsr;   xref_streamr  r  update_streamr  r  r  r  r  r  r[  rR  rJ  rK  )r0  r3
  r4
  r5
  r6
  r7
  r  r8
  r9
  r:
  r;
  r<
  r=
  r>
  rI
  r   r[  r)  r  found_redactsr   r  r  r  rD
  r   
xref_limitr   r  s                                r)   scrubDocument.scrub  s   "/	b zz[))s}}677KJR D"llnFLLN - (!D$$T* " "M::a=E$C$CC%%d%3"**,::a=E$:$::$(M ' m%%]%;;!$$&&))+5zQ&Qxt,*4??+<=
 ::j1D%%dD1z##DIIw7:fD$$TYY@S Z ))+% ,   "
J*J!Z(D??4((@4G o%c..tS9!<M.!!$,f-a0K?!!$/!!$
!=j1!4>  z6:) )r+   quadsc                 n    Uc  S[         -  [        -  [        -  [        -  n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   )rZ
  r  r  r  )TEXT_DEHYPHENATETEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_MEDIABOX_CLIP
search_for)r0  rz  r   rZ
  r  r  r  s          r)   search_page_forDocument.search_page_forK  s]    * =&'-. // )	)E x"" # 
 	
r+   c                 (   U R                   (       d  U R                  (       a  [        S5      eU R                  (       d  [        S5      e[	        US5      (       d  [        S5      e[        [        U 5      5      n[        U5      S:X  d  [        U5      U;  d  [        U5      U;  a  [        S5      e[        U 5      n[        S:  a&  [        R                  " X1[        R                  5        O[        R                  " X15        U R                  5         g)	z,Build sub-pdf with page numbers in the list.r  r~  r  zsequence requiredr   r  )r      r   N)r   r  r   r  r?   rR  r;   r  r   r   rL  r   pdf_rearrange_pages2PDF_CLEAN_STRUCTURE_KEEPr!  )r(   pylistevalid_ranger`  s       r)   selectDocument.selecto  s    >>T..;<<{{[))w..011CI&LA7|;.7|;.122 t$ *, &&sU5S5ST&&s4 	r+   c                     [        U 5      nU(       d  [        R                  nO[        R                  " U5      n[        R                  " X#5        gr`  )r   r   rE  r  pdf_set_document_language)r(   rH  r`  rG  s       r)   r  Document.set_language  s;    t$&&D55h?D''2r+   c                    U R                   (       a  [        S5      e[        U R                  5       R	                  5       5      nU[        5       :X  a  [        S5      eU(       aZ  [        U5      [        [        4;  a  [        S5      e[        U5      R                  U5      nU[        5       :w  a  [        SU-  5      eU(       aZ  [        U5      [        [        4;  a  [        S5      e[        U5      R                  U5      nU[        5       :w  a  [        SU-  5      eU(       aZ  [        U5      [        [        4;  a  [        S5      e[        U5      R                  U5      nU[        5       :w  a  [        SU-  5      eU(       a  [        U5      [        [        4;  a  [        S	5      eU H`  n	[        U	5      [        [        4;  a  [        S
U	-  5      e[        U	5      R                  U5      nU[        5       :w  d  MT  [        SU-  5      e   U(       a2  [        U5      R                  5       nUS:X  a  SnUS;  a  [        S5      e[        U 5      n
[        R                  " [        R                  " U
5      [        S5      [        S5      5      nUR                   (       d  gUS:X  a!  [        R"                  " U[        S5      5      nO5[        R$                  " [        R"                  " U[        S5      5      U5      nUR                   (       d  [        [&        5      e[)        XX4XV5        [        R*                  " U
R                   5        g)z5Set the PDF keys /ON, /OFF, /RBGroups of an OC layer.r   z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)rk  rl  rp
  zbad 'basestate'r  r3  Nr  r  ri  )r   r   r  rR  ry  r   r   r   
differencer   upperr   r   r  r  r  r   r
  r  rn  JM_set_ocg_arraysrY  )r(   ro  	basestater[  offrbgroupsr,	  rO  r  rb  r`  rx  r  s                r)   	set_layerDocument.set_layer  s   >>.//4==?'')*35=?@@Bxe}, !122B""4(ACEz !7!!;<<Cyu- !233C##D)ACEz !81!<==F|D%=0 !566F&&t,ACEz !;a!?@@H~dE]2 !788Aw4-/$%7!%;<<F%%d+:$%>%BCC  I,,.IK''	 :: !233t$!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/0032HEs~~.r+   c                 |   [        U[        5      (       aG  U R                  5        Vs/ s H  o3S   U:X  d  M  US   PM     nnU/ :X  a  [        SU S35      eUS   n[	        U 5      nUS:X  a  [
        R                  " XQ5        gUS:X  a  [
        R                  " XQ5        g[
        R                  " XQ5        gs  snf )	z$Set / unset OC intent configuration.r   r8  z	bad OCG 'r  r   r   r   N)	rB   r   r1	  r   r   r   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)r(   r8  rQ  uiri
  r`  s         r)   set_layer_ui_configDocument.set_layer_ui_config  s     fc""-1-B-B-D]-Dr6
V\H\lbl-DF]| 9VHB!788AYFt$Q;,,S9q[..s;,,S9 ^s
   B9	B9rT	  c                    U R                  5       nUS:X  a  [        S5      eU(       a  [        U[        5      (       d  gSSSS.n[	        UR                  5       5      R                  UR                  5       5      (       dD  S[	        UR                  5       5      R                  UR                  5       5       3n[        U5      eSnUR                  U5        UR                  5        HA  u  pg[        U5      R                  5       nUS;  a  [        SU S	U S
35      eUSU SU 3-  nMC     US-  nU R                  USU5        g)zSet the PDF MarkInfo values.r   	not a PDFFrM	  zbad MarkInfo key(s): rK	  )rR	  falsezbad key value 'z': 'r   rQ	  r   rL	  rJ	  T)rI  r   rB   r9   r  ry  
issupersetrq
  rG  rF   r   r  r  )r(   rT	  r  rS	  badkeyspdfdictr  r   s           r)   set_markinfoDocument.set_markinfo  s%   !19[))z(D99 EuM5::< ++HMMO<<-c(--/.B.M.Mejjl.[-\]GW%%X++-JCe*""$E-- ?3%tE7!!DEE3%q((G	 (
 	4$
G4r+   r  c                    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	 H?  u  pX+   n[#        U5      (       a  US;   a  SnO[%        U5      nU R                  XU5        MA     U R                  5         gs  sn
n	f )zKUpdate the PDF /Info object.

Args:
    m: a dictionary like doc.metadata.
r~  r  Nzbad metadataAuthorProducerre  rP  r+  ModDateSubjectKeywordsTrapped)r  r  rZ  r  r  r  r  r  r  r  r  zbad dict key(s): %sr  Infor  r   rH  r`   rN
  %i 0 Rr  )noner  )r  r   r   r  r   r9   r  ry  rq
  r  r8   r  r@  rK  r  r  rF   rw  r  )r0  r  keymap
valid_keysdiff_setr   r  r  	info_xrefr  rJ   r  r  pdf_keys                 r)   rO
  Document.set_metadata  s    zz[))==C,,;<<9A!WD ^,," *  " 
 '
qvvx=++J7su'(2CS/!""2v.;IDLL34I7yA~>((*Ii0RI)=>"WR0LLN,-GGIOIDA!IOHCkG99'7 7!#&Y5 P 	 Ps   H	*H	r  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
rC  r  r   rD  rG  r   r  )z/OCGz/OCMDr  r  Nr
  )r   r  r   r  xref_get_keysr  )r0  r  r  r  r   s        r)   r  Document.set_oc<  s     ==C,,:;;""43;$&999D@AA6&&r62GAF{d*;; !=!BCC7ts0066T40tX]3r+   rO  rY  rZ  c                   ^	^
 [        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$ )Nr   zbad 've' format: %sr   )andornotzbad operand: %sr
  z[/%sr   z
bad OCG %iz %i 0 Rz %sr  )r   r   r   r;   r   r  r  r8   )rZ  rG   rb  all_ocgsve_makers      r)   r
  #Document.set_ocmd.<locals>.ve_makerg  s    Bxe},B! !6!;<<!u{{}$88 !2RU!:;;!u{{}%#b'Q, !6!;<<BqEKKM)DV7c>(()9::IM)DEHQK//D  CKDKr+   z<</Type/OCMDzbad OCGs: %srW  r   c                     SU -  $ )Nr
  r.   r  s    r)   <lambda>#Document.set_ocmd.<locals>.<lambda>  s    hlr+   r  AnyOnAllOnAnyOffAllOff)anyonallonanyoffalloffzbad policy: %sz/P/%sz/VE%srL	  r   rV  TrG  zbad xref or not an OCMD)r  rR  ry  r   r   r   rq
  r   r  r  r   r  r@  rJ  rK  )r0  r  rO  rY  rZ  r   r  r   polsr
  r
  s            @@r)   set_ocmdDocument.set_ocmdR  sQ   & s||~**,-	$ DJ4-/D	$$X.ACEz$q( o%Hsxx,BD(IJJSPPD[&&(F  ""	D CC !1F!:;;Gdl**DGhrl**D 19##%D$!GG677$%r+   r	  c                 $   SnU R                  5       nUS:X  a  [        S5      eU(       d  [        S5      eUS   S:X  a  USS nU H=  nUR                  5       UR                  5       :X  d  M'  U R                  USSU 35          g	   [        S5      e)
zSet the PDF PageLayout value.)r	  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r
  zbad PageLayout valuerQ	  r   Nr	  TrI  r   r  r  )r(   r	  rS	  r  rJ   s        r)   set_pagelayoutDocument.set_pagelayout  s    m!19[))344a=C#ABJA!QWWY.!!$!g>  /00r+   r	  c                 $   SnU R                  5       nUS:X  a  [        S5      eU(       d  [        S5      eUS   S:X  a  USS nU H=  nUR                  5       UR                  5       :X  d  M'  U R                  USSU 35          g	   [        S5      e)
zSet the PDF PageMode value.)r	  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r
  zbad PageMode valuerQ	  r   Nr	  Tr
  )r(   r	  rS	  r  rJ   s        r)   set_pagemodeDocument.set_pagemode  s    `!19[))122A;#|HA~~1779,!!$
asG<  -..r+   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<<	startpageprefixr`   z/P(%s)r  z/S/%sfirstpagenumr   z/St %irL	  )r<   )ru  r  s     r)   create_label_str2Document.set_page_labels.<locals>.create_label_str  s     {++Ayy2&",Xh//yy"%+WuW~--yy+a/Xn 555IAHr+   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
  ?Document.set_page_labels.<locals>.create_nums.<locals>.<lambda>  s    anr+   r  r`   )r  r  )rL  ru  r  r
  s      r)   create_nums-Document.set_page_labels.<locals>.create_nums  sB     KK4K5fEfU)%0fEFAH Fs   <N)rM  )r0  rL  r
  r
  s      @r)   set_page_labelsDocument.set_page_labels  s"    	$	 	[01r+   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[        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[+        SUS-
  5      nU[,        S.nUS	   S:  a	  [.        US'   [	        U5      S:  a  [        US   5      [        [0        4;   a  [+        SUUS   -
  5      US'   O[        US   5      [2        L a  US   R5                  5       OUnSU;  a  UUS'   OeU U   n[+        US   5      nUR6                  R(                  UR8                  -
  Ul        UUR:                  -  nUR<                  UR8                  4US'   0 nSUS'   SUS'   SUS'   SUS'   SUS'   [>        R@                  " 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
  [K        5          GNGf = f! [F         a    [H        S	:  a
  [K        5          GNTf = f! [F         a    [H        S	:  a
  [K        5          GNaf = f! [F         a    [H        S	:  a
  [K        5          GNnf = f! [F         a    [H        S	:  a
  [K        5          GN{f = f! [F         a    [H        S	:  a
  [K        5          GNf = f! [F         a    [H        S	:  a
  [K        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 1r  r   z row %i: page number out of range)r   ro  z
bad row %izbad hierarchy level in row %i)r  r  lastr  r  $   )r	  r  r  r   r	  r  r  r
  r  r\  r	  topr  r   r  rm  r  r  r  r  rK	  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[ r  z/F %iz/Type/OutlinesrL	  ))r   r  r   r  r;   r  r   r   r   ru  rR  r8   r  ro   r@  r  r  r   r  r}	  r0  r"  r  	LINK_NONEr  r9   r$  r|	  rc  rx  rb  r
  
getDestStrr<   rW  rk   r  rz   r   rK  r  )r0  r  r  toclenru  t0rf  t1t2	old_xrefsr  lvltabolitemsr  r  r  rz  r  page_heightr
  r
  r   rg  rA  r   r  r:  r  s                               r)   set_tocDocument.set_toc  s    ==C,,;<<zz[))s{{}%% 9T5M):;;S^^
V8D%=(FGGa5A:BCCeFQJ'(ABUBA,*, !Ca!GHHRu-#b'2G Q!788RU3&2a519 !@AE!JKK!ur!uqy  !@AE!JKK )  KKM	 	sY&&(QC	N"FS^35C,,./ 6 Q
 RaIJ vAAA$C!%Ecnnq(#a1*:;Cc*I**3/66KK",-C"I6Itax$-	&!1vz!:#u-&+Bad0B&CIdO 04AaDzT/A!		yI9,*-	$"3x %io 6"&,,"5"5"? %(<(< <+077EGG*<	$AAgJAgJAfIAfIAfI((I>AfI AeHAgJ q/AhKUAfI"w/AgJ"x3a)--PQ:R6RRAgJa%FKC!G_-F j))X#.w1$w1$g"$"#a%w!"Qv"6N&	vf~. 1uV!"QvNN1q z w'EArC'{a{R[00r&z!
g;#?T"W+->>>Cf:?>DF,<<<Cf:?>DF,<<<C
h<"$+d2h<.@@@C
f:?>DF,<<<C
x"W+-- vvg3r'{#3q#8ibk(:;<A>>vvgq!A%wG,,Av''4KCdgs+u (x 	o  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@s~   YY)7ZZ3'[?[=\"Y&%Y&)Z
ZZ0/Z03[[[:9[:=\\"]]r
  r  r  r  r
  c
           	      l   U R                  5       U   n
Sn[        U5      [        L Gae  US   [        :X  ad  US   nU R	                  U5      nU R                  U5      R                  nUR                  S[        SS5      5      nXR                  -
  Ul	        XrS'   [        R                  " 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[*        :X  a  U R-                  U5      $ Uc  Uc  gUc  U R)                  U
SUS9$ U[        :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  [        SUS-
  5      nO[        U5      nXR                  -
  Ul	        UUUUUU	S.n[        R                  " 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   r  r   r	  r  r
  z/Azbad bookmark destrm  r   r   zbad color valuer  Fr  r   r  N)rQ  r  rm  r  r  )rQ  r  zbad page number)r  r	  r  r   re   r
  r`   )r  r   r9   r  r  r}	  r0  r<   r"  rc  r
  r
  r7   r   r   r  r  r;   r  r   rR  r
  r  rR  ru  )r0  r  r
  r  rz  r  r  r	  rj   r
  r  r  r
  rQ  rm  r  r  r  r  ddicts                       r)   set_toc_itemDocument.set_toc_item  s   Z $$&s+		?d" I-'MM#.	!..s3::]]4r27"TT)"$$%%i;F$$T** !455MM'*ES./u:?c%j1nE
Q$%677==/D]]8U3FQX%E }}Z0H''abz! (   9##C((<EM<''T'GG9{cq#..12D)EE !233cAg.I**373::Kz2{R/02Y"TT) 
 !!)U3R<v0066011##D5#IIr+   c                 .   U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " [        R                  " U5      [        S5      5      nUR                  (       d  [        [        [        5        [        R                  " UR                  S5      5      n[        R
                  " U[        S5      5      nUR                  (       a  [        X%US5        g	[        R                  " X$[        R                   " 5       S5      n[        R"                  " U[        S5      [        S5      5        [        R"                  " U[        S5      [        S5      5        [        R"                  " U[        S5      U5        g	)
z"Store XML document level metadata.r  r  r  r  r   r  r  XMLN)r   r  r   r   r   r
  r  r  r   r  MSG_BAD_PDFROOTr  r  r  r/  r  r  rT  )r(   r  r`  r  r$  r  s         r)   set_xml_metadataDocument.set_xml_metadata  s   >>T..;<<t$!!5#4#4c#:HV<LM_&:;22HOOG4LM  $(<=>>cQ/&&%,,.!DCXf%5x
7KLXi%8(5/Jhz&:C@r+   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  [        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        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  [        SU< S35        M\  U(       a  [        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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   r	  NNr   r  rH  r`   WNDWr8   )r  r8   r  )r  dfdf_xrefwidthsdwidthsr0  s        r)   get_old_widths-Document.subset_fonts.<locals>.get_old_widthsG  s    !!$(9:B!u!"Q%"+--eR89G%%gs3FayG#&&w5GqzU" ?" "!*?"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.
r
  r   r	  Nr   r  rH  r`   r
  r  r
  )r  r8   r  r   r   r  )r  r
  r
  r
  r
  r0  s        r)   set_old_widths-Document.subset_fonts.<locals>.set_old_widthsY  s     !!$(9:B!u"Q%"+--eR89GVC'v3;K;KGUX;Y<<   #v6  #v6WS(S=M=M>>>   $7    $8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  +TrG  z
/BaseFont/r
  r	  r   r  rH  FontDescriptorr  z
/FontName/)randomstringr  choicesr   ascii_uppercaserJ  r  r  r8   rK  )r'  r
  r
  r
  font_strr
  r
  r   fd_xreffd_strr0  s             r)   set_subset_fontname2Document.subset_fonts.<locals>.set_subset_fontnameq  s    WWV^^E&2H2H,IQ^OPSVVFxDAH''lV6KLH!!(,=>B!ubeAbk11%<=%%g/?@a5F?!"Q%--r":;G __W_FF#^^L,:OPF%%g6h1r+   c           	      ,    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	[        R                  " 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        [        R                  " US5       nUR                  U 5        SSS5         [        R                  " U5         UR#                  U	5        [%        US9nUR&                  nUR(                  S:X  a  SnSSS5        U$ ! [         a"    [        (       a
  [	        5         [        S5        e f = f! , (       d  f       N= f! , (       d  f       N= f! [          a     Nf = f! [          a    [	        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     z--gids-file=   z%i
z--unicodes-file=   z%04x
wb)r  )fontTools.subsetsubsetImportErrorr  rz   rv   tempfileTemporaryDirectoryr=   r>   ro   r~  r   r   rh   r  rk   mainr  r	  glyph_count)r	  unc_setgid_setftsr  tmp_diroldfont_pathnewfont_pathuncfile_pathr  unc_fileunc_listuncr  r  
new_buffers                   r)   build_subset+Document.subset_fonts.<locals>.build_subset  s   .
 ,,.'"),7"),7"),7 #$\N3)*-/#	 WWy5sVLPX(l<.$ABC(#'=#+C$NN6C<8 $, &6|n$EFC(#'=#+C$NN8c>: $, M WW\40HNN6* 1IIl+&HHTN6D!%J''1,%)
U /\ g  ''N,<IJ* ML 10 !  ! &"$!%J&W /.\ s   F 6HB"F64HG%H.G8G(,F36
G	 H
G	H
G%"H$G%%H(H>H HH
Hc           
      @  >^ S mU4S jn[        U R                  5       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     [        US9nU
R                  UR                  5        AXU4TU'   M     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   r8   r  chr)r   r  r  s      r)   	norm_name@Document.subset_fonts.<locals>.repl_fontnames.<locals>.norm_name  s]    
 Tk		#ADQQ/4A<<QQ@D Tk r+   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   r  r   Nr
  r	  r  rX  TrG  z	/BaseFontrQ	  rL	  )r  ro   r  r8   rJ  r   r  )	r0  rG   r   rd  descendentsr  rC  rD  r&  s	           r)   get_fontnamesDDocument.subset_fonts.<locals>.repl_fontnames.<locals>.get_fontnames  sL   
  7!
++DGZ@CABG$X.(LL*!..tAw8IJq>W, L)!nQr2''//{3B/0D"%//$4/"HK %%k27$))#rAv6B[--c26:K<L<LTSUXYSY<Z[B*6B7H(2H,X.r+   Trf  r   r   r   )otfttfwoffwoff2r  r
  r  r  N)
rR  ru  ri  r;   r  r<   r  r~  r  r   )r0  r+  rf  r  	font_xreffont_extr  extrr  rd  name_setxref_setsubsetsr   r  r&  font_bufferss                  @r)   repl_fontnames-Document.subset_fonts.<locals>.repl_fontnames  s#   	8 3>>*++AD+9A !!I tH tH (  !8}q(Xa[C-? ++I6D!%bJ)#1E2>2B2B"SUCECE35>$B3/H LL+ % T* !&:6DLL+08G/LL,9 : +r+   c                 T   > TR                  5        H  u  nu  n  nX;   d  M  Us  $    g r-   )rF   )r   r	  r6  r9  r9  s       r)   find_buffer_by_name2Document.subset_fonts.<locals>.find_buffer_by_name  s3    ,8,>,>,@((1a#!M -A r+   zNo fonts to subset.r   r  !   charsr   zCannot subset r   zBuilt subset of font r2  TrG  )r   rl  pdf_subset_fonts2r   rR  ru  rv   ry  r;   get_texttracer   r9   r~  rF   r  rJ  rK  ) r0  r
  r
  r`  r
  r
  r  r  r:  r=  old_fontsizenew_fontsizer  r   rG  r   r	  r6  r7  set_ucsset_gidr  
old_bufferr8  r  r  r'  r  r3  width_table	def_widthr9  s    `                              @r)   subset_fontsDocument.subset_fonts$  ss   8 55c:C##CeCNN.C)DE	#$	0	20>	@K	MZ	 	s-/&++-JC
O+L . D **,:T)<,,X6>9Ef9M6($6WggAKK!%KK!% ' )1(Wg<N'OV$ - " :F9K9K9M5J58W%j'!*gajIJH~a(H!S_J%GnXL:;/|1=>""j"9C1vH) ' H
 &	)7	)B&Y!!)X6))"9k9E & C
O+L9 :N< **r+   c                    [        U 5      n[        R                  " [        R                  " U5      [	        S5      [	        S5      [	        S5      5      n[        R
                  " U5      (       a  [        R                  " U5      (       d  US:  a  g[        [        5      eUS:  a  g[        R                  " X15        U(       a7  [        R                  " U5        [        R                  " UR                  5        gg)zActivate an OC layer.r  r3  ri  r   Nr   )r   r   r  r  r  r:  r  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultrY  r   )r(   ro  
as_defaultr`  cfgss        r)   switch_layerDocument.switch_layer\  s    t$""!!3' (#	 !!4((0C0CT0J0Jz.//A:%%s31137!!3>>2 r+   c                 |   U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5      n[        USUS-
  5      (       d  [        S[        5        [        U5        [        XB5      n[        R                  " XAU5        U(       a  [        [        U5      5        gg)z!Replace object definition source.r  r   rU  N)r   r  r   r   r   r  r  r  r  r?  r  r
  JM_refresh_linksr   )r(   r  r   r   r`  xreflenrN  s          r)   rK  Document.update_objectp  s    >>T..;<<t$$$S)a++J-%c073l401 r+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5      nUS:  d  X:  a  [        [        5      e[        R                  " XQS5      n[        R                  " U5      (       d  [        [        5      e[        U5      nUR                  (       d  [        [        5      e[        XWX5        SUl        g)zReplace xref stream part.r  r   r   N)r   r  r   r   r   r  r  r  r  MSG_IS_NO_DICTr-  r   r  r.  r/  dirty)	r(   r  r   rM  compressr`  rV  r  r$  s	            r)   rU
  Document.update_stream  s    >>T..;<<t$$$S)!8t~l++$$S2  %%n-- (~~^,,31	r+   c                 f    [        U SS9nUR                  (       a  [        R                  " U5      $ g)z!
Count versions of PDF document.
r   r  )r   r   r   pdf_count_versionsr  s     r)   version_countDocument.version_count  s+    
 ta0>>++C00r+   c                     SSK Jn  U" 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  UR                  5       $ )Nr   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  r  r  r  r  r  r  bios                         r)   r   Document.write  si    , 	i		#%-+'%'!"3'#5) 	 	
, ||~r+   c                 &    U R                   " U0 UD6$ r-   )r   r  s      r)   r  Document.tobytes  s    zz4*6**r+   c                 b    [        U 5        U R                  R                  U R                  5      $ zPDF xref number of page.rn  r   r  r8  r/   s    r)   r  Document.xref  %     	D{{$$T[[11r+   )keepsourcetargetrl  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[  rM  Nr  r   )xref_is_streamxref_stream_rawrU
  r
  r  r  )r0  rm  rn  rl  r   r  rG   s          r)   	xref_copyDocument.xref_copy  s     f%%((0F	   <D$$V,C{V&1 -
 $$V,C##F0DV$q'2 -r+   c                    [        U 5      n[        R                  " U5      n[        USUS-
  5      (       d  US:w  a  [	        [
        5      eUS:  a  [        R                  " X15      nO[        R                  " U5      nUR                  (       d  g[        R                  " XR5      nUR                  (       d  gSn[        R                  " U5      (       a  SnS[        R                  " U5      -  nGOg[        R                  " U5      (       a  SnGOH[        R                  " U5      (       a  S	nGO)[        R                  " U5      (       a  S
nS[        R                  " U5      -  nO[        R                   " U5      (       a  SnO[        R"                  " U5      (       a  SnSnO[        R$                  " U5      (       a#  Sn[        R&                  " U5      (       a  SnOySnOv[        R(                  " U5      (       a  SnS[        R*                  " U5      -  nO?[        R,                  " U5      (       a"  Sn[/        [        R0                  " U5      5      nOSnUc  [3        USS5      n	[5        U	5      nX4$ )z+Get PDF dict key value of object at 'xref'.r   r  r   )r  r  Nr  r
  r	  r9   r8   z%ir  r  rw  rR	  r
  r   z/%sr
  unknown)r   r   r  r  r   r  r;  r  r   rm  r	  r  r:  r  
pdf_is_intr  pdf_is_realr  r]	  r^	  r  r  pdf_is_stringr  r  JM_object_to_bufferr  )
r(   r  r  r`  rV  r  subobjr   r   r$  s
             r)   r  Document.xref_get_key  s   t$$$S)a++
l++!8''2C##C(C~~#$$S.  #  ((De..v66D''Dv&&Df%%D%**622Dv&&Dv&&DDv&&D  ((v&&D5,,V44D  ((D$U%=%=f%EFDD<%fa3C',D|r+   c                    [        U 5      n[        R                  " U5      n[        USUS-
  5      (       d  US:w  a  [	        [
        5      eUS:  a  [        R                  " X!5      nO[        R                  " U5      n[        R                  " U5      n/ nUS:X  a  U$ [        U5       H>  n[        R                  " [        R                  " XG5      5      nUR                  U5        M@     U$ )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   r  r   )r   r   r  r  r   r  r;  r  r  rR  r  r  ro   )	r(   r  r`  rV  r  rI   r   rf  r  s	            r)   r
  Document.xref_get_keys)  s    t$$$c*a++
l++!8''3C##S)C$6IqA##U%;%;S%DECIIcN  	r+   c                     U R                   (       d  U R                  (       a  [        S5      eU R                  US5      S   S:X  a  gg)zCheck if xref is a font object.r  r  r   z/FontTFr   r  r   r  r(   r  s     r)   xref_is_fontDocument.xref_is_font<  s=    >>T..;<<T6*1-8r+   c                     U R                   (       d  U R                  (       a  [        S5      eU R                  US5      S   S:X  a  gg)z!Check if xref is an image object.r  r  r   rE  TFr  r  s     r)   xref_is_imageDocument.xref_is_imageD  s=    >>T..;<<T9-a0H<r+   c                 x    [        U SS9nUR                  (       d  g[        [        R                  " X!5      5      $ )z!Check if xref is a stream object.r   r  F)r   r   rw  r   pdf_obj_num_is_streamr  s      r)   rp  Document.xref_is_streamL  s.    ta0~~E//:;;r+   c                     U R                   (       d  U R                  (       a  [        S5      eU R                  US5      S   S:X  a  gg)z Check if xref is a form xobject.r  r  r   rF  TFr  r  s     r)   xref_is_xobjectDocument.xref_is_xobjectS  s=    >>T..;<<T9-a0G;r+   c                 l    Sn[        U SS9nUR                  (       a  [        R                  " U5      nU$ )zGet length of xref table.r   r  )r   r   r   r  )r(   rV  r`  s      r)   r[  Document.xref_length[  s/    ta0>>((-Gr+   c                    U R                   (       a  [        S5      e[        (       a$  [        R                  " U R
                  XU5      nU$ [        U 5      n[        R                  " U5      n[        USUS-
  5      (       d  US:w  a  [        [        5      eUS:  a  [        R                  " XQ5      nO[        R                  " U5      n[        [        R                  " U5      X#5      n[        U5      n	U	$ )z#Get xref object source as a string.r   r   r  r   )r   r   r  r   rJ  r   r   r   r  r  r  r;  r  ry  r  JM_EscapeStrFromBuffer)
r(   r  rH  r  rK   r`  rV  r  r$  r   s
             r)   rJ  Document.xref_objectc  s    >>.//;##TYY%HCJt$$$S)a++
l++!8''2C##C(C!%"<"<S"A:U%c*r+   c           	         U R                   (       a  [        S5      eU(       a9  [        U[        5      (       a$  [        R                  U5      [        5       S14;  a  [        S5      e[        U[        5      (       a4  U(       a-  US   S:X  a/  [        R                  USS 5      [        5       :w  a  [        S5      e[        U 5      n[        R                  " U5      n[        USUS-
  5      (       d  US:w  a  [        [        5      eUS:w  a  [        R                  " XA5      nO[        R                  " U5      n[        XbU5      nUR                  (       d  gUS:w  a  [        R                   " XAU5        g[        R"                  " U5      n[%        U5       HC  n	[        R&                  " U[        R(                  " Xy5      [        R*                  " Xy5      5        ME     g)	z&Set the value of a PDF dictionary key.r   rQ	  z	bad 'key'r   r   Nzbad 'value'r  )r   r   rB   r   INVALID_NAME_CHARSintersectionr  r   r   r  r  r  r;  r  JM_set_object_valuer   r
  r  rR  rT  r  r  )
r(   r  r  r   r`  rV  r  rN  rI   rf  s
             r)   r  Document.xref_set_keyv  sv   >>.//*S#..2D2Q2QRU2V_b_dgjfk^l2l[))%%%UeAh#oJ\JiJijopqprjsJtx{x}J}]++t$$$S) a++
l++2:''2C##C(C%c6!!2:##Cw7""7+A1X""..w:..w: r+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5      n[        USUS-
  5      (       d  US:w  a  [        [        5      eUS:  a  [        R                  " X!S5      nO[        R                  " U5      nSn[        R                  " U5      (       a!  [        R                  " X!5      n[        U5      nU$ )zGet decompressed xref stream.r  r   r  r   N)r   r  r   r   r   r  r  r  r  r  r   pdf_load_stream_numberr"  r(   r  r`  rV  r  r#  r$  s          r)   rT
  Document.xref_stream  s    >>T..;<<t$$$c*a++
l++19((#Q7C##S)C$$..:C #&Ar+   c                    U R                   (       d  U R                  (       a  [        S5      e[        U 5      n[        R
                  " U5      n[        USUS-
  5      (       d  US:w  a  [        [        5      eUS:  a  [        R                  " X!S5      nO[        R                  " U5      nSn[        R                  " U5      (       a!  [        R                  " X!5      n[        U5      nU$ )z&Get xref stream without decompression.r  r   r  r   N)r   r  r   r   r   r  r  r  r  r  r   pdf_load_raw_stream_numberr"  r  s          r)   rq  Document.xref_stream_raw  s    >>T..;<<t$$$c*a++
l++19((#Q7C##S)C$$22C>C #&Ar+   c                 `   [        U 5      n[        R                  " [        R                  " U5      [	        S5      5      nUR
                  (       d  [        [        [        5        [        R                  " U[	        S5      5      nSnUR
                  (       a  [        R                  " U5      nU$ )z"Get xref of document XML metadata.r  r  r   )
r   r   r
  r  r  r   r  r
  r  r  )r(   r`  r  r  r  s        r)   xref_xml_metadataDocument.xref_xml_metadata  sx    t$!!5#4#4c#:HV<LM_&:;  $(<=>>##S)Dr+   )r   r  r  __dict__c                     U R                   $ r-   )r  r/   s    r)   r
  Document.<lambda>  s    DMMr+   )r  r  r  r  r  r=  r  r  r	  r   r  r  r  r   r   r  r   )rs  N)NNNNr   r   r  )r  r  r  )r  r  r  r   rp  rr  r
  )r  S  J  NNr   NN)r  r   NN)r   r  r   )r  )r   r   N)r   FTTTFFFFFr     NNTr   r   r   )r  r   Nrt  )r   NNNFr%  )r  r  r  r  TTr   r   )Nr  r  r  helvNrn  r-   )Nr   r   r  r  r   )
Nr   r   TTTTTFNro  )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NNr   r   r   )TTTTTTTr   TTTTT)FNNN)NNNNN)r   NNN)NNNNNNNr   FF)r   Nr   r   )FFFFFFFFFFFFr   r  NNr   r   r   )r1   r2   r3   r4   rw  r{  r  r  r  typingoverloadr8   r   r  sysversion_infor  r   r   r   r  r   r   r  r  r  r  r  r-  r  r  Unionr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r0  r=  r  r!  rM  rR  rs  rU  r\  rz  r  r  r  rv  rw  r  r  r  r  r  r  
ByteStringrt  r  r  r  r  r  r9   r  r  OptBytesr  r  r  r   r  r  OptDictr0  r5  r<  r@  r  rR  rb  r  ri  rm  rq  rx  r   r+  r   r}  OptIntAnyr  r  r  r  r  r  r  r  r  r  rv  r  r  r  r  ru  r  r  r  r  r  r  r  r  r	  r	  r	  r	  r	  r	  rH  r&	  r1	  r4	  r  rA	  rG	  rT	  rW	  r   re	  r  r  rs	  r  ru  r}	  r	  r  r	  r	  implementationversioncollectionsabcIterable
_pages_retrD  rI  r  r  r	  r	  r  r	  r	  r
  r  r-
  r1
  rX
  ra
  ri
  r  rw
  r~
  r
  rO
  r  r
  r
  r
  r
  r
  r   r
  r
  rJ  rR  rK  rU
  r_  r   r  r  rr  r  r
  r  r  rp  r  r[  rJ  r  rT
  rq  r  	__slots__r  	is_streamr5   r.   r+   r)   r   r     s   4 ,;. __S    6!		 	4: 	 
	 
	sCx 	T 	 
	!W<r U# U)($$ $@9+  w@w@w@ w@ 	w@
 w@ w@|  DPDPDP 	DP
 DP DP DPL
	v||CH'= 	# 	>
+-^%("HDL% %S # C 3 WZ ad <@)" (	/6 p0)	8	 
'H8  (/DL
9 &*4 @d @D @D @$ 3 3$.;S ;c ;2<&s &
C P ##&&& & 	&
 & &P)s )&S#X 6 &	*S#X 6 	*5 	*c3h!7 D ,t   $"#,,sCx(  	
  >/bB  )-^/6 v  $ccc c 	c
 c cJ,2J c c "-^AHj AH AH AHF$# T T $
3 
d 
d 
K< #'%)"!!!  	! #! ! ! ! !L !" #'LLL L 	L
 L !L L L*S T $  444 4l"
 t 
z 
d 
{0 )\ 37 "#  ,,sD$/ 	
      D t(n $ $    ,   ; ;  	8&P
"
4% 9 9 / /2(<% $  :;S ;c ;(  0   	  	
 $/*$ 	5 	5(" C   #   !!F* __--
 __--d3
(6 (v (6 (T^ (:H  0/ 9 9 9v8 U,n2AL  +W"r/"Y $( $#' $#!#!"!%!%$(#!%Y;Y; Y; Y; !	Y;
 Y; Y; Y; Y; Y; Y; Y; "Y; Y; Y; Y;~  "#'"
"
"
 "
 	"

 "
 "
 !"
 "
H <?/B:"T d .;* ; ; ;zJ c s t 0 -1!+/GGG ,,tTz*G 	G
 T4Z(G GR1 1 /S / *2^ }}} } 	}D "& !#jJjJjJ jJ 	jJ
 jJ jJ jJ jJ jJ jJ jJXA$v+* v+t v+t v+X^ v+p	3(2$     ).`+ 2 2
 NR !3z !33 !3 !3d !3VZ !3F0d&<&$L$$
 CI12GIr+   r   c                   <    \ rS rSrS rS rS
S jrS rS rS r	Sr
g	)DocumentWriteri  c                     U $ r-   r.   r/   s    r)   r  DocumentWriter.__enter__  r  r+   c                 $    U R                  5         g r-   r  r  s     r)   r  DocumentWriter.__exit__  r  r+   c                    [        U[        5      (       a  O:[        US5      (       a  [        U5      nO[        US5      (       a  UR                  n[        U[        5      (       a5  [        R
                  " X[        R
                  R                  5      U l        g [        U5      n[        R
                  " X2[        R
                  R                  5      U l        UR                  5       S:X  d   e[        U R                  S5      (       d   eg )Nr  r   r   _out)rB   r   r?   r   r   FzDocumentWriterPathType_PDFr   r	  OutputType_PDFrV  )r(   r	   r   r	  s       r)   r   DocumentWriter.__init__  s    tS!!dJ'':DdF##99DtS!!..u?U?U?b?bcDI (.C..e>T>T>c>cdDI'')Q...DIIv....r+   c                 t    [        U5      n[        R                  " U R                  U5      n[	        U5      nU$ r-   )r  r   fz_begin_pager   rG  )r(   r6  	mediabox2rR  device_wrappers        r)   
begin_pageDocumentWriter.begin_page  s2    #H-	$$dii;&/r+   c                 D    [         R                  " U R                  5        g r-   )r   fz_close_document_writerr   r/   s    r)   r  DocumentWriter.close  s    &&		2r+   c                 D    [         R                  " U R                  5        g r-   )r   fz_end_pager   r/   s    r)   end_pageDocumentWriter.end_page  s    499%r+   r#  Nr`   )r1   r2   r3   r4   r  r  r   r  r  r  r5   r.   r+   r)   r  r    s     /.3&r+   r  c                   B   \ rS rSrS r          SS jrS r\S 5       r\S 5       r	\S 5       r
SS	 jr\S
 5       r\S 5       rSS jrSS jr\S 5       rS rSS jr\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSS jrS rS rSrg)r      c                 *    [        U 5      [        La  g g r-   )r   r  r/   s    r)   r[  Font.__del__   s    :T! "r+   Nc                    U(       ab  [        US5      (       a  UR                  5       nO [        U[        5      (       a  [	        U5      n[        U[        5      (       d  [        S5      e[        U[        5      (       a  UR                  5       nSU;   d  SU;   d  SU;   a  [        S5        US;   a  SnOUR                  S	5      (       a  S
nO~UR                  S5      (       a  SnOeUR                  S5      (       a  SnOLU[        R                  5       ;   a  SS KnUR                  U5      nS nAOUS:  a  [        R                  X5      n[         R"                  " U5      n[%        XX4XXxX5
      nXl        g )Nr  zbad type: 'fontbuffer'rQ	  \r   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanr   )r?   r  rB   r  r  r   r   r  rv   r7   fitz_fontdescriptorsry  pymupdf_fontsmyfontBase14_fontdictr<   r   r  JM_get_fontr   )r(   r   r  r  scriptrH  r  is_bold	is_italicis_serifembedfname_lowerr  rG  r  s                  r)   r   Font.__init__   sK    z:..'002
J	22":.
j%00 !9::h$$"..*Kk!T[%8C;<N;<<<''	22''00''00 4 9 9 ;;$*11+>
!A*..xB11(;8tx8 	r+   c                      SU R                   -  $ )Nz
Font('%s')r   r/   s    r)   r   Font.__repr__9   s    dii''r+   c                 B    [         R                  " U R                  5      $ )z Return the glyph ascender value.)r   fz_font_ascenderr   r/   s    r)   r  Font.ascender<        %%dii00r+   c                 6    U R                   R                  5       $ r-   )r   fz_font_bboxr/   s    r)   r5  	Font.bboxA   s    yy%%''r+   c                     [         R                  " [         R                  " U R                  R                  R
                  5      5      n[         R                  " U5      $ r-   )r   r2  ll_fz_keep_bufferr   r   r	  fz_buffer_extract_copy)r(   r3  s     r)   r	  Font.bufferE   s<    ..%"9"9499;O;O;V;V"WX++W55r+   c           	      n   [         R                  " U5      n/ nU H  n	[        U	5      n
U(       a4  [         R                  " U R                  U
5      nUS:  a  U R                  nO$[         R
                  " U R                  XU5      u  pUR                  U[         R                  " WX5      -  5        M     U$ )z@Return tuple of char lengths of unicode 'text' under a fontsize.r   )r   r  ordfz_encode_character_scr   !fz_encode_character_with_fallbackro   r  )r(   r   r   rH  r  wmode
small_capsrG  r   chr  gidr  s                r)   char_lengthsFont.char_lengthsJ   s    11(;BBA22499a@!899D!CCDIIqZ^_	IIh!7!7c!IIJ  	r+   c                 B    [         R                  " U R                  5      $ )z!Return the glyph descender value.)r   fz_font_descenderr   r/   s    r)   r  Font.descenderY   s     &&tyy11r+   c                 `  ^ [         R                  " U R                  R                  5      nU(       d  g [	        U[         R
                  5      (       d   e[        (       a{  UR                  /mU4S jnU" S5      nU" S5      nU" S5      nU" S5      nU" S5      nU" S5      nU" S5      n	U" S5      n
U" S5      nU" S5      nU" S5      nU" S5      nU" S5      n[        (       a  WOUR                  [        (       a  WOUR                  [        (       a  WOUR                  [        (       a  WOUR                  [        (       a  WOUR                  [        (       a  WOUR                  [        (       a  W	OUR                  [        (       a  W
OUR                  [        (       a  WOUR                  [        (       a  WOUR                   [        (       a  WOUR"                  [        (       a  WOUR$                  [        (       a  WOUR&                  [        (       a  WS.$ UR(                  S.$ )Nc                 :   > TS   SU -  S-
  -  nTS   U -	  TS'   U$ r  r.   )bitsrK   rJ   s     r)   bFont.flags.<locals>.bh   s/    dqDy!m,tt|!
r+   r   )monoserifr  r  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxr  zcjk-langr  znever-embed)r   ll_fz_font_flagsr   r   rB   fz_font_flags_tr   is_monor  r  r  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxr  cjk_langr  never_embed)r(   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ   s                   @r)   r  
Font.flags^   s   ""499#7#781e334444;A dGtHdG!IaDM1J!IA$KQ4LQ4LtHaDEA$K+6;AII,7KQZZ+6;AII-8[	akk1<!//.9k
q||-8[	akk/:{0;0;,7KQUU,7KQZZ)4!''/:{ 	 AB 	r+   c                    [         R                  " U5      nU(       a4  [         R                  " U R                  U5      nUS:  a  U R                  nO$[         R                  " U R                  XU5      u  px[         R
                  " WXt5      $ )z2Return the glyph width of a unicode (font size 1).r   )r   r  r  r   r  r  )	r(   chr_rH  r  r  r   rG  r  r  s	            r)   glyph_advanceFont.glyph_advance   sj    11(;..tyy$?Caxyy??		4Y]^IC%%dC77r+   c                 T   [         R                  " U5      nU(       a4  [         R                  " U R                  U5      nUS:  a  U R                  nO$[         R                  " U R                  XU5      u  pg[        [         R                  " WU[         R                  " 5       5      5      $ )z1Return the glyph bbox of a unicode (font size 1).r   )r   r  r  r   r  r*  fz_bound_glyphr{  )r(   charrH  r  r   rG  r  r  s           r)   
glyph_bboxFont.glyph_bbox   sx    11(;..		4@Caxyy??DZ^_ICE(($U^^5EFGGr+   c                 B    U R                   R                  R                  $ r-   )r   r   r  r/   s    r)   r  Font.glyph_count   s    yy##///r+   c                     [        U5      $ )z$Return the unicode for a glyph name.)glyph_name_to_unicoder  s     r)   r*  Font.glyph_name_to_unicode   s    $T**r+   c                 "   U(       a<  [         R                  " U5      n[         R                  " U R                  XU5      u  pxU$ U(       a#  [         R                  " U R                  U5      nU$ [         R
                  " U R                  U5      nU$ )z0Check whether font has a glyph for this unicode.)r   r  r  r   r  r  )	r(   r%  rH  r  r
  r   rG  r  r  s	            r)   	has_glyphFont.has_glyph   sv    55h?D??		3X\]IC 
	 22499cB 
 //		3?
r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_font_is_boldr   r/   s    r)   r  Font.is_bold   s    $$dii00r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_font_is_italicr   r/   s    r)   r  Font.is_italic   s    &&		22r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_font_is_monospacedr   r/   s    r)   is_monospacedFont.is_monospaced   s    **DII66r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_font_is_serifr   r/   s    r)   r  Font.is_serif   s    %%tyy11r+   c                     gr`  )r   r   r  r   r   cppyygbl"mupdf_mfz_font_flags_ft_substituter  ll_fz_font_t3_procspdf_font_writing_supported)r(   r  r  r=  r  s        r)   is_writableFont.is_writable   s    r+   c                 F    [         R                  " U R                  5      nU$ r-   )r   fz_font_namer   rh  s     r)   r   	Font.name   s      +
r+   c                 x   U R                   n[        R                  " U5      nSn	[        U[        5      (       d  [        [        5      eU Hg  n
[        U
5      nU(       a  [        R                  " X{5      nUS:  a  UnO[        R                  " X{XH5      u  pU	[        R                  " WX5      -  n	Mi     X-  n	U	$ )z1Return length of unicode 'text' under a fontsize.r   )r   r   r  rB   r   r  MSG_BAD_TEXTr  r  r  r  )r(   r   r   rH  r  r  r   thisfontrG  r   r  r  r  r  s                 r)   text_lengthFont.text_length   s    9911(;$$$\**BBA228?!8#D!CCHQW^	%((s::B  		r+   c                     [        U5      $ )z$Return the glyph name for a unicode.)unicode_to_glyph_name)r(   r  s     r)   rM  Font.unicode_to_glyph_name   s    $R((r+   c                     [         R                  " U R                  5      nU Vs/ s H  o"R                  PM     nn[	        U5      n[        U5      nU$ s  snf )z5
Returns sorted list of valid unicodes of a fz_font.
)r   fz_enumerate_font_cmap2r   ucsr  sorted)r(   ucs_gidsrf  ucssucss_uniqueucss_unique_sorteds         r)   valid_codepointsFont.valid_codepoints   sM     00;'(x!x($i#K0!! )s   Ar#  )
NNNr   Nr  r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r1   r2   r3   r4   r[  r   r   rs  r  r5  r	  r  r  r  r   r%  r  r*  r-  r  r  r7  r  rB  r   rJ  rM  rW  r5   r.   r+   r)   r  r      sL    1f( 1 1 ( ( 6 6 2 2 ) )V	8	H 0 0+
 1 1 3 3 7 7 2 2  $  
&)"r+   r  c                        \ rS rSrS rS rSrg)r  i   c                 8    [        U 5      [        La  g SU l        g rZ  )r   r  r   r/   s    r)   r[  Graftmap.__del__!  s    DzX%r+   c                 `    [        U5      n[        R                  " U5      nX0l        SU l        g r`  )r   r   pdf_new_graft_mapr   r   )r(   r0  dstmap_s       r)   r   Graftmap.__init__!  s(    s#&&s+	r+   rq  N)r1   r2   r3   r4   r[  r   r5   r.   r+   r)   r  r     s    
r+   r  c                       \ rS rSrS rS rS rS rS rS r	S r
S	 r\S
 5       r\S 5       r\S 5       r\S\4S j5       r\S 5       r\S 5       r\S 5       rSS jrSS jrS r\S 5       rSrSrg)Linki!  c                 $    U R                  5         g r-   )r   r/   s    r)   r[  Link.__del__!  s    r+   c                 R    [        U[        R                  5      (       d   eXl        g r-   )rB   r   FzLinkr   )r(   r   s     r)   r   Link.__init__!  s    4....	r+   c                 H    [        U 5        S[        U R                  5      -   $ Nzlink on rn  r   r   r/   s    r)   r   Link.__repr__!      DC,,,r+   c                 H    [        U 5        S[        U R                  5      -   $ ri  rj  r/   s    r)   r   Link.__str__!  rl  r+   c                     [        USS9nUR                  (       d  g [        R                  " X2S5      nUR                  (       d  g [	        U5      nU$ Nr   r  )r   r   r   r  r  r(   r0  r  r`  link_objr  s         r)   _borderLink._border!  sE    sQ/~~))#Q7""H%r+   c                     [        USS9nUR                  (       d  g [        R                  " X2S5      nUR                  (       d  [	        [
        5      e[        U5      nU$ rp  )r   r   r   r  r   r  r  rq  s         r)   _colorsLink._colors'!  sM    sQ/~~))3a8""l++X&r+   c                      S U l         SU l        g rZ  )r   r   r/   s    r)   r   Link._erase1!  s    r+   c                     [        USS9nUR                  (       d  g [        R                  " XCS5      nUR                  (       d  g [	        XU5      nU$ rp  )r   r   r   r  r  )r(   r  r0  r  r`  rr  r  s          r)   
_setBorderLink._setBorder5!  sG    sQ/~~))#Q7""X6r+   c                 v    U R                  U R                  R                  R                  U R                  5      $ r-   )rs  r   r   r  r/   s    r)   r  Link.border?!  '    ||DKK..33TYY??r+   c                 v    U R                  U R                  R                  R                  U R                  5      $ r-   )rv  r   r   r  r/   s    r)   r  Link.colorsC!  r  r+   c                    [        U S5      (       a  U R                  c  [        S5      eU R                  R                  R                  (       d%  U R                  R                  R                  (       a  [        S5      eU R                  R                  nU R
                  (       d   U R                  R                  S5      (       a  SnOUR                  U R                  5      n[        XU5      $ )z Create link destination details.r   Norphaned object: parent is Noner  r#  )
r?   r   r   r   r  r  r  r7   r  linkDest)r(   r0  r  s      r)   r	  	Link.destG!  s     4""t{{':>??;;''4;;+=+=+J+J;<<kk  txx22377C""488,C3''r+   rs  c                     [        U 5        U R                  R                  nUR                  (       d  gUR                  U R                  S5      nUS   S:w  a  [        US   5      $ g)Nr   r  r   r  )rn  r   r  r  r  r8   )r(   r0  r  s      r)   r  
Link.flagsW!  sU    Dkk  zzTYY,Q46>qt9r+   c                 F   [        U 5        [        (       a   [        R                  " U R                  5      $ U R                  nUR
                  (       a  UR
                  R                  (       d  g[        [        R                  " UR
                  R                  5      5      $ )zFlag the link as external.F)
rn  r  r   Link_is_externalr   r   r  rw  r   fz_is_external_linkr(   	this_links     r)   r  Link.is_externalb!  sk     	D;))49955II	##9+?+?+C+CU..	0D0D0H0HIJJr+   c                    U R                   R                  (       d  g[        U 5         U R                   R                  5       nUR                  (       d  g[        U5      nU(       Ga  SUl        U R                  Ul	        XR                  R                  [        U5      '   U R                  S:  a  U R                  R                  5        Vs/ s H   o"S   [        R                  :X  d  M  US   PM"     nnU R                  R                  5        Vs/ s H   o"S   [        R                  :X  d  M  US   PM"     nnUR!                  U R                  5      nX5S-      Ul        XES-      Ul        U$ SUl        SUl        U$ s  snf s  snf )z
Next link.Nr   Tr   r   r`   )r   r   rn  r  r   	Link_nextr\  rb  r   r   rW  rX  r  rx  r   r  r  )r(   r  rb  
link_xrefslink_idsr  s         r)   r\  	Link.nextm!  s@    yy##D )).."C~~CjCKCJ.1JJ""2c7+yy1},0KK,C,C,Ef,Eq1QVQeQeIedad,E
f*.++*A*A*Cd*CQtuOcOcGcDAaD*Cd &&tyy1%Ag.!'* 
 
 gds   F +	F F0	Fc                     [        U 5        U R                  b  U R                  R                  (       d  [        S5      e[	        U R                  R                  5       5      n[        U5      nU$ )zRectangle ('hot area').z"self.this.m_internal not available)rn  r   r   rk   ro  r   r*  rh  s     r)   r   	Link.rect!  sS     	D 99DII$8$8ABBtyy~~/03i
r+   Nc                     [        U5      [        La  X$US.nU R                  XR                  R                  R                  U R
                  5      $ )N)r  r  r  )r   r9   r{  r   r   r  )r(   r  r  r  r  s        r)   r  Link.set_border!  s=    <t#$GFv{{'9'9'>'>		JJr+   c                    [        U 5        U R                  R                  n[        U5      [        La  X2S.nUR	                  S5      nUR	                  S5      nUb  [        S5        U/ S4;   a  UR                  U R                  SS5        g[        US	5      (       a  [        U5      /n[        U5        [        U5      S
;   d   eS[        U5       S3nUR                  U R                  SU5        g)zSet border colors.r  r   r  Nz!warning: links have no fill colorr.   r  r  r  r  r  r  )rn  r   r   r9   r<   rv   r  r  r?   r  r  r;   r   )r(   r  r  r   r0  r  s         r)   r  Link.set_colors!  s    Dkk  <t#"5Fzz&!H%78b"XTYYT26;''Fm_F66{i'''	&!"!$C+r+   c                    [        U 5        U R                  R                  nUR                  (       d  [        S5      e[	        U5      [
        La  [        S5      eUR                  U R                  S[        U5      5        g )Nr~  zbad 'flags' valuer  )	rn  r   r  r   r   r8   r  r  r   )r(   r  r0  s      r)   r  Link.set_flags!  s`    Dkk  zz[))E{c!011CU4r+   c                     [         (       a   [        R                  " U R                  5      $ U R                  nUR                  (       a  UR                  R
                  $ S$ )zUri string.r`   )r  r   link_urir   r   r  r  s     r)   r  Link.uri!  sD     ;>>$)),,II	+4+?+?y##''GRGr+   r  rm  )Nr   NNrp  )r1   r2   r3   r4   r[  r   r   r   rs  rv  r   r{  rs  r  r  r	  r8   r  r  r\  r   r  r  r  r  r   r5   r.   r+   r)   rb  rb  !  s    -- @ @ @ @ ( ( S   K K  6 	 	K
,( H H Dr+   rb  c                       \ rS rSrS rS rS rS rS rSSSSSSS.S	 jr	S
 r
S rS rS rS rS rS rS rS rS rS rSS jr\S 5       rS rS rS rS r\
r\r\rSrg)r~  i!  c           	      p    [         R                  " [        U  Vs/ s H  oU-  PM	     sn5      5      $ s  snf r-   mathsqrtsumr(   r  s     r)   __abs__Matrix.__abs__!  *    yy404ac401220   3c           
         [        US5      (       a^  [        U R                  U-   U R                  U-   U R                  U-   U R
                  U-   U R                  U-   U R                  U-   5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -   U R                  US   -   U R                  US   -   U R
                  US   -   U R                  US   -   U R                  US	   -   5      $ 
Nr  r  Matrix: bad seq lenr   r   r   r   ro  r   
r?   r~  r    r  r  rA  rg  r  r;   r   r  s     r)   __add__Matrix.__add__!      1k""$&&1*dffqj$&&1*&&1*dffqj$&&1*> >q6Q;233dffqtmTVVad]DFFQqTM&&1Q4-!A$1G 	Gr+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r   r  r/   s    r)   __bool__Matrix.__bool__!  )    IT//a/00/00r+   c                 b    [        US5      (       d  g[        U5      S:H  =(       a	    X-
  (       + $ )Nr  Fr  r?   r;   )r(   r  s     r)   __eq__Matrix.__eq__!  s*    sI&&3x1}1dj!11r+   c                     U R                   U R                  U R                  U R                  U R                  U R
                  4U   $ r-   r    r  r  rA  rg  r  r  s     r)   r  Matrix.__getitem__!  s2    ?BBr+   Nr  c                @   U(       d,  S=U l         =U l        =U l        =U l        =U l        U l        GO[        U5      S:  a  [        S5      e[        U5      S:X  a7  [        [        U5      u  U l         U l        U l        U l        U l        U l        GOT[        U5      S:X  Gan  [        US   [        R                  5      (       az  US   R                   U l         US   R                  U l        US   R                  U l        US   R                  U l        US   R                  U l        US   R
                  U l        GO[        US   S5      (       a  [        R                  " US   5      n[!        [        R"                  " U5      S5      n	[!        [        R$                  " U5      S5      n
U	=U l         U l        Xl        U
* U l        S=U l        U l        GO[        [        US   5      u  U l         U l        U l        U l        U l        U l        O[        U5      S:X  d  [        U5      S	:X  aO  US   S:X  aF  [        US   5      SS[        US   5      SS4u  U l         U l        U l        U l        U l        U l        Oi[        U5      S	:X  aO  US   S:X  aF  S
[        US   5      [        US   5      S
SS4u  U l         U l        U l        U l        U l        U l        O[        S5      eUb  Xl         Ub  X l        Ub  X0l        Ub  X@l        Ub  XPl        Ub  X`l        gg)aZ  
Matrix() - all zeros
Matrix(a, b, c, d, e, f)
Matrix(zoom-x, zoom-y) - zoom
Matrix(shear-x, shear-y, 1) - shear
Matrix(degree) - rotate
Matrix(Matrix) - new copy
Matrix(sequence) - from 'sequence'
Matrix(mupdf.FzMatrix) - from MuPDF class wrapper for fz_matrix.

Explicit keyword args a, b, c, d, e, f override any earlier settings if
not None.
r  r  r  r   r   r  r   r   r   r  zMatrix: bad argsN)r    r  r  rA  rg  r  r;   r   r  r  rB   r   r{  r?   r  radiansroundcossin)r(   r    r  r  rA  rg  r  r  thetac_s_s              r)   r   Matrix.__init__!  s    BEEDFETVEdfEtvEY]233Y!^=@=M:DFDFDFDFDFDFY!^$q'5>>22aaaaaaa+..T!W-488E?A.488E?A."$$"%%ADUDQRGAT>Y!^s4yA~$q'Q,=B47^S%Q.#s>3:DFDFDFDFDFDFY!^Q1=@d1gd1gS#>>:DFDFDFDFDFDF /00 =QF=QF=QF=QF=QF=QF=r+   c                 <    [        5       nUR                  U 5        U$ )zCalculate inverted matrix.)r~  invert)r(   m1s     r)   
__invert__Matrix.__invert__"  s    X
		$	r+   c                     g)Nr  r.   r/   s    r)   r  Matrix.__len__"      r+   c           	         [        US5      (       a^  [        U R                  U-  U R                  U-  U R                  U-  U R
                  U-  U R                  U-  U R                  U-  5      $ [        SS5      nUR                  X5      $ )Nr  r   )	r?   r~  r    r  r  rA  rg  r  concat)r(   r  r  s      r)   __mul__Matrix.__mul__"  ss    1k""$&&1*dffqj$&&1*&&1*dffqj$&&1*> >Aa[yy!!r+   c                     [        U R                  * U R                  * U R                  * U R                  * U R
                  * U R                  * 5      $ r-   )r~  r    r  r  rA  rg  r  r/   s    r)   __neg__Matrix.__neg__$"  s;    tvvgw$&&466'DFF7KKr+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r/   s    r)   __nonzero__Matrix.__nonzero__'"  r  r+   c                     [        U 5      $ r-   )r~  r/   s    r)   __pos__Matrix.__pos__*"  s    d|r+   c                 0    S[        [        U 5      5      -   $ )Nr~  r   r   r/   s    r)   r   Matrix.__repr__-"  s    #eDk***r+   c                     [        U5      nUS:X  a  X l        g US:X  a  X l        g US:X  a  X l        g US:X  a  X l        g US:X  a  X l        g US:X  a  X l        g [        S5      e)Nr   r   r   r   ro  r   index out of range)r  r    r  r  rA  rg  r  r  r(   rf  rJ   s      r)   __setitem__Matrix.__setitem__0"  s    !H!VaV 	 !VaV 	 !VaV 	 !VaV
 		 !VaV 	 !VaV 	 122r+   c           
         [        US5      (       a^  [        U R                  U-
  U R                  U-
  U R                  U-
  U R
                  U-
  U R                  U-
  U R                  U-
  5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -
  U R                  US   -
  U R                  US   -
  U R
                  US   -
  U R                  US   -
  U R                  US	   -
  5      $ r  r  r  s     r)   __sub__Matrix.__sub__<"  r  r+   c           	      ~   [        US5      (       ap  [        U R                  S-  U-  U R                  S-  U-  U R                  S-  U-  U R
                  S-  U-  U R                  S-  U-  U R                  S-  U-  5      $ [        U5      S   nU(       d  [        S5      e[        SS5      nUR                  X5      $ Nr  r  r   zmatrix not invertible)r?   r~  r    r  r  rA  rg  r  util_invert_matrixZeroDivisionErrorr  )r(   r  r  m2s       r)   __truediv__Matrix.__truediv__E"  s    1k""$&&2+a-"QA&&2+a-"QAG G"1%#$;<<Aa[yy""r+   c                     [        U5      [        U5      s=:X  a  S:X  d  O  [        S5      e[        X5      u  U l        U l        U l        U l        U l        U l        U $ )z.Multiply two matrices and replace current one.r  r  )	r;   r   util_concat_matrixr    r  r  rA  rg  r  )r(   onetwos      r)   r  Matrix.concatO"  sK    3x3s8(q(2339KC9U6r+   c                     Uc  [        U 5      nO[        U5      nUS   S:X  a  gUS   u  U l        U l        U l        U l        U l        U l        g)zmCalculate the inverted matrix. Return 0 if successful and replace
current one. Else return 1 and do nothing.
r   r   )r  r    r  r  rA  rg  r  )r(   r1  r^  s      r)   r  Matrix.invertV"  sP     ;$T*C$S)Cq6Q;9<Q6r+   c                    [        U R                  5      [        :  =(       a    [        U R                  5      [        :  =(       d?    [        U R                  5      [        :  =(       a    [        U R
                  5      [        :  $ )z,True if rectangles are mapped to rectangles.)r%  r  EPSILONr  r    rA  r/   s    r)   is_rectilinearMatrix.is_rectilinearc"  sR     DFFg%?#dff+*? >[7"<s466{W'<	>r+   c                 V   [        U5      nUS:  a  US-  oS:  a  M  US:  a  US-  oS:  a  M  [        SU-
  5      [        :  a   U $ [        SU-
  5      [        :  aL  U R                  nU R                  nU R
                  U l        U R                  U l        U* U l        U* U l        U $ [        SU-
  5      [        :  aJ  U R                  * U l        U R                  * U l        U R
                  * U l        U R                  * U l        U $ [        SU-
  5      [        :  aJ  U R                  nU R                  nU R
                  * U l        U R                  * U l        X l        X0l        U $ [        R                  " U5      n[        R                  " U5      n[        R                  " U5      nU R                  nU R                  nXb-  XPR
                  -  -   U l        Xc-  XPR                  -  -   U l        U* U-  X`R
                  -  -   U l        U* U-  X`R                  -  -   U l        U $ )z2Calculate pre rotation and replace current matrix.r   r  g     V@g     f@g     p@)r  r%  r  r    r  r  rA  r  r  r  r  )r(   r  r    r  radr  r  s          r)   	prerotateMatrix.prerotatei"  s   eai#aislESLEslq5y>G#F C (AAVVDFVVDFRDFRDF6 3 ')ffWDFffWDFffWDFffWDF* ' ')AAffWDFffWDFFF  ,,u%CAAAAUQZ'DFUQZ'DFBFQZ'DFBFQZ'DFr+   c                     [        U5      n[        U5      nU =R                  U-  sl        U =R                  U-  sl        U =R                  U-  sl        U =R                  U-  sl        U $ )z1Calculate pre scaling and replace current matrix.r  r    r  r  rA  )r(   sxsys      r)   prescaleMatrix.prescale"  sM    2Y2Y""""r+   c                 @   [        U5      n[        U5      nU R                  U R                  pCU =R                  X R                  -  -  sl        U =R                  X R                  -  -  sl        U =R                  X-  -  sl        U =R                  X-  -  sl        U $ )z2Calculate pre shearing and replace current matrix.r  )r(   r  rJ   r    r  s        r)   preshearMatrix.preshear"  sn    !H!Hvvtvv1!ff*!ff*!%!%r+   c                     [        U5      n[        U5      nU =R                  XR                  -  X R                  -  -   -  sl        U =R                  XR
                  -  X R                  -  -   -  sl        U $ )z5Calculate pre translation and replace current matrix.)r  rg  r    r  r  r  rA  )r(   txtys      r)   pretranslateMatrix.pretranslate"  sW    2Y2Y"vv+VV++"vv+VV++r+   r-   ) r1   r2   r3   r4   r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r  r  rs  r  r  r  r  r  __inv____div__normr5   r.   r+   r)   r~  r~  !  s    3G12
C !% 5'n"L1+
G# > >
)V	 GGDr+   r~  c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
IdentityMatrixi"  z"Identity matrix [1, 0, 0, 1, 0, 0]c                     [        S5      $ )N)r   r   r   r   r   r   )hashr/   s    r)   __hash__IdentityMatrix.__hash__"  s    M""r+   c                 2    [         R                  U SS5        g )Nr  )r~  r   r/   s    r)   r   IdentityMatrix.__init__"  s    c3'r+   c                     g)Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r.   r/   s    r)   r   IdentityMatrix.__repr__"  s    =r+   c                 x    US;   a  SU R                   U'   g US;   a  SU R                   U'   g X R                   U'   g )Nadr  bcefr  )r  )r(   r   r   s      r)   __setattr__IdentityMatrix.__setattr__"  s8    4<"%DMM$V^"%DMM$"'MM$r+   c                      [        S5      e)NzIdentity is readonly)NotImplementedError)r  s    r)   	checkargsIdentityMatrix.checkargs"  s    !"899r+   r.   N)r1   r2   r3   r4   __doc__r  r   r   r  r  r5   r.   r+   r)   r  r  "  s    ,#(>(:r+   r  c                   "    \ rS rSrSrSS jrSrg)r  i"  z#link or outline destination detailsNc           	      
  ^  UR                   nU(       + nST l        ST l        ST l        ST l        ST l        [        T l        [        SS5      T l	        [        5       T l        ST l        UR                  T l        [        SS5      T l        UR                  T l        U 4S jnS nU(       aN  T R                  R!                  S5      (       d.  SUS   S-    S	[#        US   5       S
[#        US   5       3T l        UR                   (       a  ST l        [$        T l        T R                  (       d  ST l        [        T l        U(       Ga=  T R                  (       Ga+  T R                  R'                  SS5      T l        T R                  R!                  S5      (       Ga  [(        T l        [*        R,                  " ST R                  5      nU(       a  [/        UR1                  S5      5      S-
  T l        [        [3        UR1                  S5      5      [3        UR1                  S5      5      5      T l	        T R                  [4        -  [6        -  T l        GO2[*        R,                  " ST R                  5      nU(       a#  [/        UR1                  S5      5      S-
  T l        O[8        T l        [*        R,                  " ST R                  5      nU(       d   eU(       an  U(       ag  U" UR1                  S5      5      n	UR;                  5       R=                  U	5      T l        T R                  c  [        5       T l        U	T R                  S'   O=U" T R                  SS  5      T l        O"[8        T l        U" T R                  5      T l        UR                   (       GaM  T R                  (       d  GO:T R                  R!                  S5      (       a  T R                  SS  T l        T R                  R!                  S5      (       a  T R                  SS  T l        ST l        ST l        [>        T l        T R                  RA                  S5      n
[C        U
5      S:X  aY  U
S   R!                  S5      (       a@  [D        T l        U
S   T l        [/        U
S   RA                  S5      S   SS  5      S-
  T l        O5ST R                  ;   a  ST l        [$        T l        OST l        [>        T l        [G        T R                  [        5      (       d   eg )Nr`   r   Fc                    > TR                   SS  R                  S5      n[        5       nU H,  nUR                  S5      nUS:  a  X4S-   S  X#S U '   M(  S X#'   M.     U$ )Nr   &r   r   )r  r:   r9   r   )r  rF   rK   rG   eqr(   s        r)   uri_to_dict&linkDest.__init__.<locals>.uri_to_dict"  se    HHQRL&&s+E&CYYs^7%)Q$%[CSb	N $CI  Jr+   c           	          U R                  SS5      nUR                  S5      nUS   nUSS  H%  nUSS nU[        [        USS	95      -  nX#SS -  nM'     U$ )
z'Unescape '%AB' substrings to chr(0xAB).z%%z%25%r   r   Nr   r$  )base)r  r:   r%  r8   )r   r:   rg  rG   pieces        r)   unescape#linkDest.__init__.<locals>.unescape"  so    LLu-EKK$EAhGab	Ra3s5r2338# " Nr+   r#  z#page=r   z&zoom=0,r   r   r  z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   ro  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r   z//zpage=r#  rc   T)$r  r	  	file_specr  is_mapis_urir
  r  r"  ltr9   r  
new_windowr   r  r  r7   r   r  r  r  rer  r8   groupr  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr
  r<   r  r:   r;   r  rB   )r(   r  rlinkr   isExtisIntr%  r+  r  r  ftabs   `          r)   r   linkDest.__init__"  s   		
	1+V
HH	1+77				 ,,S11a1~Xia6I5J!IV[\]V^L_K`aDH??DI DIxxDI!DITXXXxx''Y?DHxx""3''%	HHVX\X`X`a #AGGAJ! 3DI#E1771:$7qwwqz9JKDG!%.?!?BS!SDJ!3TXX>A$'
Oa$7	$.	HH%7B'x#$,QWWQZ$8E)1)?)?)A)E)Ee)LDJ#zz1 .2V
6;DJJ{3)4TXXab\)BDJ&	(2
???88$$W--!%!">>,,T22%)^^AB%7DN#'	~~++C0t9>Aw))'22$.	)-a$'Qc(:1(=ab(A$BQ$F	"$	"'	$**d++++r+   )r	  r.  r  r/  r0  r  r1  r  r2  r   r  r  r-   r1   r2   r3   r4   r  r   r5   r.   r+   r)   r  r  "  s    -b,r+   r  c                   n    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 r\S 5       rS rS rSS jrSrg)rY  i7#  z.
Class describing a PDF form field ("widget")
c                    S U l         SU l        SU l        S U l        S U l        S U l        S U l        S U l        S U l        SU l	        SU l
        SU l        S U l        S U l        S U l        S U l        SU l        SU l        SU l        SU l        SU l        SU l        S U l        S U l        S U l        S U l        S U l        S U l        S U l        S U l        SU l        g )NrM
  r   r   r   r   Helvr`   )r  border_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_stringr^  button_caption	is_signedr   	text_fonttext_fontsizetext_maxlentext_format_text_dar  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r  r/   s    r)   r   Widget.__init__<#  s     !!!%"#!!! 		r+   c                 <    SU R                    SU R                   S3$ )NzWidget:(field_type=z script=r  )rM  r  r/   s    r)   r   Widget.__repr__a#  s%     %T%;%;$<HT[[MQRSSr+   c                     U R                   (       d  SU l         gSnU H7  nU R                   R                  5       UR                  5       :X  d  M1  X l           g   SU l         g)zAEnsure text_font is from our list and correctly spelled.
        rA  N)CourTiRorA  ZaDb)rP  r  )r(   valid_fontsr  s      r)   _adjust_fontWidget._adjust_fontg#  sS     ~~#DN6A~~##%2!"   r+   c           	         U R                   [        SS5      ;  a  [        S5      eU R                   [        R                  :X  a  U R
                  S;  a  [        U S5      (       a  U R                  R                  nUR                  U R                  S5      u  p#US:X  ah  [        [        [        USS R                  S	S
5      R                  5       5      5      nU H'  nXPR                  :w  d  M  UR                  USS5        M)     ggggg)z Any widget type checks.
        r   r   zbad field type)FOffr   zParent/Kidsr	  r  rH  r`   ASz/OffN)rL  rR  r   r   PDF_WIDGET_TYPE_RADIOBUTTONrI  r?   r   r  r  r   r  r8   r  r:   r  )r(   r0  	kids_type
kids_valuer  r  s         r)   _checkerWidget._checkeru#  s     ??%1+--.. ??e???DDTDT\jDjovw{  ~F  pG  pG ++$$C$'$4$4TYY$N!IG#c#z!B'7'?'?b'I'O'O'QRS!Dyy(((tV< " $ pGDj?r+   c                    U R                   (       d  gSnSnSnU R                   R                  5       n[        U5       H  u  pVUS:X  a.  XES-
     SS n[        XES-
     5      nS=XE'   =XES-
  '   XES-
  '   M9  US	:X  a  [        XES-
     5      /nS=XE'   XES-
  '   M]  US
:X  d  Me  XES-
  U  Vs/ s H  n[        U5      PM     nnS=XE'   =XES-
  '   =XES-
  '   XES-
  '   M     Xl        X l        X0l        SU l         gs  snf )zExtract font name, size and color from default appearance string (/DA object).

Equivalent to 'pdf_parse_default_appearance' function in MuPDF's 'pdf-annot.c'.
NrA  r   r@  Tfr   r   r`   grgr   )rT  r:   rW  r  rP  rQ  r   )r(   r  r0  re  datrf  rG   r  s           r)   r  Widget._parse_da#  s)   
 }}mm!!# ~GAt|q5z!"~ca%j)/111qSC!Hs{ca%j)+$&&qSt|),U16AuQx6:<<<qS<C!HsQ3x & " 7s   ,C:c                    U R                   R                  (       d  U R                   R                  (       a  [        S5      eU R                  (       d  [        S5      eU R
                  S:X  a  SU l        [        U R                  5        [        U R                  5        U R                  (       d  SU l	        [        U R                  5        U R                  (       d  SU l
        U R                  (       d  SU l        U R                  R                  5       SS U l        U R                  [        R                   [        R"                  [        R$                  4;   nU R&                  (       d  SU l        O'[)        U R&                  5      [*        La  [        S5      eU(       d  U R,                  (       d  SU l        O'[)        U R,                  5      [*        La  [        S	5      eU(       d  U R.                  (       d  SU l        O'[)        U R.                  5      [*        La  [        S
5      eU(       d  U R0                  (       d  SU l        O'[)        U R0                  5      [*        La  [        S5      eU(       d  U R2                  (       d  SU l        O'[)        U R2                  5      [*        La  [        S5      eU(       d  U R4                  (       d  SU l        O'[)        U R4                  5      [*        La  [        S5      eU(       d  U R6                  (       d  SU l        O'[)        U R6                  5      [*        La  [        S5      eU R9                  5         g)z$Validate the class entries.
        zbad rectzfield name missingUnnamedNr@  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r   is_infiniteis_emptyr   rG  rH  r  r  r^  r   rC  rQ  rB  rr
  rL  r   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXrh  r  r   r   rX  rW  rV  rU  rY  rZ  rk  )r(   btn_types     r)   	_validateWidget._validate#  sZ    II!!yy!!Z((122y(#D4$$%4??#'DO4??#   !D!!!"D --335a: ??,,..11' 
 {{DK$++c)>?? 4++#D$""#3.CDD4--!%D$$$%S0EFF4--!%D$$$%S0EFF4--!%D$$$%S0EFF4++#D$""#3.CDD4,, $D$##$C/DEEr+   c                 d   U R                   (       d  gU R                  R                  nU(       d   e[        U5      n[        R                  " X R                   5      n[        R
                  " U[        S5      5      nUR                  5       (       d  gUR                  [        S5      U R                  5        UR                  [        S5      5      nUR                  5       (       d  [        S5        g[        UR                  5       5       H  nUR                  U5      nUR                  5       (       d  M+  UR                  5       nXR                   :X  a  ML  UR                  [        S5      5      n	U	R!                  5       S:X  d  M|  UR                  [        S5      U R                  5        M     g)	zPropagate the field flags.

If this widget has a "/Parent", set its field flags and that of all
its /Kids widgets to the value of the current widget.
Only possible for widgets existing in the PDF.

Returns True or False.
Fr  Ffr1  z0warning: malformed PDF, Parent has no Kids arrayr  rY  T)r  r   r   r   r;  r
  r  r  rO  rJ  r:  rv   rR  r  r  r  r  )
r(   r0  r`  
pdf_widgetr  r3  rf  r4  r  r  s
             r)   _sync_flagsWidget._sync_flags#  sR    yykk  
ss#**3		:
##J0BC!!## 	0@0@A ""8F#34  ""FGt))+,A$$Q'C??$$>>#Dyy &&x	':;G&&(H4  $1A1AB - r+   c                 8   U R                   S;  a  g[        U S5      (       a  U R                  R                  nOgU R                  nSSS.nUR	                  US5      nUS   S:X  aM  / nUS   S	S
 nUR                  S5      SS nU H%  nUR                  UR                  5       S   5        M'     XSS'   US   S:X  av  / n[        US   R                  S5      S   5      nUR                  U5      nUR                  S5      SS nU H%  nUR                  UR                  5       S   5        M'     XSS'   UR	                  US5      n	U	S   S:X  aM  / n
U	S   S	S
 n	U	R                  S5      SS nU H%  nU
R                  UR                  5       S   5        M'     XS'   U	S   S:X  av  / n
[        U	S   R                  S5      S   5      nUR                  U5      n	U	R                  S5      SS nU H%  nU
R                  UR                  5       S   5        M'     XS'   U$ )zReturn the on/off state names for button widgets.

A button may have 'normal' or 'pressed down' appearances. While the 'Off'
state is usually called like this, the 'On' state is often given a name
relating to the functional context.
r   r   Nr   )r  r  zAP/Nr   r9   r   r   r  rQ	  r  r  r   zAP/Dr  )	rL  r?   r   r  r  r:   ro   r8   rJ  )r(   r0  r  statesAPNnstatesapntrb  nxrefAPDdstatesapdtdxrefs                r)   button_statesWidget.button_states$  s    ??&(4""++$$Cyy $/tV,q6VGa&2,C99S>!"%Dqwwy|, &8q6VGAS)!,-E//%(C99S>!"%Dqwwy|, &8tV,q6VGa&2,C99S>!"%Dqwwy|, $6Nq6VGAS)!,-E//%(C99S>!"%Dqwwy|, $6Nr+   c                 .    U R                   R                  $ r-   )_annotr\  r/   s    r)   r\  Widget.nextN$  s    {{r+   c                     U R                   S;  a  gU R                  5       nUc
  [        5       nUR                  5        H  nX    H  nUS:w  d  M  Us  s  $    M     [	        S5        g)ae  Return the "On" value for button widgets.

This is useful for radio buttons mainly. Checkboxes will always return
"Yes". Radio buttons will return the string that is unequal to "Off"
as returned by method button_states().
If the radio button is new / being created, it does not yet have an
"On" value. In this case, a warning is shown and True is returned.
r  Nrf  z(warning: radio button has no 'On' value.T)rL  r  r9   ry  rv   )r(   bstater  rJ   s       r)   on_stateWidget.on_stateR$  sc     ??&(##%>VFAY:H   	:;r+   c                 B    [         R                  U R                  5        g)z.Reset the field value to its default.
        N)r  _reset_widgetr  r/   s    r)   rP
  Widget.resetg$  s     	DKK(r+   c                 |   U R                  5         U R                  5         SU l        [        U R                  5      S:X  a  SU R                  -   nOQ[        U R                  5      S:X  a  SU R                  -   nO([        U R                  5      S:X  a  SU R                  -   nWR
                  " U R                  U R                  U R                  S.6U l        U R                  (       a  [        U R                  5        [        R                  U R                  U 5        SU l        U(       a  U R                  5         g	g	)
z!Reflect Python object in the PDF.r`   r   !{:g} {:g} {:g} rg /{f:s} {s:g} Tfr   z{:g} g /{f:s} {s:g} Tfro  z%{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tfr  r  N)rz  rc  rT  r;   r   r  rP  rQ  rX  util_ensure_widget_calcr  r  _save_widgetr  )r(   
sync_flagsr   s      r)   rG  Widget.updatel$  s     !Q&5EC!Q&*T]]:C!Q&9DMMIC

DOOt~~&*&8&8: #DKK0 	4;;- r+   )rT  r  rD  rB  rC  rN  rE  rK  rJ  rH  rG  rL  rM  rI  r^  rO  rF  r   r  rY  rX  rW  rZ  rV  rU  r   rP  rQ  rS  rR  r  Nrt  )r1   r2   r3   r4   r  r   r   rc  rk  r  rz  r  r  rs  r\  r  rP
  rG  r5   r.   r+   r)   rY  rY  7#  sW    #J8=*>EN+Z/b    *)
r+   rY  )_extrac                       \ rS rSrS r\S 5       rS r\S 5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       rS/rSrg)r  i$  c                     Xl         g r-   r#  r(   r:  s     r)   r   Outline.__init__$  s    	r+   c                     [        U SS5      $ )zoutline destination detailsNr  r/   s    r)   r	  Outline.dest$  s     dD))r+   c                     [        U SU5      $ )zW
Like `dest` property but uses `document` to resolve destinations for
kind=LINK_NAMED.
Nr  )r(   r   s     r)   destinationOutline.destination$  s    
 dH--r+   c                 t    U R                   nUR                  5       nUR                  (       d  g [        U5      $ r-   )r   r  r   r  )r(   r:  down_ols      r)   r  Outline.down$  -    YY'')!!wr+   c                     [         (       a   [        R                  " U R                  5      $ U R                  nUR                  (       d  gUR                  R
                  nUc  g[        R                  " U5      $ rZ  )r  r  Outline_is_externalr   r   r  r   r  )r(   r:  r  s      r)   r  Outline.is_external$  sY    ; --tyy99YY}}mm;((--r+   c                 D     U R                   R                  R                  $ r-   )r   r   r@  r/   s    r)   r@  Outline.is_open$  s    99''///r+   c                 t    U R                   nUR                  5       nUR                  (       d  g [        U5      $ r-   )r   r\  r   r  )r(   r:  next_ols      r)   r\  Outline.next$  r  r+   c                 X     U R                   R                  R                  R                  $ r-   )r   r   r   r/   s    r)   r   Outline.page$  s!    99'',,111r+   c                 B    U R                   R                  R                  $ r-   )r   r   r  r/   s    r)   r  Outline.title$  s    yy##)))r+   c                 j    U R                   nUR                  (       d  g UR                  R                  $ r-   )r   r   r  r  s     r)   r  Outline.uri$  s%    YY}}}}   r+   c                 B    U R                   R                  R                  $ r-   )r   r   rb  r/   s    r)   rb  	Outline.x$      yy##%%%r+   c                 B    U R                   R                  R                  $ r-   )r   r   rc  r/   s    r)   rc  	Outline.y$  r  r+   r   r#  N)r1   r2   r3   r4   r   rs  r	  r  r  r  r@  r\  r   r  r  rb  rc  r  r5   r.   r+   r)   r  r  $  s     * *.     . . # #
     % %
 * * ! ! & & & & 	Ir+   r  c                 |  ^ [         R                  " 5       nXl        Xl        X&l        X6l        U(       a  T(       a"  [        T[         R                  5      (       d   eO[         R                  " 5       m " U4S jS[         R                  5      nU" 5       nUR                  UR                  5       5        Xl        U$ )z,
Returns a mupdf.PdfFilterOptions instance.
c                   2   >^  \ rS rSrU U4S jrS rSrU =r$ )'_make_PdfFilterOptions.<locals>.Factoryi$  c                 P   > [         TU ]  5         U R                  5         TU l        g r-   )r   r   use_virtual_filtersopts)r(   	__class__r  s    r)   r   0_make_PdfFilterOptions.<locals>.Factory.__init__ %  s!     "'')"
r+   c           	      j     [        R                  " UUUUUU R                  R                  5       5      $ r-   )r'   r  r  r   ll_pdf_new_sanitize_filter)r(   ctxr0  chainstruct_parents	transformr   s          r)   filter._make_PdfFilterOptions.<locals>.Factory.filter%  s9     77&!

++- r+   )r  )r1   r2   r3   r4   r   r  r5   __classcell__)r  r  s   @r)   Factoryr  $  s    # r+   r  )r   PdfFilterOptionsr  r  r  	no_updaterB   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryr  _factory)	r  r  r  r  r  r  r  r  factorys	        `   r)   r  r  $  s     $$&GO+M! eU%C%CDDDD224E	e-- 	2 )G,,./"Nr+   c            /       &   \ rS rSrS rS rS rS rSS jrSSSSSS	SS\	R                  S
S	S	SS4S jrS rS rS rSS jrS rSoS jrSS jrS rS rS rS rS rS rS\S\4S jrS rSS jr   SS  jrS! rS" r SS# jr!S$ r"SS& jr#S' r$SS( jr%S) r&S* r'SS+ jr(S,\)S\*4S- jr+S.\,S\*4S/ jr-   SS,\)S0\.S1\/S2\S3\S4\S\*4S5 jjr0SSSSSS	SS\	R                  S
S	S	SSS6.S.\,S7\/S8\1S9\S:\2S;\2S<\2S=\1S>\2S?\2S@\3SA\1SB\3SC\3S\*4SD jjr4  SS\*4SE jjr5SF\6S\*4SG jr7SH\)SI\)S\*4SJ jr8SK\6S\*4SL jr9SK\6S\*4SM jr:S.\,S\*4SN jr;       SS7\S9\S8\1SB\3SO\2S:\2SP\<S\*4SQ jjr=    SS\*4SR jjr>SoS.\,S\*4SS jjr?SS\*4ST jjr@GS S,\)S7\/S4\/S\*4SU jjrASS\*4SV jjrBSW\CS\*4SX jrDSY rESZ rFSS[ jrG   GSS\S S]\3S^\3S7\3S\<4
S_ jjrHGSS` jrISa rJSb rK\LSc 5       rM\LSd 5       rNSe rOGSSf jrP\LSg 5       rQ\LSh 5       rRSi rSS\S Sj\34Sk jrTSl rUS\S SW\CS\C4Sm jrV\LS\W4Sn j5       rX            GSS\S SH\)SI\)Sp\)Sq\)Sr\2SO\2S>\Ss\1St\Su\<Sv\3Sw\3Sx\<Sy\1Sz\1S\3S\Y4$S{ jjrZ           GSS\S S|\)S}\1Sr\2SO\2St\2S>\Ss\1Sv\3Sw\3Sx\<Sy\1Sz\1S\3S\Y4S~ jjr[            GSS\S SH\)SI\)Sp\)Sr\2SO\2S>\Ss\1St\2Su\<Sv\3Sw\3Sx\<Sy\1Sz\1S\3S\Y4"S jjr\          GSS\S SH\)SI\)Sr\2S>\Ss\1Sv\3Sw\3Sx\<St\2Sy\1Sz\1S\Y4S jjr]           GSS\S S.\^R                  \,\`4   Sr\2SO\2S>\St\2Ss\1Sv\3Sw\3Sx\<Sy\1Sz\1S\3S\Y4S jjra            GSS\S SK\6Sr\2SO\2S>\Ss\1St\2Sv\3Sw\3Sx\<Su\<Sy\1Sz\1S\3S\Y4S jjrb           GSS\S S\`Sr\2SO\2S>\Ss\1Sv\3Sw\3St\2Sx\<Sy\1Sz\1S\3S\Y4S jjrc            GSS\S S.\,Sr\2SO\2S>\Ss\1Sv\3Sw\3St\2Sx\<Sy\1Sz\1S\3S\Y4S jjrd             GS	S\S S|\)S,\)S\1Sr\2SO\2S>\S\<St\2Ss\1Su\<Sv\3Sw\3Sx\<Sy\1Sz\1S\3S\Y4$S jjre           GS
S\S SH\)SI\)S\1Sr\2S>\Ss\1Sv\3Sw\3Sx\<St\2Sy\1Sz\1S\3S\Y4S jjrf           GS
S\S SH\)SI\)S\1Sr\2S>\Ss\1Sv\3Sw\3Sx\<St\2Sy\1Sz\1S\3S\Y4S jjrgGSS jrh\LS 5       ri\LS 5       rj\LS 5       rkSS jrlSS jrmS rnGSS jroGSS\<S\64S jjrp  GSS\S S\<S\<S\64S jjrqGSS\S S\64S jjrrS rsS\S S\64S jrt\uSSSSS%S.S\S S\vS\wS\,S\<S\<SS4S jjrxS ry  GSS\1S\1S\<S\64S jjrzGSS jr{SoS jr|GSS jr}S\64S jr~GSS jr SS\\S.\,S\/4S jjrS rS rS rS rS rSS\,S\3SS4S jjrS rS r  GSS jrSS	SS	S	S
S%S%SS.	S\4S jjrSSS	S%SS	S%SS	SS	S	S.S jrSS\S S\S\<SS4S jjrSSSSS	S	SSSS
S	S	SS%S
S
S	S.S\S S,\)S7\^R                  \/\64   S8\1S\S9\/S\S\3S\3Sr\2SO\2S=\1S\1S\3SC\3St\2Sx\<Sy\1Sz\1S\34(S jjrSSS	S	SSSSS
S	S	S	S
SSS%S
S
S	S.S\S S.\,S\^R                  \/\64   S9\/S\S\3S\3S8\1S\Sr\2SO\2S\3SB\3SC\3S\3S\1S=\1St\2Sx\<Sy\1Sz\1S\3S\14.S jjr\LS 5       r\LS 5       rSS jrS\^R                  \/\34   S\*4S jrS rS r\LS 5       r\LS 5       rS rS rS rSSSS.S\S Sj\34S jjr\LS 5       r\LS\W4S j5       rS rSSSSS.S\64S jjrS rS rS rS rSS jrS rS rS r      GSS\34S jjr\LS 5       r\LS 5       rS\S S\SS4S jrSS jrS r        GS   GSS jjr\LS 5       r\L" \OSS9rSrSrg(  r   i%  c                    [        U[        R                  [        R                  45      (       d
   SU 35       eXl        SU l        S U l        SU l        [        5       U l	        X l
        UR                  (       aa  [        U[        R                  5      (       a&  UR                  R                  R                  U l        g UR                  R                  U l        g S U l        g )Nz	page is: Tr`   )rB   r   r   r   r   r   
last_point	draw_contr9   rW  r   r   r   r8  )r(   r   r   s      r)   r   Page.__init__ %  s    $u}} =>>R)D6@RR>	6??4//"oo33::"oo44DKr+   c                 "    U R                  5       $ r-   )r   rn  r   r   r   r  r8  r9  s     r)   r   Page.__repr__0%  s    ||~r+   c                    [        U SS 5      n[        U R                  R                  [        R
                  5      (       a+  U R                  R                  R                  R                  nO U R                  R                  R                  nSU 3nU(       an  U R                  R                  nU R                  R                  b  SU R                  R                  4-  nUS:X  a  SU R                  R                  -  nUSU 3-  nU$ )Nr   r  z<memory, doc# %i>r`   z<new PDF, doc# %i> of )r   rB   r   r   r   pdf_pager   r8  r   r   r   r  )r(   r   r8  rK   rb  s        r)   r   Page.__str__:%  s    x.dii**ENN;;YY))//66FYY))00FfX  A{{!!-'4;;+@+@*BBBw(4;;+@+@@T!:C
r+   c                    [         (       a,  [        R                  " U R                  [	        U5      5      nU$ U R                  5       n[        R                  " U[        R                  5      nU(       a  [	        U5      n[        R                  " U5      n[        R                  " UR                  UR                  UR                  UR                  -   UR                  -
  UR                  UR                  -   UR                   -
  5      n[        R"                  " X%5        [        R$                  " U5        ['        US5        U$ Nr  )r  r   _add_caret_annotr   JM_point_from_py	_pdf_pager   pdf_create_annotrI  pdf_annot_rectrp  rb  rc  r  r  r  r  r  rV  JM_add_annot_id)r(   rg  r   r   r  r#  s         r)   r  Page._add_caret_annotK%  s    ;**DII7G7NOE  >>#D**41F1FGE$U+((/LLacc133:+<accADDj144>OP((2""5)E3'r+   Nc                    U R                  5       nU(       a  UOUnU(       a  UOUn	[        U5      n
[        U5      nUR                  (       d  [	        [
        5      e[        R                  " U[        R                  5      n[        R                  " U5      n[        R                  " U
R                  U
R                  U
R                  UR                  -   UR                  -
  U
R                  UR                  -   UR                   -
  5      n[        R"                  " X5        [        R$                  n[        R&                  " X5        U(       a  [        R(                  " X5        [+        UR-                  5       XXS5      n[        R.                  " [        R0                  " U5      [3        S5      U5        [        R4                  " [        R0                  " U5      [3        S5      U5        [        R6                  " U5        [        R"                  " X5        [        R&                  " X5        [9        US5        [;        U5      $ )Nr   r  rL  r  )r  r  r-  r   r  r.  r   r  rK  r  fz_make_rectrb  rc  r  r  r  r  r  PDF_ANNOT_IS_PRINTr  pdf_set_annot_icon_namer  r0  rT  r  r  r  rV  r  r   )r(   rg  r3  rj   rP  r  iconr   ufrA  r  filebufr   r#  r  r  s                   r)   _add_file_annotPage._add_file_annotZ%  s   ~~#YDhU#$W-!!^,,&&tU-L-LM  'qssACCqttadd):ACC!$$J<MN  *((!!%/))%6DHHJ2!D5..u5x~sK&&u':':5'A8JCWYabu%  *!!%/s#U|r+   r  r   r   Fc                    SU 3nU R                  5       nU(       a  U(       d  [        S5      eU(       a	  U(       d  Un[        U5      u  nn[        U5      u  nn[        U5      n[        R
                  " U5      (       d  [        R                  " U5      (       a  [        [        5      e[        R                  " U[        R                  5      n[        R                  " U5      nU(       d  [        R                  " UU5        OI[        R                  " U[        S5      U5        U(       a!  [        R                  " U[        S5      U5        [        R                  " UU5        US:  a  US-  nUS:  a  M  US:  a  US-  nUS:  a  M  US:w  a!  [        R                  " U[        S5      U5        [        R                   " UU5        US:  a  [        R"                  " UUS U 5        [        R$                  " UU5        [        R&                  " UU5        U	(       a)  U	 H#  n[        R(                  " U[+        U5      5        M%     U
(       am  [        R,                  " U[        S5      [        S	5      5        [        R.                  " UU5        [1        U
5      n[2        R4                  " U[7        U
5      U5        U(       d  [9        UUUXC5        [        R:                  " U5        [=        US
5        [?        U5      nU$ )Nz<?xml version="1.0"?>
            <body xmlns="http://www.w3.org/1999/xtml"
            xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"
            xfa:contentType="text/html" xfa:APIVersion="Acrobat:8.0.0" xfa:spec="2.4">
            r  r  DSr   r  r:  r  FreeTextCalloutr  ) r  r   rA  r  r   r  r  r  r  rJ  r  r  r  r  r  rO  pdf_set_annot_quaddingrP  pdf_set_annot_border_widthr  pdf_add_annot_border_dash_itemr  rT  pdf_set_annot_callout_styler;   r   JM_set_annot_callout_liner   r  rV  r  r   )r(   r   r   r   r   r   r^  r  rC  r  calloutline_endr\  r  r_  richtextr  r   r   rb  rc  ntcolr.  r#  r   r%  rA  point_countr  s                                r)   _add_freetext_annotPage._add_freetext_annotu%  sS   $ F	
 ~~LMM
%J+J7t+J7tD!$$Q''5+A+A!+D+Dl++&&tU-F-FG''.	 ((5**9Xd^RH..y$O  *qjcMF qjmcMF mQ;""9hx.@&I$$UE219%%eT&5\:((=##E7344UE!HE  y(4.(CT:UV--eX>g,K++E5>;O UE4Du%s#El
r+   c                    [        U R                  5      n[        U5      (       d  [        [        5      e[
        R                  " 5       n[
        R                  " U[
        R                  " S5      U5        [
        R                  " U5      n[
        R                  " U[
        R                  5      n[
        R                  " U5      n[        U5      n[
        R                  " UR                  5       U5      n[!        U5       H  n	X   n
[        U
5      n[
        R                  " UR                  5       SU-  5      n[!        U5       H  nX   n[        U5      (       a  [#        U5      S:w  a  [        [        5      e[
        R$                  " ['        U5      U5      n[
        R(                  " XR*                  5        [
        R(                  " XR,                  5        M     [
        R.                  " X5        M     [
        R0                  " U[3        S5      U5        [
        R4                  " U5        [7        US5        [9        U5      $ )Nr   r   r\  r  )r   r   PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr   r{  r]  rp  fz_invert_matrixr  rL  r  r;   rQ  r0  rR  PySequence_Sizera  r  rS  rb  rc  r<  rT  r  rV  r  r   )r(   r   r   r  inv_ctmr   r%  n0inklistr  sublistn1r  rf  r  rg  s                   r)   _add_ink_annotPage._add_ink_annot%  s   DII&%%344nn  u||A<((-&&tU-@-@A''.	Y%%dhhj"5rAgGWB((QV<F2YJ'**oa.@A.E$&;<<001A!1DgN))&'':))&'':    1  	9hy&97Cu%s#U|r+   c                 F   U R                  5       n[        R                  " U[        R                  5      n[	        U5      n[	        U5      n[        R
                  " XEU5        [        R                  " U5        [        US5        UR                  (       d   e[        U5      $ r  )
r  r   r  rD  r  pdf_set_annot_linerV  r  r   r   )r(   rC  rD  r   r   r    r  s          r)   _add_line_annotPage._add_line_annot%  s{    ~~&&tU-A-ABR R   1-u%s#U|r+   c                 t   U R                  5       n[        U5      S:  a  [        [        5      e[        R
                  " X25      nU HB  n[        U5      S:w  a  [        [        5      e[        U5      n[        R                  " XF5        MD     [        R                  " U5        [        US5        [        U5      $ )Nr   r  )r  r;   r   MSG_BAD_ARG_POINTSr   r  r
  r  pdf_add_annot_vertexrV  r  r   )r(   rB  r)  r   r   r  rg  s          r)   _add_multilinePage._add_multiline%  s    ~~v;?011&&t8A"a' "455$Q'E&&u4	  	u%s#U|r+   c                 R   U R                  5       n/ SQnSn	[        R                  " U[        R                  5      n
[	        U5      n[        R
                  " U5      n[        R                  " X5        U(       a  [        U5      u  p[        R                  " UR                  5       U	5      n[        U	5       H  n[        R                  " XU   5        M     [        R                  " [        R                  " U
5      [        S5      U5        U(       a  U(       d   e[        R                  " [        R                  " U
5      S[        R                   " U5      5        [        R"                  " [        R                  " U
5      [        S5      U5        [        R$                  " [        R                  " U
5      [        S5      U5        [        R&                  " U
5        [)        U
S5        [        R*                  " U
R,                  5      n
[        R.                  " U
5      n
[1        U
5      $ )N)r   r   r   r   r   r9  r   DAr   r  )r  r   r  r  JM_quad_from_pyfz_rect_from_quadr  rA  rQ  r0  rR  rS  rT  r  r  r  r  r  rO  rV  r  ll_pdf_keep_annotr   r   r   )r(   rF  r   da_strr  r   r   r   rc  rb  r   qr#  rp  rf  s                  r)   _add_redact_annotPage._add_redact_annot%  s   ~~&&tU-C-CDD!##A&  */5KE%%dhhj%8C5\))#Aw7 "u22598D>3OM6''.!--d3
 **5+>+>u+ExPT~W]^""5#6#6u#=x}eTu%s#''(8(89&U|r+   c                    U R                  5       n[        U5      n[        R                  " U5      (       d  [        R                  " U5      (       a  [        [        5      e[        R                  " X25      n[        R                  " XT5        [        R                  " U5        [        US5        UR                  (       d   e[        U5      $ r  )r  r  r   r  r  r   r  r  r  rV  r  r   r   )r(   r   r)  r   r#  r   s         r)   _add_square_or_circlePage._add_square_or_circle&  s    ~~D!$$Q''5+A+A!+D+Dl++&&t8  *u%s#U|r+   c                    [        U5      n[        U5      n[        R                  " U5      (       d  [        R                  " U5      (       a  [        [        5      eU R                  5       n/ SQn[        U5      nS nS nU[        U5      ;   a  XR   nO[        U[        5      (       a  UR                  5       nO[        U[        5      (       a%  [        R                  " U5      R!                  5       nOS[        U["        [$        45      (       a  UnO5[        U[&        R(                  5      (       a  UR+                  5       nOUS   n[        R,                  " U[        R.                  5      n	U(       Gai  [        R0                  " U5      n
[        R2                  " U
5      nUR5                  5       UR7                  5       p[9        UR:                  U-  UR<                  U-  5      nX-  nX-  nUR>                  UR@                  -   S-  nURB                  US-  -
  nURD                  US-  -
  nUU-   nUU-   n[        RF                  " UUUU5      n[        RH                  " X5        [        RJ                  " X5        [        RL                  " [        RN                  " U	5      [Q        S5      [        RR                  " S5      5        [        RT                  " U	S5        Oj[        RH                  " X5        [        RL                  " [        RN                  " U	5      [Q        S5      [Q        U5      5        [        RT                  " X5        [        RV                  " U	5        [Y        U	S5        [[        U	5      $ )N)ApprovedAsIsConfidentialDepartmentalExperimentalExpiredFinal
ForCommentForPublicReleaseNotApprovedNotForPublicReleaseSold	TopSecretDraftr   r   r)  
ImageStampzImage Stampr  ).r*  r  r   r  r  r   r  r  r;   rR  rB   r  r  r   r  r  
read_bytesr  r  r=   r  r  r  rM  r  fz_new_image_from_bufferr   r  r  r  r0  r#  r$  rb  rc  r  r  pdf_set_annot_stamp_imagerT  r  r  r  r  rV  r  r   )r(   r   stampr#  r   stamp_idrI   r  r   r   fzbuffr/  r   r  scaler  r0  r  r  r  r  r  s                         r)   _add_stamp_annotPage._add_stamp_annot)&  s   DzD!$$Q''5+A+A!+D+D\**~~  ME!H?Dv&&--/Cs##,,u%002Cy122Crzz**.."CA;D&&tU-B-BC99#>F008C 557CEEGq

Qa8EIEYF gg'1,FEAI%BFQJ&BeBfB""2r2r2A$$U.++E7u22598F;KUM_M_`lMmn((>$$U.u22598F;KXVZ^\((5u%s#U|r+   c                    U R                  5       n[        U5      n[        R                  " U[        R                  5      n[        R
                  " U5      n[        R                  " UR                  UR                  UR                  UR                  -   UR                  -
  UR                  UR                  -   UR                  -
  5      n[        R                  " Xg5        [        R                  " Xb5        U(       a  [        R                  " Xc5        [        R                   " U5        [#        US5        [%        U5      $ r  )r  r  r   r  rN  r  r  rb  rc  r  r  r  r  r  r  r  rV  r  r   )r(   rg  r   r  r   r  r   r#  s           r)   _add_text_annotPage._add_text_annotm&  s    ~~e$&&tU-A-AB  'qssACCqttadd):ACC!$$J<MN  *$$U1))%6u%s#U|r+   c                     [        U 5        U R                  R                  (       d  [        S5      e[	        XU5      nU(       d  g [
        R                  " U 5      Ul        X0R                  [        U5      '   U$ )Nr~  )	rn  r   r  r   Page__add_text_markerr  r  rW  rX  )r(   rZ
  r)  r  s       r)   _add_text_markerPage._add_text_marker{&  s[    D{{!![))#D<]]4(
$'C!
r+   c                    [        U 5        [        (       a@  [        R                  U R                  l        [        R                  " U R                  U5      $ [        U R                  5      n[        U5      nUS:  a  gSn[        U[        5      (       d  [        S5      e[        R                  " UR                  5       [        S5      5      R                   (       d/  [        R"                  " UR                  5       [        S5      U5        [        R                  " UR                  5       [        S5      5      nUR                   (       d   SU< SUR                   < 35       e[%        U5       H  nX   n['        U5      nU(       d  [)        SU5        M'   [        R*                  " UR-                  5       [/        UR-                  5       U5      5      n[        R0                  " UR-                  5       [        R2                  " U5      S	5      n	[        R4                  " XY5        M     g! [6         a'    [8        (       a
  [;        5         [)        S
U-  5         M  f = f)z&Add links from list of object sources.r   Nr  zbad 'linklist' argumentr  zlcount=z annots.m_internal=z"skipping bad link / annot item %i.r   z#skipping bad link / annot item %i.
)rn  r  r   Page_addAnnot_FromStringr  r  r   r   r;   rB   r   r   r   r
  r  r  r   rI  rR  JM_StrAsCharrv   rJ  r0  r  r  r  r<  rk   r  rz   )
r(   linklistr   lcountrf  r  txtpyr   r   r  s
             r)   r  Page._addAnnot_FromString&  s   D;272P2PDNN/11499hGGDII&XA: (E**788!!488:x/ABMM$$dhhj(82DfM##TXXZ(1CD  CWVI-Av/@/@.B"CC vAKE&D<a@D,,dhhj:Mtxxz[_:`a00$((*e>N>NPU>VXYZ$$f6   D''N,<>BCDs   BH))-IIc                     U R                  5       nUR                  5       n[        XCX5      nUR                  (       d  [	        S5      e[        US5        [        U5      $ )Nzcannot create widgetr
  )r  r0  JM_create_widgetr   r   r  r   )r(   rL  rG  r   r`  r   s         r)   
_addWidgetPage._addWidget&  sN    ~~hhj JC 677s#U|r+   c                     U R                  5       n[        R                  " 5       nSUl        Xl        X%l        X5l        [        R                  " UR                  5       XE5      nU$ r   )	r  r   PdfRedactOptionsblack_boxesr   image_methodline_artpdf_redact_pager0  )r(   r   rK
  graphicsr   rU  successs          r)   _apply_redactionsPage._apply_redactions&  sQ    ~~%%'	" ''
D?r+   c                     U R                  5          U R                  R                  U 5        S U l        SU l        S U l        S U l        g ! [         a    [	        5          N3f = frZ  )_reset_annot_refsr   r  rk   rz   r   r8  r   r/   s    r)   r   Page._erase&  s]     	KK$$T* 	  		s   A
 
A! A!c                 <   [        U 5      n[        R                  " UR                  5       [        R                  5      n[        R                  " UR                  5       [        R
                  5      n[        U R                  5      n[        R                  " XBU5      $ )a  Count missing graphic state pushs and pops.

        Returns:
            A pair of integers (push, pop). Push is the number of missing
            PDF "q" commands, pop is the number of "Q" commands.
            A balanced graphics state for the page will be reached if its
            /Contents is prepended with 'push' copies of string "q
"
            and appended with 'pop' copies of "
Q".
        )	r   r   r
  r  r  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)r(   r   r$  r  r`  s        r)   _count_q_balancePage._count_q_balance&  sy     D!  HHJ))
 !!HHJ((
 t{{+ 55cEEr+   r  rs  c                    Ub  US:X  a  g U R                   nUR                  USS9nSU;   d  SU;   d  [        S5      e0 nU R                  5        H	  u  pVXTU'   M     XR	                  5       ;   a  XA   $ SnSU-  nXR                  5       ;   a  US-  nSU-  nXR                  5       ;   a  M  U R                  X5        U$ )	Nr   TrG  	/Type/OCGrV  zbad optional content: 'oc'zMC%ir   )r   rJ  r   _get_resource_propertiesry  r  _set_resource_property)	r(   r  r0  checkpropsr  rb  rf  mcs	            r)   _get_optional_contentPage._get_optional_content&  s    :qkkt4u$(=9::113DA!H 49aZLLN"FA!B LLN" 	##B+	r+   c                 X    U R                  5       n[        UR                  5       5      nU$ )z
page list Resource/Properties
)r  JM_get_resource_propertiesr  )r(   r   r   s      r)   rf  Page._get_resource_properties&  s%     ~~'
3	r+   c                 x     [        R                  " U R                  XU5      n[        R
                  " U5      nU$ r-   )r  r   page_get_textpager   r   r  r  r  fz_bound_pager  rQ  _globalsr   fz_enable_device_hintsFZ_NO_CACHErB   r   r   r   r   fz_run_pagerl  fz_close_device)r(   r  r  r  ll_tpagetpager   r   r   r  devs              r)   _get_textpagePage._get_textpage'  s2    ..tyy$vNH%%h/ELr+   r  c                    [         R                  " 5       nU R                  5       nUR                  5       nU
nUnUnSnSnSnSnSnSnUS:  a  [         R                  " UUS5      n[         R
                  " [         R                  " U[        S5      [        S5      5      5      n[         R
                  " [         R                  " U[        S5      [        S5      5      5      nUU-   S:X  a  [        [        5      eSnSnSnSnO4U(       a  [        U5      nSnOU(       a  [         R                  " U5      nSnU(       Ga  UR                  nUR                  5       nUR                  5       n[         R                  " U5      nUn UR!                  U S 5      n!U!b/  U!n[         R                  " UR                  5       US5      nSnSnSnOUR#                  5       S:X  a+  [         R$                  " U[         R&                  " 5       5      n"O[         R(                  " U[         R*                  " 5       [         R*                  " 5       [         R,                  " S 5      [         R.                  " 5       S5      n#SU#l        S U#l        [         R$                  " U#[         R&                  " 5       5      n$[         R$                  " UU$5      n"SnSnU(       Ga  [         R2                  " 5       n%[4        (       a  [         R6                  " U%W5        O@[         R8                  " U%WR:                  R<                  UR:                  R>                  5        U(       an  [        U5      n[4        (       a  [         R6                  " U%U5        O@[         R8                  " U%UR:                  R<                  UR:                  R>                  5        [         R@                  " U%5      n[C        U5      n UR!                  U S 5      n!U!b  U!n[         R                  " UR                  5       US5      n[         R
                  " [         R                  " U[        S5      [        S5      5      5      n[         R
                  " [         R                  " U[        S5      [        S5      5      5      nSnSnO?[         RD                  " U5      n"U"R                  5       nU"R                  5       nU(       d  SnU(       a  [         RF                  " W"5      n&U&R:                  (       d  [        S5      eU"RI                  5       n'U"R1                  5       n([         RJ                  " U"5      u  n)n*[         RD                  " U5      n$[         RL                  " UUU'U(U)U*SS[O        5       [O        5       U&U$5      n"U(       aH  [         RP                  " UW"5      nU	(       a  [S        UUU	5        [         RT                  " U5      nUUW '   SnU(       Ga  [         RV                  " URY                  5       [        S5      5      n+U+R:                  (       d/  [         RZ                  " URY                  5       [        S5      S	5      n+[         R\                  " U+[        S
5      5      n,U,R:                  (       d!  [         RZ                  " U+[        S
5      S	5      n,[_        UUXWU5      n-[         R`                  " U,UW5        [         Rb                  " S5      n.S[e        U-Rf                  U-Rh                  U-Rj                  U-Rl                  U-Rn                  U-Rp                  45       SU S3n/[         Rr                  " U.U/5        [u        UURY                  5       U.U5        U(       a  UU4$ US 4$ )Nr   r   Widthr
  Heightr@  z#uncompressed image cannot have maskr;  r   XObjectr  
q
z cm
/z Do
Q
);r   r2  r  r0  r  r  r  r  r   MSG_IS_NO_IMAGEr-  fz_read_filer   r   r  fz_md5_pixmap2r<   r  fz_new_image_from_pixmapFzImagefz_convert_pixmapr-  FzDefaultColorspacesFzColorParamsr  FzMd5r   fz_md5_update_bufferfz_md5_updater   r  r;   fz_md5_final2r  r8  fz_compressed_image_bufferbpcfz_image_resolution$fz_new_image_from_compressed_buffer2r   pdf_add_imager  r  r  r  rX  r
  calc_image_matrixr  r	  r   r    r  r  rA  rg  r  fz_append_stringJM_insert_contents)0r(   rj   pixmapr   imaskr  overlayr_  keep_proportionr  r  r0  r  r  _imgnamedigestsmaskbufr   r`  r   r  img_xref	rc_digestdo_process_pixmapdo_process_streamdo_have_imaskdo_have_imagedo_have_xrefrefimgbufarg_pixdigestmd5_pyr  imagerS  maskstatecbuf1r  r  xresyresrh  xobjectr  nresr  s0                                                   r)   _insert_imagePage._insert_image'  s   
 .."~~ hhj	!8((dA6C  %"5"5sHW<MxX[}"]^A  %"5"5sHX<NPXY\P]"^_A1uz /22 ! !MM +F3$%!"//9F()% kkG		A		A))'2FF;;vt,D,,TXXZ1E$%! ! !==?a'!::7EMMOTE00#!..0!..0!66t<!//1B  !BH$(BM 99"emmoND!::7DIE$%! ! KKME{**E6:##E6+<+<+A+A6CTCTCXCXY,U3;..w?''w/A/A/F/FHZHZH^H^_((/F6]F;;vt,D,,TXXZ1E$$e&9&93@QS[\_S`&ab$$e&9&93@RT\]`Ta&bc ! !66v>GGIGGI$%M 44e<E## "GHH))+C))+J2259JD$11':D>>FFE %%c51C c2.'',H&GFOI66txxz8KCXYI''!33DHHJ@UWXY	((HY4GHG%%11)Xi=PRST#Aq$HC37&&r*D	355#%%suucee"LMNfU]T^^fgA""4+sDHHJg>W$$T>!r+   c                    U R                  5       nUR                  5       n[        XX4XVXxX5
      n[        R                  " UR                  5       [        S5      5      nUR                  5       (       d/  [        R                  " UR                  5       [        S5      S5      n[        R                  " U[        S5      5      nUR                  (       dP  [        R                  " US5      n[        R                  " UR                  5       U[        S5      [        S5      5        [        US5      u  nnU(       d  [        S5      e[        R                  " UUS5      n[        R                   " XU5        U$ )Nr;  r   r  r   zcannot insert font)r  r0  r  r   r  r  r  r  rX  r
  r   rY  rO  r  r   r  r  )r(   r   r  r  r  
set_simpler  r  r  r   r  r   r`  r   rh  r  r9  r  font_objs                      r)   _insertFontPage._insertFont'  s   ~~hhjsHRW`hs22488:x?TU	$$&&//
H[<QSTUI""9hv.>?&&sA.E
E8K3H(SYJZ[eQ'4 455))#tQ7EX6r+   c                     U R                  5       nUS:X  a  [        X15      nO[        X25      nUR                  (       a  [	        U5      $ g r   )r  JM_get_annot_by_nameJM_get_annot_by_xrefr   r   )r(   r   r  r   r   s        r)   _load_annotPage._load_annot'  sA    ~~19(4E(4E< r+   c           	      H    [        XR                  X#XEU5      n[        U5      $ r-   )JM_pixmap_from_pager   r  )r(   r0  r  r  r  r  r  r  s           r)   _makePixmapPage._makePixmap'  s     !#yy#5$Oc{r+   c                    [         R                  " [         R                  R                  5      n[        U R                  SS9nUR
                  (       aV  [         R                  " UR                  5       U5      n[         R                  " U5      (       a  [         R                  " U5      n[         R                  " U5      (       a  g [        U5      $ NFr  )r   rp  rq  r   r   r   r  r  r:  pdf_to_rectr  ro  )r(   boxtyper   r   r  s        r)   
_other_boxPage._other_box'  s    ||U\\889DII6??%%txxz7;C!!#&&((-$$d++t$$r+   Tc                 *    [        U R                  US9$ )Nr  )r   r   )r(   r   s     r)   r  Page._pdf_page'  s    DII99r+   c                 8    U R                   R                  5         g)z,Invalidate / delete all annots of this page.N)rW  rC  r/   s    r)   r]  Page._reset_annot_refs'  s     r+   c                 F   US:  a
  US:  a  Uc  g [        [        [        US5      S-  5      5      nUS:  a  Sn[        [        [        US5      S-  5      5      nUS:  a  SnSXV4-  nU(       d  g [        U R                  5      n[
        R                  " UR                  5       [        S5      5      nUR                  (       d/  [
        R                  " UR                  5       [        S5      S5      n[
        R                  " U[        S5      5      n	U	R                  (       d!  [
        R                  " U[        S5      S5      n	[
        R                  " U	5      n
[        U
5       H8  n[
        R                  " X5      n[
        R                  " U5      nX:X  d  M6  Us  $    [
        R                  " UR!                  5       S	5      n[
        R"                  " U[        S
5      U5        [
        R"                  " U[        S5      U5        [
        R$                  " XU5        U$ )Nr   r   r	  c   zfitzca%02i%02ir;  r   r?  r   r<  r=  )r8   r  r   r   r   r   r
  r  r  r   rX  r  rR  r  r  rY  r0  rZ  r  )r(   gstater<  r=  r  tCAtcar   rh  rj  rI   rf  ri  r   opas                  r)   _set_opacityPage._set_opacity'  s   7rQw9#4%Bc)*+#:C%B
S()*#:C!SJ.DII&&&txxz8K3HI	##//
H[<QSTUI!!)Xk-BC**9h{6KQODt$qA''0B$$R(D~	 
   Q/Xd^R8Xd^R8D#.r+   c           
         U R                   nUc  [        S5      eUR                  (       d  [        S5      eSnX;  a  [        S5      e[        U5      nU R                  n[        US   UR
                  US   -
  US   UR
                  US   -
  5      nUR                  UR                  s=::  a!  UR                  s=:  a  UR                  ::  aA  O  O>UR                  UR                  s=::  a!  UR
                  s=:  a  UR
                  ::  d  O  [        U S	35      eUR                  U R                  US
[        [        U5      5       S35        g )Nr  r~  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   r   r   z not in MediaBoxr  r  )r   r   r  r*  r6  r  r  r  r  r  r  r   r   )r(   r  r   r0  valid_boxesmbs         r)   _set_pageboxPage._set_pagebox(  s   kk;>??zz[))B%]++Dz]]DGRUUT!W_d1gruutAwG34773bee38[4778[VXV[V[8[y(89::Gq5;1G0H-JKr+   c                 X    U R                  5       n[        UR                  5       X5        g r-   )r  JM_set_resource_propertyr  )r(   r   r  r   s       r)   rg  Page._set_resource_property0(  s    ~~ T8r+   c	                    [        U5      n	[        U5      n
Un[        U R                  5      nUR	                  5       nUR                  5       n[        U5        [        XXGR                  5      nU(       d  [        R                  " U5      n[        R                  " US5      n[        R                  " USU5        [        R                  " US5      n[        R                  " U[        S5      U5        [        R                  " S5      n[        R                  " US5        [        R                   " XU
UU5      nUS:  a!  [#        U[        R$                  " U5      U5        [        R&                  " U[        S5      5      nUR(                  (       d!  [        R*                  " U[        S5      S5      n[        R,                  " U[        S5      5      nUR(                  (       d!  [        R*                  " U[        S5      S5      n[        R                  " UUU5        [        R                  " S5      n[        R                  " US	5        [        R                  " UU5        [        R                  " US
5        [/        XUU5        U$ )Nr   fullpager     z/fullpage Dor   r;  r  z q /z Do Q )r  r  r   r   r  r0  r?  JM_xobject_from_pager   r  rY  r  rT  r  r	  r  pdf_new_xobjectr  r  r  r   rX  r
  r  )r(   
fz_srcpager  r  r  r  r  rz  r  r|	  r  rc_xrefry  tpagerefr  xobj1subres1subresr$  xobj2rh  r  s                         r)   _show_pdf_pagePage._show_pdf_page4(  s   !$''TYY'99;  %V}}M&&u-G $$VQ/GZ7##FA.68I#6@!!"%sN3%%fsFCH6VU%?%?%FK 228Xk=RS	##//+9NPQRI##Ix	/BC  ,,Y8KQOFFHe4
 ""2&tV,tX.tX.6T7;r+   rg  c                     [        U 5      n U R                  U5      nUS:w  a  U R                  U5        [        U5      n[	        X5        [        US5      (       d   eU$ ! US:w  a  U R                  U5        f f = f)zAdd a 'Caret' annotation.r   r   )annot_preprocessr  r  r   annot_postprocessr?   )r(   rg  old_rotationr   s       r)   add_caret_annotPage.add_caret_annotm(  s    '-	0))%0Eq !!,/u$&x(((( q !!,/ !s   A   A:r   c                     [        U 5      n U R                  U[        R                  5      nUS:w  a  U R	                  U5        [        X5        U$ ! US:w  a  U R	                  U5        f f = f)z*Add a 'Circle' (ellipse, oval) annotation.r   )r  r%  r   rC  r  r  r(   r   r  r   s       r)   add_circle_annotPage.add_circle_annotz(  k    '-	0..tU5K5KLEq !!,/$& q !!,/ !    A A+r3  rj   rP  r  r  c           	          [        U 5      n U R                  UUUUUUS9nUS:w  a  U R                  U5        [        X5        U$ ! US:w  a  U R                  U5        f f = f)z"Add a 'FileAttachment' annotation.)rP  r  r  r   )r  r  r  r  )	r(   rg  r3  rj   rP  r  r  r  r   s	            r)   add_file_annotPage.add_file_annot(  s}     (-
	0((' ) E q !!,/$& q !!,/ !s   A Ar   r   r   r^  r  rC  r  r  r   r\  r  r_  r  r  r   r   r   r   r^  r  rC  r  r  r   r\  r  r_  c                    [        U 5      n U R                  UUUUUUUUU	U
UUUUUUS9nUS:w  a  U R                  U5        [        U U5        U$ ! US:w  a  U R                  U5        f f = f)zAdd a 'FreeText' annotation.r  r   )r  r  r  r  )r(   r   r   r   r   r   r^  r  rC  r  r  r   r\  r  r_  r  r  r  r   s                      r)   add_freetext_annotPage.add_freetext_annot(  s    , (-	0,,%%))!-!-!#%#!%! - E& q !!,/$& q !!,/ !s   A A*c                 x    Uc  [        XX4S9nO[        U5      nU R                  U[        R                  5      nU$ )zAdd a 'Highlight' annotation.r  r  r  )get_highlight_selectionCheckMarkerArgrE  r   PDF_ANNOT_HIGHLIGHT)r(   rZ
  r  r  r  r!  rK   s          r)   add_highlight_annotPage.add_highlight_annot(  s<     ='PAu%A##Au'@'@A
r+   handwritingc                     [        U 5      n U R                  U5      nUS:w  a  U R                  U5        [        X5        U$ ! US:w  a  U R                  U5        f f = f)z^Add a 'Ink' ('handwriting') annotation.

The argument must be a list of lists of point_likes.
r   )r  r  r  r  )r(   r  r  r   s       r)   add_ink_annotPage.add_ink_annot(  se    
 (-	0''4Eq !!,/$& q !!,/ !   A ArC  rD  c                     [        U 5      n U R                  X5      nUS:w  a  U R                  U5        [        X5        U$ ! US:w  a  U R                  U5        f f = f)zAdd a 'Line' annotation.r   )r  r  r  r  )r(   rC  rD  r  r   s        r)   add_line_annotPage.add_line_annot(  sc    '-	0((0Eq !!,/$& q !!,/ !r  rB  c                     [        U 5      n U R                  U[        R                  5      nUS:w  a  U R	                  U5        [        X5        U$ ! US:w  a  U R	                  U5        f f = f)zAdd a 'Polygon' annotation.r   )r  r  r   rF  r  r  r(   rB  r  r   s       r)   add_polygon_annotPage.add_polygon_annot(  sk    '-	0''0G0GHEq !!,/$& q !!,/ !r  c                     [        U 5      n U R                  U[        R                  5      nUS:w  a  U R	                  U5        [        X5        U$ ! US:w  a  U R	                  U5        f f = f)zAdd a 'PolyLine' annotation.r   )r  r  r   rE  r  r  r  s       r)   add_polyline_annotPage.add_polyline_annot(  sk    '-	0''0I0IJEq !!,/$& q !!,/ !r  c                     [        U 5      n U R                  U[        R                  5      nUS:w  a  U R	                  U5        [        X5        U$ ! US:w  a  U R	                  U5        f f = f)z&Add a 'Square' (rectangle) annotation.r   )r  r%  r   rB  r  r  r  s       r)   add_rect_annotPage.add_rect_annot)  r  r  r   r  c	                    Sn	U(       a  [        [        R                  5      R                  U5      (       d  [	        U5        [	        U5        U(       d  SnU(       d  SnU(       d  Sn[        US5      (       a  XwU4n[        U5      S:  a  USS nSn
U
R                  " XsUS.6n	Uc  S	nU(       a)  [        US5      (       a  XfU4n[        U5      S:  a  USS nOSn[        U 5      n U R                  XU	XVS
9nUS:w  a  U R                  U5        [        X5        U(       a  UR                  5       R                  5       SS nUu  pnnnUR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  S5        SR                  U5      nUR!                  US5        U$ ! US:w  a  U R                  U5        f f = f)zAdd a 'Redact' annotation.NrA  r  r@  r  r   r  r  r   r   r   )r   r   r  r   r   r  r  r	  )r  r
  
whitespacer
  r  r?   r;   r  r  r"  r  r  r'  r  ro   r  r6  )r(   rF  r   r   r   r  r   r   r  r   r   r  r   r7  r9  r:  r;  r<  r=  r&  s                       r)   add_redact_annotPage.add_redact_annot)  s    F--.99$??tz"!&
z;//(jA
:"'^
5CZZ8DF| 4-- -Dt9q=8DD'-	0**46" + /E q !!,/$& \\^..0"5F &A2r2MM"MM"MM"MM"MM"MM$F#BLLQ# q !!,/ !s   )G G0c                 t    Uc  [        XX4S9nO[        U5      nU R                  U[        R                  5      $ )zAdd a 'Squiggly' annotation.r  )r  r  rE  r   PDF_ANNOT_SQUIGGLYr(   rZ
  r  r  r  r!  s         r)   add_squiggly_annotPage.add_squiggly_annotP)  s8     ='PAu%A$$Q(@(@AAr+   c                     [        U 5      n U R                  X5      nUS:w  a  U R                  U5        [        X5        U$ ! US:w  a  U R                  U5        f f = f)z$Add a ('rubber') 'Stamp' annotation.r   )r  r>  r  r  )r(   r   r:  r  r   s        r)   add_stamp_annotPage.add_stamp_annot^)  sc    '-	0))$6Eq !!,/$& q !!,/ !r  c                 t    Uc  [        XX4S9nO[        U5      nU R                  U[        R                  5      $ )zAdd a 'StrikeOut' annotation.r  )r  r  rE  r   PDF_ANNOT_STRIKE_OUTr   s         r)   add_strikeout_annotPage.add_strikeout_annoti)  s6    ='PAu%A$$Q(B(BCCr+   c                     [        U 5      n U R                  XUS9nUS:w  a  U R                  U5        [        X5        U$ ! US:w  a  U R                  U5        f f = f)z&Add a 'Text' (sticky note) annotation.)r  r   )r  rA  r  r  )r(   rg  r   r  r  r   s         r)   add_text_annotPage.add_text_annotq)  sh    '-	0((4(@Eq !!,/$& q !!,/ !s   A Ac                 t    Uc  [        XX4S9nO[        U5      nU R                  U[        R                  5      $ )zAdd a 'Underline' annotation.r  )r  r  rE  r   PDF_ANNOT_UNDERLINEr   s         r)   add_underline_annotPage.add_underline_annot|)  s6    ='PAu%A$$Q(A(ABBr+   r[  c                    [        U 5        U R                  nUR                  (       d  [        S5      eUR	                  5         U R                  UR                  UR                  5      nU(       d  gSUl        [        R                  " U 5      Ul        X0R                  [        U5      '   UR                  Ul        X1l        UR                  5         U$ )zAdd a 'Widget' (form field).r~  NT)rn  r   r  r   rz  rP  rL  rG  r   r  r  rW  rX  r  rG  )r(   r[  r0  r   s       r)   
add_widgetPage.add_widget)  s    Dkkzz[)) 1 163D3DE}}T*&+E#r+   c                 t     [        U 5        U R                  SS9nUR                  (       d  / $ [        U5      $ )z
page get list of annot names
Fr  )rn  r  r   JM_get_annot_id_listr(   r   s     r)   annot_namesPage.annot_names)  s6     	>D~~u~-I#D))r+   c                     [        U 5      $ )z8
List of xref numbers of annotations, fields and links.
)JM_get_annot_xref_list2r/   s    r)   rx  Page.annot_xrefs)  s     't,,r+   c              #     #    [         R                  [         R                  [         R                  4n[	        US5      (       d.  U R                  5        Vs/ s H  o3S   U;  d  M  US   PM     nnO8U R                  5        Vs/ s H  o3S   U;   d  M  US   U;  d  M  US   PM     nnU H  nU R                  U5      nSUl        Uv   M!     gs  snf s  snf 7f)zGenerator over the annotations of a page.

Args:
    types: (list) annotation types to subselect from. If none,
           all annotations are returned. E.g. types=[PDF_ANNOT_LINE]
           will only yield line annotations.
r  r   r   TN)r   r  PDF_ANNOT_POPUPrS  r?   rx  
load_annot_yielded)r(   types
skip_typesr    rx  r  r   s          r)   r  Page.annots)  s      **E,A,A5CYCYZ
um,,)-)9)9);V);At:?U41Q4);KVK)-)9)9);h);Atu}4QRSTQU]gQg41Q4);KhDOOD)EENK   Whs0   ACC%	C.CCC	C'2Cr   rK
  rX  c           
      b   S n[        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                   [        ::  a  U $  [        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
  [        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.
333333?      ?)r  r  get_text_lengthr   r   FzErrorBaser  rz   r  ceilr0  r#  rc  blr  )

annot_rectnew_textr  r0  
text_widthline_heightr  r  r#  rc  s
             r)   center_rect*Page.apply_redactions.<locals>.center_rect)  s      z//7:!!",XUC

  #+K$$E		*,-;A%%%!!A:==??2Q6#=ADH  1 12 "''"$!!"s   B% %1CCr  r~  )r@  FzError applying redactions.r   r   )r   rm  r   r  r   r   r   r   r  ro  )r   r   rm  r  rF  T)rn  r   r  r   r   r  r  r   r  ro   r  rZ  	new_shape	draw_rectfinishry  r<   insert_textboxcommit)r   rK
  rX  r   rO  r0  redact_annotsr   r   shaperedactrK  r   rL  r  r/  r0  rm  trects                      r)   rR
  Page.apply_redactions)  s   0 	D 	Dkks}};<<zz[))[[))+ ! 
E   !9!9!;<	
 B##D(;9::  #FJ&>D
+$3&!&>

7A.z*z*|,#J%G1f!-- !&!&## . B SLE 1f!! $6 	r+   c                     US;  a  [        S5      e[        U R                  5      n[        R                  " 5       nXl        [        R                  " U5      n[        R                  " X R                  U5        g)zJConvert colorspaces of objects on the page.

Valid values are 1, 3 and 4.
r  z!components must be one of 1, 3, 4N)	r   r   r   r   pdf_recolor_optionsnum_compPdfRecolorOptionspdf_recolor_pager8  )r(   r	  pdfdocroptroptss        r)   r	  Page.recolor(*  s]    
 Y&@AA!$++.((*"''-v{{E:r+   c                     [        U5      nUR                  (       d  X R                  -  R                  (       a  [	        S5      eX R
                  -  n[        U 5      n[        U5      n[        R                  " X45        g)z-Clip away page content outside the rectangle.z"rect must not be infinite or emptyN)
r*  ru  r   rv  r   rs  r   r  r   pdf_clip_page)r(   r   r  r  pclips        r)   clip_to_rectPage.clip_to_rect5*  s_    Dzyy 0::ABB***t$%G+r+   c                 Z    U R                   b  g[        (       d  g[        U 5      nXl         g)z!Try to access layout information.N)layout_informationr   )r(   layout_infos     r)   
get_layoutPage.get_layout?*  s+     "".{!$'"-r+   c                     U R                  S5      nUc  U R                  $ U R                  n[        US   UR                  US   -
  US   UR                  US   -
  5      $ )z
The ArtBoxr  r   r   r   r   r  r|	  r6  r*  r  r(   r   r  s      r)   artboxPage.artboxM*  s[     x(<<<]]DGRUUT!W_d1gruutAwGGr+   c                     U R                  S5      nUc  U R                  $ U R                  n[        US   UR                  US   -
  US   UR                  US   -
  5      $ )zThe BleedBoxr  r   r   r   r   ro  rp  s      r)   bleedboxPage.bleedboxV*  s[     z*<<<]]DGRUUT!W_d1gruutAwGGr+   c                    [        U 5        [        U R                  5      n[        R                  " U5      n[        U5      nUR                  (       a  U R                  R                  (       aq  U R                  nUR                  UR                  pTU R                  S;  a  XTpT[        SSXE5      n[        R                  SS9R                  5       S   n[!        U5        U$ )zGet page rectangle.r      r   F)rP
  r  )rn  r   r   r   rr  r*  ru  r   r  r|	  r  r0  ru  r  mupdf_warningsr  rv   )r(   r   r  cbr   r  r   s          r)   bound
Page.bound_*  s    D499%!!$'3i??t{{11B88RYYq}}H,1q!Q"C&&U&3>>@DCCL
r+   c                     U(       d!  U R                   (       d  U R                  5         [        U R                  SS9nUR                  (       d  g [        SUS9n[        R                  " UR                  5       X#5        g )NFr  r   )r  r  )	
is_wrappedwrap_contentsr   r   r   r  r   pdf_filter_page_contentsr0  )r(   r  r   r  s       r)   r  Page.clean_contentsq*  sS     TYY7(XF&&
DBr+   c                     [        U 5        U R                  SS9nUR                  (       d!  [        R                  " U R
                  5      nO[        UR                  5       5      n[        U5      nU$ )zThe CropBox.Fr  )	rn  r  r   r   rr  r   r{	  r  r*  )r(   r   r  s      r)   r|	  Page.cropboxz*  sU     	D~~u~-%%dii0CTXXZ(C3i
r+   c                 .    U R                   R                  $ r-   )r|	  r#  r/   s    r)   cropbox_positionPage.cropbox_position*  s    ||r+   c                    [        U 5        [        U5        U R                  5       n [        UR                  5      nU(       d  O"[        R
                  " X#R                  5        M?  [        R                  " UR                  5      n[        R
                  " X!R                  5        [        U5      nU(       aC  SUl        [        R                  " U 5      Ul        XUR                  R                  [        U5      '   UR                  5         U$ )z!Delete annot and return next one.T)rn  r  r  r   r   r  rT  r   r   r  r  r   rW  rX  r   )r(   r   r   r  	nextannotr  s         r)   delete_annotPage.delete_annot*  s    DE~~)%**5I""48  ((4	tZZ0ICK t,CJ.1JJ""2c7+
r+   r  c                 d    [        [        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   )r  N)r  r  
clear_withreplace_image)r   r  r  s      r)   delete_imagePage.delete_image*  s-     V\1-4,r+   c                 H  ^ ^ [        T 5        [        T[        5      (       d  gUU 4S jn[        T R                  SS9nUR
                  (       d  U" 5       $ T[           nUS:  a  U" 5       $ [        R                  " UR                  5       [        S5      5      nUR
                  (       d  U" 5       $ [        R                  " U5      nUS:X  a  U" 5       $ Sn[        U5       H4  n[        R                  " [        R                  " XX5      5      nXG:X  d  M4    O   XG:w  a  U" 5       $ [        R                  " UW5        [        R                   " UR#                  5       U5        [        R$                  " UR                  5       [        S5      U5        ['        U5        U" 5       $ )zDelete a Link.Nc                     > TS   S:X  a  g  TS   n TR                   U    nUR                  5         g ! [         a    [        S:  a
  [	        5          g f = f)Nr  r   rX  r   )rW  r   rk   r  rz   )linkidlinkobjlinkdictr(   s     r)   finished"Page.delete_link.<locals>.finished*  sY    1$f!$**62  '!+0@s   $2 AAFr  r   r  r   )rn  rB   r9   r   r   r   r  r   r
  r  r  r  rR  r  r  r  r  r0  rT  rU  )	r(   r  r  r   r  r  r  oxrefrf  s	   ``       r)   rQ
  Page.delete_link*  s?   D8T**		 DII6:%!8:##TXXZ(1CD  :""F+19:A$$e&9&96&EFE} 
 =:*T2DHHJ(:FC$zr+   c                     [        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.r  Nzbad type: widget)
rn  r   r   r\  r  r  r   r   r  ry  )r   r[  r   
nextwidgetkeylistr  s         r)   delete_widgetPage.delete_widget*  s    D$/=/00[[
% #v++-.C$ r+   c                 @   [         (       a)  [        [        R                  " U R                  5      5      $ U R                  SS9nUR                  (       d7  [        [        R                  " [        R                  R                  5      5      $ [        [        U5      5      $ )zReflects page de-rotation.Fr  )r  r~  r   Page_derotate_matrixr   r  r   r   rp  UNITr^  )r(   r  s     r)   rt  Page.derotation_matrix*  sk     ;%44dii@AA..%.0!!%,,u||'8'89::-g677r+   rn  p3p4rm  r  r&  	closePathlineCaplineJoinr  stroke_opacityfill_opacityc                     U R                  5       nUR                  [        U5      [        U5      [        U5      [        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.rm  r   r  r  r  r  r&  r  r  r  r  )rQ  draw_bezierr"  rS  rU  )r   rC  rD  r  r  rm  r   r  r  r&  r  r  r  r  r  r  r  r/  r   s                      r)   r  Page.draw_bezier*  sy    ( nnOOE"IuRy%)U2YG

!#-) 	 	 	

7r+   r  radiusc                     U R                  5       nU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.
rm  r   r  r  r  r  r&  r  r  r  )rQ  draw_circler"  rS  rU  )r   r  r  rm  r   r&  r  r  r  r  r  r  r  r  r/  r   s                   r)   r  Page.draw_circle+  sf    " nnOOE&M62

!-) 	 	 	

7r+   c                     U R                  5       nUR                  [        U5      [        U5      [        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  )rQ  
draw_curver"  rS  rU  )r   rC  rD  r  rm  r   r  r  r&  r  r  r  r  r  r  r  r/  r   s                     r)   r  Page.draw_curve<+  ss    & nnNN59eBir;

!#-) 	 	 	

7r+   c                     U R                  5       nUR                  [        U5      [        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
rm  r  r  r  r  r  r&  r  r  r  )rQ  	draw_liner"  rS  rU  )r   rC  rD  rm  r  r  r  r  r  r&  r  r  r  r/  r  s                  r)   r  Page.draw_lineb+  sj      nnMM%)U2Y/

!-) 	 	 	

7r+   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  )rQ  	draw_ovalrS  rU  )r   r   rm  r   r  r&  r  r  r  r  r  r  r  r/  r   s                  r)   r  Page.draw_oval+  s`      nnMM$

!-) 	 	 	

7r+   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  )rQ  draw_polylinerS  rU  )r   rB  rm  r   r  r  r&  r  r  r  r  r  r  r  r/  r   s                   r)   r  Page.draw_polyline+  se    " nnf%

!#-) 	 	 	

7r+   rF  c                     U R                  5       nU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  )rQ  	draw_quadQuadrS  rU  )r   rF  rm  r   r  r  r  r  r&  r  r  r  r  r/  r   s                  r)   r  Page.draw_quad+  sd      nnMM$t*%

!-) 	 	 	

7r+   c                     U R                  5       nU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.
r  r  )rQ  rR  r*  rS  rU  )r   r   rm  r   r  r  r  r  r&  r  r  r  r  r  r/  r   s                   r)   rR  Page.draw_rect+  sh    & nnMM$t*VM4

!-) 	 	 	

7r+   beta
fullSectorc                     U R                  5       nUR                  [        U5      [        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  )rQ  draw_sectorr"  rS  rU  )r   r  rg  r  rm  r   r  r  r&  r  r  r  r  r  r  r  r  r/  r   s                      r)   r  Page.draw_sector,  sq    6 nnOOE&M5<OU

!#-) 	 	 	

7r+   breadthc                     U R                  5       nUR                  [        U5      [        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  )rQ  draw_squiggler"  rS  rU  r   rC  rD  r  rm  r  r  r  r  r  r&  r  r  r  r/  r  s                   r)   r  Page.draw_squiggle?,  sq    " nneBirGD

!-) 	 	 	

7r+   c                     U R                  5       nUR                  [        U5      [        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  )rQ  draw_zigzagr"  rS  rU  r  s                   r)   r  Page.draw_zigzagb,  sn    " nnOOE"IuRy'OB

!-) 	 	 	

7r+   c                 p   U R                   nUR                   n[        U[        R                  5      (       d   e[        R                  " 5       nX&l        [        U5      n[        R                  " XV5      n[        R                  " XHU[        R                  " 5       5        [        R                  " U5        g r-   )r   rB   r   r  r  r  r  rJ  rv  rl  rw  )	r(   ry  r  r  r   rT  r   r  rz  s	            r)   extend_textpagePage.extend_textpage,  s    yyZZ2u001111&&('nnR)4c5>>+;<s#r+   c                 6   [        U 5        U R                  SS9nUR                  (       d  g[        R                  " U5      nUR                  (       d  g[        U5      nSUl        [        R                  " U 5      Ul	        X0R                  [        U5      '   U$ )zFirst annotation.Fr  NT)rn  r  r   r   pdf_first_annotr   r   r  r  r   rW  rX  )r(   r   r   r  s       r)   first_annotPage.first_annot,  sy     	D~~u~-%%d+El]]4(
$'C!
r+   c                 "    U R                  5       $ )z
First link on page
)
load_linksr/   s    r)   
first_linkPage.first_link,  s    
   r+   c                 |   [        U 5        SnU R                  SS9nUR                  (       d  g[        R                  " U5      nUR                  (       d  g[        U5      nSUl        [        R                  " U 5      Ul	        X0R                  [        U5      '   [        5       n[        R                  X45        UnU$ )zFirst widget/field.r   Fr  NT)rn  r  r   r   pdf_first_widgetr   r   r  r  r   rW  rX  rY  r  rZ  )r(   r   r   r  r[  s        r)   first_widgetPage.first_widget,  s     	D~~u~-&&t,El]]4(
$'C!3'
r+   c                    [        U 5        U R                  nUS:w  a  U R                  S5        U R                  n/ nU(       a  SOSn[	        XE5      n[
        R                  " X6[
        R                  " 5       [
        R                  " 5       5        [
        R                  " U5        US:w  a  U R                  U5        U$ )Nr   TF)
rn  ru  r  r   JM_new_bbox_devicer   rv  r{  rl  rw  )r(   layersr  r   r   
inc_layersrz  s          r)   get_bboxlogPage.get_bboxlog,  s    D}}1a yy#T
 "14enn&68HIs#1l+	r+   c                    [        U 5        U R                  nUS:w  a  U R                  S5        U R                  n[	        U[
        R                  5      (       a  [
        R                  " U5      n[	        U[
        R                  5      (       d   SU R                  < 35       eU(       a  SOSn[
        R                  " U5      n [        R                  " XQX#5      nUS:w  a  U R                  U5        [        U5      (       d  Ub  gU$ )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFN)rn  ru  r  r   rB   r   r   r   rr  r  r   get_cdrawingsr   callableJM_new_lineart_device_Devicer{  r  ptmrv  rl  rw  )
r(   extendedcallbackmethodr  r   clipsprectr   rz  s
             r)   r  Page.get_cdrawings,  s    D}}1a yydEMM**<<%D$-->*$))>- e##D)$$TXFB 1l+H!3	r+   c                 (   [        U 5        / n[        U R                  5      nUR                  5       n[        R
                  " U[        R                  5      n[        R                  " U5      (       ag  [        R                  " U5      n[        U5       H@  n[        R                  " XF5      n[        R                  " U5      nUR                  U5        MB     U$ UR                  (       a'  [        R                  " U5      nUR                  U5        U$ )zGet xrefs of /Contents objects.)rn  r   r   r  r   r
  r`  r:  r  rR  r  r  ro   r   )	r(   rK   r   r  r7  rI   rf  icontr  s	            r)   rS
  Page.get_contents,  s    DDII&hhj%%c5+G+GHh''##H-A1X++H8''.

4   
   ##H-DJJ
r+   c                     [        U 5        U(       a!  [        R                  " U R                  5      nO [        R                  " U R                  5      n[        U5      $ )zd
Make a DisplayList from the page for Pixmap generation.

Include (default) or exclude annotations.
)rn  r   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsrX  )r(   r  r  s      r)   get_displaylistPage.get_displaylist,  sA     	D44TYY?B==diiHB2r+   r  c                    SnU R                  US9n[        [        U5      5       GH  nX4   nUS   R                  S5      (       d  [	        US   5      US'   O[	        US   5      US'   US   S:w  a  US   n/ nU H  nUS	   n	US
S n
U	S:X  a#  S[	        U
S	   5      R                  5       U
S
   4nO@U	S:X  a  S[        U
S	   5      4nO)[        U	/U
 Vs/ s H  n[        U5      PM     sn-   5      nUR                  U5        M     XuS'   US   S;   a  U H  nUR                  U5      X['   M     XSW'   GM     U$ s  snf )a  Retrieve vector graphics. The extended version includes clips.

Note:
For greater comfort, this method converts point-likes, rect-likes, quad-likes
of the C version to respective Point / Rect / Quad objects.
It also adds default items that are missing in original path types.
)
r  r   rm  r  r  r  r  r  r  even_odd)r  r   r  r   scissorr4  rF   r   r   Nr3  qur  )r  rR  r;   r7   r*  	normalizer  r   r"  ro   r<   object)r(   r  allkeysr  rf  npathrF   newitemsrG   cmdrestr  DrawpathDrawpathlistget_linearts                  r)   get_drawingsPage.get_drawings	-  s_      ( 3s3xAFE=++F33 $U6] 3f#'i(8#9i V}g%g!Dq'C8Dt $d47m&=&=&?aI $d47m4$cU-E1eAh-E%EFOOD) " "*gV}
* A$yy|EH ! F1 !2 
 .Fs   D;hashesr  c                 @   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(       d0  U 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	[        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_infoN)r  r  r   r  r  )r   r  r   r#  TEXT_PRESERVE_IMAGESextractIMGINFOr  
get_imagesr  r  rR  r;   r<   )r   r  r  r0  imginforT  imglistr  rG   r  r  rf  s               r)   get_image_infoPage.get_image_info-  s    kkSZZFzzE$t45N"")=">B''v'6G#* CJJN//#D7D#C"&CJJ	 
 s7|$A:D;;tH~q1DLAJ	 %
 r+   c                 z   [        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[        U R                  U5      nUR                  nAU R                  SS9nU(       d*  U V	s/ s H  oS   U:X  d  M  [        U	S	   5      PM     n
n	U
$ U V	s/ s H*  n	U	S   U:X  d  M  [        U	S	   5      [        U	S
   5      4PM,     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  bad image namer   zmultiple image names foundTr  r  r5  r  )r   r   r   r8   r  r   r;   r  r   r  r  r*  r~  )r   r   r  r  rf  r  r  r  infosimbboxess              r)   get_image_rectsPage.get_image_rects-  sL    :$&7D$Z3D"&//"3D"3Qtt|q"3GD"} !122W" !=>>1:a=DT[[$'##4#016Q2X,&:P&d2f:&FQ   Bh<6) <bj!6"[/#:;  
 % E Rs$   D.D.D3D39D8
 D8c                     U R                   R                  5       nU(       d  gUR                  5         [        R                  " 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`   )r   r  r  r
  rt  r8  )r   rL  s     r)   	get_labelPage.get_label.  s<     --/""4;;77r+   c                    [        U 5        U R                  n/ nU(       aF  [        R                  " XR                  5      nUR                  U5        UR                  nU(       a  MF  U/ :w  a  U R                  R                  (       a  [        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   r  r   rX  )rn  r  r
  r  r   ro   r\  r  r:  r   r  r;   rR  )r   lnr)  nlrb  	linkxrefsrf  s          r)   r  Page.get_links$.  s     	D__""2{{3BLLB b B;4;;-- ,D11  ! tu333 1  
 9~U+s9~.A'0|AEHV$%.\!_EHTN / s   D	4D	rz  r  r  r  r  r  r  c                   Uc  [         nU(       a  US-  n[        Xw5      n[        U5      [        L a<  UR	                  5       S:X  a  [
        nO!UR	                  5       S:X  a  [        nO[         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
Nr  r6  r8  r  zunsupported colorspace)r  )r  r  r  r  )r  r~  r   r   rr
  r  r  rI   r   r  r  r  )
r   r  r  r  r  r  r  r
  r  r  s
             r)   r  Page.get_pixmap>.  s    ( J8DD'F
s"!V+#
!!#v-#
"
<<y(566!!!0mm6mYKK!
r+   c           	      ~   U R                   nUS:X  a  [        $ U R                  nUS:X  aB  [        SSSSUR                  UR
                  -
  UR                  -
  UR                  -
  S5      nOrUS:X  aB  [        SSSSSUR
                  UR                  -
  UR                  -
  UR                  -
  5      nO*[        SSSSSUR                  -  SUR                  -  5      nX0R                  -  n[        [        U5      5      S-   nUR                  S5      n[        R                  XS5      nUS	;   a.  Uu  pxpXl        Xrl        Xl        Xl        U R                  U5        U R                  S5        U) nU R!                  5        H#  nUR"                  U-  nUR%                  U5        M%     U R'                  5        H2  nUS
   U-  nU R)                  U5        XS
'    U R+                  U5        M4     U R/                  5        H(  nUR"                  U-  nXl        UR1                  5         M*     U$ ! [,         a     M  f = f)z;Set page rotation to 0 while maintaining visual appearance.r   r  r     r  z cm r  Fr  r,  r  )ru  r|  r6  r~  r  r  r  r  rt  r   r   r  r  _insert_contentsset_mediaboxr  r  r   r  r  rQ
  insert_linkrk   r  rG  )r(   ry  r  mat0r  r  r9  r  r  r  r  r   r#  r  r[  s                  r)   remove_rotationPage.remove_rotationi.  s   mm!8 ]]"9!Q1beebeembee&;bee&CQGDCZ!Q1a)>)FGD!Q1b255j"ruu*=D +++c
#f,jj ""4e4 )NBBEEEEb!!d[[]E

S ANN1 # NN$DVs"AT"L  & % llnFc!AKMMO % 
  s   H..
H<;H<x_tolerancey_tolerancefinal_filterc                   ^^ [        U 5        U R                  nUb  [        U5      nUmUmUc  U R                  5       nUU4S jnU Vs/ s H  n US   R                  UR                  :  d  M#  US   R
                  UR
                  ::  d  MB  US   R                  UR                  :  d  Ma  US   R                  UR                  ::  d  M  UPM     n	n[        U	 Vs/ s H  oS   PM	     snS S9n
/ nU
(       a  U
S   7nSnU(       ac  Sn[        [        U
5      S-
  SS	5       H;  nU" X   U5      (       d  M  XU   R                  -  nXU   R                  -  nX	 SnM=     U(       a  Mc  UR                  U5        U
S	 [        [        U
5      S
 S9n
U
(       a  M  [        [        U5      S S9nU(       d  U$ U Vs/ s H(  oR                  T:  d  M  UR                   T:  d  M&  UPM*     sn$ s  snf s  snf s  snf )aJ  Join rectangles of neighboring vector graphic items.

Args:
    clip: optional rect-like to restrict the page area to consider.
    drawings: (optional) output of a previous "get_drawings()".
    x_tolerance: horizontal neighborhood threshold.
    y_tolerance: vertical neighborhood threshold.

Notes:
    Vector graphics (also called line-art or drawings) usually consist
    of independent items like rectangles, lines or curves to jointly
    form table grid lines or bar, line, pie charts and similar.
    This method identifies rectangles wrapping these disparate items.

Returns:
    A list of Rect items, each wrapping line-art items that are close
    enough to be considered forming a common vector graphic.
    Only "significant" rectangles will be returned, i.e. having both,
    width and height larger than the tolerance values.
c                   > U R                   U R                  :  a  U R                  U R                   4OU R                   U R                  4u  p#U R                  U R                  :  a  U R                  U R                  4OU R                  U R                  4u  pEUR                   UR                  :  a  UR                  UR                   4OUR                   UR                  4u  pgUR                  UR                  :  a  UR                  UR                  4OUR                  UR                  4u  p X6T
-
  :  d  X'T
-   :  d  XXT-
  :  d  XIT-   :  a  gg)zDetect whether r1, r2 are "neighbors".

Items r1, r2 are called neighbors if the minimum distance between
their points is less-equal delta.

Both parameters must be (potentially invalid) rectangles.
FTr  r  r  r  )r1r2rr1_x0rr1_x1rr1_y0rr1_y1rr2_x0rr2_x1rr2_y0rr2_y1delta_xdelta_ys             r)   are_neighbors,Page.cluster_drawings.<locals>.are_neighbors.  s     02uuruu}beeRUU^255"%%.NF/1uuruu}beeRUU^255"%%.NF/1uuruu}beeRUU^255"%%.NF/1uuruu}beeRUU^255"%%.NFW,,W,,W,,W,,  r+   r   r   c                 2    U R                   U R                  4$ r-   r  r  r#  s    r)   r
  'Page.cluster_drawings.<locals>.<lambda>.  s    144,r+   r
  r   TFr  c                 2    U R                   U R                  4$ r-   rI  rJ  s    r)   r
  rK  .  s    add|r+   c                 2    U R                   U R                  4$ r-   rI  rJ  s    r)   r
  rK  .  s    !$$r+   )rn  r   r*  r  r  r  r  r  rR  rR  r;   r#  r$  ro   r  r  r0  )r(   r  drawingsr4  r5  r6  parearF  r  pathsprects	new_rectsr#  repeatrf  rD  rE  s                  @@r)   cluster_drawingsPage.cluster_drawings.  s   0 	D		JE((*H	: 
&	(  &	(	 
 &	(  &	(  	 
 E2Eq6E28NO	
 
AFs6{Q26A$VY22AY\\)AY\\)"I!% 7 & Qq	CK-CDF f  3y>/EF	$Q9a'(9ahh>P9QQK
 34 Rs6   
"G20G2G2.G2G2G7 G<G<)G<c                 `    [        U 5        U R                  R                  U R                  US9$ )z)List of fonts defined in the page object.r-  )rn  r   ri  r8  r(   rf  s     r)   	get_fontsPage.get_fonts/  s(    D{{))$++D)AAr+   c           	         [        U 5        U R                  nUR                  (       d  UR                  (       a  [	        S5      e[        SSSS5      n[        5       nU(       a  XE4nOUn[        U5      [        [        4;   a#  [        US   5      [        La  [	        S5      eUnOjUR                  U R                  S5       Vs/ s H  oUS   :X  d  M  UPM     n	n[        U	5      S:X  a  U	S   nOU	/ :X  a  [	        S5      e[	        S	U-  5      eUS   n
U
S:w  d  U(       a   U R                  XrS
9S   $ U R#                  5       n[%        U5      n['        U5      (       d  U$ U H  nUS   US   :w  a  M  [)        US   5      nUR*                  nUS:X  a  Un  UnU$ [        [-        UR.                  UR0                  5      5      n[3        UR.                  UR4                  -
  5      n[3        UR6                  UR4                  -
  5      n[        SU-  SSSU-  SS5      nUU-  ) nUU4n  UnU$    UnU$ s  snf ! [         a    [!        5         Us $ f = f)zGet rectangle occupied by image 'name'.

'name' is either an item of the image list, or the referencing
name string - elem[7] of the resp. item.
Option 'transform' also returns the image transformation matrix.
r  r   r  z!need item of full page image listTr  r   r  z!found multiple images named '%s'.)r  )rn  r   r   r  r   r*  r~  r   r   r   r8   rm  r8  r;   r  rk   rz   r  JM_image_reporterrw  r  r   util_hor_matrixlllrr%  r  ur)r(   r   r  r0  inf_rectnull_matr   rG   rf  r  r  r  r  rJ   r!  r5  hmr  r   m0r  s                        r)   get_image_bboxPage.get_image_bbox/  sJ    	Dkk==C,,;<<1b"%8%BB:$&R>S( !DEED"%"5"5dkk4"HY"HQTUVWTXLq"HGY7|q qzB !122 !Dt!KLLBx19	 ++D+FqII >>#)CyyIAttBxQqT
A66DA~ 
 add34BADD144K AADD144K AAq!QUAq1Br'
AB
%   
M Z     s   H4H4#H9 9IIc                 `    [        U 5        U R                  R                  U R                  US9$ )z*List of images defined in the page object.r-  )rn  r   rm  r8  rW  s     r)   r  Page.get_imagesG/  s(    D{{**4;;T*BBr+   c                     / nU R                  5        HF  u  p#U R                  R                  USS9nSU;   a  SnOSU;   a  SnOM3  UR                  X#U45        MH     U$ )zGet OCGs and OCMDs used in the page's contents.

Returns:
    List of items (name, xref, type), where type is one of "ocg" / "ocmd",
    and name is the property name.
TrG  re  rr  rV  ocmd)rf  r   rJ  ro   )r(   r   pnamer  r   octypes         r)   get_oc_itemsPage.get_oc_itemsL/  sl     88:KE;;**4D*ADd"%IIuF+, ; 	r+   c                    [        U 5        [        R                  " U R                  5      n[	        U5      nUnUS:X  a  [        R
                  O[        R                  n[        R                  " XT5      n[        R                  " S5      n[        R                  " U5      n[        R                  " UUR                  UR                  -
  UR                  UR                  -
  US5      n	[        R                  " U R                  X[        R                   " 5       5        [        R"                  " U	5        UR%                  5         ['        U5      n
U
$ )zMake SVG image from page.r      )rn  r   rr  r   r  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr  r	  r	  fz_new_svg_devicer  r  r  r  rv  rl  rw  r	  r  )r(   r  text_as_pathr6  r  tboundstext_optionr$  r	  rz  r   s              r)   get_svg_imagePage.get_svg_image_/  s    D&&tyy1'3?13De//%JcJc))'7!!$'nnS!%%

7::%

7::% 	$))Su~~/?@c"%c*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$ )Nr   not a textpage of this page)r#  r   r   extractTextbox)r   r   r  rT  r   s        r)   r  Page.get_textboxw/  sU    
 :""$BR"d*:;;t$	r+   c                 6    [         R                  " U /UQ70 UD6$ r-   r	  r  s      r)   r  Page.get_text/  r  r+   c                 6    [         R                  " U /UQ70 UD6$ r-   )r
  get_text_blocksr  s      r)   r  Page.get_text_blocks/  s    $$T;D;F;;r+   c                 6    [         R                  " U /UQ70 UD6$ r-   )r
  get_text_selectionr  s      r)   r  Page.get_text_selection/  s    ''>t>v>>r+   c                 6    [         R                  " U /UQ70 UD6$ r-   )r
  get_text_wordsr  s      r)   r  Page.get_text_words/  s    ##D:4:6::r+   c                 6    [         R                  " U /UQ70 UD6$ r-   )r
  get_textpage_ocrr  s      r)   r  Page.get_textpage_ocr/  s    %%d<T<V<<r+   r  r  c                 V   [        U 5        Uc  [        SS5      nU R                  nUS:w  a  U R                  S5         U R	                  XUS9nUS:w  a  U R                  U5        [        U5      n[        R                  " U 5      Ul        U$ ! US:w  a  U R                  U5        f f = f)Nr   r   )r  r  )	rn  r~  ru  r  r{  r  r  r  r   )r(   r  r  r  r  r  s         r)   r#  Page.get_textpage/  s    D>Aq\F}}1a 	0))$F)KHq !!,/H%!---	 q !!,/ !s   B B(c                    [        U 5        U R                  nUS:w  a  U R                  S5        U R                  n/ n [
        R                  " U5      n[        R                  " U5      n[        R                  " SSSSSUR                  5      Ul        [        R                  " X$[        R                  " 5       [        R                  " 5       5        [        R                  " U5        US:w  a  U R                  U5        U$ Nr   r   r  )rn  ru  r  r   r  r   JM_new_texttrace_devicer   rr  r{  r  r  rv  rl  rw  )r(   r  r   r   rz  r  s         r)   rB  Page.get_texttrace/  s    D}}1a yy//3C ##D)..Aq"a:$U^^%5u~~7GHc"1l+	r+   c                 b    [        U 5        U R                  R                  U R                  5      $ )z,List of xobjects defined in the page object.)rn  r   r  r8  r/   s    r)   get_xobjectsPage.get_xobjects/  s#    D{{,,T[[99r+   r  c                 d   U R                   nUc  [        S5      eSnUR                  S5      (       a  USS  n[        R	                  U5      n	U	[        5       :w  a  [        SU	 35      e[        X5      n
U
b*  U
S   n[        X{5      (       a  U$ UR                  U5        U$ [        R                  UR                  5       S 5      nSnSn/ SQn/ SQn UR                  U5      nSnUS:  a   UR                  U5      nSnUR                  5       [         R#                  5       ;   a  SS KnUR'                  U5      nAUb[  [)        U5      [*        L a  UnOH[-        US	5      (       a  [+        U5      nO+[-        US
5      (       a  UR.                  nO[        S5      eS nU R1                  XUX4UX]Xn5
      nU(       d  U$ US   nUS   n[        X{5      (       a  U$ UR                  UUS9  U$ ! [         a    [        S:  a
  [        5          GN$f = f! [         a    [        S:  a
  [        5          GN/f = f)Nr  r   rQ	  r   zbad fontname chars r  )r  r  r  r  )r  china-ssjapan-skorea-sr  r   zbad fontfile)r  )r   r   r7   r  r  r  	CheckFontr&  r0  r  r<   r  r  rk   r  rz   r  ry  r  r  r   r   r?   r   r  )r(   r   r  r  r  r  r   r0  r  	inv_charsr  r  r  r  
CJK_number
CJK_list_n
CJK_list_sr  fontfile_strr  r  s                        r)   insert_fontPage.insert_font/  s?   kk;>??s##|H&33H=	29+>??(7DS''%K !$$X^^%5t<
=
C
	#))(3JE >'--h7
 >>388:: &--h7J H~$':.."8}6**'}} 00LxzWZ$XC J1vq6##K 	D84[  	#a'N,<	  '!+0@s$   G( ,H (H
	H
H/.H/)	css	scale_lowarchiver_  r  r\  r  _scale_word_width_verbosec       	   	        ^ 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[        U5      nUS	;   a#  [        SSUR                  UR                  5      nO"[        SSUR                  UR                  5      nS
U-   n[	        U[
        5      (       a  [        X-US9nO#[	        U[        5      (       a  UnO[        S5      eUS:X  a  SOSU-  nUR                  USUU
(       a  [        R                  OSUS9mTR                  (       d  STR                  -  nSU4$ [        TR                  5      Tl        TR                  R                  TR                  R                  4S:X  d   eTR                  R                  TR                  R                  4S:X  d   eSTR                  -  nUU:  d   SU< SU< 35       e[!        TR                  R"                  TR                  R"                  -
  U-  S5      nU4S jnUR%                  U5      nSUs=::  a  S:  aB  O  O?US   nUR'                  XS9nSU S3n[(        R+                  UUR-                  5       S5        U R/                  UUSXgU	S9  TR                  R0                  TR                  R2                  -   S-  U-  nUR0                  UR2                  -   S-  n[5        USSUUR6                  * UR8                  * 5      [5        U* 5      -  [5        SSSSUR6                  UR8                  5      -  nUS   R;                  5        H!  nUS==   U-  ss'   U R=                  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.
    _scale_word_width: internal, for testing only.
    _verbose: internal, for testing only.
Returns:
    A tuple of floats (spare_height, scale).
    spare_height:
        The height of the remaining space in <rect> below the
        text, or -1 if we failed to fit.
    scale:
        The scaling required; `0 < scale <= 1`.
        Will be less than `scale_low` if we failed to fit.
r  r   zbad rotation angler  r   z'scale_low' must be in [0, 1]Nr`   r-  zbody {margin:1px;})htmluser_cssr  z"'text' must be a string or a Story)	scale_min	scale_maxr  r
  r  r  z
scale_low=z scale=c                  6   > TR                   TR                   S 4$ r-   r  )r  fits    r)   rect_function*Page.insert_htmlbox.<locals>.rect_functiony0  s    88SXXt++r+   r<  r=  rQ	  z gs
)r_  r  r  r   r  )r   r*  r0  r  rB   r   Story	fit_scaler   FZ_PLACE_STORY_FLAG_NO_OVERFLOW
big_enough	parameterfilledr   r  r  r   r  write_with_linksr  r  r.  r  show_pdf_pager#  r$  r~  rb  rc  r  r0  )r   r   r   r  r  r  r_  r  r\  r  r  r  	temp_rectmycssstoryrect_scale_maxr=  spare_heightr  r0  ry  ri  r  mp1mp2r  r  r  s                              @r)   insert_htmlboxPage.insert_htmlbox0  s]   T {a122qjcMF qjmcMF m I""<==;CDzYQ4;;

;IQ4::t{{;I %s* dC  tWEEe$$EABB "+aQ]oo(?Pe;;VW    ~~%E; #**%
SXX[[)V333

szz}}-777CMM!	!;ji\5(#;;!CHHKK#**--75@!D	, $$]3 !FE%%%=DD6A""5!((*a8 	4awO xx{{SXX[[(A-5 ww A% 5!Qvv6fWoQ1a./ 	 F$$&DLCLT" ' U""r+   )r  rj   r0  r  r  r  r  r  r_  r   r  r  c                   [        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      ["        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[%        U5      nUR&                  (       d  UR(                  (       a  [        S5      eXR*                  ) -  nUR-                  U R.                  5       Vs/ s H  nUS   PM
     nnUUR1                  U R.                  5       Vs/ s H  nUS   PM
     sn-  nUUR3                  U R.                  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 R5                  5         UR6                  nU R9                  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, streamr  r   zbad filenamezNo such file: '%s'z#stream must be bytes-like / BytesIOzpixmap must be a Pixmapz mask requires stream or filenamez!mask must be bytes-like / BytesIOr  )r   r  rx  r,  bad rotate value!rect must be finite and not emptyr  ro  fzImgr~   )rj   r  r   r  r  r  r  r  r_  r  r  r0  r  r  r  )rn  r   r  r   rw  r   r   r?   r   rh   r	   r  r  r  r  r=   r  r  r*  rv  ru  rs  rm  r8  r  ri  r  r  r  )r   r   r  rj   r0  r  r  r  r  r  r_  r   r  r  r0  r#  r  rf  ilstrI   r  r  s                         r)   insert_imagePage.insert_image0  s   ` 	Dkkzz[))19$x.4<7$v,F!KSTTH~$:..x=6**#== 00BGGNN844#$88$CDDVUIrzz,JJBCCVF26778?@@DJui&DD@AAqjcMF qjmcMF m**/00J::@AA.... "11$++>?>!>?s44T[[ABA!1ABBs11$++>?>!1>??s7$FA3q6zH $  $$**+ + 
g" !(CC @B?s   MM9Mr  rF	  c                     [        U 5        [        R                  " 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`   link kind not supportedN)rn  r
  getLinkTextr   r  )r   r  rF	  r   s       r)   r0  Page.insert_link!1  s=    D!!$,B;677!!5(+r+   皙?)r   r  r   r  r  r   rm  r   rC  miter_limitrender_moder_  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   rm  r   rC  r  r  r_  r&  r  r  r  r   )rQ  r  rU  )r   rg  r   r   r  r   r  r  r   rm  r   rC  r  r  r_  r&  r  r  r  r  r/  r   s                         r)   r  Page.insert_text)1  ss    0 nn__!!%##)%%  
( 7JJw	r+   )r   r  r  r   r   r  rm  r   
expandtabsr  r_  r  r  rC  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   rm  r   r  r  r  rC  r  r_  r&  r  r  r  r   )rQ  rT  rU  )r   r   r	  r   r  r  r   r   r  rm  r   r  r  r_  r  r  rC  r&  r  r  r  r  r/  r   s                           r)   rT  Page.insert_textboxZ1  s|    Z nn!!!##%)%)   
, 7JJw	r+   c                 (    U R                  5       S:H  $ )z3Check if /Contents is in a balanced graphics state.r  )rb  r/   s    r)   r~  Page.is_wrapped1  s     $$&&00r+   c                     [        U R                  SS9nUR                  (       d  g[        R                  " UR                  5       [        S5      5      nUR                  (       d  g[        R                  " U5      $ )zPage language.Fr  NLang)r   r   r   r   r  r  r  pdf_to_str_buf)r(   r  rG  s      r)   rH  Page.language1  sX     tyy59!!--gkkmXf=MN##D))r+   c              #   b   #    U R                  5       nU H  nUb  US   U;   d  M  Uv   M     g7f)zGenerator over the links of a page.

Args:
    kinds: (list) link kinds to subselect from. If none,
           all links are returned. E.g. kinds=[LINK_URI]
           will only yield URI links.
Nr  )r  )r(   kinds	all_linksr  s       r)   r)  
Page.links1  s2      NN$	D}V 5 s    /	/identc                 4   [        U 5        [        U5      [        L a  SnUnO"[        U5      [        L a  UnSnO[	        S5      eU R                  X25      nU(       d  U$ SUl        [        R                  " U 5      Ul	        X@R                  [        U5      '   U$ )zhLoad an annot by name (/NM key) or xref.

Args:
    ident: identifier, either name (str) or xref (int).
r   Nz&identifier must be a string or integerT)rn  r   r   r8   r   r  r   r  r  r   rW  rX  )r(   r  r  r   r  s        r)   r>  Page.load_annot1  s     	D;#DD%[CDDEFFt*J]]4(
$'C!
r+   c                 8   [        U 5        [        R                  " U R                  5      nUR                  (       d  g[        U5      nSUl        [        R                  " U 5      Ul	        XR                  [        U5      '   SUl        SUl        U R                  R                  (       a\  U R                  5       nU Vs/ s H  o3S   [        R                  :X  d  M  UPM     nnU(       a  US   nUS   Ul        US   Ul        U$ SUl        SUl        U$ s  snf )zGet first Link.NTr   r`   r   r   )rn  r   fz_load_linksr   r   rb  r   r  r  r   rW  rX  r  r  rx  r  )r(   r  r  rb  link_ids        r)   r  Page.load_links1  s    D!!499-~~Cj]]4(
$'C!;;$$&E %F111E1E)EQEF("1:  
 CHCF
 Gs   ?DDc                 &   [        U 5        [        U R                  5      n[        X!5      nUnU(       d  U$ SUl        [
        R                  " U 5      Ul        X@R                  [        U5      '   [        5       n[        R                  XE5        UnU$ )zLoad a widget by its xref.T)rn  r   r   JM_get_widget_by_xrefr   r  r  r   rW  rX  rY  r  rZ  )r(   r  r   r   r  r[  s         r)   load_widgetPage.load_widget1  sw    DDII&%t2J]]4(
$'C!3'
r+   c                     [        U 5        U R                  SS9nUR                  (       d!  [        R                  " U R
                  5      nO[        UR                  5       5      n[        U5      $ )zThe MediaBox.Fr  )	rn  r  r   r   rr  r   JM_mediaboxr  r*  )r(   r   r   s      r)   r6  Page.mediabox2  sQ     	D~~u~-&&		2D
+DDzr+   c                 j    [        U R                  R                  U R                  R                  5      $ r-   )r"  r6  r  r  r/   s    r)   mediabox_sizePage.mediabox_size2  s#    T]]%%t}}'7'788r+   c                     [        U 5      $ r-   )Shaper/   s    r)   rQ  Page.new_shape2      T{r+   c                 ,    [         R                  U 5      $ )z7All /Contents streams concatenated to one bytes object.)r  _get_all_contentsr/   s    r)   read_contentsPage.read_contents2  s    &&t,,r+   c                 `    [        U 5        U R                  nUR                  U 5      nX l        g)z-Refresh page after link/annot/widget updates.N)rn  r   r	  r   )r(   r0  r   s      r)   refreshPage.refresh 2  s&    Dkkt$	r+   )rj   r  r   c                r   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        SU l	        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)rj   r   r  r  r  N)
r   r  r   rw  r  r   rr  rS
  rU
  r  )r   r  rj   r  r   r0  r'  last_contents_xrefs           r)   r  Page.replace_image(2  s    . kk  &&011>DL(4<71<RSS$$II % 
 	h%!..04 	,d3r+   c                 z    [        U 5        [        U R                  SS9nUR                  (       d  g[	        U5      $ )zPage rotation.r   r  )rn  r   r   r   JM_page_rotationr6  s     r)   ru  Page.rotationN2  s1     	DDII2%%r+   c                 >    [        [        R                  U 5      5      $ )zReflects page rotation.)r~  r  _rotate_matrixr/   s    r)   rx  Page.rotation_matrixW2  s     e**4011r+   c                     [        U 5        [        R                  " U R                  UR                  [        U5      [        R                  " 5       5        g)z-Run page through a device.
dw: DeviceWrapper
N)rn  r   rv  r   rR  r  rl  )r(   rm  r  s      r)   ro  Page.run\2  s5     	D$))RYY0A!0DennFVWr+   )r  rZ
  r  r  c                    Uc  S[         -  [        -  [        -  [        -  nUb  [	        U5      n[        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  r  r   rz  )rZ
  )
r\
  r^
  r]
  r_
  r*  rn  r#  r   r   search)r   r   r  rZ
  r  r  rT  rlists           r)   r`
  Page.search_forc2  s    ( ="#*+ ** %	%E :DD:""":BR"d*:;;		$	,r+   c                 &    U R                  SU5      $ )zSet the ArtBox.r  r  r(   r   s     r)   
set_artboxPage.set_artbox2  s      400r+   c                 &    U R                  SU5      $ )zSet the BleedBox.r  r	  r
  s     r)   set_bleedboxPage.set_bleedbox2  s      T22r+   c                 v   [        U 5        U R                  nUR                  (       a  [        S5      eUR                  (       d  [        S5      eU[        SUR                  5       5      ;  a  [        S5      eUR                  U5      (       d  [        S5      eUR                  U R                  SSU-  5        g)	z-Set object at 'xref' as the page's /Contents.r   r~  r   rU  zxref is no streamrL  r
  N)
rn  r   r   r   r  rR  r[  rp  r  r  )r(   r  r0  s      r)   set_contentsPage.set_contents2  s    Dkk==.//zz[))uQ 122Z((!!$''011J4@r+   c                 &    U R                  SU5      $ )z,Set the CropBox. Will also change Page.rect.r  r	  r
  s     r)   set_cropboxPage.set_cropbox2        D11r+   c                    [        U 5        [        U R                  5      nU(       d/  [        R                  " UR                  5       [        S5      5        g[        R                  " U5      n[        [        S5      (       d   e[        R                  " UR
                  [        S5      [        R                  " U5      5        g)zSet PDF page default language.r  rC  N)rn  r   r   r   rG  r  r  r  r?   r  rC  )r(   rH  r  rG  s       r)   r  Page.set_language2  s    Dtyy)w{{}hv.>?55h?D5"ABBBB**KKV$77=r+   c                    [        U 5        U R                  5       n[        U5      n[        R                  " U5      (       d  [        R
                  " U5      (       a  [        [        5      e[        R                  " UR                  5       [        S5      U5        [        R                  " UR                  5       [        S5      5        [        R                  " UR                  5       [        S5      5        [        R                  " UR                  5       [        S5      5        [        R                  " UR                  5       [        S5      5        g)zSet the MediaBox.MediaBoxr  r  r  r  N)rn  r  r  r   r  r  r   r  r2  r  r  rG  )r(   r   r   r6  s       r)   r/  Page.set_mediabox2  s    D~~"4(""8,,,,X66l++Xj-A8LDHHJ(;<DHHJ(:;DHHJ(<=DHHJ(;<r+   c                     [        U 5        [        U R                  5      n[        U5      n[        R
                  " UR                  5       [        S5      U5        g)zSet page rotation.r:  N)rn  r   r   JM_norm_rotationr   rO  r  r  )r(   ru  r   ry  s       r)   r  Page.set_rotation2  s?    DDII&x(
HX,>Dr+   c                 &    U R                  SU5      $ )zSet the TrimBox.r  r	  r
  s     r)   set_trimboxPage.set_trimbox2  r  r+   c	                 "   SS jn	[        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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  [#        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 'docsrc' in rectangle 'rect'.

Args:
    rect: (rect-like) where to place the source image
    docsrc: (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           	         U R                   U R                  -   S-  nUR                   UR                  -   S-  n[        SSSSUR                  * UR                  * 5      [        U5      -  nX-  nUR
                  UR
                  -  nUR                  UR                  -  n	U(       a  [        X5      =pU[        X5      -  nU[        SSSSUR                  UR                  5      -  n[        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.
       @r   r   )	r#  r$  r~  rb  rc  r  r0  r  JM_TUPLE)
srtrrl  r_  smptmpr  sr1fwfhs
             r)   calc_matrix'Page.show_pdf_page.<locals>.calc_matrix2  s      55255=C'C55255=C'C q!QCEE6CEE62VF^CA&CCII%BSZZ'Bb+%A1aCEE35511AA;r+   r~  r  z!clip must be finite and not empty)rl  r_  r   r  ro  fzFrmr~   z%source document must not equal targetN)r  r  r  r  r  rz  r  )Tr   )rn  r   r  r   rv  ru  ru  rs  r   r  r8  rm  ri  r   r  r  r<   r  r  r  r  )r   r   r  rz  r  r  r  r_  r  r-  r0  r  tar_rectsrc_rectr  rf  r  rI   r  isrcgmappno_idr  s                          r)   r  Page.show_pdf_page2  sj   2 	D 	Dkkzz[))==D,,@AAAg$$$C Ag;5555(,8==(--$2F 4 4@AA====XoU "33DKK@A@!@As224;;?@?!1?@@s11$++>?>!1>?? s7$FA3q6zH $ ==D DEE }}  t,<C=D"&CMM$ ~~!!&!, "" # 	
 "&vQ B@?s   (JJJc                    [        U 5        [        R                  " 5       nU R                  SS9nUR                  (       d  [        U5      $ [        R                  " [        R                  R                  5      n[        R                  " X#U5        [        U5      nU R                  S-  S:X  a  [        U5      nU$ [        SSSSSU R                  R                  5      nU$ )zPage transformation matrix.Fr  r  r   r   r  )rn  r   r{  r  r   rz  rp  r1  r]  ru  r~  r|	  r0  )r(   r  r   r6  r  s        r)   rs  Page.transformation_matrixK3  s     	Dnn~~u~-$S))<< 7 78  5$==3!#+C 
 Aq"a)<)<=C
r+   c                     U R                  S5      nUc  U R                  $ U R                  n[        US   UR                  US   -
  US   UR                  US   -
  5      $ )zThe TrimBoxr  r   r   r   r   ro  rp  s      r)   trimboxPage.trimbox^3  s[     y)<<<]]DGRUUT!W_d1gruutAwGGr+   c                     [        U 5        [        R                  " 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`   r  r  r   N)rn  r
  r  r   r   rK  )r   r  r   s      r)   update_linkPage.update_linkg3  sH    D!!$,B;677!!#f+u!@r+   c              #      #    U R                  5        Vs/ s H   o"S   [        R                  :X  d  M  US   PM"     nnU H-  nU R                  U5      nUb  UR                  U;   d  M)  Uv   M/     gs  snf 7f)zGenerator over the widgets of a page.

Args:
    types: (list) field types to subselect from. If none,
            all fields are returned. E.g. types=[PDF_WIDGET_TYPE_TEXT]
            will only yield text fields.
r   r   N)rx  r   rS  r  rL  )r(   r@  r    widget_xrefsr  r[  s         r)   r  Page.widgetsp3  sr      '+&6&6&8[&8aDEDZDZ<Z!&8[ D%%d+F} 1 1U : ! \s   A7A2	A2)A7)A7c                     U R                  5       u  pUS:  a  SU-  n[        R                  XS5        US:  a  SU-  S-   n[        R                  XS5        gg)z,Ensure page is in a balanced graphics state.r   r  Fs   
Qr	  TN)rb  r  r.  )r(   pushpopprependro   s        r)   r  Page.wrap_contents3  s\    ))+	!8tmG""4%87c\E)F""46 r+   c	                    [        U [        5      (       d   eU(       d  [        S5      e[        U5      [        L a  US:X  a  Uc  UR                  XXCS9  gU4nUS   R                  n	[        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)r\  rm  r  rk	  )r\  rm  )r  r  r_  r  r  )rB   r   r   r   
TextWriter
write_text	text_rectr   r  r   r  r0  r  )r   r   writersr  rm  r\  r  r_  r  r  textdocry  writers                r)   rH  Page.write_text3  s   * $%%%%CDD=J&{t|""4"W"*qz##*  tyytyy?O?O PF$$$DeEB  <D+ 	 		
 r+   c                 b    [        U 5        U R                  R                  U R                  5      $ rh  ri  r/   s    r)   r  	Page.xref3  rk  r+   zpage rectangle)r0  )rW  r  r  rj  r8  r   r   r   rp  r  r-   )Nr   N)NNNNNr   r   r   r   r   r   r   r  NN)r   r   Nr%  )Nr   r   N)r   Nr   r   NNNrr  )NNr  r   NNT)Note)r   r   r   ro  )rn  NNr   NFr   r   Tr   r   r   )rn  NNNr   r   r   Tr   r   r   )
rn  Nr   r   r   TNr   r   r   )rn  NNr   Nr   r   TFr   r   r   )rn  NNr   r   r   NTr   r   r   )rn  NNr   r   r   NTr   r   r   N)rn  NNTNr   Fr   r   Tr   r   r   )r   rn  Nr   r   r   TNr   r   r   r   Nrt  r  )NNr   r   Tr  )r  NNFr   r   )r   TTr   r   N)NNTNNTr   r   )r   r   rs  N)r1   r2   r3   r4   r   r   r   r  r  r   PDF_ANNOT_LE_OPEN_ARROWr  r  r  r  r"  r%  r>  rA  rE  r  rP  rZ  r   rb  r  rt  rk  rf  r{  r  r  r  r  r  r  r]  r  r  rg  r  r   r   r  r   r  r  r   r  r  rv  r8   r  r  r   r	  r  r  r  r  rw  r  r!  r$  r(  r+  r/  rY  r2  r7  rx  r  rR
  r	  rg  rl  rs  rq  rt  r{  r  r|	  r  r  r  rQ
  r  r~  rt  r"  r  r  r  r  r  r  r   r  r  r  rR  r  r  r  r  r  r  r  r  r  rS
  r  r  r  r  r"  r  r|  r   r+  r  r2  rT  rX  re  r  rm  rw  r   r  r  r  r  r  r  r#  rB  r  r  r   r  r  r9   r0  ru  r  rT  r~  rH  r)  r>  r  r  r6  r  rQ  r  r  r  ru  rx  ro  r`
  r  r  r  r  r  r/  r  r   r  rs  r9  r<  r  r  rH  r  r   rj  r5   r.   r+   r)   r   r   %  s    2"< 22!N`@	<
BH DD
F0 6 .4 GKJK59j"X* 	%:!BL*97rZ E 	Y 	5 	   $   	
    <  " $ $"&!" !77%.. .
 . . . . !.  . . . . . .  !.& '.` 59*.38 % 	 	 	 		 	 		 	% 		9 	 	 " $!< < 	<
 < < < < < <@ B B	I 	5 	DSX D	J 	c 	 	QV 	CSX C E $	*-( 	mmm m 	m
 m^;,. H H H H$C 
 
  .-6 - -*XF F v  86 8 8 !! # $%"##%%% % 	%
 % % % % % % % % % % "%   !%" #%$ %%V ! ! $%"#      	 
               "        N !! # $%"#!$$$ $ 	$
 $ $ $ $ $ $ $ $ $ "$  $  !$" #$T !!  $%"#      	 
             "      J !!  $%"#  ,,y)34    	 
             "        J !!  #$%"#""" " 	"
 " " " " " " " ""  " " "N !!  $%"#      	 
             "        J !!  $%"#### # 	#
 # # # # # # "#  # # #T !!# # $%"##,,, , 	,
 , , , , , , , , , , ",   !," #,$ %,d  !  $%"#!!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! !N  !  $%"#!!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! !F	$   ! !  & >$|T |D |@ !''' ' 	'R"f " "H8  4 : %-'+ $!!)) $)
 ')  ) ) ) )V4n VW!aR5:aRMRaRaR 
aRFB
>@C
d &6  	5<?;= # S]  *:
 FJ78Qp Q# 
Q#n  zx,& ,t ,4 ,4 , !#'"# "&!"   $%"#+/// ,,sDy)/
 / !/ / / / / / /  / / /  !/" #/$ %/& "'/(  )/* +/l ## #'  !""&  $%"#/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P 1 1 * *S#X 6 5 .6$   9 9- $ $ $ L & & 2 2 2X ' 'R13A2=E2  z zx  $ H HA& At A A"7  11 1f 2 2
 E/0D r+   r   c                      \ rS rSrS rS rS rS rS r\	S 5       r
S4S	 jrS5S
 jrS6S jr\	S 5       rS r\	S 5       rS r\	S 5       rS6S jr\	S 5       r\	S 5       r\	S 5       r\	S 5       rS7S jrS8S jrS rS rS rS r\	S\4S j5       r\	S 5       r S r!\	S  5       r"S9S! jr#S:S" jr$S;S# jr%S$ r&S% r'S& r(S' r)S( r*\	S) 5       r+\	S* 5       r,S+ r-\	S, 5       r.S- r/\	S. 5       r0\	S/ 5       r1\	S0 5       r2\	S1 5       r3\.r4\r5S2 r6S3r7g)<r  i3  c                 *   SU l         SU l         [        U[        [        R
                  4[        R                  [        R                  [        [        [        45      (       aC  Uu  p#Sn[        R                  " U[        U5      [        R                  " S5      U5      nXPl        g[        U[        [        R
                  4[        R                  [        R                  [        [        [        4[        [         45      (       aB  Uu  p#n[        R                  " U[        U5      [        R                  " S5      U5      nXPl        g[        U[        [        R
                  [#        S5      4[$        [        R&                  45      (       GaB  Uu  p&[)        U[        5      (       a  UR                  nOUc  [        R
                  " S5      n[)        U[$        5      (       a  UR                  n[        R*                  " U5      R,                  (       d  [/        S5      eUR,                  (       a[  [        R0                  " UU[        R
                  " 5       [        R2                  " S5      [        R4                  " 5       S5      U l        g[        R6                  " U5      U l        U R                  R,                  (       d  [9        [:        5      eg[        U[$        [        R&                  4[$        [        R&                  45      (       a  Uu  pg[)        U[$        5      (       a  UR                  n[)        U[$        5      (       a  UR                  nUnUn	UR,                  (       d7  [        R6                  " U	5      n
U
R,                  (       d  [9        [:        5      eO[        R<                  " X5      n
Xl        g[        U[$        [        R&                  4[>        [        4[>        [        4S5      (       d<  [        U[$        [        R&                  4[>        [        4[>        [        45      (       Ga  [A        U5      S:X  a*  Uu  pkn[        R                  " [        RB                  5      nOUu  pkp[        U5      n[)        U[$        5      (       a  UR                  OUn[        RD                  " U5      (       d6  [        RF                  " XRI                  5       URK                  5       XU5      nOW[        RF                  " XRI                  5       URK                  5       X[        R                  " [        RB                  5      5      nXPl        g[        U[L        [$        [        R&                  45      (       a6  US   S:X  a-  Uu  nn[)        U[$        5      (       a  UR                  nXPl        g[        U[$        [        R&                  4[        S45      (       Ga  US   n[A        U5      S:X  a  US   OSn[)        U[$        5      (       a  UR                  OUn[O        USS5      (       d  [/        S5      e[        R*                  " U5      nUR,                  (       d  U(       d  [/        S	5      e[        R                  " 5       n[        RP                  " U5      n[        RR                  " U5      n[        RT                  " U5      n[        RV                  " X+UUU5      nUR,                  RH                  UR,                  l$        UR,                  RJ                  UR,                  l%        UR,                  RX                  UR,                  l,        UR,                  RZ                  UR,                  l-         [\        R^                  " UR,                  UR,                  U5        XPl        g[        U[        R
                  [        4[        [        S[        [         45      (       Ga|  Uu  p+nn$n[)        U[        5      (       a-  UR                  n[)        U[        R
                  5      (       d   e[        Rn                  " U5      nUU-   U-  n%[        R                  " 5       n[        RV                  " X+UUU5      n[)        U$[p        [r        45      (       a"  [        Rt                  " U$5      n&[A        U$5      nOV[w        U$5      n'U'R,                  (       d  [/        S
5      e[        Rx                  " U'5      u  nn([        Rt                  " U$5      n&U%U-  U:w  a#  [/        SU< SU< SU< SU< SU%< SU< 35      e[        Rz                  " UR,                  U&5        XPl        g[        US5      (       Ga  Uu  n)Sn*[}        U)S5      (       a.  U)R                  5       n+U+(       a  [        R                  " U+5      n,O[}        U)U*5      (       a*  U)R                  n+U+(       a  [        R                  " U+5      n,O[)        U)[L        5      (       a  [        R                  " U)5      n,OX[w        U)5      n'U'R,                  (       a  U'R,                  R@                  (       d  [/        S5      e[        R                  " U'5      n,[        R                  " W,[        R                  " [        [        [        [        5      [        R                  " U,R                  5       SSU,R                  5       SS5      5      u  p[n[        R                  " U,5      u  n-n.U-UR,                  l,        U.UR,                  l-        XPl        g[        U[        [        R                  4[        5      (       Ga  Uu  n/n0[        U/5      n1[        R                  " U15      n2[O        U0SU2S-
  5      (       d  [/        [        5      e[        R                  " U1U0S5      n3[        R                  " U3[        S5      5      n4[        R                  " U4[        S5      5      (       dY  [        R                  " U4[        S5      5      (       d4  [        R                  " U4[        S5      5      (       d  [/        [        5      e[        R                  " U1U35      n,[        R                  " U,[        R                  " [        [        [        [        5      [        R                  " U,R                  5       SSU,R                  5       SS5      5      u  n5pU5U l        gSn6U H  n7U6S[#        U75       SU7 S3-  n6M     [        U65      e)a  
Pixmap(colorspace, irect, alpha) - empty pixmap.
Pixmap(colorspace, src) - copy changing colorspace.
Pixmap(src, width, height,[clip]) - scaled copy, float dimensions.
Pixmap(src, alpha=1) - copy and add or drop alpha channel.
Pixmap(filename) - from an image in a file.
Pixmap(image) - from an image in memory (bytes).
Pixmap(colorspace, width, height, samples, alpha) - from samples data.
Pixmap(PDFdoc, xref) - from an image at xref in a PDF document.
Nr   z"source colorspace must not be Noner   r   rawr   zbad alpha valuez'cannot drop alpha for 'NULL' colorspacezbad samples datazbad samples length w=z h=z alpha=z n=z stride=z size=r   r  bad image datar  r  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    r   r%   )V_samples_mv_memory_viewrI  r+  r   r-  rp  FzIrectIRectr*  r   fz_new_pixmap_with_bboxrK  r  r   r8   rw  r   r  FzPixmaprB   fz_pixmap_colorspacer   r   r  r  r   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskr  r;   fz_infinite_irectrL  fz_scale_pixmaprb  rc  r   r  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  r   pixmap_copyfz_pixmap_samples_memoryviewr  striderI   rR  fz_samples_setfz_samples_getr@  r  r  r  r-  rM  ll_fz_pixmap_copy_rawr?   r   fz_new_image_from_filer   r8  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTr{  r   r  r  r   r   r   r  r  r  r
  r  r  r  r  rk   )8r(   r  r  r   r  rS  spixmpixspmmpmr^  r   r  r5  r  src_pixr9  sepsrI   src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nrc  rb  pm_isrc_irf  src_pix_alphar  samplesrl  samples2r$  r  	imagedatar   r/  r/  r  r  r0  r  r`  rV  r  ra  r  r   args8                                                           r)   r   Pixmap.__init__3  s	     
 ! U//0u}}eT5A 
 HBE..r3CD3I5K^K^_`KachiBIU//0u}}eT5Ad  #OBe..r3CD3I5K^K^_`KachiBIz5+=+=tDzJVUZUcUcLdeeHB"j))WW''-$''yy--d3>> "FGG}}!33**,2248++-	 "BBDI	yy++&88 , vu~~68PQQJD$''yy$''yyCC??<<SA~~&88 & ==cGI7%s|UYZZvu~~6uclSS4yA~!
}}U%<%<=#' '-#-dF#;#;diiG--d33**7IIKaTXY**7IIKaTYTaTabgbybyTz{IcFENN#;<<aEAQEAr"f%%WWIvu~~6dDD 7D"4yA~DG1E#-dF#;#;diiGE1a(( "344++G4B== "KLL&&(D))'2A%%g.A&&w/A$$RAtU;B%0022BMMO%0022BMMO!(!3!3!8!8BMM!(!3!3!8!8BMM  !!2=='2D2DaHh Iu11:>S$QTVZP[\\'+$B1gu"j))WW!"e&8&89999%%b)A%i1_F&&(D$$RAtU;B7UI$677 33G<7|(1~~$&89911#6a 33G<zT! $:t4QD%1$iPVyX_Z^Y`"abb''AId##JIDy),,!))+66u=CD))!66u=CIs++229=(3~~S^^-?-?$&67744S9
 55MM/?OUdeNNCEEGQ3557AqAHB1
 2237JD$!%BMM!%BMMIx)9)9:C@@IC"3'C((-GD!WQY// ,//((dA6C&&sHY,?@E%%eXg->??!--eXg5FGG!--eXl5KLL /22&&sC0C 66MM/?OUdeNN3557Aq#%%'1a@IC
 DI BD$tCykC533 T""r+   c                     U R                   $ r-   )r  r/   s    r)   r  Pixmap.__len__4  s    yyr+   c                 &   [        U 5      [        La  g U R                  (       aK  SU R                  R                  R                  R
                  < SU R                  < SU R                  < S3$ SS< SU R                  < SU R                  < S3$ )NzPixmap(z, r  r  )r   r  r  r   r   r   irectr  r/   s    r)   r   Pixmap.__repr__4  sf    DzV#V???+/??+?+?+J+J+O+OQUQ[Q[]a]g]ghh  ,24::tzzJJr+   c                    U R                   n[        R                  " U5      UR                  5       -  n[        R                  " U5      n[        R
                  " U5      nUS:X  a  [        R                  " Xc5        OUS:X  a  [        R                  " Xc5        OUS:X  a  [        R                  " Xc5        OoUS:X  a  [        R                  " Xc5        ORUS:X  a  [        R                  " Xc5        O5US:X  a  [        R                  " XcUS5        O[        R                  " Xc5        UR                  5         [        U5      nU$ )z
Pixmap._tobytes
r   r   r   r   r  r  r   )r   r   fz_pixmap_strider  r	  r	  fz_write_pixmap_as_pngfz_write_pixmap_as_pnmfz_write_pixmap_as_pamfz_write_pixmap_as_psdfz_write_pixmap_as_psfz_write_pixmap_as_jpegr	  r"  )r(   format_jpg_qualityrS  r  r$  r	  barrays           r)   _tobytesPixmap._tobytes4  s     YY%%b)BDDF2!!$'nnS!\E88A\E88A\E88A\E88A\E77@\))#;B((1!#&r+   c                    U R                   nUS:X  a  [        R                  " XA5        g US:X  a  [        R                  " XA5        g US:X  a  [        R                  " XA5        g US:X  a  [        R
                  " XA5        g US:X  a  [        R                  " XA5        g US:X  a  [        R                  " XAU5        g [        R                  " XA5        g )Nr   r   r   r   r  r  )r   r   fz_save_pixmap_as_pngfz_save_pixmap_as_pnmfz_save_pixmap_as_pamfz_save_pixmap_as_psdfz_save_pixmap_as_psfz_save_pixmap_as_jpeg)r(   rj   r  r  rS  s        r)   	_writeIMGPixmap._writeIMG5  s    YY\E77E\E77E\E77E\E77E\E66rD\E88{S!77Er+   c                 B    [         R                  " U R                  5      $ )z$Indicates presence of alpha channel.)r   fz_pixmap_alphar   r/   s    r)   r  Pixmap.alpha5  rB  r+   Nc                     Uc!  [         R                  " U R                  5        gUc"  [         R                  " U R                  U5        g[	        U R                  U[        U5      5        g)z*Fill all color components with same value.N)r   fz_clear_pixmapr   fz_clear_pixmap_with_valueJM_clear_pixmap_rect_with_valuerK  )r(   r   r5  s      r)   r  Pixmap.clear_with5  sH    =!!$)),\,,TYY>+DIIu>Nt>TUr+   c                 X    U R                   n[        X25      nU(       d  [        U5      $ U$ )z
Return count of each color.
)r   JM_color_countr;   )r(   r  r  rS  r   s        r)   color_countPixmap.color_count5  s(     YYR&8O	r+   c                    SnSnUb%  U R                   [        U5      ;   a  U R                   nU R                  SUS9R                  5        H  u  pEX%-  nXS:  d  M  UnUnM     U(       d  S[	        S/U R
                  -  5      4$ X2-  W4$ )z/Return most frequent color and its usage ratio.r   T)r  r  r   r  )r  r*  r  rF   r  rI   )r(   r  	allpixelscntpixelr  maxpixels          r)   color_topusagePixmap.color_topusage%5  s    	

d4j 8::D ,,Dd,CIIKLEI{ 	 L
 ucUTVV^,--**r+   c                 z    [        [        R                  " U R                  5      5      nUR                  S:X  a  gU$ )zPixmap Colorspace.r  N)r+  r   r`  r   r   )r(   r  s     r)   r  Pixmap.colorspace45  s1     22499=>77f	r+   c                 D   U R                   nUR                   n[        R                  " U5      (       d  [        S5      eUR	                  5       UR	                  5       :w  a  [        S5      e[        R
                  " X4[        U5      [        R                  " S5      5        g)zCopy bbox from another Pixmap.z'cannot copy pixmap with NULL colorspacez%source and target alpha must be equalN)r   r   r`  r   r  fz_copy_pixmap_rectrK  r  )r(   r1  r5  rS  rx  s        r)   r$  Pixmap.copy<5  su    YY(())'22GHH88:(EFF!!"/?/EuGaGabfGghr+   c                 X    [         R                  " U R                  5      n[        U5      $ )zMD5 digest of pixmap (bytes).)r   r  r   r  rh  s     r)   r  Pixmap.digestF5  s"     ""499-Szr+   c                     [         R                  " U R                  5      (       d  [        S5        g[         R                  " U R                  U5        g)z5Apply correction with some float.
gamma=1 is a no-op.zcolorspace invalid for functionN)r   r`  r   r  fz_gamma_pixmap)r(   gammas     r)   
gamma_withPixmap.gamma_withL5  s9     ))49955=>tyy%0r+   c                 B    [         R                  " U R                  5      $ )zThe height.)r   rh  r   r/   s    r)   r  Pixmap.hT5  r  r+   c                 $   U R                   n[        R                  " U5      R                  (       d  [	        S5        g[        U5      n[        R                  " U5      (       a  [        R                  " U5        g[        R                  " X#5        g)z Invert the colors inside a bbox.zignored for stencil pixmapFT)	r   r   r`  r   r  rK  rL  fz_invert_pixmapfz_invert_pixmap_rect)r(   r5  rS  r#  s       r)   invert_irectPixmap.invert_irectY5  sh    YY))"-8889T"%%a((""2&##B*r+   c                 X    [         R                  " U R                  5      n[        U5      $ )zPixmap bbox - an IRect object.)r   fz_pixmap_bboxr   JM_py_from_irectrh  s     r)   r  Pixmap.irectf5  s#     ""499-%%r+   c                 B    [         R                  " U R                  5      $ )zCheck if pixmap is monochrome.)r   fz_is_pixmap_monochromer   r/   s    r)   is_monochromePixmap.is_monochromel5  s     ,,dii88r+   c                     U R                   nUR                  5       nUR                  5       UR                  5       -  U-  nS n[	        SX25       H&  nUS:X  a  U" USU5      nM  U" XU5      nUW:w  d  M&    g   g)z%
Check if pixmap has only one color.
c                     [        5       n[        U5       H+  nUR                  [        R                  " XU-   5      5        M-     U$ r-   )r   rR  ro   r   rn  )rS  offsetrI   rK   rf  s        r)   _pixmap_read_samples0Pixmap.is_unicolor.<locals>._pixmap_read_samplesy5  s7    &C1X

5//1H=> Jr+   r   FT)r   rI   r   r  rR  )r(   rS  rI   r  r  r  sample0samples           r)   is_unicolorPixmap.is_unicolorq5  s{    
 YYDDF!#	
 Q)F{.Aq9-r1=W$  * r+   c                     [         (       a)  S n[        U5      U R                  l        U R                  $ [        R
                  " U R                  5      $ )zThe size of one pixel.c                 B    [         R                  " U R                  5      $ r-   )r   pixmap_nr   r/   s    r)   n2Pixmap.n.<locals>.n25  s    ~~dii00r+   )r  rs  r  rI   r   fz_pixmap_componentsr   )r(   r  s     r)   rI   Pixmap.n5  s<     ;1'|DNN66M))$))44r+   c                    [        U5      n[        R                  " 5       nX%l        U(       a  UR	                  U5        U(       a  UR                  U5        U R                  n[        U[        5      (       a  [        R                  " XaSU5        g[        U5      n [        R                  " XvU5        UR                  5         g! UR                  5         f = f)z$
Save pixmap as an OCR-ed PDF page.
r   N)get_tessdatar   FzPdfocrOptionsr[  language_set2datadir_set2r   rB   r   fz_save_pixmap_as_pdfocrr	  fz_write_pixmap_as_pdfocrr	  )r(   rj   r[  rH  tessdatarU  r  r	  s           r)   pdfocr_savePixmap.pdfocr_save5  s      )$$& )x(iih$$**C1dC'2C&//4@##%##%s   C Cc                 r    [        U5      nSSKJn  U" 5       nU R                  XQX#S9  UR	                  5       $ )a^  Save pixmap as an OCR-ed PDF page.

Args:
    compress: (bool) compress, default 1 (True).
    language: (str) language(s) occurring on page, default "eng" (English),
            multiples like "eng+ger" for English and German.
    tessdata: (str) folder name of Tesseract's language support. If None
            we use environment variable TESSDATA_PREFIX or search for
            Tesseract installation.
Notes:
    On failure, make sure Tesseract is installed and you have set
    <tessdata> or environment variable "TESSDATA_PREFIX" to the folder
    containing your Tesseract's language support data.
r   rb  )r[  rH  r  )r  r=   r  r  r  )r(   r[  rH  r  r  rc  s         r)   pdfocr_tobytesPixmap.pdfocr_tobytes5  s7      )i(V||~r+   c                 t    SSK Jn  U R                  nU(       d  SnONUR
                  S:X  a  U R                  (       d  SOSnO(UR
                  S:X  a  U R                  (       d  SOS	nOS
nUR                  X0R                  U R                  4U R                  5      nU$ ! [         a    [        S5        e f = f)z&Create a Pillow Image from the Pixmap.r   )r  zPIL/Pillow not installedrY  r   LAr   r7  RGBAr8  )PILr  r  rv   r  rI   r  	frombytesr  r0  r  )r(   r  cspacer   r/  s        r)   	pil_imagePixmap.pil_image5  s    	!
 DXX]"jj3dDXX] $

5DDoodZZ$=t||L
  	./	s   B   B7c                     U R                  5       nSUR                  5       ;  a  U R                  U R                  4US'   UR                  " U0 UD6  g)a  Write to image file using Pillow.

An intermediate PIL Image is created, and its "save" method is used
to store the image. See Pillow documentation to learn about the
meaning of possible positional and keyword parameters.
Use this when other output formats are desired.
r  N)r  ry  r  r  r  )r(   r  r  r/  s       r)   pil_savePixmap.pil_save5  sE     nn%!YY		2F5M$!&!r+   c                     [         R                  " 5       nU R                  5       nSUR                  5       ;  a  U R                  U R
                  4US'   UR                  " U/UQ70 UD6  UR                  5       $ )a  Convert to an image in memory using Pillow.

An intermediate PIL Image is created, and its "save" method is used
to store the image. See Pillow documentation to learn about the
meaning of possible positional or keyword parameters.
Use this when other output formats are desired.
r  )r=   r  r  ry  r  r  r  r  )r(   r  r  	bytes_outr/  s        r)   pil_tobytesPixmap.pil_tobytes5  sd     JJL	nn%!YY		2F5M,T,V,!!##r+   c                    [         (       a+  [        R                  " U R                  R                  X5      $  US:  dL  XR                  R                  R
                  :  d)  US:  d#  X R                  R                  R                  :  a  [        [        [        5        U R                  R                  R                  nU R                  R                  R                  nXB-  X1-  -   n[        U R                  XUU-    5      nU$ )zPGet color tuple of pixel (x, y).
Last item is the alpha if Pixmap.alpha is true.r   )r  r   pixmap_pixelr   r   r   r  r  MSG_PIXEL_OUTSIDErp	  rI   rl  r   
samples_mv)r(   rb  rc  rI   rl  rf  rK   s          r)   r  Pixmap.pixel5  s     ;%%dii&:&:AAAq5		,,...q5		,,...%'78II  ""%%,,JT__a1-.
r+   rs  c                 0    U R                   n[        U5      $ r-   )r  r  )r(   mvs     r)   r  Pixmap.samples6  s    __bzr+   c                 ~    U R                   c%  [        R                  " U R                  5      U l         U R                   $ )z
Pixmap samples memoryview.
)rZ  r   rk  r   r/   s    r)   r  Pixmap.samples_mv
6  s3     #$AA$))LDr+   c                 \    U R                   (       a  U R                   R                  5         g g r-   rZ  releaser/   s    r)   _samples_mv_releasePixmap._samples_mv_release6  "    $$& r+   c                 B    [         R                  " U R                  5      $ r-   )r   fz_pixmap_samples_intr   r/   s    r)   samples_ptrPixmap.samples_ptr6  s    **49955r+   c                    SSSSSSSSSSS.
n[        U5      [        L a  O:[        US5      (       a  [        U5      nO[        US	5      (       a  UR                  nUc&  [        R
                  R                  U5      u  pVUSS
 nUR                  UR                  5       S
5      nUc(  [        SU S[        UR                  5       5       35      eU R                  (       a  US;   a  [        SU-  5      eU R                  (       a/  U R                  R                  S:  a  US;   a  [        SU S35      eUS:X  a&  U R                  U R                   U R"                  5        U R%                  XU5      $ )zOutput as image in format determined by filename extension.

Args:
    output: (str) only use to overrule filename extension. Default is PNG.
            Others are JPEG, JPG, PNM, PGM, PPM, PBM, PAM, PSD, PS.
r   r   r   r   r  r  )
r  pnmpgmppmpbmpampsdpsjpgjpegr  r   NImage format  not in r   r  r  z'%s' cannot have alphar   r   ro  unsupported colorspace for 'r   )r   r   r?   r   rh   r	   splitextr<   r  r   r   ry  r  r  rI   r  r  r  r  )r(   rj   r	  r  valid_formatsr9  r  r  s           r)   r  Pixmap.save6  sQ     >S Xz**8}HXv&&}}H>WW%%h/FAWF5;}VHHU=CUCUCW=X<YZ[[::#*5>????t0014	9I;F81EFF!8LLDII.~~h[99r+   c                    U R                   nSnSnUR                  5       S:X  a  [        [        5      e[        R
                  " U5      n[        R                  " U5      n	[        R                  " U5      n
X-  US-   -  n/ SQn/ SQnSnSnU(       aF  [        U[        [        45      (       a+  [        U5      U:X  a  [        U5       H  nUU   UU'   M     SnU(       aF  [        U[        [        45      (       a+  [        U5      U:X  a  [        U5       H  nUU   UU'   M     Sn[        5       nSnU(       aO  [        U[        [        45      (       a  Un[        U5      nO S[        U5       35       eUX-  :  a  [        S5      e [        R                   " UUUU[        R"                  " U5      UR$                  UUUU5
        g)aq  Set alpha channel to values contained in a byte array.
If omitted, set alphas to 255.

Args:
    alphavalues: (bytes) with length (width * height) or 'None'.
    premultiply: (bool, True) premultiply colors with alpha values.
    opaque: (tuple, length colorspace.n) this color receives opacity 0.
    matte: (tuple, length colorspace.n)) preblending background color.
r   r   r   r   r   r   z!unexpected type for alphavalues: zbad alpha valuesN)r   r  r   rb  r   rf  rg  rh  rB   r   r   r;   rR  r  r  r   Pixmap_set_alpha_helperr  r   rn  rm  )r(   alphavaluespremultiplyopaquematter  r  r  rI   r   r  balenr  r  zero_outbgroundrf  r  data_lenr  r  data_fix	fz_mul255s                          r)   	set_alphaPixmap.set_alphaH6  s    ii99;!o..%%c*!!#&""3'1j$77CK1<L1X"1Iq	 HZ663u:?1X"1X
 Gw +y'9::"{+Q=d;>O=PQQq!% "455)),,d3NNr+   c                    SSSSSSSSSSSSS.nUR                  UR                  5       S	5      nUc(  [        S
U S[        UR	                  5       5       35      eU R
                  (       a  US;   a  [        S5      eU R                  (       a/  U R                  R                  S:  a  US;   a  [        SU S35      eUS:X  a&  U R                  U R                  U R                  5        U R                  XB5      nU$ )z1
Convert to binary image stream of desired type.
r   r   r   ro  r   r  r  )r  r  r  r  r  r  tgatpicr  r  r  r  Nr  r  r   z'{output}' cannot have alphar!  r"  r   )r<   r  r   r   ry  r  r  rI   r  r  r  r  )r(   r	  r  r$  r  r  s         r)   r  Pixmap.tobytes6  s    
  5;}VHHU=CUCUCW=X<YZ[[::#*;<<??t0014	9I;F81EFF!8LLDII.s0r+   c                 \    U R                   nXR                  l        X#R                  l        g)z"Set resolution in both dimensions.N)r   r   r  r  )r(   r  r  rS  s       r)   r  Pixmap.set_dpi6  s    YY!!r+   c                 \    U R                   nXR                  l        X#R                  l        g)zSet top-left coordinates.N)r   r   rb  rc  )r(   rb  rc  rS  s       r)   
set_originPixmap.set_origin6  s    YYr+   c                 R   [         (       a,  [        R                  " U R                  R                  XU5      $ U R                  n[        USUR                  5       S-
  5      (       a#  [        USUR                  5       S-
  5      (       d  [        [        5      eUR                  5       n[        U5       H(  nX6   n[        USS5      (       a  M  [        [        5      e   [        R                  " U5      nX-  XQ-  -   n [        U5       H  nUR#                  Xv-   X6   5        M     g)zSet color of pixel (x, y).r   r   r  N)r  r   	set_pixelr   r   r  r   r  r   r  rI   rR  MSG_BAD_COLOR_SEQr   r  r[  r  rm  )	r(   rb  rc  rm  rS  rI   r  rf  rl  s	            r)   r?  Pixmap.set_pixel6  s    ;??499#7#7uEEYY1bddfqj))!Q
1K1K/00DDFqAAAq#&& "344  '',J 1X!!!%2 r+   c                    U R                   nUR                  5       n/ n[        U5       H9  nX&   n[        USS5      (       d  [	        [
        5      eUR                  U5        M;     [        U5      n[        X5U5      n[        U5      nU$ )z Set color of all pixels in bbox.r   r  )
r   rI   rR  r  r   r@  ro   rK  JM_fill_pixmap_rect_with_colorrw  )	r(   r5  rm  rS  rI   r  r  rf  r   s	            r)   r  Pixmap.set_rect6  s|    YYDDFqAAAq#&& "344HHQK	 
  %*2$7!W	r+   c                     US:  a  [        S5        g[        R                  " U R                  U5        SU l        U R                  5         g)z_Divide width and height by 2**factor.
E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)r  r   fz_subsample_pixmapr   r[  r  )r(   factors     r)   shrinkPixmap.shrink6  s?     A:89!!499f5   "r+   c                 B    [         R                  " U R                  5      $ )zPixmap size.)r   fz_pixmap_sizer   r/   s    r)   r  Pixmap.size7  s     $$dii00r+   c                 6    U R                   R                  5       $ )z%Length of one image line (width * n).)r   rl  r/   s    r)   rl  Pixmap.stride	7  s     yy!!r+   c                     U R                   (       a  U R                   R                  S:  a  [        S5        g[        R                  " U R
                  X5      $ )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)r  rI   rv   r   fz_tint_pixmapr   )r(   blackwhites      r)   	tint_withPixmap.tint_with7  s=    $//"3"3a"7>?##TYY==r+   c                 B    [         R                  " U R                  5      $ )z
The width.)r   rg  r   r/   s    r)   r   Pixmap.w7  rB  r+   c                    UR                   (       d  [        S5      e[        U5      nUR                  UR                  UR
                  UR                  /n[        R                  " U R                  XRU5      n[        U5      $ )z!Return pixmap from a warped quad.zquad must be convex)	is_convexr   r  r  r`  r_  r^  r   fz_warp_pixmapr   r  )r(   rF  r  r0  r!  rB  r^  s          r)   warpPixmap.warp7  s^    ~~Z0E%FFD!44qttQTT*""DIIvfEs|r+   c                 B    [         R                  " U R                  5      $ )zx component of Pixmap origin.)r   fz_pixmap_xr   r/   s    r)   rb  Pixmap.x"7         ++r+   c                 6    U R                   R                  5       $ )zResolution in x direction.)r   r  r/   s    r)   r  Pixmap.xres'7       yy~~r+   c                 B    [         R                  " U R                  5      $ )zy component of Pixmap origin.)r   fz_pixmap_yr   r/   s    r)   rc  Pixmap.y,7  r_  r+   c                 6    U R                   R                  5       $ )zResolution in y direction.)r   r  r/   s    r)   r  Pixmap.yres17  rb  r+   c                 \    U R                   (       a  U R                   R                  5         g g r-   r  r/   s    r)   r[  Pixmap.__del__97  r  r+   )r[  rZ  r   r
  rQ  r-   )r   NN)TengN)N_   )Nr   NN)r  rk  )8r1   r2   r3   r4   r   r  r   r  r  rs  r  r  r  r  r  r$  r  r  r  r  r  r  r  rI   r  r  r  r  r  r  r  r  r  r  r  r  r3  r  r  r<  r?  r  rH  r  rl  rS  r   rZ  rb  r  rc  r  r  r0  r[  r5   r.   r+   r)   r  r  3  s   V#pK*F 0 0V+  i  
1 1 1 & &
 9 9  * 
5 
5&***"$"$ u   
  
 ' 6 6':R]~<"32	# 1 1 " "> 0 0 , ,     , ,     EF'r+   r  c                       \ rS rSrS rS rS rS rS rS r	SSS	.S
 jr
S rS rS rS rS rS rS rS rS r\S 5       rS rS r\S 5       r\r\rS	rg)r"  i?7  c                     [         R                  " U R                  U R                  -  U R                  U R                  -  -   5      $ r-   )r  r  rb  rc  r/   s    r)   r  Point.__abs__A7  s.    yy$&&466DFF?:;;r+   c                     [        US5      (       a&  [        U R                  U-   U R                  U-   5      $ [	        U5      S:w  a  [        S5      e[        U R                  US   -   U R                  US   -   5      $ Nr  r   Point: bad seq lenr   r   r?   r"  rb  rc  r;   r   r(   r  s     r)   r  Point.__add__D7  h    1k""!TVVaZ00q6Q;122TVVad]DFFQqTM22r+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r/   s    r)   r  Point.__bool__K7  r  r+   c                 b    [        US5      (       d  g[        U5      S:H  =(       a	    X-
  (       + $ )Nr  Fr   r  rs  s     r)   r  Point.__eq__N7  s)    q)$$1v{-DH~-r+   c                 8    U R                   U R                  4U   $ r-   rb  rc  r  s     r)   r  Point.__getitem__S7  s    ""r+   c                 *    [        [        U 5      5      $ r-   r  r   r/   s    r)   r  Point.__hash__V7      E$K  r+   Nr{  c                   U(       d  SU l         SU l        GO[        U5      S:  a  [        S5      e[        U5      S:X  a'  [	        US   5      U l         [	        US   5      U l        O[        U5      S:X  a  US   n[        U[        R                  [        R                  45      (       a#  UR                   U l         UR                  U l        Oh[        US5      (       d  [        S5      e[        U5      S:w  a  [        S5      e[	        US   5      U l         [	        US   5      U l        O[        S5      eUb  Xl         Ub  X l        gg)	z
Point() - all zeros
Point(x, y)
Point(Point) - new copy
Point(sequence) - from 'sequence'

Explicit keyword args x, y override earlier settings if not None.
r  r   rq  r   r   r  zPoint: bad argsN)
rb  rc  r;   r   r  rB   r   r`  fz_pointr?   )r(   rb  rc  r  rQ  s        r)   r   Point.__init__Y7  s    DFDFY]122Y!^47^DF47^DFY!^QA!emmU^^<==q-00$%677q6Q;$%9::qtqt122=QF=QF=r+   c                     gNr   r.   r/   s    r)   r  Point.__len__{7  r  r+   c                 2   [        US5      (       a&  [        U R                  U-  U R                  U-  5      $ [        US5      (       a4  [	        U5      S:X  a%  U R                  US   -  U R                  US   -  -   $ [        U 5      nUR                  U5      $ )Nr  r  r   r   r   )r?   r"  rb  rc  r;   r  )r(   r  r  s      r)   r  Point.__mul__~7  s}    1k""!TVVaZ001m$$Q166AaD=466AaD=00$K{{1~r+   c                 F    [        U R                  * U R                  * 5      $ r-   )r"  rb  rc  r/   s    r)   r  Point.__neg__7  s    dffWtvvg&&r+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r/   s    r)   r  Point.__nonzero__7  r  r+   c                     [        U 5      $ r-   )r"  r/   s    r)   r  Point.__pos__7  r  r+   c                 0    S[        [        U 5      5      -   $ )Nr"  r  r/   s    r)   r   Point.__repr__7      U4[)))r+   c                 b    [        U5      nUS:X  a  X l        g US:X  a  X l        g [        S5      e)Nr   r   r  )r  rb  rc  r  r  s      r)   r  Point.__setitem__7  s;    !H!VaV  !VaV  122r+   c                     [        US5      (       a&  [        U R                  U-
  U R                  U-
  5      $ [	        U5      S:w  a  [        S5      e[        U R                  US   -
  U R                  US   -
  5      $ rp  rr  rs  s     r)   r  Point.__sub__7  ru  r+   c                     [        US5      (       a,  [        U R                  S-  U-  U R                  S-  U-  5      $ [	        U5      S   nU(       d  [        S5      e[        U 5      nUR                  U5      $ r  )r?   r"  rb  rc  r  r  r  )r(   r  r  r  s       r)   r  Point.__truediv__7  si    1k"""QA66"1%#$;<<$K{{2r+   c                 0   U R                   U R                   -  U R                  U R                  -  -   nU[        :  a  [        SS5      $ [        R
                  " U5      n[        [        U R                   5      U-  [        U R                  5      U-  5      $ )z&Unit vector with positive coordinates.r   )rb  rc  r  r"  r  r  r%  r(   r  s     r)   abs_unitPoint.abs_unit7  sk     FFTVVOdfftvvo-w;1:IIaLS[1_c$&&kAo66r+   c                    [        U5      S:  d  [        S5      eUS   n[        U5      S:X  a  [        U5      nO&[        U5      S:X  a  [        U5      nO[        S5      e[        U5      S:  a  US   nOSnSS	S
SS.nXC   S   XC   S   -  n[	        U5      [        L a  [        X-
  5      U-  $ [        UR                  UR                  5      nXbR                  -  nX;   a  gU R                  UR                  :  a  U R                  UR                  :  a  U R                  UR                  U5      $ U R                  UR                  ::  a  U R                  UR                  U5      $ U R                  UR                  -
  U-  $ UR                  U R                  s=::  a  UR                  ::  aU  O  ORU R                  UR                  :  a  U R                  UR                  -
  U-  $ UR                  U R                  -
  U-  $ U R                  UR                  :  a  U R                  UR                   U5      $ U R                  UR                  ::  a  U R                  UR                  U5      $ UR                  U R                  -
  U-  $ )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenr   ro  z$arg1 must be point-like or rect-liker   r  )r  r  r        R@gRQ@r  gffffff9@r  r  incmmmr  )r;   r   r"  r*  r   r%  top_leftbottom_rightrb  r  rc  r  distance_tor  	top_rightr  bottom_left)r(   r  rb  unitur  r#  s          r)   r  Point.distance_to7  s   4y1}CDDGq6Q;aAVq[QACDDt9q=7DD(+ GAJ#7etx=1$$ QZZ(966ADD=vv~''==144''T::**TTTVV#qtt#vv~**tvv**vv~''t<<144''

D99tvv**r+   c                 j    [        U5      S:w  a  [        S5      e[        X5      u  U l        U l        U $ )z7Replace point by its transformation with matrix-like m.r  r  )r;   r   util_transform_pointrb  rc  r  s     r)   r  Point.transform7  s0    q6Q;233-d6r+   c                    U R                   U R                   -  U R                  U R                  -  -   nU[        :  a  [        SS5      $ [        R
                  " U5      n[        U R                   U-  U R                  U-  5      $ )zUnit vector of the point.r   )rb  rc  r  r"  r  r  r  s     r)   r  
Point.unit7  sc     FFTVVOdfftvvo-w;1:IIaLTVVaZ!,,r+   )r1   r2   r3   r4   r  r  r  r  r  r  r   r  r  r  r  r  r   r  r  r  rs  r  r  r  r  r
  r  r5   r.   r+   r)   r"  r"  ?7  s    <31.
#! !%  'D'1*3 7 70+d - - GDr+   r"  c                      \ rS rSrS rS rS rS rS rS r	S r
S	S	S	S	S
.S jrS rS rS rS rS rS rS rS rS r\S 5       r\S 5       r\S 5       r\S 5       rS r\S 5       rS r\r\" S 5      r\" S 5      rSr g	)r  i7  c                     U R                   (       a  g[        U R                  U R                  -
  5      [        U R                  U R                  -
  5      -  $ Nr  )rv  r%  r  r`  r^  r/   s    r)   r  Quad.__abs__7  s;    ==477TWW$%DGGdgg,=(>>>r+   c                 x   [        US5      (       aB  [        U R                  U-   U R                  U-   U R                  U-   U R
                  U-   5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -   U R                  US   -   U R                  US   -   U R
                  US   -   5      $ Nr  ro  Quad: bad seq lenr   r   r   r   r?   r  r  r`  r^  r_  r;   r   r(   r!  s     r)   r  Quad.__add__8      1k""!TWWq[$''A+tww{KKq6Q;011DGGadNDGGadNDGGadNDGGaPQdNSSr+   c                 $    U R                   (       + $ r-   rv  r/   s    r)   r  Quad.__bool__8      ==  r+   c                     UR                  5       nUS:X  a  [	        X5      $ US:w  a  g[        U5      (       a@  [        U5      R                  (       a  g[	        US S U 5      =(       a    [	        USS  U 5      $ [        U5      (       a(  [        S5       H  n[	        X   U 5      (       a  M    g   gg! [         a    [        S:  a
  [        5          gf = f)Nr   Fr   ro  T)
r  rk   r  rz   util_point_in_quad	CheckRectr*  rv  	CheckQuadrR  )r(   rb  rQ  rf  s       r)   r{  Quad.__contains__8  s    			A 6%a..6Q<<Aw%aeT2V7I!AB%QU7VVQ<<1X)!$55   !  	#a'N,<	s   B3 3CCc                 
   [        US5      (       d  g[        U5      S:H  =(       a]    U R                  US   :H  =(       aD    U R                  US   :H  =(       a+    U R                  US   :H  =(       a    U R
                  US   :H  $ Nr  Fro  r   r   r   r   )r?   r;   r  r`  r^  r_  )r(   rF  s     r)   r  Quad.__eq__ 8  sx    tY''4yA~ 
GGtAw GGtAwGGtAw GGtAw		
r+   c                 d    U R                   U R                  U R                  U R                  4U   $ r-   r  r`  r^  r_  r  s     r)   r  Quad.__getitem__*8  &    $''4773A66r+   c                 *    [        [        U 5      5      $ r-   r~  r/   s    r)   r  Quad.__hash__-8  r  r+   Nr  c                   U(       d&  [        5       =U l        =U l        =U l        U l        GOd[        U5      S:  a  [        S5      e[        U5      S:X  a+  [        [         U5      u  U l        U l        U l        U l        GO[        U5      S:X  a  US   n[        U[        R                  5      (       ar  X`l        [        UR                  5      [        UR                  5      [        UR                  5      [        UR                  5      4u  U l        U l        U l        U l        Ok[        US5      (       d  [        S5      e[        U5      S:w  a  [        S5      e[        [         U5      u  U l        U l        U l        U l        O[        S5      eUb  [        U5      U l        Ub  [        U5      U l        Ub  [        U5      U l        Ub  [        U5      U l        gg)z
Quad() - all zero points
Quad(ul, ur, ll, lr)
Quad(quad) - new copy
Quad(sequence) - from 'sequence'

Explicit keyword args ul, ur, ll, lr override earlier settings if not
None.

ro  r  r   r   r  zQuad: bad argsN)r"  r  r`  r^  r_  r;   r   r  rB   r   FzQuadr   r?   )r(   r  r`  r^  r_  r  rQ  s          r)   r   Quad.__init__08  sk    49G;DG;dg;$'Y]011Y!^14UD1A.DGTWdgtwY!^QA!U\\**	5:144[%+uUVUYUY{\abcbfbf\g5g2$'47Q.. !122Q1 !45558]2$'47-..>eBiDG>eBiDG>eBiDG>eBiDG>r+   c                     gNro  r.   r/   s    r)   r  Quad.__len__S8  r  r+   c                 >    [        U 5      nUR                  U5      nU$ r-   )r  r  )r(   r  r!  s      r)   r  Quad.__mul__V8  s    JKKNr+   c                 v    [        U R                  * U R                  * U R                  * U R                  * 5      $ r-   )r  r  r`  r^  r_  r/   s    r)   r  Quad.__neg__[8  +    TWWHtwwh477(;;r+   c                 $    U R                   (       + $ r-   r  r/   s    r)   r  Quad.__nonzero__^8  r  r+   c                     [        U 5      $ r-   )r  r/   s    r)   r  Quad.__pos__a8      Dzr+   c                 0    S[        [        U 5      5      -   $ )Nr  r  r/   s    r)   r   Quad.__repr__d8      E$K(((r+   c                     US:X  a  [        U5      U l        g US:X  a  [        U5      U l        g US:X  a  [        U5      U l        g US:X  a  [        U5      U l        g [        S5      eNr   r   r   r   r  )r"  r  r`  r^  r_  r  r  s      r)   r  Quad.__setitem__g8  sn    !VuQxTW  !VuQxTW
 	 !VuQxTW  !VuQxTW  122r+   c                 x   [        US5      (       aB  [        U R                  U-
  U R                  U-
  U R                  U-
  U R
                  U-
  5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -
  U R                  US   -
  U R                  US   -
  U R
                  US   -
  5      $ r  r  r  s     r)   r  Quad.__sub__p8  r  r+   c                     [        US5      (       a  SU-  nO [        U5      S   nU(       d  [        S5      e[        U 5      nUR	                  U5      nU$ )Nr  r  r   zMatrix not invertible)r?   r  r  r  r  )r(   r  r  r!  s       r)   r  Quad.__truediv__w8  sQ    1k""aB#A&q)B'(?@@JKKOr+   c                 t   [        U R                  U R                  5      nU R                  U-  nU R                  U-  nUR
                  UR
                  -  S:  a  g[        U R                  U R                  5      nU R                  U-  nU R                  U-  nUR
                  UR
                  -  S:  a  gg)zCheck if quad is convex and not degenerate.

Notes:
    Check that for the two diagonals, the other two corners are not
    on the same side of the diagonal.
Returns:
    True or False.
r   FT)planish_liner  r_  r^  r`  rc  )r(   r  rC  rD  s       r)   rX  Quad.is_convex8  s     $''*WWq[WWq[44"$$;?$''*WWq[WWq[44"$$;?r+   c                 \    U R                   [        :  =(       d    U R                  [        :  $ )zcCheck whether all quad corners are on the same line.

This is the case if width or height is zero.
)r  r  r0  r/   s    r)   rv  Quad.is_empty8  s!     zzG#<t{{W'<<r+   c                 .    U R                   R                  $ )z(Check whether this is the infinite quad.)r   ru  r/   s    r)   ru  Quad.is_infinite8  s     yy$$$r+   c                    [        U R                  U R                  U R                  5      n[	        US-
  5      [
        :  a  g[        U R                  U R                  U R                  5      n[	        US-
  5      [
        :  a  g[        U R                  U R                  U R                  5      n[	        US-
  5      [
        :  a  gg)zCheck if quad is rectangular.

Notes:
    Some rotation matrix can thus transform it into a rectangle.
    This is equivalent to three corners enclose 90 degrees.
Returns:
    True or False.
r   FT)util_sine_betweenr  r`  r_  r%  r  r^  )r(   sines     r)   is_rectangularQuad.is_rectangular8  s     !$''477;tax=7" $''477;tax=7" $''477;tax=7"r+   c                     U R                   (       a
  [        5       $ [        SS5      R                  UR                  UR
                  5      nX) -  U-  U-  nU$ )zKMorph the quad with matrix-like 'm' and point-like 'p'.

Return a new quad.r   )ru  INFINITE_QUADr~  r  rb  rc  )r(   r  r  deltar!  s        r)   r&  
Quad.morph8  sM      ?"q!))!##qss36MA%r+   c                 2   [        5       n[        U R                  R                  U R                  R                  U R
                  R                  U R                  R                  5      Ul        [        U R                  R                  U R                  R                  U R
                  R                  U R                  R                  5      Ul	        [        U R                  R                  U R                  R                  U R
                  R                  U R                  R                  5      Ul        [        U R                  R                  U R                  R                  U R
                  R                  U R                  R                  5      Ul        U$ r-   )r*  r  r  rb  r`  r_  r^  r  rc  r  r   r  r  r(   r#  s     r)   r   	Quad.rect8  s    F47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>r+   c                    [        US5      (       a  O[        U5      S:w  a  [        S5      eU =R                  U-  sl        U =R                  U-  sl        U =R
                  U-  sl        U =R                  U-  sl        U $ )z1Replace quad by its transformation with matrix m.r  r  r  )r?   r;   r   r  r`  r^  r_  r  s     r)   r  Quad.transform8  sb    1k""Vq[2331111r+   c                     [        [        U R                  U R                  -
  5      [        U R                  U R
                  -
  5      5      $ r-   )r   r%  r  r`  r^  r_  r/   s    r)   r
  Quad.<lambda>8  /    3s477TWW+<'=s477TWWCT?U#Vr+   c                     [        [        U R                  U R                  -
  5      [        U R                  U R
                  -
  5      5      $ r-   )r   r%  r  r^  r`  r_  r/   s    r)   r
  r  8  r   r+   )r^  r_  r   r  r`  )!r1   r2   r3   r4   r  r  r  r{  r  r  r  r   r  r  r  r  r  r   r  r  r  rs  rX  rv  ru  r  r&  r   r  r
  r  r0  r5   r.   r+   r)   r  r  7  s    ?
T!*
7! "&$4D !0F
<!)T	  * = = % %  0  
 GVWEVWFr+   r  c                      \ rS rSrS rS rS rS rS rS r	S r
S	 rS
S
S
S
S
S
S.S jrS rS rS rS rS rS rS rS rS rS r\S 5       r\S 5       rS r\S 5       rS\4S jrS rS rS r S  r!\S! 5       r"\S" 5       r#\S# 5       r$S$ r%S% r&S& r'\S' 5       r(S( r)\S) 5       r*\S* 5       r+S+ r,S, r-\S- 5       r.\r/\r0\r1\" \)5      r2\*r3\+r4S.r5g
)/r*  i8  c                     U R                   (       d  U R                  (       a  gU R                  U R                  -
  U R                  U R
                  -
  -  $ r  )rv  ru  r  r  r  r  r/   s    r)   r  Rect.__abs__8  s9    ==D,,$''!dgg&788r+   c                 x   [        US5      (       aB  [        U R                  U-   U R                  U-   U R                  U-   U R
                  U-   5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -   U R                  US   -   U R                  US   -   U R
                  US   -   5      $ Nr  ro  Rect: bad seq lenr   r   r   r   r?   r*  r  r  r  r  r;   r   rs  s     r)   r  Rect.__add__8  r  r+   c                     [        US5      (       d  [        S5      e[        U5      n[        U 5      nUR                  U5      $ )Nr  bad operand 2)r?   r   r*  	intersect)r(   rb  r:  r#  s       r)   __and__Rect.__and__8  s:    q)$$_--!WJ{{2r+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r/   s    r)   r  Rect.__bool__8  r  r+   c                 Z   [        US5      (       a  U[        U 5      ;   $ [        U5      nUS:X  a  [        X5      $ US:X  a  [	        5       n [        U5      nU R                  UR                  s=:*  =(       a&    UR                  s=:*  =(       a    U R                  :*  Os  =(       aJ    U R                  UR                  s=:*  =(       a&    UR                  s=:*  =(       a    U R                  :*  $ s  $ g! [         a,    [        S:  a
  [        5         [        U5      R                  n Nf = f)Nr  r   ro  r   F)r?   r   r;   util_is_point_in_rectINFINITE_RECTr*  rk   r  rz   r  r   r  r  r  r  )r(   rb  rQ  r#  s       r)   r{  Rect.__contains__8  s    1k""d##F6(116A!G GGqtt66qtt66tww6 7GGqtt66qtt66tww6868  !'!+0@GLL!s   C4 43D*)D*c                 b    [        US5      (       d  g[        U5      S:H  =(       a	    X-
  (       + $ )Nr  Fro  r  r
  s     r)   r  Rect.__eq__9  s*    tY''4yA~3t{"33r+   c                 d    U R                   U R                  U R                  U R                  4U   $ r-   r  r  r  r  r  s     r)   r  Rect.__getitem__9  r  r+   c                 *    [        [        U 5      5      $ r-   r~  r/   s    r)   r  Rect.__hash__9  r  r+   Nr_  rC  r  r  r  r  c          
          [        XqX#XEUS.6u  p4pV[        U5      U l        [        U5      U l        [        U5      U l        [        U5      U l        g)a  
Rect() - all zeros
Rect(x0, y0, x1, y1)
Rect(top-left, x1, y1)
Rect(x0, y0, bottom-right)
Rect(top-left, bottom-right)
Rect(Rect or IRect) - new copy
Rect(sequence) - from 'sequence'

Explicit keyword args p0, p1, x0, y0, x1, y1 override earlier settings
if not None.
r  N)util_make_rectr  r  r  r  r  r(   r_  rC  r  r  r  r  r  s           r)   r   Rect.__init__9  sE     ($"VXY****r+   c                     gr  r.   r/   s    r)   r  Rect.__len__*9  r  r+   c                     [        US5      (       aB  [        U R                  U-  U R                  U-  U R                  U-  U R
                  U-  5      $ [        U 5      nUR                  U5      nU$ )Nr  )r?   r*  r  r  r  r  r  )r(   r  r#  s      r)   r  Rect.__mul__-9  s[    1k""!TWWq[$''A+tww{KKJKKNr+   c                 v    [        U R                  * U R                  * U R                  * U R                  * 5      $ r-   )r*  r  r  r  r  r/   s    r)   r  Rect.__neg__49  r  r+   c                 d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r/   s    r)   r  Rect.__nonzero__79  r  r+   c                     [        US5      (       d  [        S5      e[        U 5      n[        U5      S:X  a  UR	                  U5      $ [        U5      S:X  a  UR                  U5      $ [        S5      e)Nr  r  r   ro  )r?   r   r*  r;   include_pointinclude_rect)r(   rb  r#  s      r)   __or__Rect.__or__:9  sb    q)$$_--Jq6Q;??1%%q6Q;>>!$$))r+   c                     [        U 5      $ r-   r*  r/   s    r)   r  Rect.__pos__D9  r  r+   c                 0    S[        [        U 5      5      -   $ )Nr*  r  r/   s    r)   r   Rect.__repr__G9  r  r+   c                     [        U5      nUS:X  a  X l        g US:X  a  X l        g US:X  a  X l        g US:X  a  X l        g [        S5      er  )r  r  r  r  r  r  r  s      r)   r  Rect.__setitem__J9  s_    !H!VqW  !VqW
 	 !VqW  !VqW  122r+   c                 x   [        US5      (       aB  [        U R                  U-
  U R                  U-
  U R                  U-
  U R
                  U-
  5      $ [        U5      S:w  a  [        S5      e[        U R                  US   -
  U R                  US   -
  U R                  US   -
  U R
                  US   -
  5      $ r  r  rs  s     r)   r  Rect.__sub__T9  r  r+   c                 B   [        US5      (       aN  [        U R                  S-  U-  U R                  S-  U-  U R                  S-  U-  U R
                  S-  U-  5      $ [        U5      S   nU(       d  [        SU 35      e[        U 5      nUR                  U5      nU$ )Nr  r  r   zMatrix not invertible: )	r?   r*  r  r  r  r  r  r  r  )r(   r  r  r#  s       r)   r  Rect.__truediv__[9  s    1k"""Q"Q"QRTUVWW"1%#&=aS$ABBJKKOr+   c                 B    [        U R                  U R                  5      $ zBottom-left corner.r"  r  r  r/   s    r)   r  Rect.bottom_lefte9       TWWdgg&&r+   c                 B    [        U R                  U R                  5      $ zBottom-right corner.r"  r  r  r/   s    r)   r  Rect.bottom_rightj9  r=  r+   c                 $    U R                  U5      $ )z.Check if containing point-like or rect-like x.r{  r9  s     r)   containsRect.containso9        ##r+   c                 H    [        SU R                  U R                  -
  5      $ r   r   r  r  r/   s    r)   r0  Rect.heights9      1dgg'((r+   rs  c                 D    [        U R                  U R                  U5      $ zUCalculate area of rectangle.
parameter is one of 'px' (default), 'in', 'cm', or 'mm'.
_rect_arear  r0  r  s     r)   get_areaRect.get_areaw9      $**dkk488r+   c                     [        U5      S:w  a  [        S5      e[        X5      u  U l        U l        U l        U l        U $ )zExtend to include point-like p.r   rq  )r;   r   util_include_point_in_rectr  r  r  r  rs  s     r)   r*  Rect.include_point{9  s9    q6Q;122-G-P*$'47r+   c                    [        U5      S:w  a  [        S5      e[        U5      nUR                  (       d  U R                  (       a1  [        [        [
        [
        4u  U l        U l        U l        U l	        U $ UR                  (       a  U $ U R                  (       aI  UR                  UR                  UR                  UR                  4u  U l        U l        U l        U l	        U $ [        X5      u  U l        U l        U l        U l	        U $ )zExtend to include rect-like r.ro  r  )r;   r   r*  ru  rr  rs  r  r  r  r  rv  util_union_rectr  s     r)   r+  Rect.include_rect9  s    q6Q;011G==D,,1@/Sbds1s.DGTWdgtw  ZZK]]12qttQTT1441G.DGTWdgtw  2A1I.DGTWdgtwr+   c                 L   [        U5      S:X  d  [        S5      e[        U5      nUR                  (       a  U $ U R                  (       aI  UR                  UR
                  UR                  UR                  4u  U l        U l        U l        U l        U $ UR                  (       aI  UR                  UR
                  UR                  UR                  4u  U l        U l        U l        U l        U $ U R                  (       a  U $ [        X5      u  U l        U l        U l        U l        U $ )z)Restrict to common rect with rect-like r.ro  r  )
r;   r   r*  ru  r  r  r  r  rv  util_intersect_rectr  s     r)   r  Rect.intersect9  s    1v{011G==K12qttQTT1441G.DGTWdgtw  ZZ12qttQTT1441G.DGTWdgtw
 	 ]]K1DT1M.DGTWdgtwr+   c                    [        U5      n U R                  (       + =(       a    U R                  (       + =(       a    UR                  (       + =(       a    UR                  (       + =(       ay    U R                  UR                  :  =(       aY    UR                  U R                  :  =(       a9    U R
                  UR                  :  =(       a    UR
                  U R                  :  $ )z4Check if intersection with rectangle x is not empty.)r*  rv  ru  r  r  r  r  )r(   rb  rect2s      r)   
intersectsRect.intersects9  s    Q'%'(((' &' )))	'
 GGehh&' HHtww&' GGehh&' HHtww&		r+   c                 t    U R                   U R                  :  =(       d    U R                  U R                  :  $ z True if rectangle area is empty.r  r  r  r  r/   s    r)   rv  Rect.is_empty9  )     ww$''!7TWW%77r+   c                     U R                   U R                  s=:H  =(       a	    [        :H  Os  =(       a-    U R                  U R                  s=:H  =(       a	    [
        :H  $ s  $ )z'True if this is the infinite rectangle.r  r  rr  r  r  rs  r/   s    r)   ru  Rect.is_infinite9  ?     ww$''44_4^DGG9^9^9^^9^^r+   c                 t    U R                   U R                  :*  =(       a    U R                  U R                  :*  $ zTrue if rectangle is valid.ra  r/   s    r)   is_validRect.is_valid9  )     ww$''!8dgg&88r+   c                 n    U R                   (       a
  [        5       $ U R                  R                  X5      $ z?Morph with matrix-like m and point-like p.

Returns a new quad.ru  r  rF  r&  r(   r  r  s      r)   r&  
Rect.morph9  (      ?"yyq$$r+   c           	      p    [         R                  " [        U  Vs/ s H  oU-  PM	     sn5      5      $ s  snf r-   r  r  s     r)   r  	Rect.norm9  r  r  c                     U R                   U R                  :  a#  U R                   U R                  sU l        U l         U R                  U R                  :  a#  U R                  U R                  sU l        U l        U $ )z*Replace rectangle with its finite version.r9  r/   s    r)   r  Rect.normalize9  W    77TWW#wwDGTW77TWW#wwDGTWr+   c                 n    [        U R                  U R                  U R                  U R                  5      $ z!Return Quad version of rectangle.r  r#  r'  rJ  r$  r/   s    r)   rF  	Rect.quad9  %     DGGTWWdggtww77r+   c                 *    [        [        U 5      5      $ )zReturn the IRect.)r]  util_round_rectr/   s    r)   r  
Rect.round9  s    _T*++r+   c                 B    [        U R                  U R                  5      $ zTop-left corner.r"  r  r  r/   s    r)   r  Rect.top_left9  r=  r+   c                 B    [        U R                  U R                  5      $ zTop-right corner.r"  r  r  r/   s    r)   r  Rect.top_right9  r=  r+   c           	         [        U5      nU R                  (       d3  U R                  (       d"  UR                  (       d  UR                  (       a  [        S5      e[	        SSSSU R
                  * U R                  * 5      [	        UR                  U R                  -  UR                  U R                  -  5      -  [	        SSSSUR
                  UR                  5      -  $ z+Return matrix that converts to target rect.z'rectangles must be finite and not emptyr   r   	r*  ru  rv  r   r~  r  r  r  r0  r  s     r)   torectRect.torect9  s     Gt}}FGG1aAx$''2QWWtzz)188dkk+ABCQ1aqtt,-	
r+   c                     [        U5      S:X  d  [        S5      e[        X5      u  U l        U l        U l        U l        U $ )z1Replace with the transformation by matrix-like m.r  r  )r;   r   util_transform_rectr  r  r  r  r  s     r)   r  Rect.transform9  s9    1v{233-@-I*$'47r+   c                 H    [        SU R                  U R                  -
  5      $ r   r   r  r  r/   s    r)   r  
Rect.width9  rJ  r+   ra  )6r1   r2   r3   r4   r  r  r  r  r{  r  r  r  r   r  r  r  r  r,  r  r   r  r  r  rs  r  r  rD  r0  r  rO  r*  r+  r  r]  rv  ru  rj  r&  r  r  rF  r  r  r  r  r  r  r
  rJ  r$  r  r#  r'  r5   r.   r+   r)   r*  r*  8  s   9
T1"4
7! "&$4DTd &<1*)T ' ' ' '$ ) )9 9" 8 8 _ _ 9 9%3 8 8, ' ' ' '

 ) ) G	B	BUOE	B	Br+   r*  c            +          \ rS rSrSr\S 5       rS\4S jrS r	S\
S\
S	\4S
 jrS\S	\4S jrS\
S\
S\
S\
S	\4
S jrS\R"                  \\4   S	\4S jrS\
S\S	\4S jrS\
S\
S\
S	\4S jr SIS\
S\
S\S\S	\4
S jjrSS.S\S	\4S jjrS\S	\4S jr SJS\
S\
S \S	\4S! jjr SJS\
S\
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)\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)Lr  i:  zCreate a new shape.c                 J   [        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"  r  r  asinr%  rc  rb  pi)r  rq  rM
  alfas       r)   horizontal_angleShape.horizontal_angle:  s     !%LyyQSS"337ssax4(  ww~ 	 ssax  ur+   r   c                    [        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`   )rn  r   r   r0  r  r   r  rc  r0  rb  r  r  rs  pctmipctmr  	text_cont	totalcontr  r   r6  s     r)   r   Shape.__init__:  s    D	;;xx[))((**''))
&&((&&((..	iiZ
	r+   c                 \   U R                   c1  [        U5      S:X  a  [        X5      U l         g [        U5      U l         g [        U5      S:X  a  [        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 [        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  )r   r;   r*  r"  r  r  rb  r  rc  r   r  r  r9  s     r)   
updateRectShape.updateRect0:  s<   991v{ J	 G	 1v{!H"499<<5		"499<<5		"499<<5		"499<<5		G"499<<6		"499<<6		"499<<6		"499<<6		r+   rC  rD  rs  c                    [        U5      n[        U5      nU R                  U:X  dM  U =R                  [        [	        XR
                  -  5      5      S-   -  sl        Xl        U R                  U5        U =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"  r  r  r   r%  r  r  )r(   rC  rD  s      r)   r  Shape.draw_lineE:  s    2Y2Y2%NNijj(ABVKKN OOOB)HR**_$=>GGr+   rB  c           
         [        U5       H  u  p#US:X  aj  U R                  [        U5      :X  dP  U =R                  [	        [        [        U5      U R                  -  5      5      S-   -  sl        [        U5      U l        O@U =R                  [	        [        [        U5      U R                  -  5      5      S-   -  sl        U R                  U5        M     [        US   5      U l        U R                  $ )z%Draw several connected line segments.r   r  r  r  )rW  r  r"  r  r   r%  r  r  )r(   rB  rf  r  s       r)   r  Shape.draw_polylineS:  s    f%DAAv583NNiqDJJ9N0O&PSY&YYN&+AhDO)HU1X

5J,K"Lv"UUOOA &  r
+r+   r  r  c                 t   [        U5      n[        U5      n[        U5      n[        U5      nU R                  U:X  d6  U =R                  [        [	        XR
                  -  5      5      S-   -  sl        [	        [        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.r   c
)r"  r  r  r   r%  r  r   r  )r(   rC  rD  r  r  r  s         r)   r  Shape.draw_beziera:  s     2Y2Y2Y2Y2%NNijj(ABVKKNR**_-R**_0EERR\R\_H]]^)D/F22r+   tetrac                    [        U5      S:w  a  [        S5      e[        US   S5      (       a  [        U5      R                  nO[        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  d<  U =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.ro  zinvalid arg lengthr   r  rF  r  )r;   r   r?   r*  rF  r  r  r`  r_  r^  r  r  r   r%  r  r  r  r   )r(   r  r!  mtmrr  mls          r)   r  Shape.draw_ovalx:  sY   u:?12258[))U  AUATTQTTADD[C''TTQTTADD[C''TTQTTADD[C''TTQTTADD[C''2%NNijj(ABVKKN ODD"%DD"%DD"%DD"%r+   r  r  c                 p    U[         :  d  [        S5      e[        U5      nXS4-
  nU R                  XSSS9$ )r  radius must be positiver   r  Fr  )r  r   r"  r  )r(   r  r  rC  s       r)   r  Shape.draw_circle:  sC    677vqk!CEBBr+   c                     Sn[        U5      n[        U5      n[        U5      nXU-
  U-  -   nX2U-
  U-  -   nU R                  XXc5      $ )z4Draw a curve between points using one control point.7.SQ?)r"  r  )r(   rC  rD  r  kappak1k2s          r)   r  Shape.draw_curve:  sY     2Y2Y2Y7e##7e##//r+   rg  r  r  c                 z   [        U5      n[        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  d3  U =R                  U" [        X R                  -  5      6 -  sl        X l        [        SS5      nUnUnX-
  n[	        U5      nU[        :  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[        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[        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" [        [#        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[        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[        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" [        [#        UU R                  -  5      [#        UU R                  -  5      -   [#        XR                  -  5      -   5      6 -  sl        U(       a  U =R                  U" [        X R                  -  5      6 -  sl        U =R                  U" [        XR                  -  5      6 -  sl        U =R                  U" [        XR                  -  5      6 -  sl        Xl        U R                  $ )zDraw a circle sector.c                      [        X45      S-   $ )Nr  r   r    r  s     r)   r
  #Shape.draw_sector.<locals>.<lambda>:      )QF+f4r+   c                 $    [        XX#XE45      S-   $ )Nr  r  r  s         r)   r
  r  :  s    iqQ0B&Cf&Lr+   c                      [        X45      S-   $ )Nr  r  r  s     r)   r
  r  :  r  r+   r  r  r  r   r   r  r   ro  r   MbP?)r"  r  r  copysignr%  r  r  r  r%  r  r  r   r  rb  r  rc  r  r   )r(   r  rg  r  r  l3l4l5betarw360w90w45r   r  rq  rM
  r  r  q1q2r:  r;  r  kappahr  cp1cp2beta2s                               r)   r  Shape.draw_sector:  s    ve4L4dU#||DMM#u56"=ll4==U34Ag%j1tww;&ME %j1tww;&5(NNb(5::+=">??N#O!QK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(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(S4::%&cDJJ.>)??$q::~BVV#  N NNb(5::+=">??NNNb(6JJ+>"?@@NNNb(1zz>":;;Nr+   Nr  r   c          
         [        U5      nUc  U =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
r  r   rF  zbad radius value r   r  r   )r*  r  r   r%  r   rJ  r  r  r0  r  r#  r  r?   r   r  r;   r   r  r  r$  r'  )
r(   r   r  r#  rA  r  pyrxryr`  s
             r)   rR  Shape.draw_rect:  sM    J>NNi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+   rF  c                     [        U5      nU R                  UR                  UR                  UR                  UR
                  UR                  /5      $ )zDraw a Quad.)r  r  r  r^  r_  r`  )r(   rF  r!  s      r)   r  Shape.draw_quad$;  s;    J!!144qttQTT144"@AAr+   r  c                    [        U5      n[        U5      nX!-
  n[        U5      nS[        [        USU-  -  S5      5      -  nUS:  a  [	        S5      eXV-  n[        [        X5      5      nU) n	/ n
[        SU5       HJ  nUS-  S:X  a  [        US5      U-  nOUS-  S:X  a  [        US5      U-  nOM7  U
R                  X-  5        ML     U R                  U/U
-   U/-   5        U$ )z%Draw a zig-zagged line from p1 to p2.ro  r   points too closer   r  r   )
r"  r%  r8   r  r   r~  r]  rR  ro   r  )r(   rC  rD  r  rM
  r  r  r  r  i_matrB  rf  r  s                r)   r  Shape.draw_zigzag);  s     2Y2YG!f#eC1w;/3447/00Y/0q#A1uz!RL2%Q!!QK"$MM!)$  	B4&=B4/0	r+   c                 V   [        U5      n[        U5      nX!-
  n[        U5      nS[        [        USU-  -  S5      5      -  nUS:  a  [	        S5      eXV-  n[        [        X5      5      nU) n	Sn
/ n[        SU5       HV  nUS-  S:X  a  [        X* 5      U-  nO'US-  S:X  a  [        X5      U-  nO[        US5      U-  nUR                  X-  5        MX     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.ro  r   r  gh?3OP@r   r   r   )r"  r%  r8   r  r   r~  r]  rR  ro   r;   r  )r(   rC  rD  r  rM
  r  r  r  r  r  r  rB  rf  r  s                 r)   r  Shape.draw_squiggleF;  sI    2Y2YG!f#eC1w;/3447/00Y/0q#A1uz!RL2%Q!!K"$!QK"$MM!)$  "%&k!eckOOFIv!e}fUmDFA !eck 	r+   r  r  r   r  r   )r   r  r   r  r  r   rm  r   r  rC  r  r_  r&  r  r  r  r	  r   r  r   r  r  r   rm  r   r  rC  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[        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[        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 H2  n"U(       a	  US;  a  S n#OU n#U!R%                  ['        U"U#UU5      5        M4     U!n[)        U	S5      n$[)        U
S5      n%U
(       d  US:X  a  U	n
[)        U	S5      n%[+        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 R.                  n-U R0                  n.U&(       ak  [3        SSSSUS   R4                  U R4                  -   U-US   R6                  -
  U R6                  -
  5      n/U/) US   -  U/-  n0[9        [;        U05      5      S-   n1OSn1U-UR6                  -
  U R6                  -
  n2UR4                  U R4                  -   n3U2n4U'S:X  aJ  U-UR6                  -
  U R6                  -
  n3UR4                  * U R4                  -
  n2U1U*-  n1U.[=        U25      -
  n4OU'S:X  aG  U-* UR6                  -   U R6                  -   n3UR4                  U R4                  -   n2U1U+-  n1[=        U25      n4OdU'S:X  a^  UR4                  * U R4                  -
  n3U-* UR6                  -   U R6                  -   n2U1U,-  n1[=        UR6                  U R6                  -   5      n4U R                  R?                  U5      n5U5b  SU5-  n6Sn7OS=n6n7U R                  RA                  UUS9n8U8c  Sn8OS U8-  n8U(" U6U8U1U3U2UU5      n9US:  a/  U9S!U-  -  n9U9[9        X-  5      S"-   -  n9Ub  U9[9        U5      S#-   -  n9U	b  U9U$-  n9U
b  U9U%-  n9U9US   -  n9Sn:[        U5      S:  a  U9U)" U5      -  n9OU9S$-  n9[C        S[        U5      5       H+  n;U4U:  a    O$U;S:  a  U9S%-  n9U9UU;   S$-   -  n9U4U-  n4U:S-  n:M-     U9S&U7-  -  n9U =RD                  U9-  sl"        U:$ s  snf ! [         a    [        5          gf = f)'Nr   r   rQ	  r   r   r  r   r  r  r  r   r  r  rE  r  r%  r$  r#  r  r  r  r  r  c                 P    SU  U SU S[        X445       SU S[        U5       S3$ )Nr  BT
1 0 0 1 z Tm
/r    Tf r  r    r  r  rA  rg  r  ro  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,  rx  /OC /%s BDC
EMC
r  /%s gs
%i Tr  w  M TJz
T* z
ET
%sQ
)#rw  r   r   r   r  r;   r"  r   r  r  rk   rz   r7   r   r  r&  r0  r0  ro   getTJstrr  
CheckMorphr   r0  r  r~  rb  rc  r   r%  r%  rk  r  rR  r  )<r(   rg  r	  r   r  r   r  r  r   rm  r   r  rC  r  r_  r&  r  r  r  r   r  maxcoder/  r  r+  r  r  r  r  r  r  lheightr%  tabr  ro  	color_strfill_strmorphingry  templ1templ2cmp90cmm90cm180r0  r  r  r  r  r
  rE  spaceoptcontbdcemcr  r  nlinesrf  s<                                                               r)   r  Shape.insert_textn;  sr   0 F||<e},$$&DD4y1}e	388D>:>a3q6>:;G C  !"IEyy$$XZ % 
 !40A;J'(#&!J'[)	+G	!Q&nG(Y"67GS=XX--dGaK@Fh'FA&(BBJJx1fh78  eS)	T3'q(D ,He$8q=/00Ag3JC AgCiy8##$

 1aE!HJJ$7%(**9Ltvv9UVB#a.2%C8C=)G3B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$   S4 2S/S4 /S4 4T
T)r   r  r   r  r  r   rm  r   r  rC  r  r  r  r_  r&  r  r  r  r  r  c          
      >  ^^P^Q [        U5      nUR                  (       d  UR                  (       a  [        S5      e[	        U	S5      n[	        U
S5      nU
c  US:X  a  U	n
[	        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![        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[/        U5      (       au  [1        SSSSUS   R2                  U R2                  -   U R                  US   R4                  -
  U R4                  -
  5      n1U1) US   -  U1-  n2[7        [9        U25      5      S#-   n3OSn3Sn4[;        STU&-  5      n5US:X  a(  UR<                  U5-   n6UR                  n7UR                  n8OUS:X  a<  [;        TU&-  S5      n5UR>                  U5-   n6UR                  n7UR                  n8U3U-  n3OUS$:X  a?  [;        STU&-  5      * n5UR@                  U5-   n6UR                  n7S%n4UR                  n8U3U-  n3O>[;        TU&-  S5      * n5URB                  U5-   n6UR                  n7S%n4UR                  n8U3U-  n3/ n9[E        U*5       GHa  u  n:n;U;RG                  U5      RI                  S&5      n<[K        U<5      n=Sn>U7n?[M        U=5       H  n@U<U@   nAU." UA5      nBU?UB:  a  U>WAS&-   -  n>U?WBU/-   -  n?M(  U>(       a)  U>RO                  5       S-   n>U0U>-  n0U9RQ                  S'5        Sn>U7n?WBU7::  a  WAS&-   n>U7WB-
  U/-
  n?Mq  [K        U95      S:  a  S(U9S%'   WA H<  n+U." U>5      U7U." U+5      -
  ::  a  U>U+-  n>M  U>S-  n>U0U>-  n0U9RQ                  S(5        U+n>M>     U>S&-  n>U7U." U>5      -
  n?M     U>(       a$  U0U>RO                  5       -  n0U9RQ                  S(5        U:[K        U*5      S-
  :  d  GM\  U0S-  n0GMd     U0RS                  S5      (       a  U0SS% n0U0RU                  S5      S-   nCU)UC-  U'T-  -
  nDUDU8-
  nEUE[V        :  a  S%WE-  $ [Y        WE5      nEUE[V        :  a  SnES)U< U< S*3U3-   nFS+ nGU0R+                  5       nHS(U9S%'   [E        UH5       GH#  u  n:nISnJU7U." UI5      -
  nKU6U5U:U(-  -  -   nLUS:X  a2  US;   a  WL[;        WKS,-  S5      U4-  -   nLOwWL[;        SWKS,-  5      U4-  -
  nLOaUS,:X  a,  US;   a  WL[;        WKS5      U4-  -   nLOBWL[;        SWK5      U4-  -
  nLO/US-:X  a)  WIRU                  S&5      nMUMS:  a  U9U:   (       a  WKWM-  nJOSnJUWLR4                  -
  U R4                  -
  nNULR2                  U R2                  -   nOUS:X  a7  UWLR4                  -
  U R4                  -
  nOULR2                  * U R2                  -
  nNOzUS.:X  a7  U* WLR4                  -   U R4                  -   nOULR2                  U R2                  -   nNO=US$:X  a7  WLR2                  * U R2                  -
  nOU* ULR4                  -   U R4                  -   nNWFWG" WOWNU T5      -  nFUS:  a0  WFS/U-  -  nFUF[7        UT-  5      S0-   -  nFUb  WF[7        U5      S1-   -  nFUS-:X  a  WF[7        WJ5      S2-   -  nFU	b  WFU-  nFU
b  WFU-  nFWFS3[[        WIU-U$TQ5      -  -  nFGM&     WFS4U-  -  nFU =R\                  UF-  sl.        U R_                  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  rw  r  r  r  rQ	  r   r  r  r  r%  r   r  r  rE  r%   r  r  ?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   )r  r  r;   )rb  r  r   r%  r  s     r)   pixlen$Shape.insert_textbox.<locals>.pixlen<  sJ    !|q9q!F3q6N1-q9:XEE1v(( :s   A    r  rx  r  r   TFr  r  c                 @    S[        X45       SU S[        U5       S3$ )Nr  z Tm /r   r  r  )r    r  r  rA  s       r)   r
  &Shape.insert_textbox.<locals>.<lambda>4=  s'    Xi.?-@aS)TU,W[#\r+   r   r   r,  r  r  r  z Tw z%sTJ
zET
%sQ
)0r*  rv  ru  r   r  r   rk  r  rw  r0  r  r7   r  r&  r0  r   r   r   r  r   r  r  r0  r  r~  rb  rc  r   r%  r"  r#  rJ  r$  r'  rW  r  r:   r;   rR  r&   ro   r  r  r  r%  r  r  r  )Rr(   r   r	  r   r  r   r  r  r   rm  r   r  rC  r  r  r  r_  r&  r  r  r  r  r  r  r  r  r  ry  r   r  r  r0  r/  r  r+  r  r  r  r  r  lheight_factorr  r
  r  r  	tj_glyphsr  blenr   r  r  r  progrc_pntrg  maxwidth	maxheightjust_tabrf  rs   line_t	num_wordslbuffr	  r  wordpl_wlb_counttext_heightmorer  templtext_tr  r  plr  spacesr
  rE  r%  r  sR        `                                                                          @@r)   rT  Shape.insert_textbox+<  s(	   X Dz==D,,DEEeS)	T3'<K1,D ,H))11"5!G+CCNC# 		&&.\&J=E&EB;!<==Ag3JC AgCi F||"%/4;;AtzzA##$C  !"IEyy$$XZ % 
 !40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8C=)G3BB
 aH,-!8GGeOEzzHIBY(X-q1EGGeOE{{H

I%KBCZ1h122EGGeOEzzHE{{I%KB 8h.22E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 05 88Caa 05 88C!(?b!u 44Cau 44C!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 	! Hx9fhGGGD_ &b 	c!!$] + Bs   /b'br  r  r  r  r   r  c           
         U R                   S:X  a  gUS:X  a  SnOUc  Sn[        US5      n[        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         [        U5      (       a  [        S
SSS
US   R                  U R                  -   U R                  US   R                  -
  U R                  -
  5      nU) US
   -  U-  n[        [        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    w
z%i J
z%i j
)Nr`   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
r  r  Q
)r  r  r   rk  r  r   r  r  r~  rb  r0  rc  r%  r  )r(   r  rm  r   r  r  r  r   r&  r  r  r  r  r  r  r  r  r  r  r  s                       r)   rS  Shape.finisho=  sw   , >>RA:E]E eS)	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&x}5?$..PDN'DNN2U::r+   r  c                    [        U R                  5        U =R                  U R                  -  sl        U R                  R	                  5       U l        U R                  (       ag  U(       a  U R                  R                  5         [        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.
r  Nr`   )rn  r   r  r  r  r  r  r.  r0  rU
  r  r   r  )r(   r  r  s      r)   rU  Shape.commit=  s     	DII$..(..0>>		'')))$))T7CDHH""48	r+   )r0  r  r0  r  r  r   r  r   r  r  r  rb  rc  r%  )r   )r   rn  Nr   r   NFNTr   r   r   )(r1   r2   r3   r4   r  rx  r  r   r   r  r   r"  r  r   r  r  r  r  r   r   r  r  r  r  rw  r  rR  r  r  r  r   ru  rt  r8   rv  r  rT  rS  rU  r5   r.   r+   r)   r  r  :  s    &T (7*J J 5 D U   	
  
.v||Iy,@A e 0C* Ce C C00 0 	0
 
0(  HH H 	H
 H 
HT 48 1i 1E 1fBi BE 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+   r  c                       \ rS rSrSS jrS r\S 5       r\S 5       r	S r
SS jrSS	 jrSS
 jrS rSS jr\SS j5       r\SS j5       rSS jr " S S5      rSS jrSS jrSS jrSS jrSrg)r  i=  Nc                    [         R                  " UR                  S5      5      nU(       a   [        U[        5      (       d  [	        U5      nU(       a  UR
                  O[         R                  " S 5      n[        [         S5      (       a  [         R                  " XRX65      U l        g [         R                  " XRX65      U l        g )Nr  FzStoryS)
r   r  r  rB   rz  r   	FzArchiver?   r/  FzStory)r(   r  r  emr  r3  archs          r)   r   Story.__init__=  s{    66G8LM:gw77g&G&w||EOOT,B5*%%2DDIw"CDIr+   c                 P   U R                   nSnUR                  SSS5      nU(       a~  UR                  n[        U5      S:X  aF  US   S:X  a=  US   S;   a4  UR	                  S5      nU(       d  SU 3nUR                  SU5        US-  nUR                  SSS5      nU(       a  M}  gg)	z\
Look for `<h1..6>` items in `self` and adds unique `id`
attributes if not already present.
r   Nr   r  r   123456rX  h_id_)r  r   r  r;   r  r  r  )r(   domrf  rb  r   attrid_s          r)   add_header_idsStory.add_header_ids=  s    
 iiHHT4&99D4yA~$q'3,47h3F,,T2!!+COOD#.FAD$-A ar+   c                    [        U [        5      (       a  U nO[        SU 5      n[        5       nU HL  nUR                  S-  (       d  M  UR                  (       d  M,  UR                  U;   a  M>  XCUR                  '   MN     U GH1  nUR                  S-  (       d  M  UR
                  (       d  M-  [        5       n[        UR                  5      US'   UR
                  R                  S5      (       aN  UR
                  SS n X7   n [        US'   UR                  u  pp[        X5      US	'   UR                   S-
  US
'   OTUR
                  R                  S5      (       a  ["        US'   UR
                  SS US'   O[$        US'   UR
                  US'   X%R                   S-
     R'                  U5        GM4     U$ ! [         a+  n	[        S:  a
  [        5         [        SU SU 35      U	eSn	A	ff = f)aF  
Adds links to PDF document.
Args:
    document_or_stream:
        A PDF `Document` or raw PDF content, for example an
        `io.BytesIO` instance.
    positions:
        List of `ElementPosition`'s for `document_or_stream`,
        typically from Story.element_positions(). We raise an
        exception if two or more positions have same id.
Returns:
    `document_or_stream` if a `Document` instance, otherwise a
    new `Document` instance.
We raise an exception if an `href` in `positions` refers to an
internal position `#<name>` but no item in `positions` has `id =
name`.
r`  r   r  r#  NzNo destination with id=z, required by position_from: r  r	  r   zname:r   r   r  )rB   r   r9   
open_closerX  r6  r*  r   r7   rk   r  rz   r   r'   r  r"  page_numr7  r  r0  )document_or_stream	positionsr   id_to_positionpositionposition_fromr  	target_idposition_torg  r  r  r  r  s                 r)   add_pdf_linksStory.add_pdf_links>  s   & ((33)H'9:H
 !H##a''X[[[;;.03;HKK0 " 'M((1,,-2D2D2D v#M$6$67V %%0055 - 2 212 6IE&4&@ 
 $-DL%0%5%5NBB "'rDJ#.#7#7!#;DL %))44W=='1V'4'9'9!"'=V'/V&3&8&8U //!34@@FQ 'T ; % E/!38H*-DYKOlmzl{+|}  DE  EEs   F;;
G0&G++G0c                 B    U R                  5       nUR                  5       $ r-   )r   rd  r(   r8  s     r)   r  
Story.bodyW>  s    mmo{{}r+   c                 X    [         R                  " U R                  5      n[        U5      $ r-   )r   fz_story_documentr   r  rJ  s     r)   r   Story.document\>  s     %%tyy1Cyr+   c                     [        U5      nU(       a  UR                  O[        R                  " S 5      n[        R                  " U R                  XC5        g r-   )r  r   r   rJ  fz_draw_story)r(   rR  r  ctm2rz  s        r)   draw
Story.draw`>  s6     &)#fkk)>TYY2r+   c                   ^^ [        T5      [        L aN  TR                  5        H9  n[        U5      [        L a  UR	                  5       (       a  M,  [        SU S35      e   O0 m[        T5      (       a  TR                  R                  S:w  a  [        S5      eUU4S jn[        R                  " U R                  U5        g)zE
Trigger a callback function to record where items have been placed.
zinvalid key 'r   r   z@callback 'function' must be a callable with exactly one argumentc                   >  " S S5      nU" 5       nU R                   Ul         U R                  Ul        U R                  Ul        [        U R                  5      Ul        U R
                  Ul        U R                  Ul        U R                  Ul        U R                  Ul	        T(       a%  TR                  5        H  u  p4[        X#U5        M     T" U5        g )Nc                       \ rS rSrSrg)=Story.element_positions.<locals>.function2.<locals>.Position2is>  r.   Nr1   r2   r3   r4   r5   r.   r+   r)   	Position2rW  s>  s    r+   rY  )r+	  headingrX  ro  r   r   r>  rectangle_numrect_numr6  rF   setattr)rC  rY  	position2r  rJ   r  rm   s        r)   	function2*Story.element_positions.<locals>.function2r>  s     !I&nnIO ( 0 0I#;;IL,X]];IN%]]IN#+#6#6I !)!7!7I%]]IN JJLDAY1- )i r+   N)r   r9   ry  r   isidentifierr   r  __code__co_argcountr   fz_story_positionsr   )r(   rm   r  r  r_  s    ``  r)   element_positionsStory.element_positionse>  s     :YY[Q31>>+;+;$}QCq%9:: ! D!!X%6%6%B%Ba%G_``	!  	  $))Y7r+   c                     [        U5      n[        R                  " 5       n[        R                  " U R                  XU5      nU[        U5      4$ )z%
Wrapper for fz_place_story_flags().
)r  r   rp  fz_place_story_flagsr   ro  )r(   wherer  r  r   s        r)   placeStory.place>  sA      '))499eUK_f---r+   c                 D    [         R                  " U R                  5        g r-   )r   fz_reset_storyr   r/   s    r)   rP
  Story.reset>  s    dii(r+   c                 (  ^^ S nSmSn[        SSSS5      n U" Xg5      u  pn
US-  nU(       a  TS-  mU R                  U	5      u  pT(       a  UU4S jnU R                  U5        U(       a  U(       aJ  U(       a!  U(       a
  U" TXS5        UR                  5         UR	                  U5      nU(       a
  U" TXS5        U R                  XZ5        U(       d!  U(       a
  U" TXS5        UR                  5         OU R                  S U
5        U(       d  g M  )Nr   r   c                 $   > TU l         T" U 5        g r-   )r?  )rC  r?  
positionfns    r)   positionfn2 Story.write.<locals>.positionfn2>  s     )1H%x(r+   )r*  rj  re  r  r  rR  )r(   rL  rectfnrq  pagefnrz  r\  r  r6  r   r  r   rr  r?  s      `         @r)   r   Story.write>  s    aAq!"(":HCMHA::t,LD)
 &&{3!"8XA>) ++X6Cx:		3$(;OO%		$$A r+   c	                   ^^^ [        5       mS n	 U	n
U" T5      n	SmX:X  a  SmU	n[        XXG5      nU(       a  UR                  5         [        5       mUUU4S jnUR                  T(       a  U OS UUU5        T(       a  g Mq  )NFTc                 X   > TR                  U 5        T(       a  T(       a	  T" U 5        g g g r-   rC
  )rC  rq  rA  stables    r)   rr  +Story.write_stabilized.<locals>.positionfn2>  s%      *jx( )6r+   )r   r  r;  r   )rL  	contentfnrt  r  r2  rq  ru  r  r;  r  content_prevcontent2r  rr  rA  ry  s        `        @@r)   write_stabilizedStory.write_stabilized>  s    F	"L+GF&H(b:E$$&I)
 KK$F$	 3 r+   c                    ^^ [         R                  " 5       n[        U5      n	/ mUU4S jn
[        R	                  XXX:XVU5	        U	R                  5         UR                  S5        [        R                  UT5      $ )Nc                 H   > TR                  U 5        T(       a	  T" U 5        g g r-   rC
  rC  rq  rA  s    r)   rr  6Story.write_stabilized_with_links.<locals>.positionfn2>  !    X&8$ r+   r   )r=   r  r  r  r~  r  r
  rG  )r{  rt  r  r2  rq  ru  r  r;  r   rL  rr  rA  s       `      @r)   write_stabilized_with_links!Story.write_stabilized_with_links>  se     '		%
 	v&BU[ftuA""6955r+   c                    ^^ [         R                  " 5       n[        U5      n/ mUU4S jnU R                  XQXcS9  UR	                  5         UR                  S5        [        R                  UT5      $ )Nc                 H   > TR                  U 5        T(       a	  T" U 5        g g r-   rC
  r  s    r)   rr  +Story.write_with_links.<locals>.positionfn2>  r  r+   )rq  ru  r   )r=   r  r  r   r  r
  r  rG  )r(   rt  rq  ru  r   rL  rr  rA  s     `    @r)   r  Story.write_with_links>  s[    '		%
 	

6k
IA""6955r+   c                   (    \ rS rSrSrSS jrS rSrg)Story.FitResulti>  a   
The result from a `Story.fit*()` method.

Members:

`big_enough`:
    `True` if the fit succeeded.
`filled`:
    Tuple (x0, y0, x1, y1) from the last call to `Story.place()`. This
    will be wider than .rect if any single word (which we never split)
    was too wide for .rect.
`more`:
    `False` if the fit succeeded.
`numcalls`:
    Number of calls made to `self.place()`.
`parameter`:
    The successful parameter value, or the largest failing value.
`rect`:
    The pumupdf.Rect created from `parameter`.
Nc                 L    Xl         X l        X0l        X@l        XPl        X`l        g r-   r  r  r   numcallsr  r   )r(   r  r  r   r  r  r   s          r)   r   Story.FitResult.__init__?  s     (O KI$M&NIr+   c                     SU R                    SU R                   SU R                   SU R                   SU R                   SU R
                   3$ )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=r  r/   s    r)   r   Story.FitResult.__repr__?  sP    "4??"3t{{mTYYK !$..!1TYYK)r+   r  rq  )r1   r2   r3   r4   r  r   r   r5   r.   r+   r)   	FitResultr  >  s    	(		r+   r  c                 r  ^ ^^^^^^^^ U4S jm[        T[        [        45      (       d  Tb   e[        T[        [        45      (       d  Tb   e " UUU4S jS5      nU" 5       mT(       a%  T" STR                  < STR                  < S35        T R                  5         UUUU4S jnUUUU UU4S	 jmS
 n	TR                  c8  T(       a  T" S5        U	" TR                  S5      n
 T" U
5      (       d  OCU
S-  n
M  T" TR                  5      (       a%  T(       a  T" STR                  < S35        U" 5       $ TR                  c8  T(       a  T" S5        U	" TR                  S5      n
 T" U
5      (       a  OJU
S-  n
M  T" TR                  5      (       d,  STl        T(       a  T" STR                  < S35        U" 5       $ T(       a%  T" STR                  < STR                  < S35         TR                  TR                  -
  U:  a  U" 5       $ TR                  TR                  -   S-  n
T" U
5        MJ  )a  
Finds optimal rect that contains the story `self`.

Returns a `Story.FitResult` instance.
    
On success, the last call to `self.place()` will have been with the
returned rectangle, so `self.draw()` can be used directly.

Args:
:arg fn:
    A callable taking a floating point `parameter` and returning a
    `pymupdf.Rect()`. If the rect is empty, we assume the story will
    not fit and do not call `self.place()`.

    Must guarantee that `self.place()` behaves monotonically when
    given rect `fn(parameter`) as `parameter` increases. This
    usually means that both width and height increase or stay
    unchanged as `parameter` increases.
:arg pmin:
    Minimum parameter to consider; `None` for -infinity.
:arg pmax:
    Maximum parameter to consider; `None` for +infinity.
:arg delta:
    Maximum error in returned `parameter`.
:arg verbose:
    If true we output diagnostics.
:arg flags:
    Passed to mupdf.fz_place_story_flags(). e.g.
    zero or `mupdf.FZ_PLACE_STORY_FLAG_NO_OVERFLOW`.
c                 4   > T(       d   e[        SU  35        g )Nzfit(): rv   )r   r
  s    r)   r'   Story.fit.<locals>.log<?  s    N7gdV$%r+   Nc                   &   > \ rS rSrU UU4S jrSrg)Story.fit.<locals>.StateiC?  c                    > TU l         TU l        S U l        S U l        S U l        SU l        T(       a  TU l        TU l        g g r   )pminpmaxpmin_resultpmax_resultr  r  pmin0pmax0)r(   r  r  r
  s    r)   r   !Story.fit.<locals>.State.__init__D?  sE     	 	#' #' " !!%DJ!%DJ r+   )r  r  r  r  r  r  r  r  Nr   )r  r  r
  s   r)   Stater  C?  s    	& 	&r+   r  zstarting. state.pmin= state.pmax=r   c            
        > TR                   bQ  TR                  TR                   :w  a*  T(       a  T" S5        T" TR                   5      n U (       d   eTR                  nO:TR                  (       a  TR                  O[        R                  TR                  S9nT(       a6  T" STR                  < STR                  < STR                   < SU< 35        U$ )NzCCalling update() with pmax, because was overwritten by later calls.)r  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  r  r  r  r  r  )r  r  r'   r  rG  r
  s     r)   rK   Story.fit.<locals>.retU?  s    zz%<<5::-ac!'

!3J%%:**.3.?.?**U__^c^l^l_Em-n~]uzzmK_X^W`abMr+   c                 B  > T" U 5      n[        U[        5      (       d   S[        U5      < SU< 35       eUR                  (       a0  Sn[        R                  U T
R                  S9nT(       a  T" S5        O|T	R                  UT5      u  pET
=R                  S-  sl        U(       + n[        R                  UUT
R                  U UUS9nT(       a#  T" ST
R                  S	 S
U< SU < SU< S3	5        U(       a  U T
l        UT
l	        OU T
l
        UT
l        U T
l        U$ )z
Evaluates `more, _ = self.place(fn(parameter))`. If `more` is
false, then `rect` is big enough to contain `self` and we
set `state.pmax=parameter` and return True. Otherwise we set
`state.pmin=parameter` and return False.
ztype(rect)=r  F)r  r  z9update(): not calling self.place() because rect is empty.r   )r  r   r  r  r   r  zupdate(): called self.place(): z>2dz: more=r  r   )rB   r*  r   rv  r  r  r  rj  r  r  r  r  r  )r  r   r  r  r   r  r  fnr'   r(   r  r
  s         r)   rG  Story.fit.<locals>.updatec?  s    i=DdD))Ckd4j]'D7+CC)}}"
9u~~VSU#zz$6!#!%X
%!!&"+!#- )  9%..9MXPTwVbXaWccjeidkklmn&
$*!&
$*!$ELr+   c                 8    U b  U S:X  a  U$ X-  S:  a  SU -  $ U * $ )zq
Returns same sign as `direction`, larger or smaller than `p` if
direction is positive or negative respectively.
r   r   r.   )r  	directions     r)   oppositeStory.fit.<locals>.opposite?  s/    
 yAqD  }q 1u2Ir+   zfinding pmin.r  r   r   zstate.pmin=z is big enough.zfinding pmax.z No solution possible state.pmax=z$doing binary search with state.pmin=)rB   r8   r  r  r  rP
  )r(   r  r  r  r  r
  r  r  rK   r  r  r'   r  rG  s   ```` ``    @@@r)   r  	Story.fit?  s   >	& $e--==$e--==
	& 
	& (UZZM5::-q9:

	 	#	 #	J		 ::m- R0Ii((Q	 
 ejj!!C;5::- ?@u::m- R0I)$$Q	 
 %**%%!
C"C

}A FGu C?EJJ=%**aPQzzEJJ&.uejj0A5I9	 r+   c                 b   ^
^^^ Uu  mmpxUT-
  mUT-
  m
U
UUU4S jn	U R                  XX4XV5      $ )a1  
Finds smallest value `scale` in range `scale_min..scale_max` where
`scale * rect` is large enough to contain the story `self`.

Returns a `Story.FitResult` instance with `.parameter` set to `scale`.

:arg width:
    width of rect.
:arg height:
    height of rect.
:arg scale_min:
    Minimum scale to consider; must be >= 0.
:arg scale_max:
    Maximum scale to consider, must be >= scale_min or `None` for
    infinite.
:arg delta:
    Maximum error in returned scale.
:arg verbose:
    If true we output diagnostics.
:arg flags:
    Passed to Story.place().
c                 8   > [        TTTU T-  -   TU T-  -   5      $ r-   r/  )r=  r0  r  r  r  s    r)   r  Story.fit_scale.<locals>.fn?  s&    BU5[ 0"uV|2CDDr+   r  )r(   r   r  r  r  r
  r  r  r  r  r0  r  r  r  s             @@@@r)   r  Story.fit_scale?  sA    . BRb	E 	ExxyHHr+   c                 R   ^^	^
 Uu  mm
TU-   m	UU	U
4S jnU R                  XrX5U5      $ )a   
Finds smallest height in range `height_min..height_max` where a rect
with size `(width, height)` is large enough to contain the story
`self`.

Returns a `Story.FitResult` instance.

:arg width:
    width of rect.
:arg height_min:
    Minimum height to consider; must be >= 0.
:arg height_max:
    Maximum height to consider, must be >= height_min or `None` for
    infinite.
:arg origin:
    `(x0, y0)` of rect.
:arg delta:
    Maximum error in returned height.
:arg verbose:
    If true we output diagnostics.
c                 &   > [        TTTTU -   5      $ r-   r/  )r0  r  r  r  s    r)   r  Story.fit_height.<locals>.fn?  s    BBvI..r+   r  )r(   r  
height_min
height_maxoriginr  r
  r  r  r  r  s           @@@r)   
fit_heightStory.fit_height?  s/    , B%Z	/xx
7CCr+   c                 R   ^^	^
 Uu  mm	T	U-   m
UU	U
4S jnU R                  XrX5U5      $ )a  
Finds smallest width in range `width_min..width_max` where a rect with size
`(width, height)` is large enough to contain the story `self`.

Returns a `Story.FitResult` instance.
Returns a `FitResult` instance.

:arg height:
    height of rect.
:arg width_min:
    Minimum width to consider; must be >= 0.
:arg width_max:
    Maximum width to consider, must be >= width_min or `None` for
    infinite.
:arg origin:
    `(x0, y0)` of rect.
:arg delta:
    Maximum error in returned width.
:arg verbose:
    If true we output diagnostics.
c                 &   > [        TTTU -   T5      $ r-   r/  )r  r  r  r  s    r)   r  Story.fit_width.<locals>.fn	@  s    B5"--r+   r  )r(   r0  	width_min	width_maxr  r  r
  r  r  r  r  s           @@@r)   	fit_widthStory.fit_width?  s/    , B&[	.xxyAAr+   r#  )r`   Nr  Nr-   rn  r
  )Nr  NNNT)NNr  Fr   )r   Nr  Fr   )r   Nr  r  F)r1   r2   r3   r4   r   r;  rx  rG  rs  r  r   rR  re  rj  rP
  r   r~  r  r  r  r  r  r  r  r5   r.   r+   r)   r  r  =  s    D.& R Rh  3
8>.)%N  > 6 66% %NXtI<D8Br+   r  c                       \ rS rSrS rS rS rSS jrS rSS\	4S	 jjr
S\4S
 jrSS jrSS\4S jjrSS\	4S jjrSS\4S jjrS rSS\4S jjrS rSS jrS\4S jrS\4S jrS r\S 5       rSS jr\rSrg)r  i@  c                    [        U[        R                  5      (       a!  US   n[        R                  " U5      U l        O8[        U[        R                  5      (       a  US   U l        O[        SU 35      eSU l        S U l        g )Nr   Unrecognised args: T)rI  r   rp  r  r   rk   r   r   )r(   r  r6  s      r)   r   TextPage.__init__@  sm    dELL))AwH))84DIe//00QDI1$899r+   c                 v   U R                   n[        R                  " S5      n[        R                  " U5      nUS:X  a  [        R                  " XBS5        OGUS:X  a  [        R
                  " XBS5        O)US:X  a  [        R                  " XBS5        O[        X25        UR                  5         [        U5      nU$ )Nrp  r   r   r   ro  )
r   r   r	  r	  fz_print_stext_page_as_htmlfz_print_stext_page_as_xmlfz_print_stext_page_as_xhtmlJM_print_stext_page_as_textr	  r  )r(   r  
this_tpager$  r	  r   s         r)   _extractTextTextPage._extractText@  s    YY
!!$'nnc" a<--cqA\,,Sa@\..sB'8%c*r+   c                 0    [        U R                  X5        g r-   )JM_make_textpage_dictr   )r(   	page_dictrU  s      r)   _getNewBlockListTextPage._getNewBlockList0@  s    dii8r+   c                     U R                   R                  U R                   R                  S.nU R                  X!5        U$ )Nrk	  )r   r  r0  r  )r(   rU  r  s      r)   _textpage_dictTextPage._textpage_dict3@  s2    "iioo9I9IJ	i-r+   c                 D     [        R                  " U R                  5      $ )z*Return a list with text block information.)"r  r   extractBLOCKSr   r   rp  r   r6  r	  Fixed_EMPTYr   FZ_STEXT_BLOCK_TEXTfz_clear_bufferJM_char_bboxJM_rects_overlapr  JM_append_runer  fz_union_rectr  fz_append_byter  r5  i_imager  r<  r   r  r  r  r  r  r  ro   )r(   block_nr  tp_rectr$  rX  block	blockrectline_n	last_charrs   linerectr  cbboxr   r/  r  litems                     r)   r  TextPage.extractBLOCKS8@  s    &&tyy11r+   Nrs  c                     U R                  SS9nUb  UR                  US'   UR                  US'   U(       a  US   nUR                  S S9  XCS'   U$ )z>Return page content as a Python dict of images and text spans.FrU  r  r0  blocksc                 "    U S   S   U S   S   4$ Nr5  r   r   r.   r  s    r)   r
  &TextPage.extractDICT.<locals>.<lambda>w@      qy|QvYq\&Br+   r
  r  r  r0  r  r(   rz  r  r  r  s        r)   extractDICTTextPage.extractDICTo@  s[    !!e!,>88CLIICM]FKKBKC"M
r+   c                 $    U R                  S5      $ )z%Return page content as a HTML string.r   r  r/   s    r)   extractHTMLTextPage.extractHTML{@  rF  r+   c           	      H   SnU R                   n/ nU GH
  nUS-  nUR                  R                  [        R                  :X  a  M3  UR                  5       nSnUR                  5       nUR                  (       a  Sn	OSn	[        R                  " U5      n
U
R                  (       a  U
R                  5       nSn
U(       a  [        R                  " [        [        [        [        5      n[        R                  " U5      (       d   e[        R                  " UR                  5       SSUR                  5       SS5      n[        R                   " XkU5      u  pn[        R"                  " U5      n[%        U5      nUS:X  a2  UR                  5       UR                  5       -  UR'                  5       -  n[        R(                  " [        R*                  " UR                  R,                  5      5      n[/        5       nUU[0        '   [3        UR                  R4                  5      U[6        '   [9        UR;                  5       5      U[<        '   UR                  5       U[>        '   UR                  5       U[@        '   [        RB                  " U5      U[D        '   [        RF                  " U5      U[H        '   URK                  5       U[L        '   URO                  5       U[P        '   URS                  5       U[T        '   UU[V        '   U(       a  WUS'   U	US'   URY                  U5        GM     U$ )	z*Return a list with image meta information.r  r   r   TFNr  zhas-mask)-r   r   r   r   r  r  r  r  fz_compressed_buffer_sizer\  rr  rs  rL  r{  r   r  rq  r  r  rI   r-  ll_fz_keep_colorspacer  r9   dictkey_numberro  r5  dictkey_bboxrz  i_transformdictkey_matrixdictkey_widthdictkey_heightr@  dictkey_colorspacer<  r  r  dictkey_xresr  dictkey_yresr  dictkey_bpcr  ro   )r(   r  r  r  r   r  r/  img_sizer  has_mask
compr_buffr#  r  r  r   r  r  r  
block_dicts                      r)   r  TextPage.extractIMGINFO@  sa   YY
EqLG$$(A(AA--/CH88:D 99#>J$$%??A!
MM/?OUde11!4444NN3557Aq#%%'1a@!::31E	--c2vq="uuw03557:H##E$?$?@Y@Y$Z[BJ)0J~&'6u7G7G7L7L'MJ|$):5;L;L;N)OJ~&(+J}%),J~&-2-B-B2-FJ)**/*B*B2*FJ''*xxzJ|$'*xxzJ|$&)ggiJ{#'/J|$'-
8$%-Jz"IIj!Q  R 	r+   c                   ^ SSK mSSKnU R                  SS9n " U4S jSUR                  5      nUb  UR                  US'   UR
                  US'   U(       a  US	   nUR                  S
 S9  XdS	'   UR                  USUSS9nU$ )z.Return 'extractDICT' converted to JSON format.r   NFr  c                   "   > \ rS rSrU 4S jrSrg)'TextPage.extractJSON.<locals>.b64encodei@  c                 v   > [        U5      [        [        4;   a  TR                  U5      R	                  5       $ g r-   r   r  r  	b64encoder  r(   r  base64s     r)   r   /TextPage.extractJSON.<locals>.b64encode.default@  3    7ui00!++A.5577 1r+   r.   Nr1   r2   r3   r4   r   r5   r  s   r)   r  r  @      8 8r+   r  r  r0  r  c                 "    U S   S   U S   S   4$ r  r.   r  s    r)   r
  &TextPage.extractJSON.<locals>.<lambda>@  r  r+   r
  r   rc   r   
separatorsr  r  r  r\  r  JSONEncoderr  r0  r  dumpsr(   rz  r  r\  r  r  r  r  s          @r)   extractJSONTextPage.extractJSON@  s    !!e!,	8(( 	8
 >88CLIICM]FKKBKC"Mjj1jM
r+   c                     U R                  SS9nUb  UR                  US'   UR                  US'   U(       a  US   nUR                  S S9  XCS'   U$ )zCReturn page content as a Python dict of images and text characters.Tr  r  r0  r  c                 "    U S   S   U S   S   4$ r  r.   r  s    r)   r
  )TextPage.extractRAWDICT.<locals>.<lambda>@  r  r+   r
  r  r  s        r)   extractRAWDICTTextPage.extractRAWDICT@  s[    !!d!+>88CLIICM]FKKBKC"M
r+   c                   ^ SSK mSSKnU R                  SS9n " U4S jSUR                  5      nUb  UR                  US'   UR
                  US'   U(       a  US	   nUR                  S
 S9  XdS	'   UR                  USUSS9nU$ )z1Return 'extractRAWDICT' converted to JSON format.r   NTr  c                   "   > \ rS rSrU 4S jrSrg)*TextPage.extractRAWJSON.<locals>.b64encodei@  c                 v   > [        U5      [        [        4;   a  TR                  U5      R	                  5       $ g r-   r  r  s     r)   r   2TextPage.extractRAWJSON.<locals>.b64encode.default@  r  r+   r.   Nr  r  s   r)   r  r/  @  r  r+   r  r  r0  r  c                 "    U S   S   U S   S   4$ r  r.   r  s    r)   r
  )TextPage.extractRAWJSON.<locals>.<lambda>@  r  r+   r
  r  r   r   r"  r%  s          @r)   extractRAWJSONTextPage.extractRAWJSON@  s    !!d!+	8(( 	8
 >88CLIICM]FKKBKC"Mjj1jM
r+   c                 v    [        U5      n[        U5      n[        R                  " U R                  X4S5      nU$ r   )r  r   fz_copy_selectionr   )r(   pointapointbr    r  r  s         r)   extractSelectionTextPage.extractSelection@  s3    V$V$''		1;r+   c                     U(       d  U R                  S5      $ U R                  5       SS nUR                  S S9  SR                  U Vs/ s H  o3S   PM	     sn5      $ s  snf )z%Return simple, bare text on the page.r   Nc                     U S   U S   4$ )Nr   r   r.   r  s    r)   r
  &TextPage.extractText.<locals>.<lambda>@  s    1Q41,r+   r
  r`   ro  )r  r  r  r  )r(   r  r  r  s       r)   extractTextTextPage.extractText@  s[    $$Q''##%a(./wwf-f!f-..-s   A c                     U R                   n[        U[        R                  5      (       d   e[	        U5      n[        X#5      n[        U5      nU$ r-   )r   rB   r   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)r(   r   r  rn  r  r   s         r)   r{  TextPage.extractTextbox@  sG    YY
*e&7&78888t$!*3-e4	r+   c                 F     [        R                  " U R                  U5      $ )z)Return a list with text word information.)r  r   extractWORDSr   r   rp  r  r   r6  r	  r   r  r  r  r  r  r  JM_is_word_delimiterJM_is_rtl_charr  JM_append_wordr  r  )r(   
delimitersbuflenlast_char_rtlr  wbboxr  r  rX  r  r  r  rs   word_nr  r  word_delimiterthis_char_rtls                     r)   rF  TextPage.extractWORDS@  s    %%dii<<r+   c                 $    U R                  S5      $ )z&Return page content as a XHTML string.ro  r  r/   s    r)   extractXHTMLTextPage.extractXHTML4A  rF  r+   c                 $    U R                  S5      $ )z$Return page content as a XML string.r   r  r/   s    r)   
extractXMLTextPage.extractXML8A  rF  r+   c                     U R                   n[        R                  " UR                  R                  5      n[        R
                  " U5      nSUl        U$ )zTextPage current poolsize.N)r   r   Poolr   poolfz_pool_size)r(   ry  rZ  r  s       r)   poolsizeTextPage.poolsize<A  sA    		zz%**//0!!4(r+   c                 v    U R                   nUR                  R                  n[        U5      n[	        U5      nU$ )zPage rectangle.)r   r   r6  ro  r*  )r(   r  r6  r  s       r)   r   TextPage.rectDA  s6     YY
((11h'3i
r+   c                    [        U R                  U5      nU(       d  U$ [        U5      n[        U5       H+  n[	        XF   5      nU(       a  XtU'   M  UR
                  XF'   M-     U(       a  U$ SnXeS-
  :  aY  XF   nXFS-      n	UR                  U	R                  :w  d  X-  R                  (       a  US-  nMG  X-  XF'   XFS-   	 US-  nXeS-
  :  a  MY  U$ )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r;   rR  r  r   r  rv  )
r(   needlehit_maxrZ
  r  rF   rf  r!  v1v2s
             r)   r  TextPage.searchNA  s    "499f5JCuASVAA  J!)mBUBuu~"'!3!3QWCFE
QJE !)m 
r+   rm  rt  rZ  rn  r-   )r   r   )r1   r2   r3   r4   r   r  r  r  r  r9   r  r   r  r  r&  r+  r4  r:  r?  r{  rF  rS  rV  r\  rs  r   r  extractTEXTr5   r.   r+   r)   r  r  @  s    	*9
5n
$ 
$S $.`# ,
T 
S */ /6p$c $$C $  4 Kr+   r  c                       \ rS rSrSS jr\S 5       rSS jrSS jrS r	        SSS S	\
S
\R                  \\4   S\S\R                   \   S\S\S\S\S\S\S\4S jjrSS jrSrg)rG  ikA  Nc                    [         R                  " 5       U l        X l        X0l        [        U5      U l        [        SSSSSU R                  R                  5      U l	        U R                  ) U l
        [        5       U l        SU R                  l        [        5       U l        SU R                  l        [        5       U l        SU l        g)z;Stores text spans for later output on compatible PDF pages.r   r   r  z'Position following last text insertion.zAccumulated area of text spans.TN)r   fz_new_textr   r\  rm  r*  r   r~  r0  r  ictmr"  r  r  rI  r  
used_fontsr   )r(   	page_rectr\  rm  s       r)   r   TextWriter.__init__mA  s    %%'	
O	!Q2q$))*:*:;XXI	'"K!B%r+   c                     [        [        R                  " U R                  [        R                  " S 5      [        R
                  " 5       5      5      n[        U5      nU$ r-   )ro  r   fz_bound_textr   FzStrokeStater{  r*  rh  s     r)   _bboxTextWriter._bbox~A  sC    u22DIIu?R?RSW?XZ_ZhZhZjkl3i
r+   c           
         [        U5      U R                  -  nUc  [        S5      nUR                  (       d   [        SUR                  -  5      eU(       a-  U R                  U5      nSR                  [        U5      5      nSn[         R"                  " U5      n	[%        U5      n
[         R&                  " USSXJR(                  U
R*                  5      nSnSnUS:X  a/  [         R,                  " U R                  UR                  XXX5      nO#[/        U R                  UR                  XXX5      n[1        U5      n[        USS 5      U R2                  -  U l        U R6                  U R2                  -  U l        U R8                  U R4                  4nUR:                  S   S:X  a  U R<                  R?                  U5        U$ )	z8Store 'text' at point 'pos' using 'font' and 'fontsize'.Nr  r   zUnsupported font '%s'.r`   r  r  r   ) r"  rk  r  rB  r'   r   r=  r>  mupdf_font_namer   r   r   r   	clean_rtlr  r  r   r  r  fz_make_matrixrb  rc  fz_show_stringJM_show_string_csrz  r  r  rr  rI  r  rl  r~  )r(   r,  r   r  r   rH  right_to_leftr   r=  rG  r  trm
markup_dirr  r  s                  r)   ro   TextWriter.appendA  sf   Cj499$<<D 5		ABB>>$'D778D>*DM11(;S!""8Q8SS!##F
?&&		499c_ipC#TYY		3e\fmC$BC/DHH4dhh.nndoo-::f"OO%
r+   c           
          US-  nU H)  nU R                  XX4XVS9  U=R                  U-  sl        M+     U R                  U R                  4$ )NrE  )r  r   rH  r   )ro   rc  rI  r  )	r(   r,  r   r  r   rH  r   r  r  s	            r)   appendvTextWriter.appendvA  sP    S.AKKT!  :EEWE  ~~t..r+   c           	         U(       d  U$ UR                  S5      n/ n[        [        U5      5       Hp  nX$   n[        U5      S:  a  M  [        U Vs/ s H  n[	        U5      PM     sn5      S:  a  MC  SR                  [        U5      5      X$'   UR                  U5        Mr     / n[        [        U5      5       H  nU/ :X  a  UR                  X4   5        M  X4   US   S-   :  a7  [        U5      S:  a!  [        X'S   US   S-    5      X'S   US   S-   & X4   /nMc  X4   US   S-   :X  d  Ms  UR                  X4   5        M     SR                  U5      nU$ s  snf )a  Revert the sequence of Latin text parts.

Text with right-to-left writing direction (Arabic, Hebrew) often
contains Latin parts, which are written in left-to-right: numbers, names,
etc. For output as PDF text we need *everything* in right-to-left.
E.g. an input like "<arabic> ABCDE FG HIJ <arabic> KL <arabic>" will be
converted to "<arabic> JIH GF EDCBA <arabic> LK <arabic>". The Arabic
parts remain untouched.

Args:
    text: str
Returns:
    Massaged string.
r   r   r  r`   r  r   r   )r:   rR  r;   r   r  r  r  ro   )r(   r   wordsr  rf  r   r  idx2s           r)   rv  TextWriter.clean_rtlA  s?    K

3s5z"AAFQJ#q&9q!s1vq&9":S"@778A;/

1 # s3xArzCF#$r(Q,&t9q=4<1gR155Eq'DHqL1 x48a<'CF# ! xx+ ':s   E
rL  r   r   r,  r  r   r  r  warnrz  r   rs  c                 	  ^ ^^^
^%^&^'^( [        U5      nUR                  (       a  [        S5      e[        T5      [        La  [	        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  [        U5      nOUR                  UTU-  4-   nX1;  a  [        S5      eU[        :X  a  SnOU[        :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Hy  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R.                  -
  nOUR
                  U-
  nU	(       a  T R1                  U5      nT(" U5      nUU::  a2  UR)                  UU45        UR)                  [+        U5      S
-
  5        M  UR3                  S5      nU" UU5      u  nn[+        U5      n SR5                  USU 5      n [7        USU 5      UU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Mq  U(       d   eM~     [+        U5      n"U"U:  a,  SUU"4-  n#Uc  O!U(       a  [9        SU#-   5        O[        U#5      e[        5       n$U[+        U5      S
-
  /-  n[;        U5       H  n UR=                  S5      u  nnU	(       a  SR5                  [E        U5      5      nUS:X  a  Un$U[F        :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R.                  U:X  a  U$=R.                  UU-
  U-  -  sl        T%" U$U5        UU$l        U$=R$                  U-  sl        M     U$ ! [>         a    [@        S:  a
  [C        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   r   )rJ  rb  r  r   r   s    r)   r^  (TextWriter.fill_textbox.<locals>.textlenB  s"    ##H $  r+   c                 &   > TR                  U TTS9$ )z5Return list of single character lengths for a string.r  )r  r  s    r)   r  -TextWriter.fill_textbox.<locals>.char_lengthsB  s    $$Qj$QQr+   c                 ,   > TR                  XTTTS9nU$ )N)r  r   r   rC
  )r,  r   rK   r  r   r   rL  s      r)   append_this,TextWriter.fill_textbox.<locals>.append_thisB  s&    --D8
   C Jr+   皙?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  ro   r;   )	r  r  nwordsword_lengthsr   wl_lstwlrI   r  s	           r)   
norm_words+TextWriter.fill_textbox.<locals>.norm_wordsB  s    FL%a[;MM!$ ''+ K!eVBQZB{ae,$++B/bE!'KQ !e ( ''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  rb  )r  rs   r   r  r  r#  gapsgaplr9  r`  r  	std_widthr^  s             r)   output_justify/TextWriter.fill_textbox.<locals>.output_justify6B  s     !%

3;17QE;ZF{{E8,%0%Qgaj%01BA:DNd*D#E-$$+   < 1s   	B%B%B*r   rE  NzText must start in rectangle.rF  r  r   )r`   r   zOnly fitting %i of %i lines.z	Warning: r   r`   )$r*  rv  r   r   r  r  r  r  r  r"  r#  r  r  r   r  r  r8   r  rc  rW  ro   r;   r  rb  rv  r:   r  r  rv   rR  rC  r  r  rz   r  r  ))rL  r   r   r,  r  r   r  r  r  rz  r   	tolerance	space_len	std_startr  r  r-  r.  r  
LINEHEIGHTr  rG  	textlinesrs   	max_lines	new_lines
no_justifyrf  r#  r  r  rI   line0r  r  r   r  r  r  r  r^  s)   `   ``    `                          @@@@r)   fill_textboxTextWriter.fill_textboxA  sw   6 Dz==899:T!<D		R	 	 sN	CL	JJ*	GGi'		(4	$ mmnnSyA~) G'
 ?*C''Y377C?<== %%F&&FF :)II  !23  355J67!;		
 +GAty   $	!23

Y.!!3y>A#57Av#%%

Y.''-BU{  $,!!3y>A#57 JJsOE #-UE":E<E
Ar+bq)*Y!a%-@@;$$eR[1!!"IE#/#3LE
A EFAu:?q 5 ,^ YI0Iv3FFC|c)* o%s9~)**
y!A$==+b
 wwx~.Av**q
/BrI~ud+#:%1u*EBJ&00t$EGGGz!G1 "4 /  '1,0@* /s   Q((R
Rc	                    [        U5        [        U R                  UR                  -
  5      S:  a  [        S5      eUbN  [	        U5      [
        [        4;  d*  [	        US   5      [        Ld  [	        US   5      [        La  [        S5      eUb  Ub  [        S5      e[        USS5      b  US	:X  a  U R                  nUc  U R                  n UR                  5       n	Sn
US:  a  US:  a  Un
Sn/ S
QnU(       a  [        U5      u  pUS:X  a  [        R                  " 5       nO1US:X  a  [        R                   " 5       nO[        R"                  " 5       n[        R$                  " U	R'                  5       S5      n[        R(                  " S5      n[        R*                  " U	R'                  5       [        R,                  " 5       X5      n[        R.                  " UU R0                  [        R,                  " 5       UUU
[        R2                  " [        R4                  5      5        [        R6                  " U5        [9        X5      n[;        U5      nUU4nUnUS   nUS   nUu  nnUR=                  5       nUR?                  U5      nUb  SU-  nSnOS=nnS/nU(       a  URA                  U5        URB                  nURD                  S;   a.  UR                  RF                  UR                  RH                  -
  nOSnURJ                  n[M        U5      (       d  URN                  S:w  d  US:w  aD  URA                  S[Q        URR                  URT                  URN                  -   U-
  45       S35        U(       aN  US   U RV                  -  n [        SS5      RY                  U RR                  U RT                  5      nU) US   -  U-  nU(       d  U(       a&  URA                  [Q        [[        U5      5      S-   5        U GH  n!U!R]                  S5      (       a  M  U!S:X  a'  URA                  U!5        URA                  SU-  5        MI  U!R]                  S5      (       a)  [_        U!Ra                  5       S   SS 5      U-   n"SU"-  n!GO6U!R]                  S5      (       ay  U!Ra                  5       n#[c        U#S   5      n$US:w  a  U$S-  n%OSn%URA                  [Q        U%5      S-   5        [_        U#S   SS 5      U-   n&SRe                  SU&-  /U#SS -   5      n!OU!R]                  S 5      (       a"  URA                  U!Rg                  S!S"5      5        OoU!R]                  S#5      (       a"  URA                  U!Rg                  S#S$5      5        O7U!R]                  S%5      (       a!  URA                  U!Rg                  S%S&5      5        URA                  U!5        GM     U(       a  URA                  U5        URA                  S'5        S(Re                  U5      Ri                  S)5      n[j        Rm                  UUUS*9  SnU Rn                   H  n&[q        UU&5        M     U$ )+a  Write the text to a PDF page having the TextWriter's page size.

Args:
    page: a PDF page having same size.
    color: override text color.
    opacity: override transparency.
    overlay: put in foreground or background.
    morph: tuple(Point, Matrix), apply a matrix with a fixpoint.
    matrix: Matrix to be used instead of 'morph' argument.
    render_mode: (int) PDF render mode operator 'Tr'.
r  zincompatible page rectNr   r   z%morph must be (Point, Matrix) or Nonez$only one of matrix, morph is allowedr  r  r'  r   ro  r   rp  z/OC /%s BDCEMCr`   r!  r-  r  z cmBTz%i Trz gsz	/Alp%i gs Tfr  z wr   r   z/F%iz rgrp  RGz gz Gz kz Kr)  r%   r  )r  )9rn  r%  r   r   r   r   r   r"  r~  r   r\  rm  r  rA  r   r  fz_device_cmykfz_device_grayrY  r0  r	  pdf_new_pdf_devicer{  fz_fill_textr   r  fz_default_color_paramsrw  JM_merge_resourcesr  r  rk  ro   r  ru  r0  r  r6  rw  r  r   rb  rc  rk  r  r%  r  r8   r:   r  r  r  r  r  r.  rl  repair_mono_font)'r(   r   rm  r\  r  r&  r  r  r  r  r  ncol	dev_colorr  rh  r7  rz  max_numscont_stringr  r  r  max_alpmax_fontold_cont_linesr  r  r  new_cont_linesrz  r  r  r  rs   alpr  r0  r   r  s'                                          r)   rH  TextWriter.write_textB  s\    	Dtyy499$%,566UE4=0E!H~U2E!H~V3 !HII%"3CDD7K.6'R-llG=JJEnn&GE!|!D$I"7">qy"002
"113
"113
**7;;=!<I**40H**GKKM5>>;KYaCIINN$''(E(EF !!3' *7>H0(;K,FCq6a&$ ++-,,R0')CCNC#!!#&""==I%II$$tyy6EE]]88ruuzUaZ!!HYbddRUUlU>R7S-T,UUX"YZa499$A1aL--acc1337EVeAh&.FF!!)HV,<"="EF"D}}U##t|%%d+%%g&;<}}U##$**,q/!"-.8"S(u%%zz|d1g!#AA%%ilT&9:4712;'(2xx$$qr( :;u%%%%dll4&>?t$$%%dll4&>?t$$%%dll4&>?!!$'5 #6 !!#&e$))N+227;tWg>OODT4( $
r+   )
rm  r  rk  r  r\  r   rI  r   r   rl  r$  )Nr  Nr   r   )Nr  NF)NNr  Nr   NFF)Nr  r   NNr   r   )r1   r2   r3   r4   r   rs  rr  ro   r  rv  r   r  r  r   r   r   Optionalr  r  ru  r8   rw  r   r  rH  r5   r.   r+   r)   rG  rG  kA  s    "  
*X/,d #*. #'"'$` `` ,,sDy)` 	`
 //$'` ` !` ` `  ` ` `DDr+   rG  c                      \ rS rSrSrS rS rS rS rS r	S r
S	S	S	S	S	S	S
.S jrS rS rS rS rS rS rS rS rS r\S 5       r\S 5       r\S 5       rS rS\4S jrS rS rS rS r\S 5       r \S  5       r!\S! 5       r"S" r#S# r$S$ r%\S% 5       r&\S& 5       r'\S' 5       r(\S( 5       r)S) r*S* r+\S+ 5       r,\r-\r.\(r/\)r0S,r1g	)-r]  iOC  z
IRect() - all zeros
IRect(x0, y0, x1, y1) - 4 coordinates
IRect(top-left, x1, y1) - point and 2 coordinates
IRect(x0, y0, bottom-right) - 2 coordinates and point
IRect(top-left, bottom-right) - 2 points
IRect(sequ) - new from sequence or rect-like
c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  rs  s     r)   r  IRect.__add__YC      ||D$**,,r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  r9  s     r)   r  IRect.__and__\C  r  r+   c                 ,    [         R                  X5      $ r-   )r*  r{  r9  s     r)   r{  IRect.__contains___C  s      ))r+   c                 
   [        US5      (       d  g[        U5      S:H  =(       a]    U R                  US   :H  =(       aD    U R                  US   :H  =(       a+    U R                  US   :H  =(       a    U R
                  US   :H  $ r  )r?   r;   r  r  r  r  r  s     r)   r  IRect.__eq__bC  sn    q)$$1v{jtww!A$j477ad?jtwwRSTURVj[_[b[bfghifj[jjr+   c                 d    U R                   U R                  U R                  U R                  4U   $ r-   r  r  s     r)   r  IRect.__getitem__gC  r  r+   c                 *    [        [        U 5      5      $ r-   r~  r/   s    r)   r  IRect.__hash__jC  r  r+   Nr  c          
      P    [        XqX#XEUS.6u  U l        U l        U l        U l        g )Nr  )util_make_irectr  r  r  r  r  s           r)   r   IRect.__init__mC  s%    -<tr]_km-n*$'47r+   c                     gr  r.   r/   s    r)   r  IRect.__len__pC  r  r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  r  s     r)   r  IRect.__mul__sC  r  r+   c                 v    [        U R                  * U R                  * U R                  * U R                  * 5      $ r-   )r]  r  r  r  r  r/   s    r)   r  IRect.__neg__vC  s+    dggXx$''DGG8<<r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r,  r  r9  s     r)   r,  IRect.__or__yC  s    {{4#))++r+   c                     [        U 5      $ r-   )r]  r/   s    r)   r  IRect.__pos__|C  r  r+   c                 0    S[        [        U 5      5      -   $ )Nr]  r  r/   s    r)   r   IRect.__repr__C  r  r+   c                     [        U5      nUS:X  a  X l        g US:X  a  X l        g US:X  a  X l        g US:X  a  X l        g [        S5      er  )r8   r  r  r  r  r  r  s      r)   r  IRect.__setitem__C  s_    F!VqW  !VqW
 	 !VqW  !VqW  122r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  rs  s     r)   r  IRect.__sub__C  r  r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  r  s     r)   r  IRect.__truediv__C  s    (..00r+   c                 B    [        U R                  U R                  5      $ r:  r;  r/   s    r)   r  IRect.bottom_leftC  r=  r+   c                 B    [        U R                  U R                  5      $ r?  r@  r/   s    r)   r  IRect.bottom_rightC  r=  r+   c                 H    [        SU R                  U R                  -
  5      $ r   rH  r/   s    r)   r0  IRect.heightC  rJ  r+   c                 $    U R                  U5      $ )zCheck if x is in the rectangle.rC  r9  s     r)   rD  IRect.containsC  rF  r+   rs  c                 D    [        U R                  U R                  U5      $ rL  rM  r  s     r)   rO  IRect.get_areaC  rQ  r+   c                 P    U R                   R                  U5      nUR                  $ )z$Extend rectangle to include point p.)r   r*  r  )r(   r  r   s      r)   r*  IRect.include_pointC  s     yy&&q)zzr+   c                 P    U R                   R                  U5      nUR                  $ )z(Extend rectangle to include rectangle r.)r   r+  r  )r(   r#  r   s      r)   r+  IRect.include_rectC  s     yy%%a(zzr+   c                 H    [         R                  X5      R                  5       $ )z4Restrict rectangle to intersection with rectangle r.)r*  r  r  r  s     r)   r  IRect.intersectC  s    ~~d&,,..r+   c                 ,    [         R                  X5      $ r-   )r*  r]  r9  s     r)   r]  IRect.intersectsC  s    t''r+   c                 t    U R                   U R                  :  =(       d    U R                  U R                  :  $ r`  ra  r/   s    r)   rv  IRect.is_emptyC  rc  r+   c                     U R                   U R                  s=:H  =(       a	    [        :H  Os  =(       a-    U R                  U R                  s=:H  =(       a	    [
        :H  $ s  $ )zTrue if rectangle is infinite.re  r/   s    r)   ru  IRect.is_infiniteC  rg  r+   c                 t    U R                   U R                  :*  =(       a    U R                  U R                  :*  $ ri  ra  r/   s    r)   rj  IRect.is_validC  rl  r+   c                 n    U R                   (       a
  [        5       $ U R                  R                  X5      $ rn  ro  rp  s      r)   r&  IRect.morphC  rr  r+   c           	      p    [         R                  " [        U  Vs/ s H  oU-  PM	     sn5      5      $ s  snf r-   r  r  s     r)   r  
IRect.normC  r  r  c                     U R                   U R                  :  a#  U R                   U R                  sU l        U l         U R                  U R                  :  a#  U R                  U R                  sU l        U l        U $ )z)Replace rectangle with its valid version.r9  r/   s    r)   r  IRect.normalizeC  rw  r+   c                 n    [        U R                  U R                  U R                  U R                  5      $ ry  rz  r/   s    r)   rF  
IRect.quadC  r|  r+   c                     [        U 5      $ r-   r/  r/   s    r)   r   
IRect.rectC  s    Dzr+   c                 B    [        U R                  U R                  5      $ r  r  r/   s    r)   r  IRect.top_leftC  r=  r+   c                 B    [        U R                  U R                  5      $ r  r  r/   s    r)   r  IRect.top_rightC  r=  r+   c           	         [        U5      nU R                  (       d3  U R                  (       d"  UR                  (       d  UR                  (       a  [        S5      e[	        SSSSU R
                  * U R                  * 5      [	        UR                  U R                  -  UR                  U R                  -  5      -  [	        SSSSUR
                  UR                  5      -  $ r  r  r  s     r)   r  IRect.torectC  s    Gt}}FGGq!QDGG8dggX64::-qxx$++/EFGAq!QTT14401	r+   c                 H    [         R                  X5      R                  5       $ r-   )r*  r  r  r  s     r)   r  IRect.transformC  s    ~~d&,,..r+   c                 H    [        SU R                  U R                  -
  5      $ r   r  r/   s    r)   r  IRect.widthC  rJ  r+   ra  )2r1   r2   r3   r4   r  r  r  r{  r  r  r  r   r  r  r  r,  r  r   r  r  r  rs  r  r  r0  rD  r  rO  r*  r+  r  r]  rv  ru  rj  r&  r  r  rF  r   r  r  r  r  r  r$  rJ  r#  r'  r5   r.   r+   r)   r]  r]  OC  s   --*k
7! "&$4DTd o-=,*-1 ' ' ' ' ) )$9 9

/( 8 8 _ _ 9 9%3 8 8   ' ' ' '	/ ) ) 
B	B	B	Br+   r]  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr$  r#  r  r  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibir$  symbr#  zadbr  i   ifitzr   r   ro  r   r   r$  r  @   r  r  r  
   r  r     )r   rK  Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenrX  MultiplyNormalOverlay
SaturationScreen	Softlightc                 0    SU  S[        XU45       SU S3$ )Nz<</A<</S/GoTo/D[z	 0 R/XYZ z	]>>/Rect[]/BS<</W 0>>/Subtype/Link>>r  )r    r  r  rA  rg  s        r)   r
  r
  +E  s2    )9!IiQRWXPYFZE[[defdg  hC  (Dr+   c                     SU  SU S3$ )Nz<</A<</S/GoTo/Dz>>/Rect[r?  r.   r  s     r)   r
  r
  ,E  s    s(1#=XYr+   c                 <    SU  S[        XU45       SU SU SU S3$ )Nz<</A<</S/GoToR/D[z /XYZ z]/F<</F()/UF()/Type/Filespec>>>>/Rect[r?  r  r  s          r)   r
  r
  -E  sP    0A!F9VW\]U^K_J``hijhkkpqrps  tM  NO  MP  Pk  /lr+   c                     SU  SU SU S3$ )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[r?  r.   r    r  r  s      r)   r
  r
  .E  s    $4QCs1#YqcId"er+   c                     SU  SU SU S3$ )Nz<</A<</S/Launch/F<</F(rB  rC  r?  r.   rF  s      r)   r
  r
  /E  s    $:1#U1#E^_`^aa|"}r+   c                     SU  SU S3$ )Nz<</A<</S/URI/URI(rE  r?  r.   r  s     r)   r
  r
  0E  s    /s)A3>YZr+   c                     SU  SU S3$ )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[r?  r.   r  s     r)   r
  r
  1E  s     03HKfgr+   )r  goto2r  r  r  r  r  c                       \ rS rSrSrSrg)r  i4E  z0Raised for documents with file structure issues.r.   Nr1   r2   r3   r4   r  r5   r.   r+   r)   r  r  4E  s    :r+   r  c                       \ rS rSrSrSrg)r  i8E  zRaised if file does not exist.r.   NrL  r.   r+   r)   r  r  8E  s    (r+   r  c                       \ rS rSrSrSrg)r  i<E  z5Raised when creating documents from zero-length data.r.   NrL  r.   r+   r)   r  r  <E  s    ?r+   r  r  r  bidir5  r  r  r  r@  rm  r  r  r  zcs-namedar  descriptionr  r  effectr  rj   r   r  
char_flagsr  r  r0  rX  r  rF   r  rX  r  r  r   r8  r  r   r  r  spansr  r  r  r   r  r   rP  r  r  r  r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  )r        ?)r?  Zd;O?)"   7A`?)#   rF  )r
   rh?)%   -?)&   gL7A`?)'   jt?)r
  r[  ))   r[  )*   rF  )+   r_  ),   rZ  )-   r_  ).   rZ  )/   n?)0   rF  )1   rF  )r  rF  )3   rF  )4   rF  )5   rF  )6   rF  )7   rF  )8   rF  )9   rF  ):   rl  );   rl  )<   r_  )=   r_  )>   r_  )?   g"~j?)r,  r_  )A   v?)B   MbX?)C   r}  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  r}  )I   r[  )J   x&1?)K   r}  )L   ʡE?)M   g r?)N   r}  )O   r}  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   r  )U   Gz?)V   rd  )W   r  )X   gp=
ף?)Y   q=
ףp?)r  r  )[   r[  )\   gV-?)]   r[  )^   uV?)rk  rF  )`   rF  )a   r  )b   r_  )r  r_  )r	  V-?)e   rd  )f   y&1?)g   M?)h   r  )i   uV?)j   r  )k   r_  )l   r_  )m   ;On?)n   r  )o   r_  )p   r_  )q   r  )r   r_  )s   r  )t   rd  )u   r  )v   r]  )w   r  )x   gZd;O?)y   r  )z   r  ){   Q?)|   r  )}   r  )~   r_  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  rX  )   rZ  )   gףp=
?)   gV-?)   r_  )   gK7A`?)   r]  )   rF  )   jt?)   r  )   r  )   r  )   y&1?)   r]  )   r  )   /$?)   r  )   g?)   r_  )   r  )   r_  )rx  r_  )   r  )   r  rX  )   r_  )   r_  )   r_  )   r_  )   r   )r
  r  )   r   )   r  )   tV?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r]  )   r]  )   r]  )   r]  )   r]  )   r]  )   r]  )   r  )   r]  )   HzG?)   r  )   g{Gz?)   r  )   r_  )   r_  )   r]  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   x&?)   r]  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  rX  )   r  )   gK7?)   r  )   r  )   r  )   r  )   r_  )   r  )   r  )   r  )   r  )   r  )   r  )   r  rX  (   rY  K7?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  rl  )r?  ^I+?)r\  gn?)r^  r*  )r
  g\(\?)r`  g5^I?)rb  sh|??)rc  r  )r
  Zd;O?)re  r  )rf  gQ?)rg  g?5^I?)rh  r_  )ri  g\(\?)rj  x&?)rk  gB`"?)rm  r-  )rn  g=
ףp=?)r  r*  )ro  g)\(?)rp  gOn?)rq  Mb?)rr  '1Z?)rs  gʡE?)rt  gDl?)ru  r  )rv  RQ?)rw  }?5^I?)rx  gT㥛 ?)ry  r  )rz  gDl?)r{  gv/?)r,  gX9v?)r|  g/$?)r~  r  )r  r)  )r  r)  )r  r  )r  gK7A`?)r  g rh?)r  &1?)r  r  )r  r+  )r  gx?)r  r  )r  ra  )r  r2  )r  d;O?)r  gK7?)r  g+?)r  gA`"?)r  g+?)r  r  )r  MbX?)r  g=
ףp=?)r  E?)r  r  )r  r4  )r  r1  )r  9v?)r  g-?)r  gm?)r  g;On?)rk  g;On?)r  gGz?)r  r+  )r  r+  )r  r6  )r	  gCl?)r  ʡE?)r  g?5^I?)r  r  )r  gv/?)r  r]  )r  r,  )r  gQ?)r  r,  )r  V-?)r  r/  )r  r.  )r  r.  )r  r1  )r  r1  )r  %C?)r  r9  )r  r)  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  r:  )r  K7A`?)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  gCl?)r   rh?)r  r<  )r  gQ?)r  r  )r  r0  )r  r0  )r  r5  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )rx  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  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  r)  )r  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r   V-?)r   rh?)r  r=  )r  gK7A`?)r  Dl?)r  V-?)r  r@  )r  g㥛 ?)r  r8  )r	  g"~?)r
  r>  )r  r>  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r  gK7A?)r  獗n?)r  rA  )r  X9v?)r  rB  )r  r7  )r  r7  )r  +?r(  )r  rC  )r  r0  )r  gʡE?)r  y&1?)r  gGz?)r  rD  )r   "~j?)r!  gl?)r"  rE  )r#  r3  )r$  r8  )r%  r?  )r&  g
ףp=
?r(  r(  c                 ^    U(       a  US   OSnSSSSS.nXC   S   XC   S   -  S	-  nXP-  U-  $ )
Nr   r  )r   r   r  r  r  r  r   r   r.   )r  r0  r  r  r  r  s         r)   rN  rN  G  sE    47D[LQA	
agaj	 Q&A9vr+   c                     / nU R                  5       (       d  U$ [        U5       H+  nUR                  [        R                  " XU-   5      5        M-     [        U5      $ r-   )r  rR  ro   r   rn  r  )r  r  rI   rK   rf  s        r)   _read_samplesrH  G  sN     C>>
AY

E((&1*=> #;r+   c                      X:*  =(       a    X:*  $ r-   r.   )rJ   lowhighs      r)   r  r  G  s    8!	!r+   c           
      ,   [         R                  " U 5      n[        U5       GHn  nUnXA;   a  M  [         R                  " X5      n[         R                  " U[        S5      5      nUR                  (       d  MV  [         R                  " U5      n[        US-
  SS5       GH  n[         R                  " Xh5      n	[         R                  " [         R                  " U	[        S5      5      [        S5      5      (       d  M_  [         R                  " U	[        S5      5      n
[         R                  " U	[        S5      5      nU
R                  (       ae  [         R                  " [         R                  " U
[        S5      5      [        S	5      5      (       d  M  [         R                  " U
[        S
5      5      nSn[         R                  " U5      (       a.  [         R                  " US5      n[         R                  " X5      nOd[         R                  " U5      (       aI  [         R                  " U R                  5       [         R                  " U5      5      u  n  nUR                   nUS:  a  GM  UnXA;   d  GM  [         R"                  " Xh5        GM     GMq     g )Nr  r   r  r  rb  r  r  rM
  GoTor  r   )r   r  rR  r  r
  r  r   r  r  r  r:  pdf_lookup_page_numberrx  r	  r   r  r   r  )r`  r<  	pagecountrf  r  r  r  r  r  r  rQ  r	  rz  rn  r  r9  s                   r)   r;  r;  G  s   %%c*I9=++S4##Whx.@A  ""6*taxR(A##V/A$$e&8&8!Xi=P&QS[\bScdd''HSM:F%%q(6*:;D  ((%*<*<fhsm*TV^_eVfgg))68C=AC!!4((,,dA622C@$$d++!&!6!6		UE]E]_cEd!e!QmmQwB}&&2+ ) r+   c                     [        U [        R                  [        R                  45      (       d   S[	        U 5      < SU < 35       eU R
                  (       d  [        [        5      eg )Nztype(cond)=z cond=)rB   r   r   r   r   r   rk   MSG_IS_NO_PDF)conds    r)   
ASSERT_PDFrS  G  sT    dU]]E,=,=>??YKDJ=PWRVQXAYY???&& r+   c                  >    [        [        [        [        [        5      $ r-   )r]  rs  rr  r.   r+   r)   EMPTY_IRECTrU  G      /?OTTr+   c                  *    [        5       R                  $ r-   )
EMPTY_RECTrF  r.   r+   r)   
EMPTY_QUADrY  G  s    <r+   c                  >    [        [        [        [        [        5      $ r-   )r*  rs  rr  r.   r+   r)   rX  rX  G      /?SSr+   c                 :    [        U 5      (       d  [        S5      eg )Nz No journalling operation started)JM_have_operationrk   r`  s    r)   r?  r?  G  s    S!!:;; "r+   c                  >    [        [        [        [        [        5      $ r-   )r]  rr  rs  r.   r+   r)   INFINITE_IRECTr`  G  rV  r+   c                  *    [        5       R                  $ r-   )r  rF  r.   r+   r)   r  r  G  s    ?r+   c                  >    [        [        [        [        [        5      $ r-   )r*  rr  rs  r.   r+   r)   r  r  G  r[  r+   c                 t    [        U [        R                  5      (       d   e[        R                  " U 5      nU$ )z+
Turn fz_buffer into a Python bytes object
)rB   r   r2  r  )r3  rK   s     r)   r"  r"  G  s0     gu~~....

&
&w
/CJr+   c                     U c  g[        U [        5      (       d   S[        U 5      < 35       eU R                  SS5      nSnU H  nU[	        U5      -  nM     U$ )Nr`   ztype(c)=r  surrogateescape)rB   r   r   r  r%  )r  r  rK   bbs       r)   r  r  G  s`    & 	ya,($q'},	*+A
Cs2w Jr+   c                    [        U [        [        45      (       a  U nO[        U S5      (       ai  U R	                  5       n[        U[
        5      (       a  UR                  S5      n[        U[        [        45      (       d  [        S[        U5       35      eO[        R                  " 5       $ [        R                  " U5      $ )z
Make fz_buffer from a PyBytes, PyByteArray or io.BytesIO object. If a text
io.BytesIO, we convert to binary by encoding as utf8.
r  r  z&.getvalue() returned unexpected type: )rB   r  r  r?   r  r   r  rk   r   r   r2  r  )r   r  s     r)   r-  r-  H  s    
 &5),--		$	$ dC  ;;w'D$	 233DT$ZLQRR 4 ~~//55r+   c                 >    [        U 5      (       d  g [        X   5      $ r-   )r  r  )r  r  s     r)   JM_FLOAT_ITEMri  ,H  s    C  ?r+   c                 h    U[        U 5      :  a#  X   n[        U[        [        45      (       a  SU4$ g)Nr   r$  )r;   rB   r8   r  )r  r  r  s      r)   r  r  1H  s1    
SX~xdS%L))d7Nr+   c                 l   SnSnSn	Sn
U
(       a  UnOUnSnUn[        U5      n[        R                  " U5      n[        U5      n[        R                  " UU5      n[        R
                  " X5      n[        R                  " U5      n[        R                  " U 5      nUR                  (       aD  [        R                  " U5      [        R                  " U5      :X  a  [        R                  " U5      nX:w  Ga;  [        R                  " U5      nUR                  (       a  [        R                  " U5      nX:X  a9  [        U5       H)  n[        R                  " UU[        R                  5        M+     O[        U5       H)  n[        R                  " UU[        R                   5        M+     O[        R"                  " U5      (       a  [        R$                  " S5      nOUUR                  (       aD  [        R                  " U5      [        R                  " U5      :w  a  [        R$                  " S5      n[        R&                  " UUX5      nU(       a  [        R(                  " U5        O[        R*                  " US5        [        R,                  " UU5      nU(       a@  [        R.                  " UU[        R0                  " 5       [        R2                  " 5       5        O?[        R4                  " UU[        R0                  " 5       [        R2                  " 5       5        [        R6                  " U5        U$ )zZ
Pixmap creation directly using a short-lived displaylist, so we can support
separations.
r   r   r   TNr  )r  r   rr  r  fz_intersect_rectr  fz_round_rectfz_document_output_intentr   r@  fz_keep_colorspacefz_page_separationsfz_count_separationsrR  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsr^  r  r  rM  rv  r{  rl  fz_run_page_contentsrw  )r0  r   r  r  r  r  r  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsry  r  r  r   rclipr5  oirI   rf  r  rz  s                          r)   r  r  9H  sL   
 JJ##DJs#Ft$DD!E""4/D""40Dt$D 
	(	(	-B	}}  $(=(=b(AA11"5J ((.??**40A"qA44T1e>V>VW " qA44T1e>[>[\ "))$// ++A.D]]u44R8E<Q<QR\<]]
 ++A.D

'
'
D$
FCc"((d3

"
"63
/C$U^^%5u~~7GH""4enn.>@PQ	#Jr+   c                     U $ r-   r.   r  s    r)   rI  rI  H  s    Hr+   r  rs  c                 .    [        [        S U 5      5      $ )Nc                 <    [        U 5      S:  a  [        U S5      $ S$ )Ng-C6?r   r   r%  r  r  s    r)   r
  JM_TUPLE.<locals>.<lambda>H      c!fnuQ{C!Cr+   r   r  r  s    r)   r%  r%  H      CQGHHr+   c                 .    [        [        S U 5      5      $ )Nc                 <    [        U 5      S:  a  [        U S5      $ S$ )Nr  r   r   r  r  s    r)   r
  JM_TUPLE3.<locals>.<lambda>H  r  r+   r  r  s    r)   	JM_TUPLE3r  H  r  r+   c                     U c  g[        U [        5      (       a  U R                  S5      n [        U [        5      (       d   S[	        U 5      < SU < 35       eU $ )Nr`   r  ztype(s)=z s=)rB   r  r  r   r   r  s    r)   r  r  H  sS    y!UHHVa1($q'4QD11Hr+   c                    [        U [        R                  5      (       d   e[        U 5      n[        R                  " U 5      n[        U5      nSn [         SU U 3nXd;  a  OUS-  nM  [        U5      n[        R                  " U[        U5      5      n[        R                  " USU5        SUR                  5       R                  l        g)zs
Add a unique /NM key to an annotation or widget.
Append a number to 'stem' such that the result is a unique name.
r   r   -r.  N)rB   r   r   r   r  r5  JM_annot_id_stemrI  pdf_new_stringr;   r  r0  r   rW  )	r   stemr   r%  rd  rf  stem_idresponser   s	            r)   r  r  H  s    
 eU^^,,,,5!D##U+I &E	A
%&avaS1	Q	 
 G$H3x=9D		4.-.DHHJ*r+   c                    [         R                  " XS5      n[         R                  " U5      (       d  [        [        [
        5        [         R                  " U[        S5      5      n[         R                  " U[        S5      5      S:X  d$  [         R                  " U[        S5      5      S:X  a"  [         R                  " U[        S5      U5        g[        [        [
        5        g)z)
Add OC object reference to a dictionary
r   r  r_  OCMDr  N)
r   r  r  r  MSG_BAD_OC_REFrp	  r
  r  r  rT  )r`  r  r  indobjra  s        r)   r  r  H  s     ##Cq1FV$$ 01vx'78E0A5x'78A=37 01r+   c                    [        5       nS nSnSnS n[        R                  " U [        S5      5      n[        R                  " U5      (       a  [        R
                  " [        R                  " US5      5      n[        R                  " U5      S:X  ax  [        R                  " US5      n[        [        R                  " U5      5       H>  n[        R                  " [        R                  " Xg5      5      nUR                  U5        M@     [        R                  " U [        S5      5      n	U	R                  (       Ga  [        R
                  " [        R                  " U	[        S5      5      5      n[        R                  " [        R                  " U	[        S5      5      5      nUS	:X  a  S n[        R                  " U	[        S
5      5      nUR                  (       aa  [        [        R                  " U5      5       H>  n[        R                  " [        R                  " XW5      5      nUR                  U5        M@     [        R                  " U [        S5      5      nUR                  (       a4  [        R                  " [        R                  " U[        S5      5      5      n[        5       n
X:[        '   [        U5      U
[         '   X*["        '   XJS'   U
$ )Nr  Borderr   ro  r   BSr
  rM
  r`   r  BEIr  )r   r   r
  r  r:  r  r  r  rR  r  ro   r   r  r9   r  r   dictkey_dashesdictkey_style)r%  dash_pyr  r  r  r  dashrf  r  bs_or$  s              r)   r  r  H  s   fGEEF
C


i();
<C3!!5#6#6Q#?@$)&&Q/DE//67&&(;(;T(EF$ 8 y(4.9D!!5#5#5tXc]#KL!!5#5#5tXc]#KLB;E  $6>>E//56&&(;(;S(DE$ 7 

i$
8C
~~!!5#5#5sHSM#JK
&C '?CNJr+   c                    [        5       n[        5       n[        5       n[        R                  " U [        R                  5      n[        R
                  " U5      (       ac  [        R                  " U5      n[        U5       H>  n[        R                  " [        R                  " XF5      5      nUR                  U5        M@     X![        '   [        R                  " U S5      n[        R
                  " U5      (       ac  [        R                  " U5      n[        U5       H>  n[        R                  " [        R                  " XF5      5      nUR                  U5        M@     X1[        '   U$ )Nr9  )r9   r   r   r
  PDF_ENUM_NAME_Cr:  r  rR  r  r  ro   dictkey_stroker  dictkey_fill)r%  r$  bcfcr  rI   rf  re  s           r)   r  r  H  s   
&C	BB9e&;&;<A!"qA##U%8%8%>?CIIcN  It,A!"qA##U%8%8%>?CIIcN  Jr+   c                    [        U [        5      (       d   eS nSnU R                  [        5      nU R                  [        5      nU R                  [
        5      nU R                  SS5      n[        U5      n	[        R                  " U[        S5      5        [        R                  " U[        S5      5        [        R                  " U[        S5      5        US:  a  U	R                  [        5      nUc  U	R                  [        5      nUc  U	R                  [
        5      nUS:  a  U	R                  SS5      n[        U[        5      (       ay  [        U5      S:  aj  [        U5      n[        R                  " X5      n
U H  n[        R                  " X5        M     [        R                  " X*[        S5      [        S5      5        [        R                  " U[        R                  " U5      [        S5      [        S5      5        US:X  a  [!        U5      nO[        S5      n[        R                  " X#[        S5      [        S	5      5        US:  a  [        R"                  " U[        S5      S
5        [        R$                  " U[        S5      5      n[        R&                  " U[        S	5      [        S5      5        [        R(                  " U[        S5      U5        g g )Nr   r  r  r  r  r  r  r
  rM
  r   r  r  )rB   r9   r<   r  r  r  r  r   rG  r  r   r;   rQ  pdf_array_push_intrO  pdf_new_realJM_get_border_stylerX  r
  rT  rO  )r  r0  r%  r  dashlennwidthndashesnstylencloudsoborderdarrrA  s               r)   r  r  H  s&   fd####
CGZZ'Fjj.)GZZ'Fzz8R(G y)G 
	8D>2		8D>2		8H#56 zm,++~.~++}-{;;"-7E""sG}q'8w-""C1A$$d. YhtnhsmL	'TNSM	 !|!6*sm	$#G{HTNA>  )Xd^<C#>Xc]G<	 r+   c                     U S:X  a  gSU s=::  a  S::  d  O  U S:X  a  [        U 5      $ SU s=::  a  S::  a   g  U S	::  a  S
U -  $ SU -  $ )Nr  z\u005cr     r-  i   i  z\ufffd  z\u%04xz\U%08xr%  r  s    r)   make_escaper  0I  sV    	Rx	rSB"H2w	2		 
 	v2~2~r+   c                 D    [         R                  " U [        U5      5        g)z?
APPEND non-ascii runes in unicode escape format to fz_buffer.
N)r   r  r  )r  r  s     r)   r  r  =I  s     
4R1r+   c                    [        U5      nUR                  UR                  UR                  UR                  UUUU4nU R                  U5        US-   [        R                  " [        R                  R                  5      4$ )z
Functions for wordlist output
r   )	r  r  r  r  r  ro   r   rp  r  )rX  r  rM  r  r  rN  r  r  s           r)   rI  rI  DI  sm     	t$AHHHHHHHH	E 
LLA:u||ELL$<$<===r+   c                    [        U 5      n[        R                  " U[        S5      5      n[        R                  " U5      (       d!  [        R
                  " U[        S5      S5      n[        R                  " U S5      n[        R                  " U[        S5      U5        Ub!  [        R                  " U[        S5      U5        [        R                  " U[        S5      [        S5      5        [        R
                  " U[        S	5      S5      nU(       d  O[        R                  " U[        S
5      5      n[        U5      n	[        U	5       Hd  n
Sn[        X:5      u  pUS:X  a  M  [        R                  " XS5      n[        R                  " X5      (       d  MN  [        R                  " X}5        Mf     [        R                  " XV5        g)z)
Add OC configuration to the PDF catalog
ri  r   r   r)  Nre  	BaseStaterl  rk  rh  r   )rm  r   r
  r  r:  rI  rY  r  rT  r;   rR  r  r  pdf_array_containsr<  )r`  r   rZ  rk  rx  configsr  onarrayrO  rI   rf  r  rg  inds                 r)   rX  rX  WI  sX    !#
&C  #x	':;Gw''**C)1DaHC#A	""Ax'7>&&8I+>H	8K0(5/B&&8D>1=G!!3(89GqAD!"(GAAv((#Q7C''33$$g3  
'%r+   c                 4   [        X5      n[        R                  " U5      nU R                  R                  (       d  U$ UR
                  UR                  UR                  R                  -   :  a(  UR
                  UR                  R                  -
  Ul        U$ )z
return rect of char quad
)JM_char_quadr   r  r   r  r  r  r  )rs   r  r!  r#  s       r)   r  r  uI  sn     	TA"A??  ttaddR]]''''ttbmm(((Hr+   c                 B   SnU(       a  U(       a  U[        X5      -  nU[        R                  " U 5      [        -  -  nU[        R                  " U 5      [
        -  -  nU[        R                  " U 5      [        -  -  nU[        R                  " U 5      [        -  -  nU$ r   )
detect_super_scriptr   r3  TEXT_FONT_ITALICr:  TEXT_FONT_SERIFEDr6  TEXT_FONT_MONOSPACEDr0  TEXT_FONT_BOLD)r  rs   r  r  s       r)   JM_char_font_flagsr  I  s    E$T..	U$$T*-===E	U##D),===E	U((.1EEEE	U""4(>99ELr+   c                 0   [         (       a?  [        R                  " [        R                  " U R
                  UR
                  5      5      $ [        U [        R                  5      (       d   e[        U[        R                  5      (       d   e[        R                  (       a  UR                  $ U R
                  R                  (       a  UR                  $ [        R                  " [        R                  " UR
                  R                  5      5      n[!        U5      n[#        U5      nUR
                  R$                  nX4-
  [&        -   nUS:  a>  [        R(                  S:X  a*  [        R                  " UR
                  R                  5      $ UR
                  R$                  n[        R*                  " U5      nUR,                  UR.                  -
  nUS:  a  SnSnSn[        R(                  (       d  US:  a  XF-  nX6-  nX4-
  nX5-  U-  nXE-  U-  nU R
                  R0                  R2                  n	U R
                  R0                  R4                  n
[        R6                  " X* XSS5      n[        R6                  " XU
* U	SS5      nU	S:X  a  SUl        SUl        [        R6                  " SSSSUR
                  R:                  R2                  * UR
                  R:                  R4                  * 5      n[        R6                  " SSSSUR
                  R:                  R2                  UR
                  R:                  R4                  5      n[        R<                  " [        R                  " UR
                  R                  5      U5      n[        R<                  " X5      nU	S:X  a[  UR>                  R4                  S:  aA  X?R>                  l        X?R@                  l        XORB                  l        XORD                  l        OHU* UR>                  l        U* UR@                  l        U* URB                  l        U* URD                  l        URB                  R2                  S:  a"  SURB                  l        SUR>                  l        URD                  R2                  URB                  R2                  -
  nU[&        :  a  [        RF                  " X!R
                  RH                  5      nU(       a{  [        RJ                  " UUU R
                  R                  5      nURB                  R2                  X-  -   URD                  l        URD                  R2                  UR@                  l        [        R<                  " X5      n[        R<                  " X5      nU$ )zA
re-compute char quad if ascender/descender values make no sense
r   r   r  皙?r  r  )&r  r   r  r   r  r   rB   FzStextLineFzStextCharrs  r   rF  r  FzFontll_fz_keep_fontr  JM_font_ascenderJM_font_descenderr  FLT_EPSILONr   r  r  r  r  rb  rc  rw  rA  r  fz_transform_quadr  r`  r^  r_  r  r  r  )rs   r  r  r-  r.  r0  asc_dscr5  fwidthr  r  trm1trm2xlate1xlate2rF  cwidthr  s                     r)   r  r  I  s    [ ||E..OPPdE--....b%++,,,,%%wwww<<--bmm.@.@ABD
4
 C
D
!CMMEi+%G!|449||BMM..//
 MMEd#DWWtwwF
Tz##w{mmiG
+
C
+
C
 	AA2qQ2Dqb!Q2D	R!!!Q1r}}/C/C/E/E.EH\H\H^H^G^_F!!!Q1bmm.B.B.D.DbmmFZFZF\F\]F""5<<0B0B#CVLD""4.D 	Av$''))a-				D	D	D	D	
 wwyy1}		WWYY"F))4A++T5$//:O:OPF		FN2DGGI		DGGI""4.D""40DKr+   c           
         [         R                  " U R                  5      n[         R                  " U S5      n[	        U5      nUS:X  a  g[         R
                  " U[        S5      5      n/ n[        U5       GH   n[         R                  " [         R                  " XF5      5      nUS:X  a  [         R                  " [         R                  " [         R                  " XF5      S5      5      [         R                  " [         R                  " [         R                  " XF5      S5      5      4nUR                  U5        M  [         R                  " [         R                  " XF5      5      nUR                  U5        GM     U$ )z0
return list of choices for list or combo boxes
r   NOptr   r   )r   r  r   pdf_choice_widget_options2r;   r
  r  rR  r  r  r  ro   )	r   r%  rU  rI   optarrr
  rf  r  r  s	            r)   JM_choice_optionsr  I  s    ##UZZ0I++UA6DT
AAvHUO<FEAY!4!4f!@A6,,e.A.A5CVCVX^Cbde.fg,,e.A.A5CVCVX^Cbde.fgC LL#**E,?,?,KLCLL#  Lr+   c                    [         R                  " U[         R                  " U 5      5      nUR                  UR                  -
  nUR
                  UR                  -
  nUS::  d  US::  a  gU R                  5       nXRR                  U R                  5       -
  -  U R                  5       UR                  U R                  5       -
  -  -   n[         R                  " U R                  5       5      S:X  a  SU-
  n Un[        SU5       H  n[         R                  " XS5        US-  n[         R                  " XS5        US-  n[         R                  " XS5        US-  n[         R                  " XU5        US-  nU R                  5       (       d  M  [         R                  " XS5        US-  nM     Xe-  nUS:X  a   gUS-  nM   Un[        U5       H  n[        U R                  5       S-
  5       H  n	[         R                  " XU5        US-  nM!     U R                  5       (       a  [         R                  " XS5        US-  nMu  [         R                  " XU5        US-  nM     Xe-  nUS:X  a   gUS-  nM  )zG
Clear a pixmap rectangle - my version also supports non-alpha pixmaps
r   ro  r  r   )r   fz_intersect_irectr  r  r  r  r  rl  rc  rI   rb  r@  r  rR  rm  r  )
r	  r   r  r   rc  destspandestpr  rb  r  s
             r)   r  r  J  s.    	  E$8$8$>?A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE T__./14eA1a[$$Ta0Q$$Ta0Q$$Ta0Q$$Te4Q::<<((#6FA ! EAv FA# ( qA4668A:&$$Te4Q ' zz||$$Tc2Q$$Te4Q  	6 	
Q r+   c                 (   [        U [        [        45      (       a  U /n [        U [        [        45      (       d  S/ 4$ [        U 5      S;  a  S/ 4$ U S S  n[        [        U5      5       H  nX   S:  d
  X   S:  d  M  SX'   M     [        U5      U4$ )Nr  )r   r   r   ro  r   r   )rB   r8   r  r   r   r;   rR  )rm  rK   rf  s      r)   rA  rA  9J  s    %#u&&utUm,,2v
5z%2v
(C3s8_6A:!CF  s8S=r+   c                 F     [        R                  " U R                  U5      $ r-   )r  r   ll_JM_color_countr   r9   r   r  r  rm  r  rl  r  r  r  r  rI   rc  rb  rH  fz_is_empty_irectrR  r<   )rS  r  r   r  r  rl  r  r0  rI   	substrider  oldpixrf  r  newpixr  r  s                    r)   r  r  KJ  s    &&r}}d;;r+   c                     [         R                  " U [         R                  5      u  pU(       a  US:X  a  g[         R                  " [         R                  " X5      5      n[         R
                  " X25        U$ )z"
compress char* into a new buffer
r   N)r    fz_new_deflated_data_from_bufferFZ_DEFLATE_BESTr2  fz_new_buffer_from_datafz_resize_buffer)inbufferr  compressed_lengthr  s       r)   JM_compress_bufferr  sJ  s_     $DD!!D
 $)
..66tO
PC	32Jr+   c                    Sn[         R                  " 5       nU  H  nUR                  R                  [        R
                  :w  a  M-  U H  nSnU Hj  n[        XW5      n[        X5      (       d  M   SnU(       a  UR                  S5        SnUR                  [        UR                  R                  5      5        Ml     U(       d  M~  SnM     M     UR                  5       n	U	$ )Nr   r   r%   )r=   StringIOr   r   r   r  r  r  r   r  r  r  )
r   rn  need_new_liner	  r  rs   line_had_textr  r#  r  s
             r)   rB  rB  J  s    M[[]F  E$=$==DM *#D,,$%M$T*()LLR]]__!=>  } !    	AHr+   c                    [         R                  " 5       nSnUnUnX:  a  SnUnUn[        U5      nUn	 [        XU5      (       d  O[         R                  " X	5      n
[         R
                  " U
5      n[         R                  " XK5      u  pn[         R                  " X[         R                  " 5       [         R                  " 5       5        [         R                  " U5        Sn[         R                  " XKXU5      n[         R                  " USU5        X-  n	M  [         R                  " 5       nSUl        SUl        SUl        SUl        SUl        SUl        SUl        SUl        SUl        SUl        SUl        [         R2                  " S5      n[         R4                  " U5      n[         R6                  " UUU5        UR9                  5         [         R:                  " U5      n[=        U[>        5      (       d   eU$ )zl
Convert any MuPDF document to a PDF
Returns bytes object containing the PDF, created via 'write' function.
r   r  Nro  r   r  ) r   r   r  r  r7	  rr  pdf_page_writerv  r{  rl  rw  r4  r5  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r	  r	  r(
  r	  r  rB   r  )r0  r  rT  r_  r  r!  r  rg  ry  rf  r   r6  rz  rh  r7  r8  rU  r$  r	  r  s                       r)   r  r  J  s   
  FD
A
A	w
6
"C
A
a  !!#)&&t,#(#7#7#I $U^^%5u~~7GHc"%%fQfb(3		    "DDODDDDDDMDDNDMDN


d
#C
..
C	VS$/$$S)AaHr+   c           
         [         R                  " [         R                  " [         R                  " U 5      S5      5      n[         R                  " U[         R
                  5      n[         R                  " U5      n [        XU5        [         R                  " U[        S5      U5        U[         R                  :X  am  U[        [        -  -  n[         R                  " [         R                  " U 5      [         R                  " U5      [        S5      [        S5      [        S5      5        [         R                  " [         R                  " U 5      S5      nUR                  (       d`  [         R                   " U S5      n[         R                  " [         R                  " U 5      U[        S5      [        S5      [        S5      5        [         R"                  " X5        U$ ! [$         a    [&        (       a
  [)        5         [         R*                  " X5        U[         R                  :X  a]  [         R                  " [         R                  " U 5      [         R                  " U5      [        S5      [        S5      [        S5      5        e f = f)	NzRoot/AcroForm/SigFlagsr*  r  r  r  zRoot/AcroForm/Fieldsr   rp  )r   r  rm  r  pdf_create_annot_rawrS  r  JM_set_field_typer  r  PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyrO  rN  r   rQ  r<  rk   r  rz   r  )	r0  r   r   	fieldnameold_sigflagsr   r%  r  rc	  s	            r)   rO  rO  J  s   ##E$7$78I8I#8NPh$ijL
 &&tU-C-CDE##E*I&#$/&&y(3-K5222#'>AS'STH%%c*%%h/V$Z(Z( ""5#4#4S#9;QR&&sA.D%%c*V$Z(X& 	T- L  N$4t+5222%%c*%%l3V$Z(Z( 	s   <E G B(Jc                    [         (       a  [        R                  " U 5      $ [        U 5      n[        R
                  " [        R                  " U [        S5      5      5      n[        R                  " U5      (       d  [        R                  " U5      (       a  UnUR                  UR                  -
  nUR                  UR                  -
  nX2l        XBl
        U$ )z
return a PDF page's CropBox
r  )r  r   r{	  r  r   r  r  r  r  r  r  r  )r8  r6  r|	  r  r  s        r)   r{	  r{	  K  s     {))8$H..x)9LMG   ))U-C-CG-L-L	wzz	!B	wzz	!BJJNr+   c                     [        U 5      n[        UR                  UR                  -
  5      n[        UR                  UR
                  -
  5      n[        R                  " X#5      nU$ r-   )r{	  r%  r  r  r  r  r   fz_make_point)r8  r   r   r  r  s        r)   JM_cropbox_sizer  K  sO    hDDGGdggADGGdggAq$DKr+   c                 D    [        U 5      n[        R                  " U5      $ )z
just the inverse of rotation
)r  r   r	  )r   mps     r)   r^  r^  K  s     
t	$B!!"%%r+   c                    Sn[         R                  " U S5      n[         R                  " U[        S5      S5        [         R                  " U[        S5      S5      n[         R                  " U[        S5      U5        [         R                  " U[        S5      U5        [         R                  " U[        S5      U5        [         R
                  " U[        S	5      [        S
5      5        Sn	[         R                  " U [         R                  " U	5      [         R                  " 5       S5      n
[         R
                  " U[        S5      U
5        [        X
X5        [         R                  " U5      u  pk[         R                  " U
[        S5      U5        [         R                  " U
[        S5      U5        [         R                  " U
[        S5      S5      n[         R                  " U[        S5      U5        U$ )z=
embed a new file in a PDF (not only /EmbeddedFiles entries)
r   r  r  ro  r  r  r  r  r  Filespecs     rK  r  r  r  )r   rY  rX  r  r  rT  r  r  r  r/  rM  rO  )r`  r  rj   rP  r  r[  r  r  efbsr  r9  paramss                r)   r  r  %K  sp    D


S!
$C	C$3		 	 htna	8B	""3x@	""3	B	""3(8$?	sHV,hz.BC	B004LLN	A 
r8C=!,SS+%%c*GD	1htnd3	1hx0$7$$Q(:A>F	68F#3T:Jr+   c                    [         R                  " [         R                  " U 5      [        S5      5      n[         R                  " U[        S5      5      nUR                  (       a:  [         R
                  " U5      S:X  a   [         R                  " U[        S5      5        [         R                  " U[        S5      [        S5      [        S5      5      nUR                  (       a"  [         R                  " U[        S5      S5        gg)	z
perform some cleaning if we have /EmbeddedFiles:
(1) remove any /Limits if /Names exists
(2) remove any empty /Collection
(3) set /PageMode/UseAttachments
r  
Collectionr   r  r  r	  r
  N)	r   r
  r  r  r   r  rG  r  r[  )r`  r  collefiless       r)   r%
  r%
  JK  s     u00#68HID dH\$:;D5--d3q84,!78  W_%W	F hz&:<LM r+   c                 j    U R                   (       d  g[        R                  " U 5      n[        USS9nU$ )Nr`   r  errors)r   r   r  rC  )r  r  r  s      r)   r  r  bK  s-    ??$$T*A
*1Y
?CJr+   c           	      ,   [         R                  " [         R                  " U 5      [        S5      5      nUR                  (       d  [         R
                  " S5      nSnU H  nU[        U5      -  nM     [         R                  " [         R                  " U 5      [        S5      S5      n[         R                  " U[         R                  " U[        U5      5      5        [         R                  " U[         R                  " U[        U5      5      5        gg)z
Store ID in PDF trailer
r  r$  r`   r   N)r   r
  r  r  r   
fz_memrnd2r%  rI  r<  r  r;   )r`  r:  rnd0rndrf  s        r)   r&
  r&
  jK  s     

e//4htn
EC>># A3q6MC &&(9(93(?$QRSc5#7#7c#h#GHc5#7#7c#h#GH r+   c                    [         R                  " [         R                  " [         R                  " U 5      [        S5      5      [        S5      5      nUR                  (       a  U$ [         R                  " [         R                  " U 5      [        S5      5      n[         R
                  " U[        S5      S5      n[         R                  " U[        S5      S5        [         R
                  " U[        S5      S5      n[         R                  " U[        S5      S5        [         R                  " U[        S	5      S5        [         R                  " U[        S
5      S5        [         R                  " U[        S5      S5        U$ )z/
Ensure OCProperties, return /OCProperties key
r  r3  r   rh  r   r  r   rk  rl  rj  RBGroups)r   r
  r  r  r   rX  rI  )r`  rx  r  r  s       r)   rm  rm  zK  s    

U//0A0A#0FQWHXY[cdr[s
tC
~~
e//4hv6FGD

!
!$(@!
DC	S(6"2A6Xc]A6A	Q2	Q3	Q 115	Q 4a8Jr+   c                    U (       d  gU R                  S5      (       a  gU R                  S5      (       a  gU R                  S5      (       a  gU R                  S5      (       a  gU R                  S5      (       a  g	U R                  S
5      (       a  g	U R                  S5      (       a  gU R                  S5      (       a  gg)z
Make /DA string of annotation
rA  Cor_  coTir`  tiSySymbr  Zara  za)r7   r  s    r)   JM_expand_fnamer$  K  s     6tvtvtvtvtvtvtvtvr+   c                 *   U [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R
                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gg)	z
String from widget type
ButtonCheckBoxRadioButtonTextListBoxComboBox	Signatureru  )r   rw  rx  rh  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )r  s    r)   JM_field_type_textr0  K  s~     ,,,...111***---...///r+   c                    [        U [        R                  5      (       d   e[        R                  " U[        R                  " U 5      5      nUR
                  UR                  -
  nUR                  UR                  -
  nUS::  d  US::  a  gU R                  5       nXRR                  U R                  5       -
  -  U R                  5       UR                  U R                  5       -
  -  -   n Un[        U5       HA  n[        U R                  5       5       H!  n	[        R                  " XX   5        US-  nM#     MC     Xe-  nUS-  nUS:X  a   gMe  r  )rB   r   r_  r  r  r  r  r  r  rl  rc  rI   rb  rR  rm  )
r	  re  r  r   rc  r  r  r  rb  rf  s
             r)   rC  rC  K  s   dENN++++  E$8$8$$?@A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE
qADFFH%$$Tcf5Q &  		Q6 r+   c                    [        U [        R                  5      (       d   eSn[        R                  " U 5      nSn[	        U 5      n[        R
                  " U5      n [        U[        R                  5      (       d   eUR                  (       d  Ot[        R                  " U5      n[        R                  " US5      nUR                  (       a  [        R                  " Xb5      (       d  SnO[        R                  " U5      nM  U(       a  U$ g)z
Return the first annotation whose /IRT key ("In Response To") points to
annot. Used to remove the response chain of a given annotation.
Nr   r   r:  )
rB   r   r   r  r   r  r   r  r  rT  )r   r  r%  r  r   irt_annot_objr  s          r)   r  r  K  s    
 eU^^,,,,I##E*IE5!D%%d+I
)U^^4444##++I6u5<<##A11((3	   r+   c                     [        U [        R                  5      (       d   e[        R                  (       a  g[        R
                  " U 5      $ )+
need own versions of ascender / descender
r@  )rB   r   r  rs  r   r  )r  s    r)   r  r  K  s8     dELL))))%%!!$''r+   c                     [        U [        R                  5      (       d   e[        R                  (       a  g[        R
                  " U 5      nU$ )r5  gɿ)rB   r   r  rs  r   r  )r  rK   s     r)   r  r  K  s<     dELL))))%%

!
!$
'CJr+   c                      U S::  d  U S:X  d  SU s=::  a  S::  a   g  OgU(       d  g[        U 5      nU H
  nX2:X  d  M
    g   g)z7Check if ch is an extra word delimiting character.
    r  r  i*   i.   TFr  )r  rJ  r$  rA  s       r)   rG  rG  K  sW     	
89R!6! 	 " r7D9  r+   c                     U S:  d  U S:  a  gg)Ni  i 	  FTr.   r  s    r)   rH  rH  L  s    	EzR%Zr+   c                     [        U [        R                  5      (       d   e[        R                  " U 5      nUR	                  S5      n[
        R                  (       d  US:X  d  US:w  a  U$ XS-   S  $ )Nr
  r  r  r   )rB   r   r  rE  r   rs  r   )r  r   r  s      r)   JM_font_namer:  L  s^    dELL))))d#D		#A  AGqAvA<r+   c           	         Sn[         R                  " U5      n[        U5       GH2  n[         R                  " X5      n[         R                  " X5      n[         R
                  " U5      (       dG  [         R                  " S[         R                  " U5       S[         R                  " U5       S35        M  [         R                  " U[         R                  5      n	[         R                  " U[         R                  5      n
U
R                  (       a  [         R                  " U
5      (       a&  [         R                  " U[         R                  5      nOU
n[         R                  " U[         R                  5      n[         R
                  " U5      (       a%  [         R                  " U[         R                   5      n[         R                  " U5      nSnU(       a  [#        X5      nUU[         R                  " U	5      [%        [         R                  " U5      5      [         R                  " U5      [         R                  " U5      U4nUR'                  U5        GM5     U$ )Nr   r   z' is no font dict ( 0 R)r  )r   r  rR  r  r  r  fz_warnr  r  r
  PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   r  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingr  r  ro   )r`  dict_fontliststream_xrefr   rI   rf  refnamer  r  r  r   r   r  r  r  s                   r)   JM_gather_fontsrG  L  s   	
B5!A1X((2))%3  **MMQu009::MeN^N^_gNhMiinop$$Xu/J/JK%%h0L0LM""e&7&7&A&A%%h0H0HIDD%%h0L0LMX&&))(E4T4TUH)&s1C!!'*#E$5$5d$;<!!'*!!(+ 	= > Ir+   rC  rE  c           	         [        U [        R                  5      (       d   eSn[        R                  " U5      n[	        U5       GH  n[        R
                  " X5      n[        R                  " X5      n[        R                  " U5      (       dG  [        R                  " S[        R                  " U5       S[        R                  " U5       S35        M  [        R                  " U[        S5      5      n	[        R                  " U	[        S5      5      (       d  M  [        R                  " U[        S5      5      n
[        R                  " U[        S5      5      nUR                  (       a  [        R                  " U5      nO[        R                   " 5       nU
R                  (       a,  [        R"                  " [        R$                  " U
5      U5      nO.[        R&                  " [        R&                  R(                  5      n[        R                  " U5      nU[        R                  " U5      U[+        U5      4nUR-                  U5        GM     U$ )	z.
Store info of a /Form xobject in Python list
r   r   z' is no form dict (r<  r  Formr+  r~  )rB   r   r   r  rR  r  r  r  r=  r  r  r
  r  r  r   pdf_to_matrixr{  r  r  rp  rq  ro  ro   )r0  rC  	imagelistrE  r   rI   rf  rF  	imagedictra  r  r  r  r5  r  r  s                   r)   JM_gather_formsrM  @L  s    c5,,----	
B5!A1X((%3**54	  ++MMQu009::MeN^N^_hNiMjjopq""9hy.AB  (899y(6*:;y(8*<=<<%%a(C.."C<<**E,=,=a,@#FD<< ; ;<D	* !!7+%	 	; < Ir+   r0  c                 6   Sn[         R                  " U5      n[        U5       GH  n[         R                  " X5      n[         R                  " X5      n[         R
                  " U5      (       dG  [         R                  " S[         R                  " U5       S[         R                  " U5       S35        M  [         R                  " U[        S5      5      n	[         R                  " U	[        S5      5      (       d  M  [         R                  " U5      n
Sn[         R                  " U[        S5      [        S	5      5      nUR                  (       a  [         R                  " U5      n[         R                  " U[        S
5      [        S5      5      n[         R                  " U5      (       a  [         R                  " US5      n[         R                   " S5      n[         R                  " U[        S5      [        S5      5      n[         R                  " U5      (       a  Un[         R                  " US5      n[         R                  " U[        S5      5      (       d%  [         R                  " U[        S5      5      (       aI  [         R                  " US5      n[         R                  " U5      (       a  [         R                  " US5      n[         R                  " U[        S5      [        S5      5      n[         R                  " U[        S5      [        S5      5      n[         R                  " U[        S5      [        S5      5      nU
U[         R"                  " U5      [         R"                  " U5      [         R"                  " U5      [%        [         R                  " U5      5      [%        [         R                  " U5      5      [%        [         R                  " U5      5      [%        [         R                  " U5      5      U4
nUR'                  U5        GM     U$ )z'
Store info of an image in Python list
r   r   z' is no image dict (r<  r  r  r   r  r  Filterr  
ColorSpaceCSDeviceN
Separationr   r~  r
  r  r@  BitsPerComponentBPC)r   r  rR  r  r  r  r=  r  r  r
  r  r  r  r   r:  r  r  r  r  ro   )r0  rC  rK  rE  r   rI   rf  rF  rL  ra  r  genr  r  altcsr  csesr  r0  r  r  s                        r)   JM_gather_imagesrY  hL  s     
BE"A1X((2**54	  ++MMAe//899MeN^N^_hNiMjjopq""9hy.AB  (9::	*##Ix/@(6BRS""5)C%%i(1CXc]Sg&&))'15GQ  H\,BHTNSb!!D$$T1-B!!"hy&9::((Xl-CDD++D!4%%e,,!//q9E##Ix/@(3-P$$Y0BHSMR!!)X6H-I8TY?[   '  (  %#E$5$5b$9:#E$5$5e$<=#E$5$5g$>?#E$5$5g$>? 	a b Ir+   c                 Z   [        U [        R                  5      (       d   eSn[        R                  " U 5      n UR                  (       d  OIU[        R
                  " [        R                  " U5      5      :X  a  SnO[        R                  " U5      nM[  U(       d  [        SU-  5      eU$ )z
retrieve annot by its xref
r   r   z$xref %d is not an annot of this page)	rB   r   r   r  r   r  r  rT  rk   )r   r  r  r   s       r)   r  r  L  s     dEMM****E!!$'E
5##E$7$7$>??E$$e,  >EFFLr+   c                    [        U [        R                  5      (       d   eU(       d  gSn[        R                  " U 5      n UR                  (       d  Oa[        R
                  " [        R                  " [        R                  " U5      S5      5      u  pEX:X  a  SnO[        R                  " U5      nMs  U(       d  [        SU-  5      eU$ )z"
retrieve annot by name (/NM key)
Nr   r   r.  z!'%s' is not an annot of this page)
rB   r   r   r  r   pdf_to_stringr  r  rT  rk   )r   r   r  r   r  r  s         r)   r  r  L  s     dEMM****E!!$'E
,,U-@-@ATATUZA[]a-bcE$$U+  ;dBCCLr+   c                    / n[         R                  " U R                  5       [         R                  5      nUR                  (       d  U$ [        [         R                  " U5      5       Hh  n[         R                  " X#5      n[         R                  " US5      nUR                  (       d  MC  UR                  [         R                  " U5      5        Mj     U$ )Nr.  )r   r
  r  PDF_ENUM_NAME_Annotsr   rR  r  r  r  ro   r  )r   rd  r  rf  r%  r   s         r)   r5  r5  L  s    EU-G-GHFE''/0''2	""9d3???LL((.	 1 Lr+   c                    [         (       a  [        R                  " U 5      nU$ / n[        R                  " U [        S5      5      n[        R                  " U5      n[        U5       H  n[        R                  " X$5      n[        R                  " U5      n[        R                  " U[        S5      5      nUR                  (       d  Mb  [        R                  " [        R                  " U5      5      nU[        R                  :X  a  M  [        R                  " US5      n	UR                  Xh[        R                   " U	5      45        M     U$ )zC
return the xrefs and /NM ids of a page's annots, links and fields
r  r  r.  )r  r   rv	  r   r
  r  r  rR  r  r  r   r  r  PDF_ANNOT_UNKNOWNr  ro   r  )
r8  rd  r  rI   rf  r%  r  r  ra  r:  s
             r)   rv	  rv	  L  s     {,,h7E8H+=>FV$AAY''3	+$$i)1DE!!00%2C2CW2MNE+++!!9d3tE$<$<c$BCD  Lr+   c                     U R                  SS9n U R                  (       d
  [        5       $ [        U R	                  5       5      $ r  )r  r   r   rv	  r  r   s    r)   r:  r:  L  s1    >>5>)D??v!488:..r+   c                    [         R                  nU c  U$ U nUR                  S5      (       d  UR                  S5      (       a  [         R                  nU$ UR                  S5      (       d  UR                  S5      (       a  [         R                  nU$ UR                  S5      (       d  UR                  S5      (       a  [         R
                  nU$ UR                  S5      (       d  UR                  S5      (       a  [         R                  nU$ UR                  S	5      (       d  UR                  S
5      (       a  [         R                  nU$ )z/
return pdf_obj "border style" from Python str
r  r  rA  r  rf  r  r  Ur  rM
  )r   PDF_ENUM_NAME_Sr7   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r  r  r  s      r)   r  r  L  s    

C}
A	
c		all3//%:O:OC
 J	 
c		all3//%:O:OC J 
c		all3//%:O:OC J 
c		all3//%:O:OCJ 
c		all3//%:O:OCJr+   c
                   ^	 U	4S jn
SnSnU(       a   [         R                  " SXS5      nU
" U5      $ U(       a+  [        U5      n[         R                  " SXS5      nU
" U5      $ US:  a  [         R                  " U5      nU
" U5      $ U (       aN  [         R
                  " U 5      nUR                  (       a  U
" U5      $ [         R                  " XU5      nU
" U5      $ [         R                  " X45      u  pnSnU(       a  [         R                  " SXUS5      nUR                  (       a  U
" U5      $ [         R                  " X4XU5      nU
" U5      $ )z.
return a fz_font from a number of parameters
c                    > U R                   (       d  [        [        5      eU R                   R                  R                  (       d  [
        R                  " U T5        U $ r-   )r   r   MSG_FONT_FAILEDr  r  r   fz_set_font_embedding)r  r  s    r)   fertigJM_get_font.<locals>.fertigM  s=    //$$00''e4r+   r   Nr  )r   fz_new_font_from_filer-  r  fz_new_cjk_fontfz_new_base14_fontr   fz_new_builtin_fontfz_lookup_noto_fontr  fz_load_fallback_font)r   r  r  r  rG  r  r  r  r  r  rm  r  r  r$  r  r  s            `      r)   r  r  M  s'    ED**D(1Ed| ,,,dCBd|"}$$X.d| ''1??$<((IFd| 116@DD,,dDqId|&&hSD$<r+   c                    US:  a  g[         R                  " X5      n[         R                  " U[        S5      5      nUR                  (       aL  [         R
                  " [         R                  " US5      5      n[         R                  " U[        S5      5      nO [         R                  " U[        S5      5      nUR                  (       d  [        S5        gUnSn[         R                  " U[        S5      5      nUR                  (       a  Un[         R                  " U[        S5      5      nUR                  (       a  Un[         R                  " U[        S	5      5      nUR                  (       a  Un[         R                  " U[        S
5      5      nUR                  (       a'  [         R                  " U5      (       d  [        S5        g[         R                  " U[        S5      5      (       a  OW[         R                  " U[        S5      5      (       a  O1[         R                  " U[        S5      5      (       a  O[        S5        U(       d  [        S5        g[         R                  " U5      $ )z8
Return the contents of a font file, identified by xref
r   Nr
  r   r
  z%invalid font - FontDescriptor missingFontFile	FontFile2	FontFile3r  invalid font descriptor subtypeType1CCIDFontType0COpenTypez6warning: unhandled font type {pdf_to_name(ctx, obj)!r}zwarning: unhandled font type)r   r;  r
  r  r   r  r  rv   r  r  r!  )r0  r  r  desftr  r   s         r)   r  r  JM  s    axc(Aq(+<"=>E(()<)<UA)FG  h/?&@A  H-=$>?>>79AF


Q 4
5C
~~


Q 5
6C
~~


Q 5
6C
~~  hy&9:>>%"3"3C"8"856S(8"455sH_$=>>sHZ$899LM./  ((r+   c                    [         R                  " U [        S5      [        S5      5      nUR                  (       d  g[         R                  " U5      nUS:  a  g/ n[        U5       Hm  n[         R                  " X5      n[         R                  " X5      n[         R                  " U5      n[         R                  " U5      nUR                  Xx45        Mo     U$ )zy
Return the items of Resources/Properties (used for Marked Content)
Argument may be e.g. a page object or a Form XObject
r;  
Propertiesr.   r   )r   r  r  r   r  rR  r  r  r  r  ro   )	r  
propertiesrI   r   rf  r  r  r  r  s	            r)   rn  rn  M  s    
 $$S(;*?,AWXJ  z*q5qA((7C((7C!!#&A##C(DIIqi   Ir+   c                 N   Sn[         R                  " U 5      nUR                  (       a\  [         R                  " U5      nU[         R                  " U5      :X  a  SnO)[         R
                  " U5      nUR                  (       a  M\  U(       d  [        SU S35      e[        U5      $ )z
retrieve widget by its xref
FTzxref z is not a widget of this page)r   r  r   r  r  rU  rk   r   )r   r  r  r   r%  s        r)   r  r  M  s     E""D)E


''/	5##Y//E%%u- 


 5&CDEE%=r+   c                   ^ [         R                  " U R                  5      n[        U R                  5      nUR	                  5       nU nU4S jnS n[         R
                  " UR                  5      nUTl        U[         R                  :X  a/  [         R                  " XB5      (       a
  U" SS5        OU" SS5        O	U" SS5        U" TS[        [         R                  " U5      5      5        U" TS[        [        U5      5      5        [         R                  " U5      n	U" TS	U	5        S
 n
U
" U[        S5      5      nUb
  U" TSU5        SnU[         R                  :X  a  [         R                  " U[        S5      5      nUR                   (       a  U" TS[         R"                  " U5      5        [         R                  " U[        S5      5      nUR                   (       a  [         R$                  " U5      nU(       d  [         R&                  " U5      nU" TS[        U5      5        U" TS[         R(                  " U5      5        [         R*                  " [         R,                  " U[        S5      [        S5      5      5      nUS:X  a  SnU" TSU5        [         R,                  " U[        S5      [        S5      5      n[         R.                  " U5      (       af  [         R0                  " U5      nS/U-  n[3        U5       H1  n[         R4                  " [         R6                  " UU5      5      UU'   M3     U" TSU5        U" TS[         R8                  " UR                  5      5        U" TS[         R:                  " UR                  5      5        [         R,                  " U[        S5      [        S5      5      n[         R.                  " U5      (       af  [         R0                  " U5      nS/U-  n[3        U5       H1  n[         R*                  " [         R6                  " UU5      5      UU'   M3     U" TSU5        [         R,                  " U[        S5      [        S5      5      n[         R.                  " U5      (       af  [         R0                  " U5      nS/U-  n[3        U5       H1  n[         R*                  " [         R6                  " UU5      5      UU'   M3     U" TSU5        U" TS [=        U 5      5        [         R>                  " [         R@                  " U[        S!5      5      5      nU" TS"[        U5      5        [         R,                  " U[        S5      [        S#5      5      nUR                   (       a'  U" TS$[        [         R>                  " U5      5      5        U" TS%[         RB                  " U5      5        TRE                  5         [         R                  " U[        S&5      5      n[G        U5      nU" TS'U5        U" TS([G        [         R,                  " U[        S)5      [        S*5      5      5      5        U" TS+[G        [         R,                  " U[        S)5      [        S,5      5      5      5        U" TS-[G        [         R,                  " U[        S)5      [        S.5      5      5      5        U" TS/[G        [         R,                  " U[        S)5      [        S05      5      5      5        U" TS1[G        [         R,                  " U[        S)5      [         RH                  " S25      5      5      5        U" TS3[G        [         R,                  " U[        S)5      [         RH                  " S45      5      5      5        g)5zy
Populate a Python Widget object with the values from a PDF form field.
Called by "Page.first_widget" and "Widget.next".
c                    > [        TX5        g r-   r]  )r  r   rY  s     r)   SETATTR)JM_get_widget_properties.<locals>.SETATTRM  s    #r+   c                     [        XU5        g r-   r  )modr  r   s      r)   SETATTR_DROP.JM_get_widget_properties.<locals>.SETATTR_DROPM  s     	% r+   rO  TFNrB  rM  rG  c                    U nSn U R                   (       d  g[        R                  " X5      nUR                   (       a  [        R                  " U5      nU(       a  U$ [        R                  " U [	        S5      5      n U R                   UR                   :X  a  [        S5      eUS-  nUS:X  a"  [        R                  " U[	        S5      5      nSnM  )z
This is a modified version of MuPDF's pdf_dict_get_inheritable(), with
some changes:
* Returns string from pdf_to_text_string() or None if not found.
* Recurses to parent if current node exists but with empty string
  value.
r  r   Nr  zcycle in resourcesr   r   )r   r   r
  r  r  rk   )r  r  slowhalfbeatr  ru  s         r)   'pdf_dict_get_inheritable_nonempty_labelIJM_get_widget_properties.<locals>.pdf_dict_get_inheritable_nonempty_labelM  s     ??$$T/C~~005 L%%dHX,>?D$//1 455MH1}))$0BC r+   TUrH  r  rF  rg  rI  rK  r  r
  r   r   rC  r  rD  rR  rS  MKBGr^  BCr  rE  r  rT  r<  rN  rJ  r  r  rU  rH  KrV  r  rW  VrX  r  rY  BlrZ  Fo)%r   r  r   r   r0  pdf_widget_typerL  r  pdf_signature_is_signedr  pdf_field_border_styler0  pdf_load_field_namer  rh  r
  r   r  r  pdf_field_valuepdf_field_displayr  r  r:  r  rR  r  r  pdf_text_widget_max_lenpdf_text_widget_formatr  r  r  pdf_field_flagsr  JM_get_scriptr  )r   rY  r%  r   r`  twr  r  rL  rG  r  ru  fvaluer  rC  rI   rA  rf  re  rP  r  sss    `                    r)   JM_get_widget_propertiesr  M  s    ##EJJ/I5::&D
((*C	B$! &&rww/J"FU444((88K&K&T"):5;W;WXa;b)cd,.?@RS]@^._`**95Jz28 4Ix~NEV]E2FU666  )Xh-?@>>e.>.>.DE  HTN;>>&&s+F&&y1(9&(AB%*A*A)*LM$$U%8%8HTNT\]`Ta%bcLq6


i$#
GC#$C!GqA##E$7$7Q$?@AaD V_a0(E(Ebgg(NO(D(DRWW(MN


i$$
HC#$cAgqA&&u':':3'BCCF V\3/


i$$
HC#$cAgqA&&u':':3'BCCF V^S1*;E*BC		!	!%"@"@HUYN"[	\B%6r%:;


i$$
HC
~~V-/@AYAYZ]A^/_`(=(=i(HI  	9hsm4A	q	B2&%--i$RUWX %--i$RUWX %--i$RUWX %--i$RUWX %--i$I[I[\`Iabc %--i$I[I[\`Iabcr+   c                    US:  a  g[         R                  " X5      n[         R                  " U[        S5      5      nUR                  (       aL  [         R
                  " [         R                  " US5      5      n[         R                  " U[        S5      5      nO [         R                  " U[        S5      5      nUR                  (       d  gUn[         R                  " U[        S5      5      nUR                  (       a  g[         R                  " U[        S5      5      nUR                  (       a  g	[         R                  " U[        S
5      5      nUR                  (       a  [         R                  " U[        S5      5      nUR                  (       a'  [         R                  " U5      (       d  [        S5        g[         R                  " U[        S5      5      (       a  g[         R                  " U[        S5      5      (       a  g[         R                  " U[        S5      5      (       a  g[        S[         R                  " U5      5        g)z>
Return the file extension of a font file, identified by xref
r   r  r
  r   r
  rv  pfarw  r/  rx  r  ry  rz  cffr{  cidr|  r.  zunhandled font type '%s')r   r;  r
  r  r   r  r  r  rv   r  r  )r0  r  r  r}  r  s        r)   r  r  IN  s    axc(Aq(+<"=>E(()<)<UA)FG  h/?&@A  H-=$>?>>A


Q 4
5C
~~


Q 5
6C
~~


Q 5
6C
~~  hy&9:>>%"3"3C"8"856S(8"455sH_$=>>sHZ$899.0A0A#0FGr+   c                 (   [        5       n[        R                  " U 5      (       al  [        R                  " U 5      n[	        U5       HG  n[        R
                  " X5      n[        R                  " U5      nXQ;  d  M6  UR                  U5        MI     U$ )zx
Get OCG arrays from OC configuration
Returns dict {"basestate":name, "on":list, "off":list, "rbg":list, "locked":list}
)r   r   r:  r  rR  r  r  ro   )rp  list_rI   rf  r  rG   s         r)   JM_get_ocg_arrays_impr  uN  ss    
 FE3%qA%%s.C##S)D T"	 
 Lr+   c                 H   [        5       n[        R                  " U [        S5      5      n[	        U5      nU(       a  X1S'   [        R                  " U [        S5      5      n[	        U5      nU(       a  X1S'   [        R                  " U [        S5      5      n[	        U5      nU(       a  X1S'   [        5       n[        R                  " U [        S5      5      n[        R                  " U5      (       aZ  [        R                  " U5      n[        U5       H5  n[        R                  " X%5      n[	        U5      nUR                  U5        M7     U(       a  X1S'   [        R                  " U [        S	5      5      nUR                  (       a  [        R                  " U5      nXS
'   U$ )Nrk  r[  rl  ru
  Lockedr,	  r  rv
  r  rt
  )r9   r   r
  r  r  r   r:  r  rR  r  ro   r   r  )	confr   rp  r  rI   rf  r  list1r  s	            r)   r4  r4  N  sA   	B


dHTN
3C!3'E4


dHUO
4C!3'E5	


dHX$6
7C!3'E8FE


dHZ$8
9C3%qA%%s.C)3/ELL  :


dH[$9
:C
~~!!3';Ir+   c                    [         R                  " U5      n[        SUS5       H  n[         R                  " [         R                  " X5      5      n[         R
                  " U5      n[         R                  " [         R                  " XS-   5      5      n[        USS5      n[         R                  " U5      n[        U[        5      (       d   eUR                  S5      nU R                  XX45        M     g )Nr   r   r   r  )r   r  rR  r  r  r  ry  fz_buffer_extractrB   r  r  ro   )	r
  r  rI   rf  r  rz  r  r$  r  s	            r)   r  r  N  s    D!A1a^((%*=*=d*FGs#((%*=*=dE*JK!#q!,##C(!U####HHWsh r+   c                    U R                   (       d  g[        R                  " U [        S5      5      n[        R                  " U5      nUS:X  a3  [        R                  " U [        S5      5      nUR                   (       d  gOg[        R
                  " U5      (       a   [        [        R                  " U5      5      nO>[        R                  " U5      (       a"  [        R                  " U5      n[        U5      nOgU(       a  U$ g)z
JavaScript extractor
Returns either the script source or None. Parameter is a PDF action
dictionary, which must have keys /S and /JS. The value of /S must be
'/JavaScript'. The value of /JS is returned.
NrM
  
JavaScriptJS)r   r   r
  r  r  rx  r  r  r   r!  r  )r  r  jjjsr  r$  s         r)   r  r  N  s     >>3.A			1	B	\Xd^4}}  	2"5#;#;B#?@			R	 	 ##B'',
r+   c                 t    U R                   R                  (       a  [        R                  " U S5      (       d  gg)z 
Ensure valid journalling state
r   r   )r   r  r   r  r^  s    r)   r]  r]  N  s)     ~~e&=&=c1&E&Er+   c                 P   U [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R
                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  g	U [         R                  :X  a  g
U [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gg)z'
return extension for MuPDF image type
faxrU  flatelzwrldbmpgifjb2r  jpxjxrr  r  tiffr  )r   FZ_IMAGE_FAXFZ_IMAGE_RAWFZ_IMAGE_FLATEFZ_IMAGE_LZWFZ_IMAGE_RLDFZ_IMAGE_BMPFZ_IMAGE_GIFFZ_IMAGE_JBIG2FZ_IMAGE_JPEGFZ_IMAGE_JPXFZ_IMAGE_JXRFZ_IMAGE_PNGFZ_IMAGE_PNMFZ_IMAGE_TIFF)ra  s    r)   JM_image_extensionr  N  s     """u"""u$$$w"""u"""u"""u"""u$$$u###v"""u"""u"""u"""u###vr+   c                 r   [        U[        R                  5      (       d   e[        R                  " [        R                  R                  5      n[        R
                  " [        R                  " U5      U5      n[        R
                  " U[        5      nU[        U5      4n[        R                  U5        g r-   )rB   r   r{  rp  r1  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_inforo   )r+  r  r   r  r#  r!  r  s          r)   JM_image_filterr  N  s~    c5>>****U\\,,-A!8!8!;SAA$56A##Ddr+   c                 x   U (       d  g[        U 5      nUS:  a  [        S5        gU n[        R                  " U5      nU[        R                  :X  a  gU(       a  [        R
                  " X25      nO[        R                  " X25      n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      u  p[        R                  " U5      n
[        R                  " UR                  5       5      n[        5       nUR                  5       U[        '   UR!                  5       U["        '   XS'   [%        U5      U[&        '   X[(        '   X[*        '   UR-                  5       U[.        '   UR1                  5       U[2        '   [5        U5      U[6        '   X[8        '   U(       a  Xl[:        '   U$ )z
Return basic properties of an image provided as bytes or bytearray
The function creates an fz_image and optionally returns it.
Nr   rV  orientation)r;   rv   r   fz_recognize_image_formatFZ_IMAGE_UNKNOWNr  fz_new_buffer_from_shared_datar8  fz_image_orientation_matrixr  fz_image_orientationr<  r  r9   r   r  r  r  rz  r  r  r	  rI   r  r  r
  r  r  r  dictkey_image)r  
keep_imager  r  ra  r$  r  r  r  r  r  cs_namer  s                r)   JM_image_profiler  N  s`   
 	?Dax!"A++Q/E&&&22A<22A<**C0E

+
+U
3C**51JD,,e4K&&(8(8(:;GVF"WWYFM#ggiFN(M/4FN L L"''')F 99;FK-e4FK&O!&Mr+   c                 ^   U R                  5       n[        R                  " 5       q[        R                  " 5       n[        R
                  " X[        5         " S S[        R                  5      nU" 5       n[        SSSSUS9n/ q[        R                  " XU5        [        [        5      n/ qU$ )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )0JM_image_reporter.<locals>.SanitizeFilterOptionsi1O  c                 B   > [         TU ]  5         U R                  5         g r-   r   r   use_virtual_image_filterr(   r  s    r)   r   9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__2O  s    G))+r+   c                 F    [        S [        R                  " U5      X45        g r-   )r  r   r{  )r(   r  r  r   r  r  s         r)   image_filter=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filter5O  s    D%.."5tCr+   r.   r1   r2   r3   r4   r   r  r5   r  r  s   @r)   SanitizeFilterOptionsr  1O  s    	,	D 	Dr+   r  r   )r  r  r  r  r  )r0  r   r{  r  rp  r]  PdfSanitizeFilterOptions2r  r  r  r   )r   r0  r6  r  sanitize_filter_optionsfilter_optionsr   s          r)   r\  r\  *O  s    
((*C(||~H	T->?D ? ? D 45+)N J	""C~>	z	BJIr+   c                     [        [        S5      (       + n [        [        S5      (       + n[        [        S5      (       + n[        [        S5      (       + n[        [        S5      (       + n[        [        S5      (       + n[        [        S5      (       + n[        [        S5      (       + n[        [        S	5      (       + n[        5       n	XS
'   [        [        R                  5      U	S'   [        [        R
                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [        R                  5      U	S'   [        [         5      U	S'   [        [        R"                  5      U	S'   X	S'   X)S'   X9S'   XIS'   XYS'   XiS'   XyS'   XS '   [        [        R$                  5      U	S!'   U	$ )"NTOFUTOFU_BASE14TOFU_CJKTOFU_CJK_EXTTOFU_CJK_LANG
TOFU_EMOJITOFU_HISTORICTOFU_SILTOFU_SYMBOLbase14cbzepubr  iccr/  r  r  r`  zplotter-cmykz	plotter-gz	plotter-nzplotter-rgbz	py-memoryr  tofuztofu-cjkztofu-cjk-extztofu-cjk-langz
tofu-emojiztofu-historicztofu-silztofu-symbolxps)r?   r   r9   rw  FZ_ENABLE_CBZFZ_ENABLE_EPUBFZ_ENABLE_HTMLFZ_ENABLE_ICCFZ_ENABLE_IMGFZ_ENABLE_JPXFZ_ENABLE_JSFZ_ENABLE_PDFFZ_PLOTTERS_CMYKFZ_PLOTTERS_GFZ_PLOTTERS_NFZ_PLOTTERS_RGB	JM_MEMORYFZ_ENABLE_SVGFZ_ENABLE_XPS)
	have_TOFUhave_TOFU_BASE14have_TOFU_CJKhave_TOFU_CJK_EXThave_TOFU_CJK_LANGhave_TOFU_EMOJIhave_TOFU_HISTORIChave_TOFU_SILhave_TOFU_SYMBOLrK   s
             r)   JM_fitz_configr  LO  s   %eV44I%e];;%eZ88M%e^<<%e_==%e\::O%e_==%eZ88M%e];;
&C.M"5#6#67CJ"5#7#78CK"5#7#78CK"5#6#67CJ"5#6#67CJ"5#6#67CJ"5#5#56CI"5#6#67CJ"5#9#9:C"5#6#67C"5#6#67C"5#8#89C"9oC"5#6#67CJ'K+
O/0-0+
O."5#6#67CJJr+   c                    [         R                  " U[        S5      5      n[         R                  " X[         R                  " 5       S5      n[         R
                  " U5      n[         R                  " U5      (       a9  U(       a  [         R                  " XE5        U$ [         R                  " XES5         U$ [         R                  " U S5      nU(       a>  UR                  (       a  [         R                  " Xt5        [         R                  " Xu5        O=[         R                  " Xu5        UR                  (       a  [         R                  " Xt5        [         R                  " U[        S5      U5        U$ )aO  
Insert a buffer as a new separate /Contents object of a page.
1. Create a new stream object from buffer 'newcont'
2. If /Contents already is an array, then just prepend or append this object
3. Else, create new array and put old content obj and this object into it.
   If the page had no /Contents before, just create a 1-item array.
rL  r   r   )r   r
  r  r  r  r  r:  r<  r  rQ  r   rT  )r`  r  newcontr  r7  newcontsr  carrs           r)   r  r  sO  s    !!'8J+?@H##C%,,.!DHH%D(##  4 K ""8q9 K ""3*""$$T4  0  0""$$T47HZ$8$?Kr+   c
           
         Sn
SnSnSnSnSnSnSnSnSn[        U 5        U	S:  a  [        R                  " U	5      u  nnnU(       a7  [        R                  " SUWUS5      n
[        R                  " X
XU5      nSnSnOU(       a  [        R
                  " U5      u  nnU(       a5  [        R                  " XWSS5      n
[        R                  " X
U5      nSnSnOU(       a  [        R                  " SX%S5      n
OH[        U5      nUR                  (       d  [        [        [        5        [        R                  " SXS5      n
U(       d  [        R                  " X
5      nSnO[        R                  " X
U5      nSn[        R                  " U5      n[!        [        R"                  " [        R$                  " U['        S5      5      5      5      n[)        [        R"                  " [        R$                  " U['        S5      5      5      5      nU(       d  [)        [+        X5      5      n[        R,                  " U
5      n[        R.                  " U
5      nUUUU[1        U5      U	UUS	./nU$ )
z
Insert a font in a PDF
Nr   r  r  r   r   r  r  )r   r   r  r  r  r  r  )r?  r   r  r  pdf_add_cjk_fontr  pdf_add_simple_fontro  r-  r   r  r  rp	  r  pdf_add_cid_fontr  r  r  r
  r  r  r  r  r  rw  )r`  r  r  r  r  r  r  r  r   r  r  r$  r  ixrefr  r  r   r   r  extor  r  r-  r.  s                           r)   r  r  O  s    D
CDEEF
E	D	DDS"}!44X>dE,,T4uaH))#XeL
 44V<JD$00tQJD00HEHDF 224J(4~~.0@A44T3QG 11#< 44SIX&E 1 153E3EhPXYcPd3e fgDe//1C1CXxXaOb1cdeD !5c!AB

 
 
&C

!
!$
'Cv,$ E Lr+   c                    [        U [        R                  5      (       a  U $ [        U [        5      (       aC  [        R                  " U R                  U R
                  U R                  U R                  5      n U $ [        U [        5      (       aY  [        R                  " U R                  U R
                  U R                  U R                  5      n[        R                  " U5      nU$ [        U [        R                  5      (       a  [        R                  " U 5      nU$ U (       a  [        U 5      (       a  [        U 5      S:w  a$  [        R                  " [        R                  5      $ / SQn[        S5       H^  nX   X#'   X#   c&  [        R                  " [        R                  5      s  $ X#   [        :  a  [        X#'   X#   [        :  d  MV  [        X#'   M`     [        R                   " US   US   US   US   5      $ )z6
PySequence to mupdf.FzIrect. Default: infinite irect
ro  r'  r   r   r   r   )rB   r   r\  r]  r  r  r  r  r*  rp  r  r
  rd  rR  rr  rs  fz_make_irect)r#  rK   r  rf  s       r)   rK  rK  O  sj    !U]]##!UMM144qttQTT2!Tll144qttQTT2mmC 
!U\\""mmA
$Q''?1+=+B}}U4455A1Xt4<==!8!8994/!"AD4/!"AD  qtQqT1Q4166r+   c                    [         R                  " U 5      n[         R                  " U[        S5      5      n[         R                  " U5      (       a  [         R
                  " U5      $ [         R                  " U5      n/ n[        U5       Hy  n[         R                  " X%5      n[         R                  " U5      (       a  [         R                  " US5      nUR                  [        [         R
                  " U5      5      5        M{     U$ )z
ListBox retrieve value
r  r   )r   r  r
  r  rx  r  r  rR  r  r:  ro   r  )r   r%  r  rI   r
  rf  elems          r)   JM_listbox_valuer,  O  s    
 ##U+IHSM:FF##''00 	V$AE AY""F.t$$&&a0D')A)A4)HIJ	 
 Lr+   c           	      r   SnUS:  a  US-  nOZUS:X  a  XRS   S S3-  nOHUS:X  a   eUS:X  a  XRS   S S	US   S S	US   S S
3-  nO XRS   S S	US   S S	US   S S	US   S S3-  nUS[        U5       S	U S3-  n[        R                  " [        R                  " U 5      [        R                  U5        g )Nr`   r   z0 g r   ro  z g r   r   r   z rg z k rQ	  r  )r$  r   r  r  PDF_ENUM_NAME_DA)r   r  re  r   r   r  s         r)   r  r  P  s    
 Cax	a&3	q	a&1SVAJaAqz66a&1SVAJaAqz3q6!*C@@Qx()8*C88C	""5#6#6u#=u?U?UWZ[r+   c                 4     [        R                  " XX#U5      $ r-   )5r  r   JM_make_spanlistr   r  rp  r  r  r  r  r  r  r  r   r  r`  r  r  r  rL  FZ_STEXT_SYNTHETICrS  r:  argbr  r-  r  r  rO  dictkey_charsr  r	  JM_py_from_pointdictkey_originro  r  r  ro   r9   r  dictkey_flagsdictkey_bididictkey_char_flagsr  dictkey_fontr  r%  r  	dictkey_crw  r  r  dictkey_spans)	line_dictrs   rU  r  r  	char_list	span_list	span_rect	line_rect
char_style	old_styler  rG  span_originr  r#  r  r  r-  r  	char_dicts                        r)   r0  r0  'P  s    %%is'JJr+   c                    U R                  5       n[        U5      n[        R                  " U R                  5      n U(       a8  U[        R
                  [        R                  4;   d  U[        R                  :  a<  [        R                  " U [        R                  " [        R                  5      5      nSnOUS:X  aP  U R                  5       S:X  a<  [        R                  " U [        R                  " [        R                  5      SS5      nO4[        R                  " [        R                  " UR                  5      5      n[!        U5      nU R#                  5       U[$        '   U R'                  5       U[(        '   X1[*        '   U R                  5       U[,        '   U R/                  5       U[0        '   U R3                  5       U[4        '   U R7                  5       U[8        '   [;        U5      U[<        '   Xa[>        '   g)zPopulate a dictionary with information extracted from a given image.

Used by 'Document.extract_image' and by 'JM_make_image_block'.
Both of these functions will add some more specific information.
r  r  ro  rk  r   N) fz_compressed_image_typer  r   ll_fz_compressed_image_bufferr   r  r  r  fz_new_buffer_from_image_as_pngr  r  rI    fz_new_buffer_from_image_as_jpegr2  r  r	  r"  r   r  r  r  r  r  r  r  r  r	  r  r
  r;   r  r  )r/  img_dictimg_typer  ll_cbufr$  r  s          r)   r  r  P  sv    ++-H
X
&C 11#..AG	,,e.D.DEEe((( 33''(E(EF 	3557a<44,,U-J-JKRQRT nnU44W^^DEc"F!eegH]"uuwH^[#&557H  XXZH\ XXZH\GGIH[ [H\$]r+   c                 T   U R                  5       n[        X!5        UR                  5       nUR                  (       aG  UR	                  [
        R                  " [
        R                  5      5      nUR                  5       US'   OS US'   [        U R                  5       5      U[        '   g )Nr  )r  r  r  r   rH  r   r  r  r  rz  r  r  )r  r  r/  r  r  s        r)   JM_make_image_blockrN  P  s}    
--/CS%88:D33E4G4GHeHe4fg!335
6!
6!253D3D3F!GJ~r+   c                 r     [        R                  " U R                  XUR                  UR                  5      $ r-   )r  r   JM_make_text_blockr   r   rp  r  r  rl  r5  r  r9   r0  r  r  dictkey_wmoder4  r  dictkey_dirro  r  ro   dictkey_lines)
r  r  rU  r  r  	line_list
block_rectrs   r<  r@  s
             r)   rP  rP  P  s-    ''(8(8*4??\c\n\noor+   c                 F     [        R                  " U R                  X5      $ r-   )r  r   r  r   r   r	  rp  r6  fz_contains_rectr5  r  r   FZ_STEXT_BLOCK_IMAGEr  rl  r9   r  r  ro  r  rN  rP  ro   dictkey_blocks)	rT  r  rU  text_buffer
block_listr  r  r  r  s	            r)   r  r  Q  s    **2==)IIr+   c           	      j   / SQn[        U [        R                  5      (       a  U $ [        U [        5      (       aW  [        R                  " U R                  U R
                  U R                  U R                  U R                  U R                  5      $ U (       a  [        U 5      (       a  [        U 5      S:w  a  [        R                  " 5       $ [        S5       H,  n[        X5      X'   X   b  M  [        R                  " 5       s  $    [        R                  " US   US   US   US   US   US   5      $ )	N)r   r   r   r   r   r   r  r   r   r   r   ro  r   )rB   r   r{  r~  r    r  r  rA  rg  r  r  r
  rR  ri  rp  )r  r    rf  s      r)   r  r  4Q  s    A!U^^$$!V~~acc133QSS!##qss;;$Q''?1+=+B~~1XQ"4<<<>!  >>!A$!adAaD!A$!==r+   c           	         [         R                  " [         R                  R                  5      n[         R                  " [         R                  " U [        S5      5      5      n[         R                  " U5      (       d  [         R                  " U5      (       a  SUl        SUl	        SUl
        SUl        [         R                  " [         R                  " UR                  UR                  5      [         R                  " UR                  UR                  5      [         R                  " UR                  UR                  5      [         R                  " UR                  UR                  5      5      nUR                  UR                  -
  S:  d  UR                  UR                  -
  S:  a.  [         R                  " [         R                  R                  5      nU$ )z
return a PDF page's MediaBox
r  r   d    r   )r   rp  r1  r  r  r  r  r  r  r  r  r  fz_minfz_max)r8  page_mediaboxr6  s      r)   r  r  CQ  s8    LL!8!89M  **8Xj5IJH h''5+D+DX+N+NLLLLhkk2LLhkk2LLhkk2LLhkk2	M 	=+++a/-"2"22Q6U\\%<%<=r+   c
                    [         (       a  [        R                  " U UUUUUUUUU	5
      $ Un
Sn[        R                  " X2-
  5      S-   nX#:  aM  UnX::  aE  [        XXXVXy5        US-  nUS:  a  X-  S:X  a  [        SU SU S35        US-  nU
S-  n
X::  a  MD  ggUnX:  aE  [        XXXVXy5        US-  nUS:  a  X-  S:X  a  [        SU SU S35        US-  nU
S-  n
X:  a  MD  gg)z
Copy a range of pages (spage, epage) from a source PDF to a specified
location (apage) of the target PDF.
If spage > epage, the sequence of source pages is reversed.
r   r   z	Inserted r  z pages.N)r  r   r  r   fz_absi
page_mergerv   )doc_desdoc_srcspageepageapager_  r)  r  r  	graft_map	afterpagecounterrU  r   s                 r)   r  r  `Q  s(   " {## 	 IGMM%-(1,E}mw&[qLGq W%<%A)G9Dw?@AIDNI m mw&[qLGq W%<%A)G9Dw?@AIDNI mr+   c                    [         R                  " U R                  5       [        S5      5      nUR                  (       d/  [         R
                  " U R                  5       [        S5      S5      n[         R                  " U[        S5      5      n[         R                  " U[        S5      5      n[         R                  " U[        S5      5      n[         R                  " U[        S5      5      nSnSn[         R                  " U5      (       Gal  [         R                  " U5      n	[         R                  " U5      (       a  [        [         R                  " U5      5       Hg  n
[         R                  " [         R                  " X:5      5      nUR                  S5      (       d  ME  [         R                  " USS 5      nX:  d  Me  UnMi     O![         R
                  " U[        S5      U	5      nUS	-  n[        U	5       H{  n
[         R                  " [         R                  " XZ5      5      n[         R                  " USS 5      U-   nSU 3n[         R                  " XZ5      n[         R                  " X=U5        M}     [         R                  " U5      (       a  [        [         R                  " U5      5       Hg  n
[         R                  " [         R                  " XJ5      5      nUR                  S
5      (       d  ME  [         R                  " US	S 5      nX:  d  Me  UnMi     O![         R
                  " U[        S5      S5      nUS	-  n[        [         R                  " U5      5       H{  n
[         R                  " [         R                  " Xj5      5      n[         R                  " US	S 5      U-   nS
U 3n[         R                  " Xj5      n[         R                  " XMU5        M}     Xx4$ )a?  
Merge the /Resources object created by a text pdf device into the page.
The device may have created multiple /ExtGState/Alp? and /Font/F? objects.
These need to be renamed (renumbered) to not overwrite existing page
objects from previous executions.
Returns the next available numbers n, m for objects /Alp<n>, /F<m>.
r;  r   r?  r  r  Alpr   Nr   r  r   )r   r
  r  r  r   rX  r  r  rR  r  r  r7   fz_atoir  r  )r   temp_resrh  	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsrI   rf  r  r  r   r  r  s                   r)   r  r  Q  s    ""488:x/DEI++DHHJ8MqQ	""9h{.CDI##Ix/?@J ""8Xk-BCI##Hhv.>?JGI ##y)Y''5--i89'')?)?	)MN~~e,,MM#ab'*;G : //	8K;PRSTI1qA##U%;%;Y%JKCc!"g&0A9D(()7C	5  $$u))*56A$$e&<&<j&LMD??3''d12h'A}	 7 ,,Y8H!L
NI5%%j12  %"8"8*"HIMM$qr(#i/1#w$$Z3Jc2 3 r+   c                 b    [         R                  U 5        [        (       a  [        SU  35        gg)z
redirect MuPDF warnings
zMuPDF warning: N)r  ro   JM_mupdf_show_warningsrv   ru   s    r)   JM_mupdf_warningry  Q  s,     ""4(/$() r+   c                 d    [         R                  U 5        [        (       a  [        SU  S35        g g )NzMuPDF error: r%   )r  ro   r  rv   ru   s    r)   JM_mupdf_errorr{  Q  s,    ""4(-vR() r+   c                 F    [        U [        5      (       d   e[        X5      $ r-   )rB   r   JM_new_bbox_device_Device)r   r  s     r)   r  r  Q  s     b$$b55r+   c           
         [        U [        R                  5      (       d   e[        R                  " U R                  R
                  5      n[        R                  " S5      nU  H  nUR                  R                  [        R                  :X  d  M-  U H  nU Hd  n[        U[        XE5      5      (       d  [        R                  " U5      (       d  M:  [        R                  " X%R                  R                  5        Mf     [        R                  " U[        S5      5        M     [        R                  " U[        S5      5        M     U$ )z)
make a buffer from an stext_page's text
r  r%   )rB   r   r  rp  r   r6  r	  r   r  r  r  r  fz_append_runer  r  r  )r   r   r  r  rs   r  s         r)   JM_new_buffer_from_stext_pager  Q  s     dE--....<<001D


c
"C  E$=$==B,T<3IJJ$)$=$=d$C$C ((mmoo>  $$S#d)4    c$i0  Jr+   c                    Uc  g[        U5      nUc  g[        R                  " UR                  S5      5      n[        R                  " X[        R
                  " 5       S5      n[        R                  " U S5      n[        R                  " U[        S5      [        R                  " S5      5        [        R                  " U[        S5      U5        U$ )z
make new PDF action object from JavaScript source
Parameters are a PDF document and a Python string.
Returns a PDF action object.
Nr  r   ro  rM
  r  r  )
rI  r   r  r  r  r  r3  rT  r  r  )r`  r   r  r$  rm  	newactions         r)   JM_new_javascriptr  R  s     }D|

.
.t{{6/B
CC!!#ELLNA>F&&sA.I	y(3-1C1CL1QR	y(4.&9r+   c                     [        U 5      $ r-   )JM_new_output_fileptr_Outputrc  s    r)   r	  r	  R  s    '--r+   c                 f    U S:  a  U S-  n U S:  a  M  U S:  a  U S-  n U S:  a  M  U S-  S:w  a  gU $ )z:
# return normalized /Rotate value:one of 0, 90, 180, 270
r   r  r  r.   )r_  s    r)   r  r  R  sJ     1*# 1*
C-# C-{aMr+   c                     [         R                  " S5      n[         R                  " U5      n[         R                  " X@X5        UR	                  5         [         R
                  " U5        U$ )Nr	  )r   r	  r	  r	  r	  fz_terminate_buffer)r  r[  r  r$  r	  s        r)   ry  ry  (R  sO    


c
"C
..
C	83	c"Jr+   c                 ~   U R                   (       d  U$ U nUR                   (       Ga  [        R                  " U5      nX1;   d/  [        R                  " U[	        S5      5      R                   (       a   U$ UR                  U5        [        R                  " U[	        S5      5      n[        R                  " U5      (       a  [        XA5      n[        R                  " U[	        S5      5      n[        R                  " U[	        S5      5      n[        R                  " U5      (       d  UnUR                   (       a  GM  U$ )zs
Return list of outline xref numbers. Recursive function. Arguments:
'obj' first OL item
'xrefs' empty Python list
r  r  Nextr  )r   r   r  r
  r  ro   r  r  )r  r  thisobjnewxrefr  r   s         r)   r  r  1R  s     >>G



""G,u117HV<LMXX L 	g""GXg->?e$$$e3E$$gx/?@##Whx.@A  '**G 


 Lr+   c                     Sn[         R                  " U R                  5       [         R                  5      n[         R                  " U5      n[        U5      nU$ )z=
return a PDF page's /Rotate value: one of (0, 90, 180, 270)
r   )r   r  r  rt  r  r  )r   r_  r  s      r)   r  r  JR  sF     F

(
($((*e6P6P
QCc"Ff%FMr+   c                     [         R                  " [        US5      5      n[         R                  " U5      n[         R                  " [         R
                  5      n[         R                  " XU5      nU$ )zH
create PDF object from given string (new in v1.14.0: MuPDF dropped it)
r  )r   r  r  r  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r0  r1  r3  r   lexbufr  s         r)   r  r  VR  sV     225f3EFG!!'*F__U334F$$S&9FMr+   c                    [        U [        R                  5      (       d   eUc  [        R                  " 5       nUb6  [        U[        R                  5      (       d   S[	        U5      < SU 35       e[        R
                  " U 5      n[        U5      n[        U5      n[        R                  " Xh5      n[        R                  " Xg5      n[        R                  " U5      n	[        U[        R                  5      (       d   e[        R                  " X)XS5      n
U(       a  [        R                  " U
5        O[        R                  " U
S5        [        R                  " U5      (       dW  [        R                   " XzU	5      n[        R"                  " X[        R$                  " 5       U[        R&                  " 5       5        O[        R(                  " Xz5      n[        R"                  " X[        R$                  " 5       [        R*                  " [        R*                  R,                  5      [        R&                  " 5       5        [        R.                  " U5        [1        SU
5      $ )z
Version of fz_new_pixmap_from_display_list (util.c) to also support
rendering of only the 'clip' part of the displaylist rectangle
ztype(seps)=r   r  rU  )rB   r   rO  r  r   rg  r  r  rl  r  rm  r-  r^  r  r  r  rN  rk  r{  rl  rM  rp  rq  rw  r  )r  r  r  r  r  ry  r   r  r}  r  r  rz  s               r)   ra  ra  dR  s    eU001111|""$<:dE,?,?@@Z[T$ZMQSTXSYBZZ@&&u-Ds#FD!E""4/D""40D%Er5--....

'
'4
?Cc"((d3$$U++00eD!!%enn.>u~~GWX&&v3!!%enn.>U\\MhMh@ikpkykyk{|	#5#r+   c                     [        U [        R                  5      (       a  U $ [        U [        5      (       a+  [        R                  " U R                  U R
                  5      $ [        (       a  [        R                  " U 5      $ [        R                  " SS5      n[        U S5      n[        U S5      nUb  Uc  U$ [        U[        5      n[        U[        5      n[        U[        5      n[        U[        5      n[        R                  " X#5      $ )zE
PySequence to fz_point. Default: (FZ_MIN_INF_RECT, FZ_MIN_INF_RECT)
r   r   )rB   r   r`  r"  rb  rc  r  r   r  ri  r   rr  r  rs  )r  r_  rb  rc  s       r)   r  r  R  s     !U]]##!U}}QSS!##&&{%%q))	q!	BaAaAyAI	Q AQ AQ AQ A==r+   c                    [         (       a  [        R                  " X5      $ [        U [        R
                  5      (       d   e[        U[        R                  5      (       d   e[        R                  " UR                  R                  5      nSnSnSnSn[        U5       Hc  u  pxUR                  R                  [        R                  :X  a2  [        U5       H  u  p[        U
5       H  u  pM     UW-  nM      UW	-  nXG-  nMe     U H  nUR                  R                  [        R                  :X  d  M-  U H  n
SnU
 H\  n[        X5      n[        R                  " U5      (       d  [        X-5      (       d  M;  UR                  R                   n[#        X5        M^     US:w  d  Mo  US:  d  Mw  [        R$                  " U S5        M     M     g)z
Plain text output. An identical copy of fz_print_stext_page_as_text,
but lines within a block are concatenated by space instead a new-line
character (which else leads to 2 new-lines).
r   r-  r%   N)r  r   r  rB   r   r2  r  rp  r   r6  rW  r   r  r  r  r  r  r  r  )r$  r   r   r  n_blocksn_linesn_chars	n_blocks2r  n_lines2rs   n_chars2r  chbboxs                 r)   r  r  R  s    [00;;c5>>****dE--....<<001DIHGG%t,	  E$=$=="+U"3$-t$4LH %58# #4 xG -   E$=$==	B)$3F11$77/== %'MMOO	&s6  ?y1}**35  r+   c                 L   [         R                  " X5      n[         R                  " U 5      nU(       dS  Ub  UR                  (       d  [         R                  " X5        gUR                  (       a  [         R                  " XB5        gUR                  (       a  UR                  (       d  [        U5      nO[        [         R                  " XB5      5      nX6:w  aL  [        XS5      nUR                  (       d  [         R                  " XU5        g[         R                  " XX5        gg)z
Create a JavaScript PDF action.
Usable for all object types which support PDF actions, even if the
argument name suggests annotations. Up to 2 key values can be specified, so
JavaScript actions can be stored for '/A' and '/AA/?' keys.
N)	r   r
  r  r   rG  r  r  rT  rO  )r%  key1key2r   key1_objr`  r  r  s           r)   JM_put_scriptr  R  s     !!)2H

&
&y
1C <ty/ 	   x. ??("5"5x(u11(AB %c1	y	:	dA r+   c                 ^    U R                   U R                  U R                  U R                  4$ r-   r  rJ  s    r)   r  r  R  !    44qttQTT!!r+   c                     U R                   U R                  U R                  U R                  U R                  U R
                  4$ r-   r  )r  s    r)   rz  rz  R  s-    33QSS!##qssACC''r+   c                 2    U R                   U R                  4$ r-   r{  )r  s    r)   r4  r4  R  s    338Or+   c                 ^   U R                   R                  U R                   R                  4U R                  R                  U R                  R                  4U R                  R                  U R                  R                  4U R
                  R                  U R
                  R                  44$ )z
PySequence from fz_quad.
)r  rb  rc  r`  r^  r_  )r!  s    r)   r  r   S  sn    
 TTVVQTTVVTTVVQTTVVTTVVQTTVVTTVVQTTVV	 r+   c                 ^    U R                   U R                  U R                  U R                  4$ r-   r  rJ  s    r)   ro  ro  S  r  r+   c           
         [        U [        R                  5      (       a  U $ [        U S5      (       a?  [	        U 5      S:X  a0  [        U S   S5      (       a  [        R
                  " [        U 5      6 n [        U [        R
                  5      (       a  [        R                  " U 5      $ [        U [        5      (       a  [        R                  " U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  5      $ [        R                  " SSSSSSSS5      n/ SQnU (       a*  [        U [        [         45      (       a  [	        U 5      S:w  a  U$ [#        U S5      c  [        R                  " [%        U 5      5      $ ['        S5       GH  nU[	        U 5      :  a  Us  $ X   n[)        U5      (       a  [+        U5      S:w  a  Us  $ [#        US5      X#   l        [#        US5      X#   l        X#   R                  b  X#   R                  c  Us  $ [-        X#   R                  [.        5      X#   l        [-        X#   R                  [.        5      X#   l        [1        X#   R                  [2        5      X#   l        [1        X#   R                  [2        5      X#   l        GM     US   Ul
        US   Ul        US   Ul        US   Ul        U$ )	Nr  ro  r   r  r'  r   r   r   )rB   r   r  r?   r;   rp  r   r  r  fz_make_quadr  rb  rc  r`  r^  r_  r   ri  r  rR  r  r
  r   rr  r  rs  )r#  r!  r  rf  r  s        r)   r  r  S  sW   !U\\""q-  SVq[WQqT;5O5OLL%(#1ell##&&**1d!!	 	 	1aAq!Q2AAJq5$-00CFaKQ"&&q'9::1XA;Hd$$(<(AHsA&sA&466>QTVV^Hadffo.adffo.adffo.adffo.  Q4ADQ4ADQ4ADQ4ADHr+   c                    [        U [        R                  5      (       d   [        U 5       5       e[        R                  " U [        R
                  5      n[        R                  " U5      (       a  [        R                  " S5      n[        [        R                  " U5      5       H  nUS:  a  [        R                  " US5        [        R                  " X5      n[        R                  " U5      (       d  MS  [        R                  " U5      n[        R                  " X%5        M     U$ UR                  (       a  [        R                  " U5      nU$ [        R                  " S5      nU$ )zC
Read and concatenate a PDF page's /Contents object(s) in a buffer
rp  r   r  )rB   r   r  r   r
  r`  r:  r2  rR  r  r  r  r   r!  fz_append_bufferr   )r  r7  r$  rf  r  r  s         r)   r  r  =S  s    gu||,,@g@,!!'5+G+GHH(##nnT"u**845A1u$$S"-%%h2C""3'',,S1&&s1 6 J	 
		##H- J nnQJr+   c                    [        U [        R                  5      (       a  U $ [        U [        R                  5      (       a  [        R                  " U 5      $ [        U [        5      (       aA  [        R
                  " U R                  U R                  U R                  U R                  5      $ [        U [        5      (       aA  [        R
                  " U R                  U R                  U R                  U R                  5      $ U (       a  [        U 5      (       a  [        U 5      S:w  a.  [        R                  " [        R                  R                  5      $ / SQn[        S5       Ho  n[        X5      X'   X   c0  [        R                  " [        R                  R                  5      s  $ X   [         :  a  [         X'   X   ["        :  d  Mg  ["        X'   Mq     [        R
                  " US   US   US   US   5      $ )Nro  r'  r   r   r   r   )rB   r   rp  r\  r*  r  r  r  r  r  r]  r  r
  rq  rR  ri  rr  rs  )r#  r  rf  s      r)   r  r  SS  s\   !U\\""!U]]##||A!T!!!$$addADD99!U!!!$$addADD99$Q''?1+=+B||ELL7788A1XQ"4<<< ; ;<<4/!"AD4/!"AD  adAaD!A$!55r+   c                      U R                   UR                  :  dN  U R                  UR                  :  d4  U R                  UR                   ::  d  U R                  UR                  ::  a  ggr  ra  r  s     r)   r  r  jS  sG    	ttqtt|ttqtt|ttqtt|ttqtt|r+   c                 &   U b  U R                   (       d  g[        R                  " U R                  5       [	        S5      5      nUR                   (       a  U R                  5       n[        R                  " X R                  5       5      n[        R                  " 5       n[        R                  " 5       n[        R                  " XU5        [        R                  " X XU5      n[        R                  " UR                   5      U R                   l        gg)z4
refreshes the link and annotation tables of a page
Nr  )r   r   r
  r  r  r0  rN  rp  r{  r]  pdf_load_link_annotsll_fz_keep_linkr)  )r   r  r`  r8  rb  rd  r  s          r)   rU  rU  uS  s     |4??


dhhj(8*<
=C
~~hhj--sHHJ?>>#  $x@))3c8L % 5 5t G r+   c                    U R                   (       d  [        R                  " 5       $ [        U 5      nUS:X  a  [        R                  " 5       $ [	        U R                  5       5      nUR                  nUR                  nUS:X  a  [        R                  " SSSSUS5      nU$ US:X  a  [        R                  " SSSSX45      nU$ [        R                  " SSSSSU5      nU$ )z"
calculate page rotation matrices
r   r  r   r  rx  )	r   r   r{  r  r  r  rb  rc  rw  )r   ru  cb_sizer   r  r  s         r)   r  r  S  s     ??~~%H1}~~dhhj)G		A		A2~  Ar1a3 H 
S  Q2q4 H   B1a3Hr+   c                 F     [        R                  " U R                  U5      $ r-   )r  r   ra  r   r   rp  r6  r;   rZ
  hfuzzvfuzzr  fz_string_from_bufferfind_stringr   r  r  r  r  on_highlight_char)r   rb  r   rZ
  Hitshitsr3  haystack_stringhaystackbeginr  insiderf  r  rs   r  r#  s                    r)   ra  ra  S  s    ))$//6BBr+   c           	         [         R                  " U5      (       a  [         R                  " S5        g [         R                  " U[         R                  5      nUS:X  a2  [         R                  " U[         R
                  5      n[        XX$5        O>US:X  a  [        XX$5        O+US:X  a  [        XX$5        O [         R                  " U5        g[         R                  " U5      n[        U5       H  n	[         R                  " Xi5      n
[         R                  " U
5      (       a  [         R                  " U
5      nOSn[         R                  " U
[         R                  5      nUR                   (       d  M  UnX;  a   UR#                  U5        [%        XX#X5        M  [         R                  " S5          [         R                  " U5        g   [         R                  " U5        g! [         R                  " U5        f = f)zH
Step through /Resources, looking up image, xobject or font information
z.Circular dependencies! Consider page cleaning.Nr   r   r   r   )r   pdf_mark_objr=  r
  PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_FontrG  rY  rM  pdf_unmark_objr  rR  r  r   r  r  r   ro   r  )r`  r	  r
  r  rE  r  xobjr  rI   rf  r  sxrefsubrsrcsxref_ts                 r)   r  r  S  sz    $FG#!!$(C(CD19%%dE,D,DEDCu:QYS;QYCu:( 	T"# t$qA((1C""3''((-((e.K.KLG!!!(MM'*%sU%PMM"RST"!   	T"T"s   BG# B"G# 5>G# 
G# #G;c                    U(       d  g[        U[        [        45      (       d   e[        U5      nUS:X  a  g[        R
                  " U 5      n[        R                  " U5      n[        R                  " XB5      n[        U5       H  nX   nUn[        U[        5      (       a  [        R                  " XX5        M6  [        U[        [        45      (       a  [        U5      S:X  d   S5       eUu  pU	(       a  U
(       d   S5       e[        R                  " US5      n[        R                  " X5        [        R                  " X5        M     [        R                  " U[        S5      U5        g)z
set ListBox / ComboBox values
Nr   r   zbad choice field listr  )rB   r   r   r;   r   r  r  rQ  rR  r   pdf_array_push_text_stringpdf_array_push_arrayrT  r  )r   r
  rI   r%  r`  r  rf  r  optopt1opt2	optarrsubs               r)   JM_set_choice_optionsr  T  s    uudm,,,,UAAv##U+I

&
&	
2C  #)F1Xhc3,,f:sUDM22sCyA~^G^^EJDD9"99=22FA>I,,i>,,i>  
	8E?F;r+   c                    SnSnSnU[         R                  :X  a  [        S5      n[         R                  nGO U[         R                  :X  a,  [        S5      n[         R                  n[         R
                  nOU[         R                  :X  a-  [        S5      n[         R                  [         R
                  -  nOU[         R                  :X  a  [        S5      nOU[         R                  :X  a  [        S5      n[         R                  nOOU[         R                  :X  a  [        S5      n[         R                  nOU[         R                  :X  a  [        S5      nUb2  UR                  (       a!  [         R                  " U[        S5      U5        US:w  d  US:w  aK  [         R                  " U[        S5      5      nXd) -  nXc-  n[         R                  " U[        S5      U5        gg)	z
Set the field type
r   NBtnTxChSigrG  r}  )r   rw  r  PDF_BTN_FIELD_IS_PUSHBUTTONrh  PDF_BTN_FIELD_IS_RADIOrx  r-  r.  PDF_CH_FIELD_IS_COMBOr/  r  r   rT  r   rO  )r0  r  r   setbits	clearbitstypenamer
  s          r)   r  r  ,T  st    GIHu+++E?33	22	2E?55	..	//	/E?669U9UU		++	+D>	..	.D>//		//	/D>--	00	0E? 3 339!|yA~%%c8D>:
sHTND9	 &r+   c                    Sn[         R                  " U 5      nUR                  S5      n[        U5      nUS-
  nXW   nXW	 [        U5      n[         R                  " X5      n	U	R
                  (       d}  US:  aw  SR                  U5      n
[         R                  " [         R                  " U [        U
5      5      5      (       a  [        S[        U5      5      eXVS-
  	 [        U5      nUS:  a  Mw  [         R                  " X[         R                  " U5      5        [         R                  " X5      n	[         R                  " U	5      (       d  [        SU5      e[         R                  " U	5      nX:w  a  [        SU5      e[        U SS5      n[        U5      nSU< SU< S3nSU< S	U< 3nUR!                  XS5      n[#        UU5      nU$ )
z"
Set a PDF dict key to some value
zfitz: replace me!rQ	  r   r   zpath to '%s' has indirectszcannot insert value for '%s'r  r  r   )r   r  r:   r;   rm  r   r  r	  rI  rk   pdf_dict_putpr  rx  r  ry  r  r  r  )r  r  r   
eyecatcherr`  r  r  rf  skeytestkeyr  r  r$  objstrnullvalnewvalnewstrrN  s                     r)   r  r  RT  s    %J

&
&s
+CIIcNEu:DqA8Du:D!!#+G QhA$$U%8%8l1o%NOO <l4>PQQQhu:D Qh 
%";";J"GH!!#+Gw''6<<##G,D6<<
c1a
(C#C(F !*-Gu%F^^GQ/F "#v.GNr+   c                 x   U(       a!  [         R                  " U [        S5      U5        UbS  [         R                  " U [        S5      5        U(       a,  [         R                  " U [        S5      S5      n[        Xb5        UbS  [         R                  " U [        S5      5        U(       a,  [         R                  " U [        S5      S5      n[        Xc5        UbS  [         R                  " U [        S5      5        U(       a,  [         R                  " U [        S5      S5      n[        Xe5        Ub  [         R                  " U [        S5      5        U(       ae  [         R                  " U [        S5      S5      n[        U5      n[        U5       H)  nXH   n	[         R                  " US5      n
[        X5        M+     g g g )Nr  rk  r   rl  r  r  )	r   r[  r  rG  rI  JM_set_ocg_arrays_impr;   rR  r  )r  rt
  r[  ru
  rv
  r,	  rp  rI   rf  item0r  s              r)   rs
  rs
  T  sL   x'<iH	~D(4.1**D(4.!DC!3+
D(5/2**D(5/1EC!3,D(8"45**D(82DaHC!3/D(:"67**D(:2FJC8}A1X 00#q9%s2   r+   c                     [         R                  " U 5      nU H0  n[         R                  " X#S5      n[         R                  " X5        M2     g)zu
Set OCG arrays from dict of Python lists
Works with dict like {"basestate":name, "on":list, "off":list, "rbg":list}
r   N)r   r  r  r<  )rp  r  r`  r  r  s        r)   r  r  T  s>    
 
&
&s
+C$$S2S& r+   c                 H   [         R                  " U 5      n[         R                  " X2S5      nUR                  (       d  [	        [
        [        5        [         R                  " U [        S5      5      nUR                  (       d!  [         R                  " U [        S5      S5      n[         R                  " U[        S5      5      nUR                  (       d!  [         R                  " U[        S5      S5      n[         R                  " U[         R                  " U5      U5        g)z
Insert an item into Resources/Properties (used for Marked Content)
Arguments:
(1) e.g. page object, Form XObject
(2) marked content name
(3) xref of the referenced object (insert as indirect reference)
r   r;  r   r  N)r   r  r  r   r  r  rp	  r
  r  rX  rT  r  )r  r   r  r`  r  rh  r  s          r)   r  r  T  s     
&
&s
+C

 
 A
.C>>./""3(=>I++C+1FJ	##Ix/EFJ  ,,Y8NPQR
	z5#5#5d#;SAr+   c                    ^ [        U [        5      (       a  U R                  n [        U [        R                  5      (       d   S[        U 5      < S[
        < 35       e[        U 5      nUR                  (       d   S5       e[        R                  " U 5      nUR                  5       nU4S jnU" S5      nUnU" S5      n[        U5      n[        U5      n	[        R                  " X5      n[        R                  " X5        U" S5      nU(       au  [        U5      (       ae  [        U5      n
[        R                   " XJ5      nSn[#        U
5       H  nXm   n[        R$                  " X5        M     [        R&                  " X;5        U" S	5      nU(       a  [        U5      (       av  [        U5      n
[        R                   " XJ5      n[#        U
5       H  n[        R(                  " XU   5        M     [        R*                  " X>[-        S
5      [-        S5      5        U" S5      nU(       a  [        U5      (       ay  [        U5      n
[        R                   " XJ5      nSn[#        U
5       H  nXm   n[        R$                  " X5        M     [        R*                  " X?[-        S5      [-        S5      5        U" S5      nUb,  [/        U5      n[        R0                  " U[-        S5      U5        U" S5      nUbH  [/        U5      n[        R2                  " U5      nUU:w  a!  [        R0                  " U[-        S5      U5        U[        R4                  :X  a2  U" S5      nUnU(       a!  [        R6                  " U[-        S5      U5        U" S5      nUn[        R8                  " UU5        U[        R:                  [        R<                  4;   a  U" S5      n[?        X5        U" S5      n[A        U5      n[        R*                  " UU[-        S
5      [-        S5      5        U" S5      nUn[        R*                  " U[        RB                  " U5      [-        S
5      [-        S5      5        U" S5      n[/        U5      n[        R0                  " U[-        S5      U5        [        RD                  " U[-        S5      5        [        RD                  " U[-        S5      5        U" S 5      nUb  U[        R<                  :X  a  U[        RF                  -  nOOU[        RH                  :X  a  U[        RJ                  -  nO'U[        RL                  :X  a  U[        RN                  -  n[        R6                  " U[-        S!5      U5        U" S"5      n[/        U5      nU(       a  [        RP                  " UU5        U" S#5      n[S        U[-        S$5      [        RT                  " 5       U5        U" S%5      n[S        U[-        S&5      [-        S'5      U5        U" S(5      n[S        U[-        S&5      [-        S)5      U5        U" S*5      n[S        U[-        S&5      [-        S+5      U5        U" S,5      n[S        U[-        S&5      [-        S-5      U5        U" S.5      n[S        U[-        S&5      [        RV                  " S/5      U5        U" S05      n[S        U[-        S&5      [        RV                  " S15      U5        U" S25      n[/        U5      nU[        RH                  :X  a  U(       d;  [        RX                  " XCS3S45        [        RZ                  " U[-        S55      S35        GO[        R\                  " U5      nUR                  (       aQ  [        R^                  " U5      n[        RX                  " XCUS45        [        RZ                  " U[-        S55      U5        GOsU(       a!  [        RZ                  " U[-        S55      U5        GOIU[        R`                  :X  a  [        R\                  " U5      nUR_                  5       nUS6U4;   d  US7:X  a[  [        RX                  " XCUS45        [        RZ                  " U[-        S55      U5        [        RZ                  " U[-        S+5      U5        O[        RZ                  " U[-        S55      S35        [        RZ                  " U[-        S+5      S35        OcU(       a\  [        RX                  " XCUS45        U[        R<                  [        R:                  4;   a   [        RD                  " U[-        S85      5        [        Rb                  " U 5        [        Rd                  " U S45        [        Rf                  " U S45        [        Rh                  " U 5        g)9z
Update the PDF form field with the properties from a Python Widget object.
Called by "Page.add_widget" and "Annot.update_widget".
ztype(annot)=rb  r   c                    > [        TU S 5      $ r-   )r   )r   rY  s    r)   GETATTR)JM_set_widget_properties.<locals>.GETATTRT  s    vtT**r+   rL  r   r^  r   rD  r  r  r  r  r  rH  Nr  rG  r*  rR  MaxLenrK  rE  rB  rM
  rC  r
  rT  r  r  r  rJ  r}  rN  r  r  rU  rH  r  rV  r  rW  r  rX  r  rY  r  rZ  r  rI  rf  r   rg  TYesr  )5rB   r   r   r   r   r   r   r   r  r0  r  r  r  r  r  r;   rQ  rR  rS  pdf_field_set_fill_colorr  rO  r  rI  r  r  r-  rO  pdf_field_set_displayr.  r/  r  r  r  rG  r  rh  r  rw  r  pdf_field_set_button_captionr  r  r  pdf_set_field_valuer[  pdf_button_field_on_stater  rx  rU  pdf_set_annot_hotpdf_set_annot_activerV  )r   rY  r   r%  r`  r  r   rL  r   rot_matrI   fill_colre  rf  r  
border_colru  r   old_namerR  rA  r  rC  rP  rJ  r=  r   onstater[  s    `                           r)   JM_set_widget_propertiesr  T  sr   
 5%  

uenn--H,$u+w/HH-5!D??:::?##E*I
((*C+ L!EJ FOE5!D#D)G""41D	U) L!E!%((J&&s.qA(C%%h4  	&&y; O$E!%((J$$S,qA$$V1X6 Ix~x}M N#E!%((J((0
qA(C%%j6  	I8D>8D>R M"EU#&&y(4.%H L!EE",,Y78**9hsmTJ U///&""9hx.@+NO$EA		1- e33U5S5STT(e+ N#E
e
$C		3F N#EL	|,TNSM	 JE	e	B	""9htnbA	y(4.1	y(4.1 -(K7775666K5<<<5777K57775<<<K	8D>;G $%E	e	B	**9b9 HE)Xc]ELLNEB O$E)Xd^Xc]EB O$E)Xd^Xc]EB O$E)Xd^Xc]EB M"E)Xd^Xc]EB M"E)Xd^U-?-?-EuM N#E)Xd^U-?-?-EuM M"EDU666%%ceQ?##Ix~uE 55i@G!!&&w/))#"a@''	8D>2F''	8D>4H	u55	511)<  "T2J$%-%%cb!<##Ix~rB##Ix}bA##YF##YuE%%cdA>e<<e>[>[\\""9hsm<	% 	E1%	ua(	5!r+   c                    SnU[        U5      :  a  [        R                  " X8S  5      u  pX-  n[        R                  " X5      nUS:X  a  [        R                  " XSU5      u  pOUn[        R
                  " XX+XXVU5	        [        R                  " XU5      nUS:X  a  [        R                  " X-S5      nO[        R                  " USU* 5      nU[        U5      :  a  M  U$ r   )r;   r   fz_chartoruner  r  fz_show_glyphr  fz_pre_translate)r   	user_fontr{  r  r  
bidi_levelr|  rH  rf  rQ  rQ  r  r  r  s                 r)   ry  ry  U  s     	
A
c!f*$$QrU+	**9:!8??	PQS[\ICDD#jV^_$$T6A:((15C((a#6C c!f* Jr+   c                     [         R                  " U 5      nUR                  SS9nUR                  [	        S5      5      nUS:  a  US U nU$ )Nr  r  r   )r   r  r  r   r%  )r  
buff_bytesr  r  s       r)   r  r  U  sN    --d3J


9

-CQAAv"1gJr+   c                      [        SU  35        g)z
Generate a warning.
z	warning: Nr  ru   s    r)   r  r  U  s     ivr+   c                    U(       a  [         R                  " U5      u  pEUS:  a  [        U5      n[        U[         R                  5      (       d   eUR
                  (       aj  [         R                  " U5      u  puXt:  aM  [         R                  " U[         R                  [         R                  5        [         R                  " XUS5        g[         R                  " XUS5        g)z8
update a stream object
compress stream when beneficial
   r   Nr   )
r   rM  r  rB   r2  r   rT  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecodepdf_update_stream)r0  r  r3  r[  r  r9  buffer_compressedlength_compresseds           r)   r/  r/  U  s    
 ++G4	B; 27 ;/@@@@ ++','>'>?P'Q$!$-&&!66!;;
 ++C6GK	Cgq1r+   c                 
   [        U[        R                  5      (       d   S[        U5      < 35       eUS:  a  [        R                  " XS5      nU$ [        UR                  5      nUR                  5       n[        R                  " [        R                  " U[        S5      5      5      n[        R                  " U[        S5      5      nUR                  (       a  [        R                  " X85      n	O[        R                  " X5      n	[        U5      n
[        R                  " X[        R                   " 5       [        R"                  " S5      U
5      n[%        XU
S5        [        R&                  " U[        S5      U	5        U$ )z`
Make an XObject from a PDF page
For a positive xref assume that its object can be used instead
ztype(gmap)=r   r  r;  r   )rB   r   PdfGraftMapr   r  r   r   r  r  r  r  r   rw  pdf_graft_objectr  r  r{  r  r/  rT  )r  fsrcpager  r3  r  srcpagespagerefr6  r  rh  r$  s              r)   r  r  U  s(   
 dE--..@;4:-0@@.ax&&vQ72 L/ x}}-;;=$$U%C%CHhWaNb%cd**8Xk5JK??55d>I..v9I x(
 %%f8H%,,WX/[^_Q/ 	5(;"7CLr+   c                 .    [        U [        [        45      $ r-   )rB   r   r   r  s    r)   r  r  U  s    a%''r+   c                     [        U 5      $ r-   )r;   r  s    r)   r
  r
  U  s    q6Mr+   zbad annot typezbad or missing annot AP/Nz%arg must be seq of seq of float pairszbad seq of pointszbad type: 'buffer'zbad color sequencer  zbad filetypezbad locationzbad config numberzbad layer numberzbad 'oc' referencezbad page idr  zPDF has no rootzrect is infinite or emptyzbad type: 'text'rU  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager~  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                     [        U 5      er-   )rk   )r   excs     r)   r  r  V  s     S/r+   c                     U (       d  g[        U [        5      (       a  U R                  SUS9nO[        U [        5      (       a  U S S  nWR	                  SUS9nU$ )Nr`   r  r  raw_unicode_escape)rB   r   r  r  r  )r  r  r   rK   s       r)   rC  rC  V  sU    !SXXfVX,	Au		qT
))()
8CJr+   c                     U (       aR  [        U 5      [        [        4;  d-  [        U 5      S;  d  [	        U 5      S:  d  [        U 5      S:  a  [        S5      eg g )Nr  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   r   r   r;   r  r   r   r  s    r)   r  r  %V  sM    GD%=(1vY&1vz1vzNOO  	r+   r   r   c                 L    U R                  5        H  nUS   U:X  d  M  Us  $    g)zGReturn an entry in the page's font list if reference name matches.
    ro  N)rX  )r   r   r  s      r)   r  r  0V  s&     ^^Q48H r+   c                 B    U R                    H  nXS   :X  d  M  Us  $    g)z3Return a font info if present in the document.
    r   N)r  )r0  r  r  s      r)   r&  r&  8V  s      ]]Q4<H r+   rZ
  c                     [        U 5      (       a  [        U 5      nUR                  4$ [        U 5      (       a  U 4$ U  H0  n[        U5      (       a  M  [        U5      (       a  M'  [	        S5      e   U $ )Nzbad quads entry)r  r*  rF  r  r   )rZ
  r#  r!  s      r)   r  r  @V  sb    Kyx!	!.//  Lr+   c                 6   [        U 5      (       d  g[        U 5      [        [        4;   a  [	        U 5      S:X  d  [        S5      e[	        U S   5      S:X  a  [	        U S   5      S:X  d  [        S5      eU S   S   U S   S	   s=:X  a  S:X  d  O  [        S
5      eg)NFr   z$morph must be a sequence of length 2r   r   r  zinvalid morph param 0ro  r   zinvalid morph param 1T)rw  r   r   r   r;   r   r  s    r)   r  r  LV  s    77Ge}$Q1?@@!INs1Q4yA~011Q47ad1g""011r+   c                     g r-   )r?   r   r   r   r  s    r)   rn  rn  XV  s    
r+   r!  c                 z     [        U 5      nUR                  $ ! [         a    [        S:  a
  [        5          gf = f)zcCheck whether an object is convex, not empty  quad-like.

It must be a sequence of 4 number pairs.
r   F)r  rk   r  rz   rX  )r!  q0s     r)   r  r  ^V  s=    
!W <<  !#(8s    ::r#  c                      [        U 5      n U R                  =(       d    U R
                  (       + $ ! [         a    [        S:  a
  [        5          gf = f)zZCheck whether an object is non-degenerate rect-like.

It must be a sequence of 4 numbers.
r   F)r*  rk   r  rz   rv  ru  rJ  s    r)   r  r  kV  sI    
G 

+amm,,  !#(8s   1 AAr  c                 j   U (       d  g[        U S5      (       a  U 4n [        U 5        [        U 5      S:X  a!  [        U S   5      S-   nUS:X  a  US-   $ US-   $ [        U 5      S	:X  a'  [        [	        U 5      5      S-   nUS:X  a  US
-   $ US-   $ [        [	        U 5      5      S-   nUS:X  a  US-   $ US-   $ )Nr`   r  r   r   r   r  zG zg r   zRG zrg zK zk )r?   r  r;   r   r   )r  r  r  s      r)   r  r  xV  s    q+DqM
1v{adOc!8q4x1T1
1v{eAh#%Hq5y3!e)3%(c!ACx1t8-QX-r+   c                   ^^ U R                  5       m[        T5      mUU4S jn TS:w  a/  [        R                  " TR	                  5       [        S5      S5        [        R                  " TU5      nU H$  n[        U5      n[        R                  " XF5        M&     [        R                  " U5        [        US5        U" 5         [        U5      $ ! [         a    [        (       a
  [        5         U" 5          g f = f)Nc                  r   > TS:w  a0  [         R                  " T R                  5       [        S5      T5        g g )Nr   r:  )r   rO  r  r  )r  ru  s   r)   r  $Page__add_text_marker.<locals>.finalV  s,    q=""7;;=(82DhO r+   r   r:  r  )r  r  r   rO  r  r  r  r  pdf_add_annot_quad_pointrV  r  rk   r  rz   r   )	r(   rZ
  r)  r  r   rG   r!  r  ru  s	          @@r)   rD  rD  V  s    nnG(HPq=""7;;=(82DaH&&w
;D%A**54  	u%s#
 <	  N$4s   BC &C98C9c                 Z    [        U [        5      (       d   e[        [        SU  35      nU$ )Nr  )rB   r   r   r   )rb  rK   s     r)   r  r  V  s/    a
%>!-
.C Jr+   r7  c                     US   nSn[        U R                  5       H  u  pEUS   U:X  d  M  Sn  O   U(       a  XR                  W'   g U R                  R                  U5        g )Nr   FT)rW  r  ro   )r0  r7  r  r  rf  fis         r)   r*  r*  V  s[    7DE3==)a5D=E * aT"r+   c                     Sn[        [        U5      5       HR  nX   nU[        U 5      :  a  [        U[        5      (       a  SU;   a  M3    gUb  [        X   U5      (       d    gUS-  nMT     U[        U 5      :w  a  gg)z
Returns true if <args> matches <types>.

Each item in <types> is a type or tuple of types. Any of these types will
match an item in <args>. `None` will match anything in <args>. `type(None)`
will match an arg whose value is `None`.
r   NFr   T)rR  r;   rB   r   )r  r@  r  rf  ra  s        r)   rI  rI  V  sz     	
A3u:D	>%''DEMZ%?%?	Q  	CI~r+   c                 x   [        U5      n[        R                  " U5      nUR                  UR                  -
  nUR
                  UR                  -
  nUn	Un
U(       a  [        X5      nX-  nX-  nOS=p[        X5      nUS:w  a  US:w  a  UnUnUnUS:  a  X|-  X-  :  a  X-  n	Un
O(Un	X~-  n
O!X:w  a  X|-  X-  :  a  X-  n	Un
OUn	X~-  n
OUn	Un
[        R                  " UR                  UR                  -   S-  UR                  UR
                  -   S-  5      n[        R                  " SSSSSS5      n[        R                  " UU5      n[        R                  " U[        R                  " X5      5      n[        R                  " U[        R                  " UR                  UR                  5      5      nU$ )z"
# compute image insertion matrix
r   r   rx  r   g      )r  r   	fz_rotater  r  r  r  r   r  r  rw  r_  fz_scalefz_translaterb  rc  )r  r0  r'  r_  rl  rY  ry  trwtrhr   r  larger+  r,  smallr  r)  r  s                     r)   r  r  V  s    BE
//&
!C
((UXX
C
((UXX
CAAE"]^KE{v}	Av8chAAAA	8chAAAA


XX A%XX A%C 

q!Q4
6C
//#s
#C
//#u~~a3
4C
//#u11#%%?
@CJr+   c                    U R                   R                  S:X  a  U R                   R                  R                  S:X  a  U R                   R                  R                  S:X  ae  UR                   R
                  R                  U R                   R                  R
                  R                  UR                   R                  S-  -
  :  $ g)Nr   r   皙?)r   r  r  rb  rc  r  
first_charr  )rs   r  s     r)   r  r  W  s    !doo&9&9&;&;q&@T__EXEXEZEZ^_E_}}##%%(B(B(I(I(K(KbmmN`N`cfNf(fffr+   c           	          U  S[        U 5       S[        [        U 5      5       S3n[        U 5       H  nUSU S3-  nM     U$ )Nr    (z):
rY  r%   )r   r;   r  )rb  rK   rf  s      r)   dir_strr9  W  sK    Cqa	CAK=
-CVaS| Jr+   r%  r  r  c           
         U R                  S5      (       a  U R                  S5      (       a  U $ [        U 5      (       d  gU(       a  Uc@  SR                  U  Vs/ s H"  n[	        U5      S:  a  S[	        U5      -  OSPM$     sn5      nOESR                  U  Vs/ s H(  n[	        U5      S:  a  SU[	        U5         S   -  OSPM*     sn5      nSU-   S-   $ US:  a5  SR                  U  Vs/ s H  nS	U[	        U5         S   -  PM     sn5      nO.SR                  U  Vs/ s H  nS	[	        U5      -  PM     sn5      nSU-   S-   $ s  snf s  snf s  snf s  snf )
a  Return a PDF string enclosed in [] brackets, suitable for the PDF TJ
operator.

Notes:
    The input string is converted to either 2 or 4 hex digits per character.
Args:
    simple: no glyphs: 2-chars, use char codes as the glyph
            glyphs: 2-chars, use glyphs instead of char codes (Symbol,
            ZapfDingbats)
    not simple: ordering < 0: 4-chars, use glyphs not char codes
                ordering >=0: a CJK font! 4 chars, use char codes as glyphs
z[<z>]z[<>]r`   r  z%02xb7r   z%04x)r7   r  rw  r  r  )r   r%  r  r  r  otxts         r)   r  r  W  sA    tt!4!4::>77tTt!s1v|FSVOEtTUD77OSTt!s1v|&Q.++EtTD d{T!! !|wwDADqA!22DABww6AQ67$; U U B6s   )E/E,E!Er  c                 l   [        U 5      (       d  gS nSnU  H  n[        U5      nUS:  a
  U" U 5      s  $ US:  a  US:  a  US;   a  US-  nX#-  nM;  US:  a
  US	U-  -  nMK  US
:X  a  US-  nMX  US:X  a  US-  nMe  US:X  a  US-  nMr  US:X  a  US-  nM  US:X  a  US-  nM  US-  nM     SU-   S-   $ )a  Return a PDF string depending on its coding.

    Notes:
        Returns a string bracketed with either "()" or "<>" for hex values.
        If only ascii then "(original)" is returned, else if only 8 bit chars
        then "(original)" with interspersed octal strings 
nn is returned,
        else a string "<FEFF[hexstring]>" is returned, where [hexstring] is the
        UTF-16BE encoding of the original.
    z()c                 b    [        SS/5      [        U S5      -   nSUR                  5       -   S-   $ )Nr'  r  zUTF-16BE<>)r  hex)r  r#  s     r)   make_utf16be!get_pdf_str.<locals>.make_utf16beEW  s1    sCj!Ia$<<QUUW}s""r+   r`   r     r  )r  r  r  r  z\%03or   z\br  z\tr-  ry  r  z\fr.  z\rz\267r  r  )rw  r  )r  rB  r#  r  r  s        r)   r  r  8W  s     77# 	AV8?"7rCx$$T	FA8BA 7JA1WJA2XJA2XJA2XJALA7 : 7S=r+   c           	         U (       a  U $ [         R                  " S5      n U (       a  U $ SSKnUR                  SSSSSS9nUR                  S:X  a;  [
        R                  " SUR                  5      nU(       a  UR                  S5      n U $ [        R                  S	:X  a  UR                  S
SSSSS9nUR                  R                  5       nUR                  (       d  U(       d  [        S5      e[         R                  R                  U5      n[         R                  R                  US5      n [         R                  R!                  U 5      (       a  U $ [        S5      e[#        5       nS H  nUR                  SU 3SSSSS9nUR                  S:X  d  M+  UR                  R                  5       R%                  5       n['        U5      S:X  d  Md  US   nU S3nUR)                  U5        [*        R*                  " U5      n	U	R-                  5         U	(       d  M  U	S   s  $    U(       a  Sn
U H  nU
SU 3-  n
M     [        U
5      e[        S5      e)a  Detect Tesseract language support folder.

This function is used to enable OCR via Tesseract even if the language
support folder is not specified directly or in environment variable
TESSDATA_PREFIX.

* If <tessdata> is set we return it directly.

* Otherwise we return `os.environ['TESSDATA_PREFIX']` if set.

* Otherwise we search for a Tesseract installation and return its language
  support folder.

* Otherwise we raise an exception.
TESSDATA_PREFIXr   Nztesseract --list-langsr   T)shellcapture_outputrh  r   z%List of available languages in "(.+)"win32zwhere tesseractz4No tessdata specified and Tesseract is not installedr  zINo tessdata specified and Tesseract installation has no {tessdata} folder)ztesseract-ocr	tesseractzwhereis r   z/*/tessdatar  z(No tessdata specified and no match for:
rY  )rh   r   
subprocessro  
returncoder3  r  stdoutr4  r  platformr	  r   r	   dirnamer  r  r   r:   r;   ro   globr  )r  rK  cpr  r  rO  attemptsr	   pattern	tessdatasr   attempts               r)   r  r  mW  s     yy*+H 	0!ST[_	`B	}}II=ryyIwwqzHO ||w^^-QqPQX\^]99??$==UVV''//(+77<<477>>(##Ojkk vH,^^htf-QqPQX\^]==Ayy(..0H8}!"1+$I[1( IIg.	 9$R=( - :Gd7)$$D  4  QRRr+   )CSSr  r   fontcoderV  r  c                   Sn[        U5      [        La  [        S5      eUc  Sn[        R	                  5        Vs/ s H  oUR                  U 5      (       d  M  UPM     nnU/ :X  a  [        SU  S35      e[        U5      S:  a  [        S5      eUc  U nU HP  n[        U   nUS   n	US	   n
US
   " 5       nUR                  X5        U	(       a  SOSnU
(       a  SOSnXX7X4-  -  nMR     U$ s  snf )a  Create @font-face items for the given fontcode of pymupdf-fonts.

Adds @font-face support for fonts contained in package pymupdf-fonts.

Creates a CSS font-family for all fonts starting with string 'fontcode'.

Note:
    The font naming convention in package pymupdf-fonts is "fontcode<sf>",
    where the suffix "sf" is either empty or one of "it", "bo" or "bi".
    These suffixes thus represent the regular, italic, bold or bold-italic
    variants of a font. For example, font code "notos" refers to fonts
    "notos" - "Noto Sans Regular"
    "notosit" - "Noto Sans Italic"
    "notosbo" - "Noto Sans Bold"
    "notosbi" - "Noto Sans Bold Italic"

    This function creates four CSS @font-face definitions and collectively
    assigns the font-family name "notos" to them (or the "name" value).

All fitting font buffers of the pymupdf-fonts package are placed / added
to the archive provided as parameter.
To use the font in pymupdf.Story, execute 'set_font(fontcode)'. The correct
font weight (bold) or style (italic) will automatically be selected.
Expects and returns the CSS source, with the new CSS definitions appended.

Args:
    fontcode: (str) font code for naming the font variants to include.
              E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
              A maximum of 4 font variants is accepted.
    CSS: (str) CSS string to add @font-face definitions to.
    archive: (Archive, mandatory) where to place the font buffers.
    name: (str) use this as family-name instead of 'fontcode'.
Returns:
    Modified CSS, with appended @font-face statements for each font variant
    of fontcode.
    Fontbuffers associated with "fontcode" will be added to 'archive'.
z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an Archiver`   zNo font code 'z' found in pymupdf-fonts.ro  zfontcode too shortr  r  rW  zfont-weight: bold;zfont-style: italic;)r   rz  r   r  ry  r7   r;   r~  )rW  rV  r  r   CSSFONTr  	font_keysfkeyr  r  r  fbuff	bold_textitalic_texts                 r)   css_for_pymupdf_fontr_  W  s   R DG=G#788
{ 1557R7q<<;Q7IRB>(3LMNN
9~-..|#D)F|hX E ,0(b	/5+2$i===  J# Ss   C,C,r   r   c           	         UR                  5       n[        R                  US5      nSnUS:X  a  [        nUS:X  a  [        nUbF  [        U  Vs/ s H+  n[        U5      S:  a  U[        U5         S   OUS   S   PM-     sn5      nXr-  $ U[        R                  5       ;   a  [        U [        U   X#5      $ US;   a  [        U 5      U-  $ [        SU-  5      es  snf )	zCalculate length of a string for a built-in font.

Args:
    fontname: name of the font.
    fontsize: font size points.
    encoding: encoding to use, 0=Latin (default), 1=Greek, 2=Cyrillic.
Returns:
    (float) length of text.
Nr$  r#  r  r   rY  )r  r  r  r  r  r  r  r  zFont '%s' is unsupported)r  r  r<   r)  r(  r  r  ry  util_measure_stringr;   r   )r   r   r   r   r  r%  r  r   s           r)   rG  rG  W  s     ~~H""8T2HF8>!PTUPT1c!fslA"sAFPTUV|?''))"/(+X
 	
  	 	 4y8##
/(:
;;) Vs   2Cr/  c                    [        U 5      [        R                  L a  U R                  5       nOI[	        U S5      (       a  U R                  5       nO'[        U 5      [        [        4;   a  U nO[        S5      e[        R                  U5      $ )a*  Return basic properties of an image.

Args:
    img: bytes, bytearray, io.BytesIO object or an opened image file.
Returns:
    A dictionary with keys width, height, colorspace.n, bpc, type, ext and size,
    where 'type' is the MuPDF image type (0 to 14) and 'ext' the suitable
    file extension.
r  zbad argument 'img')r   r=   r  r  r?   r  r  r  r   r  image_profile)r/  r   s     r)   rc  rc  "X  sj     CyBJJ	f			cui(	(-..v&&r+   c                   ^  [        T R                  [        5      (       d   e[        T R                  5      (       d  T R                  (       aY  T R                  c   e[        T R                  T R                  5      " T R                  5      nU(       d  [        S5        ST l        gU 4S jn[        T R                  [        5      (       d   e[        T R                  5      nUS:X  a  U" 5       $ T R                  [           nUS:w  a  U" 5       $ T R                  US-
     nU[           nUS:w  a  U" 5       $ U[           nT R                  [           nXx:w  a  U" 5       $  T R                  R                  5        H  u  pX;  d  M  XU	'   M     SnUS:X  a$  S	U[        '   T R                  R                  5         g[        S
5        U" 5         g! [         a    [        (       a
  [        5         Sn N`f = f)aU  
Append current path to list or merge into last path of the list.
(1) Append if first path, different item lists or not a 'stroke' version
    of previous path
(2) If new path has the same items, merge its content into previous path
    and change path["type"] to "fs".
(3) If "out" is callable, skip the previous and pass dictionary to it.
Nr   z2calling cdrawings callback function/method failed!c                     > T R                   R                  T R                  R                  5       5        T R                  R	                  5         g r-   )r	  ro   pathdictr$  rC  rz  s   r)   ro   jm_append_merge.<locals>.appendSX  s0    s||((*+r+   r  r   r  r  r  z$could not merge stroke and fill path)rB   r	  r   r  r  r   rf  rv   r;   r  dictkey_itemsrF   rk   r  rz   rC  )rz  respro   r  thistyper  prevtype	previtems	thisitemsr  rJ   r   s   `           r)   jm_append_mergero  8X  s    cggt$$$$ 

szz::1 377CJJ/=DHI cggt$$$$sww<Dqyx||\*H3x77DFD\"H3xm$Im,IxLL&&(DA}Q ) 
 
Qw"l67  N$4s   !"G 
G !G21G2c                     U R                   (       d'  U R                  R                  U[        U5      45        g U R                  R                  U[        U5      U R                  45        g r-   )r  r  ro   ro  
layer_name)rz  r  r   r  s       r)   jm_bbox_add_rectrr  X  sG    ::

D/$"789

D/$"7HIr+   c                     [         R                  " [         R                  R                  5      n[         R                  " UR	                  5       U5      n[        XUS5        g )Nz
fill-image)r   rp  r1  ll_fz_transform_rectr  rr  )rz  r  r  r  r  color_paramsr#  s          r)   jm_bbox_fill_imagerv  X  s>    U\\,,-A""AJJL#6Ac<0r+   c                      [        X[        R                  " [        R                  U5      S5        g ! [         a    [
        (       a
  [        5         e f = f)Nzfill-imgmask)rr  r   rt  fz_unit_rectrk   r  rz   )rz  r  r  r  r  rm  r  ru  s           r)   jm_bbox_fill_image_maskry  X  sE    #E$>$>u?Q?QSV$WYgh N$4s	   03 !Ac	           	          U(       a  SOSn [        X[        R                  " US U5      S5        g ! [         a    [        (       a
  [        5         e f = f)NTFz	fill-pathrr  r   ll_fz_bound_pathrk   r  rz   	rz  r  r	   r   r  r  rm  r  ru  s	            r)   jm_bbox_fill_pathr~  X  sH    tUH#E$:$:4s$K[Y N$4s	   #1 !Ac                      [        X[        R                  " X#5      S5        g ! [         a    [        (       a
  [        5         e f = f)Nz
fill-shade)rr  r   ll_fz_bound_shaderk   r  rz   )rz  r  shader  r  ru  s         r)   jm_bbox_fill_shader  X  s;    #E$;$;U$H,W N$4s	   !$ !Ac           	           [        X[        R                  " X#U5      S5        g ! [         a    [        (       a
  [        5         e f = f)Nzstroke-textrr  r   ll_fz_bound_textrk   r  rz   )rz  r  r   r  r  r  s         r)   jm_bbox_stroke_textr  X  >    #E$:$:D#$NP]^ N$4	   "% !Ac           	           [        X[        R                  " US U5      S5        g ! [         a    [        (       a
  [        5         e f = f)Nz	fill-textr  )rz  r  r   r  r  s        r)   jm_bbox_fill_textr  X  s?    #E$:$:D$$LkZ N$4s	   #& !Ac           	      J    [        X[        R                  " US U5      S5        g )Nzignore-text)rr  r   r  )rz  r  r   r  s       r)   jm_bbox_ignore_textr  X  s    c 6 6tT3 GWr+   c	           	           [        X[        R                  " X#U5      S5        g ! [         a    [        (       a
  [        5         e f = f)Nzstroke-pathr{  )	rz  r  r	   r  r  r  rm  r  ru  s	            r)   jm_bbox_stroke_pathr  X  r  r  c                    U R                   [           n[        U5      nS/S-  n[        S5       HN  nXS-
  U-      n[	        US   5      nUR
                  X4S-  '   UR                  X4S-  S-   '   [	        US   5      nMP     WR
                  US   :w  d  UR                  US   :w  a  gSU l        [        R                  " US   US   US   US   US   US   US   US	   5      nS
[        U5      4n	XUS-
  '   XS-
  U2	 g)a  
Check whether the last 4 lines represent a quad.
Because of how we count, the lines are a polyline already, i.e. last point
of a line equals 1st point of next line.
So we check for a polygon (last line's end point equals start point).
If not true we return 0.
r   r   ro  r   r   r  r  r   r   r  )rf  ri  r;   rR  r  rb  rc  	linecountr   r  r  )
rz  rF   r  r  rf  rs   r  r`  r!  r   s
             r)   jm_checkquadr  X  s    LL-(Eu:D	
aAAYQhl#a)66a%vva%!)tQx(  
ttqt|rttqt|  CM 	1Q41qtQqT1Q41qtQqTJA/!$%D4!8ax$r+   c                 ,   SU l         SnU R                  [           n[        U5      nX#S-
     n[	        US   5      n[	        US   5      nX#S-
     n[	        US   5      n[	        US   5      n	 UR
                  UR
                  :w  dN  UR                  U	R                  :w  d4  UR
                  U	R
                  :w  d  UR                  UR                  :w  a  gU	R
                  UR
                  :  aD  [        R                  " U	R                  U	R
                  UR                  UR
                  5      n
SnOC[        R                  " UR                  UR
                  UR                  UR
                  5      n
SnS[        U
5      U4nXUS-
  '   X#S-
  U2	 g)zq
Check whether the last 3 path items represent a rectangle.
Returns 1 if we have modified the path, otherwise 0.
r   r   r   r   r  r3  )
r  rf  ri  r;   r  rc  rb  r   r  ro  )rz  r  rF   r  r  r^  r_  line2r`  r  r#  r   s               r)   jm_checkrectr  X  sR    CMKLL-(Eu:D!8E	5!9	%B	5!9	%B !8E	5!9	%B	5!9	%B 	
ttrtt|ttrtt|ttrtt|ttrtt| 
ttbdd{rttRTT2446rttRTT2446?1%{3D4!8ax$r+   c           
      d    UR                   n U(       d  g [        XX#XEXg5        UR                  nM$  r-   )headjm_trace_text_spanr\  )	rz  r   ra  r  r  rm  r  seqnorG  s	            r)   jm_trace_textr  Y  s0    99D
Cu:eSyy	 r+   c                 $   Sn[        U[        R                  5      (       d   e[        R                  " U5      n[        U[        R                  5      (       d   e[        R
                  " U5      n[        UR                  5       5      n	[        R                  " UR                  5       U5      n
[        R                  " [        R                  " SS5      U
5      n[        R                  " UR                  UR                  -  UR                  UR                  -  -   5      n[        R                   " U5      nSn[#        UR                  5       5      n[%        UR                  5       5      nUS:  a  SnSnX-  X-
  -  nX-  X-
  -  nSn[        R&                  " UR                  5       5      nUU[(        -  -  nU[        R*                  " UR                  5       5      [,        -  -  nU[        R.                  " UR                  5       5      [0        -  -  nU[        R2                  " UR                  5       5      [4        -  -  nSn[        R6                  " 5       n[        R8                  " UR                  UR                  UR                  * UR                  SS5      nUR                  S:X  a  SUl        / n[=        UR>                  R@                  5       GH  nSnURC                  U5      RD                  S:  aS  [        RF                  " UR                  5       URC                  U5      RD                  UR>                  RH                  5      nUU-  nUnURC                  U5      RJ                  S:X  a  Un[        R                  " URC                  U5      R                  URC                  U5      R                  5      n[        RL                  " UU5      n[        R8                  " SSSSUR                  * UR                  * 5      n[        R                  " UU5      n[        R                  " U[        R
                  " SSSSUR                  UR                  5      5      nUR                  nUU-   nU
R:                  S:  a   UR                  S:X  d;  UR                  S:X  d+  U
RN                  S:w  a:  U
RN                  U
RP                  * :X  a  UR                  U-   nUR                  U-   nOUR                  U-
  nUR                  U-
  n[        RR                  " UUUU5      n [        RT                  " U U5      n URW                  URC                  U5      RJ                  URC                  U5      RD                  UR                  UR                  4U RX                  U RZ                  U R\                  U R^                  445        US:  a  [        R`                  " UU 5      nGM  U nGM     [c        U5      nU(       d  U[(        -  (       dr  [        Rd                  " UR                  5       SSS5      u  n!n[        RF                  " UR                  5       U!UR>                  RH                  5      nX-  nU(       d  UnOUn[g        5       n"[i        U5      U"S	'   [k        U	5      U"S
'   UR>                  RH                  U"S'   UU"S'   UR>                  Rl                  U"S'   UR>                  Rn                  U"S'   UU"S'   UU"S'   SU"S'   U(       a  [        Rp                  " [        Rr                  " [        Rt                  " U5      5      U[        Rv                  " 5       [        Rr                  " 5       [        Rx                  " 5       5      n#U#SS n#OSn#U Rz                  S:  a  U Rz                  n$OUS-  n$U#U"S'   UU"S'   UU"S'   U$U"S'   UU"S'   UU"S'   [}        U5      U"S'   U R~                  U"S'   UU"S'   UU"S'   U R                  RW                  U"5        g)z
jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
Nr   r   r  r  r  r  r  r  r  r  r  bidi_lvlbidi_dirr  r  r   r  r@  r  rm  r  r\  	linewidth
spacewidthr   r5  layerr  r@  )ArB   r   fz_text_span
FzTextSpan	fz_matrixr{  r:  r  r_  r{  fz_transform_vectorr  r  r  rb  rc  fz_normalize_vectorr  r  r6  r  r3  r  r:  r  r0  r  rp  rw  rA  rR  r   r;   rF   r  r  r  rQ  ra  r  r  r  r  ro   r  r  r  r  r  r   r  r9   r4  r  r  r|  fz_convert_colorr-  r   r  r  r  ro  rq  r	  )%rz  rG  ra  r  r  rm  r  r  out_fontr   r  r  r0  	space_advr-  r.  ascsizedscsizefflagsr  last_adv	span_bboxry  r@  rf  r  	char_origr  r  r  r  r  	char_bboxr  	span_dictr  r  s%                                        r)   r  r  "Y  sz    HtU//0000T"DsEOO,,,,
..#
CTYY[)H //$((*c
*C

#
#E$7$71$=s
CCIIceeceemceeceem34E

#
#C
(CI
DIIK
(C
TYY[
)C
Tz kSY'GkSY'GF&&		4D
d)))F
e%%tyy{36FFFF
e$$diik25FFFF
e##TYY[1NBBFH I


suuceeceeVSUUAq
AC
uu{EDOO''(::a=!(($))+tzz!}7H7H$//J_J_`Cu::a="I''

1AI	,,Y<	!!!Q1y{{lY[[LI__R%__R1aIKK!UV[[#X
ceerk!#%%w&Bw&Bw&Bw&B&&r2r26	++Ir:	JJqM%%JJqM%%!!
 "!!!		  q5++IyAI!I] )^ %LE--AA499;PRTUWXYKAx..IIKOO))I
 I$	 I I(-Iu,X6Iv////IwIw OO66Iz!__77Iz Iz!I{ I|$$""E$?$?$LM##%""$##% "1g
}}qMM	DL	 IwIv!Iy'I{(I|Iv(3Iv..IwIwIwGGNNIr+   c                 P   U (       a{   [         R                  " [         R                  R                  5      n[         R                  " 5       n[         R                  " U UUR
                  S UR                  5       5      nUS S $ g! [         a    [        (       a
  [        5         e f = f)Nr   r.   )
r   r-  r3  r  ll_fz_convert_colorr   r  rk   r  rz   )r  rm  r  rQ  r  s        r)   jm_lineart_colorr  Y  s    	 ##U%7%7%A%ABB$$&B++MMKKMC 2Aw	  	##(8	s   A5B !B%c                 ^    [        U R                  [        5      (       a  / U l        / U l        g r-   )rB   r	  r   scissorsrz  r  s     r)   jm_lineart_drop_devicer  Y  s!    #''4  CLr+   c	                    U(       a  SOSn [        U[        R                  5      (       d   e[        R                  " U5      U l        [
        U l        [        XU5        U R                  c  g SU R                  [        '   X0R                  S'   XpR                  S'   [        XV5      U R                  S'   [        U R                  5      U R                  [        '   U R                  U R                  S'   U R                  U R                  S'   U R                   (       a  U R"                  U R                  S	'   [%        U 5        U =R                  S
-  sl        g ! [&         a    [(        (       a
  [+        5         e f = f)NTFr  r   r  r   r  r  r   r   )rB   r   r  r{  r  trace_device_FILL_PATH	path_typejm_lineart_pathrf  r  r  ro  pathrectdictkey_rectr  rq  r  r+	  ro  rk   r  rz   r}  s	            r)   jm_lineart_fill_pathr  Y  s     tUH30000..#&.4(<< &)l#$,j!(-n% !1* Df&5cll&Cl#!$g!$g99%(YYCLL'"		Q	 N$4s   A E .C)E !E9c           
      b     [        XSX4XVU R                  5        U =R                  S-  sl        g r  )r'   r   r  r  )rz  r  r   r  r  rm  r  ru  s           r)   jm_lineart_fill_textr  Z  s(     #QsyyIIINIr+   c           
      d    [        XSUS S SU R                  5        U =R                  S-  sl        g )Nr   r   r  r  )rz  r   r  s      r)   jm_lineart_ignore_textr  Z  s'    #QT4CII>IINIr+   c                   @   ^  \ rS rSrU 4S jrS rS rS rS rSr	U =r
$ )WalkeriZ  c                    > [         TU ]  5         U R                  5         U R                  5         U R	                  5         U R                  5         Xl        g r-   )r   r   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathrz  )r(   rz  r  s     r)   r   Walker.__init__Z  sC    !!  """$r+   c                     U R                   R                  S:X  a  [        U R                   5      (       a  g SU R                   l        U R                   R                  (       a  U R                   R                  U R                   R
                  :w  a  S[        U R                   R                  5      [        U R                   R
                  5      4nU R                   R                  [           R                  U5        U R                   R
                  U R                   l        SU R                   R                  S'   OSU R                   R                  S'   SU R                   l        g ! [         a    [        (       a
  [        5         e f = f)Nr   r   rQ  Fr  T)rz  r  r  havemove	lastpoint
firstpointr4  rf  ri  ro   rk   r  rz   )r(   r  rG   s      r)   	closepathWalker.closepath!Z  s   	xx!!Q&))!"DHHxx  88%%)<)<<!1$((2D2D!E!1$((2E2E!FHDHH%%m4;;DA)-)<)<DHH&16!!+. 37!!;/ !"DHH 	##(8	s   4E& D.E& &!Fc                 B    SU R                   l        [        R                  " X#5      n[        R                  " XE5      n	[        R                  " Xg5      n
[        R                  " XR                   R
                  5      n[        R                  " XR                   R
                  5      n	[        R                  " XR                   R
                  5      n
[        R                  " U R                   R                  U5      U R                   l        [        R                  " U R                   R                  U	5      U R                   l        [        R                  " U R                   R                  U
5      U R                   l        S[        U R                   R                  5      [        U5      [        U	5      [        U
5      4nXR                   l	        U R                   R                  [           R                  U5        g ! [         a    [        (       a
  [        5         e f = f)Nr   r  )rz  r  r   r  ra  r  fz_include_point_in_rectr  r4  r  rf  ri  ro   rk   r  rz   )r(   r  r  r  x2y2x3y3rC  rD  r  r  s               r)   curvetoWalker.curveto=Z  ss   	!"DHH$$R,B$$R,B$$R,B))"hhll;B))"hhll;B))"hhll;B % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH $TXX%7%78$R($R($R(E "$HHHH}-44e< 	##(8	s   G:G= =!Hc                     [         R                  " [         R                  " X#5      U R                  R                  5      n[         R
                  " U R                  R                  U5      U R                  l        S[        U R                  R                  5      [        U5      4nX@R                  l        U R                  R                  [           nUR                  U5        U R                  =R                  S-  sl        U R                  R                  S:X  a5  U R                  R                  [        :w  a  [        U R                  5        g g g ! [          a    ["        (       a
  [%        5         e f = f)NrQ  r   ro  )r   ra  r  rz  r  r  r  r4  r  rf  ri  ro   r  r  r  r  rk   r  rz   )r(   r  rb  rc  rC  r  rF   s          r)   linetoWalker.linetoXZ  s   	))5+>+>q+DdhhllSB % > >@Q@QSU VDHH$dhh&8&89$R(E
 "$HHHH%%}5ELL% HH!#xx!!Q&488+=+=AW+WTXX& ,X&  	##(8	s   EE !E4c                      [        R                  " [        R                  " X#5      U R                  R                  5      U R                  l
        [        R                  " U R                  R                  5      (       a  [        R                  " U R                  R                  R                  U R                  R                  R                  U R                  R                  R                  U R                  R                  R                  5      U R                  l        U R                  R                  U R                  l        SU R                  l        SU R                  l        g ! [&         a    [(        (       a
  [+        5         e f = fr  )rB   rz  rf  r9   r'   rF   r   ra  r  r  r  r  r  r  rb  rc  r  r  r  rk   r  rz   )r(   r  rb  rc  rI   rJ   s         r)   movetoWalker.movetomZ  s   	!&!9!9''-HHLL"DHH (($((*;*;<<$)$6$6**,,**,,**,,**,,	%! #'(("4"4DHH !DHH!"DHH 	##(8	s   E$E( (!F	rg  )r1   r2   r3   r4   r   r  r  r  r  r5   r  r  s   @r)   r  r  Z  s!    86* r+   r  c                 &    [         R                  " [         R                  R                  5      U l        SU l        [         R
                  " SS5      U l        [        5       U l        / U R                  [        '   [        U 5      n[         R                  " [         R                  " [         R                  " U5      5      X3R                  5        U R                  [           (       d  SU l        gg! [         a    [         (       a
  [#        5         e f = f)a  
Create the "items" list of the path dictionary
* either create or empty the path dictionary
* reset the end point of the path
* reset count of consecutive lines
* invoke fz_walk_path(), which create the single items
* if no items detected, empty path dict again
r   N)r   rp  rq  r  r  r`  r  r9   rf  ri  r  fz_walk_pathFzPathll_fz_keep_pathr   rk   r  rz   )rz  r  r	   walkers       r)   r  r  Z  s    ||U\\%@%@Aq!,v')m$  	ELL)>)>t)DEvO`O`a||]+CL , N$4s   C+C/ /!Dc	                 r    [        U[        R                  5      (       d   eSU l        UR                  S:w  aG  [        UR                  5      [        UR                  5      :X  a  [        UR                  5      U l        OVUR                  S:w  aF  [        UR                  5      [        UR                  5      :X  a  [        UR                  5      U l        [        R                  " U5      U l
        [        U l        [        XU5        U R                  c  g SU R                  [        '   XpR                  S'   [!        XV5      U R                  S'   U R                  UR"                  -  U R                  [$        '   UR&                  UR(                  UR*                  4U R                  S'   U R                  UR,                  -  U R                  S'   SU R                  ;  a  S	U R                  S'   UR.                  (       a  [        R0                  " S
5      n	[        R2                  " U	S5        [5        UR.                  5       HT  n
[        R6                  " UR8                  U
5      n[        R2                  " U	[;        U R                  U-  5       S35        MV     [        R2                  " U	S[;        U R                  UR<                  -  5       35        XR                  S'   OSU R                  S'   [?        U R@                  5      U R                  [B        '   U RD                  U R                  S'   U RF                  U R                  S'   U RH                  (       a  U RJ                  U R                  S'   [M        U 5        U =RF                  S-  sl#        g ! [N         a    [P        (       a
  [S        5         e f = f)Nr   r   r  r  rm  r  r  r  Fr  z[ r   z] r  r(  r  r  r   )*rB   r   r  
pathfactorr    r%  rA  r  r  r{  r  trace_device_STROKE_PATHr  r  rf  r  r  r  r  	start_capdash_capend_caplinejoindash_lenr	  r  rR  floats_getitem	dash_listr   
dash_phasero  r  r  rq  r  r  r+	  ro  rk   r  rz   )rz  r  r	   r  r  r  rm  r  ru  r  rf  r   s               r)   jm_lineart_stroke_pathr  Z  s   23000055A:#cee*CEE
2 ZCNUUaZCJ#cee*4 ZCN..#&04(<<&)l#*/&'!1:!Eg'*~~8H8H'Hm$  $i 
 %(NNV__$Dj!cll*(-CLL% ??&&,D""D$/FOO, ,,f.>.>B&&3>>E;Q1R0SST.UV	 -
 ""DBy&J[J[9[/\.]*^_&*LL(#&,CLL(#&5cll&Cl# #W!$g99%(YYCLL'"		Q	 N$4s   DN I=N !N6c                 "   U R                   (       d  g [        R                  " U5      U l        [        U l        [        XU5        U R                  c  g SU R                  [        '   [        U5      U R                  S'   SU R                  ;  a  SU R                  S'   [        [        U 5      5      U R                  S'   U R                  U R                  S'   U R                  U R                  S'   [        U 5        U =R                  S-  sl        g )	Nr  r   r  Fr  r   r  r   )r  r   r{  r  trace_device_CLIP_PATHr  r  rf  r  rw  ro  compute_scissorr+	  rq  ro  )rz  r  r	   r   r  r  s         r)   jm_lineart_clip_pathr  Z  s    99nnS!CG*CMCd#
||"(CLL, $XCLL*#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr+   c                    U R                   (       d  g [        R                  " U5      U l        [        U l        [        XU5        U R                  c  g SU R                  S'   S U R                  S'   SU R                  ;  a  SU R                  S'   [        [        U 5      5      U R                  S'   U R                  U R                  S'   U R                  U R                  S'   [        U 5        U =R                  S	-  sl
        g )
Nr  r  r   r  Fr  r   r  r   )r  r   r{  r  trace_device_CLIP_STROKE_PATHr  r  rf  ro  r  r+	  rq  ro  )rz  r  r	   r  r  r  s         r)   jm_lineart_clip_stroke_pathr  Z  s    99nnS!CG1CMCd#
||#)CLL #CLL#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr+   c                 h    U R                   (       d  g [        U 5        U =R                  S-  sl        g r  r  r  r+	  )rz  r  r   r  r  r  s         r)   jm_lineart_clip_stroke_textr  [  !    99CIINIr+   c                 h    U R                   (       d  g [        U 5        U =R                  S-  sl        g r  r  )rz  r  r   r  r  s        r)   jm_lineart_clip_textr  [  r  r+   c                 h    U R                   (       d  g [        U 5        U =R                  S-  sl        g r  r  )rz  r  r  r  r  s        r)   jm_lineart_clip_image_maskr  [  r  r+   c                     U R                   (       a  U R                  (       d  g [        U R                  5      nUS:  a  g U R                  S	 U =R                  S-  sl        g )Nr   r  )r  r  r;   r+	  )rz  r  r  s      r)   jm_lineart_pop_clipr   #[  sC    99CLLs||DaxRIINIr+   c                 .    U(       a  X l         g SU l         g Nr`   rq  )rz  r  r   s      r)   jm_lineart_begin_layerr  -[  s    r+   c                     SU l         g r  r  r  s     r)   jm_lineart_end_layerr  4[  s	    CNr+   c           	         U R                   (       d  g S[        U5      [        U5      [        U5      [        R                  " U5      UU R
                  U R                  S.U l        [        U 5        U =R
                  S-  sl        g )Nr4  )r   r   isolatedknockoutr  r\  r   r  r   )	r  ro  rw  r   fz_blendmode_namer+	  rq  rf  ro  )rz  r  r5  r  r  r	  r  r  s           r)   jm_lineart_begin_groupr  8[  sd    99#D)XX00;YY^^	CL CIINIr+   c                 R    U R                   (       d  g U =R                  S-  sl        g r  )r  r+	  r  s     r)   jm_lineart_end_groupr  J[  s    99IINIr+   c	           
      `    [        XSXEXgU R                  5        U =R                  S-  sl        g r  r  )	rz  r  r   r  r  r  rm  r  ru  s	            r)   jm_lineart_stroke_textr  Q[  s#    #QsyyIIINIr+   c	                 <    UR                   U l         [        X5        g r-   )r  jm_increase_seqno)	rz  r  r	   r  r  r  rm  r  ru  s	            r)   jm_dev_linewidthr  V[  s    $$CMs r+   c                 x     U =R                   S-  sl         g ! [         a    [        (       a
  [        5         e f = fr  )r  rk   r  rz   )rz  r  vargss      r)   r  r  [[  s1    		Q	 N$4s    !9rC  rD  c                 V    [        U 5      n [        U5      n[        [        X5      5      $ )aM  Compute matrix which maps line from p1 to p2 to the x-axis, such that it
maintains its length and p1 * matrix = Point(0, 0).

Args:
    p1, p2: point_like
Returns:
    Matrix which maps p1 to Point(0, 0) and p2 to a point on the x axis at
    the same distance to Point(0,0). Will always combine a rotation and a
    transformation.
)r"  r~  r]  )rC  rD  s     r)   r  r  c[  s&     
rB	rB/")**r+   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )JM_image_reporter_Filteris[  c                 B   > [         TU ]  5         U R                  5         g r-   r  r  s    r)   r   !JM_image_reporter_Filter.__init__t[  s    %%'r+   c                     [        U[        R                  5      (       d   e[        U [        R                  " U5      X45        [
        (       a  gg r   )rB   r   r  r  r{  r   )r(   r  r  r   r  s        r)   r  %JM_image_reporter_Filter.image_filterx[  s=    #u////ennS14?;  r+   r.   r  r  s   @r)   r  r  s[  s    ( r+   r  c                   P   ^  \ rS rSrU 4S jr\r\r\	r
\r\r\r\r\r\r\rSrU =r$ )r}  i[  c                   > [         TU ]  5         Xl        X l        SU l        U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         g r  )r   r   r  r  rq  use_virtual_fill_pathuse_virtual_stroke_pathuse_virtual_fill_textuse_virtual_stroke_textuse_virtual_ignore_textuse_virtual_fill_shadeuse_virtual_fill_imageuse_virtual_fill_image_maskuse_virtual_begin_layeruse_virtual_end_layer)r(   r  r  r  s      r)   r   "JM_new_bbox_device_Device.__init__[  s    ""$$$&""$$$&$$&##%##%((*$$&""$r+   )rq  r  r  )r1   r2   r3   r4   r   r  begin_layerr  	end_layerr~  	fill_pathr  stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shaderv  
fill_imagery  fill_image_maskr5   r  r  s   @r)   r}  r}  [  s<    %" )K$I!I%K!I%K%K#J#J-Or+   r}  c                   @   ^  \ rS rSrU 4S jrS rS rS rS rSr	U =r
$ )r  i[  c                    > [         TU ]  5         Xl        U R                  5         U R	                  5         U R                  5         U R                  5         g r-   )r   r   rc  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)r(   rc  r  s     r)   r   %JM_new_output_fileptr_Output.__init__[  sC     !!#r+   c                 8    U R                   R                  X#5      $ r-   )rc  r
  )r(   r  r  whences       r)   r
  !JM_new_output_fileptr_Output.seek[  s    xx}}f--r+   c                 :    U R                   R                  5       nU$ r-   )rc  tell)r(   r  rK   s      r)   r>  !JM_new_output_fileptr_Output.tell[  s    hhmmo
r+   c                 6    U R                   R                  5       $ r-   )rc  truncate)r(   r  s     r)   rA  %JM_new_output_fileptr_Output.truncate[  s    xx  ""r+   c                 d    [         R                  " X#5      nU R                  R                  U5      $ r-   )r   raw_to_python_bytesrc  r   )r(   r  data_rawdata_lengthr  s        r)   r   "JM_new_output_fileptr_Output.write[  s%    ((?xx~~d##r+   r  )r1   r2   r3   r4   r   r
  r>  rA  r   r5   r  r  s   @r)   r  r  [  s!    $.#$ $r+   r  c                 P   U R                   c  [        5       U l         [        U R                   5      nUS:  a>  U R                   US-
     n[        U5      n[        R
                  " X0R                  5      nOU R                  nU R                   R                  [        U5      5        U$ )zg
Every scissor of a clip is a sub rectangle of the preceding clip scissor
if the clip level is larger.
r   r   )	r  r   r;   r  r   rl  r  ro   ro  )rz  num_scissorslast_scissorr  s       r)   r  r  [  s    
 ||vs||$La||LN3!,/))'<<@,,LL01Nr+   c                   t   ^  \ rS rSrSrU 4S jr\r\r	\
r\r\r\r\r\r\r\r\r\r\r\r\r\r \!r"\#r$Sr%U =r&$ )r  i[  z7
LINEART device for Python method Page.get_cdrawings()
c                 2  > [         TU ]  5         U R                  5         U R                  5         U R	                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                    U R                    U R                    U R                  5         U R                  5         U R                  5         U R                  5         U R!                  5         U R#                  5         U R%                  5         U R'                  5         Xl        SU l        SU l        X l        X0l        S U l        SU l        S U l        SU l        [:        R<                  " 5       U l        [:        R<                  " 5       U l         [:        R<                  " 5       U l!        [:        RD                  " 5       U l#        [:        RD                  " 5       U l$        SU l%        [:        RL                  " 5       U l        SU l'        SU l(        SU l)        g Nr   r`   )*r   r   r  r  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr   r!  r"  r#  r$  r%  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr&  r'  r	  r  r+	  r  r  r  rq  r  r  r   r{  r  r  ry  r`  r  r  r  rp  r  r  r  )r(   r	  r  r  r  s       r)   r   %JM_new_lineart_device_Device.__init__[  s    	""$$$&""$((*))+))+""$""$$$$##%##%((*!!#$$&""$$$&""$


>>#>>#>>#--/r+   )r  r  r+	  r  r  r  rq  r  r  r  r	  r  r  r  r  ry  r  r  )'r1   r2   r3   r4   r  r   r  r+  r  r,  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr  clip_stroke_textr  r-  r.  r/  r0  r1  r2  r   pop_clipr  begin_groupr  	end_groupr  r)  r  r*  r5   r  r  s   @r)   r  r  [  sl    1j /I0K4O.I5.I5+I+K+K+J+J+O-H0K.I0K.Ir+   r  c                   T   ^  \ rS rSrSrU 4S jr\r\r	\
r\r\r\r\r\r\r\rSrU =r$ )r  i\  z:
Trace TEXT device for Python method Page.get_texttrace()
c                 :  > [         TU ]  5         U R                  5         U R                  5         U R	                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         Xl        SU l        SU l        SU l        S U l        SU l        [#        5       U l        ['        5       U l        SU l        [,        R.                  " 5       U l        [,        R.                  " 5       U l        [,        R.                  " 5       U l        [,        R6                  " 5       U l        [,        R:                  " 5       U l        SU l        SU l         SU l!        SU l"        g rM  )#r   r   r  r  r   r!  r"  r#  r$  r%  r&  r'  r	  r  r+	  r  r  r9   rf  r   r  r  r   r{  r  r  ry  r`  r  rp  r  r  r  r  rq  )r(   r	  r  s     r)   r    JM_new_texttrace_device.__init__"\  s'   ""$$$&""$$$&$$&##%##%((*$$&""$



>>#>>#>>#r+   )r  r  r+	  r  rq  r  r  r  r	  r  rf  r  r  r  ry  r  r  )r1   r2   r3   r4   r  r   r  r+  r  r,  r  r-  r  r.  r  r/  r0  r1  r2  r  r)  r  r*  r5   r  r  s   @r)   r  r  \  sB    "H "I"K$I(K(K"J"J'O(K$Ir+   r  rf  c                     U R                  5       nSS KnUR                  S5      nUR                  SU-  5      nUR                  S5      nSnSU-  nUS:X  a  Un	U	$ US:X  a  Un	U	$ US	:X  a  Un	U	$ US
:X  a  Un	U	$ Un	U	$ )Nr   a^  
            <!DOCTYPE html>
            <html>
            <head>
            <style>
            body{background-color:gray}
            div{position:relative;background-color:white;margin:1em auto}
            p{position:absolute;margin:0}
            img{position:absolute}
            </style>
            </head>
            <body>
            zP
            <?xml version="1.0"?>
            <document name="%s">
            a  
            <?xml version="1.0"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <style>
            body{background-color:gray}
            div{background-color:white;margin:1em;padding:1em}
            p{white-space:pre-wrap}
            </style>
            </head>
            <body>
            r`   z{"document": "%s", "pages": [
r  r\  r  xhtml)r  textwrapdedent)
rf  rj   r  rd  r  r  rc  r   r\  r#  s
             r)   ConversionHeaderrf  S\  s    		A??  D //  	 C OO  E D,x7DF{ H 
f H 
e H 
g H Hr+   c                     U R                  5       nSnSnSnSnUnUS:X  a  UnU$ US:X  a  UnU$ US:X  a  UnU$ US:X  a  UnU$ UnU$ )	Nr`   z]
}z</body>
</html>
z</document>
r  r\  r  rc  )r  )rf  r  r   r\  r  r  rc  r#  s           r)   ConversionTrailerrh  \  s    		ADDD
CEF{ H 
f H 
e H 
g H Hr+   c                     [        U 5        U R                  R                  (       d  [        S5      eU R                  nUS:w  a  U R                  S5        U$ )zPrepare for annotation insertion on the page.

Returns:
    Old page rotation value. Temporarily sets rotation to 0 when required.
r~  r   )rn  r   r  r   ru  r  )r   r  s     r)   r  r  \  sI     ;;%%==Lq!r+   c                     [        U [        5      (       d   e[        U[        5      (       d   eXl        XR                  [        U5      '   SUl        g)zmClean up after annotation insertion.

Set ownership flag and store annotation in page annotation dictionary.
TN)rB   r   r   r   rW  rX  r   )r   r   s     r)   r  r  \  sH     tT""""ue$$$$L"'RYEMr+   c                 N   [        U [        5      (       d   eU S:X  d  U S:X  d  U S:X  a  [        S5      $ U [        S5      :X  d  U [        S5      :X  d  U [        S5      :X  a  [        S5      $ U [        S5      :  a)  U [        S	5      ::  a  U [        S5      -
  [        S
5      -   $ U $ )Nr  i(   i)   r   r%   	r  Zr    )rB   r8   r  r  s    r)   canonro  \  s    a 	DyAK1;3xCI~c$i1D	>3xCH}c#h3s8|c#h&&Hr+   c                 |    [        U [        5      (       d   e[        R                  " U 5      u  p[	        U5      nX4$ r-   )rB   r   r   r  ro  )r  rI   r  s      r)   chartocanonrq  \  s7    aq!DAaA4Kr+   c                 ,   [         R                  " U [        S5      5      n[         R                  " [         R                  " U[        S5      5      [        S5      5      (       a0  [	        [         R                  " U[        S5      5      U5      (       d  g[         R                  " U [        S5      5      nUR
                  (       d   g[         R                  " U5      (       a  [	        XC5      $ [        [         R                  " US5      UU5      (       d  gg)Nr  rM
  rM  r  r   r  r   )	r   r
  r  r  string_in_names_listr   rx  dest_is_valid_pager  )r  ru  page_object_nums
names_listr  s        r)   dest_is_validrw  \  s    Ax}-A""Ax}5   )""Ax}5 
 Ax/0A<<  
		a	 	 #Q33A& 
 r+   c                 v    [         R                  " U 5      nUS:X  a  g[        U5       H  nX   U:X  d  M    g   gr  )r   r  rR  )r  ru  rO  numrf  s        r)   rt  rt  \  s>    


3
C
ax9#%  r+   c                     [        U [        5      (       d   e[        [        U 5      5       H  n[	        XS  U5      nUc  M  X2-  nX#4s  $    g)Nr
  )rB   r   rR  r;   match_string)r  rb  rf  r  s       r)   r  r  \  sO    a3q6]1R5&)?HC6M	 
 r+   c                     SSK n [        [        U R                  S-  5      5      R	                  SS5      < S[        [        U R                  S-  5      S-  5      R	                  SS5      < S3nU R
                  " SU R                  " 5       5      nU R                  S:  a
  US	U-   -  nU$ U R                  S:  a
  US
U-   -  nU$  U$ )z
"Now" timestamp in PDF Format
r   Ni  r   r~   r   rx  zD:%Y%m%d%H%M%Sr  r
  )timer   r%  altzonerjuststrftime	localtime)r}  tztstamps      r)   r  r  \  s     C$%&,,Q4S#$r)+11!S9
B ]]+T^^-=>F||a#(
 M	 
	#( M 	Mr+   c                       \ rS rSrSrS rSrg)ElementPositioni]  zDConvert a dictionary with element position information to an object.c                     g r-   r.   r/   s    r)   r   ElementPosition.__init__]  r  r+   r.   Nr=  r.   r+   r)   r  r  ]  s
    Nr+   r  c                      [        5       $ r-   )r  r.   r+   r)   make_story_elposr  ]  s    r+   r  r  r  c                 2   Uc  U R                   n[        U5      nUc  UR                  nUc  UR                  nUR                  Ul        UR                  Ul        UR                  (       d  UR                  (       a  / $ U R                  SSUS9S   n/ nU H  n[        US   5      nUR                  (       d  UR                  (       a  M5  US    HF  n[        US   5      nUR                  (       d  UR                  (       a  M5  UR                  U5        MH     M     U/ :X  a  U$ UR                  S S9  UR                  S5      n	U	R
                  UR                  -
  S	U	R                  -  ::  a`  [        UR                  U	R
                  U	R                  5      n
U
R                  (       d#  U
R                  (       d  UR                  SU
5        OUR                  SU	5        U/ :X  a  U$ UR                  5       nUR                  UR                  -
  S	UR                  -  ::  a`  [        UR                  UR                  UR                  5      n
U
R                  (       d"  U
R                  (       d  UR                  U
5        U$ UR                  U5        U$ )
a  Return rectangles of text lines between two points.

Notes:
    The default of 'start' is top-left of 'clip'. The default of 'stop'
    is bottom-reight of 'clip'.

Args:
    start: start point_like
    stop: end point_like, must be 'below' start
    clip: consider this rect_like only, default is page rectangle
Returns:
    List of line bbox intersections with the area established by the
    parameters.
r9   r   )r  r  r  r5  rX  c                     U R                   $ r-   )r  )r5  s    r)   r
  )get_highlight_selection.<locals>.<lambda>L]  s    r+   r
  r5  )r   r*  r#  r$  rc  r  r  rv  ru  r  ro   r  rC  r0  rb  insert)r   r  r  r  r  rX  r  r5  rs   bboxfr#  bboxls               r)   r  r  ]  s      |yy:D}|wwggDGffDG}}((	 ]]ad  F EAfIt}}gJDV%D4==LL	 	  {	JJ'J( IIaLExx%''S5<<//%((EHH-

ammLLAQ{ IIKEvvC%,,..466588,

ammLLO L 	ULr+   c                 j    SSK n [        UR                  U 5      5      nU$ ! [         a    Sn U$ f = f)z+Convenience function accessing unicodedata.r   Nr	  )unicodedatar  lookuprk   )r   r  r  s      r)   r*  r*  f]  sA    +$$T*+ J  J   " 22c                     UR                   UR                   -
  nUR                  UR                  -
  n[        R                  " X0R                   -  X@R                  -  -   5      $ r-   rb  rc  r   fz_absr  r    r  dxdys        r)   hdistr  p]  D    	
qssB	
qssB<<UU
R%%Z/00r+   r  rowsc                    [        U 5      n U R                  (       d  U R                  (       a  [        S5      eU R                  nU R
                  U-  nU R                  U-  nUSUS4nSUSU4n[        X3R                  U-   UR                  U-   5      nU/n	[        SU5       H  n
X-  nU	R                  U5        M     U	/n[        SU5       H9  n
XS-
     n	/ nU	 H  nUR                  X-   5        M     UR                  U5        M;     U$ )a^  Return a list of (rows x cols) equal sized rectangles.

Notes:
    A utility to fill a given area with table cells of equal size.
Args:
    rect: rect_like to use as the table area
    rows: number of rows
    cols: number of columns
Returns:
    A list with <rows> items, where each item is a list of <cols>
    PyMuPDF Rect objects of equal sizes.
r  r   r   )r*  rv  ru  r   r#  r0  r  rb  rc  rR  ro   )r   r  r  r#  r0  r  delta_hdelta_vr#  rowrf  rectsnrows                r)   
make_tabler  v]  s    :D}}((<==	B[[4FJJEa"G&!V$GRrttf}-A #C1d^	

1 
 EE1d^ElAKK$ T  Lr+   c                    [         R                  " U R                  5      n[         R                  " U5      n[         R                  " S5      n[         R
                  " [         R                  " U5      [        S5      [        S5      5      n[         R                  " XC5      n[         R                  " U5      (       d  [         R                  " XCS5      n[         R                  " U5      nSn[         R                  " U5      n[        U5       H6  n	[         R                  " [         R                  " XY5      5      n
X:X  d  M4  Sn  O   U(       d-  [         R                  " U[         R                   " X(S5      5        gg)zD
Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
r  r  r  r   r   r   N)r   r  r   r  r  r  r  r  r
  r:  rI  r  r  rR  r  r<  r  )r   r%  r`  
PDFNAME_COr}  r  rI   r  r  rf  r  s              r)   r  r  ]  s    ##EJJ/I

&
&y
1C##D)Jc"VZ D 
		D	-Bb!!%%d:BAEI&D1X  !4!4R!;<=E	 
 R!7!71!EF r+   r  c                    ^^^ S mS mUUU4S jnU" 5       u  ppU b
  T" U 5      u  pUb
  T" U5      u  pUb  UnUb  Un	Ub  Un
Ub  UnXX4$ )a  
Helper for initialising rectangle classes.

2022-09-02: This is quite different from PyMuPDF's util_make_rect(), which
uses `goto` in ways that don't easily translate to Python.

Returns (x0, y0, x1, y1) derived from <args>, then override with p0, p1,
x0, y0, x1, y1 if they are not None.

Accepts following forms for <args>:
    () returns all zeros.
    (top-left, bottom-right)
    (top-left, x1, y1)
    (x0, y0, bottom-right)
    (x0, y0, x1, y1)
    (rect)

Where top-left and bottom-right are (x, y) or something with .x, .y
members; rect is something with .x0, .y0, .x1, and .y1 members.

2023-11-18: we now override with p0, p1, x0, y0, x1, y1 if not None.
c                    [        U [        [        45      (       a  [        U 5      S:X  a
  U S   U S   4$ [        U [        [
        R                  [
        R                  45      (       a  U R                  U R                  4$ g)Nr   r   r   r
  )
rB   r   r   r;   r"  r   r`  r  rb  rc  )r  s    r)   get_xyutil_make_rect.<locals>.get_xy]  s`    sT5M**sCyA~q63q6>!sUEMM5>>BCC55#%%<r+   c                    [        U [        5      (       a  U $ [        U [        5      (       a  U R                  U R                  4$ [        U [
        [        [        R                  [        R                  45      (       a.  U R                  U R                  U R                  U R                  4$ [        U [        [        45      (       d  U 4n U $ r-   )rB   r   r"  rb  rc  r*  r]  r   rp  fz_rectr  r  r  r  r   r  s    r)   
make_tuple"util_make_rect.<locals>.make_tuple]  s    q%  Hq%  338OT5%,,FGG44qttQTT))1tUm,,Ar+   c                  ^  > [        T5      S:X  a  g[        T5      S:X  a  TS   n [        U [        [        45      (       a-  [        U 5      S:X  a  U u  p/ UQUQ7n[        U5      S:X  d   eU$ [        U [        [        45      (       aH  [        U 5      S:X  a9  U u  pEnT" U5      nT" U5      nT" U5      n/ UQUQUQ7n[        U5      S:X  d   eU$ T" U 5      n[        U5      S:X  d   SU < SU< 35       eU$ [        T5      S:X  a*  T" TS   5      T" TS   5      -   n[        U5      S:X  d   eU$ [        T5      S:X  a?  T" TS   5      u  pxXx4S	:w  a  XxTS   TS   4$ T" TS   5      u  pX4S	:w  a  TS   TS   X4$ O![        T5      S:X  a  TS   TS   TS   TS   4$ [	        S
T 35      e)Nr   r'  r   r   ro  r   zarg=z ret=r
  r  )r;   rB   r   r   rk   )r  rC  rD  rK   r    r  r  r  r  r  r  r  r  r  s              r)   handle_args#util_make_rect.<locals>.handle_args]  s   t9>Y!^q'C3u..39>rhBh3x1}$}
3u..39>aqMqMqM qj1jqj3x1}$}
c"Cs8q=2TSF&C6"22=JY!^$q'"VT!W%55Cs8q= =JY!^T!W%FBx<'tAwQ//T!W%FBx<'AwQ// (Y!^7DGT!Wd1g55.tf566r+   r.   )r_  rC  r  r  r  r  r  r  ret_x0ret_y0ret_x1ret_y1r  r  s         `     @@r)   r  r  ]  sn    .	"7F &1]"FF	~	~	~	~	~	~6))r+   c           
      x    [        X`XX4US.6u  pxpS nU" US5      nU" US5      nU" U	S5      n	U" U
S5      n
XxX4$ )Nr  c                     U(       a  [        [        R                  " U 5      5      $ [        [        R                  " U 5      5      $ r-   )r8   r  rI  floor)rb  rI  s     r)   convert util_make_irect.<locals>.convert^  s+    tyy|$$tzz!}%%r+   FT)r  )r_  rC  r  r  r  r  r  r    r  r  rA  r  s               r)   r  r  ^  sW    $"bQJA!&
 	5A5A4A4A:r+   c                 R    [        [        R                  " [        U 5      5      5      $ r-   )r  r   rm  r  r  s    r)   r~  r~  ^  s    E//0EFGGr+   c                     [         (       a  [        R                  " X5      $ [        [        R
                  " [        U 5      [        U5      5      5      $ r-   )r  r   r  ro  r   r  r  r  )r   r  s     r)   r  r  #^  s<    {(($77522?43HJ[\bJcdeer+   c                 f    [        [        R                  " [        U 5      [        U5      5      5      $ r-   )ro  r   rl  r  r:  r;  s     r)   rY  rY  )^  s-    #### r+   c                 T    [         R                  " [        U 5      [        U5      5      $ r-   )r   fz_is_point_inside_rectr  r  )r  r#  s     r)   r  r  2^  s%    (( #" r+   c                 f    [        [        R                  " [        U 5      [	        U5      5      5      $ r-   )ro  r   r  r  r  )r#  r  s     r)   rS  rS  8^  s-    **" # r+   c                 Z    [        U 5      n[        U5      n[        R                  " X#5      $ r-   )r  r  r   fz_is_point_inside_quad)rq  r   r  r!  s       r)   r  r  A^  s'    AA((..r+   c                 f    [        [        R                  " [        U 5      [	        U5      5      5      $ r-   )r4  r   ra  r  r  )rg  r  s     r)   r  r  G^  s-    $$ '!&) r+   c                 f    [        [        R                  " [        U 5      [        U5      5      5      $ r-   )ro  r   r  r  r  s     r)   rV  rV  P^  s-    ## r+   c                 f    [        [        R                  " [        U 5      [        U5      5      5      $ r-   )rz  r   r_  r  )r  r  s     r)   r  r  Y^  s+    OO!"%!"% r+   c                 4    ['        U 5      nUR                  nX2R                  -  UR                  UR                  -  -
  nU[         R"                  R$                  * :  d  U[         R"                  R$                  :  Ga  [        R                  " 5       nSU-  nUR                  U-  Ul        UR                  * U-  Ul        UR                  * U-  Ul	        X6-  Ul
        UR                  * UR                  -  UR                  UR                  -  -
  nUR                  * UR                  -  UR                  UR                  -  -
  Ul        X5l        SUR                  UR                  UR                  UR                  UR                  UR                  44$ g)Nr   r   )r   r.   )rB   r   r   r   r{  r  r~  r    r  r  rA  rg  r  r   r	  r%  r  
float_infoepsilonr  )r  rK   r1  r    detr^  rdets          r)   r  r  b^  s-   ( F
#CA
ee)ceeceem
#C
cnn$$$$cnn.D.D(Dnn3wUUFSUUNSUUSUU]*.355#%%suucee<<<r+   c                    [         R                  " U5      nSnSnU[        U 5      :  a  [         R                  " XS  5      u  pxXg-  nU[         R                  :X  a  [         R
                  " U5      nOAU[         R                  :X  a  [         R                  " U5      nO[         R                  " U5      nUS:  a  Sn[         R                  " XH5      n	[         R                  " XIS5      n
XZ-  nU[        U 5      :  a  M  XR-  nU$ )Nr   rY  )r   rq  r;   r  PDF_SIMPLE_ENCODING_GREEKfz_iso8859_7_from_unicodePDF_SIMPLE_ENCODING_CYRILLICfz_windows_1251_from_unicodefz_windows_1252_from_unicoder  r  )r   r   r   r   r  r   r,  r  r  ro  rm  rK   s               r)   ra  ra  ^  s    ##H-D	A
C
D	/""4:.u666//2A;;;2215A2215Aq5A%%d.##DQ/	 D	/ ,CJr+   c                 |   [        U 5      n[        U5      n[        U5      n[        R                  " [        R                  " UR                  UR                  -
  UR
                  UR
                  -
  5      5      n[        R                  " SSSSUR                  * UR
                  * 5      n[        R                  " UR                  UR
                  * UR
                  UR                  SS5      n[        R                  " Xx5      n[        R                  " X75      n[        R                  " U5      nUR
                  $ )Nr   r   )	r  r   r  r  rb  rc  rw  r_  ra  )	r  rq  r   r  r  r!  r  r  r  s	            r)   r  r  ^  s    AAA!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8B		 B  'A!!!$A33Jr+   c                    [        U 5      n[        U5      n[        R                  " [        R                  " UR                  UR                  -
  UR
                  UR
                  -
  5      5      n[        R                  " SSSSUR                  * UR
                  * 5      n[        R                  " UR                  UR
                  * UR
                  UR                  SS5      n[        [        R                  " XV5      5      $ )z{
Return the matrix that maps two points C, P to the x-axis such that
C -> (0,0) and the image of P have the same distance.
r   r   )	r  r   r  r  rb  rc  rw  rz  r_  )r  rq  r  r  r  r  r  s          r)   r]  r]  ^  s    
 	AA 	!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8BU__R455r+   c                    SnSnUn[        XS  5      u  pVX%-  n[        XS  5      u  pxX7-  nXh:X  a  UnU[        S5      :X  a&   [        XS  5      u  pVX%-  nU[        S5      :w  a  OM%  [        XS  5      u  pVX%-  nU[        S5      :X  a&   [        XS  5      u  pxX7-  nU[        S5      :w  a  OM%  [        XS  5      u  pxX7-  nXh:X  a  M  US:w  a  S $ U$ )Nr   r   )rq  r  )	h0r  r  rI   rg  r  hcdelta_nncs	            r)   r{  r{  ^  s   	A	A	Abf%KGLAbf%KGLA
(S>)"R&1S>	  &bf-KGLAS>)"R&1S>	  &bf-KGLA' (( 74!!r+   c                 F   U (       d   e[        U[        R                  5      (       d   e[        U[        R                  5      (       d   eUR                  R
                  U R                  -  nUR                  R
                  U R                  -  n[        X5      nU R                  S:  GaD  U R                  U R                  S-
     n[        U5      n [        UR                  R                  UR                  UR                  5      U:  a  [!        UR                  R                  UR                  UR                  5      U:  a  [        UR                  R                  UR"                  UR$                  5      U:  aq  [!        UR                  R                  UR"                  UR$                  5      U:  a8  UR"                  Ul        UR                  Ul        U R                  S   U:X  d   eg U R                  R'                  U5        U =R                  S-  sl	        g r  )rB   r   r  r  r   r  r  r  r  r;   rZ
  r  r  r  r_  r^  vdistr`  r  ro   )r  rs   r  r  r  ch_quadrF  r  s           r)   r  r  ^  s}   K4dE--....b%++,,,,MM+EMM+E4$Gxx!|zz$((Q,'d#$//--svvwzzBUJ$//--svvwzzBUJ$//--svvwzzBUJ$//--svvwzzBUJZZCFZZCF::b>S(((JJgHHMHr+   c                    [         (       a  [        R                  " XX#XEXg5      $ [        S5      [        S5      [        S5      [        S5      [        S5      [        S5      [        S5      [        S5      [        S	5      /	n[        R
                  " X5      n	[        R                  " U S
5      n
[        R                  " U
[        S5      [        S5      5        [        [        U5      5       Hh  n[        R                  " XU   5      nUR                  (       d  M/  [        R                  " XU   [        R                  " UR                  U5      5        Mj     U(       Ga  [        R                  " U	[        S5      5      n[        R                  " U5      nUS:  Ga  [        R                   " U
[        S5      U5      n[        U5       GH  n[        R"                  " X5      nUR                  (       a  [        R$                  " U5      (       d  MH  [        R&                  " US5      R                  (       a  Mp  [        R                  " U[        S5      5      n[        R(                  " U[        S5      5      (       a  M  [        R(                  " U[        S5      5      (       a  M  [        R(                  " U[        S5      5      (       a  GM  [        R*                  " U[        S5      5        [        R*                  " U[        S5      5        [        R                  " UR                  U5      n[        R,                  " U [        R.                  " U5      S5      n[        R0                  " UU5        GM     US:w  a!  [        R2                  " U
[        S5      U5        [        R4                  " X
5      n[        R6                  " XU5        g)z
Deep-copies a source page to the target.
Modified version of function of pdfmerge.c: we also copy annotations, but
we skip some subtypes. In addition we rotate output.
rL  r;  r  r  r  r  r  r:  UserUnitro  r  r   r  r   r:  r  rb  r  rY  rq  r  N)r  r   re  r  r   r  rY  rT  rR  r;   r  r   rw  r   r
  r  rI  r  r  r  r  rG  r  r  r<  rO  rJ  r5  )rf  rg  	page_frompage_tor_  r)  copy_annotsrk  known_page_objspage_refr  rf  r  r  rI   r  r  r  r  r   r  s                        r)   re  re  ^  s    {9vVamm 	

O ((<H ""7A.I	y(6"2HV4DE C(),,h8JK>>>	1+=u?\?\]f]k]kmp?qr	 * ''8H3EF
,q5119hx>PRSTJ1X''7||5+<+<Q+?+?&&51<<,,a)1DE$$gx/?@@$$gx/@AA$$Whx.@AA""Ax'89""Ax}566	J..9I9I69RTUV$$j%8# ( |	8H+=vF



3C 
7S1r+   c                 6    [        U 5      u  p[        SSX5      $ )zReturn a Rect for the paper size indicated in string 's'. Must conform to the argument of method 'PaperSize', which will be invoked.
    r  )
paper_sizer*  )r  r  r0  s      r)   
paper_rectr  <_  s     qMMES%((r+   c                     U R                  5       nSnUR                  S5      (       a  SnUSS nUR                  S5      (       a  USS n[        5       R                  US5      nUS:X  a  U$ US   US	   4$ )
zReturn a tuple (width, height) for a given paper format string.

Notes:
    'A4-L' will return (842, 595), the values for A4 landscape.
    Suffix '-P' and no suffix return the portrait tuple.
r  z-lrQ  Nr  z-pr	  r   r   )r  r  paper_sizesr<   )r  r  r  r   s       r)   r  r  C_  s     779DA}}TCRy}}TCRy			4	*BCx	qE2a5>r+   c                      0 SS_SS_SS_SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_0 S#S$_S%S&_S'S(_S)S*_S+S,_S-S._S/S0_S1S2_S3S4_S5S6_S7S8_S9S:_S;S<_S=S>_S?S@_SASB_SCSD_ESESFSGSHSISJSKSLSMSNSO.
E$ )Pa  Known paper formats @ 72 dpi as a dictionary. Key is the format string
like "a4" for ISO-A4. Value is the tuple (width, height).

Information taken from the following web sites:
www.din-formate.de
www.din-formate.info/amerikanische-formate.html
www.directtools.de/wissen/normen/iso.htm
a0)P	  i*  a1)  r  a10)r  r  a2)  r  a3)r  r  a4)r  r  a5)  r  a6)*  r  a7)r  r  a8)   r  a9)r  r  b0)  i  b1)  r  b10)r  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  r;  )r"  r  b8)r  r"  b9)r  r  c0)'
  i]  c1)-  r  c10)r  r  c2)  r  c3)  r  c4)  r  c5)  r  c6)C  r  c7)r  r  c8)r  r  c9)r  r  zcard-4x6)i   i  )r  i  )i)  i  )i
  i  )i  r^  )r_  i  )r^  i  )r^  i  )r^  r_  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar.   r.   r+   r)   r  r  W_  s   -
l-
l-
 	y-
 	l	-

 	k-
 	j-
 	j-
 	j-
 	j-
 	j-
 	j-
 	l-
 	l-
 	y-
 	l-
  	l!-
" 	k#-
$ 	j%-
& 	j'-
( 	j)-
* 	j+-
, 	j--
. 	l/-
0 	l1-
2 	y3-
4 	l5-
6 	k7-
8 	j9-
: 	j;-
< 	j=-
> 	j?-
@ 	jA-
B 	jC-
D 	JE-
F  $Y-
 -
r+   c                 .    [         R                  " X5      $ r-   )r   r  )r0  rb  s     r)   r  r  _  s    $$S11r+   c                      S5       e)z@
Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
zuse mupdf.pdf_debug_obj() ?)r   r:  r  rR  r  pdfobj_stringr]	  array_get_boolr  r  r  r
  pdf_is_embedded_fileembedded_file_namer	  rv  r  pdf_is_jpx_imager  r  r  rw  r  r   rx  r\  )r  r
  rK   rQ  rf  oor  r   s           r)   r%  r%  _  s     ,++1r+   c                     UR                   S   (       d  gU R                  nU R                  5       nU Vs/ s HS  nUS   UR                  :X  d  M  US   R	                  S5      (       d  M3  US   R	                  S5      (       d  MN  US   PMU     nnU/ :X  a  g[        U5      n[        [        UR                  S	5      S
-  5      5      nU H:  n[        R                  X'U5      (       a  M   [        SUR                  U4-  5        M<     gs  snf )a  Repair character spacing for mono fonts.

Notes:
    Some mono-spaced fonts are displayed with a too large character
    distance, e.g. "a b c" instead of "abc". This utility adds an entry
    "/W[0 65535 w]" to the descendent font(s) of font. The float w is
    taken to be the width of 0x20 (space).
    This should enforce viewers to use 'w' as the character width.

Args:
    page: pymupdf.Page object.
    font: pymupdf.Font object.
r  Nr   ro  r  r   r|  r   r  i  z$Cannot set width for '%s' in xref %i)r  r   rX  r   r7   r  r8   r  r   r  set_font_widthr'   )r   r  r0  rD  r  r  r  r  s           r)   r  r  _  s     ::f
++C~~H AaDDII 	"#A$//#"6 	;<Q4??:;V 	! 
 
 {JEt))"-467E##Cu556$))T9JJK s   DD,D	Dsrgbc                 F    [        U 5      nUS   S-  US   S-  US   S-  4$ )a   Convert sRGB color code to a PDF color triple.

There is **no error checking** for performance reasons!

Args:
    srgb: (int) RRGGBB (red, green, blue), each color in range(255).
Returns:
    Tuple (red, green, blue) each item in interval 0 <= item <= 1.
r   g     o@r   r   )rl  )r-  r  s     r)   sRGB_to_pdfr/  _  s3     	DAQ4%<1qte|33r+   c                 L    U S-  n U S-	  nXS-  -
  S-	  nXS-  -
  US-  -
  nXU4$ )a-  Convert sRGB color code to an RGB color triple.

There is **no error checking** for performance reasons!

Args:
    srgb: (int) SSRRGGBB (red, green, blue), each color in range(255).
    With MuPDF < 1.26, `s` is always 0.
Returns:
    Tuple (red, green, blue) each item in interval 0 <= item <= 255.
i r$  r   r.   )r-  r#  ro  r  s       r)   rl  rl  _  sG     	HD
A	b	aARAF#A!9r+   c                     U(       a  [         R                  " U5      OSn[         R                  " U 5      n[        SUS5       H3  n[         R                  " [         R                  " X5      5      U:X  d  M3    g   g)Nr   r   r   )r   r  r  rR  r  )r  rv  rI   str_rf  s        r)   rs  rs  `  s^    ,6Z(AA##Q'D1a^##U%8%8*%HITQ  r+   c                    SnSnUnSnUR                   (       Ga  [        XX#U5      n	[        XrX45      (       GdA  U	S:X  a  [        R                  " U[        S5      5      n
U
R                   (       d2  UR                   (       a   [        R                  " U[        S5      5        OtUR                   (       aC  [        R                  " U[        S5      U
5        [        R                  " U
[        S5      U5        O [        R                  " U
[        S5      5        U
nO[        R                  " U[        S5      5        [        R                  " U[        S5      5        [        R                  " U[        S5      5      nOAU(       a  UR                   (       d  UnUn[        R                  " U[        S5      5      nUS-  nUR                   (       a  GM  XeU4$ )z
Returns (count, first, prev).
Nr   r  Prevr  r  r   )r   strip_outlinesrw  r   r
  r  rG  rT  )r0  outlinesru  ru  rv  r  r  currentr  r  r\  s              r)   strip_outliner8  `  sj    EEGD



 C*
SW2BOOQw ))'8F3CD**4&1AB__&&tXf-=tD&&tXf-=tD&&tXf-=> ""7HV,<=""7HSM:,,Whv6FG  0 0D(((62BCGQJE? 


B r+   c                    UR                   (       d  g[        R                  " U[        S5      5      nUR                   (       d  SnO[	        XX#U5      u  penUS:X  ab  [        R
                  " U[        S5      5        [        R
                  " U[        S5      5        [        R
                  " U[        S5      5        U$ [        R                  " [        R                  " U[        S5      5      5      n[        R                  " U[        S5      U5        [        R                  " U[        S5      W5        [        R                  " U[        S5      [        R                  " US:  a  UOU* 5      5        U$ )Nr   r  Lastr  )	r   r   r
  r  r8  rG  r  rT  rN  )	r0  r6  ru  ru  rv  r  r  r
  	old_counts	            r)   r5  r5  :`  s   x'):;E'JR\]4	Qw8Xg%678Xf%568Xg%67 I	 $$U%7%7(7BS%TU	8Xg%6>8Xf%5t<8Xg%68I8IPY\]P]"dfcf8ghIr+   r  c                 j    SSK n UR                  [        U 5      5      nU$ ! [         a    Sn U$ f = f)z-
Convenience function accessing unicodedata.
r   Nz.notdef)r  r   r%  r   )r  r  r   s      r)   rM  rM  V`  sB     B( K  Kr  c                     UR                   UR                   -
  nUR                  UR                  -
  n[        R                  " X0R                  -  X@R                   -  -   5      $ r-   r  r  s        r)   r  r  b`  r  r+   r.   single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsrD  r  concurrency_statsc       	            U
(       a  [         R                   " 5       nUS:X  ag  U(       a  U" U0 UD6  [        5       n[        U 5      nUc  [        [	        U5      5      nU H$  nX   nU" U/UQ70 UD6nUR                  U5        M&     GOSSKJn  Uc}  U
(       a  [         R                   " 5       n[        U 5       n[	        U5      n[        [        U5      5      nSSS5        U
(       a'  [         R                   " 5       W-
  n[        US S35        U
(       a  [         R                   " 5       nUS:X  a  UR                  U UUUUUUUU	U
5
      nO-US:X  a  UR                  U UUUUUUUU	U
5
      nO S	U< S
35       eU
(       a'  [         R                   " 5       W-
  n[        US S35        U
(       a'  [         R                   " 5       W-
  n[        US S35        U$ ! , (       d  f       GN= f)a  
Returns list of results from `pagefn()`, optionally using concurrency for
speed.

Args:
    path:
        Path of document.
    pagefn:
        Function to call for each page; is passed (page, *pagefn_args,
        **pagefn_kwargs). Return value is added to list that we return. If
        `method` is not 'single', must be a top-level function - nested
        functions don't work with concurrency.
    pagefn_args
    pagefn_kwargs:
        Additional args to pass to `pagefn`. Must be picklable.
    initfn:
        If true, called once in each worker process; is passed
        (*initfn_args, **initfn_kwargs).
    initfn_args
    initfn_kwargs:
        Args to pass to initfn. Must be picklable.
    pages:
        List of page numbers to process, or None to include all pages.
    method:
        'single'
            Do not use concurrency.
        'mp'
            Operate concurrently using Python's `multiprocessing` module.
        'fork'
             Operate concurrently using custom implementation with
             `os.fork()`. Does not work on Windows.
    concurrency:
        Number of worker processes to use when operating concurrently. If
        None, we use the number of available CPUs.
    _stats:
        Internal, may change or be removed. If true, we output simple
        timing diagnostics.

Note: We require a file path rather than a Document, because Document
instances do not work properly after a fork - internal file descriptor
offsets are shared between the parent and child processes.
r>  Nr   )_apply_pagesz.2fzs: count pages.r  forkzUnrecognised method=r   zs: work.z	s: total.)r}  r   r   rR  r;   ro   r`   rG  r'   _multiprocessing_fork)r	   ru  r?  r@  rA  rB  rC  rD  r  rD  rE  r
  rK   r   rz  r   r#  rG  r  	num_pagess                       r)   apply_pagesrL  h`  s   p YY[K1=1fD>=#h-(EC=Dt;k;];AJJqM  	#=IIK$8M	U9-.   IIK!Oqg_-.		AT>//!!C v$$!!C 1-fYa001		aA1S'"#IIK"qgY Ja  s   : G
G')
rD  r  rD  r  r  r  r  r  rJ  rE  c       
   
      X    [        UUUUUU	S9n[        U [        R                  UUUUU
S9$ )a  
Returns list of results from `Page.get_text()`, optionally using
concurrency for speed.

Args:
    path:
        Path of document.
    pages:
        List of page numbers to process, or None to include all pages.
    method:
        'single'
            Do not use concurrency.
        'mp'
            Operate concurrently using Python's `multiprocessing` module.
        'fork'
             Operate concurrently using custom implementation with
             `os.fork`. Does not work on Windows.
    concurrency:
        Number of worker processes to use when operating concurrently. If
        None, we use the number of available CPUs.
    option
    clip
    flags
    textpage
    sort
    delimiters:
        Passed to internal calls to `Page.get_text()`.
)r  r  r  r  r  rJ  )r@  rD  r  rD  rE  )r9   rL  r   r  )r	   rD  r  rD  r  r  r  r  r  rJ  rE  	args_dicts               r)   r  r  `  sI    X !I MM## r+   c                      \ rS rSrSrS r\S 5       r\S 5       r\S/S j5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS r\S 5       r\S 5       r\S0S j5       r\S1S j5       r\S1S j5       r\S 5       r\S/S j5       r \S 5       r!\S  5       r"\S1S! j5       r#\S" 5       r$\S# 5       r%\S0S$ j5       r&\S1S% j5       r'\S1S& j5       r(\S1S' j5       r)\S( 5       r*\S) 5       r+\S* 5       r,\S+ 5       r-\S1S, j5       r.S-r/\0" 5       r1S.r2g)2r  i*a  zM
We use @staticmethod to avoid the need to create an instance of this class.
c                     [        U [        R                  5      (       a  [        [	        U 5      5      $ [        [        R
                  " 5       5      $ r-   )rB   r   r   rz  r^  r{  r   s    r)   _derotate_matrixTOOLS._derotate_matrix/a  s6    dEMM**$%<T%BCC$U^^%566r+   c                    [        X5      n[        U R                  5      Ul        U R                  Ul        U R                  Ul        Xl        UR                  (       d  S Ul        UR                  (       d  S Ul        UR                  (       d  S Ul        UR                  (       d  S Ul	        UR                  (       d  S Ul
        UR                  (       d  S Ul        UR                  (       d  S Ul        U$ r-   )r  r*  r   r  r   r  r  rU  rV  rW  rX  rY  rZ  )r   r[  r  s      r)   rZ  TOOLS._fill_widget5a  s    &u55::&jj}} FM###'F ###'F ###'F !!!%F!!!%F"""&F
r+   c                 x    [        U R                  5      n [        U R                  5       5      n[	        U5      nU$ r-   )r   r   r  r  r"  )r   r$  r  s      r)   r  TOOLS._get_all_contentsMa  s/    DII&txxz*!3'r+   c                     [        U SS9n[        U5      n[        UR                  5       UR	                  5       XB5      nU$ )zDAdd bytes as a new /Contents object for a page, and return its xref.r   r  )r   r-  r  r0  r  )r   r  r  r  contbufr  s         r)   r.  TOOLS._insert_contentsTa  s9     ta0$W-!'++-Qr+   c                    U R                   S   nU R                  S   nU(       d  SnSR                  [        [        U5      5      S-   nU(       a  UnOU R                  S   nU(       d  SnSR                  [        [        U5      5      S-   nUn	Un
[        [        X5      5      nU) nX-  nX-  nS	U R                  s=::  a  S
:  a  O  OSnOSnXXXFX4$ )a+  Get common parameters for making annot line end symbols.

Returns:
    m: matrix that maps p1, p2 to points L, P on the x-axis
    im: its inverse
    L, P: transformed p1, p2
    w: line width
    scol: stroke color string
    fcol: fill color store_shrink
    opacity: opacity string (gs command)
r  r  r@  r   z RG
r   r  z rg
r   r   r  r`   )r  r  r  r  r   r~  r]  r\  )r   rC  rD  r^  r   scscolr  rc  np1np2r  r  rY  r  r\  s                   r)   _le_annot_parmsTOOLS._le_annot_parms]a  s     LL!\\(#BxxC%/Bf%BBxxC%/?3,-RGG!!GGaAT22r+   c                 P   [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a  UOUnUSU* S-  4-   U-  nUSUS-  4-   U-  nSUUR                  UR                  4-  nUSUR                  UR                  4-  -  nU[        U	5      S-   -  nUU
S-   -  nU$ )	zaMake stream commands for butt line end symbol. "lr" denotes left (False) or right point.
        r   r   r   r$  
q
%s%f %f m
%f %f l
r'  s
Q
r  r_  r   rb  rc  r   )r   rC  rD  r_  r^  r  r  rY  r  r   r\  rc  r\  r  rA  r,  r
  botr&  s                      r)   r  TOOLS._le_butta  s     /4.C.CEr.^+qQdC1IAAr"u:~#Aqt9}"7CEE355"99
kSUUCEEN**
ilV##
dXo	r+   c                    [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-
  OX~S-  S4-   n[        X5      U* U* X4-   nSU-   [         R	                  UR
                  U-  UR                  U-  UR                  U-  UR                  U-  5      -   nU[        U	5      S-   -  nUX-   S-   -  nU$ )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
              @r   r$  r   zq
r'  b
Q
)
r  r_  r   r*  _oval_stringr#  r'  r$  rJ  r   )r   rC  rD  r_  r^  r  r  rY  r  r   r\  rc  r\  r  rA  r,  r#  r&  s                     r)   r  TOOLS._le_circlea  s     /4.C.CEr.^+qQdC1IA2q	MQB$]J1"qb!'W_u11!$$)QTTBYr	STSWSWZ\S\]]
ilV##
dkH$$	r+   c                    [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-   OX~S-  S4-
  nU(       a  USU-  U* 4-   O
USU-  U* 4-   nU(       a
  USU-  U4-   O	USU-  U4-   nX-  nX&-  nX-  nSXR                  UR                  4-  nUSUR                  UR                  4-  -  nUSUR                  UR                  4-  -  nU[        U	5      S	-   -  nUX-   S
-   -  nU$ )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        ri  r   r$  r   r  r   rb  rc  r'  rj  re  r   rC  rD  r_  r^  r  r  rY  r  r   r\  rc  r\  r  rA  r  r&  s                    r)   r  TOOLS._le_closedarrowa  s"    /4.C.CEr.^+qQdC1I QB$]aR4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}


7DD"$$"77
kRTT244L((
kRTT244L((
ilV##
dkH$$	r+   c                 8   [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-
  OX~S-  S4-   n[        X5      U* U* X4-   nUR                  UR
                  UR                  -
  S-  -   U-  nSUUR                  UR                  4-  nUR                  UR                  UR                  -
  S-  -   U-  nUSUR                  UR                  4-  -  nUR                  UR                  UR                  -
  S-  -   U-  nUSUR                  UR                  4-  -  nUR                  UR
                  UR                  -
  S-  -   U-  nUSUR                  UR                  4-  -  nU[        U	5      S-   -  nUX-   S	-   -  nU$ )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        ri  r   r$  r   rF  q
%s%f %f m
rc  r'  rj  )r  r_  r   r*  r#  rJ  rb  rc  r'  r$  r   r   rC  rD  r_  r^  r  r  rY  r  r   r\  rc  r\  r  rA  r,  r#  r  r&  s                      r)   r  TOOLS._le_diamonda  s    /4.C.CEr.^+qQdC1IA2q	MQB$]J1"qb!'TTQTTADD[C''2-!##qss 33TTQTTADD[C''2-
kqssACCj((TTQTTADD[C''2-
kqssACCj((TTQTTADD[C''2-
kqssACCj((
ilV##
dkH$$	r+   c                    [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-   OX~S-  S4-
  nU(       a  USU-  U* 4-   O
USU-  U* 4-   nU(       a
  USU-  U4-   O	USU-  U4-   nX-  nX&-  nX-  nSXR                  UR                  4-  nUSUR                  UR                  4-  -  nUSUR                  UR                  4-  -  nU[        U	5      S	-   -  nUU
S
-   -  nU$ )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        ri  r   r$  r   r  r   rb  rc  r'  S
Q
re  rn  s                    r)   r  TOOLS._le_openarrowa  s    /4.C.CEr.^+qQdC1I QB$]aR4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}


7DD"$$"77
kRTT244L((
kRTT244L((
ilV##
dXo	r+   c                     [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a
  USU-  S4-
  O	USU-  S4-   nU(       a  USU-  U* 4-   O
USU-  U* 4-   nU(       a
  USU-  U4-   O	USU-  U4-   nX-  nX&-  nX-  nSXR                  UR                  4-  nUSUR                  UR                  4-  -  nUSUR                  UR                  4-  -  nU[        U	5      S-   -  nUX-   S	-   -  nU$ )
zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        ri  r   r   r   r  rb  rc  r'  rj  re  rn  s                    r)   r  TOOLS._le_rclosedarrowa  s&    /4.C.CEr.^+qQdC1IQ!A#q\Q!A#q\!R1Q3)^rRTA2J R1Q3(]bBqD!9n


7DD"$$"77
kRTT244L((
kRTT244L((
ilV##
dkH$$	r+   c                    [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-
  OX~S-  S4-   nU(       a  USU-  U* 4-   O
USU-  U* 4-   nU(       a
  USU-  U4-   O	USU-  U4-   nX-  nX&-  nX-  nSXR                  UR                  4-  nUSUR                  UR                  4-  -  nUSUR                  UR                  4-  -  nU[        U	5      S	-   -  nUX-   S
-   -  nU$ )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        ri  r   g      @r   r   r  rb  rc  r'  ru  re  rn  s                    r)   r  TOOLS._le_ropenarrowa  s"    /4.C.CEr.^+qQdC1I QB$]aR4)m!R1Q3)^rRTA2J R1Q3(]bBqD!9n


7DD"$$"77
kRTT244L((
kRTT244L((
ilV##
dkH$$	r+   c                    [         R                  XX$5      u  pVpxppS[        SU	5      -  S-  nU(       a  UOUn[        UR                  U-
  UR
                  SU	-  -
  UR                  U-   UR
                  SU	-  -   5      nUR                  U-  nUR                  U-  nSUUR                  UR
                  4-  nUSUR                  UR
                  4-  -  nU[        U	5      S-   -  nUU
S-   -  nU$ )	zbMake stream commands for slash line end symbol. "lr" denotes left (False) or right point.
        g(y?r   r  r   rb  rc  r'  rd  )	r  r_  r   r*  rb  rc  r#  r$  r   )r   rC  rD  r_  r^  r  r  rY  r  r   r\  rc  r\  rwr,  r#  r
  rf  r&  s                      r)   r  TOOLS._le_slashb  s     /4.C.CEr.^+qQdc!Qi#%Ar133Q;b!##A+>ddRiddRi7CEE355"99
kSUUCEEN**
ilV##
dXo	r+   c                 P   [         R                  XX$5      u  pVpxppSnU[        SU	5      -  nU(       a	  XS-  S4-
  OX~S-  S4-   n[        X5      U* U* X4-   nUR                  U-  nSUUR
                  UR                  4-  nUR                  U-  nUSUR
                  UR                  4-  -  nUR                  U-  nUSUR
                  UR                  4-  -  nUR                  U-  nUSUR
                  UR                  4-  -  nU[        U	5      S-   -  nUX-   S-   -  nU$ )	zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        ri  r   r$  r   rq  rc  r'  rj  )r  r_  r   r*  r#  rb  rc  r'  r$  rJ  r   rr  s                      r)   r  TOOLS._le_squareb  s0    /4.C.CEr.^+qQdC1IA2q	MQB$]J1"qb!'DD2I!##qss 33DD2I
kqssACCj((DD2I
kqssACCj((DD2I
kqssACCj((
ilV##
dkH$$	r+   c                    S nSnXU -
  S-  -   nXU -
  S-  -   nXU-
  S-  -   nX2U-
  S-  -   n	X`U-
  U-  -   n
XpU-
  U-  -   nXqU-
  U-  -   nXU-
  U-  -   nXU-
  U-  -   nXU	-
  U-  -   nXU	-
  U-  -   nXcU-
  U-  -   nSUR                   UR                  4-  nUU" XU5      -  nUU" XU5      -  nUU" XU	5      -  nUU" UUU5      -  nU$ )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                     SnX0R                   U R                  UR                   UR                  UR                   UR                  4-  $ )Nz%f %f %f %f %f %f c
r{  )r  r!  r#  r  s       r)   bezier"TOOLS._oval_string.<locals>.bezier1b  s5    'AQSS!##qssACC555r+   r  rF  z%f %f m
r{  )rC  rD  r  r  r  r  r  mor  muol1ol2or1or2ur1ur2ul1ul2r&  s                      r)   rk  TOOLS._oval_string-b  s7   	6 7c/!7c/!7c/!7c/!Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$BDD"$$<'
fSr""
fSr""
fSr""
fS#r""	r+   c                    [         (       a!  [        R                  " U R                  5      nOS nU" U 5      nU(       d  gSnSnSnUR	                  5       n[        U5       H  u  pxUS:X  a.  XgS-
     SS  n[        XgS-
     5      nS	=Xg'   =XgS-
  '   XgS-
  '   M9  US
:X  a  [        XgS-
     5      /nS	=Xg'   XgS-
  '   M]  US:X  a;  XgS-
  U  V	s/ s H  n	[        U	5      PM     nn	S	=Xg'   =XgS-
  '   =XgS-
  '   XgS-
  '   M  US:X  d  M  XgS-
  U  V	s/ s H  n	[        U	5      PM     nn	S	=Xg'   =XgS-
  '   =XgS-
  '   =XgS-
  '   XgS-
  '   M     XSU4nU$ s  sn	f s  sn	f )Nc                 &   U R                   n[        U[        R                  5      (       d   e[        R                  " U5      n[        R
                  " U5      n [        R                  " U[        S5      5      nUR                  (       dJ  [        R                  " U5      n[        R                  " U[        S5      [        S5      [        S5      5      n[        R                  " U5      nU$ ! [         a    [        (       a
  [        5          g f = f)Nr  r  r  )r   rB   r   r   r  r  r  r  r   r  r  r  rk   r  rz   )r   rF  this_annot_objr`  rP  r  r   s          r)   Tools__parse_da(TOOLS._parse_da.<locals>.Tools__parse_daPb  s    "ZZ
!*enn====!&!4!4j!A22NC77RVXB=="'"3"3C"8"00 ( 0 ( 4 ("
 #55b9F  ! ++0@s   BC. .DD)rn  r`   r   rA  r  r@  rn  r   r   r`   ro  rp  r   r  ro  )r  r   Tools_parse_dar   r:   rW  r  )
r   r  r  r  r0  re  rq  rf  rG   r  s
             r)   r  TOOLS._parse_daJb  s    ;&&

3C& "%(C iik ~GAt|q5z!"~ca%j)/111qSC!Hs{ca%j)+$&&qSt|),U16AuQx6:<<<qS<C!HsQ3xs{),U16AuQx6EGGGqSGC!HGsQ3x#c(# && % 
 7 7s   EEc                     U n[         R                  " U5      n[         R                  " U5      n[         R                  " X25        g r-   )r   r  r  pdf_field_reset)r   rF  r  r`  s       r)   r  TOOLS._reset_widgetb  s5    
,,Z8**>:c2r+   c                     U R                  SS9nUR                  (       d  [        [        R                  " 5       5      $ [        [        U5      5      $ r  )r  r   rz  r   r{  r  )r   r  s     r)   r   TOOLS._rotate_matrixb  s>    ..%.0!!$U^^%566 !6w!?@@r+   c                     [        X5        g r-   )r  )r   r[  s     r)   r  TOOLS._save_widgetb  s
     /r+   c                 >   [         (       a"  [        R                  " U R                  U5        g  U R                  n[	        U[
        R                  5      (       d   e[
        R                  " [
        R                  " U5      [        S5      U5        [
        R                  " [
        R                  " U5      [        S5      5        [
        R                  " [
        R                  " U5      [        S5      5        g ! [         a    [        (       a
  [        5          g f = f)Nr  r  r  )r  r   Tools_update_dar   rB   r   r   r  r  r  rG  rk   r  rz   )r   r   rF  s      r)   
_update_daTOOLS._update_dab  s    ;!!5::v6"ZZ
!*enn====..u/B/B:/NPXY]P^`fg""5#6#6z#BHTNS""5#6#6z#BHTNS   ''N,<s   C
C: :DDc                       [         S-  q [         $ r  )TOOLS_JM_UNIQUE_IDr.   r+   r)   r  TOOLS.gen_idb  s     	a!!r+   c                  .    [         R                  " 5         g)z
Empty the glyph cache.
N)r   fz_purge_glyph_cacher.   r+   r)   glyph_cache_emptyTOOLS.glyph_cache_emptyb  s    
 	""$r+   c                     [        X5      $ )z%
Metadata of an image binary stream.
)r  )r   r  s     r)   rc  TOOLS.image_profileb  s    
  33r+   Nc                 *    U b  [        U 5      q[        $ )z+
Set MuPDF error display to True or False.
)rw  r  r[  s    r)   mupdf_display_errorsTOOLS.mupdf_display_errorsb  s     >#'8 ##r+   c                 *    U b  [        U 5      q[        $ )z.
Set MuPDF warnings display to True or False.
)rw  rx  r  s    r)   mupdf_display_warningsTOOLS.mupdf_display_warningsb  s     >%)"X"%%r+   c                  "    [         R                  $ )z"Get version of MuPDF binary build.)r   
FZ_VERSIONr.   r+   r)   r  TOOLS.mupdf_versionb  s     r+   c                     [         R                  " 5         SR                  [        5      nU (       a  [        R                  5         U$ )z>
Get the MuPDF warnings/errors with optional reset (default).
r%   )r   fz_flush_warningsr  r  r  reset_mupdf_warnings)rP
  rK   s     r)   ry  TOOLS.mupdf_warningsb  s3     	!ii01&&(
r+   c                      [        5       qg r-   )r   r  r.   r+   r)   r  TOOLS.reset_mupdf_warningsb  s     #'&r+   c                 0    [         R                  " U 5        g)z
Set anti-aliasing level.
N)r   fz_set_aa_level)r   s    r)   set_aa_levelTOOLS.set_aa_levelb  s    
 	e$r+   c                 V    U c  [         $ [        U 5      S-   nUS:  a  SnU S S q [         $ )Nr   r  )r  r;   )r  r  s     r)   set_annot_stemTOOLS.set_annot_stemb  s:     <##4y1}"9D9r+   c                    [        U SS9nUR                  (       d  g[        R                  " X15      n[        R                  " U[        S5      5      n[        R                  " U5      (       a  [        R                  " U5      n[        U5       H  n[        R                  " XW5      n[        R                  " US5      n	[        R                  " U	[        R                  " S5      5        [        R                  " U	[        R                  " S5      5        [        R                  " U	[        R                  " U5      5        [        R                  " U[        S5      U	5        M     g)	Nr   r  Fr
  r   r  r
  T)r   r   r   r;  r
  r  r:  r  rR  r  rQ  r<  rN  rT  )
r0  r  r  r`  r  dfontsrI   rf  dfontwarrays
             r)   r,  TOOLS.set_font_widthb  s    sQ/~~$$S/##D(3D*EFf%%##F+A1X++F6,,S!4$$VU->->q-AB$$VU->->u-EF$$VU->->u-EF""5(3-@  r+   c                 0    [         R                  " U 5        g)z&
Set the graphics minimum line width.
N)r   fz_set_graphics_min_line_width)min_line_widths    r)   set_graphics_min_line_width!TOOLS.set_graphics_min_line_widthc  s    
 	,,^<r+   c                     U (       a<  [         R                  (       a  [         R                  " 5         g[        S[        5        g[         R                  (       a  [         R
                  " 5         gg)z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)r   r  fz_enable_iccr  rp	  fz_disable_iccr  s    r)   set_iccTOOLS.set_iccc  sB     ""##%67GH    " !r+   c                 P    U b  [        U 5      [        l        [        R                  $ )z!Set / unset MuPDF device caching.)rw  rs  r   r  s    r)   set_low_memoryTOOLS.set_low_memoryc  s!     >)-bH&)))r+   c                     U bC  [        U 5      [        l        [        (       a$  [        R
                  " [        R                  5        [        R                  $ )z Set / unset small glyph heights.)rw  rs  r   r  r   set_small_glyph_heightsr  s    r)   r  TOOLS.set_small_glyph_heightsc  s:     >+/8H({--h.J.JK+++r+   c                     U bC  [        U 5      [        l        [        (       a$  [        R
                  " [        R                  5        [        R                  $ )z;
Set / unset returning fontnames with their subset prefix.
)rw  rs  r   r  r   set_subset_fontnamesr  s    r)   r  TOOLS.set_subset_fontnames&c  s:    
 >(,RH%{**8+D+DE(((r+   c                      [        [        R                  " 5       [        R                  " 5       [        R                  " 5       S9$ )z
Show anti-aliasing values.
)rX  r   graphics_min_line_width)r9   r   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr.   r+   r)   show_aa_levelTOOLS.show_aa_level1c  s5    
  557--/*/*J*J*L 	r+   c                      g)z
MuPDF store size limit.
Nr.   r.   r+   r)   store_maxsizeTOOLS.store_maxsize<c       r+   c                 |    U S:  a  [         R                  " 5         gU S:  a  [         R                  " SU -
  5        gg)z'
Free 'percent' of current store size.
r	  r   N)r   fz_empty_storefz_shrink_store)percents    r)   r	  TOOLS.store_shrinkDc  s8    
 c>  "Q;!!3=1 r+   c                      g)z
MuPDF current store size.
Nr.   r.   r+   r)   
store_sizeTOOLS.store_sizePc  r  r+   c                     U bC  [        U 5      [        l        [        (       a$  [        R
                  " [        R                  5        [        R                  $ )z1
Set ascender / descender corrections on or off.
)rw  rs  r   r  r   set_skip_quad_correctionsr  s    r)   unset_quad_correctionsTOOLS.unset_quad_correctionsXc  s:    
 >-1"XH*{//0N0NO---r+   r+  r.   ro  rn  r-   )3r1   r2   r3   r4   r  rQ  rx  rZ  r  r.  r_  r  r  r  r  r  r  r  r  r  rk  r  r  r   r  r  r  r  rc  r  r  r  ry  r  r  r  r,  r  r  r  r  r  r  r  r	  r  r  r  r  fitz_configr5   r.   r+   r)   r  r  *a  s1   7  .     #3 #3J      &  *  &  &  &    *  8 4 4l 3 3 A A 0 0 " "
 % % 4 4 $ $ & &     	 	 ) ) % %      " = = # # * * , , ) )     2 2   . .  "Kr+   r  c                      [         R                  " 5         [         R                  " S 5        [         R                  " S 5        g r-   )r   r  fz_set_warning_callbackfz_set_error_callbackr.   r+   r)   _atexitr  c  s*    		!!$'	%r+   	_wxcolorsr  c                      [         $ )z}
Returns dict mapping from name to (red, green, blue).
    name: lower-case name.
    red, green, blue: float in range 0..1.
)pdfcolorr.   r+   r)   colors_pdf_dictr  c  s	     Or+   c                      [         $ )z}
Returns list of (name, red, green, blue) tuples:
    name: upper-case name.
    red, green, blue: integers in range 0..255.
r  r.   r+   r)   colors_wx_listr  c  s
     r+   c                    SSK n[        S[        < 35        [        R                  R                  [         S35      nU S3nUR                  5       S:X  a  U S3nOUn[        S5        [        S	U< 35        [        S
U< 35        [        R                  R                  U5      (       d   SU< S35       e[        R                  R                  U5      (       d   SU< S35       eUR                  5       S:w  GaE  U (       Ga=  [        SU< S[         S35        [        R                  S5      SS nSR                  U5      nSU S3n[        SU< S35        [        R                  " U5       H  n[        R                  " Xg5      nU(       d  M"  U SUR                  S5       3n	[        R                  R                  U	5      (       d$  [        R                  R!                  U	5      (       a&  [        SU	< S35        [        R"                  " U	5        [        SU	 SU 35        [        R$                  " Xy5        M     X44$ )a  
Allows PyMuPDF installation to be used to compile and link programmes that
use the MuPDF C/C++ API.

Args:
    make_links:
        If true, then on non-windows we also create softlinks to any shared
        libraries that are supplied with a version suffix; this allows them
        to be used in a link command.

        For example we create links such as:

        site-packages/pymupdf/
            libmupdf.so -> libmupdf.so.26.7
            libmupdfcpp.so -> libmupdfcpp.so.26.7

Returns: (mupdf_include, mupdf_lib).
    mupdf_include:
        Path of MuPDF include directory within PyMuPDF install.
    mupdf_lib
        Path of MuPDF library directory within PyMuPDF install.
r   Nzmupdf_version=z/..z/mupdf-devel/includeWindowsz/mupdf-devel/libzWithin installed PyMuPDF:z    mupdf_include=z    mupdf_lib=zNot a directory: mupdf_include=r   zNot a directory: mupdf_lib=zCreating symlinks in mupdf_lib=z for MuPDF-z .so files.r   r   z[.]z^(lib[^.]+[.]so)[.]$zmupdf_lib_regex=rQ	  zRemoving existing link pfrom=zCreating symlink: z -> )rN  r'   r  rh   r	   normpath__file__systemr  r:   r  r  r3  r  r4  islinkr  r  symlink)

make_linksrN  r  mupdf_include	mupdf_libregex_suffixmupdf_lib_regexleafr  pfroms
             r)   _mupdf_develr  c  s   . >=

H:S)*Ac-.MI%c)*	 	
#%
} /yl77==''N+K]<LA)NN'77==##F'CA%FF#I%* 	.I<{=/UV$**3/!4zz,//~Q? "#JJy)D/Aq$+Qqwwqzl3 77>>%((BGGNN5,A,A8%;<IIe$(tD6:;

4' * ##r+   )r
  )find_tablesc                       \ rS rSrSrg)FitzDeprecationi
d  r.   NrX  r.   r+   r)   r  r  
d  s    r+   r  c                     [         R                  " S[        S9  SS jn U [         l        SS jnU" [        SS5        U" [        S5        U" [        SS	5        U" [        S
5        U" [        S5        U" [        SS5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        SS5        U" [
        S5        U" [
        SS5        U" [        S5        U" [        S5        U" [        SS 5        U" [        S!5        U" [        S"5        U" [        S#S$5        U" [        S%S&5        U" [        S'S(5        U" [        S)S*5        U" [        S+S,5        U" [        S-S.5        U" [        S/S05        U" [        S1S25        U" [        S35        U" [        S45        U" [        S55        U" [        S65        U" [        S75        U" [        S8S95        U" [        S:S;5        U" [        S<S=5        U" [        S>5        U" [        S?5        U" [        S@SA5        U" [        SBSC5        U" [        SDSE5        U" [        SF5        U" [        SG5        U" [        SHSI5        U" [        SJ5        U" [        SKSL5        U" [        SMSN5        U" [        SO5        U" [        SP5        U" [        SQ5        U" [        SR5        U" [        SS5        U" [        ST5        U" [        SU5        U" [        SV5        U" [        SW5        U" [        SX5        U" [        SYSZ5        U" [        S[5        U" [        S\S]5        U" [        S^S_5        U" [        S`Sa5        U" [        Sb5        U" [        Sc5        U" [        Sd5        U" [        Se5        U" [        SfSg5        U" [        Sh5        U" [        Si5        U" [        Sj5        U" [        SkSl5        U" [        Sm5        U" [        Sn5        U" [        So5        U" [        Sp5        U" [        SqSr5        U" [        Ss5        U" [        SsSt5        U" [        Su5        U" [        Sv5        U" [        Sw5        U" [        Sx5        U" [        Sy5        U" [        S5        U" [        S5        U" [        Sz5        U" [        S{S|5        U" [        S}S~5        U" [        SS5        U" [        SS5        U" S SS5        U" S SS5        U" S S5        U" S SS5        U" S SS5        U" S SS5        U" S SS5        U" S S5        U" S S5        U" [        Sy5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        S5        U" [        SS5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        SS5        U" [        S
5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        SS5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        SS5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        S5        U" [        SS5        U" [        SS5        U" [        SS5        U" [        SS5        U" [        SS5        U" [        S5        U" [        SS5        U" [        S5        U" [        S5        U" [        S5        U" [        S5        U" [        SS5        U" [        SS5        U" [        SS5        U" [        S5        U" [        Sw5        U" [        S5        U" [        Ss5        U" [        SsSt5        U" [        Su5        U" [        Sv5        U" [        Sw5        U" [        Sx5        U" [        S5        U" [        S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        U" [         S5        g (   Noncecategoryc                     [         R                  " XX#US9nUR                  S5      nUS:  a  [        U5        g XgS  R	                  5       S   SS  n[        U5        g )N)rs   r  r   ro  )warningsformatwarningr   r'   r  )r   catrj   rl   re   rs   r   r  s           r)   showthis!restore_aliases.<locals>.showthisd  s[    %%ctLII'(q5IBx""$Q'+D	r+   c                   ^ ^^^ T c  [         R                  [           m T(       d:  SmSnT H0  nUS:X  a  SnM  U(       a  TUR                  5       -  mSnM+  TU-  mM2     [	        T T5      m[	        T TS5      (       a   ST  ST 35       e[        T5      (       a.  U UUU4S jn[        T TU5        S	T S
TR                   3Ul        g[        T TT5        g)ai  
Adds an alias for a class_ or module item clled <class_>.<new>.

class_:
    Class/module to modify; use None for the current module.
new_name:
    String name of existing item, e.g. name of method.
legacy_name:
    Name of legacy object to create in <class_>. If None, we generate
    from <item> by removing underscores and capitalising the next
    letter.
Nr`   Fr9  Tzclass z already has c            	      \   > [         R                  " ST< ST ST S3[        S9  T" U 0 UD6$ )Nz"legacy_name=z" removed from z after v1.19.0 - use "z".r  )r  r  r  )r  r  class_legacy_namenew_name
new_objects     r)   deprecated_function<restore_aliases.<locals>._alias.<locals>.deprecated_function8d  s@    (K>@VW_V``bc!0 "D3F33r+   z;*** Deprecated and removed in version after v1.19.0 - use "z". ***
)r  modulesr1   rr
  r   r  r]  r  )r  r  r  capitalise_nextr  r  r  s   ```   @r)   _aliasrestore_aliases.<locals>._aliasd  s     >[[*FK#O8&*O$1779,K&+O1$K  fh/
FK66c&VaUb8cc6Z  4 4 V[*=>QRZQ[[c!))*,  '
 V[*5r+   r  fileGetr  r  soundGetr  r  r#  getTextPagerP  r  setBlendModer  r  r  r  r  r  r  setOCr  r  rR  fileUpdrv  rw  r  convertToPDFr  r  r  deletePageRanger  embeddedFileAddr  embeddedFileCountr  embeddedFileDelr  embeddedFileGetr  embeddedFileInfor  embeddedFileNamesr  embeddedFileUpdr  r  r  r  r0  rR  getOCGsri  getPageFontListrm  getPageImageListr}  r  r  getPageXObjectListr  getSigFlagsr  getToCr  r  r  	insertPDFr  ru  	isFormPDFr  isPDFr  r  r&	  r  rG	  rW	  r  r  rs	  ru  r}	  pageCropBoxr  rI  
PDFCatalogr  
PDFTrailerr	  previousLocationr  ra
  r  rO
  r
  setToCr
  rK  rU
  rp  isStreamr[  rJ  rT
  rq  r  metadataXMLrO  getRectArear*  r+  rv  ru  r  r  r  	preRotater  preScaler  preShearr  preTranslater  	getPDFnowr  	getPDFstrrG  getTextlengthrc  ImagePropertiesr  	PaperRectr  	PaperSizer  r  r@  r  r  r  r  r  r	  r  r  r  r  r  r!  r$  r(  r+  r/  r2  r  r|	  r  r  CropBoxPositionr  rQ
  r  rt  r  r  r  r  r  r  r  rR  r  r  r  r  r  r  rS
  r  getDisplayListr  rX  getFontListre  r  getImageListr  rw  getSVGimager  r  r  r  r0  r  rT  r~  
_isWrappedr>  r  r6  r  r  MediaBoxSizerQ  r  rx  r`
  r  
setCropBoxr/  setMediaBoxr  r  showPDFpagers  r<  r  rH  r  r$  
copyPixmapr  r  invertIRectr  pillowWriter  
pillowDatar  
writeImagewritePNGr3  r  setResolutionr<  r?  rS  r  getImageData
getPNGData
getPNGdatarX  r  r  r
  r-   )r  filterwarningsr  showwarningr   rX  r   r]  rb  r~  r  r   r  r  r*  rG  r  )r  r#  s     r)   restore_aliasesre  d  s	   Vo> $H)6V E:I6
E< 
E;J7
E:
E=!
E>M:
E;
E?N;
E< 
E< 
E;
E:
E?#
E:
E8W%
E=!
E:
E=I6
K&
KM:
Ho&
H*+
H&N;
Hk"
Hm$
Hn,=>
Hm,=>
Ho,?@
Hm,=>
Hm,=>
Hn,>?
Ho,?@
Hm,=>
Hn%
Ho&
Ho&
Ho&
H'(
HjI6
H&,=>
H',>?
H'(
Ho&
H),@A
HnM:
Hi*
H()
Hm$
HlK8
Hj!
HmK8
Hh(
Ho&
Hm$
Ho&
Hk"
Ho&
Hk"
Hl#
Hj!
Ho&
Hl#
HnM:
Hk"
HmL9
HmL9
Ho,>?
Hn%
H'(
Hn%
Hn%
Hi*
H()
Ho&
Ho&
H&J7
Hm$
Hm$
Hm$
H'(
H)M:
E:
E:M:
E?#
E>"
E:
E=!
D- 
D,
D,
F$%
FKK8
FJJ7
FJJ7
FNN;
D-K8
D-K8
D#$
D#O<
D/,=>
D,K8
D,K8
D- 
D.!
G]#
GY
D#$
D$%
D"#
D&'
D'(
D/"
D"#
D%&
D&'
D"#
D$%
D&'
D#$
D'(
D"#
D'(
D,
D"#
D)I6
D$,=>
D.!
D- 
D/"
D%&
D- 
D- 
D,
D+
D+
D/"
D+
D+
D- 
D/"
D- 
D- 
D,
D.!
D.!
D#,<=
D.!
D+M:
D"#
D,N;
D+
D,
D/M:
D*
D#$
D"#
D- 
D.M:
D- 
D.!
D- 
D- 
D"#
D,L9
D,
D,
D*J7
D/N;
D+
D/"
D#$
D,
D-L9
D.M:
D.!
D/M:
D)*
D- 
D/"
D,
FL!
FFL9
FL!
FNM:
FJM:
FML9
FFL9
FFJ7
FK 
FIO<
FL!
FK 
FJ
FK 
FIN;
FIL9
FIL9
D+
D*
D"#
D*
D*M:
D/"
D.!
D*
D- 
J'
J%
E=!
E=!
E< 
E;
E;
E?#
E;
E;
E=!
E?#
E=!
E=!
E#$r+   zPyMuPDF z : Python bindings for the MuPDF z* library (rebased implementation).
Python z running on r8  l        z-bit).
)r`   r   r  r%  )r   r   r   r   r   N)strictr-   )r  r  r   )ru  )r   r   r   r   rs  Nrp  )r  r   r   )r   r   r  r  rs  N(  r  atexitr  r  rf   r=   r  rh   r  rP  r3  r
  r  r  r}  r  r  r  r  r`   r   importlib.utilr   rL   r   r<   rM  r[   r^   r   rQ   rT   rR   rV   rX   r\   r_   r'   rv   rz   r  r  r%  r  r   r   r  r  r   rs  r   r  Callable__annotations__r   r   r   r   r   	machinerySourceFileLoaderload_moduler=  r>  r   rk   r?   r   reinit_singlethreadedr   _buildr   r   r   r   r   r   r   r   r  r  pymupdf_dater   r:   rL  FZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHr  VersionFitzVersionBindVersionDater   format_gr  r  r  r  r  r  r9   r  r  ru  r  r8   r  Sequencerv  r   rt  r   r"  r   r   r   r   r   r   r   r   r   r  r   rz  r  r+  rG  rX  FzDocument_insert_pdfr  r   r>   r  r  r  rb  r~  r  r|  r  rY  r  r  r  r  r  r*  r  r  r  rG  r]  r!  r1   _selfr  rF   r=  _valuer7   r]  
getmembersPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCEUCDN_EAST_ASIAN_HPDF_TX_FIELD_IS_MULTILINEUCDN_SCRIPT_ADLAMr  AnyTypeBase14_fontnamesr  r  r  r  r  rr  rs  r  r  r  rx  FZ_RECOMPRESS_NEVERFZ_RECOMPRESS_SAMEFZ_RECOMPRESS_LOSSLESSr	  FZ_RECOMPRESS_J2Kr	  r	  FZ_SUBSAMPLE_BICUBIC	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFr
  r  r  r  r7  r  r5  r6  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr  r   STAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_Draftr  r  r  r  TEXT_FONT_SUPERSCRIPTr  r  r  r  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLFZ_STEXT_PRESERVE_LIGATURESr]
  FZ_STEXT_PRESERVE_WHITESPACEr^
  FZ_STEXT_PRESERVE_IMAGESr  FZ_STEXT_INHIBIT_SPACESTEXT_INHIBIT_SPACESFZ_STEXT_DEHYPHENATEr\
  FZ_STEXT_PRESERVE_SPANSTEXT_PRESERVE_SPANSFZ_STEXT_MEDIABOX_CLIPr_
  $FZ_STEXT_USE_CID_FOR_UNKNOWN_UNICODE TEXT_USE_CID_FOR_UNKNOWN_UNICODEFZ_STEXT_COLLECT_STRUCTURETEXT_COLLECT_STRUCTUREFZ_STEXT_ACCURATE_BBOXESTEXT_ACCURATE_BBOXESFZ_STEXT_COLLECT_VECTORSTEXT_COLLECT_VECTORSFZ_STEXT_IGNORE_ACTUALTEXTTEXT_IGNORE_ACTUALTEXTFZ_STEXT_SEGMENTTEXT_SEGMENTFZ_STEXT_PARAGRAPH_BREAKTEXT_PARAGRAPH_BREAKFZ_STEXT_TABLE_HUNTTEXT_TABLE_HUNTFZ_STEXT_COLLECT_STYLESTEXT_COLLECT_STYLES$FZ_STEXT_USE_GID_FOR_UNKNOWN_UNICODE TEXT_USE_GID_FOR_UNKNOWN_UNICODEr  TEXT_CLIP_RECTFZ_STEXT_ACCURATE_ASCENDERSTEXT_ACCURATE_ASCENDERSFZ_STEXT_ACCURATE_SIDE_BEARINGSTEXT_ACCURATE_SIDE_BEARINGSTEXT_STEXT_SEGMENTTEXT_CID_FOR_UNKNOWN_UNICODETEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICr  r2  r.  r0  PDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLightr  r   r  r  r  r  r  r  r  dictkey_ascr7  r  rY  r
  r:  r3  r  r  r0  r3  r  
dictkey_dar  r  dictkey_descrR  dictkey_effectr  r  r  r6  r8  r9  dictkey_glyphr  r6  r  ri  r  rS  r  r4  r1  r  r5  r  r  r  r;  r  r  r5  r	  r2  r  r  r  rQ  r  r  r	  r  rU  rV  r$  r  ry  r  r  r)  r(  rN  rH  r  r;  rS  rU  rY  rX  r?  r`  r  r  r"  r  r-  ri  r  r  rI  r%  r  r  r  r  r  r  r  r  r  rI  rX  r  r  r  r  r  rA  r  r  rB  r  rO  r{	  r  r^  r  r%
  r  r&
  rm  r$  r0  rC  r  r  r  rG  rH  r:  rG  r  rM  r   rY  r  r  r5  rv	  r:  r  r  r  rn  r  r  r  r  r4  r  r  r]  r  r  r  r  r\  r  r  r  rK  r,  r  r0  r  rN  rP  r  r  r  r  r  ry  r{  r  r  r  r	  r  ry  r  r  r  ra  r  r  r  r  rz  r4  r  ro  r  r  r  r  rU  r  ra  r  r  r  r  rs
  r  r  r  ry  r  r  r/  r  r  r
  r  r,  r  r  r.  r@  MSG_BAD_DOCUMENTMSG_BAD_FILETYPEMSG_BAD_LOCATIONrn  rM  r  ro	  r  r
  r  rH  r  MSG_COLOR_COUNT_FAILEDr  rk  r  r  rQ  rY  rb  r  r  rp	  r  rC  r  r  r&  r  rw  r  rn  r  r  r  rD  r  r*  rI  r  r  r9  r  r  r  r_  rG  rc  ro  rr  rv  ry  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  FzPathWalker2r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  PdfFilterOptions2r  	FzDevice2r}  	FzOutput2r  r  r  r  rf  rh  r  r  ro  rq  rw  rt  r  r  r  r  r  r  r*  r  r  r  r  r  r~  r  rY  r  rS  r  r  rV  r  r  ra  r  r]  r{  r  re  r  r  r  r  r%  r  r/  rl  rs  r8  r5  r  r  r  r  rM  r  rL  r  r  r  r  r  registerr  r  r   r#  ro  r  r  r  r  r
  recover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadtabler  DeprecationWarningr  re  __version__r  rN  maxsize)rf  s   0r)   <module>r     sI       	  	   	  
         sl 2::>>2C#DcjjY rzz~~m<cjjQ
 v ! > <..2  **\9CFBC $  #$@!D  /6' ' :04V__V__- 4  ". jjnnm,H:_[O3X	YZH:^BJJ|$<#=	>?b)):: +- 	 !!''E u-..##%	! # & $ # # )   &    -2E2Ec2JK2JQgaj2JKL u55u7M7MuOeOeff U
C/B.D  ES%J`J`bgbxbxz  {Q  {Q  JR  IT  	UUf
 M4
0
 ! 2$ 0""J
 ??:&
//$
??5!	c4i	 		)		
		4$4.00*  	
W< W<t*c' c'Lb	 b	J BO O.+ +Z "'"="=xR xRte )& )&X|" |"~ t tno od:V :. e, e,NQ Qh
 O Of ;|i: i:Xuq' q'h 
x xveX eXP` `F	[ [|hB hBVZ Zz
a aHt tt KK!E"^^113ME6 899##$455 E5&1 42 )*--).)))* ++), 00	)1
 33)4 ++),$ ""a''' %(G(GGGG 7 7777uf
** " 	A!"OAGGI 
% - * 1 # + ( / ' & ( , " ( 
      // -- 55 -- ++ ++ 11 11 
 	

 		

       
       
           ;;  == 55 33 -- 33 11 #(#M#M  99 55 55 99 %%'! 99//O77','Q'Q$--N#??"'"G"G " ? 
!"
"#  +	+ 
!"
"#  +	+  
!"
"#  	
 ++ # 
"#
  +	+  
!"
"#  	
 ++ 
!"
"#  	
 ++ 
!"
"#  +	+ 
!"
"#  +	+      


        
      DY le}Zg

	L 		 		] 	 	6	G		G	
 	! % 
 ! 
 ::*//1!&&(,7NQ) )A
HA
N	"!3H'UT<
U T:6$
CLI IE II IU I/*2 %P.3=l
2>&&<
Vr84n$%P .0j/d(&"JN0I $ *.6(("J% %c %P7%++ 7ELL 7Z] 7t(02/ ;|4)n,"^B)X B
 >. 
)XD$N<KZ7:0\(\|(%T
H*.+B>:3l? D**6
*,.
2	*Z.(6VBB"(	"*Z,6.H"0FR&#R<8#:L-`3<'B*"D8 20 F( & )? ( %( 0 ! ! ' % %%#*!- / &$(.,  '  	P& PD C E x s t 	&** 	 		&** 	 	H6:: H
 
 

- 
- 
-.dE5$67 .C .C .$.
# 
# 
#2.b"3 "T5$-> ? " "Y\ "ad "J23 23 2jCSN %)TRVBB!B3:BIOBBJ'<# '< '< '<UX '<`e '<T'z 'd ',DNJ1X$N.bUp8NpU   pf!H4n*($
!
+Z +Z +F + u66 . .>$5?? $0$P/5?? P/f3%eoo 3%l3 3v 3l *6 c 

8S &f F F FYb Fmq FR  1(Y (C (# (T (VG8 #t$4 Q* Q*h  $$4D  Hf/$N,6 ">2D2N)# )$ )# % (6
p2/dL@4c 4e 4c e $)X,     ! 	c 	c 	1 ff J = =@|# |#@ 	!!"23	/(&    	 6MD!QeQsUAcE2HTZZ\ I$^  
 $55 #55 #55 #00#55    	( 	U%n  
;-?} M""1%&a(8(8(;'<LVX_b_j_jmr_rY[xzX{  |D	E A]  H LN  0"Z/J0j]  sM   AP& AP7AP< AAQ P&
AP4P3AP4P<AQQAQQ
AQQAQ