
    ]Wia                   T&   % S r SSKJ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\" \	R4                  R7                  S5      \R8                  S	9q\" \	R4                  R7                  S
5      \R8                  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SAS jr(S r)\*" \RV                  S-   \," S5      -   5      r-S r.S r/\/" SS5      r0\." SS5      r1 " S S5      r2\2" 5       r3Sr4S\5S'   Sq6S  r7S! r8\	R4                  R7                  S"5      r9\9b  \'" \: S#\9< S$35        \'" \: S%\	R4                  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S0KFJLrL  SS1KFJMrM  SS2KFJNrN  \@R                  rPSrQ\R" \PR                  S35       V s/ s H  n \E" U 5      PM     sn 5      rT\T\@R                  \@R                  \@R                  4:X  d0   S4\T< S5\@R                  \@R                  \@R                  4< 35       e\K\PS4rX\PrY\KrZSr[S6S7.S8 jr\\\r] \R                  r^\R                  \^   rd\R                  \e   rf\R                  \g   rh\R                  \jS4   rk\R                  \R                     rm\R                  \n   roS9rpS:rqS;rrS<rsS= rtGSBS> jruS? rvGSBS@ jrwSA rxSry " SB SC5      rz " SD SE5      r{ " SF SG5      r| " SH SI5      r} " SJ SK5      r~ " SL SM5      r\1(       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SCSc jr " Sd Se5      r " Sf Sg5      r " Sh Si5      r " Sj Sk5      r " Sl Sm5      r " Sn So5      r " Sp Sq5      r " Sr Ss5      r " St Su5      r " Sv Sw5      r \GR4                  \   r \@GR:                  GR=                  5        HB  u  rr\GRC                  Sx5      (       d  M  \GRC                  Sy5      (       a  M8  \" \\\5        MD     S\@GRH                  -  \@GRJ                  -  \@GRL                  -  \@GRN                  -  \@GRP                  -  \@GRR                  -  r\@GRV                  S:X  d   e\\@GRX                  :X  d   e\\@GRZ                  :X  d   eCCC\GR\                  rSzr0 r\ H  r\\\GRg                  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Rx                  r\@GRz                  r\@GR|                  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\@GR                  Gr\TS:  a  \@GR                  Gr\TS:  a  \@GR                   Gr\@GR$                  Gr\@GR(                  Gr\@GR,                  Gr\@GR0                  Gr\@GR4                  Gr\@GR8                  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r0SGr1SGr2SGr3SGr4SGr5SGr6SGr7SGr8SGr9SGr:SGr;SGr<SGr=SGr>SGr?SGr@SGrAS S S S S S S S.GrB " S SG\C5      GrD " S SG\C5      GrE " S SG\D5      GrF\}" G\/5      GrG\}" G\05      GrH\}" G\15      G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rwSGrxSGrySGrzSGr{SGr|SGr}SGr~ SSGKGJGrGJGr  G\GR                  " 5       GrG\GR	                  5        H  GrG\G\   G\G\   GS '   M     GCGCG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SDGS jGrGSDG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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SEGS? jGrGSFGS@ j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rSGqG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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r GSz 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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r0SGr1GSGr2GS Gr3GSGGS jGr4GSHGS jGr5GSIGS jGr6GSJGS jGr7GSKGS jGr8GSLGS jGr9GSMGS jGr:GSNGS jGr;GSOGS jGr<GSPGS jGr=GS Gr>GS Gr?GSQGS jGr@GS GrAGS GrBGS GrCGS GrDGSRGS jGrEGSSGS jGrFGSTGS jGrGSSSGS.         GSUGS jjGrHGSVGSWGS jjGrIGSXGS j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rYGS GrZGS Gr[GS Gr\GS Gr] " GS GS\@GR                  5      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 GrkGS GrlGS GrmGS GrnGSYGS jGro " GS GS\@GR                  5      Grq " GS GS\@GR                  5      Grs " GS GS\@GR                  5      GruGS Grv " GS GS\@GR                  5      Grw " GS GS\@GR                  5      GrxGSZGS[GS jjGryGS\GS jGrzGS]GS jGr{GS^GS jGr|GS Gr}GS Gr~GS GrGS GrGS GrGS_GS jGr " GS GSG\5      GrGS  GrGS`GSaGS jjGrGSbGS jGrGS GrGScGSdG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S GrGS GrGS GrGS GrGS GrGS GrGSeGS jGrGSfGS jGrGS GrGS GrGSAGS jGrGSgGS jGrGShGS jGrGShGS  jGrGS! GrGS" GrGS# GrSGrSGrSGrSGrGSiGS$ jGrGS% GrGS&\e" 5       SGS&\e" 5       SGS'SSGS(.	GS) jGrSGS'SSSSSSSSGS*.
GS+ jGr " GS, GS-5      Gr\9(       d(  \@GRb                  " G\5        \@GRd                  " G\5        GS. Gr\GRh                  " G\5        SGS/KGJGr  G\GRj                  Gr\e" 5       GrG\ H4  u  GrGrGrGrG\GS0-  G\GS0-  G\GS0-  4G\G\GRg                  5       '   M6     GS1 GrGS2 GrGSBGS3 jGrSGS4KGJGr  G\GR~                  GrG\GR                  GrG\GR                  GrG\GR                  GrG\GR                  GrSGS5GKGJGr  G\\Gl         " GS6 GS7G\5      GrGS8 Gr \ZGrGS9\Z GS:\Y GS;\GR                  S    S3\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Nf = fs  sn f ! \_ a    \`\a-  \b-  r^ GNf = f! G\ a    0 Gr GNf = f(j  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    )annotationsN   )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/banglarbhumi/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,   r7   )
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retrA   r7   s         ``           r*   _make_outputrM   .   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_itemsrS      s    r,   c                    U q g r.   )_g_log_items_active)actives    r*   _log_items_activerW      s     r,   c                     [         S S 2	 g r.   rQ   r/   r,   r*   _log_items_clearrY      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)rM   _g_out_messagerZ   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)rM   
_g_out_logrZ   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StopIterationrU   rR   appendr_   print)r   callerrh   frame_recordrk   linern   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   re   N)r\   rq   r   s    r*   messagerw   
  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)ry   s    r*   exception_infor{     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 )ri   environr=   r(   r   r   rK   rL   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   )ri   r   r=   r9   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)_GlobalsiI  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_correctionsr0   s    r*   __init___Globals.__init__J  s"    !"#$  !%&"r,   )r   r   r   r   Nr2   r3   r4   r5   r   r6   r/   r,   r*   r   r   I  s    'r,   r   z typing.Optional[typing.Callable]_get_layoutc                     Sq g)z:For users who never want to see the layout recommendation.FN)_recommend_layoutr/   r,   r*   no_recommend_layoutr   X  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   ri   getenv	importlibutil	find_specrq   )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)findr9   )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.
ra    r   )rC   listtuple	_format_gr   fz_format_double)valuer   rL   rK   s       r*   r   r     sW     %$''As
9Q((C  
%%c11r,   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)=)
rC   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   )
rC   r   r   r   r   r   r   r   
m_internalr   )r   requiredrL   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)=)rC   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   )	rC   r   r   r   r   r   pdf_page_from_fz_pager   r   )r   r   rL   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   3  s,     &D??9::Kr,   c                     \ rS rSrS rS rS rS rS rS r	SAS jr
SBS
 jr\S 5       r\S 5       r\S 5       r\S 5       rSCS jr\S 5       rS r\S 5       r\S 5       rS rS rS rSDS jrS rS rS rSES 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-SFS, jr.SGS- jr/S. r0SHS/ jr1S0 r2SIS1 jr3S2 r4S3 r5SAS4 jr6S5 r7S6 r8S7 r9S8 r:SAS9 jr;\S: 5       r<         SJ                 SKS; jjr=SLS< jr>\?S= 5       r@\S> 5       rA\S? 5       rBS@rCg	)MAnnotiH  c                R    [        U[        R                  5      (       d   eXl        g r.   )rC   r   PdfAnnotr   r)   r   s     r*   r   Annot.__init__J  s    5%..1111	r,   c                F    [        U SS5      nSU R                  S    SU 3$ )Nparentz<>'r   z' annotation on )getattrr   )r)   r   s     r*   __repr__Annot.__repr__N  s,    x.499Q<. 099r,   c                "    U R                  5       $ r.   )r   r0   s    r*   __str__Annot.__str__R  s    }}r,   c                8    [        U SS5      (       a  SU l        g g )NthisownF)r   r   r0   s    r*   _eraseAnnot._eraseU  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'.OverlayTextra   Qr   rect
text_colorfontnamefontsizefill)r   r   pdf_annot_typePDF_ANNOT_REDACTr:   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_alignrl   g_exceptions_verboser{   r   TOOLS	_parse_dacolors)r)   r   valuesobjxrefr   alignvalr   r   r   r   s               r*   _get_redact_valuesAnnot._get_redact_valuesY  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_extrarC   r   r   r   r   Annot_getAPbytesr  pdf_dict_getlr	  pdf_is_streampdf_load_streamr   JM_BinFromBuffer)r)   rL   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_rectrl   r  r{   )	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   r.  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_requiredrl   r  r{   rw   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_INFINITEr/  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)rl  r   rC   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Matrixrl   r  r{   )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  r9  r=  r   )rl  r   r   r  r  r	  r   r  pdf_to_namer  pdf_is_dictpdf_dict_lenrP  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r)   r   r#  r  r[  rJ   rd  obj1mjobj2s              r*   	blendmodeAnnot.blendmode3  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   )rl  r   r   rA  rH  rJ  rB  rC  rD  r@  r:   r  r   JM_annot_border)r)   atypeaorL   s       r*   borderAnnot.borderS  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)rl  r   r   pdf_get_bound_documentr  _make_PdfFilterOptionspdf_filter_annot_contents)r)   r  r   r^  filter_s        r*   clean_contentsAnnot.clean_contentsf  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.)
rl  r   rC   r   r   JM_annot_colorsr  rl   r  r{   r   s     r*   r  Annot.colorsn  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)rl  r   r   r  r   JM_find_annot_irtpdf_delete_annotrE  r	  r  r  pdf_array_lenrP  pdf_array_getr   r  pdf_array_deleterR  )r)   r   r#  r   	irt_annotannotsrJ   foundrd  ops              r*   delete_responsesAnnot.delete_responsesz  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)rl  r:   r   r   r  r   rI  	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#  r_  r	   fsr  rk   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.)rl  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  )rl  r   r   r  r   rI  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rl  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   rC   r   r   r   r   r.  r   r   )r)   rL   r   r   s       r*   rp  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   )rl  csGRAYcsRGBcsCMYKr   strr=   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pixrL   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	   )rl  r   r   r  r   r  r	  PDF_ANNOT_SOUNDr   r  r  r  r  r:   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_textbox0  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.)rl  r   FzStextOptionsr@   mupdf_versionJM_rect_from_pyinternalclipr  r  r   FzStextPageTextPagerp  rC   weakref	ProxyTyper   proxy)	r)   r  r  optionsclip2r   	stextpagerL   r  s	            r*   get_textpageAnnot.get_textpage3  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)rl  r   r   r  r  r	  r   )r)   r   r  s      r*   	has_popupAnnot.has_popupF  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)rl  r   r:   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.infoN  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_xrefp  sN    
 		''/	  )Xe_=~~%%r,   c                X    [        U 5        [        R                  " U R                  5      $ )z-Get 'open' status of annotation or its Popup.)rl  r   pdf_annot_is_openr   r0   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@   rB  )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)rl  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   )rl  r   rC   r   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   rp  m_internal_valuer   _annot_refsidr   Widgetr  _fill_widget)r)   rE  r_  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  )rl  r   r   r  r  PDF_ENUM_NAME_CApdf_is_numberr  )r)   r   opyr;  s       r*   rZ  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(  )rl  r   rn  ro  r   r  r  r	  r   r/  rm  r(  rp  rq  rr  )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(  rp  rr  )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  )rl  r   r   r  r  PDF_ENUM_NAME_Rotater   r
  )r)   r   rotations      r*   rt  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)rl  rp  rotation_matrixrq  r   r   r  r  r	  r   r   r*  r  r0  )	r)   r3  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)rl  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rl  r   r   r  rY  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__)rl  r   r   rA  rH  rJ  rB  rC  rD  r@  rw   r:   
setdefaultr@   r   rC   r9   r   r  r  JM_annot_set_border)r)   r  r  r  r  r  r  atnamerH   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                v   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(       a0  U R                   S   U;  a  [-        SU R                   S    S3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   rn  []z,Warning: fill color ignored for annot type 'r   r  r7  )r   r   rH  r   rl  rp  r   r:   r=   rA  r@  rB  rC  rD  r   xref_set_keyr  r@   float
CheckColorr<   r   rw   )r)   r  r  r   r.  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B499Q<.PRST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)rl  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,  )rl  r   r:   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)   r6  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   Subtyper9  N)r   r   r  r   pdf_xref_lenr.  r   MSG_BAD_XREFpdf_new_indirectr  r	  pdf_annot_type_from_stringr  MSG_IS_NO_ANNOTrR  )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)rl  r   r   rD  fz_text_language_from_stringpdf_set_annot_language)r)   rG  rE  rF  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)rl  r   r   rJ   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)rl  r   r   r  rE  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)rl  r   _INRANGEr   pdf_set_annot_opacityr   transparency)r)   rZ  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)rl  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)rl  r   r   JM_rotate_page_matrixr   fz_transform_rectr  pdf_set_annot_popup)r)   r   r   pdfpagerx  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)rl  r   r   r  r   r  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectrl   rw   )r)   r   r   r  rx  r!  re  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   r8  )rl  r   r   r   rG  rA  rH  rI  rJ  rB  rC  rD  r@  rK  rL  r  rM  r	  )r)   r]  r   r   rx  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)
rl  r   r   r   r   pdf_string_from_annot_typer   r  pdf_is_namer  )r)   r_  cr  its        r*   r   
Annot.type'  s     	Dyy##$$TYY/,,U3!4!4TYY!?F||u0033:q!"~r,   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_stringY  s'     2$BI%%''r,   r   r  Nr  r  r  r   r  r  r  r   /H gs
ra      )rZ  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_testrl  r   r  r=   r  r~  rH  r  r@   rZ  r  r  r  JM_make_annot_DAr<   ri  r   r%  r8   r4  rp  rq  joinmapr  r  rO  
splitlinesr   rp   r   endswithrD  rC  replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashrP  maxr   verticesPointr  rG  rA  rI  rJ  rB  r@  rK  rL  rt  tlbrabsr|  morphsetRectr}  )5r)   r[  rZ  r   r   r   border_colorr\  	cross_outr]  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ntabrt   le_funcsle_funcs_rangedpointsp1p2leftrx  r+  quadr}  s5                                                        r*   updateAnnot.update5  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)rl  r   r   r  r  r   rI  r  r  r  r	  r   r  r  r  r+  r   r,  r-  fz_buffer_storagepdf_new_intrR  pdf_dict_putlr  )r)   r1  rk   	ufilenamer  r   r#  r^  r   r	   r  r"  r<   r8  ls                  r*   update_fileAnnot.update_file2  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  )rP  )totalrd  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)rl  r   rC   r   r   r  r   ry  rn  pdf_page_transformJM_derotate_page_matrix	fz_concatr  r	  r   r   rP  r  r  r  FzPointfz_transform_pointrp   xy)r)   r   r#  r   page_ctmdummyderotr  r"  rd  ra  rb  pointres1o1r  s                   r*   r  Annot.verticesd  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)rl  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  )r[  OptStrrZ  OptFloatr   r  r   rq  r   OptSeqr%  rs  r\  rs  r&  boolr]  r9   NNNN)Dr2   r3   r4   r5   r   r   r   r   r  r%  r4  ri  propertyrs  r~  r  r  r  r  r  r  r  r  r  rp  r  r  r
  r  r"  r%  r6  r;  r?  rG  rO  r[  rZ  rc  rf  r   rp  rt  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rF  rQ  staticmethodr  r  r  r6   r/   r,   r*   r   r   H  s*   :!%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{  r0   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)   filepathr_  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  r_  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.   )rC   r  	bytearrayr>   BytesIOra  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  )r:   r{  rp   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,   dirra   z'Need name for binary content, but path=r   rbNr  zNot a file or directory: rk   r   zipr   r   tarmultir   zUnexpected type(name)=)r
   zUnexpected type(data)=r  zUnrecognised type )$rC   pathlibPathr  ri   r
   isdirr  listdirisfiler>   r?   readr  r   zipfileZipFiler   fpgetvaluer  r  namelisttarfileTarFilefileobjr  getnamesry  r  r   r<   r   r@   r}  r  )r)   r  r
   r  r  r  ffrk   r  datar   rH   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{  r0   s    r*   
entry_listArchive.entry_list9  s    
    r,   c                D    [         R                  " U R                  U5      $ r.   )r   fz_has_archive_entryr   r)   r   s     r*   	has_entryArchive.has_entry@  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_entryC  s#    **DIIt<&&r,   )r{  r   r.   )r2   r3   r4   r5   r   r   r  r  r  r  r  r}  rv  r  r  r  r6   r/   r,   r*   ry  ry    sL    B@<<<<gR ! !<'r,   ry  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XmliH  c                    U $ r.   r/   r0   s    r*   	__enter__Xml.__enter__J      r,   c                    g r.   r/   r~  s     r*   __exit__Xml.__exit__M      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: )rC   r   FzXmlr   r  fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r)   rhsr  s      r*   r   Xml.__init__P  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_textrp   r   r[  tagnameget_attributesrG   first_child)noderG   shiftkrK   child	show_nodes         r*   r  %Xml._get_node_tree.<locals>.show_nodeZ  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  rG   r  s      @r*   _get_node_treeXml._get_node_treeY  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_listo  %    ##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_classu  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  )rP  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  r/  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  rC   r  r  r  r	  r
  )r)   r5  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)r9  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	  rP  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  rd  rt   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$ rE  )r  rK  r
  r  )r)   r  rF  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   r0   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)   rL   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  r9   sRGB_to_rgbr   r   )colors    r*   
color_textXml.color_text2	  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  rw   r  )r)   rG   rH   s      r*   debug	Xml.debugB	  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)   rq  attmatchrL   s        r*   r   Xml.findH	  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_nextM	  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  rg  s     r*   r  Xml.first_childR	  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   r:   fz_dom_get_attribute)r)   resultrd  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_afterm	  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_beforep	  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<   rV  r  r	  r  )r)   r   rW  rX  rd  rt   s         r*   insert_textXml.insert_texts	  sk    !Z
 'GAd33D9:>!!!$"5"5d";< ( r,   c                    U R                   SL$ )zCheck if this is a text node.Nrv   r0   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  rg  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  rg  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  rg  s     r*   previousXml.previous	  s,    ##TYY/>>9 r,   c                D    [         R                  " U R                  5        g r.   )r   fz_dom_remover   r0   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   r0   s    r*   rootXml.root	  s    E%%tyy122r,   c                    [        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U R                  SU 35        U $ )z Set text alignment via CSS stylerD  centerrightjustifyzUnrecognised align=ztext-align: )rC   r  TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   rK  )r)   r  ts      r*   	set_alignXml.set_align	  sv    uc""Ao%A''A&&A((A3UH566aS)*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                L    U R                  SU R                  U5       35        U $ )z"Set background color via CSS stylezbackground-color: )rK  rm  r)   rl  s     r*   set_bgcolorXml.set_bgcolor	  s%    +DOOE,B+CDEr,   c                F    U(       a  SnOSnU R                  SU 35        U $ )zSet bold on / off via CSS styleboldnormalzfont-weight: r_  r)   r  s     r*   set_boldXml.set_bold	  s)    CC-u 56r,   c                L    U R                  SU R                  U5       35        U $ )zSet text color via CSS stylezcolor: )r_  rm  r  s     r*   	set_colorXml.set_color	  s&    '$//%*@)A BCr,   c                .    U R                  SU 35        U $ )z(Set number of text columns via CSS stylez	columns: r  )r)   colss     r*   set_columnsXml.set_columns	  s    )D6 23r,   c                .    U R                  SU 35        U $ )z"Set font-family name via CSS stylezfont-family: r  )r)   fonts     r*   set_fontXml.set_font	  s    -v 67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 stylera   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.NrW  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                F    U(       a  SnOSnU R                  SU 35        U $ )z!Set italic on / off via CSS styleitalicr  zfont-style: r  r  s     r*   
set_italicXml.set_italic	  s)    CC,se 45r,   c                .    U R                  SU 35        U $ )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: rK  )r)   leadings     r*   set_leadingXml.set_leading	  s    )'34r,   c                .    U R                  SU 35        U $ )z,Set inter-letter spacing value via CSS stylezletter-spacing: r  r)   spacings     r*   set_letter_spacingXml.set_letter_spacing	  s    "27) <=r,   c                .    U R                  SU 35        U $ )z6Set line height name via CSS style - block-level only.zline-height: r  )r)   
lineheights     r*   set_lineheightXml.set_lineheight
  s    zl34r,   c                .    U R                  SU 35        U $ )zSet margin values via CSS stylez	margins: r  r  s     r*   set_marginsXml.set_margins
  s    )C5 12r,   c                .    U R                  SU 35        U $ )zSet opacity via CSS stylez	opacity: r  )r)   rZ  s     r*   r  Xml.set_opacity
  s    )G9 56r,   c                (    U R                  S5        U $ )z$Insert a page break after this node.zpage-break-after: alwaysr  r0   s    r*   set_pagebreak_afterXml.set_pagebreak_after
  s    12r,   c                (    U R                  S5        U $ )z%Insert a page break before this node.zpage-break-before: alwaysr  r0   s    r*   set_pagebreak_beforeXml.set_pagebreak_before
  s    23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  rJ  )r  r  r  r  r  r  r  r  r  set_text_indentr  r  r  r  r  r  r  set_word_spacingr  r  r  rp   r  r  r  r  )r)   r  bgcolorr  rl  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                .    U R                  SU 35        U $ )z;Set text indentation name via CSS style - block-level only.ztext-indent: r  )r)   r  s     r*   r  Xml.set_text_indentg
  s    vh/0r,   c                .    U R                  SU 35        U $ )Nztext-decoration: r  r  s     r*   set_underlineXml.set_underlinel
  s    "3C5 9:r,   c                .    U R                  SU 35        U $ )z*Set inter-word spacing value via CSS stylezword-spacing: r  r  s     r*   r  Xml.set_word_spacingp
  s    .	 :;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.NrF  )r!   r  rR  body)r  r  r  r  r[  r  )r)   r   r  s      r*   r
  Xml.span_bottomu
  s    =mmNNE} mmm =EMMV3}}} 99U]]

}}&)) r,   c                B    [         R                  " U R                  5      $ r.   )r   
fz_xml_tagr   r0   s    r*   r  Xml.tagname
  s    ++r,   c                B    [         R                  " U R                  5      $ r.   )r   r  r   r0   s    r*   r   Xml.text
  s      $)),,r,   r   r.   rn  ru  r   NT)NNNNNNNNNNNNNNNNNN)	underline)Pr2   r3   r4   r5   r  r  r   r  r  r  r  r  r  r  r'  r+  r2  r6  r;  r?  rB  rG  rK  rN  rS  rY  r  r_  rc  rh  rw  rm  r  r	  rx  r   r  rv  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_kbdr6   r/   r,   r*   r  r  H  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)
rC   r   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r)   r_  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                D    SU R                      nSU SU R                   3$ )N)ra   GRAYra   RGBCMYKzColorspace(CS_z) - )rJ   r   r)   ra  s     r*   r   Colorspace.__repr__
  s'    +DFF3s$tyyk22r,   c                B    [         R                  " U R                  5      $ r.   )r   fz_colorspace_namer   r0   s    r*   _nameColorspace._name
  s    ''		22r,   c                B    [         R                  " U R                  5      $ )zSize of one pixel.)r   fz_colorspace_nr   r0   s    r*   rJ   Colorspace.n
       $$TYY//r,   c                "    U R                  5       $ )zName of the Colorspace.r;  r0   s    r*   r   Colorspace.name
  s     zz|r,   r!  N)r2   r3   r4   r5   r   r   r;  rv  rJ   r   r6   r/   r,   r*   r)  r)  
  s:    I3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_devicery  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicerl   )
r)   r  devicepmr  r3  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*   rE  rE  
  s    Or,   rE  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   rV  r   r0   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<   rC   r   rn  rM  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)rC   r)  r   r   r+  r1  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.   )rm  r   fz_bound_display_listr   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   rP  r  r  FzCookie)r)   dwr  areas       r*   runDisplayList.run
  s8    !!				!!$% 	r,   r   r   )NNr   N)r   )r2   r3   r4   r5   rY  r   r  r"  rv  r   rl  r6   r/   r,   r*   rV  rV  
  s/    .  
r,   rV  c                  
   \ rS rSrSS jrSS jrS rS r\R                  SfSS jj5       r
\R                  S:  a(  \R                  SS	 j5       r
\R                  SS
 j5       r
SfS jr
SS jrSS jrSS jrS r    SS jrS rS rS r   S           SS jjr    S           SS jjrS rSS jrSS jrS rS rS rSS jrS rSS  jrSfSS! jjr S" r!S# r"S$ r#S% r$S& r%SS' jr&S( r'S) r(S* r)SS+ jr*S, r+S- r,S. r-S/ r.SS0 jr/\0S1 5       r1SS2 jr2SS4 jr3S5 r4S6 r5S7S7S8.SS9 jjr6\0S: 5       r7S; r8S< r9SS= jr:SSS> jjr;S? r<SSS@ jjr=SA r>   S           SSB jjr?SSC jr@SSD jrASSE jrBSSF jrCSSG jrD    S           SSH jjrESSI jrFSJ rG                   SSL jrHSM rISSN jrJ   S           SSO jjrKSSP jrLSQ rMSR rNSSS jrOST rPSSU jrQSV rRSSSW jjrSSSSX jjrTSY rUSSZ jrVSSSSSKS7S[.               SS\ jjrW     S               SS] jjrXSS^ jrYS_ rZ S     SS` jjr[Sa r\SSb jr]SSc jr^Sd r_        SSe jr`       S                   SSg jjraSSSSS3S3S3SSS3SSh.Si jrb\0Sj 5       rc\0Sk 5       rd\0Sl 5       re\0Sm 5       rf\0Sn 5       rg\0So 5       rhSp riSq rjSr rkSs rlSt rmSu rnSv roSw rpSSx jrqSy rrSz rs\0S{ 5       rt\0S| 5       ruS} rvSS~ jrwS rxS ryS rz\0SS j5       r{SSS jjr|\0S 5       r}SS jr~\0S 5       r   S         SS jjrS rS r\0S 5       rS rS rS r\0SS j5       r\0SS j5       rSSS jjrS rSS jr\0S 5       rS rGS S jrS rGSS jr          GSS jrGSS jrS r                    GSS jrS rS r             GS                             GSS jjr    GS               GSS jjrS rSS jrGS	S jrSfS jrGS
S jrSGSS jjrGSS jr    GS           GSS jjrGSS jrGSS jrS r GS       GSS jjr        GS                     GSS jjrS rGSGSS jjrSfS jrSS jrGSS jr\0S 5       r                    GSS jrS r\0S 5       rSS.GSS jjrS rS rS rS rSfS jrS rS rSS jrS rS rS rS rSr\0" S 5      r\rSrg(  r   i  c                ^   [        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   r9   
page_countr   r   r<   rC   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,   c                   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   r9   delete_pager   r   rP  delete_pagesslicerq  r  stopstep)r)   rd  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/   r0   s    r*   r  Document.__enter__3  r  r,   c                $    U R                  5         g r.   closer~  s     r*   r  Document.__exit__6      

r,   r   c                    g r.   r/   r)   rd  s     r*   r  Document.__getitem__9  s    r,   )r   	   c                    g r.   r/   r  s     r*   r  r  >      r,   c                    g r.   r/   r  s     r*   r  r  B  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.   )rC   r9   ).0ra  s     r*   	<genexpr>'Document.__getitem__.<locals>.<genexpr>I  s      RqopjkS]^_adSeSeops   zInvalid item number: i=r   page z not in document)
rC   r  rP  indicesr<   r9   r   all
IndexError	load_page)r)   rd  r  s      r*   r  r  F  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
Nc                $   [         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.ra   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_refsrC   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_streamrl   r  r{   FileDataErrorr  r@   r   ri   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)   rk   r	   filetyper   r  r/  r   JM_mupdf_show_errors_oldpdf_documentr   r  r!  stream2r.  re  	fz_streamr^  r8  s                      r*   r   Document.__init__O  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.   )rq  r0   s    r*   __len__Document.__len__  s    r,   c                    U R                   (       a  SOSnU R                  c5  U R                  S:X  a  U SU R                  S S3$ U SU R                   S3$ U SU R                   SU R                  S S3$ )	Nzclosed ra   zDocument(<new PDF, doc# r@  z>)z
Document('')z', <memory, doc# )r   r	   r   r  )r)   r   s     r*   r   Document.__repr__  s}    !%IR	;;yyB#$<T^^A<NbQQ[
499+R88Jtyyk1B4>>RSBTTVWWr,   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_strrR  )r)   r   r  r^  fontsr  rK   s          r*   _addFormFontDocument._addFormFont  s    >>T..;<<ta0~~##!!3' $  u'8'8%'@'@ ;<<%+Ea(r,   c                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)   idxr  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_objectrE  rP  JM_INT_ITEMrp   r  )r)   xrefsr^  r  olrootfirst
xref_countolroot_xrefrd  r8  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)   rv  r^  s      r*   _delete_pageDocument._delete_page/  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._deleteObject5  sD    t$a!3!3C!8!:;;l++*r,   r  c                   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   gotor1rf   gotor2r   r  launchurira   )r   r   	LINK_GOTO
annot_skelindexra  rb  
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_annotL  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   )rq  r   r   rP  r<   	page_xrefrp   	get_linksrq  r  _addAnnot_FromStringr   )doc1doc2	from_pageto_pagestart_atr  r  rR  saincrr  rd  pno_dstxref_srcr  p_srcp_dstold_xrefnew_xrefpage_srclinksr  page_dstlink_tabrP  
annot_texts                             r*   	_do_linksDocument._do_links<  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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)rP  r  r  r  r	  rR  )acro_fieldsrd  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_objectrE  r	  rR  pdf_array_pushrP  r  r  r  )r^  r.  xref1kids1xref2kids2w1_indw2_indr  rZ  rd  r0  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)  r-  r   r   FTAAr  N)r   rW  r  r	  pdf_dict_put_arraypdf_add_objectr  r  r  rE  rR  r8  r5  r  )r^  r.  r9  w1r;  w2r   newr/  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,   r-  N)r   r7  r  r	  r6  )r^  r.  r9  r;  r   r@  rQ  rG  rH  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.
r-  )
r   r  r	  r6  rP  r  r  r  rp   r  )r   	kids_listr/  rd  r0  get_kidss        r*   rW  &Document._do_widgets.<locals>.get_kids:  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  )rZ  rV  r   parent_xrefrW  s       r*   
kids_xrefs(Document._do_widgets.<locals>.kids_xrefsJ  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  )rP  r   r  r  r  pdf_dict_get_text_stringr	  r=   rp   rG   r<   r7  r  )r^  r.  join_duplicatesnamesrd  wobjectr  r)  r  r   xref0r9  newnamer1  rS  s                r*   deduplicate_names/Document._do_widgets.<locals>.deduplicate_namesT  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  )r.  r^  s     r*   get_acroform*Document._do_widgets.<locals>.get_acroformp  s0    55c:C&&u'8'8'=OOr,   Fieldsr   r   r   r  r  r   r  P)r#  old_kidsnew_kidsr#  ro  r  zAA/Cr  zcannot copy widget at xref=r   rn  )r_  F)is_form_pdfr   rh  r  r	  r6  rE  pdf_deep_copy_objrE  pdf_graft_mapped_objectrF  r  r  r  rR  rP  annot_xrefsrR  r7  keysr8  r<   r   r  r  ri  rl   r  r  )1r  r0  graftmapr  r  r  r_  r[  rd  rj  tarpdfsrcpdfacror.  tar_co
acro_graftacro_tartar_xrefacro_tar_indr  	src_rangeparentsrd  src_pager  wtyper8  w_objrZ  rn  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_graftre  	w_obj_tarw_obj_tar_indr  r1  rW  rS  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^  r`  entryfilespecr  conts           r*   _embeddedFileGetDocument._embeddedFileGet  s    t$##!!#& !)! ##E1S573&&uhtnhsmL##H-$r,   c                    U R                  5       nX;   a  UR                  U5      nU$ U[        [        U5      5      ;   a  UnU$ [	        SU S35      e)Nr   z' not in EmbeddedFiles array.)embfile_namesr  rP  r<   r   )r)   rH   	filenamesr  s       r*   _embeddedFileIndexDocument._embeddedFileIndex  sa    &&(	//$'C
 
	 U3y>**C 
 q&CDEEr,   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	  r6  r  rO  rN  JM_embed_filer  r8  r  )r)   r   r1  rk   rO  r  r^  r  r`  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^  r`  s       r*   _embfile_delDocument._embfile_del4  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  rJ  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trailerr`  r  cir   len_rJ  r  s                 r*   _embfile_infoDocument._embfile_info@  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	  r6  r  rP  r  r  r  rp   )r)   r  r^  r`  rJ   rd  r  s          r*   _embfile_namesDocument._embfile_nameso  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  rI  rJ  r  r  r  r  )r   r   r  r  r	  r  r   r  r  r+  r  r,  r-  rL  rM  rR  rN  r  r  )r)   r  r1  rk   rO  r  r^  r  r`  r  r  r"  r<   r8  rP  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   rn  )r   r   r  r   Document_extend_toc_itemsr   r   r   r  r  r	  r   r  r<   r  rP  r9   rC   r:   r  r7  r
  r6  r  r  r  dictkey_colorr  r  )r)   rG   r^  r  r  r  r  r  r  r  r  rJ   r  rd  r  rH   itemdictbmr  countrc  rl  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,   c                T    [        U5      nX R                  ;   a  U R                  U	 gg)z&Remove a page from document page dict.N)rW  r  )r)   r   pids      r*   _forget_pageDocument._forget_page  s&    h//!$ "r,   c                   [        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OD[        Xq5      nUR                  (       d  [        SUS S3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 r@  z is not supportedr  )r   r   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   rl   fz_new_font_from_bufferrP  fz_encode_characterfz_advance_glyphrp   )r)   r  bfnameextorderinglimitr  r^  mylimitr  r  r  r  r  wlistrd  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~~#mD8;L$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  Numsr-  )r   r   r  r  r  r	  r   pdf_resolve_indirectr  JM_get_page_labelsr6  r  rP  r  )	r)   r^  r   
pagelabelsr  numsr/  rJ   rd  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   ra   )r   fz_lookup_metadata2r   rl   r  r{   r  s     r*   _getMetadataDocument._getMetadata2  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  rn  Type)r   r  r   r   r   r  r  r	  r   rW  rR  rF  r  )r)   r^  r  r  ind_objs        r*   _getOLRootNumberDocument._getOLRootNumber:  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  rP  r  r  binasciihexlifyrp   )	r)   r^  idlistidentityrJ   rd  r  r   hex_s	            r*   _getPDFfileidDocument._getPDFfileidK  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   rC   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)   rv  whatr.  	pageCountrJ   r^  pagerefrsrclistetracers              r*   _getPageInfoDocument._getPageInfo[  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_fonto  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   rC   r   r   fz_load_outlinerl   r  r{   Outline)r)   r.  r9  s      r*   _loadOutlineDocument._loadOutliney  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   r0   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   r-  r   r  r  N)r   pdf_lookup_page_locr   r  r	  r  rR  pdf_array_insertr   pdf_dict_get_intrM  r  r  r  _reset_page_refs)r)   rv  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   rn  
Fixed_UNITr  r  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager  )	r)   rv  r  r/  r^  mediaboxcontentsrf  page_objs	            r*   r,  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  rE  r	  rO  rP  rQ  rR  )r)   r  r^  rH   rl  rd  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 S	35      nU R                  XV5        g )
Nr  r  r   r  T
compressedz/Nums[]z/Nums[r  )r   r   r  r  r  r	  rE  rN  rO  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xq'9: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	  rE  r  rR  rM  rO  rP  rQ  r  r   r  )r)   r  actionr  r  r  rl  r^  rH   r  r  rd  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  rP  r  rp   r  r  )r)   r^  r  r  rJ   rd  r  s          r*   	FormFontsDocument.FormFonts  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_layer1  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   r/  rR  r	  r  rE  r8  rC   r  r   r  rV  rY  rF  JM_ensure_ocpropertiesr  r6  r   MSG_BAD_OC_CONFIGr  r   rU  r  )r)   r   configrW  intentusager  r^  ocgintentsuse_forci_namecre_infoindocgocpr  cfgs                    r*   add_ocgDocument.add_ocg7  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  widgetsc               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_documentr9   )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   r0   s    r*   rr  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)   ru  chaptersr@  s       r*   rs  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   r0   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_pdfrP  rw   )r)   r  r  r]  fz_docr  rR  srcCountlen0r.  len1rd  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,   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<   rP  r)  r)   rv  r   rq  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   rE  )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)   rv  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.
rz  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   rq  r=   r   rP  r<   r   r9   rC   r   r  setrw   sort	frozensetget_tocrV  r  r  r9  reversedr  r  )r)   r  kwrq  r  r  r8  rv  frozen_numberstocrd  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,   c                <   U R                  5       nX;   a  [        SU S3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 'z' already exists.r1  rk   rO  r  r  z/EmbeddedFileParams/CreationDateParams/ModDate)r  r   r  get_pdf_nowr  r
  )	r)   r   r1  rk   rO  r  r  r  dates	            r*   embfile_addDocument.embfile_addH  s      &&(	vdV+<=>>H I<D  !# !  }$8$ 5{47HI$ 0+d2CDr,   c                4    [        U R                  5       5      $ )zGet number of EmbeddedFiles.)r<   r  r0   s    r*   embfile_countDocument.embfile_countn  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)   rH   r  s      r*   embfile_delDocument.embfile_delr  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)   rH   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)   rH   r1  rk   rO  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,   )ra   ra   ra   r,   ra   )r   r   r7  r  r	  pdf_name_eqr  r8   r   pdf_is_nullJM_get_fontextensionr  r   r  r  r0  dictkey_extdictkey_typer/  )r)   r  	info_onlynamedr^  r  r_  subtypebasefontbnamer  r1  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_imager:   _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                F    U R                  U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raise_on_repair)save)r)   rk   r  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  sV    4 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   ru  r   )r)   r  locations      r*   find_bookmarkDocument.find_bookmarkG  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  r9  rm      rK  N) r   r   r  r  r   r  r  r  rr  r  r	  r   r  rO  rP  r  r  r   pdf_create_objectpdf_update_objectr  rE  r8  rR  JM_read_contentspdf_add_streamr  PdfObjr-  r1  r  r  )r)   rv  r   r^  rq  r"  r%  
old_annotsrJ   
new_annotsrd  r  r  copy_or  r"  r3  s                    r*   fullcopy_pageDocument.fullcopy_pageN  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c                   [        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  simplera   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  rp   r<   r  r  UpdateFontInfo)r.  r  r  r  fontdict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  re  )r   r   r  r  r	  r   r  r  r   rj  JM_get_ocg_arrays)r)   rk  r^  rt  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  r0  re  r   )numberr   rV  )r   r   pdf_count_layer_configsr  r  r	  r6  PdfLayerConfigrP  pdf_layer_config_infor   rV  rp   )r)   r^  rJ   r  r   r6  rd  rH   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 3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 r  r  r   0 Rra   )r   r  r   r  r9   r  )r.  r  r  r   r  r   s         r*   r  Document.get_oc$  s     ==C,,:;;""43;$&997v>??  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.r`  r  r0  rd  r(  r_  r  Nr\  )r      r  )r   rl  rW  rm  )r   r  r   r  r  r  r	  r:   r6  r  rP  r  r  r  r   r  r   r  rp   mupdf_version_tuplePdfResourceStackpdf_is_ocg_hiddenr
  )r)   r  r^  ocgsr   rJ   rd  rn  r  r   r  rm  ro  rl  r  r  r  resource_stackhiddenrH   r  s                        r*   get_ocgsDocument.get_ocgs5  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 xrefTrC  
/Type/OCMDzbad object type/OCGs[r  r   Nr  rE  r   /P/r  rW  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  rL  policyve)rP  xref_lengthr   rF  r<   r   r  r;   r   r  r9   jsonloadsrl   r{   rw   )r.  r  r   textlenp0rB  rL  rW  rX  lprprZ  s               r*   get_ocmdDocument.get_ocmdd  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,   c                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   r9   r5  rl   r{   r  r)   rv  fullr  rK   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  re  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)   rH   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  rP  rq  r	  get_label_pnorp   )r.  labelonly_oner8  rH  rd  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  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
rx  )Identityr  r  )r.  rv  r  r  r  r  r  r  s           r*   get_page_pixmapDocument.get_page_pixmap  sB    . >FJx"" #  	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
  )r.  rv  optionr  r  textpager  s          r*   get_page_textDocument.get_page_text  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   rj  )r)   rv  r  s      r*   get_page_xobjectsDocument.get_page_xobjects3  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_sigflags=  ss    ta0~~&&!!#& $$	 &&x0G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	  getLinkDictrp   downr[  )
olItemr  lvlr  resolver   linkr.  r  r  s
          r*   r  !Document.get_toc.<locals>.recurseV  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  )r.  r  r  r  r  r  r  s   ``    @r*   r  Document.get_tocM  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  ra   )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   rz  r   TF)	r   r   r|  rP  rq  page_annot_xrefsr   PDF_ANNOT_LINKrR  r.  rd  rH   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   rz  r   TF)r   r   r|  rP  rq  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  keywordsrV  producerr  r  trappedr  None)r  r   r  r  r:   rG   r  r  )r)   r  rK   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)rC   r  r  rJ   r  r   tobytesr   r|  r  
insert_pdf)r)   infiler  r  r  r]  r%  r  r  r  r0  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,   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.
)rv  r  r/  r   )2   r  )r   r   r  rl  )new_pagert  r  )r.  rv  r   r   r  r/  r   r  rl  r   r   s              r*   insert_pageDocument.insert_page  sP    " |||@Dzz  
 	r,   )r  r  r  r]  r%  r  r  r_  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:  ay  O  Ov[        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  r_  )r   r  r   r  rq  r  minr<   ri   r
   basenamer   rw   r  r=   Graftmapr  extra_FzDocument_insert_pdfr   r   r   r  r<  JM_merge_ranger  r)  r  )r)   docsrcr  r  r  r]  r%  r  r  r_  r  r  r  r  outCountr  r  rR  innameoutnameisrtpdfoutpdfsrcs                          r*   r  Document.insert_pdf  sN   L >>T..;<<>>V---FGG6B??$$  QZX\"6ABX\"6Bv;**WW%%fkk2F%gg&&tyy1G&k&y:; ""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_Fieldsr6  r  rl   r  r{   )r)   r^  r  fieldss       r*   rq  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)rC   r   r   r   ll_pdf_specificsr   rg  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   rt  r   r  r0   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_redort  )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   rC   r  r   pdf_load_journalr+  r  pdf_deserialise_journalr   r  r  r  )r)   rk   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   rC   r  r   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)r)   rk   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_undo-  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_languagerD  rB  )r)   r^  rF  s      r*   rG  Document.language5  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   ru  r   )r)   last_locs     r*   last_locationDocument.last_location@  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   radioboxrs  )r5  r   depthr   rW  locked)r   r   PdfLayerConfigUipdf_count_layer_config_uirP  pdf_layer_config_ui_infor   r   r)	  selectedr*	  rp   )r)   r^  r6  rJ   r   rd  r_  rH   s           r*   layer_ui_configsDocument.layer_ui_configsH  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  r/  r   r.  r   r  r!  s	            r*   layoutDocument.layouta  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   r9   rq  rC   r   fz_load_pager   fz_load_chapter_pager   r   r   r  rW  r  r  rV  r5  )r)   page_idnpr   ru  pagenumr  s          r*   r  Document.load_pageu  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_numberru  r   )r)   rv  this_docrt  rq  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)   rt  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   TrC  r:   r   <<r
  >>FMarkedUserPropertiesSuspects/true)rE  r  r9   r;   rF  rl   r  r{   )r)   r  r   r  validrK   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.   rB  r0   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  NeedAppearancesrg  r   )rq  r   r   ri  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   rC   r   r   r   r   fz_needs_password)r)   r   rL   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  r/  )r,  )r.  rv  r  r/  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   r9   r   r$	  r   rC   r  MSG_BAD_PAGEIDPyExc_ValueErrorr   r<	  fz_next_pageru  r   )r)   r7	  r>	  r  ru  rv  rt  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   rC   r   r   r  r  r   r   r  r  JM_get_annot_xref_list)r)   rJ   rq  r  r4  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  rC   r   r   r   r  r  r0   s    r*   rq  Document.page_count9  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_cropboxrm  r(  )	r)   rv  r>	  rq  rJ   r^  r  cropboxr  s	            r*   page_cropboxDocument.page_cropboxE  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   rl	  )r   r9   rq  r   r   r<	  fz_page_number_from_locationr   )r)   r7	  r8	  ru  rv  rt  page_ns          r*   page_number_from_location"Document.page_number_from_locationY  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)   rv  rq  rJ   r^  r  s         r*   r  Document.page_xrefg  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   rE  r  r)   r  r   s      r*   
pagelayoutDocument.pagelayoutx  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,   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   )rq  rP  r   r  )r)   r  r  r  rv  s        r*   r@  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*   rE  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  )rD  r  )rF  )r)   rD  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   rh  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)   r.  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   rl	  r  r/   )r   r  r   r   r9   r   r<	  fz_previous_pager   ru  r   )r)   r7	  ru  rv  rt  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=)r5  rV  rG   r   r   refsrU  r   r  store_shrinkr  )
r)   r   r  rv  r  rK   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                h    [        U SS9nUR                  (       a  [        R                  " U5        gg)z(
If we are a PDF document, does repair.
Fr  N)r   r   r   pdf_check_documentr  s     r*   repairDocument.repair#  s*     te4>>$$S) 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   rl   r  r{   ru  r   r~	  )r)   r  r  rt  xpyprv  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bitonalrl  r  set_to_grayr  quality_strtemplate_optsdir1rS  dir2invalid_optionsr^  s                     r*   rewrite_imagesDocument.rewrite_imagesE  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.
rz  N)r|  r   rP  rq  r  r	  )r)   
componentsrd  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  ra   )r   destr  r  r   r   rO	  r	  Nz/XYZrn  r   r   r   r   r  rE  r   )pdf_is_indirectr   r  r6  r  r   r  r   stripr8   r;   r<   rp   r   r  r  r  r=   r9   )	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  rP  r  r  r  r  rw   )	dest_dictpdf_dict
name_countrd  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	  rP  rq  r  r   rh  r   r  r  r  r  pdf_load_name_tree)r)   rd  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                   n 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R;                  U5        OUb  UR;                  U5        Ub  UR=                  U5        UUl        UUl         UUl!        S nSURD                  l#        [I        U5        US:X  a  [K        U5        [M        U[
        5      (       a  [        RN                  " UUU5        O3[Q        U5      n[        RR                  " UUU5        URU                  5         U(       a%  U R                   (       a  U(       d  [W        S5      eg g g )Nr  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 40r   zDocument save did a repair),r  r   r  r   r   r  r@   r   rq  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   rU  JM_embedded_cleanJM_ensure_identityrC   pdf_save_documentr	  pdf_write_documentr	  rl   )r)   rk   r  r  r  r  r  r  r  r  r  r  
appearancer  r  r  r  r  r  r  r  r  is_repaired_prer^  rS  r	  s                             r*   r  Document.save,  s~   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!"<>> )8 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)   rk   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_KEEPr0   s    r*   saveIncrDocument.saveIncr  s!    yyAWAWyXXr,   c                   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 S3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  Mi  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rp   )
cont_lines	out_linesin_textsuppressmake_returnrt   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,   rz  zclosed or encrypted docFr   r  )r1  T)imagesr   r  Thumbr  z	bad xref z - clean PDF before scrubbingSz/JavaScriptz<</S/JavaScript/JS()>>r  z	/Metadata<<>>s   deleted)rI  r  )"r|  r   r  r   set_metadatar  resetr  delete_linkr  r   r   rI  rQ  r  r   apply_redactionsr  get_contentsr<   xref_streamr  r  update_streamr  r  r  r  r  r  rY  rP  rF  rG  )r.  attached_filesclean_pagesembedded_fileshidden_text
javascriptr  
redactionsredact_imagesremove_linksreset_fieldsreset_responses
thumbnailsxml_metadatar@
  r   rZ  r%  r  found_redactsr   r  r  r  r;
  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((!$'DE o%c..tS9!<M.!!$,f-a0K?!!$/!!$
!=j1!4>  z6:) )r,   c                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   )quadsr  r  r  )TEXT_DEHYPHENATETEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_MEDIABOX_CLIP
search_for)r.  rv  r   r^
  r  r  r  s          r*   search_page_forDocument.search_page_for>  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[        R                  " X1[        R                  5        U R                  5         g)z,Build sub-pdf with page numbers in the list.r  rz  r  zsequence requiredr   r{  N)r   r  r   r|  r@   rP  r<   r  r  r   r   pdf_rearrange_pages2PDF_CLEAN_STRUCTURE_KEEPr  )r)   pylistevalid_ranger^  s       r*   selectDocument.selectb  s    >>T..;<<{{[))w..011CI&LA7|;.7|;.122 t$
 	""31O1OP 	r,   c                    [        U 5      nU(       d  [        R                  nO[        R                  " U5      n[        R                  " X#5        gr^  )r   r   rD  r  pdf_set_document_language)r)   rG  r^  rF  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 35      eU(       aZ  [        U5      [        [        4;  a  [        S5      e[        U5      R                  U5      nU[        5       :w  a  [        SU 35      eU(       aZ  [        U5      [        [        4;  a  [        S5      e[        U5      R                  U5      nU[        5       :w  a  [        SU 35      eU(       a  [        U5      [        [        4;  a  [        S	5      eU Ha  n	[        U	5      [        [        4;  a  [        S
U	 S35      e[        U	5      R                  U5      nU[        5       :w  d  MU  [        SU 3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': zbad type: 'off'zbad OCGs in 'off': zbad type: 'locked'zbad OCGs in 'locked': zbad type: 'rbgroups'zbad RBGroup 'r   zbad OCGs in RBGroup: 	UNCHANGED	Unchanged)rg  rh  rr
  zbad 'basestate'r  r0  Nr  r  re  )r   r   r  rO  ru  r   r   r   
differencer  upperr   r   r  r  r	  r   r  r  rj  JM_set_ocg_arraysrU  )r)   rk  	basestaterW  offrbgroupsr*	  rL  r  ra  r^  rt  r  s                r*   	set_layerDocument.set_layer  s   >>.//4==?'')*35=?@@Bxe}, !122B""4(ACEz #5aS!9::Cyu- !233C##D)ACEz #6qc!:;;F|D%=0 !566F&&t,ACEz #9!!=>>H~dE]2 !788Aw4-/$}QCq%9::F%%d+:$'<QC%@AA  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   r5  z	bad OCG 'r  r   r   r   N)	rC   r  r/	  r   r   r   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)r)   r5  rM  uirk
  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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 PDFFrK	  zbad MarkInfo key(s): rI	  )rP	  falsezbad key value 'z': 'r   rO	  r   rJ	  rH	  T)rE  r   rC   r:   r  ru  
issupersetrs
  rF  rG   r  r  r  )r)   rR	  r  rQ	  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,   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 3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U S3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.
rz  r  Nzbad metadataAuthorProducerra  rL  r*  ModDateSubjectKeywordsTrapped)r  r  rV  r  r  r  r  r  r  r  r  zbad dict key(s): r  Infor  r   rE  ra   rE
  rV  r  )noner  )r|  r   r   r  r   r:   r  ru  rs
  r  r9   r  r=  rG  r  r  rG   rt  r
  )r.  r  keymap
valid_keysdiff_setr   r  r  	info_xrefr  rK   r  r  pdf_keys                 r*   rF
  Document.set_metadata  s    zz[))==C,,;<<9A!WD ^,," *  " 
 '
qvvx=++J7su%hZ0CS/!""2v.;IDLL34I7yA~>((*Ii0RI;d);<"WR0LLN,-GGIOIDA!IOHCkG99'7 7!#&Y5 P 	 Ps   H	*H	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 35      eUS:  a.  U R                  US5      u  p4US:w  d  US;  a  [        SU 35      eUS:X  a)  S	U R	                  U5      ;   a  U R                  US	S
5        gU R                  US	U S35        g)zAttach optional content object to image or form xobject.

Args:
    xref: (int) xref number of an image or form xobject
    oc: (int) xref number of an OCG or OCMD
r@  r  r   rA  rD  r   r  )z/OCGz/OCMDr  r  NrV  )r   r  r   r  xref_get_keysr  )r.  r  r  r  r   s        r*   r  Document.set_oc,  s     ==C,,:;;""43;$&997v>??6&&r62GAF{d*;; #;B4!@AA7ts0066T40tt4[1r,   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 3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 35      eUSX    3-  nU(       a  UST
" U5       3-  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  35      eU S   R                  5       S;  a  [	        SU S    35      eU S   R                  5       S:X  a  [        U 5      S:w  a  [	        SU  35      eSU S   R                  5        3nU SS   HB  n[        U5      [        L a  UT;  a  [	        S	U 35      eUS
U S3-  nM4  US
T" U5       3-  nMD     US-  nU$ )Nr   zbad 've' format: r   )andornotzbad operand: r
  z[/r   zbad OCG r   rV  r  )r   r   r   r<   r   r  r  r9   )rX  rH   ra  all_ocgsve_makers      r*   r
  #Document.set_ocmd.<locals>.ve_makerW  s	   Bxe},B! #4RD!9::!u{{}$88 =A!899!u{{}%#b'Q, #4RD!9::1'DV7c>((8A388as$K'Da}--D  CKDKr,   z<</Type/OCMDz
bad OCGs: rT  r   c                    U  S3$ )NrV  r/   r  s    r*   <lambda>#Document.set_ocmd.<locals>.<lambda>p  s
    4jr,   r  AnyOnAllOnAnyOffAllOff)anyonallonanyoffalloffzbad policy: rU  z/VErJ	  r   rS  TrC  zbad xref or not an OCMD)r  rO  ru  r   r   r   rs
  r   r  r  r  r  r=  rF  rG  )r.  r  rL  rW  rX  r   r  r   polsr
  r
  s            @@r*   set_ocmdDocument.set_ocmdB  sX   & s||~**,-	$ DJ4-/D	$$X.ACEz"1#& o%Hsxx,@$(GHH3NND[&&(F  ""	D CC <x!899c$,((Dc(2,((D 19##%D$!GG677$%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 valuerO	  r   Nr	  TrE  r   r  r  )r)   r	  rQ	  r  rK   s        r*   set_pagelayoutDocument.set_pagelayout  s    m!19[))344a=C#ABJA!QWWY.!!$!g>  /00r,   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 valuerO	  r   Nr	  Tr
  )r)   r	  rQ	  r  rK   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                    U S    S3nU R                  SS5      S:w  a  USU S    S3-  nU R                  SS5      S:w  a  USU S    3-  nU R                  S	S
5      S
:  a  USU S	    3-  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 "<<", ">>".
	startpagerI	  prefixra   z/P(r  r  z/S/firstpagenumr   z/St rJ	  )r=   )rs  r  s     r*   create_label_str2Document.set_page_labels.<locals>.create_label_str  s     %&b)Ayy2&",s5?+1--yy"%+s5>*++yy+a/tE.1233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  ra   )r  r  )rH  rs  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)rI  )r.  rH  r
  r
  s      @r*   set_page_labelsDocument.set_page_labels  s"    	$	 	[01r,   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 S35      e[        U5      [        [        4;  d  [	        U5      S;  a  [        SUS-    35      e[        US   5      [        Ld	  US   S:  a  [        SUS-    35      eUS   US   S-   :  d  M  [        SUS-    3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H:  u  nnS%nUS   S:w  a  US&US    3-  n UUS   -  n US   S:  a  US'U
US       S(3-  n US   S:  a  US)U
US       S(3-  n US   S:  a  US*U
US       S(3-  n US   S:  a  US+U
US       S(3-  n US   S:  a  US,U
US       S(3-  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S0US#    3-  nUS:X  a  US1-  nUS2-  nU RO                  X   U5        GM=     U RQ                  5         U$ ! [F         a    [H        S	:  a
  [K        5          GNLf = f! [F         a    [H        S	:  a
  [K        5          GNXf = f! [F         a    [H        S	:  a
  [K        5          GNdf = f! [F         a    [H        S	:  a
  [K        5          GNpf = 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)3a  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  rz  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 z: page number out of range)r   rn  zbad row zbad hierarchy level in row )r  r  lastr  r  $   )r   r  r  r   r   r  r  r
  r  r[  r	  topr  r   r  rl  r  r  r  r  rI	  z/Count z/First rV  z/Last z/Next z/Parent z/Prev z/Titlez/C[ r  z/F z/Type/OutlinesrJ	  ))r   r  r   r|  r<   r  r   r   r   rq  rP  r9   r  rp   r=  r
  r  r  r  r{	  r/  r  r  	LINK_NONEr  r:   r   rz	  rb  rw  ra  r	  
getDestStrr=   rV  rl   r  r{   r   rG  r  )r.  r  r  toclenrq  t0rd  t1t2	old_xrefsr  lvltabolitemsr  r  r  rv  r  page_heightr
  r
  r   rf  r@  r   r  r9  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,*, 4s*D!EFFRu-#b'2G 8QU9!566RU3&2a519 #>Ai!HII!ur!uqy  #>Ai!HII )  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G..r&z!
g;#WT"W+%6$7t<<Cf:?VDF$4#5T::Cf:?VDF$4#5T::C
h<"$Xd2h<&8%9>>C
f:?VDF$4#5T::C
x"W+-- vvg3r'{#3q#8ibk(:;<A>>vvgq!A%R[M**Av''4KCdgs+u (x 	o  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@s~   Y
 Y/9ZZ9+[\\(
Y,+Y,/ZZZ65Z69[[\ ?\ \%$\%(]
	]
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 destrl  r   r   zbad color valuer  Fr  r   r  N)rM  r  rl  r  r  )rM  r  zbad page number)r  r   r  r   rf   r  ra   )r  r   r:   r  r  r{	  r/  r=   r  rb  r	  r
  r8   r   r   r  r  r<   r  r  rN  r
  r  rP  rq  )r.  r  r
  r  rv  r  r  r   rk   r  r  r  r
  rM  rl  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
  rR  )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,   c                  ^ ^ 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  rE  ra   WNDWr9   )r  r9   r  )r  dfdf_xrefwidthsdwidthsr.  s        r*   get_old_widths-Document.subset_fonts.<locals>.get_old_widths7  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  rE  ra   r
  r  r
  )r  r9   r  r   r  r  )r  r
  r
  r
  r
  r.  s        r*   set_old_widths-Document.subset_fonts.<locals>.set_old_widthsI  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   Nra   r  )r  +TrC  z
/BaseFont/r
  r	  r   r  rE  FontDescriptorr  z
/FontName/)randomstringr  choicesr   ascii_uppercaserF  r  r  r9   rG  )r#  r
  r
  r
  font_strr
  r
  r   fd_xreffd_strr.  s             r*   set_subset_fontname2Document.subset_fonts.<locals>.set_subset_fontnamea  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                  U S35        M     ONU	R                  SU 35        UR                  S5        [        U5      nU H  nU
R                  US S3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=   r&   z--unicodes-file=   04xwb)r  )fontTools.subsetsubsetImportErrorr  r{   rw   tempfileTemporaryDirectoryr>   r?   rp   r}  r   r   ri   r  rl   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_subsety  s   .
 ,,.'"),7"),7"),7 #$\N3)*-/#	 WWy5sVLPX(l<.$ABC(#'=#+C$NNcU":6 $, &6|n$EFC(#'=#+C$NNc#Yb>: $, 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#F75HG&H/G8G),F47
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   r9   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  rV  TrC  z	/BaseFontrO	  rJ	  )r  rp   r  r9   rF  r   r  )	r.  rH   r   r`  descendentsr  rB  rC  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)
rP  rq  rg  r<   r  r=   r  r}  r  r   )r.  r+  rd  r  	font_xreffont_extr  extrr  r`  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.   )rG   )r   r	  r6  r8  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  TrC  )r   rh  pdf_subset_fonts2r   rP  rq  rw   ru  r<   get_texttracer   r:   r}  rG   r  rF  rG  ) r.  verbosefallbackr^  r
  r
  r  r  r:  r=  old_fontsizenew_fontsizer  r   rF  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  r0  re  r   Nr   )r   r   r  r  r	  r6  r  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultrU  r   )r)   rk  
as_defaultr^  cfgss        r*   switch_layerDocument.switch_layerL  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   rR  N)r   r  r   r   r   r  r  r  r  r<  r  r  JM_refresh_linksr   )r)   r  r   r   r^  xreflenrJ  s          r*   rG  Document.update_object`  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	   rI  compressr^  rX  r  r"  s	            r*   rL
  Document.update_streamo  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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  r  r  bios                          r*   r   Document.write  sl    . 	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.rl  r   r  r5  r0   s    r*   r  Document.xref  %     	D{{$$T[[11r,   )keepc               ^   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]  rI  Nr  r   )xref_is_streamxref_stream_rawrL
  r
  r  r  )r.  sourcetargetrn  r	   r  rH   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[        R                  " U5      S S3nGOf[        R                  " U5      (       a  S	nGOG[        R                  " U5      (       a  S
nGO([        R                  " U5      (       a  Sn[        R                  " U5      S 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       3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@  rV  r	  r:   r9   r  r  rt  rP	  r
  r   rO	  r
  unknown)r   r   r  r  r   r  r7  r  r   ri  r	  r  r6  r  
pdf_is_intr
  pdf_is_realr  r[	  r\	  r  r  pdf_is_stringr  r  JM_object_to_bufferr  )
r)   r  r  r^  rX  r  subobjr   r   r"  s
             r*   r  Document.xref_get_key  s   t$$$S)a++
l++!8''2C##C(C~~#$$S.  #  ((D&&v.q16D''Dv&&Df%%D&&v.q1Dv&&Dv&&DDv&&D  ((v&&Du((012D  ((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  r7  r  r  rP  r  r  rp   )	r)   r  r^  rX  r  rJ   r   rd  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   rB  TFr  r  s     r*   xref_is_imageDocument.xref_is_image6  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   rt  r   pdf_obj_num_is_streamr  s      r*   rp  Document.xref_is_stream>  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   rC  TFr  r  s     r*   xref_is_xobjectDocument.xref_is_xobjectE  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)   rX  r^  s      r*   rY  Document.xref_lengthM  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   rF  r   r   r   r  r  r  r7  r  r{  r  JM_EscapeStrFromBuffer)
r)   r  rD  r  rL   r^  rX  r  r"  r   s
             r*   rF  Document.xref_objectU  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   rO	  z	bad 'key'r   r   Nzbad 'value'r  )r   r   rC   r  INVALID_NAME_CHARSintersectionr  r   r   r  r  r  r7  r  JM_set_object_valuer   r  r  rP  rR  r  r  )
r)   r  r  r   r^  rX  r  rJ  rJ   rd  s
             r*   r  Document.xref_set_keyh  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^  rX  r  r!  r"  s          r*   rK
  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  r0   s    r*   r
  Document.<lambda>  s    DMMr,   )r  r  r  r  r  r;  r  r  r	  r   r  r  r  r	   r   r  r   )returnrt  )r  r  )rd  r9   r  r   )rd  r  r  z
list[Page])rd  ztuple[int, int]r  r   )NNNNr   r   r  r  r9   r  r  )r  r9   r  r  )r  r  r  )r  
'Document'r  r  r  r9   r  r9   r  r9   r  r  )r  r  r  r   )r  r  r0  r  r  r9   r  r9   r  r9   r  r  )rH   typing.Union[int, str]r  r9   ro  ru  r   r   )r  r9   r  r  r  r  r  r9   r  r9   r  r9   r
  )r  S  J  NNr   NN)r  r   NN)r  rt  r  rt  r  r  )r   r  r   )r  )rv  r9   r   r9   )rv  r9   )r   r  r1  
ByteStringrk   rq  rO  rq  r  rq  r  r  )rH   r  )rH   r  r  r  )rH   r  r  r:   r  r   )rH   r  r1  OptBytesrk   rq  rO  rq  r  rq  r  r  )r   r   N)r   FTTTFFFFFr     NNTr   r   r   F)r  r   N)r.  r  r  r9   r  r9   r  r9   r'  OptDictr  r   )r.  r  r  r9   r  r9   )r.  r  r  r9   r  r:   rp  )rv  r9   rf  rt  r  r   )r.  r  rv  r9   r  r   r  r)  r  r   r  rt  r  rt  r  'Pixmap')r   NNNF)r.  r  rv  r9   r~  r  r  r   r  OptIntr  
'TextPage'r  rt  r  
typing.Any)rv  r9   r  r   r#  )r.  r  r  rt  r  r   )r.  r  r  rt  )r  r  r  r  TTr   r   )Nr  r  r  helvNrm  )r.  r  rv  r9   r   ztyping.Union[str, list, None]r   r  r  r  r/  r  r   r  r  rq  rl  rs  r  r9   r.   )Nr   r   r  r  r:   )
r.  r  rv  r9   r  r  r/  r  r  r   )r  r  r  r  r  r  r  zcollections.abc.Iterable[Page]r  )r   r   r  r   r   )
Nr   r   TTTTTFNrn  )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NNr   r   r   F)TTTTTTTr   TTTTT)r.  r  rM
  rt  rN
  rt  rO
  rt  rP
  rt  rQ
  rt  r  rt  rR
  rt  rS
  r9   rT
  rt  rU
  rt  rV
  rt  rW
  rt  rX
  rt  r  r  )FNNN)r.  r  rv  r9   r   r  r^
  rt  r  r   r  r9   r  r  r  r   )NNNNN)rR	  r:   r  rt  )r.  r  r  r:   r  r  )r.  r  r  r9   r  r9   r  r  )r   NNN)r.  r  r  r9   rL  typing.Union[list, None]rW  rq  rX  r  r  r9   )r	  r  )r	  r  )r.  r  r  r   r  r9   r  r9   )NNNNNNNr   )r.  r  r  r9   r
  r  r  r  rv  r  r  rq  r  rq  r   r   rk   rq  r  r  r  r  FF)r.  r  rC  rt  rD  rt  r  r  )r   Nr   r   )FFFFFFFFFFFFr   r  NNr   r   r   F)
r.  r  rr  r9   rs  r9   rn  r   r  r  )r2   r3   r4   r5   rw  r  r  r  typingoverloadr  sysversion_infor   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,  r9  r  r  rI  rN  rv  rQ  rX  rv  r{  r  r  rr  rs  r  r  r  r  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r-  r2  r9  r=  r  rO  r`  r  rg  rk  ro  rv  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  rq  r|  r  r  r  r  r  r  r  r	  r	  r	  r	  r	  r	  rG  r$	  r/	  r2	  r  r?	  rE	  rR	  rU	  r   rc	  r  r  rq	  r  rq  r{	  r	  r  r	  r	  r@  rE  r  r  r	  r	  r	  r  r	  r	  r
  r  r0
  r4
  r[
  rd
  rk
  r  ry
  r
  r
  rF
  r  r
  r
  r
  r
  r
  r
  r
  rL  rT  rG  rL
  ra  r   r  r  rt  r  r
  r  r  rp  r  rY  rF  r  rK
  rq  r  	__slots__r  	is_streamr6   r/   r,   r*   r   r     s   ,;. __  6!		 
	 
	 
	!W<rX)($$ $@9+  w@w@w@ w@ 	w@
 w@ w@|  DPDPDP 	DP
 DP DP DPL
>
+-^%("HDL%<@)" (	/6 p0)	8	 
'H8  (/DL
9 &*4 @$ 3 3$.;2<&
C P ##$$$ $ 	$
 $ $L)&	*,  $"#(  	
  >/bB  !+/b/6 v  $ccc c 	c
 c cJ,2"-^AHF$$
K< #'%)"!!!  	! #! ! ! ! !L !" #'LLL L 	L
 L !L L L*$  444 4l"
{0 )\ 37 "#  0 	
      D t(n $ $    ,   ; ;  	8&P
"
4% 9 9 / /2(<%  :;(  0   	  	
 $/*$ 	5 	5("    (:H  0/ 9v*8 U,n2AL  !-\?|/"Y $( $#' $#!#!"!%!%$(#!%Y;Y; Y; Y; !	Y;
 Y; Y; Y; Y; Y; Y; Y; "Y; Y; Y; Y;~  "#'"
"
"
 "
 	"

 "
 "
 !"
 "
H 6?/B:".;z0 -1!+/GGG +G 	G
 )G GR1 / *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+p	3(2$     !+0d+ 2 2
 NR !3 !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/   r0   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)rC   r  r@   r   r   FzDocumentWriterPathType_PDFr   r	  OutputType_PDFrU  )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   rE  )r)   r2  	mediabox2rP  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   r0   s    r*   r  DocumentWriter.close  s    &&		2r,   c                D    [         R                  " U R                  5        g r.   )r   fz_end_pager   r0   s    r*   end_pageDocumentWriter.end_page  s    499%r,   r!  Nra   )r2   r3   r4   r5   r  r  r   r  r  r  r6   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  i  c                *    [        U 5      [        La  g g r.   )r   r  r0   s    r*   rY  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'rO	  \r   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanr   )r@   r  rC   r  r  r   r  r  rw   r8   fitz_fontdescriptorsru  pymupdf_fontsmyfontBase14_fontdictr=   r   r  JM_get_fontr   )r)   r   r  r  scriptrG  r  is_bold	is_italicis_serifembedfname_lowerr  rF  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                    S3$ )NzFont('r  r   r0   s    r*   r   Font.__repr__+   s    		{"%%r,   c                B    [         R                  " U R                  5      $ )z Return the glyph ascender value.)r   fz_font_ascenderr   r0   s    r*   r  Font.ascender.        %%dii00r,   c                6    U R                   R                  5       $ r.   )r   fz_font_bboxr0   s    r*   r3  	Font.bbox3   s    yy%%''r,   c                    [         R                  " [         R                  " U R                  R                  R
                  5      5      n[         R                  " U5      $ r.   )r   r.  ll_fz_keep_bufferr   r   r	  fz_buffer_extract_copy)r)   r1  s     r*   r	  Font.buffer7   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_fallbackrp   r  )r)   r   r   rG  r  wmode
small_capsrF  r   chr  gidr  s                r*   char_lengthsFont.char_lengths<   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   r0   s    r*   r  Font.descenderK   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/   )bitsrL   rK   s     r*   bFont.flags.<locals>.bZ   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   rC   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!  rK   s                   @r*   r  
Font.flagsP   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_rG  r  r  r  rF  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_glyphry  )r)   charrG  r  r  rF  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  r0   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%  rG  r  rD  r  rF  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   r0   s    r*   r  Font.is_bold   s    $$dii00r,   c                B    [         R                  " U R                  5      $ r.   )r   fz_font_is_italicr   r0   s    r*   r  Font.is_italic   s    &&		22r,   c                B    [         R                  " U R                  5      $ r.   )r   fz_font_is_monospacedr   r0   s    r*   is_monospacedFont.is_monospaced   s    **DII66r,   c                B    [         R                  " U R                  5      $ r.   )r   fz_font_is_serifr   r0   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  rB  r  s        r*   is_writableFont.is_writable   s    r,   c                F    [         R                  " U R                  5      nU$ r.   )r   fz_font_namer   rg  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  rC   r  r  MSG_BAD_TEXTr  r  r  r  )r)   r   r   rG  r  r  r  thisfontrF  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*   rR  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_gidsrd  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   )r2   r3   r4   r5   rY  r   r   rv  r  r3  r	  r  r  r  r%  r*  r  r/  r2  r  r  r<  r  rG  r   rO  rR  r\  r6   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 rX  )r   r  r   r0   s    r*   rY  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)   r.  dstmap_s       r*   r   Graftmap.__init__   s(    s#&&s+	r,   rn  N)r2   r3   r4   r5   rY  r   r6   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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   r0   s    r*   rY  Link.__del__ !  s    r,   c                R    [        U[        R                  5      (       d   eXl        g r.   )rC   r   FzLinkr   )r)   r   s     r*   r   Link.__init__!  s    4....	r,   c                H    [        U 5        S[        U R                  5      -   $ Nzlink on rl  r  r   r0   s    r*   r   Link.__repr__!      DC,,,r,   c                H    [        U 5        S[        U R                  5      -   $ rn  ro  r0   s    r*   r   Link.__str__!  rq  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)   r.  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$ ru  )r   r   r   r  r   r  r  rv  s         r*   _colorsLink._colors!  sM    sQ/~~))3a8""l++X&r,   c                     S U l         SU l        g rX  )r   r   r0   s    r*   r   Link._erase#!  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$ ru  )r   r   r   r  r  )r)   r  r.  r  r^  rw  r  s          r*   
_setBorderLink._setBorder'!  sG    sQ/~~))#Q7""X6r,   c                v    U R                  U R                  R                  R                  U R                  5      $ r.   )rx  r   r   r  r0   s    r*   r  Link.border1!  '    ||DKK..33TYY??r,   c                v    U R                  U R                  R                  R                  U R                  5      $ r.   )r{  r   r   r  r0   s    r*   r  Link.colors5!  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  r8   r  linkDest)r)   r.  r  s      r*   r	  	Link.dest9!  s     4""t{{':>??;;''4;;+=+=+J+J;<<kk  txx22377C""488,C3''r,   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  )rl  r   r|  r  r  r9   )r)   r.  r  s      r*   r  
Link.flagsI!  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)
rl  r  r   Link_is_externalr   r   r  rt  r   fz_is_external_linkr)   	this_links     r*   r  Link.is_externalT!  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   ra   )r   r   rl  r  r   	Link_nextr[  rg  r   r   rV  rW  r  rt  r   r  r  )r)   r  ra  
link_xrefslink_idsr  s         r*   r[  	Link.next_!  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)rl  r   r   rl   rm  r   r(  r  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   r:   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  )rl  r   r   r:   r=   rw   r  r  r@   r  r  r<   r   )r)   r  r  r   r.  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 )Nrz  zbad 'flags' valuer  )	rl  r   r|  r   r   r9   r  r  r  )r)   r  r.  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.ra   )r  r   link_urir   r   r  r  s     r*   r  Link.uri!  sD     ;>>$)),,II	+4+?+?y##''GRGr,   r  rl  r  )Nr   NNro  )r2   r3   r4   r5   rY  r   r   r   rx  r{  r   r  rv  r  r  r	  r  r  r[  r   r  r  r  r  r   r6   r/   r,   r*   rg  rg     s    -- @ @ @ @ ( (   K K  6 	 	K
,( H H Dr,   rg  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   rn  r   
r@   r|  r!   r  r  r@  re  r  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  r0   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  r@  re  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  r@  re  r  r<   r   r  r  rC   r   ry  r@   r  radiansroundcossin)r)   r!   r  r  r@  re  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/   r0   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  r@  re  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  r@  re  r  r0   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  r0   s    r*   __nonzero__Matrix.__nonzero__"  r  r,   c                    [        U 5      $ r.   )r|  r0   s    r*   __pos__Matrix.__pos__"  s    d|r,   c                0    S[        [        U 5      5      -   $ )Nr|  r  r   r0   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   rn  r   index out of range)r  r!   r  r  r@  re  r  r  r)   rd  rK   s      r*   __setitem__Matrix.__setitem__""  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  r@  re  r  util_invert_matrixZeroDivisionErrorr  )r)   r  r  m2s       r*   __truediv__Matrix.__truediv__7"  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  r@  re  r  )r)   onetwos      r*   r  Matrix.concatA"  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  r@  re  r  )r)   r0  rc  s      r*   r  Matrix.invertH"  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!   r@  r0   s    r*   is_rectilinearMatrix.is_rectilinearU"  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  r@  r  r  r  r  )r)   r  r!   r  radr  r  s          r*   	prerotateMatrix.prerotate["  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  r@  )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  rK   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  re  r!   r  r  r  r@  )r)   txtys      r*   pretranslateMatrix.pretranslate"  sW    2Y2Y"vv+VV++"vv+VV++r,   r.   ) r2   r3   r4   r5   r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r  r  rv  r  r  r  r  r  __inv____div__normr6   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   )hashr0   s    r*   __hash__IdentityMatrix.__hash__"  s    M""r,   c                2    [         R                  U SS5        g )Nr  )r|  r   r0   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/   r0   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)r2   r3   r4   r5   __doc__r  r   r   r  r#  r6   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 )Nra   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;   r:   r   )r  rG   rL   rH   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%  r9   )r   r;   rc  rH   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   rn  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r   z//zpage=r)  rd   T)$r  r	  	file_specr  is_mapis_urir
  r  r  ltr:   r  
new_windowr   r  r  r8   r   r  r  r  rer~  r9   groupr  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr
  r=   r  r;   r<   r	  rC   )r)   r  rlinkr   isExtisIntr+  r1  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	  r4  r  r5  r6  r  r7  r  r8  r   r  r  r.   r2   r3   r4   r5   r%  r   r6   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)rX  i)#  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 )NrD
  r   r   r   r   Helvra   )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  r0   s    r*   r   Widget.__init__.#  s     !!!%"#!!! 		r,   c                <    SU R                    SU R                   S3$ )NzWidget:(field_type=z script=r  )rS  r  r0   s    r*   r   Widget.__repr__S#  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.
        rG  N)CourTiRorG  ZaDb)rV  r  )r)   valid_fontsr  s      r*   _adjust_fontWidget._adjust_fontV#  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  rE  ra   ASz/OffN)rR  rP  r   r   PDF_WIDGET_TYPE_RADIOBUTTONrO  r@   r   r  r  r   r  r9   r  r;   r  )r)   r.  	kids_type
kids_valuer  r  s         r*   _checkerWidget._checkerd#  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'.
NrG  r   rF  Tfr   r   ra   grgr   )rZ  r;   rV  r  rV  rW  r   )r)   r  r/  rc  datrd  rH   r  s           r*   r  Widget._parse_day#  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UnnamedNrF  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   rM  rN  r  r%  r\  r   rI  rW  rH  rt
  rR  r   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXrn  r  r   r  r^  r]  r\  r[  r_  r`  rq  )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  Ffr-  z0warning: malformed PDF, Parent has no Kids arrayr  rX  T)r  r   r   r   r7  r  r	  r  rM  rP  r6  rw   rP  r  r  r  r  )
r)   r.  r^  
pdf_widgetr  r/  rd  r0  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   r:   r   r   r
  rO	  r  r  r   zAP/Dr  )	rR  r@   r   r  r  r;   rp   r9   rF  )r)   r.  r  statesAPNnstatesapntra  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[  r0   s    r*   r[  Widget.next=$  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  Nrl  z(warning: radio button has no 'On' value.T)rR  r  r:   ru  rw   )r)   bstater  rK   s       r*   on_stateWidget.on_stateA$  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  r0   s    r*   rG
  Widget.resetV$  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.ra   r   !{:g} {:g} {:g} rg /{f:s} {s:g} Tfr   z{:g} g /{f:s} {s:g} Tfrn  z%{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tfr  r  N)r  ri  rZ  r<   r   r  rV  rW  r^  util_ensure_widget_calcr  r  _save_widgetr  )r)   
sync_flagsr   s      r*   rF  Widget.update[$  s     !Q&5EC!Q&*T]]:C!Q&9DMMIC

DOOt~~&*&8&8: #DKK0 	4;;- r,   )rZ  r%  rJ  rH  rI  rT  rK  rQ  rP  rN  rM  rR  rS  rO  r\  rU  rL  r   r  r_  r^  r]  r`  r\  r[  r   rV  rW  rY  rX  r  Nrp  )r2   r3   r4   r5   r%  r   r   ri  rq  r  r  r  r  rv  r[  r  rG
  rF  r6   r/   r,   r*   rX  rX  )#  sX    #JT=*>EN+Z/b    *)
r,   rX  )_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)   r9  s     r*   r   Outline.__init__$  s    	r,   c                    [        U SS5      $ )zoutline destination detailsNr  r0   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)   r9  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      $ rX  )r  r  Outline_is_externalr   r   r  r   r  )r)   r9  r  s      r*   r  Outline.is_external$  sY    ; --tyy99YY}}mm;((--r,   c                D     U R                   R                  R                  $ r.   )r   r   r?  r0   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)   r9  next_ols      r*   r[  Outline.next$  r  r,   c                X     U R                   R                  R                  R                  $ r.   )r   r   r   r0   s    r*   r   Outline.page$  s!    99'',,111r,   c                B    U R                   R                  R                  $ r.   )r   r   r  r0   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   ra  r0   s    r*   ra  	Outline.x$      yy##%%%r,   c                B    U R                   R                  R                  $ r.   )r   r   rb  r0   s    r*   rb  	Outline.y$  r  r,   r   r!  N)r2   r3   r4   r5   r   rv  r	  r  r  r  r?  r[  r   r  r  ra  rb  r  r6   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)   ctxr.  chainstruct_parents	transformr  s          r*   filter._make_PdfFilterOptions.<locals>.Factory.filter$  s9     77&!

++- r,   )r  )r2   r3   r4   r5   r   r  r6   __classcell__)r  r  s   @r*   Factoryr  $  s    # r,   r  )r   PdfFilterOptionsr  r  r  	no_updaterC   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                  l   \ 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SNS jrSS jrS rS rS rS rS rS rSS 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&SS* jr'SS+ jr(   S             SS, jjr)SSSSSS	SS\	R                  S
S	S	SSS-.                             SS. jjr*  S SS/ jjr+SS0 jr,SS1 jr-SS2 jr.SS3 jr/SS4 jr0       S               SS5 jjr1    S SS6 jjr2SNSS7 jjr3SSS8 jjr4SSS9 jjr5SSS: jjr6SS; jr7S< r8S= r9SS> jr:   S         SS? jjr;SS@ jr<SA r=SB r>\?SC 5       r@\?SD 5       rASE rBSSF jrC\?SG 5       rD\?SH 5       rESI rFSSJ jrGSK rHSSL jrI\?SSM j5       rJ            S                                   SSO jjrK           S                             SSP jjrL            S                                 SSQ jjrM          S                         SSR jjrN           S                           SSS jjrO            S                             SST jjrP           S                           SSU jjrQ            S                           SSV jjrR             S                                   SSW jjrS           S                             SSX jjrT           S                             SSY jjrUSSZ jrV\?S[ 5       rW\?S\ 5       rX\?S] 5       rYSS^ jrZSS_ jr[S` r\SSa jr]SSSb jjr^  S       SSc jjr_SSSd jjr`Se raSSf jrb\cSSSSS#Sg.             SSh jjrdSi re  S       SSj jjrfSSk jrgSNSl jrhSSm jriSSn jrjSSo jrk S     SSp jjrlSq rmSr rnSs roSt rpSu rqSSSv jjrrSw rsSx rt  SSz jruSS	SS	S	S
S#S#SS{.	 SS| jjrvSSS	S#SS	S#SS	SS	S	S}.S~ jrwSSS jjrxSSSySS	S	SSSS
S	S	SS#S
S
S	S.                                       SS jjrySySS	S	SSSSS
S	S	S	S
SSS#S
S
S	S.                                             SS jjrz\?S 5       r{\?S 5       r|SS jr}SS jr~S rS r\?S 5       r\?S 5       rS rS rS rSSSS.   SS jjr\?S 5       r\?SS j5       rS rSSSSS. SS jjrS rS rS rS rSS jrS rS rS r      S SS jjr\?S 5       r\?S 5       rSS jrSS jrS r        S   SS jjr\?S 5       r\?" \BSS9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: Tra   )rC   r   r   r   r   r   
last_point	draw_contr:   rV  r   r   r   r5  )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   r0   s    r*   r   Page.__repr__%  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U(       aZ  U R                  R                  nU R                  R                  b  SnUS:X  a  SnSU SU SU R                  R                  S S	3nU$ SU 3nU$ )
Nr   r  ra   znew PDFr  z of <z, doc# r@  >)r   rC   r   r   r   pdf_pager   r5  r   r   r	   r  )r)   r   r5  ra  rL   s        r*   r   Page.__str__"%  s    x.dii**ENN;;YY))//66FYY))00F  A{{!!-Bw&qc1F1Fq0IKC 
 &"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_annotrG  pdf_annot_rectrn  ra  rb  r  r  r  r  r  rT  JM_add_annot_id)r)   rf  r   r   r  r!  s         r*   r  Page._add_caret_annot5%  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  rK  r  )r  r  r+  r   r  r,  r   r  rI  r  fz_make_rectra  rb  r  r  r  r  r  PDF_ANNOT_IS_PRINTr  pdf_set_annot_icon_namer  r.  rR  r  r	  r  rT  r  r   )r)   rf  r1  rk   rO  r  iconr   ufr@  r  filebufr   r!  r  r  s                   r*   _add_file_annotPage._add_file_annotD%  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  r8  r  FreeTextCalloutr  ) r  r   r?  r  r   r  r  r  r  rH  r  r  r  r	  r  rM  pdf_set_annot_quaddingrN  pdf_set_annot_border_widthr  pdf_add_annot_border_dash_itemr  rR  pdf_set_annot_callout_styler<   r   JM_set_annot_callout_liner   r  rT  r  r   )r)   r   r   r   r   r   r\  r%  rI  r  calloutline_endrZ  r  r]  richtextr  r   r   r`  ra  ntcolr-  r!  r   r#  r@  point_countr  s                                r*   _add_freetext_annotPage._add_freetext_annot_%  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   ry  r\  rn  fz_invert_matrixr  rJ  r  r<   rO  r.  rP  PySequence_Sizer`  r  rQ  ra  rb  r8  rR  r	  rT  r  r   )r)   r   r   r  inv_ctmr   r#  n0inklistr  sublistn1r  rd  r  rf  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  rB  r  pdf_set_annot_linerT  r  r   r   )r)   rB  rC  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_vertexrT  r  r   )r)   rA  r(  r   r   r  rf  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   r7  r   DAr   r  )r  r   r  r   JM_quad_from_pyfz_rect_from_quadr  r?  rO  r.  rP  rQ  rR  r  r	  r  r  r  rM  rT  r  ll_pdf_keep_annotr   r   r   )r)   rE  r   da_strr  r   r   r   ra  r`  r   qr!  ro  rd  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  rT  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<   rP  rC   r  r  r  r  r  
read_bytesr  r  r>   r  r  r  rK  r  fz_new_image_from_bufferr   r  r  r  r/  r   r!  ra  rb  r  r  pdf_set_annot_stamp_imagerR  r  r	  r  r  rT  r  r   )r)   r   stampr!  r   stamp_idrJ   r  r   r   fzbuffr.  r   r  scaler  r/  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  rL  r  r  ra  rb  r  r  r  r  r  r  r  rT  r  r   )r)   rf  r   r  r   r  r   r!  s           r*   _add_text_annotPage._add_text_annotW&  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$ )Nrz  )	rl  r   r|  r   Page__add_text_markerr  r  rV  rW  )r)   r^
  r(  r  s       r*   _add_text_markerPage._add_text_markere&  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S	 S
3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S	 S3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 r@  r   r   z.
)rl  r  r   Page_addAnnot_FromStringr  r  r   r   r<   rC   r   r   r   r  r  r	  r   rE  rP  JM_StrAsCharrw   rF  r.  r  r  r  r8  rl   r  r{   )
r)   linklistr   lcountrd  r  txtpyr   r   r  s
             r*   r  Page._addAnnot_FromStrings&  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9!Aa@AD,,dhhj:Mtxxz[_:`a00$((*e>N>NPU>VXYZ$$f6   D''N,<9!Ac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  r.  JM_create_widgetr   r   r  r   )r)   rR  rM  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_pager.  )r)   r   rB
  graphicsr   rS  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rX  )_reset_annot_refsr   r  rl   r{   r   r5  r   r0   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,   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S 3nXR                  5       ;   a   US	-  nSUS 3nXR                  5       ;   a  M   U R                  X5        U$ )
Nr   TrC  	/Type/OCGrS  zbad optional content: 'oc'MCr@  r   )r   rF  r   _get_resource_propertiesru  r  _set_resource_property)	r)   r  r.  checkpropsr  ra  rd  mcs	            r*   _get_optional_contentPage._get_optional_content&  s    :qkkt4u$(=9::113DA!H 49!AZLLN"FAaU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*   rm  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  rO  _globalsr   fz_enable_device_hintsFZ_NO_CACHErC   r   r   r   r   fz_run_pageri  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 maskr9  r   XObjectr  
q
z cm
/z Do
Q
);r   r.  r  r.  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  r>  fz_compressed_image_bufferbpcfz_image_resolution$fz_new_image_from_compressed_buffer2r   pdf_add_imager  r  r  r  rV  r  calc_image_matrixr  r	  r   r!   r  r  r@  re  r  fz_append_stringJM_insert_contents)0r)   rk   pixmapr	   imaskr  overlayr]  keep_proportionr  r  r/  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  imagerQ  maskstatecbuf1r  r  xresyresrf  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$ )Nr9  r   r  r   zcannot insert font)r  r.  r  r   r  r  r	  r  rV  r  r   rW  rN  r  r   r  r  )r)   r   r  r  r  
set_simpler  r  r  r  r  r   r^  r   rf  r  r8  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)   r.  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   rn  ro  r   r   r   r   r  r6  pdf_to_rectr  rm  )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)rV  r?  r0   s    r*   rc  Page._reset_annot_refs'  s     r,   c                L   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US US 3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   fitzca02dr9  r   r=  r   r:  r;  )r9   r  r  r   r   r   r  r  r	  r   rV  r  rP  r  r  rW  r.  rX  r  )r)   gstater:  r;  r  tCAtcar   rf  rh  rJ   rd  rh  r   opas                  r*   _set_opacityPage._set_opacity'  s   7rQw9#4%Bc)*+#:C%B
S()*#:C#c3s),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  rz  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   r   r   z not in MediaBoxr  r  )r   r   r|  r(  r2  r  r  r  r  r  r  r   r   )r)   r  r   r.  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*   rn  Page._set_resource_property(  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   r9  r  z q /z Do Q )r  r  r   r   r  r.  r<  JM_xobject_from_pager   r  rW  r  rR  r	  r	  r  pdf_new_xobjectr  r  r  r   rV  r  r  )r)   
fz_srcpager  r  r  r  r  rv  r  rz	  r}  rc_xrefr  tpagerefr  xobj1subres1subresr"  xobj2rf  r  s                         r*   _show_pdf_pagePage._show_pdf_page(  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,   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)   rf  old_rotationr   s       r*   add_caret_annotPage.add_caret_annotW(  s    '-	0))%0Eq !!,/u$&x(((( q !!,/ !s   A   A: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   rA  r  r  r)   r   r  r   s       r*   add_circle_annotPage.add_circle_annotd(  k    '-	0..tU5K5KLEq !!,/$& q !!,/ !    A A+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.)rO  r  r  r   )r  r  r  r  )	r)   rf  r1  rk   rO  r  r  r  r   s	            r*   add_file_annotPage.add_file_annoto(  s}     (-
	0((' ) E q !!,/$& q !!,/ !s   A Ar   r   r   r\  r%  rI  r  r  r  rZ  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%  rI  r  r  r  rZ  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CheckMarkerArgrK  r   PDF_ANNOT_HIGHLIGHT)r)   r^
  r  r  r  r'  rL   s          r*   add_highlight_annotPage.add_highlight_annot(  s<     ='PAu%A##Au'@'@A
r,   c                    [        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)   handwritingr  r   s       r*   add_ink_annotPage.add_ink_annot(  se    
 (-	0''4Eq !!,/$& q !!,/ !   A A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)   rB  rC  r  r   s        r*   add_line_annotPage.add_line_annot(  sc    '-	0((0E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 'Polygon' annotation.r   )r  r  r   rD  r  r  r)   rA  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   rC  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   r@  r  r  r  s       r*   add_rect_annotPage.add_rect_annot(  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.NrG  r  rF  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  rp   r  r4  )r)   rE  r   r   r   r  r   r   r&  r&  r   r  r   r6  r8  r9  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  rK  r   PDF_ANNOT_SQUIGGLYr)   r^
  r  r  r  r'  s         r*   add_squiggly_annotPage.add_squiggly_annot:)  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  rD  r  r  )r)   r   r@  r  r   s        r*   add_stamp_annotPage.add_stamp_annotH)  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  rK  r   PDF_ANNOT_STRIKE_OUTr)  s         r*   add_strikeout_annotPage.add_strikeout_annotS)  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  rG  r  r  )r)   rf  r   r  r  r   s         r*   add_text_annotPage.add_text_annot[)  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  rK  r   PDF_ANNOT_UNDERLINEr)  s         r*   add_underline_annotPage.add_underline_annotf)  s6    ='PAu%A$$Q(A(ABBr,   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).rz  NT)rl  r   r|  r   r  rV  rR  rM  r   r  r  rV  rW  r  rF  )r)   rZ  r.  r   s       r*   
add_widgetPage.add_widgetn)  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  )rl  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_list2r0   s    r*   rt  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_POPUPrR  r@   rt  
load_annot_yielded)r)   types
skip_typesr!   rt  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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  r{   r  ceilr/  r   rb  blr  )

annot_rectnew_textr  r/  
text_widthline_heightr  r  r!  rb  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  rz  )rI  FzError applying redactions.r   r   )r   rl  r   r  r   r   r   r   r  rn  )r   r   rl  r  rO  T)rl  r   r  r   r   r|  r  r   r   rp   r  r`  	new_shape	draw_rectfinishru  r=   insert_textboxcommit)r   rB
  r^  r   rX  r.  redact_annotsr   r   shaperedactrT  r   rU  r  r.  r/  rl  trects                      r*   rI
  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_pager5  )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(  r{  r   r|  r   rq  r   r  r   pdf_clip_page)r)   r   r  r  pclips        r*   clip_to_rectPage.clip_to_rect*  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  rz	  r2  r(  r  r)   r   r  s      r*   artboxPage.artbox7*  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   rx  ry  s      r*   bleedboxPage.bleedbox@*  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)rG
  r  )rl  r   r   r   ry  r(  r{  r   r|  rz	  r  r/  rt  r  mupdf_warningsr  rw   )r)   r   r  cbr   r  r   s          r*   bound
Page.boundI*  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_contentsr.  )r)   r  r   r  s       r*   r  Page.clean_contents[*  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  )	rl  r  r   r   ry  r   ry	  r  r(  )r)   r   r  s      r*   rz	  Page.cropboxd*  sU     	D~~u~-%%dii0CTXXZ(C3i
r,   c                .    U R                   R                  $ r.   )rz	  r   r0   s    r*   cropbox_positionPage.cropbox_positionq*  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)rl  r  r  r   r   r  rS  r   r   r  r  r   rV  rW  r   )r)   r   r   r  	nextannotr  s         r*   delete_annotPage.delete_annotu*  s    DE~~)%**5I""48  ((4	tZZ0ICK t,CJ.1JJ""2c7+
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   rW  r   )rV  r   rl   r  r{   )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   )rl  rC   r:   r   r   r   r  r   r  r  r	  r  rP  r  r  r  r  r.  rR  rW  )	r)   r  r  r   r  r  r  oxrefrd  s	   ``       r*   rH
  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)
rl  r   r   r[  r  r  r   r   r  ru  )r   rZ  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   rn  UNITr]  )r)   r  s     r*   rr  Page.derotation_matrix*  sk     ;%44dii@AA..%.0!!%,,u||'8'89::-g677r,   rm  c                    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.rl  r   r  r  lineCaplineJoinr#  	closePathstroke_opacityfill_opacityr  )rZ  draw_bezierr  r\  r^  )r   rB  rC  p3p4rl  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,   c                    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.
rl  r   r  r  r  r  r#  r  r  r  )rZ  draw_circler  r\  r^  )r   r  radiusrl  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  )rZ  
draw_curver  r\  r^  )r   rB  rC  r  rl  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
rl  r  r  r  r  r  r#  r  r  r  )rZ  	draw_liner  r\  r^  )r   rB  rC  rl  r  r  r  r  r  r#  r  r  r  r.  r  s                  r*   r  Page.draw_lineL+  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  )rZ  	draw_ovalr\  r^  )r   r   rl  r   r  r#  r  r  r  r  r  r  r  r.  r   s                  r*   r  Page.draw_ovaln+  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  )rZ  draw_polyliner\  r^  )r   rA  rl  r   r  r  r#  r  r  r  r  r  r  r  r.  r   s                   r*   r  Page.draw_polyline+  se    " nnf%

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

7r,   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  )rZ  	draw_quadQuadr\  r^  )r   rE  rl  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  )rZ  r[  r(  r\  r^  )r   r   rl  r   r  r  r  r  r#  r  r  r  r  r  r.  r   s                   r*   r[  Page.draw_rect+  sh    & nnMM$t*VM4

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

7r,   c                    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

fullSectorr  )rZ  draw_sectorr  r\  r^  )r   r  rf  betarl  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,   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 squiggly line from point p1 to point p2.breadthFr  )rZ  draw_squiggler  r\  r^  r   rB  rC  r  rl  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  )rZ  draw_zigzagr  r\  r^  r  s                   r*   r  Page.draw_zigzagL,  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   rC   r   r  r  r  r  rH  r}  ri  r~  )	r)   r  r  r  r   rR  r  r  r  s	            r*   extend_textpagePage.extend_textpageo,  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)rl  r  r   r   pdf_first_annotr   r   r  r  r   rV  rW  )r)   r   r   r  s       r*   first_annotPage.first_annotz,  sy     	D~~u~-%%d+El]]4(
$'C!
r,   c                "    U R                  5       $ )z
First link on page
)
load_linksr0   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)rl  r  r   r   pdf_first_widgetr   r   r  r  r   rV  rW  rX  r  rY  )r)   r   r   r  rZ  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)
rl  rt  r  r   JM_new_bbox_devicer   r}  ry  ri  r~  )r)   layersr  r   r   
inc_layersr  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)rl  rt  r  r   rC   r   r   r   ry  r  r   get_cdrawingsr   callableJM_new_lineart_device_Devicery  r  ptmr}  ri  r~  )
r)   extendedcallbackmethodr  r   clipsprectr   r  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.)rl  r   r   r  r   r  rf  r6  r  rP  r  r  rp   r   )	r)   rL   r   r  r3  rJ   rd  icontr  s	            r*   rJ
  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.
)rl  r   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsrV  )r)   r  r  s      r*   get_displaylistPage.get_displaylist,  sA     	D44TYY?B==diiHB2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   rl  r  r  r  r  r  r  even_odd)r  r   r  r   scissorr:  rG   r   r   Nr9  qur  )r  rP  r<   r8   r(  	normalizer  r   r  rp   r=   object)r)   r  allkeysr  rd  npathrG   newitemsrH   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;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  hashesr   r  r  )r   r|  r   r"  TEXT_PRESERVE_IMAGESextractIMGINFOr  
get_imagesr  r  rP  r<   r=   )r   r  r  r.  imginforR  imglistr  rH   r  r  rd  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  r3  r  )r   r   r   r9   r  r   r<   r  r   r  r!  r(  r|  )r   r   r  r  rd  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.
ra   )r   r  r  r	  rr  r5  )r   rH  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   rW  )rl  r  r	  r  r   rp   r[  r|  rC  r   r  r<   rP  )r   lnr%  nlra  	linkxrefsrd  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	rx  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  r4  r6  r  zunsupported colorspace)r  )r  r  r  r  )r  r|  r   r  rt
  r  r  rJ   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  r5  r  )rt  rz  r2  r|  r  r  r  r  rr  r   r   r  r  _insert_contentsset_mediaboxr  r  r   r  r  rH
  insert_linkrl   r  rF  )r)   rx  r  mat0r}  r  r8  r  r  r  r  r   r!  r  rZ  s                  r*   remove_rotationPage.remove_rotationS.  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<c                  ^^ [        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.   rO  rP  s    r*   r
  rQ  .  s    add|r,   c                2    U R                   U R                  4$ r.   rO  rP  s    r*   r
  rQ  .  s    !$$r,   )rl  r   r(  r  r  r  r  r  rW  rP  r<   r   r!  rp   r  r  r/  )r)   r  drawingsx_tolerancey_tolerancefinal_filterparearL  r  pathsprects	new_rectsr!  repeatrd  rJ  rK  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-  )rl  r   rg  r5  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OkU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 S
3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 'r  )r  )rl  r   r   r  r   r(  r|  r   r   r   r9   rk  r5  r<   r(  rl   r{   r  JM_image_reporterrt  r  r   util_hor_matrixlllrr"  r  ur)r)   r   r  r.  inf_rectnull_matr   rH   rd  r   r  r  r  rK   r'  r3  hmr  r   m0r  s                        r*   get_image_bboxPage.get_image_bbox.  sN    	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 #@b!IJJ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   H5H5$H: :IIc                `    [        U 5        U R                  R                  U R                  US9$ )z*List of images defined in the page object.r-  )rl  r   rk  r5  r`  s     r*   r  Page.get_images1/  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.
TrC  rk  rn  rS  ocmd)rm  r   rF  rp   )r)   r   pnamer  r   octypes         r*   get_oc_itemsPage.get_oc_items6/  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      )rl  r   ry  r   r  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr  r	  r	  fz_new_svg_devicer  r  r  r  r}  ri  r~  r	  r  )r)   r  text_as_pathr2  r  tboundstext_optionr"  r	  r  r   s              r*   get_svg_imagePage.get_svg_imageI/  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  rR  r   s        r*   r  Page.get_textboxa/  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_textp/  r  r,   c                6    [         R                  " U /UQ70 UD6$ r.   )r	  get_text_blocksr  s      r*   r  Page.get_text_blockss/  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_selectionv/  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_wordsy/  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,   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  )	rl  r|  rt  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  )rl  rt  r  r   r  r   JM_new_texttrace_devicer   ry  ry  r  r  r}  ri  r~  )r)   r  r   r   r  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.)rl  r   r  r5  r0   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   rO	  r   zbad fontname chars r  )r  r  r  r  )r  china-ssjapan-skorea-sr  r   zbad fontfile)r'  )r   r   r8   r  r  r  	CheckFontr"  r-  r  r=   r  r  rl   r  r{   r  ru  r  r  r   r  r@   r   r  )r)   r   r  r  r  r  r  r.  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  rZ  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]Nra   r6  zbody {margin:1px;})htmluser_cssr  z"'text' must be a string or a Story)	scale_min	scale_maxr  rC  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_functionc0  s    88SXXt++r,   r:  r;  rO	   gs
)r]  r  r  r   r  )r   r(  r/  r  rC   r  Story	fit_scaler   FZ_PLACE_STORY_FLAG_NO_OVERFLOW
big_enough	parameterfilledr   r  r  r  r  write_with_linksr  r  r7  r  show_pdf_pager   r!  r|  ra  rb  r  r9  )r   r   r   r  r  r  r]  r  rZ  r  r  r  	temp_rectmycssstoryrect_scale_maxrC  spare_heightr  r.  r  rg  r  mp1mp2r}  r  r  s                              @r*   insert_htmlboxPage.insert_htmlbox/  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  rk   r/  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(       a3  [        R                  R                  U5      (       d  [        SU S	3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.
rz  r   r   z4xref=0 needs exactly one of filename, pixmap, streamr  r   zbad filenamezNo such file: 'r   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  r  r5  bad rotate value!rect must be finite and not emptyr  rn  fzImgr   )rk   r  r	   r  r  r  r  r  r]  r  r  r/  r  r  r  )rl  r   r|  r   rt  r   r  r@   r   ri   r
   r  r  r  r  r>   r  r  r(  r|  r{  rq  rk  r5  r  rg  r  r  r  )r   r   r  rk   r/  r  r  r  r  r  r]  r	   r  r  r.  r!  r  rd  ilstrJ   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#ohZq$ABB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:M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.ra   link kind not supportedN)rl  r	  getLinkTextr   r  )r   r  rD	  r   s       r*   r9  Page.insert_link1  s=    D!!$,B;677!!5(+r,   皙?)r   r  r   r  r  r  rl  r   rI  miter_limitrender_moder]  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  rl  r   rI  r  r  r]  r#  r  r  r  r   )rZ  r  r^  )r   rf  r   r   r  r   r  r  r  rl  r   rI  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  rl  r   
expandtabsr  r]  r  r  rI  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  rl  r   r  r  r  rI  r  r]  r#  r  r  r  r   )rZ  r]  r^  )r   r   r	  r   r  r  r  r   r  rl  r   r  r  r]  r  r  rI  r#  r  r  r  r  r.  r   s                           r*   r]  Page.insert_textboxD1  s|    Z nn!!!##%)%)   
, 7JJw	r,   c                (    U R                  5       S:H  $ )z3Check if /Contents is in a balanced graphics state.r  )rh  r0   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  rF  s      r*   rG  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    /	/c                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)rl  r   r  r9   r   r  r   r  r  r   rV  rW  )r)   identr  r   r  s        r*   rG  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   ra   r   r   )rl  r   fz_load_linksr   r   rg  r   r  r  r   rV  rW  r  r|  rt  r  )r)   r  r  ra  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)rl  r   r   JM_get_widget_by_xrefr   r  r  r   rV  rW  rX  r  rY  )r)   r  r   r   r  rZ  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  )	rl  r  r   r   ry  r   JM_mediaboxr  r(  )r)   r   r   s      r*   r2  Page.mediabox1  sQ     	D~~u~-&&		2D
+DDzr,   c                j    [        U R                  R                  U R                  R                  5      $ r.   )r  r2  r  r  r0   s    r*   mediabox_sizePage.mediabox_size1  s#    T]]%%t}}'7'788r,   c                    [        U 5      $ r.   )Shaper0   s    r*   rZ  Page.new_shape1      T{r,   c                ,    [         R                  U 5      $ )z7All /Contents streams concatenated to one bytes object.)r  _get_all_contentsr0   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)rl  r   r	  r   )r)   r.  r   s      r*   refreshPage.refresh
2  s&    Dkkt$	r,   )rk   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)rk   r	   r  r  r  N)
r   r  r   rt  r  r   rt  rJ
  rL
  r  )r   r  rk   r  r	   r.  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  )rl  r   r   r   JM_page_rotationr?  s     r*   rt  Page.rotation82  s1     	DDII2%%r,   c                >    [        [        R                  U 5      5      $ )zReflects page rotation.)r|  r  _rotate_matrixr0   s    r*   rw  Page.rotation_matrixA2  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)rl  r   r}  r   rP  r  ri  )r)   rj  r  s      r*   rl  Page.runF2  s5     	D$))RYY0A!0DennFVWr,   )r  r^
  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   r  )r^
  )
r_
  ra
  r`
  rb
  r(  rl  r"  r   r   search)r   r   r  r^
  r  r  rR  rlists           r*   rc
  Page.search_forM2  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_artboxv2  s      400r,   c                &    U R                  SU5      $ )zSet the BleedBox.r  r  r  s     r*   set_bleedboxPage.set_bleedboxz2  s      T22r,   c                x   [        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US S35        g	)
z-Set object at 'xref' as the page's /Contents.r   rz  r   rR  zxref is no streamrK  r@  rV  N)
rl  r   r   r   r|  rP  rY  rp  r  r  )r)   r  r.  s      r*   set_contentsPage.set_contents~2  s    Dkk==.//zz[))uQ 122Z((!!$''011J4($@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  rB  N)rl  r   r   r   rE  r  r	  r  r@   r  rB  )r)   rG  r  rF  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)rl  r  r  r   r  r  r   r  r0  r  r	  rE  )r)   r   r   r2  s       r*   r8  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.r8  N)rl  r   r   JM_norm_rotationr   rM  r  r	  )r)   rt  r   rx  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|  ra  rb  r  r/  r  JM_TUPLE)
srtrrn  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,   rz  r  z!clip must be finite and not empty)rn  r]  r   r  rn  fzFrmr   z%source document must not equal targetN)r  r  r  r  r  rv  r  )Tr   )rl  r   r|  r   r|  r{  rq  rq  r   r  r5  rk  rg  r  r  r  r=   r  r  r  r  )r   r   r  rv  r  r  r  r]  r  r7  r.  r  tar_rectsrc_rectr  rd  r  rJ   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  )rl  r   ry  r  r   rx  rn  r-  r\  rt  r|  rz	  r/  )r)   r  r   r2  r  s        r*   rq  Page.transformation_matrix53  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   rx  ry  s      r*   trimboxPage.trimboxH3  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.ra   r  r  r   N)rl  r	  r  r   r   rG  )r   r  r   s      r*   update_linkPage.update_linkQ3  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)rt  r   rR  r  rR  )r)   rI  r!   widget_xrefsr  rZ  s         r*   r  Page.widgetsZ3  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)rh  r  r7  )r)   pushpopprependrp   s        r*   r  Page.wrap_contentsk3  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)rZ  rl  r  ri	  )rZ  rl  )r  r  r]  r  r  )rC   r   r   r   
TextWriter
write_text	text_rectr   r  r   r  r/  r  )r   r   writersr  rl  rZ  r  r]  r  r  textdocr  writers                r*   rR  Page.write_textu3  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      $ rj  rk  r0   s    r*   r  	Page.xref3  rm  r,   zpage rectangle)r.  )rV  r  r  rs  r5  r   r   r   ro  r  r.   )r  r  r  rq  )Nr   N)NNNNNr   r   r   r   r   r   r   r  NN)r   r   Nr#  )Nr   r   N)r   Nr   r   NNN)rf  r   r  r   )r   r   r  r   )rf  r   r1  r  rk   r  rO  rq  r  rq  r  rq  r  r   )r   r   r   r  r   r  r   rq  r   rs  r\  rs  r%  rs  rI  r  r  rs  r  rs  r  r9   rZ  r  r  r9   r]  r9   r  r   ru  )r  r   )r  r   r  r   )rB  r   rC  r   r  r   )rA  r   r  r   )NNr  r   NNT)r   rq  r   rq  r   r  r  r9   r   rs  r   rs  r&  rt  r  r   )Note)rf  r   r   r  r  r  r  r   )rZ  rX  r  r   )r   r   r   )
r   'Page'rB
  r9   r^  r9   r   r9   r  rt  rn  )r   r[  r  r9   )r   r[  rZ  rX  r  rX  )r  r|  )rm  NNr   NFr   r   Tr   r   r   )$r   r[  rB  r   rC  r   r  r   r  r   rl  rs  r   rs  r  rq  r  r  r#  rq  r  rt  r  r9   r  r9   r  rt  r  r  r  r  r  r9   r  r  )rm  NNNr   r   r   Tr   r   r   )r   r[  r  r   r  r  rl  rs  r   rs  r#  rs  r  rq  r  r  r  r9   r  r9   r  rt  r  r  r  r  r  r9   r  r  )"r   r[  rB  r   rC  r   r  r   rl  rs  r   rs  r  rq  r  r  r#  rs  r  rt  r  r9   r  r9   r  rt  r  r  r  r  r  r9   r  r  )
rm  Nr   r   r   TNr   r   r   )r   r[  rB  r   rC  r   rl  rs  r  rq  r  r  r  r9   r  r9   r  rt  r#  rs  r  r  r  r  r  r  )r   r[  r   z"typing.Union[rect_like, quad_like]rl  rs  r   rs  r  rq  r#  rs  r  r  r  r9   r  r9   r  rt  r  r  r  r  r  r9   r  r  )rm  NNr   Nr   r   TFr   r   r   )r   r[  rA  r   rl  rs  r   rs  r  rq  r  r  r#  rs  r  r9   r  r9   r  rt  r  rt  r  r  r  r  r  r9   r  r  )rm  NNr   r   r   NTr   r   r   )r   r[  rE  r   rl  rs  r   rs  r  rq  r  r  r  r9   r  r9   r#  rs  r  rt  r  r  r  r  r  r9   r  r  )rm  NNr   r   r   NTr   r   r   N)r   r[  r   r   rl  rs  r   rs  r  rq  r  r  r  r9   r  r9   r#  rs  r  rt  r  r  r  r  r  r9   r  r  )rm  NNTNr   Fr   r   Tr   r   r   )$r   r[  r  r   rf  r   r  r  rl  rs  r   rs  r  rq  r  rt  r#  rs  r  r  r  rt  r  r9   r  r9   r  rt  r  r  r  r  r  r9   r  r  )r   rm  Nr   r   r   TNr   r   r   )r   r[  rB  r   rC  r   r  r  rl  rs  r  rq  r  r  r  r9   r  r9   r  rt  r#  rs  r  r  r  r  r  r9   r  r  r   Nrp  )r  rt  r  r   r  )r   r[  r  rt  r  rt  r  r   )r   r[  r  r   )r   r[  r  r   r  r)  r  r   r  rt  r  rt  r  r  )NNr   r   T)rU  r  rV  r  rW  rt  r  r   r  r  )r   r   r   r   r  r  )r  r   r  r9   r  r  )r  NNFr   r   )r  r   )r   r[  r  r:   rD	  rt  r  r  )(r   r[  rf  r   r   typing.Union[str, list]r   r  r  rr  r   r  r  rq  r  r9   r  r9   rl  rs  r   rs  rI  r  r  r  r  r9   r]  r9   r#  rs  r  rt  r  r  r  r  r  r9   ).r   r[  r   r   r	  r]  r   r  r  rq  r  r9   r  r9   r   r  r  rr  rl  rs  r   rs  r  r9   r  r9   r]  r9   r  r9   r  r  rI  r  r#  rs  r  rt  r  r  r  r  r  r9   r  r  )r  ztyping.Union[str, int]r  r   )r   TTr   r   Nr  )r   r[  r  r:   r  r  )NNTNNTr   r   )r   r[  r  r  )r2   r3   r4   r5   r   r   r   r  r  r   PDF_ANNOT_LE_OPEN_ARROWr
  r  r  r  r(  r+  rD  rG  rK  r  rV  r`  r   rh  rr  rm  r  r  r  r  r  r  r  rc  r  r  rn  r  r  r  r  r  r  r  r  r  r  r   r%  r*  r-  r1  r4  r8  r;  r@  rt  r  rI
  r	  rp  ru  rv  rz  r}  r  r  rz	  r  r  r  rH
  r  rr  r  r  r  r  r  r  r  r[  r  r  r  r  r  r  r  r  r  rJ
  r  r  r!  r(  r+  r  rz  r  r;  r]  ra  rn  r  rv  r  r  r
  r  r  r  r  r"  rB  r  r  r  r  r9  r  r]  r  rG  r%  rG  r  r  r2  r  rZ  r  r  r  rt  rw  rl  rc
  r  r  r  r  r  r8  r  r*  r  rq  rC  rF  r  r  rR  r  r   rs  r6   r/   r,   r*   r   r   %  s,    &< 22!N`@	<
BH DD
F0.4 GKJK59j"X* 	%:!BL*97r	   $   	
    <  " $ $"&!" !77%.. .
 . . . . !.  . . . . . .  !.& '.` 59*.38				 " $!< < 	<
 < < < < < <@ B B	D	C$	*-( 	mmm m 	m
 m^;,. H H H H$C 
 
  .-*X 8 8 !! # $%"##%%% % 	%
 % % % % % % % % % % "%   !%" #%$ %%V ! ! $%"#      	 
               "        N !! # $%"#!$$$ $ 	$
 $ $ $ $ $ $ $ $ $ "$  $  !$" #$T !!  $%"#      	 
             "      J !!  $%"#  4    	 
             "        J !!  #$%"#""" " 	"
 " " " " " " " ""  " " "N !!  $%"#      	 
             "        J !!  $%"#### # 	#
 # # # # # # "#  # # #T !!# # $%"##,,, , 	,
 , , , , , , , , , , ",   !," #,$ %,d  !  $%"#!!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! !N  !  $%"#!!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! !F	$   ! !  & >$|@ !''' ' 	'R"H8 : %-'+ $!!)) $)
 ')  ) ) ) )V4n VW!aR5:aRMRaRaR 
aRFB
>@C
&6  	5<?;= *:
 FJ78Qp Q# 
Q#n  zx, !#'"# "&!"   $%"#+/// */
 / !/ / / / / / /  / / /  !/" #/$ %/& "'/(  )/* +/l ## #'  !""&  $%"#/FFF ,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 * *.6$   9 9- $ $ $ L & & 2 2X ' 'R13A2=E2  z zx  $ H H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
S3S	 jrS4S
 jrS5S jr\	S 5       rS r\	S 5       rS r\	S 5       rS5S jr\	S 5       r\	S 5       r\	S 5       r\	S 5       rS6S jrS7S jrS rS rS rS r\	S8S 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       r/\	S. 5       r0\	S/ 5       r1\	S0 5       r2\-r3\r4S1 r5S2r6g)<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_viewrG  r)  r   r+  rn  FzIrectIRectr(  r   fz_new_pixmap_with_bboxrI  r  r   r9   rt  r   r  FzPixmaprC   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_irectrJ  fz_scale_pixmapra  rb  r  r  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  r   pixmap_copyfz_pixmap_samples_memoryviewr  striderJ   rP  fz_samples_setfz_samples_getr>  r  r  r  r+  rL  ll_fz_pixmap_copy_rawr@   r   fz_new_image_from_filer   r>  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTry  r   r  r  r   r   r   r  r  r  r  r	  r  r  r  rl   )8r)   r  r  r   r  rQ  spixmpixspmmpmrc  r   r  r3  r  src_pixr8  sepsrJ   src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nrb  ra  pm_isrc_ird  src_pix_alphar  samplesrx  samples2r"  r  	imagedatar   r.  r.  r  r  r.  r  r^  rX  r  r_  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  r0   s    r*   r  Pixmap.__len__4  s    yyr,   c                    [        U 5      [        La  g SnU R                  (       a*  U R                  R                  R                  R
                  nSU SU R                   SU R                   S3$ )Nr
  zPixmap(z, r  )r   r  r  r   r   r   irectr  )r)   r  s     r*   r   Pixmap.__repr__4  s[    DzV#
??--88==JBtzzl"TZZLBBr,   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_qualityrQ  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)   rk   r  r  rQ  s        r*   	_writeIMGPixmap._writeIMG4  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   r0   s    r*   r  Pixmap.alpha4  r@  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_valuerI  )r)   r   r3  s      r*   r  Pixmap.clear_with4  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  rQ  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  rG   r  rJ   )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   rl  r   r   )r)   r  s     r*   r  Pixmap.colorspace 5  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   rl  r   r  fz_copy_pixmap_rectrI  r  )r)   r0  r3  rQ  r  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  rg  s     r*   r  Pixmap.digest25  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   rl  r   r  fz_gamma_pixmap)r)   gammas     r*   
gamma_withPixmap.gamma_with85  s9     ))49955=>tyy%0r,   c                B    [         R                  " U R                  5      $ )zThe height.)r   rt  r   r0   s    r*   r  Pixmap.h@5  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   rl  r   r  rI  rJ  fz_invert_pixmapfz_invert_pixmap_rect)r)   r3  rQ  r!  s       r*   invert_irectPixmap.invert_irectE5  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_irectr  s     r*   r  Pixmap.irectR5  s#     ""499-%%r,   c                B    [         R                  " U R                  5      $ )zCheck if pixmap is monochrome.)r   fz_is_pixmap_monochromer   r0   s    r*   is_monochromePixmap.is_monochromeX5  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   rP  rp   r   rz  )rQ  offsetrJ   rL   rd  s        r*   _pixmap_read_samples0Pixmap.is_unicolor.<locals>._pixmap_read_samplese5  s7    &C1X

5//1H=> Jr,   r   FT)r   rJ   r   r  rP  )r)   rQ  rJ   r  r  r  sample0samples           r*   is_unicolorPixmap.is_unicolor]5  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   r0   s    r*   n2Pixmap.n.<locals>.n2z5  s    ~~dii00r,   )r  rv  r  rJ   r   fz_pixmap_componentsr   )r)   r  s     r*   rJ   Pixmap.ns5  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   rC   r  fz_save_pixmap_as_pdfocrr	  fz_write_pixmap_as_pdfocrr	  )r)   rk   r]  rG  tessdatarS  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   rd  )r]  rG  r  )r  r>   r  r  r  )r)   r]  rG  r  r  re  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 installedrX  r   LAr   r5  RGBAr6  )PILr  r  rw   r  rJ   r  	frombytesr  r/  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  ru  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  ru  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_OUTSIDErn	  rJ   rx  r   
samples_mv)r)   ra  rb  rJ   rx  rd  rL   s          r*   r  Pixmap.pixel5  s     ;%%dii&:&:AAAq5		,,...q5		,,...%'78II  ""%%,,JT__a1-.
r,   c                0    U R                   n[        U5      $ r.   )r  r  )r)   mvs     r*   r  Pixmap.samples5  s    __bzr,   c                ~    U R                   c%  [        R                  " U R                  5      U l         U R                   $ )z
Pixmap samples memoryview.
)rf  r   rw  r   r0   s    r*   r  Pixmap.samples_mv5  s3     #$AA$))LDr,   c                \    U R                   (       a  U R                   R                  5         g g r.   rf  releaser0   s    r*   _samples_mv_releasePixmap._samples_mv_release6  "    $$& r,   c                B    [         R                  " U R                  5      $ r.   )r   fz_pixmap_samples_intr   r0   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 S3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  r   z' cannot have alphar   r   rn  unsupported colorspace for ')r   r  r@   r   ri   r
   splitextr=   r  r   r   ru  r  r  rJ   r  r  r  r  )r)   rk   r	  r  valid_formatsr8  r  r  s           r*   r  Pixmap.save6  sU     >S Xz**8}HXv&&}}H>WW%%h/FAWF5;}VHHU=CUCUCW=X<YZ[[::#*q(;<==??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   rn  r   rr  rs  rt  rC   r   r   r<   rP  r  r  r   Pixmap_set_alpha_helperr  r   rz  ry  )r)   alphavaluespremultiplyopaquematter  r  r  rJ   r   r  balenr  r  zero_outbgroundrd  r  data_lenr  r  data_fix	fz_mul255s                          r*   	set_alphaPixmap.set_alpha46  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   rn  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   ru  r  r  rJ   r  r  r  r  )r)   r	  r  r0  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  rQ  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   ra  rb  )r)   ra  rb  rQ  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  rJ   rP  MSG_BAD_COLOR_SEQr   r  rg  r  ry  )	r)   ra  rb  rl  rQ  rJ   r  rd  rx  s	            r*   rK  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   rJ   rP  r  r   rL  rp   rI  JM_fill_pixmap_rect_with_colorrt  )	r)   r3  rl  rQ  rJ   r  r  rd  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   rg  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   r0   s    r*   r  Pixmap.size6  s     $$dii00r,   c                6    U R                   R                  5       $ )z%Length of one image line (width * n).)r   rx  r0   s    r*   rx  Pixmap.stride6  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  rJ   rw   r   fz_tint_pixmapr   )r)   blackwhites      r*   	tint_withPixmap.tint_with6  s=    $//"3"3a"7>?##TYY==r,   c                B    [         R                  " U R                  5      $ )z
The width.)r   rs  r   r0   s    r*   r   Pixmap.w7  r@  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  ri  rh  rg  r   fz_warp_pixmapr   r  )r)   rE  r  r/  r'  rA  rc  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   r0   s    r*   ra  Pixmap.x7         ++r,   c                6    U R                   R                  5       $ )zResolution in x direction.)r   r  r0   s    r*   r  Pixmap.xres7       yy~~r,   c                B    [         R                  " U R                  5      $ )zy component of Pixmap origin.)r   fz_pixmap_yr   r0   s    r*   rb  Pixmap.y7  rk  r,   c                6    U R                   R                  5       $ )zResolution in y direction.)r   r  r0   s    r*   r  Pixmap.yres7  rn  r,   c                \    U R                   (       a  U R                   R                  5         g g r.   r  r0   s    r*   rY  Pixmap.__del__%7  r  r,   )rg  rf  r   r
  r\  r.   )r   NN)TengN)r  r  )N_   )Nr   NN)r  rw  )7r2   r3   r4   r5   r   r  r   r  r  rv  r  r  r  r  r  r   r  r  r  r  r  r  r  rJ   r  r  r  r  r
  r  r  r  r  r  r  r?  r  r  rH  rK  r  rT  r  rx  r_  r   rf  ra  r  rb  r  r  r/  rY  r6   r/   r,   r*   r  r  3  s   V#pC*F 0 0V+  i  
1 1 1 & &
 9 9  * 
5 
5&***"$"$   
  
 ' 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  ra  rb  r0   s    r*   r  Point.__abs__,7  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  ra  rb  r<   r   r)   r  s     r*   r  Point.__add__/7  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  r0   s    r*   r  Point.__bool__67  r  r,   c                b    [        US5      (       d  g[        U5      S:H  =(       a	    X-
  (       + $ )Nr  Fr   r  r  s     r*   r  Point.__eq__97  s)    q)$$1v{-DH~-r,   c                8    U R                   U R                  4U   $ r.   ra  rb  r  s     r*   r  Point.__getitem__>7  s    ""r,   c                *    [        [        U 5      5      $ r.   r  r   r0   s    r*   r  Point.__hash__A7      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   r}  r   r   r  zPoint: bad argsN)
ra  rb  r<   r   r  rC   r   r_  fz_pointr@   )r)   ra  rb  r  rP  s        r*   r   Point.__init__D7  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/   r0   s    r*   r  Point.__len__f7  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  ra  rb  r<   r  )r)   r  r  s      r*   r  Point.__mul__i7  s}    1k""!TVVaZ001m$$Q166AaD=466AaD=00$K{{1~r,   c                F    [        U R                  * U R                  * 5      $ r.   )r  ra  rb  r0   s    r*   r  Point.__neg__r7  s    dffWtvvg&&r,   c                d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r0   s    r*   r  Point.__nonzero__u7  r  r,   c                    [        U 5      $ r.   )r  r0   s    r*   r  Point.__pos__x7  r  r,   c                0    S[        [        U 5      5      -   $ )Nr  r  r0   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  ra  rb  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      $ r|  r~  r  s     r*   r  Point.__sub__7  r  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  ra  rb  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   )ra  rb  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   rn  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_rightra  r  rb  r  distance_tor  	top_rightr  bottom_left)r)   r  ra  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_pointra  rb  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   )ra  rb  r  r  r  r  r  s     r*   r  
Point.unit7  sc     FFTVVOdfftvvo-w;1:IIaLTVVaZ!,,r,   )r2   r3   r4   r5   r  r  r  r  r  r  r   r  r  r  r  r  r   r  r  r  rv  r  r  r  r  r  r  r6   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  )r|  r"  r  ri  rg  r0   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  rn  Quad: bad seq lenr   r   r   r   r@   r  r  ri  rg  rh  r<   r   r)   r'  s     r*   r  Quad.__add__7      1k""!TWWq[$''A+tww{KKq6Q;011DGGadNDGGadNDGGadNDGGaPQdNSSr,   c                $    U R                   (       + $ r.   r|  r0   s    r*   r  Quad.__bool__7      ==  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   rn  T)
r  rl   r  r{   util_point_in_quad	CheckRectr(  r|  	CheckQuadrP  )r)   ra  rP  rd  s       r*   rw  Quad.__contains__7  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  Frn  r   r   r   r   )r@   r<   r  ri  rg  rh  )r)   rE  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  ri  rg  rh  r  s     r*   r  Quad.__getitem__8  &    $''4773A66r,   c                *    [        [        U 5      5      $ r.   r  r0   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.

rn  r  r   r   r  zQuad: bad argsN)r  r  ri  rg  rh  r<   r   r  rC   r   FzQuadr   r@   )r)   r  ri  rg  rh  r  rP  s          r*   r   Quad.__init__8  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Nrn  r/   r0   s    r*   r  Quad.__len__>8  r  r,   c                >    [        U 5      nUR                  U5      nU$ r.   )r  r  )r)   r  r'  s      r*   r  Quad.__mul__A8  s    JKKNr,   c                v    [        U R                  * U R                  * U R                  * U R                  * 5      $ r.   )r  r  ri  rg  rh  r0   s    r*   r  Quad.__neg__F8  +    TWWHtwwh477(;;r,   c                $    U R                   (       + $ r.   r  r0   s    r*   r  Quad.__nonzero__I8  r  r,   c                    [        U 5      $ r.   )r  r0   s    r*   r  Quad.__pos__L8      Dzr,   c                0    S[        [        U 5      5      -   $ )Nr  r  r0   s    r*   r   Quad.__repr__O8      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  ri  rg  rh  r  r  s      r*   r  Quad.__setitem__R8  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__[8  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__b8  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  rh  rg  ri  rb  )r)   r  rB  rC  s       r*   rd  Quad.is_convexm8  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  r/  r0   s    r*   r|  Quad.is_empty8  s!     zzG#<t{{W'<<r,   c                .    U R                   R                  $ )z(Check whether this is the infinite quad.)r   r{  r0   s    r*   r{  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  ri  rh  r"  r  rg  )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   )r{  INFINITE_QUADr|  r  ra  rb  )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  ra  ri  rh  rg  r  rb  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  ri  rg  rh  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  ri  rg  rh  r0   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  rg  ri  rh  r0   s    r*   r
  r  8  r  r,   )rg  rh  r   r  ri  )!r2   r3   r4   r5   r  r  r  rw  r  r  r  r   r  r  r  r  r  r   r  r  r  rv  rd  r|  r{  r  r#  r   r  r  r  r/  r6   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.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.\r/\r0\" \(5      r1\)r2\*r3S-r4g
)/r(  i8  c                    U R                   (       d  U R                  (       a  gU R                  U R                  -
  U R                  U R
                  -
  -  $ r  )r|  r{  r  r  r  r  r0   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  rn  Rect: bad seq lenr   r   r   r   r@   r(  r  r  r  r  r<   r   r  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)   ra  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  r0   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   rn  r   F)r@   r   r<   util_is_point_in_rectINFINITE_RECTr(  rl   r  r{   r  r   r  r  r  r  )r)   ra  rP  r!  s       r*   rw  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  Frn  r  r  s     r*   r  Rect.__eq__8  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__8  r  r,   c                *    [        [        U 5      5      $ r.   r  r0   s    r*   r  Rect.__hash__8  r  r,   Nr]  rB  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]  rB  r  r  r  r  r  s           r*   r   Rect.__init__9  sE     ($"VXY****r,   c                    gr  r/   r0   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  r0   s    r*   r  Rect.__neg__9  r  r,   c                d    [        U 5      [        U 5      s=:H  =(       a
    S:H  (       + $ s  (       + $ r   r  r0   s    r*   r  Rect.__nonzero__"9  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   rn  )r@   r   r(  r<   include_pointinclude_rect)r)   ra  r!  s      r*   __or__Rect.__or__%9  sb    q)$$_--Jq6Q;??1%%q6Q;>>!$$))r,   c                    [        U 5      $ r.   r(  r0   s    r*   r  Rect.__pos__/9  r  r,   c                0    S[        [        U 5      5      -   $ )Nr(  r  r0   s    r*   r   Rect.__repr__29  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__59  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  r  s     r*   r  Rect.__sub__?9  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__F9  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  r0   s    r*   r  Rect.bottom_leftP9       TWWdgg&&r,   c                B    [        U R                  U R                  5      $ zBottom-right corner.r  r  r  r0   s    r*   r  Rect.bottom_rightU9  rI  r,   c                $    U R                  U5      $ )z.Check if containing point-like or rect-like x.rw  r7  s     r*   containsRect.containsZ9        ##r,   c                H    [        SU R                  U R                  -
  5      $ r   r  r  r  r0   s    r*   r/  Rect.height^9      1dgg'((r,   c                D    [        U R                  U R                  U5      $ zUCalculate area of rectangle.
parameter is one of 'px' (default), 'in', 'cm', or 'mm'.
_rect_arear  r/  r~  s     r*   get_areaRect.get_areab9      $**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   r}  )r<   r   util_include_point_in_rectr  r  r  r  r  s     r*   r6  Rect.include_pointf9  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.rn  r  )r<   r   r(  r{  r~  r  r  r  r  r  r|  util_union_rectr  s     r*   r7  Rect.include_rectm9  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.rn  r  )
r<   r   r(  r{  r  r  r  r  r|  util_intersect_rectr  s     r*   r  Rect.intersect|9  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(  r|  r{  r  r  r  r  )r)   ra  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  r0   s    r*   r|  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  r~  r  r  r  r0   s    r*   r{  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.rm  r0   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.r{  r  rE  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.r?  r0   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   r1  rS  r!  r0   s    r*   rE  	Rect.quad9  %     DGGTWWdggtww77r,   c                *    [        [        U 5      5      $ )zReturn the IRect.)ri  util_round_rectr0   s    r*   r  
Rect.round9  s    _T*++r,   c                B    [        U R                  U R                  5      $ zTop-left corner.r  r  r  r0   s    r*   r  Rect.top_left9  rI  r,   c                B    [        U R                  U R                  5      $ zTop-right corner.r  r  r  r0   s    r*   r  Rect.top_right9  rI  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(  r{  r|  r   r|  r  r  r  r/  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  r0   s    r*   r  
Rect.width9  rV  r,   rm  r  r  )5r2   r3   r4   r5   r  r  r  r  rw  r  r  r  r   r  r  r  r  r8  r  r   r  r  r  rv  r  r  rP  r/  r[  r6  r7  r  ri  r|  r{  rv  r#  r  r  rE  r  r  r  r  r  r  r  rS  r!  r  r   r1  r6   r/   r,   r*   r(  r(  8  s   9
T1"4
7! "&$4DTd &<1*)T ' ' ' '$ ) )9" 8 8 _ _ 9 9%3 8 8, ' ' ' '

 ) ) G	B	BUOE	B	Br,   r(  c                  t   \ rS rSrSr\S 5       rSS jrS rS S jr	S!S jr
          S"S jrS#S	 jrS$S
 jr        S%S jr S&         S'S jjrSS.S(S jjrS)S jr S*       S+S jjr S*     S S jjrSSSSSSSSSSSSSSSSS.                                     S,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 jjr            S.                         S/S jjrS&S0S jjrSrg)1r  i9  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"  rb  ra  pi)r  rm  rD
  alfas       r*   horizontal_angleShape.horizontal_angle9  s     !%LyyQSS"337ssax4(  ww~ 	 ssax  u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 )Nrz  ra   )rl  r   r   r.  r|  r   r  rb  r/  ra  r  r  rq  pctmipctmr  	text_cont	totalcontr  r   r?  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  ra  r  rb  r  r  r  r7  s     r*   
updateRectShape.updateRect:  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,   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)   rB  rC  s      r*   r  Shape.draw_line0:  s    2Y2Y2%NNijj(ABVKKN OOOB)HR**_$=>GGr,   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  )rV  r  r  r  r   r/  r  r  )r)   rA  rd  r  s       r*   r  Shape.draw_polyline>:  s    f%DAAv583NNiqDJJ9N0O&PSY&YYN&+AhDO)HU1X

5J,K"Lv"UUOOA &  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)   rB  rC  r  r  r  s         r*   r  Shape.draw_bezierL:  s     2Y2Y2Y2Y2%NNijj(ABVKKNR**_-R**_0EERR\R\_H]]^)D/F22r,   c                   [        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.rn  zinvalid arg lengthr   r  rO  r  )r<   r   r@   r(  rE  r  r  ri  rh  rg  r  r  r   r/  r  r  r  r   )r)   tetrar'  mtmrr  mls          r*   r  Shape.draw_ovalc:  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,   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  rB  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)   rB  rC  r  kappak1k2s          r*   r  Shape.draw_curve:  sY     2Y2Y2Y7e##7e##//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   rn  r   MbP?)r  r  r  copysignr"  r  r  r  r/  r  r  r   r  ra  r  rb  r  r   )r)   r  rf  r  r  l3l4l5betarw360w90w45r   r  rm  rD
  r  r  q1q2r@  rA  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  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   rO  zbad radius value r   r  r   )r(  r  r   r/  r   rS  r  r  r/  r  r   r  r@   r   r  r<   r  r  r  r!  r1  )
r)   r   r  r!  r@  r  pyrxryr^  s
             r*   r[  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,   c                    [        U5      nU R                  UR                  UR                  UR                  UR
                  UR                  /5      $ )zDraw a Quad.)r  r  r  rg  rh  ri  )r)   rE  r'  s      r*   r  Shape.draw_quad;  s;    J!!144qttQTT144"@AAr,   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.rn  r   points too closer   r  r   )
r  r"  r9   r  r   r|  rf  rP  rp   r  )r)   rB  rC  r  rD
  r  r  r  r  i_matrA  rd  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.rn  r   r  gh?3OP@r   r   r   )r  r"  r9   r  r   r|  rf  rP  rp   r<   r  )r)   rB  rC  r  rD
  r  r  r  r  r  r  rA  rd  r  s                 r*   r  Shape.draw_squiggle1;  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  rl  r   r  rI  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 S3n6Sn7OS=n6n7U R                  RA                  UUS 9n8U8c  Sn8OSU8 S!3n8U(" U6U8U1U3U2UU5      n9US:  a/  U9U S"3-  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 S(3-  n9U =RD                  U9-  sl"        U:$ s  snf ! [         a    [        5          gf = f))Nr   r   rO	  r   r   r  r  r  r  r  r   r  r  rN  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  r@  re  r  ru  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
ra   r5  r  /OC / BDC
EMC
r  r   Tr  w  M TJz
T* z
ET
Q
)#rt  r   r   r   r  r<   r  r  r  r  rl   r{   r8   r   r  r"  r.  r-  rp   getTJstrr  
CheckMorphr   r/  r  r|  ra  rb  r   r/  r"  rr  r  rP  r  )<r)   rf  r	  r   r  r   r  r  r  rl  r   r  rI  r  r]  r#  r  r  r  r   r  maxcoder.  r  r(  r'  r  r  r  r  r  lheightr!  tabr  ru  	color_strfill_strmorphingrx  templ1templ2cmp90cmm90cm180r/  r  r  r}  r  r
  rD  spaceoptcontbdcemcr  r  nlinesrd  s<                                                               r*   r  Shape.insert_textY;  s   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'&)CCNC#		&&.\&J=Ewe$Ec5"dCA?{m4((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 % 	&S!! 	$g ; 		s$   S7 2S2S7 2S7 7TT)r   r  r   r  r  r  rl  r   r  rI  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 S3nSnOS	=nnU R
                  R                  UUS
9nUc  S	nOSU S3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  WFU S03-  nFUF[7        UT-  5      S1-   -  nFUb  WF[7        U5      S2-   -  nFUS.:X  a  WF[7        WJ5      S3-   -  nFU	b  WFU-  nFU
b  WFU-  nFWF[[        WIU-U$TQ5       S43-  nFGM&     WFS5U S63-  nFU =R\                  UF-  sl.        U R_                  U5        WE$ s  sn+f s  sn+f )7a  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  ra   r  rO	  r  r  zrotate must be multiple of 90r  r  r  r  r  r   r  r  r  r!  r   r  r  rN  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<   )ra  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  r  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  r@  s       r*   r
  &Shape.insert_textbox.<locals>.<lambda>=  s'    Xi.?-@aS)TU,W[#\r,   r   r   r5  r  r   r  z Tw zTJ
zET
r  )0r(  r|  r{  r   r  r   rr  r  rt  r/  r  r8   r  r"  r.  r   r   r   r  r  r  r  r-  r  r|  ra  rb  r   r/  r  r   rS  r!  r1  rV  r  r;   r<   rP  r'   rp   r  r  r  r"  r  r  r  )Rr)   r   r	  r   r  r   r  r  r  rl  r   r  rI  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  lheight_factorr  r
  r  r  	tj_glyphsr  blenr   r  r}  r  progrc_pntrf  maxwidth	maxheightjust_tabrd  rt   line_t	num_wordslbuffr  r  wordpl_wlb_counttext_heightmorer  templtext_tr  r  plr  spacesr
  rD  r!  r  sR        `                                                                          @@r*   r]  Shape.insert_textbox<  s?	   X Dz==D,,DEEeS)	T3'<K1,D ,H))11"5'&)CCNC# 		&&.\&J=Ewe$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seE7$'",\"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;-t,,	,"9:UBB*Ik2U::Dz	'*V33 	! x9fh?@EED_ &b 	$se3$] + Bs   1b)b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 S3U R                   -   U l         SnOSnU R                  R	                  XS	9nUb  S
U S3U R                   -   U l         US:w  a'  US:w  a!  U =R                   [        U5      S-   -  sl         US:w  a  U S3U R                   -   U l         US:w  a  SU R                   -   U l         US;  a  U S3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.
ra   Nr   r  r  r  r  r  r  rO	  r  r    w
z J
z{lineJoin} j
)Nra   [] 0z d
zh
zB
zB*
zf
zf*
zS
r  r  r  )r  r  r   rr  r  r   r  r  r|  ra  r/  rb  r/  r  )r)   r  rl  r   r  r  r  r	  r#  r  r  r  r  r	  r
  r  r  r  r  r}  s                       r*   r\  Shape.finishZ=  s}   , >>RA:E]E eS)	T3'))11"5$WIV4t~~EDNCC		&&.&J u->DNA:%1*NNi.77Na< 'y->DNq=->DN++ &xt_t~~=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,   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  Nra   )rl  r   r  r  r  r  r  r7  r.  rL
  r  r   r  )r)   r  r  s      r*   r^  Shape.commit=  s     	DII$..(..0>>		'')))$))T7CDHH""48	r,   )r.  r  r/  r  r  r   r  r   r  r  r  ra  rb  r  )rB  r   rC  r   r  r  )rA  r   r  r  )
rB  r   rC  r   r  r   r  r   r  r  )r  z"typing.Union[quad_like, rect_like]r  r  )r  r   r  r  r  r  )rB  r   rC  r   r  r   r  r  r#  )
r  r   rf  r   r  r  r  rt  r  r  )r   r   r  r  )rE  r   r  r  )r   )rB  r   rC  r   r  r  r  r  )&rf  r   r	  r]  r   r  r  rr  r   r  r  rq  r  rt  r  r9   rl  rs  r   rs  r  r9   rI  r  r  r  r]  r9   r#  rs  r  r  r  r  r  r9   r  r9   )*r   r   r	  r]  r   rq  r  rq  r   r  r  rr  r  rt  r  r9   rl  rs  r   rs  r  r9   rI  r  r  r  r  r9   r  r9   r]  r9   r#  rs  r  r  r  r  r  r9   r  r  )r   rm  Nr   r   NFNTr   r   r   )r  r  rl  rs  r   rs  r  r9   r  r9   r  rq  r	  rt  r#  rs  r  rt  r  r  r  r  r  r9   r  r  )r  rt  r  r  )r2   r3   r4   r5   r%  rw  r  r   r  r  r  r  r  r  r  r  r[  r  r  r  r  r]  r\  r^  r6   r/   r,   r*   r  r  9  s0    &(7*  	
  
.0C00 0 	0
 
0(  HH H 	H
 H 
HT 48 1fB 	  	
 
B 	## #
 
#Z #" !)xx (x
 x x x x x x x x x x x  !x" #x$ %x& 'x( )x* 
+xD "#" !-BB (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 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  rC   ry  r   	FzArchiver@   r<  FzStory)r)   r  r  emr  r1  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   123456rW  h_id_)r  r   r  r<   r  r  r  )r)   domrd  ra  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  )rC   r   r:   
open_closerW  r5  r(  r   r8   rl   r  r{   r   r(   r  r  page_numr=  r  r9  )document_or_stream	positionsr   id_to_positionpositionposition_fromr  	target_idposition_tore  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   rc  r)   rE  s     r*   r  
Story.bodyB>  s    mmo{{}r,   c                X    [         R                  " U R                  5      n[        U5      $ r.   )r   fz_story_documentr   r  rW  s     r*   r   Story.documentG>  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   rH  fz_draw_story)r)   rP  r  ctm2r  s        r*   draw
Story.drawK>  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>.Position2i^>  r/   Nr2   r3   r4   r5   r6   r/   r,   r*   	Position2rd  ^>  s    r,   rf  )r)	  headingrW  rm  r   r   rK  rectangle_numrect_numr5  rG   setattr)rP  rf  	position2r  rK   r  rn   s        r*   	function2*Story.element_positions.<locals>.function2]>  s     !I&nnIO ( 0 0I#;;IL,X]];IN%]]IN#+#6#6I !)!7!7I%]]IN JJLDAY1- )i r,   N)r   r:   ru  r  isidentifierr   r  __code__co_argcountr   fz_story_positionsr   )r)   rn   r  r  rl  s    ``  r*   element_positionsStory.element_positionsP>  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   rn  fz_place_story_flagsr   rm  )r)   wherer  r  r.  s        r*   placeStory.placeo>  sA      '))499eUK_f---r,   c                D    [         R                  " U R                  5        g r.   )r   fz_reset_storyr   r0   s    r*   rG
  Story.resetx>  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.   )rL  )rP  rL  
positionfns    r*   positionfn2 Story.write.<locals>.positionfn2>  s     )1H%x(r,   )r(  rw  rr  r  r  r_  )r)   rV  rectfnr~  pagefnr  ri  r  r2  r   r  r.  r  rL  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.   r:
  )rP  r~  rN  stables    r*   r  +Story.write_stabilized.<locals>.positionfn2>  s%      *jx( )6r,   )r   r  rH  r   )rV  	contentfnr  r  r?  r~  r  r  rH  r  content_prevcontent2r  r  rN  r  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.   r:
  rP  r~  rN  s    r*   r  6Story.write_stabilized_with_links.<locals>.positionfn2>  !    X&8$ r,   r   )r>   r  r  r  r  r  r
  rT  )r  r  r  r?  r~  r  r  rH  r	   rV  r  rN  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.   r:
  r  s    r*   r  +Story.write_with_links.<locals>.positionfn2>  r  r,   )r~  r  r   )r>   r  r  r   r  r
  r  rT  )r)   r  r~  r  r	   rV  r  rN  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  r0   s    r*   r   Story.FitResult.__repr__>  sP    "4??"3t{{mTYYK !$..!1TYYK)r,   r  rp  )r2   r3   r4   r5   r%  r   r   r6   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(): rw   )r   rC  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>.Statei.?  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  rC  s    r*   r   !Story.fit.<locals>.State.__init__/?  sE     	 	#' #' " !!%DJ!%DJ r,   )r  r  r  r  r  r  r  r  Nr   )r  r  rC  s   r*   Stater  .?  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  rF  rC  s     r*   rL   Story.fit.<locals>.ret@?  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   )rC   r(  r   r|  r  r  r  rw  r  r  r  r  r  )r  r   r  r  r.  r  r  fnr(   r)   r  rC  s         r*   rF  Story.fit.<locals>.updateN?  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>.opposites?  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=)rC   r9   r  r  r  rG
  )r)   r  r  r  r  rC  r  r  rL   r  r  r(   r  rF  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;  )rC  r/  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  rC  r  r  r  r  r/  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;  )r/  r  r  r  s    r*   r  Story.fit_height.<locals>.fn?  s    BBvI..r,   r  )r)   r  
height_min
height_maxoriginr  rC  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)   r/  	width_min	width_maxr  r  rC  r  r  r  r  s           @@@r*   	fit_widthStory.fit_width?  s/    , B&[	.xxyAAr,   r!  )ra   Nr   Nr.   rm  r
  )Nr   NNNT)NNr  Fr   )r   Nr  Fr   )r   Nr  r  F)r2   r3   r4   r5   r   rH  rw  rT  rv  r  r   r_  rr  rw  rG
  r   r  r  r  r  r  r  r  r  r6   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S jjr	SS	 jr
SS
 jrSSS jjrSSS jjrSSS jjrS rSSS jjrS rSS jrSS jrS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)rG  r   rn  r  r   rl   r   r   )r)   r  r2  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$ )Nry  r   r   r   rn  )
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_dictra  s      r*   _getNewBlockListTextPage._getNewBlockList@  s    dii8r,   c                    U R                   R                  U R                   R                  S.nU R                  X!5        U$ )Nri	  )r   r  r/  r  )r)   ra  r  s      r*   _textpage_dictTextPage._textpage_dict@  s2    "iioo9I9IJ	i-r,   c                D     [        R                  " U R                  5      $ )z*Return a list with text block information.)"r  r   extractBLOCKSr   r   rn  r   r2  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  r3  i_imager  r:  r   r  r  r  r  r  r  rp   )r)   block_nr  tp_rectr"  rW  block	blockrectline_n	last_charrt   linerectr  cbboxr   r.  r  litems                     r*   r  TextPage.extractBLOCKS#@  s    &&tyy11r,   Nc                    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ra  r  r/  blocksc                "    U S   S   U S   S   4$ Nr3  r   r   r/   r  s    r*   r
  &TextPage.extractDICT.<locals>.<lambda>_@      qy|QvYq\&Br,   r
  r  r  r/  r  r)   r  r  r  r  s        r*   extractDICTTextPage.extractDICTW@  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  r0   s    r*   extractHTMLTextPage.extractHTMLc@  rR  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_sizerh  r~  r  rJ  ry  r   r  r}  r  r  rJ   r+  ll_fz_keep_colorspacer  r:   dictkey_numberrm  r3  dictkey_bboxrx  i_transformdictkey_matrixdictkey_widthdictkey_heightr>  dictkey_colorspacer:  r  r  dictkey_xresr  dictkey_yresr  dictkey_bpcr  rp   )r)   r  r  r  r   r  r.  img_sizer  has_mask
compr_buffr!  r  r  r   r  r  r  
block_dicts                      r*   r  TextPage.extractIMGINFOg@  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r2   r3   r4   r5   r   r6   r$  s   r*   r"  r  @      8 8r,   r"  r  r/  r  c                "    U S   S   U S   S   4$ r  r/   r   s    r*   r
  &TextPage.extractJSON.<locals>.<lambda>@  r  r,   r
  r   rd   r   
separatorsr  r  r$  rZ  r  JSONEncoderr  r/  r  dumpsr)   r  r  rZ  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  r/  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  r/  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/  r2  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
  ra   rn  )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   rC   r   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)r)   r   r  rk  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   rn  r  r   r2  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  rW  r  r  r  rt   word_nr  r  word_delimiterthis_char_rtls                     r*   rS  TextPage.extractWORDS@  s    %%dii<<r,   c                $    U R                  S5      $ )z&Return page content as a XHTML string.rn  r  r0   s    r*   extractXHTMLTextPage.extractXHTMLA  rR  r,   c                $    U R                  S5      $ )z$Return page content as a XML string.r   r  r0   s    r*   
extractXMLTextPage.extractXML A  rR  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)   r  rg  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   r2  rm  r(  )r)   r  r2  r  s       r*   r   TextPage.rect,A  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<   rP  r  r   r  r|  )
r)   needlehit_maxr^
  r  rG   rd  r'  v1v2s
             r*   r  TextPage.search6A  s    "499f5JCuASVAA  J!)mBUBuu~"'!3!3QWCFE
QJE !)m 
r,   rl  rp  rX  r  r  rm  r.   )r   r   )r2   r3   r4   r5   r   r  r  r  r  r  r	  r  r3  r8  rA  rG  rL  r  rS  r`  rc  ri  rv  r   r  extractTEXTr6   r/   r,   r*   r  r  ?  s    	*9
2h
$.`,
*/6p$$  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 jjr
SS	 jrS
rg)rQ  iSA  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   rZ  rl  r(  r   r|  r/  r  ictmr  r  r%  rS  r  
used_fontsr   )r)   	page_rectrZ  rl  s       r*   r   TextWriter.__init__UA  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.   )rm  r   fz_bound_textr   FzStrokeStatery  r(  r  s     r*   _bboxTextWriter._bboxfA  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                   S3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 'r  ra   r
  r  r   ) r  rx  r  rG  r(   r   rB  rC  mupdf_font_namer   r   r   r   	clean_rtlr  r  r   r  r  fz_make_matrixra  rb  fz_show_stringJM_show_string_csrx  r  r  r  rS  r  ry  r}  )r)   r(  r   r  r   rG  right_to_leftr  rB  rF  r  trm
markup_dirr  r  s                  r*   rp   TextWriter.appendlA  sj   Cj499$<<D 1$))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$ )NrN  )r  r   rG  r  )rp   rb  rS  r  )	r)   r(  r   r  r   rG  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
  ra   r  r   r   )r;   rP  r<   r  r  r  r  rp   )r)   r   wordsr  rd  r   r  idx2s           r*   r  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
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 SU" S3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  )rO  ra  r  r   r  s    r*   r\  (TextWriter.fill_textbox.<locals>.textlenA  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_lengthsA  s    $$Qj$QQr,   c                ,   > TR                  XTTTS9nU$ )N)r  r   r  r:
  )r(  r   rL   r  r   r  rV  s      r*   append_this,TextWriter.fill_textbox.<locals>.append_thisA  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  rp   r<   )	r  r  nwordsword_lengthsr   wl_lstwlrJ   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   ra   r   Nr   )r;   r<   r  ra  )r  rt   r   r  r  r   gapsgaplr8  r^  r  	std_widthr\  s             r*   output_justify/TextWriter.fill_textbox.<locals>.output_justifyB  s     !%

3;17QE;ZF{{E8,%0%Qgaj%01BA:DNd*D#E-$$+   < 1s   	B%B%B*r   rN  NzText must start in rectangle.rO  r  r   )ra   r   zOnly fitting  of z lines.z	Warning: r   ra   )$r(  r|  r   r   r  r  r  r  r  r  r   r  r  r  r  r  r9   r  rb  rV  rp   r<   r  ra  r  r;   r  r  rw   rP  rM  r  r  r{   r  r  ))rV  r   r   r(  r  r   r  r  warnr  r  	tolerance	space_len	std_startr  r  r*  r+  r  
LINEHEIGHTr  rS  	textlinesrt   	max_lines	new_lines
no_justifyrd  r   r  r  rJ   line0r  r  r   r  r  r  r  r\  s)   `   ``    `                          @@@@r*   fill_textboxTextWriter.fill_textboxA  s|   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!)D@C|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 S3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                  US S35        MJ  U!R]                  S5      (       a+  [_        U!Ra                  5       S   SS 5      U-   n"SU"S S3n!GO7U!R]                  S5      (       az  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&S 3/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  r3  r   rn  r   ry  r  z BDCEMCra   r'  r6  r  z cmBTr@  z Trz gsz/Alp Tfr  z wr   r   z/Fz rgrv  RGz gz Gz kz Kr  r&   r  )r  )9rl  r"  r   r   r   r   r   r  r|  r   rZ  rl  r  r?  r   r  fz_device_cmykfz_device_grayrW  r.  r	  pdf_new_pdf_devicery  fz_fill_textr   r  fz_default_color_paramsr~  JM_merge_resourcesr  r  rr  rp   r  rt  r/  r  r2  rt  r  r   ra  rb  rx  r  r/  r  r9   r;   r  r  r  r  r  r7  ry  repair_mono_font)'r)   r   rl  rZ  r  r#  r  r  r  r  r  ncol	dev_colorr  rf  r3  r  max_numscont_stringr  r  r  max_alpmax_fontold_cont_linesr  r  r  new_cont_linesr  r  r  r  rt   alpr  r/  r   r  s'                                          r*   rR  TextWriter.write_textB  sn    	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+%%Qs&;<}}U##$**,q/!"-.8c!WC(u%%zz|d1g!#AA%%ilT&9:4712;'(2xx2d1X$qr( :;u%%%%dll4&>?t$$%%dll4&>?t$$%%dll4&>?!!$'5 #6 !!#&e$))N+227;tWg>OODT4( $
r,   )
rl  r  rx  r  rZ  r   rS  r   r   ry  r"  )Nr  Nr   r   )Nr  NF)NNr  Nr   NFF)rV  z'TextWriter'r   r   r   r]  r(  r   r  ztyping.Optional[Font]r   r  r  rr  r  r9   r  rt  r  rt  r  rt  r  r   )Nr  r   NNr   r   )r2   r3   r4   r5   r   rv  r  rp   r  r  r  rR  r6   r/   r,   r*   rQ  rQ  SA  s    "  
*X/,d #*. #'"'$` `` *` 	`
 (` ` !` ` `  ` ` `DDr,   rQ  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,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.\(r/S+r0g	)-ri  i7C  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  r  s     r*   r  IRect.__add__AC      ||D$**,,r,   c                H    [         R                  X5      R                  5       $ r.   )r(  r  r  r7  s     r*   r  IRect.__and__DC  r  r,   c                ,    [         R                  X5      $ r.   )r(  rw  r7  s     r*   rw  IRect.__contains__GC  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__JC  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__OC  r  r,   c                *    [        [        U 5      5      $ r.   r  r0   s    r*   r  IRect.__hash__RC  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__UC  s%    -<tr]_km-n*$'47r,   c                    gr  r/   r0   s    r*   r  IRect.__len__XC  r  r,   c                H    [         R                  X5      R                  5       $ r.   )r(  r  r  r  s     r*   r  IRect.__mul__[C  r  r,   c                v    [        U R                  * U R                  * U R                  * U R                  * 5      $ r.   )ri  r  r  r  r  r0   s    r*   r  IRect.__neg__^C  s+    dggXx$''DGG8<<r,   c                H    [         R                  X5      R                  5       $ r.   )r(  r8  r  r7  s     r*   r8  IRect.__or__aC  s    {{4#))++r,   c                    [        U 5      $ r.   )ri  r0   s    r*   r  IRect.__pos__dC  r  r,   c                0    S[        [        U 5      5      -   $ )Nri  r  r0   s    r*   r   IRect.__repr__gC  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  )r9   r  r  r  r  r  r  s      r*   r  IRect.__setitem__jC  s_    F!VqW  !VqW
 	 !VqW  !VqW  122r,   c                H    [         R                  X5      R                  5       $ r.   )r(  r  r  r  s     r*   r  IRect.__sub__tC  r  r,   c                H    [         R                  X5      R                  5       $ r.   )r(  r  r  r  s     r*   r  IRect.__truediv__wC  s    (..00r,   c                B    [        U R                  U R                  5      $ rF  rG  r0   s    r*   r  IRect.bottom_leftzC  rI  r,   c                B    [        U R                  U R                  5      $ rK  rL  r0   s    r*   r  IRect.bottom_rightC  rI  r,   c                H    [        SU R                  U R                  -
  5      $ r   rT  r0   s    r*   r/  IRect.heightC  rV  r,   c                $    U R                  U5      $ )zCheck if x is in the rectangle.rO  r7  s     r*   rP  IRect.containsC  rR  r,   c                D    [        U R                  U R                  U5      $ rX  rY  r~  s     r*   r[  IRect.get_areaC  r]  r,   c                P    U R                   R                  U5      nUR                  $ )z$Extend rectangle to include point p.)r   r6  r  )r)   r  r   s      r*   r6  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   r7  r  )r)   r!  r   s      r*   r7  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(  ri  r7  s     r*   ri  IRect.intersectsC  s    t''r,   c                t    U R                   U R                  :  =(       d    U R                  U R                  :  $ rl  rm  r0   s    r*   r|  IRect.is_emptyC  ro  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.rq  r0   s    r*   r{  IRect.is_infiniteC  rs  r,   c                t    U R                   U R                  :*  =(       a    U R                  U R                  :*  $ ru  rm  r0   s    r*   rv  IRect.is_validC  rx  r,   c                n    U R                   (       a
  [        5       $ U R                  R                  X5      $ rz  r{  r|  s      r*   r#  IRect.morphC  r~  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.r?  r0   s    r*   r  IRect.normalizeC  r  r,   c                n    [        U R                  U R                  U R                  U R                  5      $ r  r  r0   s    r*   rE  
IRect.quadC  r  r,   c                    [        U 5      $ r.   r;  r0   s    r*   r   
IRect.rectC  s    Dzr,   c                B    [        U R                  U R                  5      $ r  r  r0   s    r*   r  IRect.top_leftC  rI  r,   c                B    [        U R                  U R                  5      $ r  r  r0   s    r*   r  IRect.top_rightC  rI  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  r0   s    r*   r  IRect.widthC  rV  r,   rm  r  )1r2   r3   r4   r5   r%  r  r  rw  r  r  r  r   r  r  r  r8  r  r   r  r  r  rv  r  r  r/  rP  r[  r6  r7  r  ri  r|  r{  rv  r#  r  r  rE  r   r  r  r  r  r  r!  rS  r   r1  r6   r/   r,   r*   ri  ri  7C  s   --*k
7! "&$4DTd o-=,*-1 ' ' ' ' ) )$9

/( 8 8 _ _ 9 9%3 8 8   ' ' ' '	/ ) ) 
B	B	B	Br,   ri  )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   rn  r   r   r$  r  @   r  r  r  
   r  r      )r      r   )r   r<  r   Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenrd  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  r@  re  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[rM  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[rM  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[rM  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(rP  rQ  rM  r/   rT  s      r*   r
  r
  E  s    $:1#U1#E^_`^aa|"}r,   c                    SU  SU S3$ )Nz<</A<</S/URI/URI(rS  rM  r/   r  s     r*   r
  r
  E  s    /s)A3>YZr,   c                    SU  SU S3$ )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[rM  r/   r  s     r*   r
  r
  E  s     03HKfgr,   )r  goto2r  r  r  r  r  c                      \ rS rSrSrSrg)r  i E  z0Raised for documents with file structure issues.r/   Nr2   r3   r4   r5   r%  r6   r/   r,   r*   r  r   E  s    :r,   r  c                      \ rS rSrSrSrg)r  i$E  zRaised if file does not exist.r/   NrZ  r/   r,   r*   r  r  $E  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/   NrZ  r/   r,   r*   r  r  (E  s    ?r,   r  r  r  bidir3  r  r  r  r@  rl  r  r  r  zcs-namedar  descriptionr  r  effectr  rk   r   r  
char_flagsr  r  r/  rW  r  rG   r  rW  r  r  r   r5  r  r   r  r  spansr  r  r  r   r  r   rO  r  r  r  r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  )r        ?)r?  Zd;O?)"   7A`?)#   rO  )r
   rh?)%   -?)&   gL7A`?)'   jt?)r
  ri  ))   ri  )*   rO  )+   rm  ),   rh  )-   rm  ).   rh  )/   n?)0   rO  )1   rO  )r  rO  )3   rO  )4   rO  )5   rO  )6   rO  )7   rO  )8   rO  )9   rO  ):   rz  );   rz  )<   rm  )=   rm  )>   rm  )?   g"~j?)r9  rm  )A   v?)B   MbX?)C   r  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  r  )I   ri  )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   rr  )W   r  )X   gp=
ף?)Y   q=
ףp?)r  r  )[   ri  )\   gV-?)]   ri  )^   uV?)rw  rO  )`   rO  )a   r  )b   rm  )r  rm  )r	  V-?)e   rr  )f   y&1?)g   M?)h   r  )i   uV?)j   r  )k   rm  )l   rm  )m   ;On?)n   r  )o   rm  )p   rm  )q   r  )r   rm  )s   r  )t   rr  )u   r  )v   rk  )w   r  )x   gZd;O?)y   r  )z   r  ){   Q?)|   r  )}   r  )~   rm  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  rf  )   rh  )   gףp=
?)   gV-?)   rm  )   gK7A`?)   rk  )   rO  )   jt?)   r  )   r  )   r  )   y&1?)   rk  )   r  )   /$?)   r  )   g?)   rm  )   r  )   rm  )r  rm  )   r  )   r  rf  )   rm  )   rm  )   rm  )   rm  )   r   )r	  r  )   r   )   r  )   tV?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   rk  )   rk  )   rk  )   rk  )   rk  )   rk  )   rk  )   r  )   rk  )   HzG?)   r  )   g{Gz?)   r  )   rm  )   rm  )   rk  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   x&?)   rk  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  rf  )   r  )   gK7?)   r  )   r  )   r  )   r  )   rm  )   r  )   r  )   r  )   r  )   r  )   r  )   r  rf  (   rg  K7?r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  )r  rz  )r?  ^I+?)rj  gn?)rl  r8  )r
  g\(\?)rn  g5^I?)rp  sh|??)rq  r  )r
  Zd;O?)rs  r  )rt  gQ?)ru  g?5^I?)rv  rm  )rw  g\(\?)rx  x&?)ry  gB`"?)r{  r;  )r|  g=
ףp=?)r  r8  )r}  g)\(?)r~  gOn?)r  Mb?)r  '1Z?)r  gʡE?)r  gDl?)r  r  )r  RQ?)r  }?5^I?)r  gT㥛 ?)r  r  )r  gDl?)r  gv/?)r9  gX9v?)r  g/$?)r  r  )r  r7  )r  r7  )r  r  )r  gK7A`?)r  g rh?)r  &1?)r  r  )r  r9  )r  gx?)r  r  )r  ro  )r  r@  )r  d;O?)r  gK7?)r  g+?)r  gA`"?)r  g+?)r  r  )r  MbX?)r  g=
ףp=?)r  E?)r  r  )r  rB  )r  r?  )r  9v?)r  g-?)r  gm?)r  g;On?)rw  g;On?)r  gGz?)r  r9  )r  r9  )r  rD  )r	  gCl?)r  ʡE?)r  g?5^I?)r  r  )r  gv/?)r  rk  )r  r:  )r  gQ?)r  r:  )r  V-?)r  r=  )r  r<  )r  r<  )r  r?  )r  r?  )r  %C?)r  rG  )r  r7  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  rH  )r  K7A`?)r  rI  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  r6  )r  gCl?)r   rh?)r  rJ  )r  gQ?)r  r  )r  r>  )r  r>  )r  rC  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  r6  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r	  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r   r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r  r7  )r	  r7  )r
  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r  V-?)r   rh?)r  rK  )r  gK7A`?)r  Dl?)r  V-?)r  rN  )r  g㥛 ?)r  rF  )r  g"~?)r  rL  )r  rL  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r   gK7A?)r!  獗n?)r"  rO  )r#  X9v?)r$  rP  )r%  rE  )r&  rE  )r'  +?r6  )r(  rQ  )r)  r>  )r*  gʡE?)r+  y&1?)r,  gGz?)r-  rR  )r.  "~j?)r/  gl?)r0  rS  )r1  rA  )r2  rF  )r3  rM  )r4  g
ףp=
?r6  r6  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  r/  r  r  r  r  s         r*   rZ  rZ  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  rP  rp   r   rz  r  )r  r  rJ   rL   rd  s        r*   _read_samplesrV  G  sN     C>>
AY

E((&1*=> #;r,   c                     X:*  =(       a    X:*  $ r.   r/   )rK   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  rg  r  r  rD
  GoTor  r   )r   r  rP  r  r  r	  r   r  r  r  r6  pdf_lookup_page_numberrz  r	  r   r  r   r  )r^  r8  	pagecountrd  r  r  r  r  r  r  rM  r	  rv  rs  r  r8  s                   r*   r7  r7  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=)rC   r   r   r   r   r   rl   MSG_IS_NO_PDF)conds    r*   
ASSERT_PDFra  G  sT    dU]]E,=,=>??YKDJ=PWRVQXAYY???&& r,   c                 >    [        [        [        [        [        5      $ r.   )ri  r  r~  r/   r,   r*   EMPTY_IRECTrc  G      /?OTTr,   c                 *    [        5       R                  $ r.   )
EMPTY_RECTrE  r/   r,   r*   
EMPTY_QUADrg  G  s    <r,   c                 >    [        [        [        [        [        5      $ r.   )r(  r  r~  r/   r,   r*   rf  rf  G      /?SSr,   c                :    [        U 5      (       d  [        S5      eg )Nz No journalling operation started)JM_have_operationrl   r^  s    r*   r<  r<  G  s    S!!:;; "r,   c                 >    [        [        [        [        [        5      $ r.   )ri  r~  r  r/   r,   r*   INFINITE_IRECTrn  G  rd  r,   c                 *    [        5       R                  $ r.   )r  rE  r/   r,   r*   r  r  G  s    ?r,   c                 >    [        [        [        [        [        5      $ r.   )r(  r~  r  r/   r,   r*   r  r  G  ri  r,   c                t    [        U [        R                  5      (       d   e[        R                  " U 5      nU$ )z+
Turn fz_buffer into a Python bytes object
)rC   r   r.  r  )r1  rL   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$ )Nra   ztype(c)=r  surrogateescape)rC   r  r   r  r%  )r  r  rL   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: )rC   r  r  r@   r  r  r  rl   r   r   r.  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_ITEMrw  H  s    C  ?r,   c                h    U[        U 5      :  a#  X   n[        U[        [        45      (       a  SU4$ g)Nr   r"  )r<   rC   r9   r  )r  r  r  s      r*   r  r  H  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   ry  r  fz_intersect_rectr  fz_round_rectfz_document_output_intentr   r>  fz_keep_colorspacefz_page_separationsfz_count_separationsrP  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsrj  r  r  rK  r}  ry  ri  fz_run_page_contentsr~  )r.  r   r  r  r  r  r  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsr  r  r  r   rclipr3  oirJ   rd  r  r  s                          r*   r  r  %H  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*   rO  rO  kH  s    Hr,   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>rH      c!fnuQ{C!Cr,   r   r  r  s    r*   r/  r/  qH      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>vH  r  r,   r  r  s    r*   	JM_TUPLE3r  uH  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 $ )Nra   r  ztype(s)=z s=)rC   r  r  r  r   r  s    r*   r  r  yH  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)rC   r   r   r   r  r>  JM_annot_id_stemrO  pdf_new_stringr<   r  r.  r   rU  )	r   stemr   r#  r`  rd  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_REFrn	  r  r	  r  rR  )r^  r  r  indobjr_  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   rn  r   BSr
  rD
  ra   r  BEIr  )r   r   r  r	  r6  r  r  r  rP  r
  rp   r   r  r:   r  r   dictkey_dashesdictkey_style)r#  dash_pyr  r  r  r  dashrd  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$ )Nr7  )r:   r   r   r  PDF_ENUM_NAME_Cr6  r  rP  r  r  rp   dictkey_stroker   dictkey_fill)r#  r"  bcfcr  rJ   rd  rc  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
  rD
  r   r  r  )rC   r:   r=   r  r  r  r  r   rE  r	  r   r<   rO  pdf_array_push_intrN  pdf_new_realJM_get_border_stylerV  r  rR  rM  )r  r.  r#  r  dashlennwidthndashesnstylencloudsoborderdarrr@  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 3$ SU S 3$ )Nr  z\u005cr     r:  i   i  z\ufffd  z\ur  z\U08xr%  r  s    r*   make_escaper  I  s^    	Rx	rSB"H2w	2		 
 	vRH~RH~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  rp   r   rn  r  )rW  r  rZ  r  r  r[  r  r  s           r*   rV  rV  0I  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
re  r   r   r(  Nra  	BaseStaterh  rg  rd  r   )ri  r   r  r	  r6  rE  rW  r  rR  r<   rP  r  r  pdf_array_containsr8  )r^  r   rV  rg  rt  configsr  onarrayrL  rJ   rd  r  re  inds                 r*   rT  rT  CI  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  )rt   r  r'  r!  s       r*   r  r  aI  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   r8  TEXT_FONT_ITALICr?  TEXT_FONT_SERIFEDr;  TEXT_FONT_MONOSPACEDr5  TEXT_FONT_BOLD)r  rt   r  r  s       r*   JM_char_font_flagsr  nI  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   rC   FzStextLineFzStextCharrz  r   rE  r  FzFontll_fz_keep_fontr  JM_font_ascenderJM_font_descenderr  FLT_EPSILONr   r  r  r  r  ra  rb  r  r@  r  fz_transform_quadr  ri  rg  rh  r  r  r  )rt   r  r  r*  r+  r/  asc_dscr3  fwidthr  r  trm1trm2xlate1xlate2rE  cwidthr  s                     r*   r  r  yI  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	  rP  r  r  r  rp   )	r   r#  rS  rJ   optarrr  rd  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   rn  r
  r   )r   fz_intersect_irectr  r  r  r  r  rx  rb  rJ   ra  r>  r  rP  ry  r  )
r	  r   r  r   rb  destspandestpr  ra  r  s
             r*   r  r  I  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   rn  r   r   )rC   r9   r  r   r   r<   rP  )rl  rL   rd  s      r*   r?  r?  %J  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   r:   r   r  r  r{  r  rx  r  r  r  r  rJ   rb  ra  rV  fz_is_empty_irectrP  r=   )rQ  r  r   r  r  rx  r  r/  rJ   	substrider  oldpixrd  r  newpixr  r  s                    r*   r  r  7J  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_BESTr.  fz_new_buffer_from_datafz_resize_buffer)inbufferr  compressed_lengthr  s       r*   JM_compress_bufferr  _J  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   rk  need_new_liner	  r  rt   line_had_textr  r!  r  s
             r*   rO  rO  oJ  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  Nrn  r   i    ) r   r   r'  r  r5	  ry  pdf_page_writer}  ry  ri  r~  r0  r1  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r	  r	  r*
  r	  r  rC   r  )r.  r  rR  r]  r  r  r  re  rx  rd  r   r2  r  rf  r3  r4  rS  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   rl  )r   r
  ri  r  pdf_create_annot_rawrR  r  JM_set_field_typer  r	  PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyrN  rM  r   rO  r8  rl   r  r{   r  )	r.  r   r   	fieldnameold_sigflagsr   r#  r  ra	  s	            r*   rU  rU  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   ry	  r  r   r  r  r	  r  r  r  r  )r4  r2  rz	  r  r  s        r*   ry	  ry	  J  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.   )ry	  r"  r  r  r  r  r   fz_make_point)r4  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  rn  r  r  r  r  r  Filespecs     rJ  r  r  r  )r   rW  rV  r	  r  rR  r	  r  r
  r-  rL  rM  )r^  r  rk   rO  r  r]  r  r  efbsr  r8  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  rE  r  rY  )r^  r  collefiless       r*   r'
  r'
  6K  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$ )Nra   r  errors)r   r   r  rP  )r  r  r  s      r*   r  r  NK  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$  ra   r   N)r   r  r  r	  r   
fz_memrnd2r%  rE  r8  r  r<   )r^  rG  rnd0rndrd  s        r*   r(
  r(
  VK  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  r0  r   rd  r   r  r   rg  rh  rf  RBGroups)r   r  r  r	  r   rV  rE  )r^  rt  r  r  s       r*   ri  ri  fK  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
rG  Core  coTirf  tiSySymbr  Zarg  za)r8   r  s    r*   JM_expand_fnamer3  xK  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	Signaturerw  )r   r}  r~  rn  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )r  s    r*   JM_field_type_textr?  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  )rC   r   rk  r  r  r  r  r  r  rx  rb  rJ   ra  rP  ry  )
r	  rc  r  r   rb  r  r  r  ra  rd  s
             r*   rO  rO  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   r9  )
rC   r   r   r  r   r  r   r   r  rS  )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<  )rC   r   r  rz  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$ )rD  gɿ)rC   r   r  rz  r   r  )r  rL   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  rW  r)  r@  s       r*   rT  rT  K  sW     	
89R!6! 	 " r7D9  r,   c                    U S:  d  U S:  a  gg)Ni  i 	  FTr/   r  s    r*   rU  rU  K  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   )rC   r   r  rJ  r   rz  r   )r  r   r  s      r*   JM_font_namerI  K  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  rP  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  rp   )r^  dict_fontliststream_xrefr   rJ   rd  refnamer'  r  r  r   r  r  r  r  s                   r*   JM_gather_fontsrV  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,   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 (rK  r  Formr)  r|  )rC   r   r   r  rP  r  r  r  rL  r  r  r  r	  r  r   pdf_to_matrixry  r  r  rn  ro  rm  rp   )r.  rR  	imagelistrT  r   rJ   rd  rU  	imagedictr_  r  r  r}  r3  r  r  s                   r*   JM_gather_formsr\  ,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,   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 (rK  r  r  r   r  r  Filterr  
ColorSpaceCSDeviceN
Separationr   r  r
  r  r>  BitsPerComponentBPC)r   r  rP  r  r  r  rL  r  r  r  r	  r  r  r   r6  r  r
  r
  r  rp   )r.  rR  rZ  rT  r   rJ   rd  rU  r[  r_  r  genr  r  altcsr  csesr  r/  r  r  s                        r*   JM_gather_imagesrh  TL  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                ^   [        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S S35      eU$ )z
retrieve annot by its xref
r   r   xref r@  z is not an annot of this page)	rC   r   r   r  r   r  r  rS  rl   )r   r  r  r   s       r*   r  r  L  s     dEMM****E!!$'E
5##E$7$7$>??E$$e,  %Qx'D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 S35      eU$ )z"
retrieve annot by name (/NM key)
Nr   r   r-  r   z' is not an annot of this page)
rC   r   r   r  r   pdf_to_stringr   r  rS  rl   )r   r   r  r   r  r  s         r*   r  r  L  s     dEMM****E!!$'E
,,U-@-@ATATUZA[]a-bcE$$U+  !D6!?@AA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   rP  r  r  r   rp   r  )r   r`  r  rd  r#  r   s         r*   r>  r>  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   rt	  r   r  r	  r  rP  r  r  r   r  r  PDF_ANNOT_UNKNOWNr   rp   r  )
r4  r`  r  rJ   rd  r#  r  r  r_  rG  s
             r*   rt	  rt	  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   rt	  r  r   s    r*   rC  rC  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  r@  r  rd  r  r  Ur  rD
  )r   PDF_ENUM_NAME_Sr8   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  rF  r  r  r  r  r  r}  r  r  r"  r  r  s            `      r*   r  r  L  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   r7  r  r	  r   r  r  rw   r  r  r  )r.  r  r  desftr  r	   s         r*   r  r  6M  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
r9  
Propertiesr/   r   )r   r  r	  r   r  rP  r  r  r  r  rp   )	r  
propertiesrJ   r   rd  r  r  r  r  s	            r*   ru  ru  mM  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
FTrj  z is not a widget of this page)r   r  r   r  r  rT  rl   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.   rj  )r  r   rX  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,   rU  TFNrH  rS  rM  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	  rl   )r  r  slowhalfbeatr  rs  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,   TUrN  r  rL  rm  rO  rQ  r  r
  r   r   rI  r  rJ  rX  rY  MKBGr\  BCr%  rK  r"  rZ  r:  rT  rP  r  r  r[  rD  Kr\  r  r]  Vr^  r  r_  Blr`  Fo)%r   r  r   r   r.  pdf_widget_typerR  r  pdf_signature_is_signedr  pdf_field_border_styler?  pdf_load_field_namer	  rn  r  r   r  r  pdf_field_valuepdf_field_displayr  r  r6  r  rP  r
  r  pdf_text_widget_max_lenpdf_text_widget_formatr  r  r  pdf_field_flagsr  JM_get_scriptr  )r   rX  r#  r   r^  twr  r  rR  rM  r  rs  fvaluer  rI  rJ   r@  rd  rc  r^  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       S35        g)z>
Return the file extension of a font file, identified by xref
r   r  r
  r   r
  r  pfar  r/  r  r  r  r  cffr  cidr  r.  zunhandled font type 'r   )r   r7  r  r	  r   r  r  r  rw   r  r  )r.  r  r  r  r  s        r*   r  r  5N  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+E,=,=c,B+C1EF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   r6  r  rP  r  r  rp   )ro  list_rJ   rd  r  rH   s         r*   JM_get_ocg_arrays_impr  aN  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$ )Nrg  rW  rh  rw
  Lockedr*	  r)  rx
  r  rv
  )r:   r   r  r	  r  r   r6  r  rP  r  rp   r   r  )	confr   ro  r  rJ   rd  r  list1r  s	            r*   r1  r1  qN  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  rP  r  r  r
  r{  fz_buffer_extractrC   r  r  rp   )	r  r  rJ   rd  r  rv  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.
NrD
  
JavaScriptJS)r   r   r  r	  r  rz  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  rl  s    r*   rk  rk  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
faxra  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)r_  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.   )rC   r   ry  rn  r-  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_inforp   )r7  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   rb  orientation)r<   rw   r   fz_recognize_image_formatFZ_IMAGE_UNKNOWNr  fz_new_buffer_from_shared_datar>  fz_image_orientation_matrixr  fz_image_orientationr:  r  r:   r   r  r  r  rx  r  r  r  rJ   r  r  r  r  r  r  dictkey_image)r  
keep_imager  r  r_  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>.SanitizeFilterOptionsiO  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__O  s    G))+r,   c                F    [        S [        R                  " U5      X45        g r.   )r  r   ry  )r)   r  r  r   r  r
  s         r*   image_filter=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filter!O  s    D%.."5tCr,   r/   r2   r3   r4   r5   r   r  r6   r  r  s   @r*   SanitizeFilterOptionsr  O  s    	,	D 	Dr,   r  r   )r  r  r  r  r  )r.  r   ry  r  rn  r\  PdfSanitizeFilterOptions2r  r  r  r   )r   r.  r2  r  sanitize_filter_optionsfilter_optionsr   s          r*   re  re  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   r:   rt  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_SYMBOLrL   s
             r*   JM_fitz_configr-  8O  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.
rK  r   r   )r   r  r	  r	  r
  r  r6  r8  r  rO  r   rR  )r^  r  newcontr  r3  newcontsr  carrs           r*   r  r  _O  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_fontr  r+  r   r  r  rn	  r  pdf_add_cid_fontr  r  r  r  r	  r  r  r  r  rt  )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
rn  r3  r   r   r   r   )rC   r   rh  ri  r  r  r  r  r(  rn  r  r  rp  rP  r~  r  fz_make_irect)r!  rL   r  rd  s       r*   rI  rI  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	  rz  r  r  rP  r  r6  rp   r  )r   r#  r  rJ   r  rd  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 )Nra   r   z0 g r   ru  z g r   r   r   z rg z k rO	  r  )r3  r   r  r  PDF_ENUM_NAME_DA)r   r  rc  r   r   r  s         r*   r  r  O  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.   )4r  r   JM_make_spanlistr   r  rn  r  r  r  r  r  r  r  r   r  r_  r  r  r  FZ_STEXT_SYNTHETICra  rI  argbr  r*  r  r  r]  dictkey_charsr  r  JM_py_from_pointdictkey_originrm  r  r  rp   r:   r  dictkey_flagsdictkey_bididictkey_char_flagsr  dictkey_fontr  r%  r  	dictkey_crt  r  r  dictkey_spans)	line_dictrt   ra  r  r  	char_list	span_list	span_rect	line_rect
char_style	old_styler  rF  span_originr  r!  r  r  r*  r  	char_dicts                        r*   r@  r@  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)  rn  rw  r   N) fz_compressed_image_typer  r   ll_fz_compressed_image_bufferr   r  r  r  fz_new_buffer_from_image_as_pngr  r  rJ    fz_new_buffer_from_image_as_jpegr.  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   rX  r   r  r  r  rx  r  r  )r  r  r.  r  r  s        r*   JM_make_image_blockr^  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   rn  r  r  rz  r3  r  r:   r@  r  r  dictkey_wmoderD  r  dictkey_dirrm  r  rp   dictkey_lines)
r  r  ra  r  r  	line_list
block_rectrt   rL  rP  s
             r*   r`  r`  P  s-    ''(8(8*4??\c\n\noor,   c                F     [        R                  " U R                  X5      $ r.   )r  r   r  r   r   r	  rn  r2  fz_contains_rectr3  r  r   FZ_STEXT_BLOCK_IMAGEr  rz  r:   r  r  rm  r  r^  r`  rp   dictkey_blocks)	rR  r  ra  text_buffer
block_listr  r  r  r  s	            r*   r  r  P  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   rn  r   )rC   r   ry  r|  r!   r  r  r@  re  r  r  r  rP  rw  rn  )r  r!   rd  s      r*   r  r  Q  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   rn  r-  r  r  r	  r  r  r  r  r  r  fz_minfz_max)r4  page_mediaboxr2  s      r*   r  r  'Q  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_mergerw   )doc_desdoc_srcspageepageapager]  r%  r  r  	graft_map	afterpagecounterrT  r   s                 r*   r  r  DQ  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>.
r9  r   r=  r  r  Alpr   Nr   r  r   )r   r  r  r	  r   rV  r  r  rP  r  r  r8   fz_atoir  r  )r   temp_resrf  	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsrJ   rd  r  r  r   r  r  s                   r*   r  r  zQ  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  rp   JM_mupdf_show_warningsrw   rv   s    r*   JM_mupdf_warningr  Q  s,     ""4(/$() r,   c                d    [         R                  U 5        [        (       a  [        SU  S35        g g )NzMuPDF error: r&   )r  rp   r  rw   rv   s    r*   JM_mupdf_errorr  Q  s,    ""4(-vR() r,   c                F    [        U [        5      (       d   e[        X5      $ r.   )rC   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&   )rC   r   r  rn  r   r2  r	  r   r  r  r  r  fz_append_runer  r  r  )r   r   r  r  rt   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   rn  rD
  r  r  )
rO  r   r  r  r	  r
  r/  rR  r	  r  )r^  r   r  r"  rr  	newactions         r*   JM_new_javascriptr  Q  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re  s    r*   r	  r	  Q  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'  Q  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*   r{  r{  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	  rp   r  r  )r  r  thisobjnewxrefr  r   s         r*   r  r  R  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  rs  r
  r'  )r   r]  r  s      r*   r  r  .R  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)r.  r0  r1  r	   lexbufr  s         r*   r  r  :R  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
  ra  )rC   r   rM  r  r   re  r  r  rz  r  r{  r+  rj  r  r  r  rL  rh  ry  ri  rK  rn  ro  r~  r  )r  r  r  r  r  r  r   r  r  r  r  r  s               r*   r_  r_  HR  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   )rC   r   r_  r  ra  rb  r  r   r  rw  r  r~  r  r  )r  r]  ra  rb  s       r*   r  r  uR  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  rC   r   r.  r  rn  r   r2  rV  r   r  r  r  r  r  r  r  )r"  r   r   r  n_blocksn_linesn_chars	n_blocks2r  n_lines2rt   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   rE  r  r  rR  rN  )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$  rP  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*   rx  rx  R  s-    33QSS!##qssACC''r,   c                2    U R                   U R                  4$ r.   r  )r  s    r*   rD  rD  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  ra  rb  ri  rg  rh  )r'  s    r*   r  r  R  sn    
 TTVVQTTVVTTVVQTTVVTTVVQTTVVTTVVQTTVV	 r,   c                ^    U R                   U R                  U R                  U R                  4$ r.   r$  rP  s    r*   rm  rm  R  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  rn  r   r  r3  r   r   r   )rC   r   r  r@   r<   rn  r   r  r  fz_make_quadr  ra  rb  ri  rg  rh  r   rw  r  rP  r  r  r  r~  r  r  )r!  r'  r  rd  r  s        r*   r#  r#  R  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
ry  r   r  )rC   r   r
  r   r  rf  r6  r.  rP  r  r  r  r  r  fz_append_bufferr   )r  r3  r"  rd  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      $ )Nrn  r3  r   r   r   r   )rC   r   rn  rh  r(  r  r  r  r  r  ri  r  r  ro  rP  rw  r~  r  )r!  r  rd  s      r*   r  r  7S  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  rm  r  s     r*   r  r  NS  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	  r.  r\  rn  ry  r\  pdf_load_link_annotsll_fz_keep_linkr%  )r   r  r^  r5  rr  rc  r  s          r*   rW  rW  YS  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  r  )	r   r   ry  r  r  r  ra  rb  r  )r   rt  cb_sizer   r  r  s         r*   r  r  jS  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   rn  r   r   rn  r2  r<   r^
  hfuzzvfuzzr  fz_string_from_bufferfind_stringr   r  r  r  r  on_highlight_char)r   ro  r   r^
  Hitshitsr1  haystack_stringhaystackbeginr  insiderd  r  rt   r  r!  s                    r*   rn  rn  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_objrL  r  PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_FontrV  rh  r\  pdf_unmark_objr  rP  r  r  r  r   r   rp   r  )r^  r  r  r  rT  r  xobjr  rJ   rd  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  )rC   r   r   r<   r   r  r  rO  rP  r  pdf_array_push_text_stringpdf_array_push_arrayrR  r	  )r   r  rJ   r#  r^  r  rd  r  optopt1opt2	optarrsubs               r*   JM_set_choice_optionsr  S  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SigrC  r  )r   r}  r	  PDF_BTN_FIELD_IS_PUSHBUTTONrn  PDF_BTN_FIELD_IS_RADIOr~  r<  r=  PDF_CH_FIELD_IS_COMBOr>  r  r   rR  r  rM  )r.  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:  az  SR                  U5      n
[         R                  " [         R                  " U [        U
5      5      5      (       a  [        S[        U5       S35      eXVS-
  	 [        U5      nUS:  a  Mz  [         R                  " X[         R                  " U5      5        [         R                  " X5      n	[         R                  " U	5      (       d  [        SU S35      e[         R                  " U	5      nX:w  a  [        SU S3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!rO	  r   r   z	path to 'z' has indirectszcannot insert value for 'r   r  r  r   )r   r  r;   r<   ri  r   r  r	  rO  rl   pdf_dict_putpr  rz  r  r{  r  r  r  )r  r  r   
eyecatcherr^  r  r  rd  skeytestkeyr  r  r"  objstrnullvalnewvalnewstrrJ  s                     r*   r  r  6T  s    %J

&
&s
+CIIcNEu:DqA8Du:D!!#+G QhA$$U%8%8l1o%NOO)L,>+? OPPQhu:D Qh 
%";";J"GH!!#+Gw''3C5:;;##G,D3C5:;;
c1a
(C#C(F $qA&Gaw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  rg  r   rh  r  r)  )	r   rY  r	  rE  rE  JM_set_ocg_arrays_impr<   rP  r  )r  rv
  rW  rw
  rx
  r*	  ro  rJ   rd  item0r  s              r*   ru
  ru
  fT  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  r8  )ro  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   r9  r   r  N)r   r  r  r   r  r  rn	  r  r	  rV  rR  r  )r  r   r  r^  r  rf  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)=r^  r   c                   > [        TU S 5      $ r.   )r   )r   rX  s    r*   GETATTR)JM_set_widget_properties.<locals>.GETATTRT  s    vtT**r,   rR  r   r\  r   rJ  r  r  r%  r  r  rN  Nr  rM  r)  rX  MaxLenrQ  rK  rH  rD
  rI  r
  rZ  r"  r  r  rP  r  rT  r  r  r[  rD  r  r\  r  r]  r  r^  r  r_  r  r`  r  rO  rl  r   rm  TYesr  )5rC   r   r   r   r   r   r   r   r  r.  r  r  r  r  r  r<   rO  rP  rQ  pdf_field_set_fill_colorr  rN  r	  rO  r  r  r<  rM  pdf_field_set_displayr=  r>  r  r  r  rE  r  rn  r  r}  r  pdf_field_set_button_captionr  r
  r  pdf_set_field_valuerY  pdf_button_field_on_stater  r~  rS  pdf_set_annot_hotpdf_set_annot_activerT  )r   rX  r   r#  r^  r  r   rR  r   rot_matrJ   fill_colrc  rd  r  
border_colrs  r   old_namerX  r@  r  rI  r^  rP  r;  r   onstaterW  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  rG  rd  rP  rV  r  r  r  s                 r*   r  r  fU  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  rv   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   rL  r  rC   r.  r   rR  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecodepdf_update_stream)r.  r  r1  r]  r  r8  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$  r9  r   )rC   r   PdfGraftMapr   r  r   r   r  r  r  r	  r   rs  pdf_graft_objectr  r  ry  r
  r-  rR  )r  fsrcpager  r=  r  srcpagespagerefr2  r  rf  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.   )rC   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'rR  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imagerz  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                    [        U 5      er.   )rl   )r   excs     r*   r  r  U  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$ )Nra   r  r"  raw_unicode_escape)rC   r  r  r  r  )r  r#  r   rL   s       r*   rP  rP  U  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,   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.
    rn  N)ra  )r   r   r  s      r*   r  r  V  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  )r.  r  r  s      r*   r"  r"  V  s      ]]Q4<H r,   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(  rE  r  r   )r^
  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 0rn  r   zinvalid morph param 1T)rt  r   r   r   r<   r   r  s    r*   r  r  0V  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*   rl  rl  <V  s    
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  rl   r  r{   rd  )r'  q0s     r*   r  r  BV  s=    
!W <<  !#(8s    ::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(  rl   r  r{   r|  r{  rP  s    r*   r  r  OV  sI    
G 

+amm,,  !#(8s   1 AA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-   $ )Nra   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  \V  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   r8  )r   rM  r  r	  )r  rt  s   r*   r  $Page__add_text_marker.<locals>.finalqV  s,    q=""7;;=(82DhO r,   r   r8  r  )r  r  r   rM  r  r	  r  r#  pdf_add_annot_quad_pointrT  r  rl   r  r{   r   )	r)   r^
  r(  r  r   rH   r'  r  rt  s	          @@r*   rJ  rJ  nV  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  )rC   r  r   r   )ra  rL   s     r*   r	  r	  V  s/    a
%>!-
.C Jr,   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)rV  r  rp   )r.  r6  r  r  rd  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)rP  r<   rC   r   )r  rI  r  rd  r_  s        r*   rG  rG  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   r  r   g      )r  r   	fz_rotater  r  r  r  r  r  r  r  r^  fz_scalefz_translatera  rb  )r  r/  r1  r]  rn  rb  rx  trwtrhr   r  larger5  r6  smallr  r3  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  ra  rb  r  
first_charr  )rt   r  s     r*   r  r  V  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):
re  r&   )r   r<   r  )ra  rL   rd  s      r*   dir_strrI  V  sK    Cqa	CAK=
-CVaS| Jr,   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  [	        U5      S OSPM#     sn5      nODSR                  U  Vs/ s H'  n[	        U5      S:  a  U[	        U5         S   S OSPM)     sn5      nSU-   S-   $ US:  a3  SR                  U  Vs/ s H  oA[	        U5         S   S	 PM     sn5      nO-SR                  U  Vs/ s H  n[	        U5      S	 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[<>]ra   r  02xb7r   r  )r8   r  rt  r  r  )r   r!  r  r  r  otxts         r*   r  r  V  sD    tt!4!4::>77tTt!s1v|s1vclEtTUD77OSTt!s1v|F3q6N1%c*EtTD d{T!! !|wwDADq#a&>!,S12DABww6A3q6#,67$; U U B6s   (E.E*EEc                n   [        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S	 3-  nML  US
:X  a  US-  nMY  US:X  a  US-  nMf  US:X  a  US-  nMs  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-   $ )Nr5  r
  zUTF-16BE<r  )r  hex)r  r!  s     r*   make_utf16be!get_pdf_str.<locals>.make_utf16be)W  s1    sCj!Ia$<<QUUW}s""r,   ra   r
     r  )r  r  r  r  03or   z\br  z\tr:  rw  r   z\fr;  z\rz\267r  r  )rt  r  )r  rR  r!  r  r  s        r*   r
  r
  W  s     77# 	AV8?"7rCx$$T	FA82bX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_outputro  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:
re  )ri   r   
subprocessrl  
returncoder9  r  stdoutr:  r  platformr	  r   r
   dirnamer  r  r   r;   r<   rp   globr  )r  r\  cpr  r  r`  attemptsr
   pattern	tessdatasr   attempts               r*   r  r  QW  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   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 Archivera   zNo font code 'z' found in pymupdf-fonts.rn  zfontcode too shortr  r  re  zfont-weight: bold;zfont-style: italic;)r   ry  r   r  ru  r8   r<   r}  )fontcoderg  r  r   CSSFONTr  	font_keysfkeyr  r  r  fbuff	bold_textitalic_texts                 r*   css_for_pymupdf_fontrp  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,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 S	3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   rg  )r  r  r  r  r  r  r  r  zFont 'z' is unsupported)r  r  r=   r%  r$  r  r  ru  util_measure_stringr<   r   )r   r   r   r  r  r!  r  r   s           r*   rP  rP  W  s     ~~H""8T2HF8>!PTUPT1c!fslA"sAFPTUV|?''))"/(+X
 	
  	 	 4y8##
vhZ'78
99) Vs   2C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*   rt  rt  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	  rp   pathdictr   r?  r  s   r*   rp   jm_append_merge.<locals>.append7X  s0    s||((*+r,   r  r   r  r  r  z$could not merge stroke and fill path)rC   r	  r   r  r  r   rw  rw   r<   r  dictkey_itemsrG   rl   r  r{   r?  )r  resprp   r  thistyper  prevtype	previtems	thisitemsr  rK   r   s   `           r*   jm_append_merger  X  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  rp   rm  
layer_name)r  r  r   r  s       r*   jm_bbox_add_rectr  cX  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   rn  r-  ll_fz_transform_rectr  r  )r  r  r  r  r  color_paramsr!  s          r*   jm_bbox_fill_imager  jX  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)r  r   r  fz_unit_rectrl   r  r{   )r  r  r  r  r  rl  r  r  s           r*   jm_bbox_fill_image_maskr  pX  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r  r   ll_fz_bound_pathrl   r  r{   	r  r  r
   r	  r  r  rl  r  r  s	            r*   jm_bbox_fill_pathr  xX  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)r  r   ll_fz_bound_shaderl   r  r{   )r  r  shader  r  r  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r  r   ll_fz_bound_textrl   r  r{   )r  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  )r  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)r  r   r  )r  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  )	r  r  r
   r  r  r  rl  r  r  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   rn  r   r   r  r  r   r   r  )rw  rz  r<   rP  r  ra  rb  	linecountr   r  r  )
r  rG   r  r  rd  rt   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  r9  )
r  rw  rz  r<   r  rb  ra  r   r  rm  )r  r  rG   r  r  rg  rh  line2ri  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[  )	r  r   r_  r  r  rl  r  seqnorF  s	            r*   jm_trace_textr  X  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  rF  r  rl  r  rZ  	linewidth
spacewidthr   r3  layerr  r@  )ArC   r   fz_text_span
FzTextSpan	fz_matrixry  rI  r  r^  r  fz_transform_vectorr  r  r  ra  rb  fz_normalize_vectorr  r  r;  r  r8  r  r?  r  r5  r  rn  r  r@  rP  r   r<   rG   r  r  r  rV  r`  r  r  r  r  rp   r  r  r  r  r  r   r  r:   rD  r  r  r  fz_convert_colorr+  r  r  r  r  rm  r  r	  )%r  rF  r_  r  r  rl  r  r  out_fontr   r}  r  r/  	space_advr*  r+  ascsizedscsizefflagsr  last_adv	span_bboxrx  r@  rd  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+  r1  r  ll_fz_convert_colorr   r  rl   r  r{   )r  rl  r  rb  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.   )rC   r	  r   scissorsr  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   )rC   r   r  ry  r  trace_device_FILL_PATH	path_typejm_lineart_pathrw  r  r  rm  pathrectdictkey_rectr  r  r  r)	  r  rl   r  r{   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  )r  r  r   r  r  rl  r  r  s           r*   jm_lineart_fill_textr  Y  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  )r  r   r  s      r*   jm_lineart_ignore_textr  Y  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
$ )WalkeriY  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_closepathr  )r)   r  r  s     r*   r   Walker.__init__Y  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   rP  Fr  T)r  r  r  havemove	lastpoint
firstpointrD  rw  rz  rp   rl   r  r{   )r)   r  rH   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  )r  r  r   r  r`  r  fz_include_point_in_rectr  rD  r  rw  rz  rp   rl   r  r{   )r)   r  r  r  x2y2x3y3rB  rC  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)NrP  r   rn  )r   r`  r  r  r  r  r  rD  r  rw  rz  rp   r  r  r  r  rl   r  r{   )r)   r  ra  rb  rB  r  rG   s          r*   linetoWalker.lineto<Z  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  )rC   r  rw  r:   r(   rG   r   r`  r  r  r  r  r  r  ra  rb  r  r  r  rl   r  r{   )r)   r  ra  rb  rJ   rK   s         r*   movetoWalker.movetoQZ  s   	!&!9!9''-HHLL"DHH (($((*;*;<<$)$6$6**,,**,,**,,**,,	%! #'(("4"4DHH !DHH!"DHH 	##(8	s   E$E( (!F	rx  )r2   r3   r4   r5   r   r  r  r  r  r6   r  r   s   @r*   r  r  Y  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   rn  ro  r  r  r_  r  r:   rw  rz  r  fz_walk_pathFzPathll_fz_keep_pathr   rl   r  r{   )r  r  r
   walkers       r*   r  r  nZ  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  rl  r  r  r  Fr  z[ r   z] r  r6  r  r  r   )*rC   r   r  
pathfactorr!   r"  r@  r  r  ry  r  trace_device_STROKE_PATHr  r  rw  r  r  r  r  	start_capdash_capend_caplinejoindash_lenr	  r  rP  floats_getitem	dash_listr   
dash_phaserm  r  r  r  r  r  r)	  r  rl   r  r{   )r  r  r
   r  r  r  rl  r  r  r  rd  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   ry  r  trace_device_CLIP_PATHr  r  rw  r  rt  rm  compute_scissorr)	  r  r  )r  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   ry  r  trace_device_CLIP_STROKE_PATHr  r  rw  rm  r  r)	  r  r  )r  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)	  )r  r  r   r  r  r
  s         r*   jm_lineart_clip_stroke_textr
  Z  !    99CIINIr,   c                h    U R                   (       d  g [        U 5        U =R                  S-  sl        g r  r	  )r  r  r   r  r
  s        r*   jm_lineart_clip_textr  Z  r  r,   c                h    U R                   (       d  g [        U 5        U =R                  S-  sl        g r  r	  )r  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)	  )r  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 Nra   r  )r  r  r   s      r*   jm_lineart_begin_layerr  [  s    r,   c                    SU l         g r  r  r  s     r*   jm_lineart_end_layerr  [  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 )Nr:  )r   r   isolatedknockoutr  rZ  r   r  r   )	r  rm  rt  r   fz_blendmode_namer)	  r  rw  r  )r  r  r3  r  r  r  r  r  s           r*   jm_lineart_begin_groupr  [  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  .[  s    99IINIr,   c	           
     `    [        XSXEXgU R                  5        U =R                  S-  sl        g r  r  )	r  r  r   r  r  r  rl  r  r  s	            r*   jm_lineart_stroke_textr   5[  s#    #QsyyIIINIr,   c	                <    UR                   U l         [        X5        g r.   )r  jm_increase_seqno)	r  r  r
   r  r  r  rl  r  r  s	            r*   jm_dev_linewidthr#  :[  s    $$CMs r,   c                x     U =R                   S-  sl         g ! [         a    [        (       a
  [        5         e f = fr  )r  rl   r  r{   )r  r  vargss      r*   r"  r"  ?[  s1    		Q	 N$4s    !9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|  rf  )rB  rC  s     r*   r  r  G[  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_FilteriW[  c                B   > [         TU ]  5         U R                  5         g r.   r  r  s    r*   r   !JM_image_reporter_Filter.__init__X[  s    %%'r,   c                    [        U[        R                  5      (       d   e[        U [        R                  " U5      X45        [
        (       a  gg r   )rC   r   r  r  ry  r   )r)   r  r  r   r  s        r*   r  %JM_image_reporter_Filter.image_filter\[  s=    #u////ennS14?;  r,   r/   r  r   s   @r*   r(  r(  W[  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  ie[  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  r  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__f[  s    ""$$$&""$$$&$$&##%##%((*$$&""$r,   )r  r  r  )r2   r3   r4   r5   r   r  begin_layerr  	end_layerr  	fill_pathr  stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shader  
fill_imager  fill_image_maskr6   r  r   s   @r*   r  r  e[  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   re  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)r)   re  r  s     r*   r   %JM_new_output_fileptr_Output.__init__[  sC     !!#r,   c                8    U R                   R                  X#5      $ r.   )re  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.   )re  tell)r)   r  rL   s      r*   rO  !JM_new_output_fileptr_Output.tell[  s    hhmmo
r,   c                6    U R                   R                  5       $ r.   )re  truncate)r)   r  s     r*   rR  %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_bytesre  r   )r)   r  data_rawdata_lengthr  s        r*   r   "JM_new_output_fileptr_Output.write[  s%    ((?xx~~d##r,   r  )r2   r3   r4   r5   r   r
  rO  rR  r   r6   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   rz  r  rp   rm  )r  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   ra   )*r   r   r/  r0  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr1  r2  r3  r4  r5  r6  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr7  r8  r	  r  r)	  r  r  r  r  r  r  r   ry  r  r  rx  r_  r  r  r  rn  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  r  r  r  r  r	  r  r  r  r  rx  r  r  )'r2   r3   r4   r5   r%  r   r  r<  r   r=  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr
  clip_stroke_textr"  r>  r?  r@  rA  rB  rC  r  pop_clipr  begin_groupr  	end_groupr  r:  r  r;  r6   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 r^  )#r   r   r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r	  r  r)	  r  r  r:   rw  r   r  r  r   ry  r  r  rx  r_  r  rn  r  r  r  r  r  )r)   r	  r  s     r*   r    JM_new_texttrace_device.__init__\  s'   ""$$$&""$$$&$$&##%##%((*$$&""$



>>#>>#>>#r,   )r  r  r)	  r  r  r  r  r  r	  r  rw  r  r  r  rx  r  r  )r2   r3   r4   r5   r%  r   r"  r<  r#  r=  r  r>  r   r?  r  r@  rA  rB  rC  r  r:  r  r;  r6   r  r   s   @r*   r  r  \  sB    "H "I"K$I(K(K"J"J'O(K$Ir,   r  c                    U R                  5       nSS KnUR                  S5      nUR                  SU S35      nUR                  S5      nSnSU S3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>
            z?
            <?xml version="1.0"?>
            <document name="z">
            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>
            ra   z{"document": "z", "pages": [
r  rZ  r  xhtml)r  textwrapdedent)
rd  rk   r  ru  r  r  rt  r   rZ  r!  s
             r*   ConversionHeaderrw  7\  s    		A??  D // %J ' C
 OO  E DXJo6D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$ )	Nra   z]
}z</body>
</html>
z</document>
r  rZ  r  rt  )r  )rd  r  r   rZ  r  r  rt  r!  s           r*   ConversionTrailerry  k\  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.
rz  r   )rl  r   r|  r   rt  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)rC   r   r   r   rV  rW  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!   )rC   r9   r  r*  s    r*   canonr  \  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.   )rC   r  r   r  r  )r  rJ   r  s      r*   chartocanonr  \  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  rD
  r[  r  r   r  r   )	r   r  r	  r  string_in_names_listr   rz  dest_is_valid_pager  )r  rq  page_object_nums
names_listr  s        r*   dest_is_validr  \  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  rP  )r  r  r]  numrd  s        r*   r  r  \  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
  )rC   r  rP  r<   match_string)r  ro  rd  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      n[        [        U R                  S-  5      S-  5      R	                  SS5      nU SU 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  r   zD:%Y%m%d%H%M%Sr  r
  )timer  r"  altzonerjuststrftime	localtime)r  r!   r  tztstamps        r*   r  r  \  s     C$%&,,Q4AS#$r)+11!S9A3as!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/   r0   s    r*   r   ElementPosition.__init__\  r  r,   r/   NrC  r/   r,   r*   r  r  \  s
    Nr,   r  c                     [        5       $ r.   )r  r/   r,   r*   make_story_elposr  \  s    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.
r:   r   )r  r  r  r3  rW  c                    U R                   $ r.   )r  )r3  s    r*   r
  )get_highlight_selection.<locals>.<lambda>-]  s    r,   r
  rE  )r   r(  r   r!  rb  r  r  r|  r{  r
  rp   r  rM  r/  ra  insert)r   r  r  r  r  rW  r  r3  rt   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  lookuprl   )r   r  r  s      r*   r/  r/  G]  sA    +$$T*+ J  J   " 22c                    UR                   UR                   -
  nUR                  UR                  -
  n[        R                  " X0R                   -  X@R                  -  -   5      $ r.   ra  rb  r   fz_absr  r!   r  dxdys        r*   hdistr  Q]  D    	
qssB	
qssB<<UU
R%%Z/00r,   c                   [        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(  r|  r{  r   r   r/  r  ra  rb  rP  rp   )r   r  rowsr   r/  r  delta_hdelta_vr!  rowrd  rectsnrows                r*   
make_tabler  W]  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  r6  rE  r  r  rP  r  r8  r  )r   r#  r^  
PDFNAME_COry  r   rJ   r  r  rd  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
  )
rC   r   r   r<   r  r   r_  r  ra  rb  )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.   )rC   r   r  ra  rb  r(  ri  r   rn  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   r3  r   r   rn  r   zarg=z ret=r
  r  )r<   rC   r   r   rl   )r  rB  rC  rL   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]  rB  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.   )r9   r  rR  floor)ra  rR  s     r*   convert util_make_irect.<locals>.convert]  s+    tyy|$$tzz!}%%r,   FT)r*  )r]  rB  r  r  r  r  r  r!   r  r  r@  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   r{  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  rm  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.   )rm  r   rz  r  r@  rA  s     r*   re  re  
^  s-    #### r,   c                T    [         R                  " [        U 5      [        U5      5      $ r.   )r   fz_is_point_inside_rectr  r  )r  r!  s     r*   r  r  ^  s%    (( #" r,   c                f    [        [        R                  " [        U 5      [	        U5      5      5      $ r.   )rm  r   r  r  r  )r!  r  s     r*   r_  r_  ^  s-    **" # r,   c                Z    [        U 5      n[        U5      n[        R                  " X#5      $ r.   )r  r#  r   fz_is_point_inside_quad)rm  r   r  r'  s       r*   r  r  "^  s'    AA((..r,   c                f    [        [        R                  " [        U 5      [	        U5      5      5      $ r.   )rD  r   r`  r  r  )rf  r  s     r*   r  r  (^  s-    $$ '!&) r,   c                f    [        [        R                  " [        U 5      [        U5      5      5      $ r.   )rm  r   r  r  r  s     r*   rb  rb  1^  s-    ## r,   c                f    [        [        R                  " [        U 5      [        U5      5      5      $ r.   )rx  r   r^  r  )r  r  s     r*   r  r  :^  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/   )rC   r   r   r   ry  r  r|  r!   r  r  r@  re  r  r   r  r"  r  
float_infoepsilonr  )r  rL   r0  r!   detrc  rdets          r*   r  r  C^  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   rg  )r   r  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  ru  rj  rL   s               r*   rr  rr  j^  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  ra  rb  r  r^  r`  )	r  rm  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  ra  rb  r  rx  r^  )r  rm  r  r  r  r  r  s          r*   rf  rf  ^  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   )r  r  )	h0r  r  rJ   re  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  )rC   r   r  r  r   r  r  r  r  r<   r^
  r#  r  r  rh  rg  vdistri  r  rp   )r  rt   r  r  r  ch_quadrE  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.
rK  r9  r$  r  r  r  r  r8  UserUnitrn  r  r   r  r   r9  r  rg  r  rX  rm  r  N)r  r   ru  r	  r   r  rW  rR  rP  r<   r  r   rs  r   r  r  rE  r  r  r   r  rE  r  r  r8  rM  rF  r1  )rv  rw  	page_frompage_tor]  r%  copy_annotsr{  known_page_objspage_refr  rd  r  r  rJ   r  r  r  r  r   r  s                        r*   ru  ru  ^  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  r/  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-lrP  Nr
  z-pr	  r   r   )r  r  paper_sizesr=   )r  r  r  r   s       r*   r  r  $_  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  rL  )r0  r  b8)r  r0  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  rn  )ro  i  )rn  i  )rn  i  )rn  ro  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar/   r/   r,   r*   r  r  8_  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  )r.  ro  s     r*   r  r  p_  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   r6  r  rP  r  pdfobj_stringr[	  array_get_boolr  r  r  r  pdf_is_embedded_fileembedded_file_namer	  rx  r
  pdf_is_jpx_imager  r  r  ry  r  r  rz  rl  )r  r
  rL   rP  rd  oor  r   s           r*   r6  r6  t_  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                   SUS 3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   rn  r  r   rz  r   r  i  zCannot set width for 'z
' in xref r@  )r  r   ra  r   r8   r  r9   r  r%  r  set_font_widthr(   )r   r  r.  rS  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(:d1XFG s   DD,D	Dc                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   )rk  )srgbr  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!  ru  r  s       r*   rk  rk  _  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  rP  r  )r  r  rJ   str_rd  s        r*   r  r  _  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_outlinesr  r   r  r	  rE  rR  )r.  outlinesrq  r  r  r  r  currentr  r  r[  s              r*   strip_outlinerI  _  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	  rI  rE  r
  rR  rM  )	r.  rG  rq  r  r  r  r  r
  	old_counts	            r*   rF  rF  `  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,   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*   rR  rR  7`  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  C`  r  r,   r/   single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsr@  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.
rO  Nr   )_apply_pagesz.2fzs: count pages.r  forkzUnrecognised method=r   zs: work.z	s: total.)r  r   r   rP  r<   rp   ra   rX  r(   _multiprocessing_fork)r
   r  rP  rQ  rR  rS  rT  r@  r  rU  rV  r
  rL   r   rv  r   r!  rX  r  	num_pagess                       r*   apply_pagesr]  I`  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')
r@  r  rU  r~  r  r  r  r  rW  rV  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  rW  )rQ  r@  r  rU  rV  )r:   r]  r   r
  )r
   r@  r  rU  r~  r  r  r  r  rW  rV  	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.   )rC   r   r   rx  r]  ry  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  r[  r\  r]  r^  r_  r`  )r   rZ  r  s      r*   rY  TOOLS._fill_widgeta  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_contents.a  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  r.  r  )r   r/  r  r  contbufr  s         r*   r7  TOOLS._insert_contents5a  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  rF  r   z RG
r   r#  z rg
r   r   r  ra   )r  r  r  r  r  r|  rf  rZ  )r   rB  rC  r\  r   scscolr  ra  np1np2r  r&  rX  r  rZ  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                `   [         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                  S SUR                  S S3nUUR                  S SUR                  S S	3-  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.  r  r  r   r  r  r5  s
Q
r  rp  r  ra  rb  r   )r   rB  rC  rh  r\  r  r&  rX  r  r   rm  ra  rZ  r  r@  r+  r
  botr$  s                      r*   r  TOOLS._le_buttda  s     /4.C.CEr.^+qQdC1IAAr"u:~#Aqt9}"WIceeAYaay5
q	355)4((
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   q
r5  b
Q
)
r  rp  r  r(  _oval_stringr   r1  r!  rS  r   )r   rB  rC  rh  r\  r  r&  rX  r  r   rm  ra  rZ  r  r@  r+  r!  r$  s                     r*   r  TOOLS._le_circleta  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U UR                  S S	UR                  S S
3nUUR                  S S	UR                  S S3-  nUUR                  S S	UR                  S S3-  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.
        rx  r   r.  r   r
  r   r  r  r   r  r  r5  rz  rt  r   rB  rC  rh  r\  r  r&  rX  r  r   rm  ra  rZ  r  r@  r  r$  s                    r*   r  TOOLS._le_closedarrowa  s?    /4.C.CEr.^+qQdC1I QB$]aR4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}


WIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
ilV##
dkH$$	r,   c                T   [         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                  S SUR                  S S	3nUR                  UR                  UR                  -
  S-  -   U-  nUUR                  S SUR                  S S
3-  nUR                  UR                  UR                  -
  S-  -   U-  nUUR                  S SUR                  S S
3-  nUR                  UR
                  UR                  -
  S-  -   U-  nUUR                  S SUR                  S S
3-  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.
        rx  r   r.  r   rO  ry  r  r   r  r  r5  rz  )r  rp  r  r(  r   rS  ra  rb  r1  r!  r   r   rB  rC  rh  r\  r  r&  rX  r  r   rm  ra  rZ  r  r@  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-7)ACC7!ACC7$/TTQTTADD[C''2-
QqQt$$TTQTTADD[C''2-
QqQt$$TTQTTADD[C''2-
QqQt$$
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U UR                  S S	UR                  S S
3nUUR                  S S	UR                  S S3-  nUUR                  S S	UR                  S S3-  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.
        rx  r   r.  r   r
  r   r  r  r   r  r  r5  S
Q
rt  r~  s                    r*   r  TOOLS._le_openarrowa  s<    /4.C.CEr.^+qQdC1I QB$]aR4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}


WIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
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U UR                  S SUR                  S S	3nUUR                  S SUR                  S S
3-  nUUR                  S SUR                  S S
3-  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.
        rx  r   r   r   r
  r  r  r   r  r  r5  rz  rt  r~  s                    r*   r  TOOLS._le_rclosedarrowa  sC    /4.C.CEr.^+qQdC1IQ!A#q\Q!A#q\!R1Q3)^rRTA2J R1Q3(]bBqD!9n


WIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
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U UR                  S S	UR                  S S
3nUUR                  S S	UR                  S S3-  nUUR                  S S	UR                  S S3-  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.
        rx  r   g      @r   r   r
  r  r  r   r  r  r5  r  rt  r~  s                    r*   r  TOOLS._le_ropenarrowa  s?    /4.C.CEr.^+qQdC1I QB$]aR4)m!R1Q3)^rRTA2J R1Q3(]bBqD!9n


WIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
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                  S SUR
                  S S3nUUR                  S SUR
                  S S	3-  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   r  r  r   r  r  r5  rs  )	r  rp  r  r(  ra  rb  r   r!  r   )r   rB  rC  rh  r\  r  r&  rX  r  r   rm  ra  rZ  rwr+  r!  r
  ru  r$  s                      r*   r  TOOLS._le_slasha  s     /4.C.CEr.^+qQdc!Qi#%Ar133Q;b!##A+>ddRiddRiWIceeAYaay5
q	355)4((
ilV##
dXo	r,   c                l   [         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
                  S SUR                  S S3nUR                  U-  nUUR
                  S SUR                  S S	3-  nUR                  U-  nUUR
                  S SUR                  S S	3-  nUR                  U-  nUUR
                  S SUR                  S S	3-  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.
        rx  r   r.  r   ry  r  r   r  r  r5  rz  )r  rp  r  r(  r   ra  rb  r1  r!  rS  r   r  s                      r*   r  TOOLS._le_squarea  sS    /4.C.CEr.^+qQdC1IA2q	MQB$]J1"qb!'DD2I7)ACC7!ACC7$/DD2I
QqQt$$DD2I
QqQt$$DD2I
QqQt$$
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UR                   S SUR                  S S3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                    U R                   S SU R                  S SUR                   S SUR                  S SUR                   S SUR                  S S3$ )Nr  r   r  r  )r  r'  r!  s      r*   bezier"TOOLS._oval_string.<locals>.bezierb  sQ    cc!WAacc!WAacc!WAacc!WAacc!WAacc!WDIIr,   r  rO  r  r   r  r  )rB  rC  r  r  r  r  r  mor  muol1ol2or1or2ur1ur2ul1ul2r$  s                      r*   r{  TOOLS._oval_stringb  s@   	J 7c/!7c/!7c/!7c/!Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$Gu$$Qxqa%
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   rC   r   r   r  r  r  r	  r   r  r  r  rl   r  r{   )r   rE  this_annot_objr^  r^  r  r&  s          r*   Tools__parse_da(TOOLS._parse_da.<locals>.Tools__parse_da0b  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)rm  ra   r   rG  r   rF  rt  r   r   ra   ru  rv  r   r  rn  )r  r   Tools_parse_dar   r;   rV  r  )
r   r  r  r  r/  rc  rw  rd  rH   r  s
             r*   r  TOOLS._parse_da*b  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   rE  r  r^  s       r*   r  TOOLS._reset_widgetab  s5    
,,Z8**>:c2r,   c                    U R                  SS9nUR                  (       d  [        [        R                  " 5       5      $ [        [        U5      5      $ r  )r  r   rx  r   ry  r  )r   r  s     r*   r
  TOOLS._rotate_matrixhb  s>    ..%.0!!$U^^%566 !6w!?@@r,   c                    [        X5        g r.   )r  )r   rZ  s     r*   r  TOOLS._save_widgetob  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   rC   r   r   r  r  r	  rE  rl   r  r{   )r   r&  rE  s      r*   
_update_daTOOLS._update_dasb  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*   rt  TOOLS.image_profileb  s    
  33r,   Nc                *    U b  [        U 5      q[        $ )z+
Set MuPDF error display to True or False.
)rt  r  rW  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.
)rt  r  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)rG
  rL   s     r*   r  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   r7  r  r	  r6  r  rP  r  rO  r8  rM  rR  )
r.  r  r  r^  r  dfontsrJ   rd  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_widthb  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  rn	  fz_disable_iccr  s    r*   set_iccTOOLS.set_iccb  sB     ""##%67GH    " !r,   c                P    U b  [        U 5      [        l        [        R                  $ )z!Set / unset MuPDF device caching.)rt  rz  r   r  s    r*   set_low_memoryTOOLS.set_low_memoryb  s!     >)-bH&)))r,   c                    U bC  [        U 5      [        l        [        (       a$  [        R
                  " [        R                  5        [        R                  $ )z Set / unset small glyph heights.)rt  rz  r   r  r   set_small_glyph_heightsr  s    r*   r  TOOLS.set_small_glyph_heightsb  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.
)rt  rz  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.
)r^  r   graphics_min_line_width)r:   r   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr/   r,   r*   show_aa_levelTOOLS.show_aa_levelc  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_shrink$c  s8    
 c>  "Q;!!3=1 r,   c                     g)z
MuPDF current store size.
Nr/   r/   r,   r*   
store_sizeTOOLS.store_size0c  r  r,   c                    U bC  [        U 5      [        l        [        (       a$  [        R
                  " [        R                  5        [        R                  $ )z1
Set ascender / descender corrections on or off.
)rt  rz  r   r  r   set_skip_quad_correctionsr  s    r*   unset_quad_correctionsTOOLS.unset_quad_corrections8c  s:    
 >-1"XH*{//0N0NO---r,   r8  r/   rn  rm  r.   )3r2   r3   r4   r5   r%  rb  rw  rY  r  r7  rp  r  r  r  r  r  r  r  r  r  r{  r  r  r
  r  r  r  r  rt  r  r  r  r  r  r  r  r=  r  r  r  r  r  r  r  r	  r  r  r  r-  fitz_configr6   r/   r,   r*   r  r  a  s1   7  .     #3 #3J      &  *  &  &  &    *  6 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  zc  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=rO	  zRemoving existing link pfrom=zCreating symlink: z -> )r_  r(   r  ri   r
   normpath__file__systemr  r;   r  r  r9  r~  r:  islinkr  r  symlink)

make_linksr_  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)FitzDeprecationic  r/   Nre  r/   r,   r*   r  r  c  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)rt   r  r   rn  )warningsformatwarningr   r(   r  )r   catrk   rm   rf   rt   r   r  s           r*   showthis!restore_aliases.<locals>.showthisc  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.
Nra   Fr8  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_functiond  s@    (K>@VW_V``bc!0 "D3F33r,   z;*** Deprecated and removed in version after v1.19.0 - use "z". ***
)r  modulesr2   rt
  r   r  rj  r%  )r*  r,  r+  capitalise_nextr  r.  r-  s   ```   @r*   _aliasrestore_aliases.<locals>._aliasc  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"  getTextPagerO  r  setBlendModer  r  r  r  r  r  r  setOCr  r  rQ  fileUpdrr  rs  r  convertToPDFr  r}  r~  deletePageRanger  embeddedFileAddr  embeddedFileCountr  embeddedFileDelr  embeddedFileGetr  embeddedFileInfor  embeddedFileNamesr  embeddedFileUpdr  r  r  r  r-  rO  getOCGsrg  getPageFontListrk  getPageImageListr{  r  r  getPageXObjectListr  getSigFlagsr  getToCr  r  r  	insertPDFr  rq  	isFormPDFr|  isPDFr  r  r$	  r  rE	  rU	  r  r  rq	  rq  r{	  pageCropBoxr  rE  
PDFCatalogr  
PDFTrailerr	  previousLocationr  rd
  r  rF
  r
  setToCr
  rG  rL
  rp  isStreamrY  rF  rK
  rq  r  metadataXMLr[  getRectArear6  r7  r|  r{  r  r  r  	preRotater  preScaler  preShearr  preTranslater  	getPDFnowr
  	getPDFstrrP  getTextlengthrt  ImagePropertiesr  	PaperRectr  	PaperSizer  r  r?  r  r  r  r  r  r  r  r  r  r   r%  r*  r-  r1  r4  r8  r;  r  rz	  r  r  CropBoxPositionr  rH
  r  rr  r  r  r  r  r  r  r  r[  r  r  r  r  r  r  rJ
  r  getDisplayListr  ra  getFontListrn  r  getImageListr  r  getSVGimager  r  r  r  r9  r  r]  r  
_isWrappedrG  r  r2  r$  r  MediaBoxSizerZ  r  rw  rc
  r  
setCropBoxr8  setMediaBoxr  r  showPDFpagerq  rF  r  rR  r  r   
copyPixmapr  r  invertIRectr  pillowWriter
  
pillowDatar  
writeImagewritePNGr?  r  setResolutionrH  rK  r_  r  getImageData
getPNGData
getPNGdatard  r  r  r
  r.   )r#  filterwarningsr  showwarningr   rV  r   ri  rg  r|  r  r   r  r  r(  rQ  r  )r&  r2  s     r*   restore_aliasesrt  c  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.
Python z running on rH  l        z-bit).
)ra   r   r  r#  )r   r   r   r   r   N)r  typing.Sequencer  r   )rR  mupdf.PdfObjrT  r9   )r.  zmupdf.PdfDocumentrR  rv  rT  r9   )strict)r  rs  )r   r   r   r  r  r   )r.  r   r  r9   r  r   )r^
  r  r  r   )r  r  r  rt  )r  r  )r'  r  r  rt  )r!  r  r  rt  )r  z&typing.Union[list, tuple, float, None]r  r  r  r  )r.  r   r6  ru  )
r   r  r!  ztyping.Union[list, tuple, None]r  rt  r  r9   r  r  )r  r  r  r  r.   )
ri  r  rg  rq  r  AnyTyper   rq  r  r  )r  r  r   )
r   r  r   r  r   r  r  r9   r  r  )r.  r  r  r:   )rB  r   rC  r   r  r|  )rw  )rd  r  rk   rq  )rd  r  )r   r[  r  r9   )r   r[  r   z'Annot'r  r  r  ro  )r  r   r  r   r  r   r  r   )r   r  r  r9   )r  r   r   )r   r   r  r9   r  r9   r  r   )r  r  r  r(  )r  r  r  r   )r   r[  r  z'Font'r  r  )r?  r9   r  r   )r  r9   r  r  (  r%  
__future__r   atexitr  collectionsrg   r>   r  ri   r  ra  r9  r
  r  r  r  r  r#  r  r  ra   r   importlib.utilr   rM   r   r=   r^  r\   r_   r   rR   rU   rS   rW   rY   r]   r`   r(   rw   r{   r  r$  r%  r  r   r   r  r  r   rz  r   __annotations__r   r   r   r   r  	machinerySourceFileLoaderload_modulerB  rC  r   rl   r@   r   reinit_singlethreadedr   _buildr   r   r   r   r   r   r   r   r  r  pymupdf_dater   r;   rI  FZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHversionVersionFitzVersionBindVersionDater   format_gr  r  r  r  r  Optionalr  r:   r  r  rr  Unionr9   r  Sequencers  r  rq  r   r   r   r   r   r   r   r   r   r!  r   ry  r  r)  rE  rV  FzDocument_insert_pdfr  r   r?   r  r  r  rg  r|  r  rz  r  rX  r  r  r  r   r  r  r  r(  r  r  r  rQ  ri  r0  r2   _selfr  rG   r;  _valuer8   rj  
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_ADLAMAnyrx  Base14_fontnamesr  r  r  r  r  r~  r  r  r  r  r  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  r=  r	  r;  r<  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_WHITESPACEra
  FZ_STEXT_PRESERVE_IMAGESr  FZ_STEXT_INHIBIT_SPACESTEXT_INHIBIT_SPACESFZ_STEXT_DEHYPHENATEr_
  FZ_STEXT_PRESERVE_SPANSTEXT_PRESERVE_SPANSFZ_STEXT_MEDIABOX_CLIPrb
  $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_CLIP	TEXT_CLIPFZ_STEXT_LAZY_VECTORSTEXT_LAZY_VECTORSFZ_STEXT_FUZZY_VECTORSTEXT_FUZZY_VECTORS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  r0  r,  r.  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_ascrG  r  ri  r  rJ  rC  r  r  r/  r2  r  
dictkey_dar  r  dictkey_descrb  dictkey_effectr  r  r  rF  rH  rI  dictkey_glyphr  r5  r  rz  r  rc  r  r3  r0  r  rE  r  r  r  rK  r  r  r4  r  r1  r  r  r  ra  r  r  r  r  rc  rd  r   r  ru  r  r  r%  r$  rZ  rV  r  r7  ra  rc  rg  rf  r<  rn  r  r  r   r  r+  rw  r  r  rO  r/  r  r  r  r  r  r  r  r  r  rV  rT  r  r  r  r  r  r?  r  r  rO  r  rU  ry	  r  r]  r  r'
  r  r(
  ri  r3  r?  rO  r  r  r  rT  rU  rI  rV  r\  rh  r  r  r>  rt	  rC  r  r  r  ru  r  r  r  r  r1  r  r  rk  r  r  r  r  re  r-  r  r  rI  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  rx  rD  r  rm  r#  r  r  r  rW  r  rn  r  r  r  r  ru
  r  r  r  r  r  r  r-  r  r  r  r  r*  r  r  r,  rL  MSG_BAD_DOCUMENTMSG_BAD_FILETYPEMSG_BAD_LOCATIONrj  rO  r  rm	  r  r
  r  rM  r  MSG_COLOR_COUNT_FAILEDr  r{  r  r  r_  r[  rn  r  r  rn	  r  rP  r  r  r"  r  r  rl  r  r  r  rJ  r	  r&  rG  r  r  rI  r  r
  r  rp  rP  rt  r  r  r  r  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  rw  ry  r  r  r  r  r  r  r  r  r  r  r  r  r/  r  r  r  r*  r  r  r  re  r  r_  r  r  rb  r  r  rr  r  rf  r  r  ru  r  r  r  r  r6  r  r@  rk  r  rI  rF  r  r  r  r  rR  r  r]  r
  r  r  r  r  registerr  r  r   r!  ru  r  r  r
  r  r	  recover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadtabler  DeprecationWarningr  rt  __version__r  r_  maxsize)rd  s   0r*   <module>r     s   #     	  	   	  
         sl 2::>>2C#DcjjY rzz~~m<cjjQ
 v ! > <..2  **\9CFBC $  #$@!D  /6' ' :04- 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P	 P	f BO O.+ +Z "'"="=}R }R~e )& )&X|" |"~ t tno od:V :. e, e,NN Nb
 O Of ;|d: d:Nus' s'lx xveX eXP` `F	[ [|hB hBVW Wt
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 %%	*$33*$5555 ++33 #(#M#M  ));; #CC  " ? 
!"
"#  +	+ 
!"
"#  +	+  
!"
"#  	
 ++ # 
"#
  +	+  
!"
"#  	
 ++ 
!"
"#  	
 ++ 
!"
"#  +	+ 
!"
"#  +	+      


        
      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/*2 %P.3=l
2>&&<
Vr84n$%P .0j/d(&"JN0I $ *.6(("J%P7t(02/ ;|4)n,"^B)X B
 >. 
)XD$N<KZ7:0\(Tl(%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		H

-.$.
#2.b"J2jCSN %)TRVBB!B3:BIOBB BJ': ':T',DNJ1X$N.bUp8NpU   pf!H4n*($
!
+ u66 . .>$5?? $0$P/5?? P/f3%eoo 3%l1 1h*

8$f F FR1( (VG8 #t$4 Q* Q*h  $$4D  Hf/$N,6 ">2D2N)(6
p2/dH@4$)X,     ! 	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 }[  H LN  0"Z/J0~\  sM   7AK. AK?AL 3AAL K.
AK<K;AK<LALLALL
AL'L&AL'