
    mi                   t%   U d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddddddddddd
dZ eej4                  j7                  d      ej8                  	      a eej4                  j7                  d
      ej8                  	      a e       Z da!d Z"d Z#d Z$dddddddddd	dZ%dddddddddd	dZ&d@dZ'dAdZ(d Z) e*ejV                  dz    e,d      z         Z-d Z.d Z/ e/dd      Z0 e.dd      Z1 G d d      Z2 e2       Z3dZ4de5d<   da6d  Z7d! Z8ej4                  j7                  d"      Z9e9 e'e: d#e9d$        e'e: d%ej4                  d&           e9dk(  rddl9Z9n.ddlZejv                  jy                  d'e9      j{                         Z9e9j|                  j~                  j                  Z@n2	 dd(lm@Z@  eBe@d)      r e@j                           e@j                          d* ZEdd+lFmGZG dd,lFmHZH dd-lFmIZI dd.lFmJZJ dd/lFmKZK dd0lFmLZL dd1lFmMZM dd2lFmNZN e@j                  ZPdZQ eRePj                  d3      D  cg c]
  }  eE|        c}       ZTeTe@j                  e@j                  e@j                  fk(  s.J d4eTd5e@j                  e@j                  e@j                  f       eKePdfZXePZYeKZZdZ[d6d7d8Z\e\Z]	 ej                  Z^ej                  e^   Zdej                  ee   Zfej                  eg   Zhej                  ejdf   Zkej                  ej                     Zmej                  en   Zod9Zpd:Zqd;Zrd<Zsd= ZtdBd>Zud? ZvdBd@ZwdA ZxdZy G dB dC      Zz G dD dE      Z{ G dF dG      Z| G dH dI      Z} G dJ dK      Z~ G dL dM      Ze1rej                   Z G dN dO      ZeZ G dP dQ      Z G dR dS      Z G dT dU      Z G dV dW      Z G dX dY      Z G dZ d[e      Z e       Z G d\ d]      Z G d^ d_      Zdd`lmZ  G da db      Z	 	 	 	 	 	 dCdcZ G dd de      Z G df dg      Z G dh di      Z G dj dk      Z G dl dm      Z G dn do      Z G dp dq      Z G dr ds      Z G dt du      Z G dv dw      Z	 ej4                  e   Z	 e@j:                  j=                         D ]5  \  ZZejC                  dx      sejC                  dy      r, eeee       7 	 de@jH                  z  e@jJ                  z  e@jL                  z  e@jN                  z  e@jP                  z  e@jR                  z  Ze@jV                  dk(  sJ ee@jX                  k(  sJ ee@jZ                  k(  sJ [[[ej\                  ZdzZi ZeD ]  Zeeejg                         <    d{ed|<   d}ed~<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dZdZdZdZdag adadae@jx                  Ze@jz                  Ze@j|                  Ze@j~                  Ze@j                  Ze@j                  Ze@j                  Ze@j                  ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZe@j                  Ze@j                  Ze@j                  Ze@j                  Ze@j                  Ze@j                  Ze@j                  Ze@j                   Ze@j                  Ze@j                  Ze@j                  Ze@j                  Z	e@j                  Ze@j                  ZeTdk\  re@j                  ZeTdk\  re@j                   Ze@j$                  Ze@j(                  Ze@j,                  Ze@j0                  Ze@j4                  Ze@j8                  Ze@j<                  ZeZ eZ!dez  ez  ez  ez  Z"dez  ez  ez  ez  Z#dez  ez  ez  ez  ez  Z$e$Z%dez  ez  ez  ez  Z&dez  ez  ez  ez  ez  Z'dez  ez  ez  ez  ez  Z(dez  ez  ez  ez  Z)dez  ez  ez  ez  Z*dZ+dZ,dZ-da.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAd d d d d d d dÜZB G dĄ dŐeC      ZD G dƄ dǐeC      ZE G dȄ dɐeD      ZF e}e/      ZG e}e0      ZH e}e1      ZIdʐZJdːZKd̐ZLd͐ZMdΐZNdϐZOdАZPdѐZQdҐZRdӐZSdԐZTdՐZUd֐ZVdאZWdؐZXdِZYdڐZZdېZ[dܐZ\dݐZ]dސZ^dߐZ_dZ`dZadZbdZcdZddZedZfdZgdZhdZidZjdZkdZldZmdZndZodZpdZqdZrdZsdZtdZudZvdZwdZxdZydZzdZ{dZ|dZ}dZ~	 ddlmZmZ  ej                         Zej	                         D ]  Zee   ee   d <    [[dZdZd Zd Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdDdZdDdZd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zd8 Zd9 Zd: Zd; Zd< Zd= ZÐd> ZĐdEd?ZŐdFd@ZƐdA ZǐdB ZȐdC ZɐdD ZʐdE ZːdF Z̐dG Z͐dH ZΐdI ZϐdJ ZАdK ZѐdL ZҐdM ZӐdN ZԐdO ZՐdP Z֐dQ ZאdR ZdaِdS ZڐdT ZېdU ZܐdV ZݐdW ZސdX ZߐdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Z dz Zd{ Zd| Zd} Zd~ Zd Zd Zd Zd Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dŐZ1dZ2d Z3dGdZ4dHdZ5dIdZ6dJdZ7dKdZ8dLdZ9dMdZ:dNdZ;dOdZ<dPdZ=d Z>d Z?dQdZ@d ZAd ZBd ZCd ZDdRdZEdSdZFdTdZGdddd	 	 	 	 	 	 	 	 	 dUdZHdVdWdZIdXdÄZJdĄ ZKdń ZLdƄ ZMdǄ ZNdȄ ZOdɄ ZPdʄ ZQd˄ ZRd̄ ZSd̈́ ZTd΄ ZUdτ ZVdЄ ZWdф ZXd҄ ZYdӄ ZZdԄ Z[dՄ Z\dք Z] G dׄ de@j                        Z_dل Z`dڄ Zadۄ Zbd܄ Zcd݄ Zddބ Zed߄ Zfd Zgd Zhd Zid Zjd Zkd Zld Zmd ZndYdZo G d de@j                        Zq G d de@j                        Zs G d de@j                        Zud Zv G d de@j                        Zw G d de@j                        ZxdZd[dZyd\dZzd]dZ{d^dZ|d Z}d Z~d Zd Zd Zd_dZ G d de      Zd  Zd`dadZdbdZd ZdcdddZd ZddddddddZddddddddZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdedZdfdZd Zd ZdAdZdgdZdhdZdhd Zd! Zd" Zd# ZdZdZdZdZdid$Zd% Zd& ee       dd& ee       dd'ddd(	d)Zdd'ddddddddd*
d+Z G d, d-      Ze9s( e@jb                  e        e@jd                  e       d. Z ejh                  e       dd/lmZ ejj                  Z ee       ZeD ]3  \  ZZZZed0z  ed0z  ed0z  feejg                         <   5 d1 Zd2 ZdBd3Zdd4lmZ ej~                  Zej                  Zej                  Zej                  Zej                  Zdd5lmĐZ  G d6 d7eū      ZƐd8 Z	 eZZȐd9eZ d:eY d;ej                  d    d3ej                  d    d<ej                   d=ej                  d>kD  rdnd d?Z y# eA$ r ddl@Z@Y w xY wc c} w # e_$ r e`eaz  ebz  Z^Y w xY w# e$ r i ZY `w xY w(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        
           | | j                  d      rt        | dd       }n| j                  d      r| dd }n| j                  d      r| dd }n| j                  d      rd}t               }
| d	d j                  d
      }|D ]:  }|s|j                  dd      }t	        |      dk(  sJ d|d       |\  }}||
|<   < |
j                  d      t              |
j                  dd      }nJ d| d       |t        j                  |dd      }|S | t        |d      sJ t        |d      sJ |}|S |t        j                  |d      }|S |t        j                  |d      }|S 	 ||[ddl	}|d}|j                  |      t        |j                        sJ j                          G fdd      } |       }|S |	}|S )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                       e Zd Z fdZd Zy)_make_output.<locals>.Outc                R    |j                  d      }|rj                  |       y y )N
)rstriplog)selfr   r   r   s     M/app/cer_product_mecsu/.venv/lib/python3.12/site-packages/pymupdf/__init__.pyr   z_make_output.<locals>.Out.write   s+     {{4($(($?     c                     y N r(   s    r)   r    z_make_output.<locals>.Out.flush   s    r*   N)__name__
__module____qualname__r   r    )r   r   s   r)   Outr#      s    @r*   r2   )
startswithintdictsplitlengetioopenhasattrlogging	getLogger
isinstanceLoggergetEffectiveLevel)r   r   r	   r
   r   r   r   r   r   r   items_ditemsitemnvnvretr<   r2   s         ``           r)   _make_outputrH   .   sB   f ??5!T!"XB__W%8D__W%qr(K__Z(IfGHNN3'E ZZQ'2w!|<'9D7!%<<|1
 &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                     t         S r,   _g_log_itemsr-   r*   r)   
_log_itemsrN      s    r*   c                    | a y r,   )_g_log_items_active)actives    r)   _log_items_activerR      s     r*   c                     t         d d = y r,   rL   r-   r*   r)   _log_items_clearrT      s	    Qr*   	r   r   r	   r
   r   r   r   r   r   c        	        6    t        | ||||||||t        
      ay)zO
    Sets destination of PyMuPDF messages. See _make_output() for details.
    r   N)rH   _g_out_messagerU   s	            r)   set_messagesrX      s,      "#-+)"Nr*   c        	        6    t        | ||||||||t        
      ay)zh
    Sets destination of PyMuPDF development/debugging logging. See
    _make_output() for details.
    r   N)rH   
_g_out_logrU   s	            r)   set_logr[      s,    " #-+)Jr*    c                   	 t        j                  d      }||   }	 t        j                  j	                  |j
                        }|j                  }|j                  }| d| d| d|  } t        rt        j                  |        t        rt        | t        d       yy# t        $ r |j
                  }Y qw xY w# t        $ r Y [w xY w)z0
    For development/debugging diagnostics.
    r   )context:z(): r   filer    N)inspectstackosr
   relpathfilename	ExceptionlinenofunctionStopIterationrP   rM   appendrZ   print)r   callerrc   frame_recordrf   lineri   s          r)   r'   r'      s    9a( V}	-ww|'<'<=H ""((1TF!H:T$8D!d1-   	-#,,H	-  s"   B< )B! !B98B9<	CCc                6    t         rt        | t         d       yy)z
    For user messages.
    r   r`   N)rW   rl   r   s    r)   messagerr   
  s     dq1 r*   c                 T    dd l } t        d       t        | j                                y )Nr   zexception_info:)	tracebackr'   
format_exc)rt   s    r)   exception_inforv     s    /	r*   z
()<>[]{}/%c                    t         j                  j                  |       }||}n|dk(  rd}n|dk(  rd}nJ d|  d|       ||k7  rt        d|  d|       |S )}
    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 )rd   environr8   r'   r   r   rF   rG   s       r)   get_env_boolr     sr    
 	

Ay	
c	
c9+D6A599q
g~-dV2aU;<Jr*   c                    t         j                  j                  |       }||}nt        |      }||k7  rt	        d|  d|        |S )rx   r|   r{   )rd   r}   r8   r4   r'   r~   s       r)   get_env_intr   /  sK    
 	

Ay!f
g~-dV2aS9:Jr*   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                      e Zd Zd Zy)_Globalsc                <    d| _         d| _        d| _        d| _        y Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsr.   s    r)   __init__z_Globals.__init__J  s"    !"#$  !%&"r*   Nr/   r0   r1   r   r-   r*   r)   r   r   I  s    'r*   r   z typing.Optional[typing.Callable]_get_layoutc                     da y)z:For users who never want to see the layout recommendation.FN)_recommend_layoutr-   r*   r)   no_recommend_layoutr   X  s
     r*   c                     d} 	 t         rNt        Gt        j                  d      dk7  r.t        j
                  j                  d      st        |        da yyyyy)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_ANALYZERrz   zpymupdf.layoutF)r   r   rd   getenv	importlibutil	find_specrl   )msgs    r)   _warn_layout_oncer   ^  s`    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                N    | j                  d      }|dk\  r| d| } t        |       S )z<
    Converts string to int, ignoring trailing 'rc...'.
    rcr   N)findr4   )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                   t        | t        t        f      r"d}| D ]  }|r|dz  }|t        ||      z  } |S t	        j
                  ||       S )z
    Returns `value` formatted with mupdf.fz_format_double() if available,
    otherwise with Python's `%`.

    If `value` is a list or tuple, we return a space-separated string of
    formatted values.
    r\    r   )r>   listtuple	_format_gr   fz_format_double)valuer   rG   rF   s       r)   r   r     s]     %$' 	)As
9QC((C	) 
%%c511r*   matrix_like
point_like	quad_like	rect_likec                ,   t        | t              r#| j                  rt        d      | j                  } t        | t
        j                        r| S t        | t
        j                        r| j                         S | J d       J dt        |              )zz
    Returns document as a mupdf.FzDocument, upcasting as required. Raises
    'document closed' exception if closed.
    document closeddocument is NoneUnrecognised type(document)=)
r>   Document	is_closed
ValueErrorthisr   
FzDocumentPdfDocumentsupertype)documents    r)   _as_fz_documentr     s    
 (H%.//==(E,,-	He//	0~~		%$%q31$x.!233qr*   c                Z   t        | t              r#| j                  rt        d      | j                  } t        | t
        j                        r| S t        | t
        j                        r't        j                  |       }|r|j                  sJ |S | J d       J dt        |              )a  
    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   )
r>   r   r   r   r   r   r   r   
m_internalr   )r   requiredrG   s      r)   _as_pdf_documentr     s     (H%.//==(E--.	He..	/)>>!>
		%$%q31$x.!233qr*   c                    t        | t              r| j                  } t        | t        j                        r| j                         S t        | t        j                        r| S | J d       J dt        |              )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    page is NoneUnrecognised type(page)=)r>   Pager   r   PdfPager   FzPager   pages    r)   _as_fz_pager     si     $yy$&zz|	D%,,	'	!L!q/-$t*//qr*   c                ,   t        | t              r| j                  } t        | t        j                        r| S t        | t        j
                        r't        j                  |       }|r|j                  sJ |S | J d       J dt        |              )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   )	r>   r   r   r   r   r   pdf_page_from_fz_pager   r   )r   r   rG   s      r)   _as_pdf_pager     s     $yy$&	D%,,	'))$/>>!>
	!L!q/-$t*//qr*   c                ^    t        j                  |       }|j                  st        d      |S )a8  
    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                     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d@dZ
dAd
Zed        Zed        Zed        Zed        ZdBdZed        Zd Zed        Zed        Zd Zd Zd ZdCdZd Zd Zd ZdDdZed        Zed        Zed        Z ed        Z!ed         Z"ed!        Z#ed"        Z$ed#        Z%ed$        Z&ed%        Z'ed&        Z(ed'        Z)ed(        Z*d) Z+d* Z,d+ Z-dEd,Z.dFd-Z/d. Z0dGd/Z1d0 Z2dHd1Z3d2 Z4d3 Z5d@d4Z6d5 Z7d6 Z8d7 Z9d8 Z:d@d9Z;ed:        Z<	 	 	 	 	 	 	 	 	 dI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dJd;Z=dKd<Z>e?d=        Z@ed>        ZAed?        ZBy	)LAnnotc                J    t        |t        j                        sJ || _        y r,   )r>   r   PdfAnnotr   r(   r   s     r)   r   zAnnot.__init__J  s    5%..111	r*   c                ,    t        | j                        S r,   )boolr   r.   s    r)   __bool__zAnnot.__bool__N  s    DIIr*   c                F    t        | dd      }d| j                  d    d| S )Nparentz<>'r   z' annotation on )getattrr   )r(   r   s     r)   __repr__zAnnot.__repr__Q  s,    x.499Q<. 099r*   c                "    | j                         S r,   )r   r.   s    r)   __str__zAnnot.__str__U  s    }}r*   c                .    t        | dd      rd| _        y y )NthisownF)r   r   r.   s    r)   _erasezAnnot._eraseX  s    4E* DL +r*   c                   | j                   }t        j                  |      t        j                  k7  ry t	               }	 t        j
                  t        j                  |      d      }|j                  r)t        d       t        j                  |      }||t        <   t        j
                  t        j                  |      d      }|j                  r(t        j                  |      }t        |      |t        <   n	d|t        <   t        j                  t        j                  |      t        d            }d}|j                  rt        j                   |      }||t"        <   |}|s|S | j*                  |d<   t,        j/                  |       \  }}	}
||d<   |	|d	<   |
|d
<   | j0                  d   }||d<   |S # t$        $ r t&        r
t)                Y y w xY w)NROzIgnoring redaction key '/RO'.OverlayTextr\   Qr   rect
text_colorfontnamefontsizefill)r   r   pdf_annot_typePDF_ANNOT_REDACTr5   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_alignrg   g_exceptions_verboserv   r   TOOLS	_parse_dacolors)r(   r   valuesobjxrefr   alignvalr   r   r   r   s               r)   _get_redact_valueszAnnot._get_redact_values\  s   		&%*@*@@	%%e&9&9%&@$GC~~ ?@'','+|$%%e&9&9%&@-PC~~//4'8'>|$')|$$$U%8%8%?#OCE~~((-$)F=! JiiF).)>&
Hh&L"J"J{{6"F
  	#(8	s   D"F4 4GGc                   t         rYt        | j                  t        j                        sJ t        j                  | j                        }t        |t              sJ |S d }d }| j                  }t        |t        j                        sJ t        j                  |      }t        j                  |t        d      t        d            }t        j                  |      rt        j                  |      }|r|j                  rt        |      }|S )NAPN)g_use_extrar>   r   r   r   r   Annot_getAPbytesr   pdf_dict_getlr  pdf_is_streampdf_load_streamr   JM_BinFromBuffer)r(   rG   rresr   	annot_objaps          r)   _getAPzAnnot._getAP  s    tyy%..999##DII.CsE***JACIIEuenn555++U3I$$i$#OB""B'++R0s~~$S)Hr*   c                x   	 | j                   }t        j                  |      }t        |      }t        j                  |t        d      t        d            }|j                  st        t              t        j                  |      st        t              t        |      }|j                  st        t              t        |j                         ||d       |r@t        j                  |t        d            }t        j                   |t        d      |       y y # t"        $ r t$        rt'                Y y Y y w xY w)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_rectrg   r  rv   )	r(   buffer_r   r   r  r   apobjr  bboxs	            r)   _setAPz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D D98D9Nc                	   | j                   }|j                  sJ t        j                  |      }t	        |      }|j                         }t        j                  |      }	t        |      \  }
}	 |
dk(  sO|	t        j                  t        j                  t        j                  t        j                  t        j                  fvr t        j                  |t        d             n|
dkD  rt        j                  ||d |
        |dk\  rdnd}|	t        j                   t        j                  t        j"                  t        j$                  t        j&                  t        j                  t        j                  t        j                  t        j                  t        j(                  t        j*                  fvrd}|r t        j,                  |t        d      |       |	t        j"                  k(  r|
dkD  rt        j.                  ||d |
        nr|
dkD  rmt        j0                  |j                         |
      }t3        |
      D ]  }t        j4                  |||           t        j6                  |t        d      |       t        j8                  |       t        j:                  |       d|_        |dk  s|dk\  r|sy	 t        jF                  t        j                  |      t        d      t        d            }|j                  stI        tJ              t        jL                  |t        d	            }|j                  s t        jN                  |t        d	      d
      }t        jP                  |j                         d      }|dk\  re|dk  r`t        jR                  |t        d      |       t        jR                  |t        d      |       t        jR                  |t        d      |       |r@t        jT                  |t        d      |       t        jT                  |t        d      |       t        jL                  |t        d            }|j                  s t        jN                  |t        d      d
      }t        j6                  |t        d      |       y# t>        $ r$}t@        r
tC                tE        d|         d }~ww xY w# t>        $ r$}t@        r
tC                tE        d|         d }~ww xY w)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_requiredrg   r  rv   rr   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_appearancezAnnot._update_appearance  s   		''/	u%hhj$$e,+J7t1	 zU****((--+++  ""Ix~>22E4<H$kqJ))**--33''((--++**))((  
&&y(82DfM 11119--eT&5\B))$((*e< <A--c4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   /H=R :GS 	S!S  S	S5S00S5c                   t        |        | j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  s7t        t        j                  t        j                  j                              }n*t        j                  |t        d            }t        |      }t        |      | j                         j                  z  }|| j                         j                  z  }|S )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_bboxzAnnot.apn_bbox  s     	D		''.	  HTNHSMJ}}!%,,u||/J/J"KLC**2x/?@D!$'C3i$//+AAAt 222
r*   c                   	 t        |        | j                  }t        |t        j                        sJ t        j
                  t        j                  |      t        j                  t        j                        }|j                  st        t        j                               S t        j                  |t        j                        }t        |      }t        |      }|S # t        $ r t         r
t#                 w xY w)zannotation appearance matrix)ra  r   r>   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Matrixrg   r  rv   )r(   r   r  matr  s        r)   
apn_matrixzAnnot.apn_matrix  s    	IIEeU^^444$$''.**))B
 ==()9::++B0J0JKC#C(C+CJ 	#(8	s   B!C  $;C   C;c           
     h   t        |        | j                  }t        j                  |      }t        j                  |t        d            }d}|j                  r t        t        j                  |            }|S t        j                  |t        d      t        d      t        d      t        d            }t        j                  |      rt        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      s/t        j                  |      }t        |      D ]r  }	t        j                  ||	      }
t        j                  |
t        d            dk(  s<t        t        j                  t        j                  ||	                  }|c c S   |S )zannotation BlendModer2  Nr  r  r/  r3  r   )ra  r   r   r   r  r  r   r   pdf_to_namer  pdf_is_dictpdf_dict_lenrF  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r(   r   r  r
  rQ  rE   rZ  obj1mjobj2s              r)   	blendmodezAnnot.blendmode6  sf    	D		''.	  HTN;
>>*5+<+<S+ABJ!!%% S!""3'A1X .--c15$$T***40A"1X .$55dA> ++D(4.AQF):5;L;LUMcMcdhjkMl;m)nJ#--	.	. r*   c                |   t        |        | j                  d   }|t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  fvr
t               S t        j                  | j                        }t        |      }|S )zBorder information.r   )ra  r   r   r7  r>  r@  r8  r9  r:  r6  r5   r   r   JM_annot_border)r(   atypeaorG   s       r)   borderzAnnot.borderV  s     	D		!&&))##$$))''&&  6M  +b!
r*   c                    t        |        | j                  }t        j                  t        j                  |            }t        ddd|      }t        j                  |||       y)z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)ra  r   r   pdf_get_bound_documentr   _make_PdfFilterOptionspdf_filter_annot_contents)r(   r  r   rT  filter_s        r)   clean_contentszAnnot.clean_contentsi  sQ    D		**5+>+>u+EF(1AX`a''UG<r*   c                    	 t        |        | j                  }t        |t        j                        sJ t        t        j                  |            S # t        $ r t        r
t                 w xY w)zColor definitions.)
ra  r   r>   r   r   JM_annot_colorsr   rg   r  rv   r   s     r)   r  zAnnot.colorsq  s\    	IIEeU^^444"5#6#6u#=>> 	#(8	s   AA A.c                   t        |        | j                  }t        j                  |      }t	        |      }	 t        |      }|snt        j                  ||       %t        j                  |t        d             t        j                  |j                         t        d            }t        j                  |      }d}t        |dz
  dd      D ]s  }t        j                  ||      }	t        j                  |	t        d            }
|	j                  sEt        j                  |
|      r\t        j                   ||       d}u |r/t        j"                  |j                         t        d      |       yy)z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   ParentN)ra  r   r   r   r   JM_find_annot_irtpdf_delete_annotr;  r  r  r
  pdf_array_lenrF  pdf_array_getr   ry  pdf_array_deleterH  )r(   r   r  r   	irt_annotannotsrE   foundrZ  ops              r)   delete_responseszAnnot.delete_responses}  s9   D		''.	u%)%0I""43	 
 	9hw&78##DHHJ0BC'qsB# 	A##FA.A""1hx&89A<<##Ay1&&vq1	 txxz8H+=vF r*   c                   t        |        t               }d}d}d}| j                  }t        j                  |      }t        j
                  |      }|t        j                  k7  rt        t              t        j                  |t        d      t        d      t        d            }|j                  st        dt               t        j                  |t        d            }	t        j                  |	t        d            }
|
j                  rt        j                  |
      }n@t        j                  |	t        d            }
|
j                  rt        j                  |
      }t        j                  |	t        d            }
|
j                  rt        j                  |
      }t        j                  |t        d	            }
|
j                  rt        j                   |
      }t        j                  |t        d
      t        d            }
|
j                  rt        j                   |
      }t#              |t$        <   t'        |      |t(        <   ||t*        <   ||t,        <   |S )zAttached file information.r  NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)ra  r5   r   r   r   r   r?  	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  rU  r	   fsr  rf   s               r)   	file_infoz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                Z    t        |        | j                  }t        j                  |      S )zFlags field.)ra  r   r   pdf_annot_flagsr   s     r)   flagszAnnot.flags  s&     	D		$$U++r*   c                   t        |        | j                  }t        j                  |      }t        j                  |      }|t        j
                  k7  rt        t              t        j                  |t        d      t        d      t        d            }|j                  st        dt               t        j                  |      }t        |      }|S )zRetrieve attached file content.r  r  r  r  )ra  r   r   r   r   r?  r  r  r  r  r   r  r  r  r  )r(   r   r  r   r	   bufr  s          r)   get_filezAnnot.get_file  s    D		''.	##E*5222/00$$YPXY\P]^  46JK##F+s#
r*   c                    t        |        d}| j                  }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }|S )z*Get annotation optional content reference.r   OCra  r   r   r   r  r  r   r   )r(   ocr   r  r
  s        r)   get_oczAnnot.get_oc  sZ    D		''.	  HTN;>>!!#&B	r*   c                   	 t        | d      }|S # t        $ ro t        | j                        }t	        |t
        j                        sJ |j                  rt        |j                               nd }t        ||      }|| _        Y |S w xY w)Nr   )r   AttributeErrorr   r   r>   r   r   r   r   r%  r   r   )r(   rG   r   r   s       r)   re  zAnnot.get_parent  s    	4*C 
  	"499-DtU]]33304x,THtX&CDK 
	s    A4BBc                   t        |        t        t        t        d}t	        |      t
        u r |j                  |j                         d      }|rt        |dz  |dz        }t        |      }|}|st        j                         }t        j                  | j                  ||t        j                  d      |      }t        |      }	|r|	j!                  ||       |	S )zannotation Pixmap)grayrgbcmykNH   r   )ra  csGRAYcsRGBcsCMYKr   strr8   lowerrp  JM_matrix_from_pyr   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
r(   matrixdpi
colorspacealphacspacesctmcspixrG   s
             r)   
get_pixmapzAnnot.get_pixmap  s     	D!%@
s" Z%5%5%7>JC"HcBh/F'$$&B--diib%BUBUVWBXZ_`SkKKS!
r*   c                ~   t        |        | j                  }t        j                  |      }t        j                  |      }t        j
                  |t        d            }|t        j                  k7  s|j                  st        t              t        j
                  |t        d            j                  rt        dt               t               }t        j
                  |t        d            }|j                  rt        j                  |      |d<   t        j
                  |t        d            }|j                  rt        j                  |      |d<   t        j
                  |t        d            }|j                  rt        j                  |      |d	<   t        j
                  |t        d
            }|j                  rt        j                   |      |d<   t        j"                  |d      }|j                  rt        j                   |      |d<   t        j$                  |      }t'        |      }||d<   |S )zRetrieve sound stream.Soundr  zunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionr	   )ra  r   r   r   r   r  r  PDF_ANNOT_SOUNDr   r  r  r  r  r5   pdf_to_realr  rt  r   r  r  )	r(   r   r  r   soundr  r
  r  r	   s	            r)   	get_soundz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                4    t        j                  | g|i |S r,   utilsget_textr(   argskwargss      r)   r  zAnnot.get_text0      ~~d4T4V44r*   c                4    t        j                  | g|i |S r,   )r  get_textboxr  s      r)   r  zAnnot.get_textbox3  s      7777r*   c                   t        |        t        j                  |      }|rbt        t        d      sJ dt         d       t        |      }|j                         |_        |xj                  t        j                  z  c_        | j                  }t        j                  ||      }t        |      }| j                         }t        |t        j                         r	||_        |S t        j$                  |      |_        |S )zMake annotation TextPage.FZ_STEXT_CLIP_RECTzMuPDF-z% does not support FZ_STEXT_CLIP_RECT.)ra  r   FzStextOptionsr;   mupdf_versionJM_rect_from_pyinternalclipr  r  r   FzStextPageTextPagere  r>   weakref	ProxyTyper   proxy)	r(   r  r  optionsclip2r   	stextpagerG   r  s	            r)   get_textpagezAnnot.get_textpage6  s    D&&u-5"67v6-Pu9vv7#D)E >>+GLMMU555M		%%eW5	y!OOa**+CJ 
 !q)CJ
r*   c                    t        |        | j                  }t        j                  t        j                  |      t        d            }|j                  rdS dS )z Check if annotation has a Popup.r  TF)ra  r   r   r  r   r  r   )r(   r   r
  s      r)   	has_popupzAnnot.has_popupI  sH     	D		  !4!4U!;Xg=NO~~t050r*   c                ^   t        |        | j                  }t               }t        t	        j
                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      d      }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t         <   t	        j                  t	        j                  |      d      }t	        j                  |      |t"        <   t	        j                  t	        j                  |      d      }t        t	        j                  |            |t$        <   |S )zVarious information details.NameTCreationDateMSubjNM)ra  r   r5   r   r   pdf_annot_contentsdictkey_contentr  r   r  rt  dictkey_namer   dictkey_titler   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)r(   r   r  r  s       r)   infoz
Annot.infoQ  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                    | j                   }t        j                  |      }t        j                  |t	        d            }|j
                  syt        j                  |      S )z%
        annotation IRT xref
        IRTr   )r   r   r   r  r  r   r   )r(   r   r  irts       r)   irt_xrefzAnnot.irt_xrefs  sN    
 		''/	  )Xe_=~~%%r*   c                V    t        |        t        j                  | j                        S )z-Get 'open' status of annotation or its Popup.)ra  r   pdf_annot_is_openr   r.   s    r)   is_openzAnnot.is_open  s!     	D&&tyy11r*   c                    | j                   }t        j                  |      }|t        j                  k(  ryt	        t        d      sJ t        j
                  |      S )zannotation languageNfz_string_from_text_language2)r   r   pdf_annot_languageFZ_LANG_UNSETr;   r"  )r(   
this_annotlangs      r)   languagezAnnot.language  sP     YY
''
35&&&u=>>>22488r*   c                    t        |        | j                  }t        j                  |      syt        j                  |      }t        j
                  |      }||fS )zLine end codes.N)ra  r   r    pdf_annot_has_line_ending_stylespdf_annot_line_start_stylepdf_annot_line_end_style)r(   r   lstartlends       r)   	line_endszAnnot.line_ends  sP     	D		55e<11%8--e4t|r*   c                   t        |        | j                  }t        |t        j                        sJ |j
                  sJ t        j                  |      }|t        j                  k7  rt        j                  |      }nt        j                  |      }|j
                  rt        |      nd}|syd|_        |j                         j                  j                         | j                         j                  j                         k(  sJ ||j                  j                  t!        |      <   |j"                  d   t        j                  k(  r"t%               }t&        j)                  ||       |}|S )zNext annotation.NTr   )ra  r   r>   r   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   re  m_internal_valuer   _annot_refsidr   Widgetr  _fill_widget)r(   r%  rU  r   r  widgets         r)   nextz
Annot.next  s    	DYY
*enn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sF+C
r*   c                    t        |        | j                  }d}t        j                  t        j                  |      t        j
                        }t        j                  |      rt        j                  |      }|S )zOpacity.r  )ra  r   r   r  r   PDF_ENUM_NAME_CApdf_is_numberr  )r(   r   opyr1  s       r)   rP  zAnnot.opacity  s`     	D		!4!4U!;U=S=STr"##B'C
r*   c                   t        |        t        j                  t        j                  j                        }| j                  }t        j
                  |      }t        j                  |t        d            }|j                  rt        j                  |t        d            }t        |      }t        |      | j                         j                  z  }|| j                         j                  z  }|S )zannotation 'Popup' rectangler  r  )ra  r   rc  rd  r   r   r  r  r   r&  rb  r  re  rf  rg  )r(   r   r   r  r
  r  s         r)   
popup_rectzAnnot.popup_rect  s     	D||ELL778		''/	  )Xg->?>>**30@ADd# 3i$//+AAAt 222
r*   c                    t        |        d}| j                  }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }|S )zannotation 'Popup' xrefr   r  r  )r(   r  r   r  r
  s        r)   
popup_xrefzAnnot.popup_xref  s]     	D		''.	  HW,=>>>##C(Dr*   c                    t         r t        j                  | j                        }nt	        j
                  | j                        }t        |      }| j                         }||j                  z  }|S )zannotation rectangle)	r  r   Annot_rect3r   r   pdf_bound_annotr  re  rg  )r(   r  r  s      r)   r   z
Annot.rect  s]     ##TYY/C''		2C3i OO 	q"""
r*   c           	        t        j                  | j                        }t        j                  |t	        d            }t        j
                  |      dk(  rt        j                  t        j                  |d            t        j                  t        j                  |d            t        j                  t        j                  |d             t        j                  t        j                  |d             fS y)z6
        annotation delta values to rectangle
        RD   r   r   r   r   N)r   r   r   r  r  r  r  r  )r(   r  arrs      r)   
rect_deltazAnnot.rect_delta  s    
 ''		2	  )Xd^<$)%%u':':C'CD%%u':':C'CD&&(;(;S!(DEE&&(;(;S!(DEE	  *r*   c                    t        |        | j                  }t        j                  t        j                  |      t        j
                        }|j                  syt        j                  |      S )zannotation rotationr  )ra  r   r   r  r   PDF_ENUM_NAME_Rotater   r  )r(   r   rotations      r)   rL  zAnnot.rotation  sU     	D		%%u':':5'A5C]C]^""**r*   c                   t        |        | j                         }|j                  }|j                  }||| z  z  }| j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  st        t              t        |      }t        j                  |t        d      |       y)z1
        Set annotation appearance bbox.
        r  r  r   N)ra  re  rotation_matrixrf  r   r   r   r  r  r   r   r!  r  r'  )	r(   r*  r   rotrq  r   r  r  r   s	            r)   set_apn_bboxzAnnot.set_apn_bbox  s     	D ""((sd
		''.	  HTNHSMJ}},,t$HV$4d;r*   c                :   t        |        | j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  st        t              t        |      }t        j                  |t        d      |       y)z!Set annotation appearance matrix.r  r  rp  N)ra  r   r   r   r  r  r   r   r!  r  pdf_dict_put_matrix)r(   r  r   r  r  rq  s         r)   set_apn_matrixzAnnot.set_apn_matrix  sr    D		''.	  HTNHSMJ}},,'!!"hx&8#>r*   c                    t        |        | j                  }t        j                  |      }t        j                  |t        d      |       y)zSet annotation BlendMode.r2  Nra  r   r   r   rO  r  )r(   rQ  r   r  s       r)   set_blendmodezAnnot.set_blendmode(  s9    D		''.		8D>:Fr*   c                   t        |        | j                  dd \  }}|t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  fvrt        d| d       y|t        j                  t        j                  t        j                  t        j                  fvr|dkD  rt        d| d       d}t        |      t        ur||||d}|j                  d	d       |j                  d
d       |j                  dd       |j                  dd       |d	   d|d	<   |d   d|d<   t        |d   d      r2t        |d         |d<   |d   D ]  }t        |t               rd|d<    n | j"                  }	t        j$                  |	      }
t        j&                  |
      }t)        |||
      S )zbSet 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cloudsrY  rZ  r[  r\  __getitem__)ra  r   r   r7  r>  r@  r8  r9  r:  r6  rr   r5   
setdefaultr;   r   r>   r4   r   r   r  JM_annot_set_border)r(   r  rY  rZ  r[  r\  r  atnamerC   r   r  rT  s               r)   
set_borderzAnnot.set_border/  s    	D		"1v&&))##$$))''&&  -fXR89&&))''&&	  z8CD<t#$uRXYF'2&'4((D)(B''?" F7O(#!F86(#]3$VH%56F8x( !$,'+F8$ 		''/	**I6"FC;;r*   c                >   | j                   d   t        j                  k(  rt        d      t	        |        | j                         j                  }t        |      t        ur||d}|j                  d      }|j                  d      }t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f}|g dfv r|j                  | j                   dd       n`|^t#        |d
      rt%        |      g}t'        |       t)        |      dv sJ dt+        |       d}|j                  | j                   d|       |r.| j                   d   |vrt-        d| j                   d    d       y	|g dfv r|j                  | j                   dd       y	|_t#        |d
      rt%        |      g}t'        |       t)        |      dv sJ dt+        |       d}|j                  | j                   d|       y	y	)z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        r   z'cannot be used for FreeText annotationsr   stroker   rd  r-   r  []N	__float__r   r   rG  []z,Warning: fill color ignored for annot type 'r   rX  r-  )r   r   r>  r   ra  re  r   r5   r8   r7  r6  r8  r9  r:  r   xref_set_keyr  r;   float
CheckColorr7   r   rr   )r(   r  rd  r   r%  fill_annotsss          r)   
set_colorszAnnot.set_colors^  s   
 99Q<5444FGGDoo&&<t#"f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                ^    t        |        | j                  }t        j                  ||       y)zSet annotation flags.N)ra  r   r   pdf_set_annot_flags)r(   r  r   s      r)   	set_flagszAnnot.set_flags  s#    D		!!%/r*   c                   t        |        t        |      t        u r\|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }d}| j                  }t        j                  |      }|rt        j                  ||       |r|rt        j                  ||       |r3t        j                  t        j                  |      t        d      |       |r3t        j                  t        j                  |      t        d      |       |r>t        j                  t        j                  |      d	t        j                  |             yyy)
zSet various properties.contentNtitlecreationDatemodDatesubjectr  r  r  )ra  r   r5   r8   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(   r  rt  ru  rv  rw  rx  r   	is_markups	            r)   set_infozAnnot.set_info  s0   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                   | j                   }t        j                  |      }t        |      }|dk  s&|t        j                  |j                               k\  rt        t              t        j                  |j                         |d      }t        j                  |t        d            }t        j                  t        j                  |            }|dk  rt        t              t        j                  |t        d      |       y)z)
        Set annotation IRT xref
        r   r   Subtyper  N)r   r   r   r   pdf_xref_lenr%  r   MSG_BAD_XREFpdf_new_indirectr  r  pdf_annot_type_from_stringrt  MSG_IS_NO_ANNOTrH  )r(   r  r   r  r   r  subtirt_subts           r)   set_irt_xrefzAnnot.set_irt_xref  s     		''/	u%!8tu11488:>>l++$$dhhj$:!!3(;<33U5F5F5MNa<o..Ix<r*   c                    t        |        | j                  }|st        j                  }nt        j                  |      }t        j
                  ||       y)zSet annotation language.N)ra  r   r   r$  fz_text_language_from_stringpdf_set_annot_language)r(   r'  r%  r&  s       r)   set_languagezAnnot.set_language  sA    DYY
&&D55h?D$$Z6r*   c                    t        |        | j                  }t        j                  |      rt        j                  |||       yt        d       y)zSet line end codes.zbad annot type for line endsN)ra  r   r   r)   pdf_set_annot_line_ending_stylesr   )r(   startendr   s       r)   set_line_endszAnnot.set_line_ends  s<    D		11%8225%E:;r*   c                    t        |        | j                  }t        j                  |      }t        j                  |t        d      |       y)zSet /Name (icon) of annotation.r  NrU  )r(   r   r   r  s       r)   set_namezAnnot.set_name  s:    D		''.		8F+;TBr*   c                    t        |        | j                  }t        j                  |      }|s t        j                  |t        d             yt        t        j                  |      ||       y)z Set / remove annotation OC xref.r  N)ra  r   r   r   r;  r  JM_add_oc_objectr  )r(   r  r   r  s       r)   set_oczAnnot.set_oc  sR    D		''.	y(4.9U99)DiQSTr*   c                    t        |        | j                  }t        |dd      st        j                  |d       yt        j                  ||       |dk  rt        |      }d|_        yy)zSet opacity.              ?r   N)ra  r   _INRANGEr   pdf_set_annot_opacityr   transparency)r(   rP  r   r   s       r)   set_opacityzAnnot.set_opacity  s`    D		c*''q1##E73S="5)D !D r*   c                ^    t        |        | j                  }t        j                  ||       y)z-Set 'open' status of annotation or its Popup.N)ra  r   r   pdf_set_annot_is_open)r(   r   r   s      r)   set_openzAnnot.set_open  s#    D		##E73r*   c                    t        |        | j                  }t        |      }t        |      }t	        j
                  t        |      |      }t	        j                  ||       y)z@
        Create annotation 'Popup' or update rectangle.
        N)ra  r   r   JM_rotate_page_matrixr   fz_transform_rectr  pdf_set_annot_popup)r(   r   r   pdfpagerO  r  s         r)   	set_popupzAnnot.set_popup  sP     	D		!%(#G,##OD$93?!!%+r*   c                   t        |        | j                  }t        |      }t        |      }t	        j
                  t        |      |      }t	        j                  |      st	        j                  |      rt        t              	 t	        j                  ||       y# t        $ r}t        d|        Y d}~yd}~ww xY w)zSet annotation rectangle.zcannot set rect: NF)ra  r   r   r  r   r  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectrg   rr   )r(   r   r   r  rO  r  r[  s          r)   set_rectzAnnot.set_rect  s    D		!%(#G,##OD$93?!!!$(A(A!(Dl++	$$UA. 	's+,	s   B 	B?'B::B?c                   t        |        | j                  }t        j                  |      }|t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  fvry|}|dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  r|t        j                  k(  r
|dz  dk7  rd}t        j                  |      }t        j                   |t#        d      |       y)zSet annotation rotation.Nr   h  Z   r.  )ra  r   r   r   r=  r7  r>  r?  r@  r8  r9  r:  r6  rA  rB  r   rC  r  )r(   rS  r   r   rO  r  s         r)   set_rotationzAnnot.set_rotation  s   D		##E*%%&&))//##$$))''&&%%$$  Ag3JC AgSj3JC Sj5,,,rQC''.	y(8*<cBr*   c                   t        |        | j                  j                  syt        j                  | j                        }t        j
                  |      }t        j                  t        j                  | j                        d      }|j                  rt        j                  |      r||fS t        j                  |      }|||fS )zannotation typenullIT)
ra  r   r   r   r   pdf_string_from_annot_typer   r   pdf_is_namert  )r(   rU  cr  its        r)   r   z
Annot.type*  s     	Dyy##$$TYY/,,U3!4!4TYY!?F||u0031:q!q"~r*   c
                   t        j                  | j                        }
|r,t        j                  |
t	        d            }|st        d      t        j                          t        |        d }| j                  d   }| j                  j                  dd      }| j                  j                  dd      }| j                  d	   }||}n| j                  d
   }d}| j                  }|	dk7  r=|	dk  r|	dz  }	|	dk  r|	dk\  r|	dz  }	|	dk\  r|t         j                  k(  r
|	dz  dk7  rd}	|| j                  }t!        |d      s| j"                  }d|cxk  rdk  sn |rd}nd}|t         j                  k(  r_t%        |       t%        |       t&        j)                  |       \  }}}|dk  rd}|r|}|r|}|dkD  r|}t+        | t-        |      |||       d}| j/                  ||||	      }|du rt1        d      |t         j                  k(  rD| j3                         }d|cxk  rdk  r(n y|j5                  d      s| j7                  d|z          y ||d      } ||d      }| j9                         j:                  }| }|r7ddj=                  t?        t@        |            z   dz   }|jC                  d      }nd}| jD                  r| jD                  \  }} nd\  }} | j3                         }|jG                         }!d}"|t         jH                  k(  r|rud}"|!dd }!|!\  }#}$}%}&}'|!jK                  |%       |!jK                  |$       |!jK                  |&       |!jK                  |$       |!jK                  |'       |!jK                  d       |dkD  s|d k7  rmd}"|dkD  rtM        |      jC                         d!z   gng }(|!D ]@  })|)jO                  d"      r|)jO                  d#      r
|d k7  r|dd })|(jK                  |)       B |(}!d$j=                  |!      }|t         jP                  t         jR                  fv rd$j=                  |!dd       d$z   }d}"|d k7  r5|t         jP                  k(  r	||z   d%z   }nJ|t         jR                  k(  r7|dz   }n1|t         jP                  k(  r|d&z   }n|t         jR                  k(  r|dz   }|||z   }|jU                  d'd(d      }d}"|r|jC                  d      |z   }d}"d)|z   d*z   }|| z   dkD  r|t         jP                  t         jR                  fv rndt&        jV                  t&        jX                  t&        jZ                  t&        j\                  t&        j^                  t&        j`                  t&        jb                  t&        jd                  t&        jf                  f
}*ti        dt-        |*            }+d+tk        d| j                  d         z  },| jl                  |, |, |,|,fz   }d}"| jn                  }-||+v rDtq        |-d         |z  }.tq        |-d         |z  }/ |*|   | |.|/d|      }0||0jC                         z  }| |+v rDtq        |-d,         |z  }.tq        |-d         |z  }/ |*|    | |.|/d|      }0||0jC                         z  }|"r:|r%| js                  |       | j7                  |d-       n| j7                  |d-       |t         jt                  t         jv                  t         jx                  t         jz                  t         j|                  t         jR                  t         jP                  t         j~                  t         j                  t         j                  f
vry| j                  }1|1dk(  ry| jl                  j                  | jl                  j                  z   d+z  }2|1dk(  rpt        |t        dd      z
        d.k  ry| jl                  j                  |2|       }3| j                  |3jl                         | j                  t        dd             yt        |1      }4| jl                  j                  |2|4      }3| js                  |3jl                         | j                  ||4z         y)/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                F    t        | |      }|sy|dz   j                         S )zHReturn valid PDF color operator for a given color sequence.
            r*   r%   )	ColorCodeencode)r  codeccs      r)   color_stringz"Annot.update.<locals>.color_string\  s)     2t$BI%%''r*   r   r[  NrY  r  rd  r   r  r  rf  r   /H gs
r\      )rP  rQ  rR  rS  FzError updating annotation.s   /H gss   /H gs
fr  rh  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_testra  r   r  r8   r  rr  r>  r~  r;   rP  rl  r  r  JM_make_annot_DAr7   r_  r   r  r3   r+  re  rf  joinmapr  r  r.  
splitlinesr   rk   r   endswithr:  r9  replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashrF  maxr   verticesPointr  r=  r7  r?  r@  r8  r6  rA  rB  rL  tlbrabsrp  morphsetRectrS  )5r(   rQ  rP  r   r   r   border_colorrR  	cross_outrS  r  is_rich_textr  
annot_typedtbwidthrd  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ntabro   le_funcsle_funcs_rangedpointsp1p2leftrO  r  quadrq  s5                                                        r)   updatezAnnot.update8  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%,,x,T2r5*Mdkkm#n,6":&-6":&-,x,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                |   t        |        | j                  }t        j                  |      }t        j                  |      }t        j
                  |      }|t        j                  k7  rt        t              t        j                  |t        d      t        d      t        d            }	|	j                  st        dt               t        j                  |t        d            }
t        |      }|r|j                  st!        t"              |rt%        ||	|d       t        j&                  |      \  }}t        j(                  |      }t        j*                  |	t        d      |       t        j,                  |	|t        d      t        d             |rt        j.                  |	t        d      |       t        j.                  |
t        d      |       t        j.                  |	t        d	      |       t        j.                  |
t        d	      |       t        j.                  |t        d
      |       |r@t        j.                  |	t        d	      |       t        j.                  |
t        d	      |       |rAt        j.                  |	t        d      |       t        j.                  |
t        d      |       yy)zUpdate attached file.r  r  r  bad PDF: no /EF objectr   DLr  r  r  Contentsr  N)ra  r   r   r   r  r   r?  r  r  r  r  r   r  r  r  r"  r   r#  r$  fz_buffer_storagepdf_new_intrH  pdf_dict_putlr|  )r(   r(  rf   	ufilenamer  r   r  rT  r   r	   r  r  r7   r  ls                  r)   update_filezAnnot.update_file5  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                 4    d} t        d      D ]  }| |z  } 	 | S )Nr   i0u  )rF  )totalrZ  s     r)   r  zAnnot.update_timing_test`  s(     	AQJE	r*   c           	        t        |        | j                  }t        |t        j                        sJ t        j
                  |      }t        |      }t        j                         }t        j                         }t        j                  |||       t        |      }t        j                  ||      }t        j                  |t        d            }|j                  st        j                  |t        d            }|j                  st        j                  |t        d            }|j                  st        j                  |d      }|j                  rg }t!        dt        j"                  |      d      D ]  }	t        j$                  t        j&                  ||	            }
t        j$                  t        j&                  ||	dz               }t        j(                  |
|      }t        j*                  ||      }|j-                  |j.                  |j0                  f        |S t        j                  |d      }|j                  rg }t!        t        j"                  |            D ]  }	g }t        j&                  ||	      }t!        dt        j"                  |      d      D ]  }t        j$                  t        j&                  ||            }
t        j$                  t        j&                  ||dz               }t        j(                  |
|      }t        j*                  ||      }|j-                  |j.                  |j0                  f        |j-                  |        |S y	)
zannotation vertex pointsVerticesL
QuadPointsCLr   r   r   InkListN)ra  r   r>   r   r   r   r   rm  rc  pdf_page_transformJM_derotate_page_matrix	fz_concatr  r  r   r   rF  r  r  r  FzPointfz_transform_pointrk   xy)r(   r   r  r   page_ctmdummyderotr  r  rZ  r"  r#  pointres1o1r|  s                   r)   r  zAnnot.verticesg  s    	D		%000''.	u%>>#  uh7'-??8U3 y(:*>?||E$6$6y(3-$P||E$6$6y(<BX$Y||E$7$7	4$H<< C1e11!4a8 0%%e&9&9!Q&?@%%e&9&9!QqS&ABa+00A

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

4 	! J r*   c                    t        |        | j                  }t        j                  t        j                  |            S )zannotation xref number)ra  r   r   r   r   r   s     r)   r  z
Annot.xref  s1     	D		 3 3E :;;r*   r   )r  NNr  r   )NNNr   r   )Nr  NNr  NNNNNNNNNr,   )	NNr   NNNNTr  )rQ  OptStrrP  OptFloatr   rk  r   r/  r   OptSeqr  r1  rR  r1  r  r   rS  r4   NNNN)Cr/   r0   r1   r   r   r   r   r   r  r  r+  r_  propertyrh  rr  r~  r  r  r  r  r  r  r  r  re  r  r  r  r  r  r	  r  r  r   r'  r.  r9  rP  r?  rA  r   rI  rL  rP  rS  rV  ra  ro  rr  r  r  r  r  r  r  r  r  r  r  r  r   r
  r  staticmethodr  r  r  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                  d    e Zd Zd Zd ZddZddZddZddZddZ	dd	Z
ed
        Zd Zd Zy)Archivec                x    t               | _        t        j                         | _        |r | j
                  |  yy)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   zArchive.__init__  s4     !F..0	DHHt r*   c                2    dt        | j                         S )NzArchive, sub-archives: )r7   r8  r.   s    r)   r   zArchive.__repr__  s    (T->->)?(@AAr*   Nc                F    t        j                  | j                  ||       y r,   )r   fz_mount_multi_archiver   )r(   subarchr
   s      r)   	_add_archzArchive._add_arch  s    $$dii$?r*   c                p    t        j                  |      }t        j                  | j                  ||       y r,   )r   fz_open_directoryr>  r   )r(   folderr
   subs       r)   _add_dirzArchive._add_dir  s(    %%v.$$diid;r*   c                    t        |      }t        j                  t        j                               }t        j                  |||       t        j
                  | j                  ||       y r,   )r"  r   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferr>  r   )r(   memoryr   r
   buffrD  s         r)   _add_treeitemzArchive._add_treeitem  sJ    !6*''8((#tT:$$diid;r*   c                    |dk(  rt        j                  |      }nt        j                  |      }t        j                  | j                  ||       y Nr   )r   fz_open_zip_archivefz_open_tar_archiver>  r   )r(   filepathrU  r
   rD  s        r)   _add_ziptarfilezArchive._add_ziptarfile  s?    A:++X6C++X6C$$diid;r*   c                    t        |      }t        j                  |      }|dk(  rt        j                  |      }nt        j                  |      }t        j
                  | j                  ||       y rN  )r"  r   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamr>  r   )r(   rJ  rU  r
   rK  r	   rD  s          r)   _add_ziptarmemoryzArchive._add_ziptarmemory  sY    !6*%%t,!877@C77@C$$diid;r*   c                $    d } fd}t        |t        j                        rt        |      }t        |t              rt        j
                  j                  |      r/ j                  ||        |t	        j                  |      |d      S t        j
                  j                  |      rlt        |t              r|dk7  sJ d|d       t        j                  |d      5 }|j                         }ddd        j                  |        ||gdd	      S t        d
|       ||      r8t        |t              r	|d|dk7  sJ  j                  ||        ||gdd	      S t        |t        j                         rht#        |dd      }|.|j$                  j'                         } j)                  |d|       n j+                  |d|        ||j-                         |d      S t        |t.        j0                        rt#        |j2                  dd      }|T|j2                  }t        |t        j4                        s|j2                  } j)                  |j'                         d|       n j+                  |d|        ||j7                         |d      S t        |t8              r j;                  ||        |g |d      S t        |t<              rt?        |      dk(  r|\  }	}
t        |
t              sJ dtA        |
              ||	      r j                  |	|
|       nt        |	t              rct        j
                  j                  |	      rXt        j                  |	d      5 }|j                         }ddd        j                  |
|       nJ dtA        |	      d        ||
g|d	      S tC        |d      r|D ]  } jE                  ||        ytG        dtA        |       d      # 1 sw Y   xY w# 1 sw Y   xY w)a  
        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    t        | t        t        t        j                  f      S r,   )r>   r  	bytearrayr9   BytesIOr"  s    r)   is_binary_dataz#Archive.add.<locals>.is_binary_data  s    a%BJJ!?@@r*   c                J   t        || |      }|dk7  sj                  g k(  rj                  j                  |       y j                  d   }|d   dk7  s|d   |d   k7  rj                  j                  |       y |d   j                  |d          |j                  d<   y )N)r   entriesr
   treer  r   r
   r_  )r5   r8  rk   extend)r_  mountr   r?  ltreer(   s        r)   make_subarchz!Archive.add.<locals>.make_subarch  s    sG%@Gf} 1 1R 7!!((1))"-<6)U6]gfo-M%%,,W5)$++GI,>?,1D%%b)r*   dirr\   z'Need name for binary content, but path=r   rbNr`  zNot a file or directory: rf   r   zipr   r   tarmultir   zUnexpected type(name)=)r
   zUnexpected type(data)=r]  zUnrecognised type )$r>   pathlibPathr  rd   r
   isdirrE  listdirisfiler9   r:   readrL  r   zipfileZipFiler   fpgetvaluerW  rR  namelisttarfileTarFilefileobjr[  getnamesr6  r@  r   r7   r   r;   r:  r  )r(   rt  r
   r]  rd  r  ffrf   rr  datar   rC   s   `           r)   r:  zArchive.add  s   $	A
	2 gw||,'lGgs#ww}}W%gt,#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w
D9HZZ((*&&r1d3$$Xq$7 0 0 2D%@@1w=H__!"bjj1B&&r{{}a>$$Xq$7 0 0 2D%@@)NN7D)D'22gu%#g,!*; JD$dC(E,CT
}*EE(d#""4D"9D#&77>>$'t, &VVX&&&r4d&;63T
}A66qf55Wm, %t$% 0gqABBw" "Z& &s   "O9.P9PPc                    | j                   S )z'
        List of sub archives.
        )r8  r.   s    r)   
entry_listzArchive.entry_list<  s    
    r*   c                B    t        j                  | j                  |      S r,   )r   fz_has_archive_entryr   r(   r   s     r)   	has_entryzArchive.has_entryC  s    ))499d;;r*   c                X    t        j                  | j                  |      }t        |      S r,   )r   fz_read_archive_entryr   r  )r(   r   rK  s      r)   
read_entryzArchive.read_entryF  s#    **DIIt<&&r*   r,   )r/   r0   r1   r   r   r@  rE  rL  rR  rW  r:  r3  r|  r  r  r-   r*   r)   r6  r6    sL    B@<<<<gR ! !<'r*   r6  c                  Z   e Zd Zd Zd Zd Zd Zd Zd ZdHdZ	d	 Z
d
 Zd ZdIdZd ZdJdZdHdZd ZdKdZd Zd Zd ZdHdZdHdZd Zd Zd Zd Zd Zed        Zd Zd Z d Z!d  Z"d! Z#e$d"        Z%d# Z&d$ Z'd% Z(d& Z)d' Z*e$d(        Z+e$d)        Z,e$d*        Z-e$d+        Z.e$d,        Z/d- Z0d. Z1e$d/        Z2d0 Z3d1 Z4d2 Z5dLd3Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;dLd9Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dMdAZDdB ZEdNdCZFdD ZGdE ZHe$dF        ZIe$dG        ZJe	ZKe	ZLe	ZMy)OXmlc                    | S r,   r-   r.   s    r)   	__enter__zXml.__enter__M      r*   c                     y r,   r-   r;  s     r)   __exit__zXml.__exit__P      r*   c                    t        |t        j                        r|| _        y t        |t              r0t        j
                  |      }t        j                  |      | _        y J dt        |              )NzUnsupported type for rhs: )r>   r   FzXmlr   r  fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r(   rhsrK  s      r)   r   zXml.__init__S  sY    c5;;'DIS!77<D55d;DI>249+>>1r*   c                .    fdd}g } | ||      }|S )Nc           	        | | j                   r.|j                  |d| j                   df       | j                  } <|j                  |d| j                   f       | j                         j                         D ]  \  }}|j                  |d| d| df       ! | j                  }|r |||dz         }|j                  |d| j                   f       | j                  } | |S )N"(r   z 'r   r   ))is_textrk   r   r9  tagnameget_attributesrB   first_child)noderB   shiftkrF   child	show_nodes         r)   r  z%Xml._get_node_tree.<locals>.show_node]  s    "<<LL%1TYYKq)9!:;99Deq%789 //1779 9DAqLL%1QCr!A!789((%eUEAI>Eeq%789yy " Lr*   r   r-   )r(   r  rB   r  s      @r)   _get_node_treezXml._get_node_tree\  s'    	  $u-r*   c                J    | j                  d      }| j                  |       |S )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childr(   r  s     r)   add_bullet_listzXml.add_bullet_listr  %    ##D)% r*   c                    | j                  d      }|||v r| S | j                  d       ||}n|d|z   z  }| j                  d|       | S )z5Set some class via CSS. Replaces complete class spec.classr   get_attribute_valueremove_attributeset_attribute)r(   r   clss      r)   	add_classzXml.add_classx  s]    &&w/?ts{Kg&;C3:C7C(r*   Nc                    | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a "code" tagr  r  r   r  r  create_text_nodespan_bottomr(   r   r  prevs       r)   add_codezXml.add_code  sb    ##F+:t44T:;!<D% r*   c                J    | j                  d      }| j                  |       |S )z!Add monospaced lines ("pre" node)prer  r  s     r)   add_codeblockzXml.add_codeblock  %    ##E*% r*   c                J    | j                  d      }| j                  |       |S )zAdd description list ("dl" tag)dlr  r  s     r)   add_description_listzXml.add_description_list  r  r*   c                J    | j                  d      }| j                  |       |S )zAdd "div" tagdivr  r  s     r)   add_divisionzXml.add_division  r  r*   c                    |t        dd      vrt        d      | j                  }d| }| j                  |      }|dvr| j	                  |       |S | j
                  j	                  |       |S )zAdd header tagr      zHeader level must be in [1, 6]h)h1h2h3h4h5h6r  )rF  r   r  r  r  r   )r(   r   this_tagnew_tagr  s        r)   
add_headerzXml.add_header  ss    a#=>><<eW+##G,DDe$L  'r*   c                J    | j                  d      }| j                  |       |S )zAdd horizontal line ("hr" tag)hrr  r  s     r)   add_horizontal_linezXml.add_horizontal_line  r  r*   c                   | j                  d      }||j                  d|        ||j                  d|        ||j                  dd|        ||j                  d|        |j                  d|        | j                  |       |S )zAdd image node (tag "img").imgrY  heightrZ  zfloat: r  src)r  r  r  )r(   r   rY  r  imgfloatr  r  s          r)   	add_imagezXml.add_image  s    ##E*E74VH678*)=>E74EdV-% r*   c                    | j                  d      }t        |t              s|}|j                  d|       |j	                  | j                  |             | j                         }|| }|j	                  |       | S )zAdd a hyperlink ("a" tag)r!   href)r  r>   r  r  r  r  r  )r(   r  r   r  r  s        r)   add_linkzXml.add_link  su    ##C($$DFD)40067!<D% r*   c                    | j                   dvrt        d| j                         | j                  d      }| j                  |       |S )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_itemzXml.add_list_item  sC    <<|+6EE##D)% r*   c                    | j                  d      }|dkD  r|j                  dt        |             ||j                  d|       | j                  |       |S )zAdd numbered list ("ol" tag)r  r   r  r   )r  r  r  r  )r(   r  numtyper  s       r)   add_number_listzXml.add_number_list  sV    ##D)19U40% r*   c                    | j                  d      }| j                  dk7  r| j                  |       |S | j                  j                  |       |S )zAdd "p" tagr  )r  r  r  r   r  s     r)   add_paragraphzXml.add_paragraph  sL    ##C(<<3e$  KK$$U+r*   c                J    | j                  d      }| j                  |       |S Nspanr  r  s     r)   add_spanzXml.add_span  s%    ##F+% r*   c                    | j                  d      }|||v r| S | j                  d       ||}n|d|z   z  }| j                  d|       | S )z;Set some style via CSS style. Replaces complete style spec.rZ  ;r  )r(   r   rZ  s      r)   	add_stylezXml.add_style  s^    ((1Kg&=ES4ZE7E*r*   c                    | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a subscript ("sub" tag)rD  r  r  s       r)   add_subscriptzXml.add_subscript  b    ##E*:t44T:;!<D% r*   c                    | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a superscript ("sup" tag)supr  r  s       r)   add_superscriptzXml.add_superscript		  r  r*   c                   |j                         }t        |      }| j                         }|| }t        |      D ]N  \  }}|j	                  | j                  |             ||dz
  k  s/|j	                  | j                  d             P | S )z"Add text. Line breaks are honored.r   r  )r  r7   r  	enumerater  r  r  )r(   r   lines
line_countr  rZ  ro   s          r)   add_textzXml.add_text	  s    !Z
!<D ' 	=GAtd33D9::>!!!$"5"5d";<	= r*   c                X    t        j                  | j                  |j                         y r,   )r   fz_dom_append_childr   r  s     r)   r  zXml.append_child"	  s    !!499ejj9r*   c                    | j                  d      }|j                  |       | j                         }|| }|j                  |       |S r  )r  r  r  r  )r(   rZ  r  r  s       r)   append_styled_spanzXml.append_styled_span%	  sI    ""6*u!<D$r*   c                R    t        t        j                  | j                              S r,   )r  r   fz_dom_bodyr   r.   s    r)   bodytagzXml.bodytag.	  s    E%%tyy122r*   c                V    t        j                  | j                        }t        |      S r,   )r   fz_dom_cloner   r  r(   rG   s     r)   clonez	Xml.clone1	  s       $)),Cyr*   c                    t        |       t        u r| S t        |       t        u rdt        |        dS t        |       t        t
        fv rdt	        |        S | S )Nzrgb(r  r  )r   r  r4   sRGB_to_rgbr   r   )colors    r)   
color_textzXml.color_text5	  sZ    ;#L;#+e,-Q//;5$-'u''r*   c                T    t        t        j                  | j                  |            S r,   )r  r   fz_dom_create_elementr   )r(   tags     r)   r  zXml.create_element?	  s    E//C@AAr*   c                T    t        t        j                  | j                  |            S r,   )r  r   fz_dom_create_text_noder   )r(   r   s     r)   r  zXml.create_text_nodeB	  s    E11499dCDDr*   c                    | j                         }|D ])  }t        d|d   z  |d   j                  dd      z          + y)z)Print a list of the node tree below self.z  r   r   r%   \nN)r  rr   r  )r(   rB   rC   s      r)   debugz	Xml.debugE	  sE    ##% 	CDD47NT!W__T5%AAB	Cr*   c                v    t        j                  | j                  |||      }|j                  rt	        |      S y r,   )r   fz_dom_findr   r   r  r(   r  attmatchrG   s        r)   r   zXml.findK	  s2    Ce<>>9 r*   c                v    t        j                  | j                  |||      }|j                  rt	        |      S y r,   )r   fz_dom_find_nextr   r   r  r  s        r)   	find_nextzXml.find_nextP	  s2    $$diic5A>>9 r*   c                    t        j                  | j                        ry t        j                  |       }|j                  rt        |      S y r,   )r   fz_xml_textr   fz_dom_first_childr   r  r  s     r)   r  zXml.first_childU	  s=    dii(&&->>9 r*   c                J    |sJ t        j                  | j                  |      S r,   )r   fz_dom_attributer   r(   keys     r)   r  zXml.get_attribute_value^	  s     
s%%tyy#66r*   c                    t        j                  | j                        ry t               }d}	 t        j                  | j                  |      \  }}|r|s	 |S |||<   |dz  }5Nr   r   )r   r  r   r5   fz_dom_get_attribute)r(   resultrZ  r  r  s        r)   r  zXml.get_attributesb	  sh    dii(11499a@HCc  FCLFA r*   c                X    t        j                  | j                  |j                         y r,   )r   fz_dom_insert_afterr   r(   r  s     r)   insert_afterzXml.insert_afterp	  s    !!499dii8r*   c                X    t        j                  | j                  |j                         y r,   )r   fz_dom_insert_beforer   r   s     r)   insert_beforezXml.insert_befores	  s    ""DIItyy9r*   c                    |j                         }t        |      }t        |      D ]N  \  }}| j                  | j	                  |             ||dz
  k  s/| j                  | j                  d             P | S )Nr   r  )r  r7   r  r  r  r  )r(   r   r  r  rZ  ro   s         r)   insert_textzXml.insert_textv	  st    !Z
 ' 	=GAtd33D9::>!!!$"5"5d";<	= r*   c                    | j                   duS )zCheck if this is a text node.Nrq   r.   s    r)   r  zXml.is_text	  s     yy$$r*   c                H    | j                   }|y	 |j                  }|s|S |})zReturn last child node.N)r  r9  )r(   r  r9  s      r)   
last_childzXml.last_child	  s5       =::DE	 r*   c                p    t        j                  | j                        }|j                  rt	        |      S y r,   )r   fz_dom_nextr   r   r  r  s     r)   r9  zXml.next	  s,    +>>9 r*   c                p    t        j                  | j                        }|j                  rt	        |      S y r,   )r   fz_dom_parentr   r   r  r  s     r)   r   z
Xml.parent	  s,    !!499->>9 r*   c                p    t        j                  | j                        }|j                  rt	        |      S y r,   )r   fz_dom_previousr   r   r  r  s     r)   previouszXml.previous	  s,    ##TYY/>>9 r*   c                B    t        j                  | j                         y r,   )r   fz_dom_remover   r.   s    r)   removez
Xml.remove	  s    TYY'r*   c                L    |sJ t        j                  | j                  |       y r,   )r   fz_dom_remove_attributer   r  s     r)   r  zXml.remove_attribute	  s    
s%%tyy#6r*   c                R    t        t        j                  | j                              S r,   )r  r   fz_xml_rootr   r.   s    r)   rootzXml.root	  s    E%%tyy122r*   c                    t        |t              r|}n>|t        k(  rd}n2|t        k(  rd}n&|t        k(  rd}n|t
        k(  rd}nt        d|      | j                  d|        | S )z Set text alignment via CSS styler  centerrightjustifyzUnrecognised align=ztext-align: )r>   r  TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   r  )r(   r  ts      r)   	set_alignzXml.set_align	  ss    uc"Ao%A''A&&A((A3UH566aS)*r*   c                N    |sJ t        j                  | j                  ||       y r,   )r   fz_dom_add_attributer   )r(   r  r   s      r)   r  zXml.set_attribute	  s    
s""DIIsE:r*   c                L    | j                  d| j                  |              | S )z"Set background color via CSS stylezbackground-color: )r  r  r(   r  s     r)   set_bgcolorzXml.set_bgcolor	  s%    +DOOE,B+CDEr*   c                <    |rd}nd}| j                  d|        | S )zSet bold on / off via CSS styleboldnormalzfont-weight: r  r(   r  s     r)   set_boldzXml.set_bold	  s)    CC-u 56r*   c                L    | j                  d| j                  |              | S )zSet text color via CSS stylezcolor: )r  r  rF  s     r)   	set_colorzXml.set_color	  s&    '$//%*@)A BCr*   c                .    | j                  d|        | S )z(Set number of text columns via CSS stylez	columns: rK  )r(   colss     r)   set_columnszXml.set_columns	  s    )D6 23r*   c                .    | j                  d|        | S )z"Set font-family name via CSS stylezfont-family: rK  )r(   fonts     r)   set_fontzXml.set_font	  s    -v 67r*   c                b    t        |      t        u rd}nd}d| | }| j                  |       | S )z Set font size name via CSS styler\   pxzfont-size: )r   r  r  )r(   r   rW  r   s       r)   set_fontsizezXml.set_fontsize	  s;    >S BBXJrd+%r*   c                    | j                   }|j                  dd|      rt        d| d      | j                  d|       | S )zSet a unique id.Nr5  zid 'z' already exists)r8  r   r   r  )r(   uniquer8  s      r)   set_idz
Xml.set_id	  sG     yy99T4(tF8+;<==4(r*   c                <    |rd}nd}| j                  d|        | S )z!Set italic on / off via CSS styleitalicrJ  zfont-style: rK  rL  s     r)   
set_italiczXml.set_italic	  s)    CC,se 45r*   c                .    | j                  d|        | S )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r  )r(   leadings     r)   set_leadingzXml.set_leading	  s    )'34r*   c                .    | j                  d|        | S )z,Set inter-letter spacing value via CSS stylezletter-spacing: rK  r(   spacings     r)   set_letter_spacingzXml.set_letter_spacing 
  s    "27) <=r*   c                .    | j                  d|        | S )z6Set line height name via CSS style - block-level only.zline-height: r`  )r(   
lineheights     r)   set_lineheightzXml.set_lineheight
  s    zl34r*   c                .    | j                  d|        | S )zSet margin values via CSS stylez	margins: rK  rL  s     r)   set_marginszXml.set_margins

  s    )C5 12r*   c                .    | j                  d|        | S )zSet opacity via CSS stylez	opacity: rK  )r(   rP  s     r)   r  zXml.set_opacity
  s    )G9 56r*   c                (    | j                  d       | S )z$Insert a page break after this node.zpage-break-after: alwaysr`  r.   s    r)   set_pagebreak_afterzXml.set_pagebreak_after
  s    12r*   c                (    | j                  d       | S )z%Insert a page break before this node.zpage-break-before: alwaysr`  r.   s    r)   set_pagebreak_beforezXml.set_pagebreak_before
  s    23r*   c                   | j                   }|j                         }||j                  |       ||j                  |       ||j	                  |       ||j                  |       ||j                  |       ||j                  |       ||j                  |       ||j                  |       |	|j                  |	       |
|j                  |
       ||j                  |       ||j                  |       ||j                  |       ||j                          ||j!                          ||j#                  |       || j%                  |       || j'                  |       g }|j)                  d      }||j+                  |       |j,                  }|r/|j+                  |j)                  d             |j,                  }|r/| j/                  ddj1                  |             |j3                          | S )z`Set any or all properties of a node.

        To be used for existing nodes preferably.
        rZ  r  )r8  r  rB  rG  rM  rO  rR  rU  rX  set_text_indentr^  rb  rf  ri  rk  rn  rp  set_word_spacingr[  r  r  rk   r  r  r  r3  )r(   r  bgcolorrI  r  columnsrT  r   indentr]  ra  letter_spacingrh  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r8  tempstyles	top_styler  s                           r)   set_propertiesz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  	7CHHV$45r*   c                .    | j                  d|        | S )z;Set text indentation name via CSS style - block-level only.ztext-indent: r`  )r(   rv  s     r)   rr  zXml.set_text_indentj
  s    vh/0r*   c                .    | j                  d|        | S )Nztext-decoration: rK  rL  s     r)   set_underlinezXml.set_underlineo
  s    "3C5 9:r*   c                .    | j                  d|        | S )z*Set inter-word spacing value via CSS stylezword-spacing: rK  rd  s     r)   rs  zXml.set_word_spacings
  s    .	 :;r*   c                2   | }| j                   }|y|j                  r|j                  }|n|j                  r||j                  dk7  ry	 ||S |j                  dv s|j                  r|j                  },|j                  dk(  r|}|j
                  }n|S L)z$Find deepest level in stacked spans.Nr  )r!   rD  r  body)r)  r  r0  r  r9  r  )r(   r   r  s      r)   r  zXml.span_bottomx
  s    =mmNNE} mm =EMMV3}}} 99U]]

}}&)) r*   c                @    t        j                  | j                        S r,   )r   
fz_xml_tagr   r.   s    r)   r  zXml.tagname
  s    ++r*   c                @    t        j                  | j                        S r,   )r   r  r   r.   s    r)   r   zXml.text
  s      $)),,r*   r,   r,  r2  r   NT)NNNNNNNNNNNNNNNNNN)	underline)Nr/   r0   r1   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  r4  r  r  r  r
  r   r  r3  r  r  r  r!  r$  r&  r  r)  r9  r   r0  r3  r  r8  rB  r  rG  rM  rO  rR  rU  rX  r[  r^  rb  rf  ri  rk  r  rn  rp  r  rr  r  rs  r  r  r   add_varadd_sampadd_kbdr-   r*   r)   r  r  K  sD   ?,	
		:3  BEC

  79: % % 	 	  
  
  
(7 3 3";









  !'JX

2 , , - - GHGr*   r  c                  >    e Zd Zd Zd Zd Zed        Zed        Zy)
Colorspacec                   t        |t        j                        r|| _        y|t        k(  r3t        j                  t        j                  j
                        | _        y|t        k(  r3t        j                  t        j                  j                        | _        y|t        k(  r3t        j                  t        j                  j                        | _        yt        j                  t        j                  j                        | _        y)z!Supported are GRAY, RGB and CMYK.N)
r>   r   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r(   rU  s     r)   r   zColorspace.__init__
  s    ue001DIg**5+=+=+H+HIDIg**5+=+=+H+HIDIf_**5+=+=+G+GHDI**5+=+=+G+GHDIr*   c                D    d| j                      }d| d| j                   S )N)r\   GRAYr\   RGBCMYKzColorspace(CS_z) - )rE   r   r(   r"  s     r)   r   zColorspace.__repr__
  s'    +DFF3s$tyyk22r*   c                @    t        j                  | j                        S r,   )r   fz_colorspace_namer   r.   s    r)   _namezColorspace._name
  s    ''		22r*   c                @    t        j                  | j                        S )zSize of one pixel.)r   fz_colorspace_nr   r.   s    r)   rE   zColorspace.n
       $$TYY//r*   c                "    | j                         S )zName of the Colorspace.r  r.   s    r)   r   zColorspace.name
  s     zz|r*   N)	r/   r0   r1   r   r   r  r3  rE   r   r-   r*   r)   r  r  
  s:    I33 0 0  r*   r  c                      e Zd Zd Zy)DeviceWrapperc                   t        |t        j                        r|\  }|| _        y t        |t        d       r|\  }}t        |      }t        j                  |      r.t        j                  t        j                         |      | _        y t        j                  t        j                         ||      | _        y t        |t        j                        r|\  }t        j                  |      | _        y t        |t        j                  d       r6|\  }}t        j                  |      }	t        j                  ||	      | _        y t        d|      )Nz%Unrecognised args for DeviceWrapper: )
args_matchr   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicerm  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicerg   )
r(   r  devicepmr  r*  r  tpr  optss
             r)   r   zDeviceWrapper.__init__
  s    tU^^,GFDIvt,HB#T*D))40!44enn6FK	!>>@PRTVZ[	u223CB00"5DIu00$7IB''/D112t<DIDTHMNNr*   Nr   r-   r*   r)   r  r  
  s    Or*   r  c                  >    e Zd Zd Zd ZddZd	dZed        Zd Z	y)
DisplayListc                6    t        |       t        ury d| _        y NF)r   r  r   r.   s    r)   __del__zDisplayList.__del__
  s    Dz[(&r*   c                   t        |      dk(  r;t        |d   t        j                        rt        j                  |d         | _        y t        |      dk(  r(t        |d   t        j                        r|d   | _        y J d|       )Nr   r   zUnrecognised args=)r7   r>   r   rc  r  r   r;  s     r)   r   zDisplayList.__init__
  so    t9>ja%,,?++DG4DIY!^
47E4G4G HQDI-+dW--1r*   Nc                    t        |t              r|j                  }n-t        j                  t        j                  j
                        }t        | j                  ||||d       }d|_        |S NT)r>   r  r   r   r  r  JM_pixmap_from_display_listr   )r(   r  r  r  r  r  s         r)   r  zDisplayList.get_pixmap
  sW    j*-#J++E,>,>,H,HIJ)$))VZPTVZ[
r*   c                    t        j                         }||_        t        j                  | j                  |      }d|_        |S )z#Make a TextPage from a DisplayList.T)r   r  r  r  r   r   )r(   r  stext_optionsr  s       r)   r  zDisplayList.get_textpage
  s:    ,,.#		=9
r*   c                l    t        t        j                  | j                              }t	        |      }|S r,   )rb  r   fz_bound_display_listr   r  rL  s     r)   r   zDisplayList.rect
  s)    e99$))DE3i
r*   c                    t        j                  | j                  |j                  t	        |      t        |      t        j                                y r,   )r   fz_run_display_listr   r  r  r  FzCookie)r(   dwr{  areas       r)   runzDisplayList.run
  s8    !!				!!$% 	r*   )NNr   N)r   )
r/   r0   r1   r  r   r  r  r3  r   r  r-   r*   r)   r  r  
  s/    .  
r*   r  c                  	   e Zd ZddZddZd Zd Zej                  dedd       Z	e
j                  dk\  r&ej                  dd       Z	ej                  dd	       Z	ded
Z	ddZddZddZd Z	 	 	 	 ddZd Zd Zd Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZd ZddZddZd Zd Zd ZddZd ZddZdedd Zd! Z d" Z!d# Z"d$ Z#d% Z$dd&Z%d' Z&d( Z'd) Z(dd*Z)d+ Z*d, Z+d- Z,d. Z-dd/Z.e/d0        Z0dd1Z1dd3Z2d4 Z3d5 Z4d6d6d7dd8Z5e/d9        Z6d: Z7d; Z8dd<Z9ddd=Z:d> Z;ddd?Z<d@ Z=	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddAZ>ddBZ?ddCZ@ddDZAddEZBddFZC	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddGZDddHZEdI ZF	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddKZGdL ZHddMZI	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddNZJddOZKdP ZLdQ ZMddRZNdS ZOddTZPdU ZQdddVZRdddWZSdX ZTddYZUdddddJd6dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd[ZV	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd\ZWdd]ZXd^ ZY	 d	 	 	 	 	 dd_ZZd` Z[ddaZ\ddbZ]dc Z^	 	 	 	 	 	 	 	 dddZ_	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddfZ`ddddd2d2d2ddd2ddgdhZae/di        Zbe/dj        Zce/dk        Zde/dl        Zee/dm        Zfe/dn        Zgdo Zhdp Zidq Zjdr Zkds Zldt Zmdu Zndv ZoddwZpdx Zqdy Zre/dz        Zse/d{        Ztd| Zudd}Zvd~ Zwd Zxd Zye/dd       ZzdddZ{e/d        Z|ddZ}e/d        Z~	 	 	 d	 	 	 	 	 	 	 	 	 ddZd Zd Ze/d        Zd Zd Zd Ze/dd       Ze/dd       ZdddZd ZddZe/d        Zd ZddZd ZddZ	 	 	 	 	 	 	 	 	 	 d dZddZd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd ZddZddZdedZddZdd	dZd
dZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZd Z	 d	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd ZdddZdedZddZddZe/d        Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Ze/d        ZddddZd Zd Zd Zd ZdedZd Zd ZddZd Zd Zd Zd ZdZ e/dĄ       ZeZy(  r   c                @   t        |      t        u r|| j                  k  ryyt        |      t        t        fvst        |      dk7  ry|\  }}	 t        |t              r|dk  s|| j                  k\  ry	 t        |t              r|dk  s|| j                  |      k\  ryy)NTFr   r   )	r   r4   
page_countr   r   r7   r>   chapter_countchapter_page_count)r(   locchapterpnos       r)   __contains__zDocument.__contains__	  s    9T__$9UDM)SX]!'3/Q;d000!#s+7$11'::r*   c                r   | j                   st        d      t        |      t        u r| j	                  |      S t        |      t
        t        t        fv r| j                  |      S t        |      t        urt        d      | j                  }|j                  r|j                  nd}|j                  r|j                  n|}|j                  r|j                  nd}|dk  r||z  }|dk  r||k\  rt        d      |dk  r||z  }|dk  r||kD  rt        d      | j                  t        |||            S )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r   r4   delete_pager   r   rF  delete_pagesslicer  r  stopstep)r(   rZ  pcr  r  r  s         r)   __delitem__zDocument.__delitem__  s   {{[))7c>##A&&7tUE**$$Q''7%011__77qvvRqvvQaiRKE aiB;122QhBJD Qh"9122  udD!9::r*   c                    | S r,   r-   r.   s    r)   r  zDocument.__enter__6  r  r*   c                $    | j                          y r,   closer;  s     r)   r  zDocument.__exit__9      

r*   r   c                     y r,   r-   r(   rZ  s     r)   r]  zDocument.__getitem__<  s    r*   )r   	   c                     y r,   r-   r  s     r)   r]  zDocument.__getitem__A      r*   c                     y r,   r-   r  s     r)   r]  zDocument.__getitem__E  r  r*   c                l   t        |t              r1t        |j                  t	        |              D cg c]  }| |   	 c}S t        |t
              s;t        |t              r t	        |      dk(  rt        d |D              sJ d|d       || vrt        d| d      | j                  |      S c c}w )Nr   c              3  <   K   | ]  }t        |t                y wr,   )r>   r4   ).0r"  s     r)   	<genexpr>z'Document.__getitem__.<locals>.<genexpr>L  s     RqjkS]^_adSeRqs   zInvalid item number: i=r   page z not in document)
r>   r  rF  indicesr7   r4   r   all
IndexError	load_page)r(   rZ  r|  s      r)   r]  zDocument.__getitem__I  s    a%*AIIc$i,@%ABDGBB!S!jE&:s1v{sRqopRqOq 	.*t1-	.rD=uQC'7899~~a   Cs   B1Nc                   t         }da 	 d| _        d| _        d| _        d| _        g | _        i | _        i | _        i | _        t        j                         | _
        t        |t        j                        r|}	|	| _        d| _        	 |a y|}
|}t!        |      }t        j"                  |      s2|j$                  |j&                  z
  }
|j(                  |j*                  z
  }|| _        || _        ||||}t        |t0        t2        f      rn_t        |t4              rt1        |      }nCt        |t6        j8                        r|j;                         }nt=        dt?        |      d      || _        t        |t0        t2        f      sJ tA        |      dk(  rtC        d      t        jD                  t        jF                  |      tA        |            }	 t        jH                  |r|nd|      }ng|r;|rJ t        |tR              rnLtU        |d      rtS        |      }n4tU        |d      r|jV                  }nt=        dt?        |      d|d      || _        tX        jZ                  j]                  |      st_        d| d      tX        jZ                  ja                  |      stQ        d| d      tX        jZ                  jc                  |      dk(  rtC        d|d      |r-	 t        jd                  |      }t        jH                  ||      }n@	 t        jf                  |      }n)t        j                         }t        jh                  |      }|
dkD  r|dkD  rt        jj                  ||
||       n-t        jl                  |      rt        jj                  |ddd       || _        d| _7        | jn                  rtp        js                         | _:        | jv                  rd| _        n| jy                          |r|j{                         j}                  d      s|r#d|j{                         v r	 | j                         }t        rbt        | j                  t        j                        | _        | j                  rt        j                  | _C        |a yt        j                  | _C        |a y# tJ        $ r$}tL        d	kD  r
tO                tQ        d
      |d}~ww xY w# tJ        $ r+}tL        d	kD  r
tO                tQ        d|d|d      |d}~ww xY w# tJ        $ r(}tL        d	kD  r
tO                tQ        d|d      |d}~ww xY w# tJ        $ r$}tL        d	kD  r
tO                tQ        d      |d}~ww xY w# |a w xY w)aV  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string or pathlib.Path, must have supported
                    file extension.
            open(type, buffer) - type: valid extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            open(filename, fileype=type) - filename with unrecognized extension.
            rect, width, height, fontsize: layout reflowable document
            on open (e.g. EPUB). Ignored if n/a.
        r   FNTzbad stream: type(stream)=r   zCannot open empty stream.r\   r   zFailed to open streamabsoluter   zbad filename: type(filename)=z
 filename=zno such file: 'r   z' is no filez!Cannot open empty file: filename=zFailed to open file z	 as type i  iX     svgcannot open broken document)EJM_mupdf_show_errorsr   is_encryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsr>   r   r   r   this_is_pdfr  r  x1x0y1y0r  r	   r  
memoryviewrZ  r9   r[  rs  r  r   r7   EmptyFileErrorfz_open_memorypython_buffer_datafz_open_document_with_streamrg   r  rv   FileDataErrorr  r;   r   rd   r
   existsFileNotFoundErrorrn  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(   rf   r	   filetyper   rY  r  r   JM_mupdf_show_errors_oldpdf_documentr   r  r  stream2r%  r[  	fz_streamrT  r  s                      r)   r   zDocument.__init__R  s   $ $8  B	< %DN %D %D#DM!DN!DN!DO#%D&::<DO(E$5$56'(	#' h $< e AA%A,,Q/DD144KDD144K!DJ DK!'H,<  (Hfuj&9:	2"6]F

3#__.F#&@4</$CDD$!&5**=>>>v;!# ))DEE..u/G/G/OQTU[Q\]H<<XWY[bcC
 !!zh,Xz2"8}HXv.'}}H#&DT(^4E[xkQR$STT%
 ww~~h/+ohZq,IJJ1'!H:\(BCCWW__X.!3(+MH;a)PQQn$)$6$6x$@	#@@9U
Y#44X> '')&&s+1uQ((aH=005((c3;DI  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   A;U= 	EU= R2 1C<U= .+S" U= T 0DU= 7U AU= U= 2	S;SSU= "	T+&TTU= 	U
"#UU

U= 	U:U55U::U= =Vc                    | j                   S r,   )r  r.   s    r)   __len__zDocument.__len__  s    r*   c                    | j                   rdnd}| j                  4| j                  dk(  r| d| j                  ddS | d| j                   dS | d| j                   d| j                  ddS )	Nzclosed r\   zDocument(<new PDF, doc# r  z>)z
Document('')z', <memory, doc# )r   r	   r   r  )r(   r   s     r)   r   zDocument.__repr__  s}    !%IR	;;yyB#$<T^^A<NbQQ[
499+R88Jtyyk1B4>>RSBTTVWWr*   c           	        | j                   s| j                  rt        d      t        | d      }|j                  syt        j                  t        j                  |      t        d      t        d      t        d      t        d            }|j                  rt        j                  |      st        d	      t        j                  |      }t        ||      }t        j                  |||       y)
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  ru  r   pdf_new_nameJM_pdf_obj_from_strrH  )r(   r   rT  rT  fontsr  rF   s          r)   _addFormFontzDocument._addFormFont  s    >>T..;<<ta0~~##!!3' $  u'8'8%'@ ;<<%d+E1a(r*   c                L    | j                         |   }| j                  |       y)z$Delete TOC / bookmark item by index.N)get_outline_xrefs_remove_toc_item)r(   idxr  s      r)   del_toc_itemzDocument.del_toc_item
  s%    
 %%',d#r*   c                   | j                   s| j                  rt        d      g }t        | d      }|j                  s|S t        j                  t        j                  |      t        d            }t        j                  |t        d            }|j                  s|S t        j                  |t        d            }t        ||      }t        |      }t        j                  |      }t        j                  ||       t        j                  |t        d             t        |      D ]'  }t        ||      \  }	}
t        j                  ||
       ) |j!                  |       |}| j#                          |S )zDelete the TOC.r$  r   r%  r&  OutlinesFirst)r   r  r   r   r   r   r  r*  r  JM_outline_xrefsr7   r   pdf_delete_objectr;  rF  JM_INT_ITEMrk   r  )r(   xrefsrT  r8  olrootfirst
xref_countolroot_xrefrZ  r  r  r  s               r)   _delToCzDocument._delToC  s7   >>T..;<<ta0~~L!!%"3"3C"8(6:JK##D(:*>?  L""68G+<= .Z
&&v.[14*!56z" 	/A!%+GAt##C.	/ 	[!
r*   c                    t        |       }t        j                  ||       |j                  j                  r t        j
                  |j                         y y r,   )r   r   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)r(   r  rT  s      r)   _delete_pagezDocument._delete_page2  s@    t$sC(>>&&''8 'r*   c                    t        |       }t        |dt        j                  |      dz
        st	        t
              t        j                  ||       y)zDelete object.r   N)r   r  r   r  r   r  r8  r(   r  rT  s      r)   _deleteObjectzDocument._deleteObject8  sC    t$a!3!3C!8!:;l++T*r*   r  c                   d }|dk  rd}n!||j                   k\  r|j                   dz
  }n|}|dk  s||j                   k\  r|j                   dz
  }n|}|dk  rt        d      |}||k  rdnd}	t        t        |||	z   |	            }
t        t	        |
            D cg c]  }||z   	 }}g }g }t        t	        |
            D ]P  }|
|   }||   }|j                  |      }| j                  |      }|j                  |       |j                  |       R t        t	        |            D ]  }||
|      }|j                         }t	        |      dk(  rd},|j                   }| ||      }g }|D ]5  }|d   t        k(  r|d   |
vr ||||
|      }|s%|j                  |       7 |g k7  s|j                  t        |              yc c}w )	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           	        | d   |z  }t        t        |            }| d   t        k(  rMt        d   }|j	                  | d         }| d   |z  } |||   |j
                  |j                  | d   |      }	|	S | d   t        k(  r| d   dk\  rrt        d   }| j                  dt        dd            }
t        |
      t        urt        dd      }
 || d   |
j
                  |
j                  | d   | d	   | d	   |      }	|	S t        d
   }t        | d         }|dd }| d	   } ||||      }	|	S | d   t        k(  rt        d   } || d	   | d	   |      }	|	S | d   t        k(  rt        d   } || d   |      }	|	S d}	|	S )z5Create annotation object string for a passed-in link.fromkindgoto1r   tozoomr   gotor1ra   gotor2r   r  launchurir\   )r   r   	LINK_GOTO
annot_skelindexr"  r#  
LINK_GOTORr8   r  r   get_pdf_strLINK_LAUNCHLINK_URI)lnkxref_dstpno_srcr  r  r   txtr2  r  r   pntrM  r  s                r)   	cre_annotz%Document._do_links.<locals>.cre_annotO  s    Fc!AU1X&D6{i' )mmCK0IOHSM133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At,E L V+ *CKVd; L V( 'CJ-
 L Lr*   r   r   z'start_at' must be >= 0r  NrK  r   )r  r   r   rF  r7   	page_xrefrk   	get_linksrf  rS  _addAnnot_FromStringr   )doc1doc2	from_pageto_pagestart_atr_  rr  r  saincrr\  rZ  pno_dstxref_srcr[  p_srcp_dstold_xrefnew_xrefpage_srclinksr  page_dstlink_tabr  
annot_texts                             r)   	_do_linkszDocument._do_links?  s    ,	b q=B$//)1$BBQ;'T__41$BBa<677"Hq" uRdD12#(W#67a2677 s7|$ 	&AAJEAJE~~e,H~~e,HOOH%OOH%	& s8}% 	@AGAJ'H&&(E
 5zQ111CGAJ'HH 0V9	)qy/G&q(GSA
OOJ/0 2~--uX?)	@ 8s   G
c           	     (  ./0 |j                   syd .d 0/fd//fd}d.0fd	}d }	t        j                  |       }
t        j                  |      }| j                   rj |	|       }|j                  t	        d            }|j                  t	        d	            }|j                         sv|j                  t	        d	      d
      }nYt        j                   |	|            }|j                  t	        d             |j                  t	        d      d
       |j                  t	        d	             |j                  t	        d	      d
       t        j                  ||      }t        j                  |
|      }|j                  t	        d            }|j                  t	        d	            }|j                         }t        j                  |
|d      }t        j                  t        j                  |
      t	        d            }|j                  t	        d      |       ||k  rt        ||dz         }nt        ||dz
  d      }i }|D ]  }||   }|j!                         D cg c]  \  }}}|t        j"                  k(  r| c}}}D ]I  }t        j$                  ||      }|j                  t	        d              ||      \  }}|sAd|g d||<   K  |j'                         D ]  }t        j$                  ||      }t        j                  ||      }t        j                  |
|      }  /| g       }!| j                         }"t        j                  |
|"d      }#|j)                  |#       |"||   d<   |!||   d<    t        t+        |            D ]6  }| ||z      }$|||      }|j!                         D cg c]  \  }}}|t        j"                  k(  r| }%}}}|%sOt        j,                  |$      }&t        j                  |&j/                         t	        d            }'t        j
                  |'      s.t        j                  |&j/                         t	        d      d
      }'|%D ]]  }t        j$                  ||      }t        j0                  t        j2                  |d            }(t        j                  |j                  t	        d                  }|dk(  r	 t        j                  ||      })t        j                  |
|)      }+|+j                         }t        j                  |
|d      },t        j(                  |'|,       t        j(                  ||,       nN||   }|d   j9                  |      }-|d   |-   }t        j                  |
|d      },t        j(                  |'|,       |(sHt        j(                  ||,       ` 9  ||
||       yc c}}}w c c}}}w # t4        $ r}*t7        d|d|*        Y d}*~*d}*~*ww xY w)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                *   t        | j                               D ]w  }| j                  |      }|j                  t	        d            }t        |j                               D ].  }|j                  |      }|j                  t	        d      |       0 y y)z3 Make sure all kids have correct "Parent" pointers.Kidsr  N)rF  r  r  r  r  rH  )acro_fieldsrZ  r   kidsr|  kids         r)   clean_kid_parentsz/Document._do_widgets.<locals>.clean_kid_parents  s    ;4467 A$2215**8F+;<t1134 AA,,Q/C$$Xh%7@AAr*   c           	     d   d }d }t        j                  | |      }t        j                  | |      }|j                  t        d            }	|j                  t        d            }
|	j	                         r || |||	||
       y|
j	                         r || |||
||	       y || ||||||       y)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                ~   t        j                  | |d      }t        j                  | |d      }|j                  |      }|j                  |       |j	                         s]t        j
                  | |      }	|	j                  t        d             |	j                  t        d      |       |j                  |       yt        |j                               D ]d  }
|j                  |
      }|j                  t        d      |       t        j                  | |j                         d      }|j                  |       f y)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_objectr;  r  rH  pdf_array_pushrF  r  r  r   )rT  ry  xref1kids1xref2kids2w1_indw2_indr2  r8  rZ  r{  kid_inds                r)   	re_targetz=Document._do_widgets.<locals>.join_widgets.<locals>.re_target  s    //UA>//UA>!008,,S1))+"223>F ''6''(:FC ((0"5#6#6#89 6#11!4((();VD"'"8"8cnn>NPQ"R,,W5	6r*   c                p   t        j                  | d      }|j                  t        d      |       |j	                  t        d      d      }t        j
                  | |      }	|	j                         }
t        j                  | |
d      }|j                  t        d            }|j                  t        d             |	j                  t        d      |       |j                  t        d            }|j                  t        d             |	j                  t        d      |       |j                  t        d             |j                  t        d      |       |j                  t        d             |j                  t        d      |       t        j                  | |d      }t        j                  | |d      }|j                  |       |j                  |       |j                  |      }|j                  |       |j                  |      }|j                  |       |j                  |       y	)
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  rx  r   r   FTAAr  N)r   rM  r|  r  pdf_dict_put_arraypdf_add_objectr   r  r  r;  rH  r  r  r  )rT  ry  r  w1r  w2r   newrz  new_objnew_obj_xrefnew_indftaaind1ind2r2  s                    r)   
new_targetz>Document._do_widgets.<locals>.join_widgets.<locals>.new_target  s    ((a0,,Xc]DA--hv.>B..sC8&11300lAF __Xd^4/$$Xd^R8__Xd^4/$$Xd^R8 . 2G<. 2G< --c5!<--c5!<##D)##D) "006,,S1!006,,S1**73r*   rx  N)r   r  r  r  r  )rT  ry  r  r  r   r  r  r  r  r  r  s              r)   join_widgetsz*Document._do_widgets.<locals>.join_widgets  s    6<04d &&sE2B&&sE2BOOHV$45EOOHV$45E !!##{E5%G##%#{E5%G3UBr4Hr*   c           	     ~   t        j                  | t        d            }|j                         s|S t	        |j                               D ]n  }|j                  |      }t        j                  t        j                  |t        d                  r
 ||      }P|j                  |j                                p |S )z^Return xref list of leaf kids for a parent.

            Call with an empty list.
            rx  )
r   r  r  r  rF  r  r  ru  rk   r   )r   	kids_listrz  rZ  r{  get_kidss        r)   r  z&Document._do_widgets.<locals>.get_kids=  s    
 %%fhv.>?D$$&  4--/0 7((+$$U%7%7Xf=M%NO (i 8I$$S^^%567 r*   c                    g }t        j                  | t        d            }|j                         }|dk(  r||fS  ||      }||fS )z:Get the xref of top "Parent" and the list of leaf widgets.r  r   )r   r  r  r   )r8  r  r   parent_xrefr  s       r)   
kids_xrefsz(Document._do_widgets.<locals>.kids_xrefsM  sW    I''0BCF ++-Ka"I-- 3I	))r*   c                *   i }t        t        j                  |            D ]o  }t        j                  ||      }|j	                         }t        j
                  |t        d            }|j                  |g       }|j                  |       |||<   q |j                         D ]e  \  }	}t        |      dk  r|dd \  }
}|r | ||
||	       ,|	d| dz   }t        j                  | |      }|j                  t        d      |       g  |       y)z6Handle any widget name duplicates caused by the merge.r  r   Nz [ri  )rF  r   r  r  r   pdf_dict_get_text_stringr  r8   rk   rB   r7   r  r|  )rT  ry  join_duplicatesnamesrZ  wobjectr  r  r:  r   xref0r  newnamer|  r  s                r)   deduplicate_namesz/Document._do_widgets.<locals>.deduplicate_namesW  s   E 5..{;< !--k1=))+ 227HSMJ		!R(T" a!  %{{} 	Meu:>$Rayu" k5%F"r%]2G#33C?G44Xc]GL	M k*r*   c                ~    t        j                  |       }t        j                  t        j                  |      d      S )z,Retrieve the AcroForm dictionary form a PDF.Root/AcroForm)r   pdf_document_from_fz_documentpdf_dict_getpr*  )r%  rT  s     r)   get_acroformz*Document._do_widgets.<locals>.get_acroforms  s0    55c:C&&u'8'8'=OOr*   Fieldsr  r   r   r&  r'  r   r  P)ro  old_kidsnew_kidsro  r  r  zAA/Cr  zcannot copy widget at xref=r{   r  )r  F)is_form_pdfr   r  r  r  r  r  pdf_deep_copy_objr;  pdf_graft_mapped_objectr  r   r  r*  rH  rF  annot_xrefsr0  r  keysr  r7   r   r
  ru  r  rg   r   rU  )1rh  r  graftmapre  rf  rg  r  r  r  r  tarpdfsrcpdfacrory  tar_co
acro_graftacro_tartar_xrefacro_tar_indr8  	src_rangeparentsrZ  src_pager  wtyper  w_objr  r  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_graftr[  	w_obj_tarw_obj_tar_indr2  r|  r  r  s1                                                 @@@r)   _do_widgetsz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 ++FJ?H"//0BCK**8D>:F  **,H 11&(AFL%%e&7&7&?&AQRDhz2LAi15Ii1b9I  	A1vH '/&:&:&< "D%E222  
 --fd;""8C=1 )35(9%X$%$,$&,GK(	& LLN 		7D**648F 886JL--flCJ%j"5N(335O//KJ&&z2(7GDM*%(6GDM*%		7 s9~& 8	@A8a<(H 9Q<(H
 '/&:&:&< "D%E222 G 
  !66x@L ++L,<,<,>@RSJ%%j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 ((?=@58	@t 	&+OmH> % !'*Fr!(MN !s$   ) W
  W%
$W,,	X5XXc           	        t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }t        j                  |t	        d      t	        d            }t        j                  |      }t        |      }|S )Nr&  NamesEmbeddedFilesr   r   r  r  )r   r   r  r*  r  r  r  r  )r(   r2  rT  r  entryfilespecr  conts           r)   _embeddedFileGetzDocument._embeddedFileGet  s    t$##!!#& !)! ##E1S573&&uhtnhsmL##H-$r*   c                    | j                         }||v r|j                  |      }|S |t        t        |            v r|}|S t	        d| d      )Nr   z' not in EmbeddedFiles array.)embfile_namesrU  rF  r7   r   )r(   rC   	filenamesr2  s       r)   _embeddedFileIndexzDocument._embeddedFileIndex  sc    &&(	9//$'C
 
	 U3y>**C 
 q&CDEEr*   c           	     @   t        |       }t        |      }|j                  st        t              t        j                  t        j                  |      t        d      t        d      t        d      t        d            }t        j                  |      s|t        j                  t        j                  |      t        d            }	t        j                  |d      }t        j                  |	|t        d      t        d      t        d             t        |||||d      }
t        j                  t        j                  |
t        d      t        d                  }t        j                  |t        j                   |             t        j                  ||
       |S )Nr&  r  r     r   r  r  )r   r"  r   r  r#  r   r  r*  r  r  r  rE  r  JM_embed_filer   r  r~  )r(   r   r(  rf   r  r  rT  rz  r  r8  	fileentryr  s               r)   _embfile_addzDocument._embfile_add  sH   t$!'*^,,##!!#& !)! !!%(%%e&7&7&<hv>NOD''Q/EW%_-W% "#tXy$J	##Ix~x}M 	UE$=$=d$CDUI.r*   c           	        t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  ||dz          t        j
                  ||       y )Nr&  r  r  r   )r   r   r  r*  r  r  )r(   r2  rT  r  s       r)   _embfile_delzDocument._embfile_del7  sp    t$##!!#& !)! 	ucAg.uc*r*   c           	     `   t        |       }d}d}t        j                  |      }t        j                  |t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }t        j                  |t	        d            }	|	j                  rt        j                  |	      }||d<   t        j                  t        j                  |t	        d	                  }
t        |
      |t        <   t        j                  t        j                  |t	        d
                  }
t        |
      |t        <   t        j                  t        j                  |t	        d                  }
t        |
      |t        <   d}d}t        j                  |t	        d      t	        d	            }t        j                  |      }t        j                  |t	        d            }|j                  rt        j                  |      }t        j                  |t	        d            }|j                  rt        j                  |      }nJt        j                  |t	        d      t	        d            }|j                  rt        j                  |      }||t         <   ||t"        <   |S )Nr   r&  r  r  r   r   CI
collectionr  r  r  r  r  r  r  r  r  )r   r   r*  r  r  r  r  r   r   r   r  r  dictkey_ufilenamer   r  r  r  r  )r(   r2  infodictrT  r  ci_xreftrailerr  r  cir   len_r  r  s                 r)   _embfile_infozDocument._embfile_infoC  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           	        t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  |      rkt        j                  |      }t        d|d      D ]E  }t        t        j                  t        j                  ||                  }|j                  |       G yy)z Get list of embedded file names.r&  r  r  r   r   N)r   r   r  r*  r  r  r  rF  r  r   r  rk   )r(   rt  rT  r  rE   rZ  r  s          r)   _embfile_nameszDocument._embfile_namesr  s    t$##!!#& !)! e$##E*A1a^ %)00!//q9
 $% %r*   c           	        t        |       }d}t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }	t        j                  |	t	        d      t	        d            }
|
j                  st        d	t               t        |      }|r'|j                  r|j                  st        t              |j                  r|r|j                  rt        ||
|d       t        j                  |      \  }}t        j                  |      }t        j                  |
t	        d
      |       t        j                   |
|t	        d      t	        d             t        j"                  |
      }|r t        j$                  |	t	        d      |       |r t        j$                  |	t	        d      |       |r t        j$                  |	t	        d      |       |S )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  rH  r  r   r|  )r(   r2  r(  rf   r  r  rT  r  r  r  r  r  r7   r  r  s                  r)   _embfile_updzDocument._embfile_upd  s   t$##!!#& !)! ##E1S573&&uhtnhsmL""-/CD )w))#..^,,>>g'*<*<S(C3,,S1FC!!#&Ax$;!Xh-?&AQR)**5(3-J**5(4.)L**5(62BDIr*   c           	        | j                   rt        d      t        r t        j                  | j
                  |      S t        |       }d}d}d}d}t        j                  t        j                  |      t        d            }|j                  syt        j                  |t        d            }|j                  syt        j                  |t        d	            }	|	j                  syg }
t        |	|
      }
t        |
      }t        |      }|sy||k7  rt        d
      t        |      D ]  }t!        |
|         }||   }|d   }t#        |t$              st        d      |
|   |t&        <   t        j(                  ||      }t        j*                  t        j                  |t        d                  }|dk(  rd||<   n|dk(  rd||<   n|dk(  r
d||<   d||<   t        j*                  t        j                  |t        d                  }|dk  rd||<   n
|dkD  rd||<   t        j                  |t        d            }t        j,                  |      rt        j.                  |      dk(  rt        j0                  t        j2                  |d            t        j0                  t        j2                  |d            t        j0                  t        j2                  |d            f}||t4        <   d}t        j                  |t        d            }|j                  rt        j,                  |      s)t        j6                  |t        d      t        d            }t        j,                  |      rAt        j.                  |      dk(  r)t        j0                  t        j2                  |d            }t9        |      ||<   ||d<   |||<    y)z4Add color info to all items of an extended TOC list.r   rN  rI  r]  collapser&  Nr5  r6  z$internal error finding outline xrefsr   zneed non-simple TOC formatr  r   Tr   Countr   Fr  DestADr   rG  )r   r   r  r   Document_extend_toc_itemsr   r   r   r  r*  r  r   r7  r7   r  rF  r4   r>   r5   r   r  r  r  r  r  r  dictkey_colorr  rk  )r(   rB   rT  rN  rI  r]  r  r8  r;  r<  r:  rE   r{  rZ  r  rC   itemdictbmr  countrY  r  zr
  s                           r)   _extend_toc_itemszDocument._extend_toc_items  sH   >>.//22DIIuEEt$!!%"3"3C"8(6:JK##D(:*>?  ""68G+<= .JJ6DEE q %	AuQx=D8DAwHh- ">??%*1XH\"&&sD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E!HK%	r*   c                R    t        |      }|| j                  v r| j                  |= yy)z&Remove a page from document page dict.N)r5  r  )r(   r   pids      r)   _forget_pagezDocument._forget_page  s(    h$//!$ "r*   c                j   t        |       }|}|dk  rd}|dk\  r3t        j                  |      \  }	}
}t        j                  d |	|
|d      }ntt        j                  |      \  }	}
|	rt        j                  ||	|
dd      }n@t        ||      }|j                  st        d|dd      t        j                  d ||d      }g }t        |      D ]b  }t        j                  ||      }t        j                  ||d      }|dk\  r|}|dkD  r|j                  ||f       P|j                  |df       d |S )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   rg   fz_new_font_from_bufferrF  fz_encode_characterfz_advance_glyphrk   )r(   r  bfnameextorderinglimitr2  rT  mylimitrz  r  rU  rT  r  wlistrZ  glyphadvs                     r)   _get_char_widthszDocument._get_char_widths  s:   t$S=Gq= % 8 8 BD$00tT5!LD44V<JD$44VT4AN'T2~~#mD8;L$MNN44T3QGw 	,A--dA6E((ua8C1}qyucl+ucl+	, r*   c           	        t        |       }g }t        j                  d      }t        j                  t        j                  |      t        d      |      }|j                  s|S t        j                  t        j                  |t        d                  }|j                  rt        ||       |S t        j                  t        j                  |t        d      t        d                  }|j                  rt        ||       |S t        j                  t        j                  |t        d                  }|j                  rt        j                  |      s|S t        j                  |      }t        |      D ]T  }t        j                  t        j                  t        j                  ||      t        d                  }t        ||       V |S )N
PageLabelsr&  Numsrx  )r   r   r+  r  r*  r  r   pdf_resolve_indirectr  JM_get_page_labelsr  r  rF  r  )	r(   rT  r   
pagelabelsr
  numsrz  rE   rZ  s	            r)   _get_page_labelszDocument._get_page_labels  sq   t$''5
!!5#4#4S#98F;KZX~~I))5+=+=sHVDT+UV??r4(I))5+>+>sHVDTV^_eVf+gh??r4(I))5+=+=sHVDT+UVe&8&8&>I%q 	)A--&&++D!4 (D r4(	) 	r*   c                    	 t        j                  | j                  |      S # t        $ r t        dkD  r
t                Y yw xY w)zGet metadata.r   r\   )r   fz_lookup_metadata2r   rg   r  rv   r  s     r)   _getMetadatazDocument._getMetadata5  s=    	,,dii== 	#a'N,<	s   " A Ac                j   | j                   s| j                  rt        d      t        |       }t	        j
                  t	        j                  |      t        d            }t	        j
                  |t        d            }|j                  st	        j                  |d      }t	        j                  |t        d      t        d             t	        j                  ||      }t	        j                  |t        d      |       t	        j
                  |t        d            }t	        j                  |      S )z/Get xref of Outline Root, create it if missing.r$  r&  r5  rG  Type)r   r  r   r   r   r  r*  r  r   rM  rH  r  r   )r(   rT  r8  r;  ind_objs        r)   _getOLRootNumberz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                   t        | d      }|j                  syg }t        j                  t        j                  |      t        d            }|j                  rvt        j                  |      }t        |      D ]S  }t        j                  ||      }t        j                  |      }t        j                  |      }|j                  |       U |S )zGet PDF file id.r   r%  NID)r   r   r   r  r*  r  r  rF  r  r   binasciihexlifyrk   )	r(   rT  idlistidentityrE   rZ  r  r   hex_s	            r)   _getPDFfileidzDocument._getPDFfileidN  s    ta0~~%%e&7&7&<htnM##H-A1X $''!4//2''-d#	$
 r*   c                   | j                   s| j                  rt        d      | j                  }t	        |t
        j                        rt        j                  |      nt        j                  |      }|}|dk  r||z  }|dk  r||k\  rt        t              t        |       }t        j                  ||      }t        j                  |t
        j                        }g }	g }
|j                  rt        |||	|d|
       |	S )z,List fonts, images, XObjects used on a page.r$  r   )r   r  r   r   r>   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(   r  whatr%  	pageCountrE   rT  pagerefrsrclistetracers              r)   _getPageInfozDocument._getPageInfo^  s    >>T..;<<ii2<S%BSBS2TE))#.Z_ZnZnorZs	!eNA !e	>n--t$++C3--gu7T7TU??c4a@r*   c                j    t        |       }|s|st        t              t        |d||dddddd
      }|S )z;
        Utility: insert font from file or binary.
        Nr   r  )r   r   MSG_FILE_OR_BUFFERJM_insert_font)r(   fontfile
fontbufferrT  r   s        r)   _insert_fontzDocument._insert_fontr  s@     t$
011sD(J1aArRr*   c                    | j                   }t        |t        j                        sJ 	 t        j                  |      }t        |      S # t
        $ r t        dkD  r
t                Y yw xY w)zLoad first outline.r   N)	r   r>   r   r   fz_load_outlinerg   r  rv   Outline)r(   r%  r  s      r)   _loadOutlinezDocument._loadOutline|  sc    ii3 0 0111	&&,B |  	#a'N,<	s   A
 
A)(A)c                >    | j                   rt        d      J d       )z)Make an array page number -> page object.r   z_make_page_map() is no-op)r   r   r.   s    r)   _make_page_mapzDocument._make_page_map  s     >>.//.-.qr*   c                   t        |       }d}t        ||      \  }}}	t        j                  |t	        d            }
t        ||      \  }}}t        j                  |t	        d            }|r|}n|dz   }t        j
                  |
|      }|s%|dk7  r t        j                  |t	        d      |       t        j                  |||       |dk7  r|}|j                  rnt        j                  |t	        d            }t        j                  |t	        d      |dz          t        j                  |t	        d            }|j                  rn|sHt        j                  |
|	       |}|j                  r#t        j                  |t	        d            }t        j                  |t	        d      |dz
         t        j                  |t	        d            }|j                  rnn|r}|}|j                  rt        j                  |t	        d            }t        j                  |t	        d      |dz          t        j                  |t	        d            }|j                  rnn5|	|k  rt        j                  |
|	       nt        j                  |
|	dz          |j                  j                  rt        j                  |j                         | j                          y)z"Move or copy a PDF page reference.r   rx  r   r  r  N)r   pdf_lookup_page_locr   r  r  ry  rH  pdf_array_insertr   pdf_dict_get_intrC  r  rB  rC  _reset_page_refs)r(   r  nbbeforecopyrT  samepage1parent1i1r  page2parent2i2r  posr   r  s                     r)   _move_copy_pagezDocument._move_copy_page  s_   t$ 1#s;w""GXf-=>0#r:w""GXf-=>Cq&C . 	x'97Cuc219F##..8IJ&&0A519M++VXh5GH ## &&r2 ''!22FHW<MNE**FHW4EuqyQ"//(9KLF ''
  ''!22FHW<MNE**FHW4EuqyQ"//(9KLF ''
 8**E26**E26:>>&&''8r*   c                ,   | j                   s| j                  rt        d      t        r#t	        j
                  | j                  |||       nt        |       }t        j                  t        j                  j                        }||_        ||_        t        j                         }|dk  rt        t              t        j                  |d      }t        j                   ||d||      }t        j"                  |||       | j%                          | |   S )zMake a new PDF page.r$  r  r   r   )r   r  r   r  r   _newPager   r   r   rc  
Fixed_UNITr  r  FzBufferr1  pdf_add_new_dictpdf_add_pagepdf_insert_pagerM  )	r(   r  rY  r  rT  mediaboxcontentsr\  page_objs	            r)   r[  zDocument._newPage  s    >>T..;<<NNDIIsE6:"4(C||ELL$;$;<HHK HK~~'HRx .11 ..sA6I))3!YQH!!3X6 	Cyr*   c                2    t        |       }t        ||       y r,   )r   _remove_dest_range)r(   numbersrT  s      r)   _remove_links_tozDocument._remove_links_to  s    t$3(r*   c                |   t        |       }t        j                  ||d      }t        j                  |t	        d             t        j                  |t	        d             t        j
                  |d      }t        d      D ]  }t        j                  |d        t        j                  |t	        d      |       y )Nr   r  r  r   皙?r  )	r   r   r  r;  r  rE  rF  rG  rH  )r(   r  rT  rC   r  rZ  s         r)   r1  zDocument._remove_toc_item  s    t$%%c43D(6"23D(3-0##S!,q 	3A%%uc2	3D(3-7r*   c                    t        | dd      ry| j                  j                         D cg c]  }| }}|D ]  }|s|j                          d} | j                  j	                          yc c}w )z,Invalidate all pages in document dictionary.r   TN)r   r  r	  r   clear)r(   r  pagesr   s       r)   rM  zDocument._reset_page_refs  sh    4d+ OO2245q55 	D	 	 6s   	A-c                   t        |       }t        j                  d      }t        j                  t        j                  |      t        d            }t        j                  ||       t        j                  |t        j                  |d      |t        d             | j                         }| j                  |d      }|j                  dd| d	      }| j                  ||       y )
Nr  r&  r   r  T
compressedz/Nums[]z/Nums[ri  )r   r   r+  r  r*  r  r;  r  rE  pdf_catalogxref_objectr  update_object)r(   labelsrT  r  r8  r  r   s          r)   _set_page_labelsz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                z   t        |       }t        j                  ||d      }|r t        j                  |t	        d      |       |rKt        j
                  |t	        d             t        ||      }	t        j                  |t	        d      |	       t        j                  |t	        d      |       |rbt        j                  |d      }
t        d      D ]  }||   }t        j                  |
|        t        j                  |t	        d      |
       n!|t        j
                  |t	        d             |t        j                  |t	        d	            j                  rYt        j                  |t	        d	            }|dk  r|d
u s	|dkD  r+|du r&|dz  }t        j                  |t	        d	      |       yyyyy)zB
        "update" bookmark by letting it point to nowhere
        r   Titler  r  r  r   r  Nr  FTr  )r   r   r  r|  r  r;  r,  rH  rC  rE  rF  rG  r  r   rL  )r(   r  actionru  r  r  r  rT  rC   r
  r  rZ  r  s                r)   _update_toc_itemzDocument._update_toc_item  s    t$%%sD!4**D(72CUKhv&67%sF3ChsmS9hsmU;##S!,A1X 1!H))1a01 hsmQ7hsm4!!4'):;FF**D(72CDEh%/QUx4?ORA**D(72CQG @PU G  r*   c           	         t        | d      }|j                  syt        j                  t        j                  |      t        d      t        d      t        d      t        d            }t               }|j                  r}t        j                  |      rht        j                  |      }t        |      D ]E  }t        j                  ||      }|j                  t        t        j                  |                   G |S )z&Get list of field font resource names.r   r%  Nr&  r'  r(  r)  )r   r   r   r  r*  r  r   ru  rv  rF  rx  rk   r   rt  )r(   rT  r-  r:  rE   rZ  r  s          r)   	FormFontszDocument.FormFonts  s     ta0~~##!!#& $   1 1% 8""5)A1X F**5!4.u/@/@/CDEF r*   c                t    t        |       }t        ||||       t        j                  |j                         y)zAdd a new OC layer.N)r   JM_add_layer_configr   ll_pdf_read_ocgr   )r(   r   creatoronrT  s        r)   	add_layerzDocument.add_layer4  s,    t$S$4s~~.r*   r   c                   d}t        |       }t        j                  |d      }t        j                  |t	        d      t	        d             t        j
                  |t	        d      |       t        j                  |t	        d      d      }	|s t        j                  |	t	        d             nSt        |t              sJ d	t        |      d
t               t        j                  |	t        j                  |             t        j                  |t	        d      d      }
t        j                  d      }t        j                  |
|d      }t        j
                  |t	        d      d       |r!t        j                  |t	        d      |       n t        j                  |t	        d      d       t        j                  ||      }t        |      }t        j                   |t	        d            }t        j                  ||       |dkD  rtt        j                   |t	        d            }t        j"                  |      st%        t&              t        j(                  ||      }|j*                  s.t%        t&              t        j                   |t	        d            }t        j                   |t	        d            }|j*                  s t        j                  |t	        d      d      }t        j                  ||       |rLt        j                   |t	        d            }|j*                  slt        j                  |t	        d      d      }nKt        j                   |t	        d            }|j*                  s t        j                  |t	        d      d      }t        j                  ||       t        j,                  |j*                         t        j.                  |      }|S )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^  rH  r  r|  r  r  r>   r  r   r+  rL  rO  r  JM_ensure_ocpropertiesr  r  r   MSG_BAD_OC_CONFIGr  r   r}  r   )r(   r   configr  intentusager  rT  ocgintentsuse_forci_namecre_infoindocgocpr
  cfgs                    r)   add_ocgzDocument.add_ocg:  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**7GQ?&&x)1DiP##Hhy.A5I##Hhy.A9M%%c3/ %S)  hv&67S&)B;$$S(9*=>C%%c* "344%%c6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                    | j                   rt        d      t        j                  | j                  |      }|r%d| _        d| _        | j                          d| _        |S )zDecrypt document.r   FT)r   r   r   fz_authenticate_passwordr   r  r  r   )r(   passwordr  s      r)   authenticatezDocument.authenticate  sS    >>.//,,TYYA %D %DMMODL
r*   c                `    t        | d      }|j                  syt        j                  |      S )z-Check whether incremental saves are possible.r   r%  F)r   r   r   pdf_can_be_saved_incrementallyr(   rT  s     r)   can_save_incrementallyzDocument.can_save_incrementally  s)    ta0~~33C88r*   T)r  widgetsc               l    t        |       }t        j                  |t        |      t        |             y)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_documentr4   )r(   r  r  rT  s       r)   bakezDocument.bake  s(     t$S[#g,?r*   c                n    | j                   rt        d      t        j                  | j                        S )zNumber of chapters.r   )r   r   r   fz_count_chaptersr   r.   s    r)   r  zDocument.chapter_count  s,     >>.//&&		22r*   c                    | j                   rt        d      t        j                  | j                        }|dk  s||k\  rt        d      t        j
                  | j                  |      }|S )zPage count of chapter.r   r   zbad chapter number)r   r   r   r  r   fz_count_chapter_pages)r(   r  chaptersrl  s       r)   r  zDocument.chapter_page_count  s^    >>.//**DII6Q;'X-233,,diiAr*   c                    t        | dd      rt        d      t        | d      r| j                  rd| _        | j	                          d| _        i | _        d| _        y)zClose document.r   Tr   _outlineN)r   r   r;   r  rM  r   r  r   r.   s    r)   r  zDocument.close  sV    4d+.//4$ DM ! 	r*   c                   | j                   s| j                  rt        d      | j                  }|}|}t	        j
                  |      }|dk  rd}||dz
  kD  r|dz
  }|dk  r|dz
  }||dz
  kD  r|dz
  }t        t              }t        ||||      }	t        t              }
t        ||
      D ]  }t        t        |            |	S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r$  r   r   )r   r  r   r   r   r0  r7   JM_mupdf_warnings_storeJM_convert_to_pdfrF  rr   )r(   re  rf  rS  fz_docrr  r  srcCountlen0r%  len1rZ  s               r)   r  zDocument.convert_to_pdf  s    >>T..;<<''/6B1AB6AB1AB*+B7*+tT" 	5A.q124	5
r*   c                    | j                   rt        d      t        |       }|t        |      vs|t        d|      vrt        d      d}d}|dk(  r|dz
  }d}| j	                  ||||      S )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   r7   rF  rY  r(   r  rM  r  rO  rP  s         r)   	copy_pagezDocument.copy_page  s~     >>.//Y
5,,U2z221228aBF##CVT::r*   c                   | j                   s| j                  rt        d      t        |       }t	        j
                  t	        j                  |      t        d            }|j                  r t	        j                  |t        d             yy)zDelete XML metadata.r$  r&  MetadataN)
r   r  r   r   r   r  r*  r  r   r;  )r(   rT  r8  s      r)   del_xml_metadatazDocument.del_xml_metadata  sj    >>T..;<<t$!!5#4#4c#:HV<LM??hz&:; r*   c                $    | j                  |      S )z% Delete one page from a PDF.
        )r  )r(   r  s     r)   r  zDocument.delete_page  s       %%r*   c                J   | j                   st        d      | j                  rt        d      | j                  }dx}}|r|rt        d      |j	                  dd      }|j	                  dd      }|dk  r||z  }|dk  r|dk  r||z  }|dk  r||cxk  r|k  st        d       t        d      t        t        ||d	z               }nt        |      d
kD  s|g k(  rt        d      t        |      d
k(  rv|\  }}t        |      t        u rt        |      t        u st        d      ||kD  r||}}||cxk  r|k  st        d       t        d      t        t        ||d	z               }n:t        |d   t              r|d   }|dk  r||z  }|dk  r|f}nt        |d         }t        t        t        t        |                  }|g k(  rt        d       y|j                          |d   dk  s|d   |k\  rt        d      t!        |      }| j#                         }	t%        | j'                               D ]$  \  }
}|	|
   d
   d	z
  |v s| j)                  |       & | j+                  |       t-        |      D ]  }
| j/                  |
        | j1                          y)a6  Delete pages from a PDF.

        Args:
            Either keywords 'from_page'/'to_page', or two integers to
            specify the first/last page to delete.
            Or a list/tuple/range object, which can contain arbitrary
            page numbers.
            Or a single integer page number.
        r  r   r  z*cannot mix keyword and positional argumentre  rf  r   r  r   r   z need 1 or 2 positional argumentszboth arguments must be intznothing to deleteN)r  r   r   r  r8   r   rF  r7   r   r4   r>   r   r  setrr   sort	frozensetget_tocr  r0  r1  rg  reversedrD  rM  )r(   r  kwr  r  rA  rf  r  frozen_numberstocrZ  r  s               r)   r  zDocument.delete_pages  s    {{[))>>.//__

A !MNN{B'Ay"%Aa%Z a%a%Z a%&J& !566 ' !566E!QUO,G4y1}
 !CDD4yA~1Q347c>$%ABBq5aqAA*
*$%9:: +$%9::aQ0DGS)1gAg:%C Ag&Q.s3G-.b='(1:>WR[J6122"7+lln !7!7!9: 	,GAt1vay1}.%%d+	, 	n-'" 	!Aa 	! 	r*   c                :   | j                         }||v rt        d| d      ||}||}||}| j                  |||||      }t               }| j	                  |dd       | j	                  |dt        |             | j	                  |dt        |             |S )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.r(  rf   r  r  r#  z/EmbeddedFileParams/CreationDateParams/ModDate)r  r   r  get_pdf_nowrj  rW  )	r(   r   r(  rf   r  r  r  r  dates	            r)   embfile_addzDocument.embfile_addK  s      &&(	9vdV+<=>>H I<D  !# !  }$8$ 5{47HI$ 0+d2CDr*   c                4    t        | j                               S )zGet number of EmbeddedFiles.)r7   r  r.   s    r)   embfile_countzDocument.embfile_countq  s    4%%'((r*   c                F    | j                  |      }| j                  |      S )aT  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(   rC   r2  s      r)   embfile_delzDocument.embfile_delu  s%     %%d+  %%r*   c                F    | j                  |      }| j                  |      S )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_getzDocument.embfile_get  s%     %%d+$$S))r*   c                   | j                  |      }d| j                         |   i}| j                  ||      }| j                  |d      \  }}|dk7  r||d<   | j                  |d      \  }}|dk7  r||d<   | j                  |d      \  }}|dk7  r4t	        j
                  |j                               j                         |d<   |S )	zGet information of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            Information dictionary.
        r   r  r  rv  r  rw  zParams/CheckSumchecksum)r  r  r  xref_get_keyr(  r)  r  decode)r(   rC   r2  r  r  rA  r  md5s           r)   embfile_infozDocument.embfile_info  s     %%d+D..056!!#x0##D*?@4;'+H^$##D*:;4;"&HY""4):;3;#+#3#3CJJL#A#H#H#JHZ r*   c                ,    g }| j                  |       |S )z#Get list of names of EmbeddedFiles.)r  )r(   r  s     r)   r  zDocument.embfile_names  s    	I&r*   c                    | j                  |      }| j                  |||||      }t               }| j                  |dt	        |             |S )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  rj  rW  )	r(   rC   r(  rf   r  r  r2  r  r  s	            r)   embfile_updzDocument.embfile_upd  s^    & %%d+  !# !  }$ 0+d2CDr*   c           
        t        |       }t        j                  ||      }t        j                  |t	        d            }t        j                  |t	        d            }t        j
                  |t	        d            r\t        j                  |      j                  d      s7t        j                  |t	        d            }|j                  rt        j                  |      r t        j                  |t	        d            }	n|}	t        ||      }
|
dk7  r|st        ||      }t        |      }nd}|sIt        t        j                  |	            t        |
      t        t        j                  |            |f}|S t        t        t        j                  |	            t         t        |
      t"        t        t        j                  |            t$        |i}|S |sd	}|S t        d
t         d
t"        d
t$        di}|S )zD
        Get a font by xref. Returns a tuple or dictionary.
        r#  r  r)  CIDFontTypeBaseFontr  n/ar*   )r\   r\   r\   r*   r\   )r   r   r  r  r  pdf_name_eqrt  r3   r   pdf_is_nullJM_get_fontextensionr
  r  r  r   r  dictkey_extdictkey_typer  )r(   r  	info_onlynamedrT  r
  rU  subtypebasefontbnamer  r(  bytes_r   s                 r)   extract_fontzDocument.extract_font  s   
 t$##C.""3(89$$S(9*=>eXf%56))73>>}M))#x
/CDH&&%*;*;H*E**30@A &sD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                   | j                   s| j                  rt        d      t        |       }t	        |dt        j                  |      dz
        st        t              t        j                  ||d      }t        j                  |t        d            }t        j                  |t        d            st        d      t        j                  |t        d      t        d            }|j                  rt        j                  |      }nd}t        j                  ||      }t!               }t#        ||       ||t$        <   t        j&                  |j)                               |t*        <   |S )	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_imager5   _make_image_dictdictkey_smaskr  r  dictkey_cs_name)	r(   r  rT  r
  r  r  smaskr  r   s	            r)   extract_imagez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b!!=#66s~~7GH?	r*   Fc                L    | j                  |||||||||	|
||||||||||      S )z8
        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(   rf   r  r  r  r  r   r  r  r  r  r  r  r  r  r  r	  r
  r  r  r  s                        r)   ez_savezDocument.ez_save  sV    4 yy-+'%'!#"3'#5 /)   	r*   c                    | j                   s| j                  rt        d      t        j                  | j
                  |      }|j                  |j                  fS )z-Find new location after layouting a document.r$  )r   r  r   r   fz_lookup_bookmark2r   r  r   )r(   r  locations      r)   find_bookmarkzDocument.find_bookmarkJ  sH    >>T..;<<,,dii<..r*   c                   t        |       }t        j                  |      }	 t        |d|dz
        rt        |d|dz
        st	        t
              t        j                  t        j                  ||            }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }t        j                  ||      }	t        |      D ]8  }
t        j                  ||
      }t        j                  |t        d            }t        j                   |t        d            rYt        j"                  |d      j                  rzt        j                  t        j                  |            }t        j$                  |      }t        j&                  |||       t        j(                  ||d      }t        j*                  |t        d             t        j*                  |t        d             t        j,                  |	|       ; t        j.                  |t        d      |	       t1        |      }|rw|j                  rkt        j2                  |t        j4                  d	      t        j6                         d      }t9        |||d       t        j.                  |t        d
      |       t        j$                  |      }t        j&                  |||       t        j(                  ||d      }t        j:                  |||       t        j<                  |j                         | j?                          y# t        j<                  |j                         w xY w)zMake a full page duplicate.r   r   r  r  r  r  r  r      r  N) r   r   r/  r  r   r1  r  r2  r  r  r  r   r  rE  rF  r  r  r   pdf_create_objectpdf_update_objectr  r;  r  rH  JM_read_contentspdf_add_streamr  PdfObjr$  r`  rC  rM  )r(   r  rM  rT  r  rR  rU  
old_annotsrE   
new_annotsrZ  r  r  copy_or  r  rb  s                    r)   fullcopy_pagezDocument.fullcopy_pageQ  s   t$**C0
0	9S!Z!^4#BJN; .11..0I0I3PS0TUE++U3E++UHX4FGJ $$''4"00#q9
q >A++Z;A#00!Xi5HIG(('8G3DE **Au5@@ "44e6P6PRS6TUF 22C8D++S$?"33S$BF&&0AB&&>((*f=> ""E8H+=zJ #E*C s~~ //e6Z6Z\`6achcococqstu #xa8""E8J+?J **C0D##S$6**Cq9E!!3E2''8 ''8s   L	M !M<c                   t        | |      }||%t        j                  | |      \  }}}}	}
||||	|
d}n|d   }|d   }|d   }|d   }|d   }|dk(  rt        d	      |d
v rd}nd}|dv rd}n|dv rd}n|dv rd}n	|dv rd}nd}||d<   |dk(  rt        }n|dk(  rt
        }nd}||d<   ||d<   ||g}| j                  j                  |       n|d   }|d   }|d   }|d   }|d}nt        |      }t        d|      }||k  r|S |dk  r | j                  ||d   |d   |d   ||      }nd}||d<   ||d<   t        | |       |S )a  Get list of glyph information of a font.

        Notes:
            Must be provided by its XREF number. If we already dealt with the
            font, it will be recorded in doc.FontInfos. Otherwise we insert an
            entry there.
            Finally we return the glyphs for the font. This is a list of
            (glyph, width) where glyph is an integer controlling the char
            appearance, and width is a float controlling the char's spacing:
            width * fontsize is the actual space.
            For 'simple' fonts, glyph == ord(char) will usually be true.
            Exceptions are 'Symbol' and 'ZapfDingbats'. We are providing data for these directly here.
        N)r   r   r  ascender	descenderr   r  r   r  simpler\   zxref is not a font)Type1MMType1TrueTypeTF)FangtiMingr   )HeitiSongr   )GothicMinchor   )DotumBatangr   r  ZapfDingbatsSymbolglyphsr  )CheckFontInfor  _get_font_propertiesr   zapf_glyphssymbol_glyphsr  rk   r7   r  r  UpdateFontInfo)r%  r  r  r2  fontdictfontinfor   r  stypeascdscr  r"  r0  oldlimitr  s                   r)   get_char_widthszDocument.get_char_widths  s   ( !d+-2-G-GT-R*c5#s ! #!$  'uo (#J/!(+by !566 88 ))**--,,!'HX~%$!&!'HX#+HZ h'HMM  *{Hh'Fh'F
+H>H6{Hc5/hMa<))hv&*9MwX[F F#sH%r*   c                   t        |       }t        j                  t        j                  |      t	        d      t	        d            }|j
                  sy|dk(  r t        j                  |t	        d            }n3t        j                  t        j                  |t	        d            |      }|j
                  st        t              t        |      }|S )z,Content of ON, OFF, RBGroups of an OC layer.r&  OCPropertiesNr  r  r  )r   r   r  r*  r  r   r  r  r   r  JM_get_ocg_arrays)r(   r  rT  r  r
  r   s         r)   	get_layerzDocument.get_layer  s    t$!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/00$	r*   c                   t        |       }t        j                  |      }|dk(  r]t        j                  t        j                  |      t        d      t        d      t        d            }t        j                  |      sd}g }t        j                         }t        |      D ]D  }t        j                  |||       ||j                  |j                  d}|j                  |       F |S )zShow optional OC layers.r   r&  r>  r  r   )numberr   r~  )r   r   pdf_count_layer_configsr  r*  r  r  PdfLayerConfigrF  pdf_layer_config_infor   r~  rk   )r(   rT  rE   r
  r   r  rZ  rC   s           r)   
get_layerszDocument.get_layers  s    t$))3/6%%%%s+V$^,Y'	C %%s+##%q 	A''a6 II#||D
 IIt	 	r*   c                    | j                   s| j                  rt        d      t        |       }d}t	        |       t        j                  |      }|S )zMake new xref.r$  r   )r   r  r   r   ENSURE_OPERATIONr   r  )r(   rT  r  s      r)   get_new_xrefzDocument.get_new_xref  sI    >>T..;<<t$&&s+r*   c                   | j                   s| j                  rt        d      | j                  |d      \  }}|dk7  s|dvrt        d|       | j                  |d      \  }}|dk7  ryt	        |j                  d	d
            }|S )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 Rr\   )r   r  r   r  r4   r  )r%  r  rA  r   r  r   s         r)   r  zDocument.get_oc'  s     ==C,,:;;""434;$&997v>??  t,2;E2&'	r*   c           	        t        j                  d      }t        |       }t        j                  t        j                  t        j
                  |      t        d            t        d      t        d            }t               }t        j                  |      s|S t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      }t        j                  t        j                  |t        d                  }	t        j                  |t        d      |t        d            }
d}|
j                  rt        j                  |
      }t!               }t        j                  |t        d	            }|j                  rt        j"                  |      r%|j%                  t        j                  |             nt        j                  |      rut        j                  |      }t        |      D ]R  }t        j                  ||      }t        j"                  |      s/|j%                  t        j                  |             T t&        d
k\  r-t        j(                         }t        j*                  ||||      }n*t        j*                  |t        j,                         ||      }|	|| |d}|}|||<    |S )z&Show existing optional content groups.r  r&  r>  r  r  r  r  Nr  )r      r  )r   r  r  r  )r   r+  r   r  r  r*  r  r5   r  r  rF  r  r   r   r   rt  r   r  rk   mupdf_version_tuplePdfResourceStackpdf_is_ocg_hiddenr  )r(   r  rT  ocgsr   rE   rZ  r  r  r   r
  r  r  r  r{  r|  r  resource_stackhiddenrC   r}  s                        r)   get_ocgszDocument.get_ocgs8  sH   /t$""""E$5$5s$;Xf=MN( 
 V!!4(I&q 	A%%tQ/C##S)D++U-?-?hvFV-WXD%%sHW,=r8ICVWCE~~))3/fG''hx.@AF  $$f-NNE$5$5v$>?''0++V4A"1X C!//; ,,a0#NNE,=,=q,ABC #k1!&!7!7!900#~ucR00#u||~ucR %$*"	D DBI?	@ 	r*   c                l   |t        | j                               vrt        d      | j                  |d      }d|vrt        d      t	        |      }|j                  d      }|j                  d|      }|dk  s|dk  rd	}n?||d
z   | j                  dd      j                         }t        t        t        |            }|j                  d      }|dk  rd	}nD|j                  d|      }|dk  r|j                  d|      }|dk  rt        d      ||dz   |dz    }|j                  d      }|dk  rd	}ndx}	}
|}|	dk  s|	|
k7  r;|dz  }||k  st        d      ||   dk(  r|	dz  }	||   dk(  r|
dz  }
|	dk  r5|	|
k7  r;||dz   |dz    }|j                  dd      j                  dd      j                  dd      }|j                  dd      j                  dd      j                  dd       }dd	l}	 |j                  |      }||||d"S # t        $ r t                t        d!|        w xY w)#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 xrefTrn  
/Type/OCMDzbad object type/OCGs[ri  r   Nr  rP  r   /P/ry  r  zbad object at xrefr   r   z/VE[r   rh  z/Andz"and",z/Notz"not",z/Orz"or",z 0 R] 0 Rr   z][z],[zbad /VE key: )r  rV  policyve)rF  xref_lengthr   rq  r7   r   r  r6   r   r  r4   jsonloadsrg   rv   rr   )r%  r  r   textlenp0r  rV  r`  ra  lprprc  s               r)   get_ocmdzDocument.get_ocmdg  sd    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b1frAv.YYv6BKBBq&B"HaG|$%9::8s?!GB8s?!GB q&B"H b1frAv&B

68,*( 
 GS)11&#>FFtUSBZZ^
 dfBGG	   -v./s   8H #H3c                   g }t        | d      }|j                  s|S t        j                  t        j                  |      t        d            }|j                  s|S t        j                  |t        d            }|j                  s|S t        j                  |t        d            }|j                  s|S t        ||      }|S )z!Get list of outline xref numbers.r   r%  r&  r5  r6  )r   r   r   r  r*  r  r7  )r(   r:  rT  r8  r;  r<  s         r)   r0  zDocument.get_outline_xrefs  s    ta0~~L!!%"3"3C"8(6:JKL##D(:*>?  L""68G+<=L .r*   c                >   | j                   s| j                  rt        d      | j                  syt	        |      t
        ur	 |j                  }| j                  |d      }|s|D cg c]  }|dd 	 c}S |S # t        $ r t                t        d      w xY wc c}w )z1Retrieve a list of fonts used on a page.
        r$  r-   zneed a Page or page numberr   Nr  )
r   r  r   r  r   r4   rB  rg   rv   r<  r(   r  fullr  rF   s        r)   get_page_fontszDocument.get_page_fonts  s     >>T..;<<{{9C?jj Q'$'(qAcrF((
  ?  !=>>?
 )s   A8 'B8Bc                    | j                   s| j                  rt        d      | j                  sy| j	                  |d      }|s|D cg c]  }|dd 	 c}S |S c c}w )z2Retrieve a list of images used on a page.
        r$  r-   r   Nr  r   r  r   r  r<  rl  s        r)   get_page_imageszDocument.get_page_images  s_     >>T..;<<{{Q'$'(qAcrF((
 )s   	Ac                n    | j                         D cg c]  }t        j                  |       c}S c c}w )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(   rC   s     r)   get_page_labelszDocument.get_page_labels  s*     372G2G2IJ$%JJJs   2c                    g }|s|S | j                         }|g k(  r|S t        | j                        D ]4  }t        j                  ||      }||k(  s|j                  |       |s3 |S  |S )a"  Return 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  rF  r  r  get_label_pnork   )r%  labelonly_onerf  rs  rZ  plabels          r)   get_page_numberszDocument.get_page_numbers  sz     N%%'R<Ns~~& 	A((F3Fq!	 r*   r  r  r  r  r  r  c               V    |t         }|t        }| |   j                  ||||||      S )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
        r{  )Identityr  r  )r%  r  r  r  r  r  r  r  s           r)   get_page_pixmapzDocument.get_page_pixmap  sF    . >FJ3x""J #  	r*   c                2    | |   j                  ||||      S )a>  Extract a document page's text by page number.

        Notes:
            Convenience function calling page.get_text().
        Args:
            pno: page number
            option: (str) text, words, blocks, html, dict, json, rawdict, xhtml or xml.
        Returns:
            output from page.TextPage().
        )r  r  r  )r  )r%  r  optionr  r  textpager  s          r)   get_page_textzDocument.get_page_text!  s"    & 3x  d%d KKr*   c                    | j                   s| j                  rt        d      | j                  sy| j	                  |d      }|S )z4Retrieve a list of XObjects used on a page.
        r$  r-   r   rp  )r(   r  r  s      r)   get_page_xobjectszDocument.get_page_xobjects6  s@     >>T..;<<{{Q'
r*   c                   t        | d      }|j                  syt        j                  t        j                  |      t        d      t        d      t        d            }d}|j                  rt        j                  |      }|S )zGet the /SigFlags value.r   r%  r  r&  r'  SigFlags)r   r   r   r  r*  r  r  )r(   rT  sigflagssigflags       r)   get_sigflagszDocument.get_sigflags@  ss    ta0~~&&!!#& $$	 &&x0Gr*   c                      fd j                   rt        d       j                           j                  }|sg S d}g } |||      } j                  rs j                  |       |S )a  Create 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                H   | r| j                   j                  r| j                  r| j                  }nd}| j                  sR| j                  rC| j
                  dk(  r$j                  | j                        }|d   dz   }n| j
                  dz   }nd}nd}	s,t        j                  |       }|j                  ||||g       n|j                  |||g       | j                  r | j                  ||dz         }| j                  } | r| j                   j                  r|S )zPRecursively follow the outline item chain and record item information in a list.r   r  r   r   )r   r   ru  is_externalrR  r   resolve_linkr  getLinkDictrk   downr9  )
olItemr:  lvlru  resolver   linkr%  r  r"  s
          r)   r  z!Document.get_toc.<locals>.recurseY  s    V[[33<<"LLEE))zz!;;",&)&6&6vzz&BG#*1:>D#);;?D!D ,,VS9DLL#udD!9:LL#ud!34;;#FKKa@E5 V[[336 Lr*   r   r   )r   r   r  outliner  r  )r%  r"  r  r  r:  r  r  s   ``    @r)   r  zDocument.get_tocP  sl    	@ ==.//IfeS)::f!!#&
r*   c                   d}t        | d      }|j                  r<t        j                  t        j                  |      t        d      t        d            }|.|j                  r"t        j                  |      }t        |      }|S d}|S )zGet document XML metadata.Nr   r%  r&  r  r\   )r   r   r   r  r*  r  r  JM_UnicodeFromBuffer)r(   xmlrT  rK  r   s        r)   get_xml_metadatazDocument.get_xml_metadata  s    ta0>>%%%%c*V$Z(C
 ?s~~((-D%d+B 	 B	r*   c                    | j                   rt        d      | j                  st        d      t        | j                        D ]H  }| j                  |      D ]2  }|d   t        j                  k(  r|d   t        j                  k(  r1  y J y)z0Check whether there are annotations on any page.r   r  r   TF)	r   r   r  rF  r  page_annot_xrefsr   PDF_ANNOT_LINKr0  r%  rZ  rC   s      r)   
has_annotszDocument.has_annots  s    ==.//zz[))s~~& 	 A,,Q/  Q5#7#7747eF\F\;\ 	 
 r*   c                    | j                   rt        d      | j                  st        d      t        | j                        D ]1  }| j                  |      D ]  }|d   t        j                  k(  s  y 3 y)z*Check whether there are links on any page.r   r  r   TF)r   r   r  rF  r  r  r   r  r  s      r)   	has_linkszDocument.has_links  ss    ==.//zz[))s~~& 	 A,,Q/  7e222 	  r*   c                j   | j                   rt        d      | j                         | _        t	        dddddddd	d
dd
j                         D cg c]  \  }}|| j                  |      f c}}      | _        | j                  d      dk(  rd n| j                  d      | j                  d<   y c c}}w )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  ru  authorrx  keywordsr~  producerrv  rw  trappedr  None)r  r   rF  r  r5   rB   r!  r  )r(   r  rF   s      r)   r  zDocument.init_doc  s    KLL))+ &.$0%2&4'6&4'6+>&4&4= $eg58Qq4,,Q/0  /3.?.?.Mv.Ud[_[l[lmy[zl#s   B/
c
                   d}
t        |t              rD|j                  j                  dkD  rt        t        |      }t        d|j                               }
nt        |t
              r|}
nt        |      }
|
st        d      |
j                  s|
j                         }t        d|      }
| j                  |
||||||||		      S )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 parameterrT  )re  rf  rg  rS  rq  r  show_progressfinal)r>   r  r  rE   r  r   tobytesr   r  r  
insert_pdf)r(   infilere  rf  rg  rS  rq  r  r  r  r  pdfbytess               r)   insert_filezDocument.insert_file  s    " ff%  ""Q&v.5&.."23C)C6"C344zz))+H5(+C#!+  
 
	r*   r+  c	                t    | j                  |||      }	t        |      sy|	j                  d|||||      }
|
S )zCreate a new PDF page and insert some text.

        Notes:
            Function combining pymupdf.Document.new_page() and pymupdf.Page.insert_text().
            For parameter details see these methods.
        )r  rY  r  r   )2   r  )r   r   r@  r  )new_pager   r&  )r%  r  r   r   rY  r  r   r@  r  r   r   s              r)   insert_pagezDocument.insert_page  sP    " ||5|@Dz  
 	r*   )re  rf  rg  rS  rq  r  r  r  r  r  _gmapc                  | j                   s| j                  rt        d      | j                  |j                  k(  rt        d      |}|dk  r| j                  }| j                  }|j                  }|}|}|}t        |d      }t        ||dz
        }|dk  r|dz
  }t        ||dz
        }|dk  r|}t        ||      }t        |      |
cxkD  rdkD  ron nlt        j                  j                  |j                        }|sd}t        j                  j                  | j                        }|sd}t        d| d| d       |j                  }| j                  j                  |d	      }|t        |       }|| j                  |<   t         r*t#        | j$                  |j$                  |||||||
||       nXt'        |       }t'        |      }|j(                  r|j(                  st+        d
      t-        |       t/        |||||||||
|
       | j1                          |r| j3                  ||||       |r| j5                  ||||||	       |dk(  rd	| j                  |<   y	y	)a  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)re  rf  rg  )re  rf  rg  r  )r   r  r   r  r  r  minr7   rd   r
   basenamer   rr   r  r8   Graftmapr  extra_FzDocument_insert_pdfr   r   r   r  rH  JM_merge_rangerM  ru  r  )r(   docsrcre  rf  rg  rS  rq  r  r  r  r  r  r  rh  outCountr  rr  r  innameoutnameisrtpdfoutpdfsrcs                          r)   r  zDocument.insert_pdf  s\   L >>T..;<<>>V---FGG6B??$$  QZX\"6ABX\"6BXv;**WW%%fkk2F%gg&&tyy1G&k&y:; ""4.=TNE#(DNN4 'IIKK! &d+F%f-F$$F,=,=!=>>V$662r2vufm]bc 	NN6RbNIVUb"rcrsA:#'DNN4  r*   c                l    t        | d      }|j                  syt        j                  |      }|rdS dS )Nr   r%  FT)r   r   r   pdf_has_unsaved_changesr(   rT  r  s      r)   is_dirtyzDocument.is_dirty  s5    ta0~~))#.t#e#r*   c                `    t        | d      }|j                  rt        j                  |      S y)z9
        Check whether we have a linearized PDF.
        r   r%  F)r   r   r   pdf_doc_was_linearizedr  s     r)   is_fast_webaccesszDocument.is_fast_webaccess  s+    
 ta0>>//44r*   c                   t        | d      }|j                  syd}	 t        j                  t        j                  |      t        j
                  t        j                  t        j                        }t        j                  |      rt        j                  |      }|dk\  r|S y# t        $ r t        r
t                Y yw xY w)z Either False or PDF field count.r   r%  Fr  )r   r   r   r  r*  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr  r  rg   r  rv   )r(   rT  r  fieldss       r)   r  zDocument.is_form_pdf  s     ta0~~	((%%c*,,00..	F !!&)++F3 A:L  	#(8	s   A?B% %C Cc                    t        | j                  t        j                        ryt        j                  | j                  j
                        rd}|S d}|S )zCheck for PDF.TF)r>   r   r   r   ll_pdf_specificsr   r  s     r)   r  zDocument.is_pdf  sM     dii!2!23
 !!$))"6"67C 
 C
r*   c                l    | j                   rt        d      t        t        j                  |             S )z Check if document is layoutable.r   )r   r   r   r   r  r.   s    r)   is_reflowablezDocument.is_reflowable  s-     >>.//E33D9::r*   c                h    t        | d      }|j                  syt        j                  |      }|ryy)zCheck whether PDF was repaired.r   r%  FT)r   r   r   pdf_was_repairedr  s      r)   is_repairedzDocument.is_repaired  s3     ta0~~""3'r*   c                    | j                   s| j                  rt        d      d}d}t        |       }t	        j
                  |      }t	        j                  |      }t        |      t        |      dS )z(Show if undo and / or redo are possible.r$  r   )undoredo)r   r  r   r   r   pdf_can_undopdf_can_redor   )r(   r  r  rT  s       r)   journal_can_dozDocument.journal_can_do  sd    >>T..;<<t$!!#&!!#&T
DJ77r*   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  |       y)zActivate document journalling.r$  N)r   r  r   r   r   pdf_enable_journalr  s     r)   journal_enablezDocument.journal_enable  s5    >>T..;<<t$  %r*   c                    | j                   s| j                  rt        d      t        |       }|j                  xr |j                  j
                  }|S )z Check if journalling is enabled.r$  )r   r  r   r   r   journal)r(   rT  enableds      r)   journal_is_enabledzDocument.journal_is_enabled  sD    >>T..;<<t$..;S^^%;%;r*   c                h   | j                   s| j                  rt        d      t        |       }t	        |t
              rt        j                  ||       n6t        |      }t        j                  |      }t        j                  ||       |j                  j                  st        dt               yy)zLoad a journal from a file.r$  z!Journal and document do not matchN)r   r  r   r   r>   r  r   pdf_load_journalr"  rT  pdf_deserialise_journalr   r  r  r  )r(   rf   rT  r  stms        r)   journal_loadzDocument.journal_load  s    >>T..;<<t$h$""31$X.C&&s+C))#s3~~%%8:NO &r*   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  ||      }|S )z#Show operation name for given step.r$  )r   r  r   r   r   pdf_undoredo_step)r(   r  rT  r   s       r)   journal_op_namezDocument.journal_op_name  s>    >>T..;<<t$&&sD1r*   c                    | j                   s| j                  rt        d      d}t        |       }t	        j
                  |      \  }}||fS )zShow journalling state.r$  r   )r   r  r   r   r   pdf_undoredo_state)r(   stepsrT  r   s       r)   journal_positionzDocument.journal_position   sJ    >>T..;<<t$,,S1	E5yr*   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  |       y)zMove forward in the journal.r$  T)r   r  r   r   r   pdf_redor  s     r)   journal_redozDocument.journal_redo	  6    >>T..;<<t$sr*   c                   | j                   s| j                  rt        d      t        |       }t	        |t
              rt        j                  ||       yt        |      }t        j                  ||       |j                          y)zSave journal to a file.r$  N)r   r  r   r   r>   r  r   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)r(   rf   rT  outs       r)   journal_savezDocument.journal_save  sg    >>T..;<<t$h$""31'1C##C-!r*   c                    | j                   s| j                  rt        d      t        |       }|j                  j
                  st        d      |rt        j                  ||       yt        j                  |       y)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   rT  s      r)   journal_start_opzDocument.journal_start_op  sa    >>T..;<<t$~~%% 9::%%c40..s3r*   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  |       y)zEnd a journalling operation.r$  N)r   r  r   r   r   pdf_end_operationr  s     r)   journal_stop_opzDocument.journal_stop_op)  s5    >>T..;<<t$$r*   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  |       y)zMove backwards in the journal.r$  T)r   r  r   r   r   pdf_undor  s     r)   journal_undozDocument.journal_undo0  r  r*   c                    t        | d      }|j                  syt        j                  |      }|t        j                  k(  ryt        j
                  |      S )zDocument language.r   r%  N)r   r   r   pdf_document_languager$  r"  )r(   rT  r&  s      r)   r'  zDocument.language8  sL     ta0~~**3/5&&&22488r*   c                    | j                   rt        d      t        j                  | j                        }|j
                  |j                  fS )z Id (chapter, page) of last page.r   )r   r   r   fz_last_pager   r  r   )r(   last_locs     r)   last_locationzDocument.last_locationC  s@     >>.//%%dii0..r*   c                   t        |       }t        j                         }t        j                  |      }g }t	        |      D ]  }t        j
                  |||       |j                  dk(  rd}n|j                  dk(  rd}nd}||j                  |j                  ||j                  |j                  d}|j                  |        |S )z-Show OC visibility status modifiable by user.r   checkboxr   radioboxrw  )rB  r   depthr   r  locked)r   r   PdfLayerConfigUipdf_count_layer_config_uirF  pdf_layer_config_ui_infor   r   r  selectedr  rk   )r(   rT  r  rE   r   rZ  rU  rC   s           r)   layer_ui_configszDocument.layer_ui_configsK  s    t$%%'++S1q 	A**CD9yyA~"a" II!ZZ!--"kkD IIdO!	" 	r*   c                   | j                   s| j                  rt        d      | j                  }t	        j
                  |      sy|}|}t        |      }t	        j                  |      s2|j                  |j                  z
  }|j                  |j                  z
  }|dk  s|dk  rt        d      t	        j                  ||||       | j                          | j                          y)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  rM  r  )	r(   r   rY  r  r   r%  r   r  r  s	            r)   layoutzDocument.layoutd  s    >>T..;<<ii..4D!((+qttAqttA8qCxo..  #q!X6r*   c                (   | j                   s| j                  rt        d      |d}|| vrt        d      t        |      t        u r!|dk  r| j
                  }|dk  r||z  }|dk  rt        |t              r!t        j                  | j                  |      }n&|\  }}t        j                  | j                  ||      }t        ||       }d|_        | |_        || j                  t        |      <   t!        j"                         |_        ||_        |S )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   r4   r  r>   r   fz_load_pager   fz_load_chapter_pager   r   r   r  r5  r  r  r4  rB  )r(   page_idnpr   r  pagenumr  s          r)   r  zDocument.load_pagex  s     >>T..;<<?G$344=CGaKBA+2 A+gs#%%dii9D&GW--dii'JD4
#&3 !557

r*   c                B   | j                   rt        d      | j                  }t        j                  dd      }t        j
                  |      }|dk  r||z  }|dk  r||k\  rt        t              t        j                  ||      }|j                  |j                  fS )zConvert pno to (chapter, page).r   r  r   )
r   r   r   r   fz_make_locationr0  r1  fz_location_from_page_numberr  r   )r(   r  this_docr  r  s        r)   location_from_page_numberz"Document.location_from_page_number  s    >>.//99$$R,))(3
Ag:C Ag*n--003?{{CHH$$r*   c                    | j                   s| j                  rt        d      t        j                  | }t        j
                  | j                  j                  |j                               }|S )z.Make a page pointer before layouting document.r$  )	r   r  r   r   
FzLocationll_fz_make_bookmark2r   r   r  )r(   r  marks      r)   make_bookmarkzDocument.make_bookmark  sT    >>T..;<<$))499+?+?Pr*   c                   | j                         }|dk(  ry| j                  |d      }|d   dk(  ri S |d   dk(  r3t        |d   j                         d         }| j	                  |d      }n|d   d	k(  r|d   }nd}||dd
 dk(  r|dd dk(  si S dddd}|d
d j                  d      }|dd D ]!  }	 |j                         \  }}|dk(  sd||<   # |S # t
        $ r t        dkD  r
t                |cY c S w xY w)zReturn the PDF MarkInfo value.r   NMarkInfor  r  r   Trn  r5   r   <<r  >>FMarkedUserPropertiesSuspects/true)rp  r  r4   r6   rq  rg   r  rv   )r(   r  r   r  validrF   r  r   s           r)   markinfozDocument.markinfo  s8    !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
U !c
	"   '!+0@s   5CC:9C:c                    | j                   rt        d      t        |       }|t        |      vs|t        d|      vrt        d      d}d}|dk(  r|dz
  }d}| j	                  ||||      S )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_pagezDocument.move_page  s}     >>.//Y
uZ((BeB
6K,K1228aBF##CVT::r*   c                    | j                   S r,   r  r.   s    r)   r   zDocument.name  s    zzr*   c                   | j                   syt        |       }d}d}t        j                  t        j                  |      d      }t        j
                  ||      }t        j                  |      rt        j                  |      }|r&t        j                  ||t        j                         n%t        j                  ||t        j                         ||dk\  S |S )z"Get/set the NeedAppearances value.Nr  NeedAppearancesr  r   )r  r   r   r  r*  r   pdf_is_boolpdf_to_boolr}  PDF_TRUE	PDF_FALSE)r(   r   rT  oldvalappkeyformapps          r)   need_appearanceszDocument.need_appearances  s    t$"""!!#& !!$/S!&&s+Ffenn=feoo>=Q;r*   c                    | j                   rt        d      t        | j                  t        j
                        r| j                  n| j                  j                         }t	        j                  |      }|S )zIndicate password required.r   )r   r   r>   r   r   r   r   fz_needs_password)r(   r   rG   s      r)   r  zDocument.needs_pass  sU     >>.// *499e6F6F G499TYY__M^%%x0
r*   c                4    | j                  |||       | |   S )aX  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.
        rY  r  )r[  )r%  r  rY  r  s       r)   r  zDocument.new_page  s     	Sf53xr*   c                   | j                   s| j                  rt        d      t        |      t        u rd|f}|| vrt        d      t        |      | j                  k(  ryt        |       }|d   }t        |t              st        t        t               |}|d   }|}t        j                  ||      }t        j                  ||      }|j                  |j                   fS )z!Get (chapter, page) of next page.r$  r   page id not in documentr-   r   )r   r  r   r   r4   r   r  r   r>   r  MSG_BAD_PAGEIDPyExc_ValueErrorr   r  fz_next_pager  r   )r(   r  r  r  r  r  r  next_locs           r)   next_locationzDocument.next_location  s    >>T..;<<=C'lG$677>T///"4(qk#s#N$45qk$$Wc2%%x5..r*   c                   t         r t        j                  | j                  |      S t	        | j                  t
        j                        r,t        j                  | j                        }| j                  }n*t        j                  | j                        }t        |       }|dk  r||z  }|dk  r||kD  rt        t              t        j                  ||      }t        |      }|S r   )r  r   r  r   r>   r   r   r/  r0  r   r   r1  r2  JM_get_annot_xref_list)r(   rE   r  r  rc  r  s         r)   r  zDocument.page_annot_xrefs*  s    ))499a88dii!2!23..tyy9J99L--dii8J+D1L!eOA !ez>n--,,\1='1r*   c                "   | j                   rt        d      t        r| j                  |       S t	        | j
                  t        j                        rt        j                  | j
                        S t        j                  | j
                        S )zNumber of pages.r   )
r   r   r  r  r>   r   r   r   r0  r/  r.   s    r)   r  zDocument.page_count<  si     >>.//##D))tyy%"2"23''33(($))44r*   c                F   | j                   rt        d      | j                  }t        j                  |      }|}|dk  r||z  }|dk  rt        |       }||k\  rt        t              t        j                  ||      }t        |      }t        |      }t        |      }|S )z2Get CropBox of page number (without loading page).r   r   )r   r   r   r   r0  r   r1  r2  
JM_cropboxrb  r  )	r(   r  r  r  rE   rT  r8  cropboxr  s	            r)   page_cropboxzDocument.page_cropboxH  s    >>.//99))84
!eOA !et$
?n--++S!4W%g&3i
r*   c                    t        |      t        u r | j                  }|dk  r||z  }|dk  rd|f}|| vrt        d      |\  }}t	        j
                  ||      }t	        j                  | j                  |      }|S )z&Convert (chapter, pno) to page number.r   rD  )r   r4   r  r   r   r  fz_page_number_from_locationr   )r(   r  r  r  r  r  page_ns          r)   page_number_from_locationz"Document.page_number_from_location\  s    =CBA+2 A+'lG$677$$gs333TYYDr*   c                v   t         r t        j                  | j                  |      S | j                  rt        d      t        j                  | j                        }|}|dk  r||z  }|dk  rt        |       }d}||k\  rt        t              t        j                  t        j                  ||            }|S )zGet xref of page number.r   r   )r  r   r`  r   r   r   r   r0  r   r1  r   r2  )r(   r  r  rE   rT  r  s         r)   r`  zDocument.page_xrefj  s    ??DIIs33>>.//))$))4
!eOA !et$
?n-- 9 9#q ABr*   c                    | j                         }|dk(  ry| j                  |d      }|d   dk(  ry|d   dk(  r|d   dd S y)z)Return the PDF PageLayout value.
        r   N
PageLayoutr  
SinglePager   r   rp  r  r(   r  r   s      r)   
pagelayoutzDocument.pagelayout{  sZ     !19t\2a5F?a5F?a59r*   c                    | j                         }|dk(  ry| j                  |d      }|d   dk(  ry|d   dk(  r|d   dd S y)z'Return the PDF PageMode value.
        r   NPageModer  UseNoner   r   rY  rZ  s      r)   pagemodezDocument.pagemode  sZ     !19tZ0a5F?a5F?a59r*   c              #  j  K   | j                   sy|xs d}|dk  r|| j                   z  }|dk  r|t        | j                         vrt        d      ||| j                   k  r|n| j                   }|dk(  rt        d      |
||kD  rd}nd}t        |||      D ]  }| j                  |        yw)z}Return 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   )r  rF  r   r  )r(   r  r  r  r  s        r)   rl  zDocument.pages  s     
 
aiT__$E aidoo..455 'DDOO,Ct 19566<t|d+ 	(C>>#&'	(s   -B3BB3c                    t        | d      }d}|j                  s|S t        j                  t        j                  |      t        d            }t        j                  |      }|S )zGet xref of PDF catalog.r   r%  r&  )r   r   r   r  r*  r  r   )r(   rT  r  r8  s       r)   rp  zDocument.pdf_catalog  sV    ta0~~K!!%"3"3C"8(6:JK%r*   c                *    | j                  d||      S )zGet PDF trailer as a string.r  )ro  r  )rq  )r(   ro  r  s      r)   r*  zDocument.pdf_trailer  s    zGGr*   c                `   | j                   ry| j                  }t        j                  |      }|j                  rt        j
                  |      S d}t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }|S )zDocument permissions.r   l    )r  r   r   r  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%  rT  perms       r)   r  zDocument.permissions  s     YY11#6 >>11#66 &&sE,E,EF%...D&&sE,D,DE%///D&&sE,D,DE%---D&&sE,H,HI%111Dr*   c                B   | j                   s| j                  rt        d      t        |      t        u rd|f}|| vrt        d      |dk(  ry|\  }}t        j                  ||      }t        j                  | j                  |      }|j                  |j                  fS )z%Get (chapter, page) of previous page.r$  r   rD  r  r-   )r   r  r   r   r4   r   r  fz_previous_pager   r  r   )r(   r  r  r  r  prev_locs         r)   prev_locationzDocument.prev_location  s     >>T..;<<=C'lG$677v$$Wc2))$))S9..r*   c                ,   i }|j                   }|j                  j                         D ]
  \  }}|||<    |j                  j                  j
                  }|j                  j                         }d|_        |j                          d}t        j                  d       | j                  |      }|j                         D ]  \  }}||   }||j                  |<    |dk(  r	 |S |j                  j                         }	|	|k7  sJ d|d|dd|	d       |S )zMake a fresh copy of a page.Nd   r   z	refs_old=z m_internal_old=z#xz m_internal_new=)rB  r4  rB   r   r   refsr3  r   r  store_shrinkr  )
r(   r   r  r  r  rF   refs_oldm_internal_oldr   m_internal_news
             r)   reload_pagezDocument.reload_page  s/   
kk$$**, 	DAqJqM	6 99'',,335	3~~c" $$& 	(DAqqME"'DQ	( q=
   "YY779N!^3 M xk!2>2"66G7KLM3r*   c                b    t        | d      }|j                  rt        j                  |       yy)z8
        If we are a PDF document, does repair.
        Fr%  N)r   r   r   pdf_check_documentr  s     r)   repairzDocument.repair&  s*     te4>>$$S) r*   c                "   |s|ryy	 t        j                  | j                  |      \  }}}|r|j                  |j                  f||fS t        j                  | j                  |      }|||fS # t        $ r t        r
t                |rY yY yw xY w)aM  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   rg   r  rv   r  r   rR  )r(   rR  r  r  xpypr  s          r)   r  zDocument.resolve_link.  s     %	//		3?KCR KK*B2200C@B{  	#(8%		s   $A. .BBc                    t        |      }|sdx}}|dkD  r||k\  rt        d      t        j                         }t	        t        |            }|
s^t        j                         }|r?t        j                  |_        t        j                  |_	        ||_
        ||_        ||_        |r|r?t        j                  |_        t        j                  |_        ||_        ||_        ||_        |r?t        j                  |_        t        j                  |_        ||_        ||_        ||_        |r|r?t        j                  |_        t        j                  |_        ||_        ||_        ||_        |rBt        j                  |_        t        j                  |_        ||_        ||_         ||_!        n|
}t	        t        |            }||z
  }|rt        d|       |	r| jE                  d       tG        |       }t        jH                  ||       y)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  re  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bitonalr  r  set_to_grayr  quality_strtemplate_optsdir1r  dir2invalid_optionsrT  s                     r)   rewrite_imageszDocument.rewrite_imagesH  s   B 'l)**MJ>jM9OPP5573}%&002D7<7N7N46;6P6P32</8C59F6BGBZBZD?AFA[A[D>=GD:DQDACND@?D?W?WD<>C>X>XD;AND>:DD7@KD=AFAYAYD>@E@Z@ZD=<FD9CPD@BMD?>C>V>VD;=B=W=WD:@MD=9CD6?JD<D3t9~+00ABCCLLOt$  d+r*   c                    | j                   st        d      t        | j                        D ]"  }| j	                  |      j                  |       $ y)zChange the color component count on all pages.

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

        Invokes the same-named method for all pages.
        r  N)r  r   rF  r  r  r  )r(   
componentsrZ  s      r)   r  zDocument.recolor  sE     {{[))t' 	2ANN1%%j1	2r*   c                <  	
 t        | d      r| j                  S t        | j                        D ci c]  }| j	                  |      | c}d 

fd		fd}t        j                  |       }t        j                  t        j                  |      d      }i }t        j                  d      }t        j                  ||      }|j                         r	 |||       t        j                  ||      }|j                         r	 |||       || _        |S c c}w )af  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                    t        j                  d      }t        j                  |      }t        j                  || dd       |j	                          t        |      S )z1Return string version of a PDF object definition.   r   r   )r   fz_new_bufferFzOutputpdf_print_objr  r  )r
  bufferoutputs      r)   
obj_stringz*Document.resolve_names.<locals>.obj_string  sK    ((-F^^F+FQ2""$'//r*   c                0   ddd}| j                         rt        j                  |       } | j                         r	 |       }n/| j	                         r t        j
                  | d            }n|S |j                  dd      dd }|j                  d      }|dk  r||d	<   |S |d
| j                         }||d
 }||d	<   |j                  d      rr|d	= |j                         dd }t        |      dk  r |j                  d       t        |      dk  r t        t        t        |            }|d   |d   f|d<   |d   |d<   |j!                  d      r1j#                  t%        |j                         d         d      |d<   |S t%        |      |d<   |S )z3Generate value of one item of the names dictionary.r  r\   )r   destr  r  rz   r   r-  r  Nz/XYZrG  r   r   rM  r   rN  rP  r   )pdf_is_indirectr   r  r  ru  r   r  r   stripr3   r6   r7   rk   r   r  rk  r  r8   r4   )	r  
templ_dictarrayr2  subval
array_listrA  r  
page_xrefss	          r)   	get_arrayz)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!&Jv 'v& #[[]1Q/
 *o)%%c* *o) UJ/0$%aD!A$<
4 %&qT
6" u%%/^^Cq8I4J2%N
6"  &)[
6"r*   c                (   t        j                  |      }t        |      D ]n  }t        j                  ||      }t        j                  ||      }|j                         r|j                         }nt        d| d       d}|sd |      | |<   p y)zyGenerate name resolution items for pdf_dict.

            This may be either "/Names/Dests" or just "/Dests"
            zkey z is no /NameN)r   rv  rF  rx  rw  r  rt  rr   )	dest_dictpdf_dict
name_countrZ  r  r  dict_keyr  s          r)   	fill_dictz)Document.resolve_names.<locals>.fill_dict  s     ++H5J :& 
9,,Xq9,,Xq9??$"0Hd1#\23#H*3C.Ih'
9r*   r&  Dests)r;   r  rF  r  r`  r   r  r   r*  r+  r  ru  pdf_load_name_tree)r(   rZ  r  rT  catalogr  dests	old_destsr`  r  r  r  s            @@@r)   resolve_nameszDocument.resolve_names  s   2 4*+'''49$//4JKqdnnQ'*K
	0.	`	9, 11$7 %%e&7&7&<fE	 ""7+ &&w6	  "i+ ''U3i&(K Ls   Dc                @   | j                   }	 | j                  s| j                  rt        d      t	        |      t
        u rnHt        |d      rt        |      }n0t        |d      r|j                  }nt        |d      st        d      || j                  k(  r|st        d      |
r|rt        d      | j                  dk  rt        d	      |r&| j                  |k7  s| j                  rt        d
      |rt        |      dkD  s|rt        |      dkD  rt        d      t        |       }t        j                         }||_        ||_        ||_        ||_        ||_        |	|_        ||_        ||_        |
|_        ||_        ||_        ||_        ||_        ||_        ||_        ||j;                  |       n||j;                  |       ||j=                  |       ||_        ||_         ||_!        d }d|jD                  _#        tI        |       |dk(  rtK        |       tM        |t
              rt        jN                  |||       n2tQ        |      }t        jR                  |||       |jU                          |r| j                   r|stW        d      y y y )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   r  r	   r7   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   rK  JM_embedded_cleanJM_ensure_identityr>   pdf_save_documentr  pdf_write_documentr  rg   )r(   rf   r  r  r  r  r   r  r  r  r  r	  
appearancer  r  r  r  r  r
  r  r  r  is_repaired_prerT  r  r  s                             r)   r  zDocument.save/  st   4 **=>>T..;<<>S Xv&8}HXv&}}H6*HIItyy 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   | j                   rt        d      t        |      t        u rn<t	        |d      rt        |      }n$t	        |d      r|j
                  }nt        d      || j
                  k(  rt        d      t        |       }t        j                  ||       y)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(   rf   rT  s      r)   save_snapshotzDocument.save_snapshot  s    >>_-->S Xv&8}HXv&}}HHIItyy :;;t$X.r*   c                Z    | j                  | j                  dt        j                        S )z Save PDF incrementallyT)r  r  )r  r   r   PDF_ENCRYPT_KEEPr.   s    r)   saveIncrzDocument.saveIncr  s!    yyAWAWyXXr*   c                   d }| j                   st        d      | j                  s| j                  rt        d      |sd}d}|r| j	                  i        | D ]  }|
r%|j                         D ]  }|j                           |	r(|j                         }|D ]  }|j                  |        d}|j                         D ]k  }|j                  d   t        j                  k(  r|r|j                  d       |r|j                          |j                  d   t        j                  k(  sjd}m |r|r|j!                  |	       |s|s|j#                          |j%                         s|rq|j%                         }t'        |      d
k(  sJ |d   }| j)                  |      } ||j+                               }|r#dj-                  |      }| j/                  ||       |s| j1                  |j2                  d      d   dk7  s| j5                  |j2                  dd        |r&| j7                         D ]  }| j9                  |        |r| j;                          |s|sd}n| j=                         }t?        d
|      D ]  }| jA                  |      sd| d}t        |      |r-| j1                  |d      d
   dk(  rd}| jC                  ||       T|sW| j1                  |d      d
   dk(  r'| jC                  |d       | j/                  |dd       | j1                  |d      d   dk7  s| j5                  |dd        y )Nc                H   g }d}d}d}| D ]  }|dk(  rd}|j                  |       |dk(  rd}|j                  |       5|dk(  rd}d}?|dd dk(  r|d	   d
k7  rd}|j                  |       c|dk(  rd}|j                  |       ||r|r|j                  |        |r|S y)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rk   )
cont_lines	out_linesin_textsuppressmake_returnro   s         r)   remove_hiddenz%Document.scrub.<locals>.remove_hidden  s      IGHK" '5="G$$T*5=#G$$T*7?#H"&K9%$q'T/$H$$T*4<$H$$T*  &/'0   r*   r  zclosed or encrypted docFr   r  )r(  T)imagesr   r  Thumbr  z	bad xref z - clean PDF before scrubbingSz/JavaScriptz<</S/JavaScript/JS()>>r#  z	/Metadata<<>>s   deleted)r  r  )"r  r   r  r   set_metadatar  resetra  delete_linkr  r   r   r?  r  r  r   apply_redactionsr  get_contentsr7   xref_streamr  r  update_streamr  r  rj  r  r  r  rb  rF  rq  rr  )r%  attached_filesclean_pagesembedded_fileshidden_text
javascriptr  
redactionsredact_imagesremove_linksreset_fieldsreset_responses
thumbnailsxml_metadatar  r   r8  rq  r  found_redactsr   r:  r  r  r  r   
xref_limitr   r
  s                                r)   scrubzDocument.scrub  s5   "/	b zz[))s}}677KJR  )	AD"lln #FLLN# (! +D$$T*+ "M )::a=E$C$CC%%d%3"**,::a=E$:$::$(M) m%%]%;;!$$&))+5zQ&Qxt,*4??+<=
 ::j1D%%dD1##DIIw7:fD$$TYY@S)	AZ ))+ &%&   "
J*J!Z( 	;D??4(!$'DE o%c..tS9!<M.!!$,f-a0K?!!$/!!$
!=j1!4>  z6:)	;r*   c                t    |dt         z  t        z  t        z  t        z  }| |   j	                  |||||      S )a  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%  r  r   r	  r  r  r  s          r)   search_page_forzDocument.search_page_forA  s_    * =&'-. // )	)E 3x"" # 
 	
r*   c                   | j                   s| j                  rt        d      | j                  st        d      t	        |d      st        d      t        t        |             }t        |      dk(  st        |      |vst        |      |vrt        d      t        |       }t        j                  ||t        j                         | j                          y)z,Build sub-pdf with page numbers in the list.r$  r  r]  zsequence requiredr   r  N)r   r  r   r  r;   rF  r7   r  r  r   r   pdf_rearrange_pages2PDF_CLEAN_STRUCTURE_KEEPrM  )r(   pylistevalid_rangerT  s       r)   selectzDocument.selecte  s    >>T..;<<{{[))w.011CI&LA7|;.7|;.122 t$
 	""31O1OP 	r*   c                    t        |       }|st        j                  }nt        j                  |      }t        j                  ||       yr  )r   r   r$  r  pdf_set_document_language)r(   r'  rT  r&  s       r)   r  zDocument.set_language  s=    t$&&D55h?D''T2r*   c                    | j                   rt        d      t        | j                         j	                               }|t               k(  rt        d      |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|       |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|       |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|       |rt        |      t        t        fvrt        d	      |D ]]  }	t        |	      t        t        fvrt        d
|	 d      t        |	      j                  |      }|t               k7  sQt        d|        |r/t        |      j                         }|dk(  rd}|dvrt        d      t        |       }
t        j                  t        j                  |
      t        d      t        d            }|j                   sy|dk(  r t        j"                  |t        d            }n3t        j$                  t        j"                  |t        d            |      }|j                   st        t&              t)        ||||||       t        j*                  |
j                          y)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)r  r  r,	  zbad 'basestate'r&  r>  Nr  r  r  )r   r   r  rY  r  r   r   r   
differencer  upperr   r   r  r*  r  r   r  r  r  JM_set_ocg_arraysr}  )r(   r  	basestater  offrbgroupsr  rV  rn  r"  rT  r  r
  s                r)   	set_layerz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 BAw4-/$}QCq%9::F%%d+:$'<QC%@AAB I,,.IK''	 :: !233t$!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/003	2sHfEs~~.r*   c                d   t        |t              rB| j                         D cg c]  }|d   |k(  s|d    }}|g k(  rt        d| d      |d   }t	        |       }|dk(  rt        j                  ||       y|dk(  rt        j                  ||       yt        j                  ||       yc c}w )	z$Set / unset OC intent configuration.r   rB  z	bad OCG 'rX  r   r   r   N)	r>   r  r  r   r   r   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)r(   rB  rw  uir'	  rT  s         r)   set_layer_ui_configzDocument.set_layer_ui_config  s     fc"-1-B-B-D]r6
V\H\bl]F]| 9VHB!788AYFt$Q;,,S&9q[..sF;,,S&9 ^s
   B-B-c                d   | j                         }|dk(  rt        d      |rt        |t              sydddd}t	        |j                               j                  |j                               sDdt	        |j                               j                  |j                                }t        |      d}|j                  |       |j                         D ]?  \  }}t        |      j                         }|dvrt        d| d	| d
      |d| d| z  }A |dz  }| j                  |d|       y)zSet the PDF MarkInfo values.r   	not a PDFFr)  zbad MarkInfo key(s): r'  )r.  falsezbad key value 'z': 'r   r-  r   r(  r&  T)rp  r   r>   r5   r  r  
issupersetr-	  r
  rB   r  r  rj  )r(   r0  r  r/  badkeyspdfdictr  r   s           r)   set_markinfozDocument.set_markinfo  s&   !19[))z(D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                   | j                   st        d      | j                  s| j                  rt        d      |i }nt	        |      t
        urt        d      ddddddd	d
dddd}t        |j                               }t        |j                               j                  |      }|t               k7  rd| }t        |      | j                  dd      \  }}|dk7  rd}nt        |j                  dd            }|i k(  r|dk(  ry|dk(  r9| j                         }| j                  |d       | j                  dd| d       n)|i k(  r$| j                  ddd       | j                          y|j!                         D 	
cg c]  \  }	}
||	   |	|
f c}
}	D ]:  \  }}||   }t#        |      r|dv rd}nt%        |      }| j                  |||       < | j                          yc c}
}	w )zcUpdate the PDF /Info object.

        Args:
            m: a dictionary like doc.metadata.
        r  r$  Nzbad metadataAuthorProducerr  rv  r  ModDateSubjectKeywordsTrapped)r  r  r~  ru  r  r  rv  rw  rx  r  r  zbad dict key(s): r  Infor  r   rP  r\   r	  r_  r  )noner  )r  r   r   r  r   r5   r  r  r-	  r  r4   r  rI  rr  rj  r  rB   r   rW  )r%  r{  keymap
valid_keysdiff_setr   rA  r}  	info_xrefr  rF   r  r  pdf_keys                 r)   r	  zDocument.set_metadata  s    zz[))==C,,;<<9A!WD ^,," *  " 
 '
qvvx=++J7su%hZ0CS/!""2v.4;IDLL34I7yA~>((*Ii0RI;d);<"WR0LLN,-GGIODAq9N!QO 	6HCSkG9'7 7!#&Y5	6 	 Ps   G+G+c                   | j                   s| j                  rt        d      | j                  |d      \  }}|dk7  s|dvrt        d|       |dkD  r,| j                  |d      \  }}|dk7  s|dvrt        d|       |dk(  r'd	| j	                  |      v r| j                  |d	d
       y| j                  |d	| d       y)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
        rK  r  r   rL  rO  r   r#  )z/OCGz/OCMDr  r  Nr_  )r   r  r   r  xref_get_keysrj  )r%  r  r  rA  r   s        r)   r  zDocument.set_oc/  s     ==C,,:;;""434;$&997v>??6&&r62GAtF{d*;; #;B4!@AA7ts0066T40tt4[1r*   c                  	
 t        | j                         j                               		
fd
d}|rst        |      t        t
        fv r\t        |      j                  	      }|t               k7  rd| }t        |      |ddj                  t        d |            z   dz   z  }|r=t        |      j                         }dd	d
dd}|dvrt        d|       |d||    z  }|r|d 
|       z  }|dz  }|dk(  r| j                         }n d| j                  |d      vrt        d      | j                  ||       |S )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                   t        |       t        t        fvst        |       dk  rt	        d|        | d   j                         dvrt	        d| d          | d   j                         dk(  rt        |       dk7  rt	        d|        d| d   j                          }| dd  D ]=  }t        |      t        u r|vrt	        d	|       |d
| dz  }0|d
 |       z  }? |dz  }|S )Nr   zbad 've' format: r   )andornotzbad operand: rU	  z[/r   zbad OCG r   r_  ri  )r   r   r   r7   r   r  ru  r4   )ra  rC   r"  all_ocgsve_makers      r)   rW	  z#Document.set_ocmd.<locals>.ve_makerZ  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: r]  r   c                    |  dS )Nr_  r-   r\  s    r)   <lambda>z#Document.set_ocmd.<locals>.<lambda>s  s    4j r*   ri  AnyOnAllOnAnyOffAllOff)anyonallonanyoffalloffzbad policy: r^  z/VEr(  r   r\  Trn  zbad xref or not an OCMD)r  rY  r  r   r   r   r-	  r   r  r  r  r  rI  rq  rr  )r%  r  rV  r`  ra  r   rn  r   polsrV	  rW	  s            @@r)   set_ocmdzDocument.set_ocmdE  s\   & s||~**,-	$ DJ4-/D	$$X.ACEz"1#& o%Hsxx,@$(GHH3NND[&&(F  ""	D CC <x!899c$v,((Dc(2,((D 19##%D$!GG677$%r*   c                   d}| j                         }|dk(  rt        d      |st        d      |d   dk(  r|dd }|D ];  }|j                         |j                         k(  s%| j                  |dd|         y	 t        d      )
zSet the PDF PageLayout value.)rX  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r;	  zbad PageLayout valuer-  r   NrW  Trp  r   r  rj  )r(   r[  r/  r  rF   s        r)   set_pagelayoutzDocument.set_pagelayout  s    m!19[))344a=C#ABJ 	A!QWWY.!!$!g>	 /00r*   c                   d}| j                         }|dk(  rt        d      |st        d      |d   dk(  r|dd }|D ];  }|j                         |j                         k(  s%| j                  |dd|         y	 t        d      )
zSet the PDF PageMode value.)r^  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r;	  zbad PageMode valuer-  r   Nr]  Trj	  )r(   r_  r/  r  rF   s        r)   set_pagemodezDocument.set_pagemode  s    `!19[))122A;#|H 	A~~1779,!!$
asG<	 -..r*   c                D    d fd}| j                   ||             y)a0  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                    | d    d}| j                  dd      dk7  r|d| d    dz  }| j                  dd      dk7  r|d| d    z  }| j                  d	d
      d
kD  r|d| d	    z  }|dz  }|S )zConvert Python label dict to corresponding PDF rule string.

            Args:
                label: (dict) build rule for the label.
            Returns:
                PDF label rule string wrapped in "<<", ">>".
            	startpager'  prefixr\   z/P(r  rZ  z/S/firstpagenumr   z/St r(  )r8   )rw  rn  s     r)   create_label_strz2Document.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                    | j                  d        dj                  | D cg c]
  } |       c}      }|S c c}w )a5  Return 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                    | d   S )Nru	  r-   r\  s    r)   rY	  z?Document.set_page_labels.<locals>.create_nums.<locals>.<lambda>  s
    an r*   r  r\   )r  r  )rs  rw  rn  rx	  s      r)   create_numsz-Document.set_page_labels.<locals>.create_nums  s>     KK4K5fEU)%0EFAH Fs   <N)rt  )r%  rs  r|	  rx	  s      @r)   set_page_labelszDocument.set_page_labels  s"    	$	 	[01r*   c           	        | j                   s| j                  rt        d      | j                  st        d      |st	        | j                               S t        |      t        t        fvrt        d      t	        |      }| j                  }|d   }t        |      t        t        fvrt        d      |d   dk7  rt        d      t        t        |dz
              D ]  }||   }||dz      }d|d	   cxk  r|k  sn t        d
| d      t        |      t        t        fvst	        |      dvrt        d|dz          t        |d         t        us|d   dk  rt        d|dz          |d   |d   dz   kD  st        d|dz           | j                         }	g }	dg|	z   }
| j                         |
d<   |t	        |	      kD  r;t        |t	        |	      z
        D ]!  }|
j                  | j                                # ddi}ddd|
d   dg}t        |      D ]  }||   }|d   }t        |d         }t!        | j                  dz
  t#        d|d	   dz
              }| j%                  |      }| j'                  |      j(                  }t+        d|dz
        }|t,        d}|d	   dk  r	t.        |d<   t	        |      dkD  rt        |d         t        t0        fv rt+        d||d   z
        |d<   nt        |d         t2        u r|d   j5                         n|}d|vr||d<   ne| |   }t+        |d         }|j6                  j(                  |j8                  z
  |_        ||j:                  z  }|j<                  |j8                  f|d<   i }d|d<   d|d<   d|d<   d|d<   d|d<   t?        j@                  ||      |d<   |d   |d<   ||d<   ||dz
     |d<   |
|dz      |d<   |jC                  d       |d <   |jC                  d!d      d	|jC                  d"d      z  z   |d#<   |dz   ||<   |||dz
        }|jC                  d$      s|r||kD  r|dxx   dz  cc<   n|dxx   dz  cc<   |d   dk(  r|dz   |d<   |dz   |d<   n |d   |d<   ||d      }|dz   |d<   |dz   |d<   |j                  |        tE        |      D ],  \  }}d%}|d   dk7  r|d&|d    z  }	 ||d   z  }	 |d   dkD  r|d'|
|d       d(z  }	 |d   dkD  r|d)|
|d       d(z  }	 |d   dkD  r|d*|
|d       d(z  }	 |d   dkD  r|d+|
|d       d(z  }	 |d   dkD  r|d,|
|d       d(z  }	 |d-|d   z   z  }|jC                  d       r/t	        |d          dk(  r|d.tM        t        |d                 d/z  }|jC                  d#d      dkD  r|d0|d#    z  }|dk(  r|d1z  }|d2z  }| jO                  |
|   |       / | jQ                          |S # tF        $ r tH        d	k\  r
tK                Y <w xY w# tF        $ r tH        d	k\  r
tK                Y Gw xY w# tF        $ r tH        d	k\  r
tK                Y Rw xY w# tF        $ r tH        d	k\  r
tK                Y ]w xY w# tF        $ r tH        d	k\  r
tK                Y hw xY w# tF        $ r tH        d	k\  r
tK                Y sw xY w# tF        $ r tH        d	k\  r
tK                Y w xY w)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$  r  z'toc' must be list or tupler   z'items must be sequences of 3 or 4 itemsr   z#hierarchy level of item 0 must be 1r  r   zrow z: page number out of range)r   rG  zbad row zbad hierarchy level in row )r  r<  lastr  r  $   )rM  rK  rK  r   rM  r<  r  r	  r  r9  r  topru  r   r  r  r]  rI  r  r  r'  z/Count z/First r_  z/Last z/Next z/Parent z/Prev z/Titlez/C[ ri  z/F z/Type/Outlinesr(  ))r   r  r   r  r7   r?  r   r   r   r  rF  r4   r%  rk   rI  rW  r  r  r`  rP  r  r  rS  	LINK_NONErk  r5   rP  rO  r#  rN  r"  r  
getDestStrr8   r  rg   r  rv   r   rr  r  )r%  r  r  toclenr  t0rZ  t1t2	old_xrefsr  lvltabolitemsr  r  ru  r  r`  page_heightr	  r  r   r'  r  r   r  r  r]  s                               r)   set_toczDocument.set_toc  s    ==C,,;<<zz[))s{{}%% 9T5M):;;S^^
V8D%=(FGGa5A:BCCeFQJ'( 
	JAQBQ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
	J  KKM	 	sY&&(QC	N"FS^35 0C,,./0 Q
 RaIJ v 8	A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QUAfI"w/AgJ"x3a)--PQ:R6RRAgJa%F3KVC!G_-F j)X#.w1$w1$g"$"#a%w!"Qv"6N&	vf~. 1uV!"QvNN1q8	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d1gs+u:	,x 	o  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@  '1,0@s~   !X*X)YY/2Z
Z5"[X&%X&)Y	Y	Y,+Y,/ZZZ21Z25[[[87[8c
                H   | j                         |   }
d}t        |      t        u r\|d   t        k(  rf|d   }| j	                  |      }| j                  |      j                  }|j                  dt        dd            }||j                  z
  |_	        ||d<   t        j                  ||      }|j                  d      st        d      |j                  d	      }|rNt        t        t         |            }t#        |      d
k7  st%        |      dk  st'        |      dkD  rt        d      |j                  dd      }|j                  dd      }|d|z  z   }|j                  d      }| j)                  |
|dd ||||      S |t*        k(  r| j-                  |      S ||y|| j)                  |
d|      S |t        k(  r||t/        d| j0                  dz         vrt        d      | j	                  |dz
        }| j                  |dz
        j                  }|t        d|dz
        }nt        |      }||j                  z
  |_	        ||||||	d}t        j                  ||      }|dk(  s|j                  d      st        d      | j)                  |
|dd |      S )az  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   rK  r   rM  r  r	  z/Azbad bookmark destr  r   r   zbad color valuerI  Fr]  r   r  N)rw  ru  r  r  r  )rw  ru  zbad page number)rK  rM  rR  r   ra   rN  r\   )r0  r   r5   rS  r`  rP  r  r8   r  r#  r  r	  r3   r   r   r  rk  r7   r  r  rx  r	  r3  rF  r  )r%  r2  r  rK  r  rR  ru  rM  rf   rN  r  r`  r	  rw  r  rI  r]  r  r  ddicts                       r)   set_toc_itemzDocument.set_toc_item  s   Z $$&s+		?d" I-'MM#.	!..s3::]]4r27"RTT)"$	$%%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"RTT) 
 !!)U3R<v006011##D5#IIr*   c                   | j                   s| j                  rt        d      t        |       }t	        j
                  t	        j                  |      t        d            }|j                  st        t        t               t	        j                  |j                  d            }t	        j
                  |t        d            }|j                  rt        |||d       y	t	        j                  ||t	        j                          d      }t	        j"                  |t        d      t        d             t	        j"                  |t        d      t        d             t	        j"                  |t        d      |       y	)
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  rH  )r(   r  rT  r8  r  r  s         r)   set_xml_metadatazDocument.set_xml_metadata  s
   >>T..;<<t$!!5#4#4c#:HV<LM_&:;22HOOG4LM  $(<=>>c3Q/&&S%,,.!DCXf%5x
7KLXi%8(5/Jhz&:C@r*   c                B    |sHt        j                         }t        j                  |t        t	         j
                                     yi  fd} fd} fd}d }fd}fd}	 |        s|rt        d       y	d	}
d	}j                         D ]  }|
t        |      z  }
  D ]  }|j                         D ]o  }t        |      t        ur|d
   dd } |	|      }|(|   \  }}\  }}|d   D ]*  }|j                  |d	          |j                  |d          , ||||ff|<   q  j                         D ]  \  }\  }}} |||d	   |d         }t        |      d	   }|t        |      t        |      k\  r|rt        d|d       S|rt        d|d        j                  |      }|d	   } ||        j                  |d      }|D ].  } ||      \  }} j!                  ||       |s|s% ||||       0 |t        |      z  } |
|z
  S )a  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                   j                  | d      }|d   dk7  ryt        |d   dd j                  dd            }j                  |d	      }|d   dk7  rd
}n|d   }j                  |d      }|d   dk7  rd
}||fS |d   }||fS )z(Retrieve old font '/W' and '/DW' values.DescendantFontsr   r  NNr   r  rP  r\   WNDWr4   )r  r4   r  )r  dfdf_xrefwidthsdwidthsr%  s        r)   get_old_widthsz-Document.subset_fonts.<locals>.get_old_widths:  s    !!$(9:B!u!"Q%"+--eR89G%%gs3FayG#&&w5GqzU" 7?" "!*7?"r*   c                   j                  | d      }|d   dk7  ryt        |d   dd j                  dd            }t        |      t        us|s,j                  |d	      d   d
k7  rj                  |d	d
       nj                  |d	|       t        |      t        us|s,j                  |d      d   d
k7  rj                  |dd
       yj                  |d|       y)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  rP  r\   r	  r  r	  )r  r4   r  r   r  rj  )r  r	  r	  r	  r	  r%  s        r)   set_old_widthsz-Document.subset_fonts.<locals>.set_old_widthsL  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                T   ddl }ddl}dj                  |j                  t	        |j
                        d            dz   }
j                  | d      }|j                  d	d	|z         }
j                  | d
      }|d   dk(  rt        |d   dd j                  dd            }
j                  |d      }|d   dk(  rXt        |d   j                  dd            }
j                  |d      }	|	j                  dd|z         }	
j                  ||	       
j                  | |       y)a'  Generate a name prefix to tag a font as subset.

            We use a random generator to select 6 upper case ASCII characters.
            The prefixed name must be put in the font xref as the "/BaseFont" value
            and in the FontDescriptor object as the '/FontName' value.
            r   Nr\   r  )r  +Trn  z
/BaseFont/r	  r  r   r  rP  FontDescriptorr  z
/FontName/)randomstringr  choicesr   ascii_uppercaserq  r  r  r4   rr  )ro  r	  r	  rv	  font_strr	  r	  r   fd_xreffd_strr%  s             r)   set_subset_fontnamez2Document.subset_fonts.<locals>.set_subset_fontnamed  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%%gv6h1r*   c           	        	 ddl m} ddl}|j                         5 }| d}| d}| d}|dd| d	d
dddg}	t        j                  | ddd      5 }
d|v rL|	j                  d|        |j                  d       t        |      }|D ]  }|
j                  | d        nL|	j                  d|        |j                  d       t        |      }|D ]  }|
j                  |dd        ddd       t        j                  |d      5 }|j                  |        ddd       	 t        j                  |       	 |j#                  |	       t%        |      }|j&                  }|j(                  dk(  rd}ddd       |S # t        $ r t        r
t	                t        d        w xY w# 1 sw Y   xY w# 1 sw Y   xY w# t         $ r Y w xY w# t         $ r t	                d}Y qw xY w# 1 sw Y   S xY w)a"  Build 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  rv   rr   tempfileTemporaryDirectoryr9   r:   rk   r:  r   r   rd   r3  rg   mainr)  r  glyph_count)r  unc_setgid_setftsr	  tmp_diroldfont_pathnewfont_pathuncfile_pathr  unc_fileunc_listuncr@  rT  
new_buffers                   r)   build_subsetz+Document.subset_fonts.<locals>.build_subset|  s)   .
 ,,. -&'"),7"),7"),7 #$\N3)*-/#	 WWy5sVL ;PX(l<.$ABC(#'=#+ 7C$NNcU":67 &6|n$EFC(#'=#+ ;C$NNc#Yb>:;; WW\40 +HNN6*+IIl+&HHTN6D!%J''1,%)
U-&\ g  'N,<IJ*; ;+ + !  ! &"$!%J&W-&\ s   F 8G/BF-1G/F9!G/*G :G&F*-F6	2G/9G	>G/	GG/GG/G,)G/+G,,G//G9c           
     8   d fd}t        | j                        D ]  }| j                  |d      D ]  }|d   }|d   }|d   }|dvrt        |      d	kD  r	|d	   d
k(  r.| j	                  |      }|d   } || |      }	j                  |t               t               t               t               ff      \  }
}}|j                  |       |	D ]  }|
j                  |        t        |      }|
j                  |j                         ~|
||f|<     y)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                    d| v rL| j                  d      }t        | |dz   |dz    d      }| j                  | ||dz    t        |            } d| v rL| S )zlRecreate font name that contains PDF hex codes.

                E.g. #20 -> space, chr(32)
                #r   r      )r   r4   r  chr)r   r  r  s      r)   	norm_namez@Document.subset_fonts.<locals>.repl_fontnames.<locals>.norm_name  sa    
 Tk		#ADQQ/4A<<QQQ@D Tk r*   c                >   |d   }|g}| j                  |d   d      d   dd } |      }||vr|j                  |       | j                  |d   d      }|d   dk7  r|S |d   dd }|j                  d	      r!t        |dd
       }| j	                  |d      }|j                  d      }|dk\  rl|j                  d|dz         }t        |j                  d|dz         |j                  d|dz               }||dz   | } |      }||vr|j                  |       |S )zReturn 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  r_  Trn  z	/BaseFontr-  r(  )r  rk   r  r4   rq  r   r  )	r%  rC   r   r  descendentsr  r  r  r	  s	           r)   get_fontnameszDDocument.subset_fonts.<locals>.repl_fontnames.<locals>.get_fontnames  sO   
  7!
++DGZ@CABG$X.5(LL*!..tAw8IJq>W, L)!nQr2''/{3B/0D"%//$4/"HK %%k27$))#rAv6B[--c26:K<L<LTSUXYSY<Z[B*26B7H(2Hu,X.r*   Trm  r   r   r   )otfttfwoffwoff2r  r	  r  rA  N)
rF  r  rn  r7   r  r8   r  r:  r)  r   )r%  r	  rZ  r  	font_xreffont_extr  extrrA  r  name_setxref_setsubsetsr   rT  r	  font_bufferss                  @r)   repl_fontnamesz-Document.subset_fonts.<locals>.repl_fontnames  s<   	8 3>>* M++AD+9 MA !!I tH tH (  !8}q(Xa[C-? ++I6D!%bJ)#q1E2>2B2B"SUCECE35>$B3/Hh LL+ % + T*+:6DLL+08(G/LL,9MMr*   c                N    j                         D ]  \  }\  }}}| |v s|c S  y r,   )rB   )r   r  r	  r  r	  s       r)   find_buffer_by_namez2Document.subset_fonts.<locals>.find_buffer_by_name	  s9    ,8,>,>,@ "((1a8#!M" r*   zNo fonts to subset.r   rT  !   charsr   zCannot subset r   zBuilt subset of font r	  Trn  )r   r  pdf_subset_fonts2r   rF  r  rr   r  r7   get_texttracer   r5   r:  rB   rB  rq  rr  ) r%  verbosefallbackrT  r	  r	  r	  r	  r	  r	  old_fontsizenew_fontsizerA  r   r  r   r  r	  r	  set_ucsset_gidr  
old_bufferr	  r	  r  ro  r	  r	  width_table	def_widthr	  s    `                              @r)   subset_fontszDocument.subset_fonts  s   8 55c:C##CeCNN.C)DE	#$	0	20>	@K	MZ	 	s-/&++- 	,JC
O+L	,  	PD **, P:T)<,,X6>9Ef9M6($6Wgg &AKK!%KK!%& )1(Wg<N'OV$P	P" :F9K9K9M 	,5J58W%j'!*gajIJH~a(H!S_J%GnXL:;/|1=>""j"9C1vH) ' H
 & F	)7	)B&Y!!)X6)"9k9EF C
O+L9	,< l**r*   c                   t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d            }t        j
                  |      rt        j                  |      s|dk  ryt        t              |dk  ryt        j                  ||       |r5t        j                  |       t        j                  |j                         yy)zActivate an OC layer.r&  r>  r  r   Nr   )r   r   r  r*  r  r  r  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr}  r   )r(   r  
as_defaultrT  cfgss        r)   switch_layerzDocument.switch_layerO  s    t$""!!3' (#	 !!4(0C0CT0Jz.//A:%%sF31137!!3>>2 r*   c                T   | j                   s| j                  rt        d      t        |       }t	        j
                  |      }t        |d|dz
        st        dt               t        |       t        ||      }t	        j                  |||       |rt        t        |             yy)z!Replace object definition source.r$  r   r[  N)r   r  r   r   r   r  r  r  r  rH  r,  r  JM_refresh_linksr   )r(   r  r   r   rT  xreflenr  s          r)   rr  zDocument.update_objectc  s    >>T..;<<t$$$S)a+J-%c40T73l401 r*   c                   | j                   s| j                  rt        d      t        |       }t	        j
                  |      }|dk  s||kD  rt        t              t	        j                  ||d      }t	        j                  |      st        t              t        |      }|j                  st        t              t        ||||       d|_        y)zReplace xref stream part.r$  r   r   N)r   r  r   r   r   r  r  r  ru  MSG_IS_NO_DICTr"  r   r  r#  r$  dirty)	r(   r  r	   r  compressrT  r	  r
  r  s	            r)   r
	  zDocument.update_streamr  s    >>T..;<<t$$$S)!8tg~l++$$S$2  %n-- (~~^,,c31	r*   c                `    t        | d      }|j                  rt        j                  |      S y)z1
        Count versions of PDF document.
        r   r%  )r   r   r   pdf_count_versionsr  s     r)   version_countzDocument.version_count  s+    
 ta0>>++C00r*   c                    ddl m}  |       }| j                  ||||
||||||||	|||||||||       |j                         S )Nr   r[  )r  r  r	  r  r  r  r   r  r  r  r  r  r  r  r  r  r
  r  r  r  )r9   r[  r  rs  )r(   r  r  r  r  r   r  r  r  r  r	  r  r  r  r  r  r  r
  r  r  r  r[  bios                          r)   r   zDocument.write  sl    . 	i		#%-+'%'!"3'#5 /+ 	 	
. ||~r*   c                &     | j                   |i |S r,   )r   r  s      r)   r  zDocument.tobytes  s    tzz4*6**r*   c                b    t        |        | j                  j                  | j                        S zPDF xref number of page.ra  r   r`  rB  r.   s    r)   r  zDocument.xref  %     	D{{$$T[[11r*   )keepc               R   | j                  |      r&| j                  |      }| j                  ||dd       |g }| j                  |      D ]  }||v r| j	                  ||d        | j                  |      D ]*  }| j                  ||      }| j	                  |||d          , y)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	  r  Nr  r   )xref_is_streamxref_stream_rawr
	  rP	  rj  r  )r%  sourcetargetr
  r	   r  rC   s          r)   	xref_copyzDocument.xref_copy  s     f%((0F	   <D$$V, 	2Cd{VS&1	2
 $$V, 	3C##FC0DVS$q'2	3r*   c                H   t        |       }t        j                  |      }t        |d|dz
        s|dk7  rt	        t
              |dkD  rt        j                  ||      }nt        j                  |      }|j                  syt        j                  ||      }|j                  syd}t        j                  |      rd}t        j                  |      dd}n,t        j                  |      rd	}nt        j                  |      rd
}nt        j                  |      rd}t        j                  |      d}nt        j                   |      rd}nt        j"                  |      rd}d}nt        j$                  |      rd}t        j&                  |      rd}nkd}nht        j(                  |      rd}dt        j*                  |       }n8t        j,                  |      r!d}t/        t        j0                  |            }nd}|t3        |dd      }	t5        |	      }||fS )z+Get PDF dict key value of object at 'xref'.r   r  r   )r  r  Nr  r  r_  r  r5   r4   rk  r  r   r.  r<	  r   r-  r	  unknown)r   r   r  r  r   r  r  r*  r   r  r  r   r  ru  
pdf_is_intr  pdf_is_realr  r6  r7  r  rt  pdf_is_stringr   r   JM_object_to_bufferr  )
r(   r  r  rT  r	  r
  subobjr   r   r  s
             r)   r  zDocument.xref_get_key  s   t$$$S)a+
l++!8''T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d|r*   c                   t        |       }t        j                  |      }t        |d|dz
        s|dk7  rt	        t
              |dkD  rt        j                  ||      }nt        j                  |      }t        j                  |      }g }|dk(  r|S t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > |S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   r  r   )r   r   r  r  r   r  r  r*  rv  rF  rt  rx  rk   )	r(   r  rT  r	  r
  rE   r   rZ  r  s	            r)   rP	  zDocument.xref_get_keys  s    t$$$c*a+
l++!8''d3C##S)C$6Iq 	A##U%;%;S!%DECIIcN	 	r*   c                |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)zCheck if xref is a font object.r$  r#  r   z/FontTFr   r  r   r  r(   r  s     r)   xref_is_fontzDocument.xref_is_font1  s=    >>T..;<<T6*1-8r*   c                |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)z!Check if xref is an image object.r$  r  r   rM  TFr
  r
  s     r)   xref_is_imagezDocument.xref_is_image9  s=    >>T..;<<T9-a0H<r*   c                t    t        | d      }|j                  syt        t        j                  ||            S )z!Check if xref is a stream object.r   r%  F)r   r   r   r   pdf_obj_num_is_streamrF  s      r)   r	
  zDocument.xref_is_streamA  s0    ta0~~E//T:;;r*   c                |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)z Check if xref is a form xobject.r$  r  r   rN  TFr
  r
  s     r)   xref_is_xobjectzDocument.xref_is_xobjectH  s=    >>T..;<<T9-a0G;r*   c                f    d}t        | d      }|j                  rt        j                  |      }|S )zGet length of xref table.r   r%  )r   r   r   r  )r(   r	  rT  s      r)   rb  zDocument.xref_lengthP  s/    ta0>>((-Gr*   c                   | j                   rt        d      t        r$t        j                  | j
                  |||      }|S t        |       }t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dkD  rt        j                  ||      }nt        j                  |      }t        t        j                  |      ||      }t        |      }	|	S )z#Get xref object source as a string.r   r   r  r   )r   r   r  r   rq  r   r   r   r  r  r  r  r*  r
  r  JM_EscapeStrFromBuffer)
r(   r  ro  r  rG   rT  r	  r
  r  r   s
             r)   rq  zDocument.xref_objectX  s    >>.//##TYYj%HCJt$$$S)a+
l++!8''T2C##C(C!%"<"<S"A:uU%c*r*   c           	     `   | j                   rt        d      |r2t        |t              r"t        j                  |      t               dhfvrt        d      t        |t              r-|r+|d   dk(  r.t        j                  |dd       t               k7  rt        d      t        |       }t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dk7  rt        j                  ||      }nt        j                  |      }t        |||      }|j                  sy|dk7  rt        j                   |||       yt        j"                  |      }t%        |      D ]A  }	t        j&                  |t        j(                  ||	      t        j*                  ||	             C y)	z&Set the value of a PDF dictionary key.r   r-  z	bad 'key'r   r   Nzbad 'value'r  )r   r   r>   r  INVALID_NAME_CHARSintersectionr  r   r   r  r  r  r  r*  JM_set_object_valuer   r  rv  rF  rH  rx  rw  )
r(   r  r  r   rT  r	  r
  r  rE   rZ  s
             r)   rj  zDocument.xref_set_keyk  s|   >>.//*S#.2D2Q2QRU2V_b_dgjfk^l2l[))%%UeAh#oJ\JiJijopqprjsJtx{x}J}]++t$$$S) a+
l++2:''T2C##C(C%c36!!2:##Cw7""7+A1X ""..w:..w:r*   c                   | j                   s| j                  rt        d      t        |       }t	        j
                  |      }t        |d|dz
        s|dk7  rt        t              |dk\  rt	        j                  ||d      }nt	        j                  |      }d}t	        j                  |      r!t	        j                  ||      }t        |      }|S )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  rT  r	  r
  r  r  s          r)   r		  zDocument.xref_stream  s    >>T..;<<t$$$c*a+
l++19((#tQ7C##S)C$..T:C #&Ar*   c                   | j                   s| j                  rt        d      t        |       }t	        j
                  |      }t        |d|dz
        s|dk7  rt        t              |dk\  rt	        j                  ||d      }nt	        j                  |      }d}t	        j                  |      r!t	        j                  ||      }t        |      }|S )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)   r

  zDocument.xref_stream_raw  s    >>T..;<<t$$$c*a+
l++19((#tQ7C##S)C$22C>C #&Ar*   c                D   t        |       }t        j                  t        j                  |      t	        d            }|j
                  st        t        t               t        j                  |t	        d            }d}|j
                  rt        j                  |      }|S )z"Get xref of document XML metadata.r&  r  r   )
r   r   r  r*  r  r   r  r	  r  r   )r(   rT  r8  r  r  s        r)   xref_xml_metadatazDocument.xref_xml_metadata  sx    t$!!5#4#4c#:HV<LM_&:;  $(<=>>##S)Dr*   )r   r  r   __dict__c                    | j                   S r,   )r  r.   s    r)   rY	  zDocument.<lambda>  s
    DMM r*   )returnr   )r0
  r  )rZ  r4   r0
  r   )rZ  r  r0
  z
list[Page])rZ  ztuple[int, int]r0
  r   )NNNNr   r   r  r0
  r4   r0
  r  )r2  r4   r0
  r  )r  r  r  )rc  
'Document'rd  r3
  re  r4   rf  r4   rg  r4   r0
  r  )r  r  r  r   )rh  r3
  r  r3
  re  r4   rf  r4   rg  r4   r0
  r  )rC   typing.Union[int, str]r0
  r4   r-  r2  r   r   )r  r4   r  r  r  r  r  r4   r  r4   r2  r4   r	  )r  S  J  NNr   NN)r  r   NN)r  r   r  r   r0
  r  )r   r  r   )r  )r  r4   rM  r4   )r  r4   )r   r  r(  
ByteStringrf   r/  r  r/  r  r/  r0
  r  )rC   r4
  )rC   r4
  r0
  r  )rC   r4
  r0
  r5   r0
  r   )rC   r4
  r(  OptBytesrf   r/  r  r/  r  r/  r0
  r  )r   r   N)r   FTTTFFFFFr     NNTr   r   r   F)r  r   N)r%  r3
  r  r4   r  r4   r2  r4   r6  OptDictr0
  r   )r%  r3
  r  r4   r0
  r4   )r%  r3
  r  r4   r0
  r5   r  )r  r4   rm  r   r0
  r   )r%  r3
  r  r4   r  r   r  r  r  r   r  r   r  r   r0
  'Pixmap')r   NNNF)r%  r3
  r  r4   r  r  r  r   r  OptIntr  
'TextPage'r  r   r0
  
typing.Any)r  r4   r0
  r   r  )r%  r3
  r"  r   r0
  r   )r%  r3
  r0
  r   )r  r  r  r  TTr   r   )Nr  r6
  r7
  helvNr+  )r%  r3
  r  r4   r   ztyping.Union[str, list, None]r   rk  rY  rk  r  rk  r   r  r@  r/  r  r1  r0
  r4   r,   )Nr   r   r  r0
  r5   )
r%  r3
  r  r4   rY  rk  r  rk  r0
  r   )r  r?
  r  r?
  r  r?
  r0
  zcollections.abc.Iterable[Page]r  )r   r   r0
  r   r   )
Nr   r   TTTTTFNr,  )r   r   r   r   r   r   r   r   r   r   r   r   r   r<
  NNr   r   r   F)TTTTTTTr   TTTTT)r%  r3
  r	  r   r	  r   r	  r   r	  r   r	  r   r  r   r	  r   r	  r4   r	  r   r	  r   r	  r   r	  r   r	  r   r0
  r  )FNNN)r%  r3
  r  r4   r   r  r	  r   r  r   r  r4   r  r@
  r0
  r   )NNNNN)r0  r5   r0
  r   )r%  r3
  r{  r5   r0
  r  )r%  r3
  r  r4   r  r4   r0
  r  )r   NNN)r%  r3
  r  r4   rV  typing.Union[list, None]r`  r/  ra  rD
  r0
  r4   )r[  r  )r_  r  )r%  r3
  r  r   r  r4   r0
  r4   )NNNNNNNr   )r%  r3
  r2  r4   r  r=
  rK  r?
  r  r?
  rR  r/  ru  r/  rM  r   rf   r/  rN  rk  r0
  r  FF)r%  r3
  r	  r   r	  r   r0
  r?
  )r   Nr   r   )FFFFFFFFFFFFr   r<
  NNr   r   r   F)
r%  r3
  r
  r4   r
  r4   r
  r   r0
  r  )r/   r0   r1   r  r  r  r  typingoverloadr]  sysversion_infor   r   r   r.  r3  r?  rD  rG  ru  r  r  r  r  r  r  r  r  r  r  r  r  r!  r%  r-  r<  rB  rF  rH  rY  r[  rg  r1  rM  rt  rx  r3  rz  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@  rF  rI  r  rY  ri  r0  rn  rq  rt  rz  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$  r0  r2  r   r>  r  r  rI  r  r  rP  rT  r`  r[  r_  rl  rp  r*  r  rr  rz  r}  r  r  r  r  r  r  r  r	  r!	  r'	  r  r3	  r9	  r@	  r	  r  rc	  rk	  rr	  r}	  r	  r	  r	  r	  r	  rr  r
	  r	  r   r  r  r
  r  rP	  r
  r
  r	
  r
  rb  rq  rj  r		  r

  r-
  	__slots__r  	is_streamr-   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+p	3(2$     !+0d+ 2 2
 NR !3F0d&<&$L$$
 CI12GIr*   r   c                  2    e Zd Zd Zd ZddZd Zd Zd Zy)	DocumentWriterc                    | S r,   r-   r.   s    r)   r  zDocumentWriter.__enter__  r  r*   c                $    | j                          y r,   r  r;  s     r)   r  zDocumentWriter.__exit__  r  r*   c                   t        |t              rn0t        |d      rt        |      }nt        |d      r|j                  }t        |t              r5t	        j
                  ||t        j
                  j                        | _        y t        |      }t	        j
                  ||t        j
                  j                        | _        |j                         dk(  sJ t        | j                  d      sJ y )Nr  r   r   _out)r>   r  r;   r   r   FzDocumentWriterPathType_PDFr   r  OutputType_PDFr3  )r(   r
   r  r  s       r)   r   zDocumentWriter.__init__  s    tS!dJ':DdF#99DtS!..gu?U?U?b?bcDI (.C..We>T>T>c>cdDI'')Q...DIIv...r*   c                r    t        |      }t        j                  | j                  |      }t	        |      }|S r,   )r  r   fz_begin_pager   r  )r(   ra  	mediabox2r  device_wrappers        r)   
begin_pagezDocumentWriter.begin_page  s2    #H-	$$dii;&/r*   c                B    t        j                  | j                         y r,   )r   fz_close_document_writerr   r.   s    r)   r  zDocumentWriter.close  s    &&		2r*   c                B    t        j                  | j                         y r,   )r   fz_end_pager   r.   s    r)   end_pagezDocumentWriter.end_page  s    499%r*   Nr\   )	r/   r0   r1   r  r  r   rY
  r  r^
  r-   r*   r)   rM
  rM
    s     /.3&r*   rM
  c                  .   e Zd Zd Z	 	 	 	 	 	 	 	 	 	 ddZd Zed        Zed        Zed        Z	ddZ
ed	        Zed
        ZddZddZed        Zd ZddZed        Zed        Zed        Zed        Zed        Zed        ZddZd Zd Zy)r)  c                (    t        |       t        ury y r,   )r   r)  r.   s    r)   r  zFont.__del__  s    :T! "r*   Nc                   |rSt        |d      r|j                         }nt        |t              rt	        |      }t        |t              st        d      t        |t              r|j                         }d|v sd|v sd|v rt        d       |dv rd}n|j                  d	      rd
}nr|j                  d      rd}n^|j                  d      rd}nJ|t        j                         v rdd l}|j                  |      }d }~n|dk  rt        j                  ||      }t!        j"                  |      }t%        |||||||||	|

      }|| _        y )Nrs  zbad type: 'fontbuffer'r-  \r   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanr   )r;   rs  r>   rZ  r  r   r  r  rr   r3   fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr8   r   r  JM_get_fontr   )r(   r   r@  rA  scriptr'  r  is_bold	is_italicis_serifembedfname_lowerrk
  r&  rT  s                  r)   r   zFont.__init__  sD    z:.'002
J	2":.
j%0 !9::h$"..*Kk!T[%8C;<N;<<<''	2''0''0 4 9 9 ;;$*11+>
!A*..xB11(;8XvtXIx8 	r*   c                "    d| j                    dS )NzFont('r"  r   r.   s    r)   r   zFont.__repr__.   s    		{"%%r*   c                @    t        j                  | j                        S )z Return the glyph ascender value.)r   fz_font_ascenderr   r.   s    r)   r   zFont.ascender1        %%dii00r*   c                6    | j                   j                         S r,   )r   fz_font_bboxr.   s    r)   r*  z	Font.bbox6   s    yy%%''r*   c                    t        j                  t        j                  | j                  j                  j
                              }t        j                  |      S r,   )r   r]  ll_fz_keep_bufferr   r   r  fz_buffer_extract_copy)r(   r(  s     r)   r  zFont.buffer:   s<    ..%"9"9499;O;O;V;V"WX++W55r*   c           	     \   t        j                  |      }g }|D ]  }	t        |	      }
|r2t        j                  | j                  |
      }|dk\  r2| j                  }n%t        j
                  | j                  |
||      \  }}|j                  |t        j                  ||      z          |S )z@Return tuple of char lengths of unicode 'text' under a fontsize.r   )r   r  ordfz_encode_character_scr   !fz_encode_character_with_fallbackrk   r  )r(   r   r   r'  ro
  wmode
small_capsr&  r   chr  gidrT  s                r)   char_lengthszFont.char_lengths?   s    11(; 	KBBA22499a@!899D!CCDIIqRXZ^_	TIIh!7!7c5!IIJ	K 	r*   c                @    t        j                  | j                        S )z!Return the glyph descender value.)r   fz_font_descenderr   r.   s    r)   r!  zFont.descenderN   s     &&tyy11r*   c                   t        j                  | j                  j                        }|sy t	        |t         j
                        sJ t        rz|j                  gfd} |d      } |d      } |d      } |d      } |d      } |d      } |d      }	 |d      }
 |d      } |d      } |d      } |d      } |d      }t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        r	n|j                  t        r
n|j                  t        rn|j                  t        rn|j                   t        rn|j"                  t        rn|j$                  t        rn|j&                  t        rdS |j(                  dS )Nc                :    d   d| z  dz
  z  }d   | z	  d<   |S r  r-   )bitsrG   rF   s     r)   bzFont.flags.<locals>.b]   s/    dqDy!m,tt|!
r*   r   )monoserifrI  r]  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxrd
  zcjk-langrs
  znever-embed)r   ll_fz_font_flagsr   r   r>   fz_font_flags_tr   is_monorr
  rp
  rq
  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxrd
  cjk_langrs
  never_embed)r(   r  r
  r
  rr
  rp
  rq
  r
  r
  r
  r
  r
  r
  r
  rs
  r
  rF   s                   @r)   r  z
Font.flagsS   sv   ""499#7#781e33444A dGtHdG!IaDM1J!IA$KQ4LQ4LtHaDEA$K+6AII,7QZZ+6AII-8	akk1<!//.9
q||-8	akk/:0;0;,7QUU,7QZZ)4!''/: 	 AB 	r*   c                   t        j                  |      }|r2t        j                  | j                  |      }|dk\  r2| j                  }n%t        j                  | j                  |||      \  }}t        j
                  ||      S )z2Return the glyph width of a unicode (font size 1).r   )r   r  r
  r   r
  r  )	r(   chr_r'  ro
  r
  r
  r&  r
  rT  s	            r)   glyph_advancezFont.glyph_advance   sp    11(;..tyy$?Caxyy??		4QWY]^IC%%dC77r*   c                B   t        j                  |      }|r2t        j                  | j                  |      }|dk\  r2| j                  }n%t        j                  | j                  |||      \  }}t        t        j                  |t        j                                     S )z1Return the glyph bbox of a unicode (font size 1).r   )r   r  r
  r   r
  r  fz_bound_glyphrm  )r(   charr'  ro
  r
  r&  r
  rT  s           r)   
glyph_bboxzFont.glyph_bbox   s|    11(;..		4@Caxyy??DRXZ^_ICE(($U^^5EFGGr*   c                B    | j                   j                  j                  S r,   )r   r   r	  r.   s    r)   r	  zFont.glyph_count   s    yy##///r*   c                    t        |      S )z$Return the unicode for a glyph name.)glyph_name_to_unicoder  s     r)   r
  zFont.glyph_name_to_unicode   s    $T**r*   c                
   |r<t        j                  |      }t        j                  | j                  |||      \  }}|S |r"t        j                  | j                  |      }|S t        j
                  | j                  |      }|S )z0Check whether font has a glyph for this unicode.)r   r  r
  r   r
  r  )	r(   r	  r'  ro
  r	  r
  r&  r
  rT  s	            r)   	has_glyphzFont.has_glyph   s{    55h?D??		3PVX\]IC 
	 22499cB 
 //		3?
r*   c                @    t        j                  | j                        S r,   )r   fz_font_is_boldr   r.   s    r)   rp
  zFont.is_bold   s    $$dii00r*   c                @    t        j                  | j                        S r,   )r   fz_font_is_italicr   r.   s    r)   rq
  zFont.is_italic   s    &&		22r*   c                @    t        j                  | j                        S r,   )r   fz_font_is_monospacedr   r.   s    r)   is_monospacedzFont.is_monospaced   s    **DII66r*   c                @    t        j                  | j                        S r,   )r   fz_font_is_serifr   r.   s    r)   rr
  zFont.is_serif   s    %%tyy11r*   c                     yr  )r   r   r
  r   r   cppyygbl"mupdf_mfz_font_flags_ft_substituter
  ll_fz_font_t3_procspdf_font_writing_supported)r(   rT  r  r
  r
  s        r)   is_writablezFont.is_writable   s    r*   c                D    t        j                  | j                        }|S r,   )r   fz_font_namer   r  s     r)   r   z	Font.name   s      +
r*   c                b   | j                   }t        j                  |      }d}	t        |t              st        t              |D ]b  }
t        |
      }|rt        j                  ||      }|dk\  r|}nt        j                  ||||      \  }}|	t        j                  ||      z  }	d |	|z  }	|	S )z1Return length of unicode 'text' under a fontsize.r   )r   r   r  r>   r  r  MSG_BAD_TEXTr
  r
  r
  r  )r(   r   r   r'  ro
  r
  r
  thisfontr&  r   r
  r  r
  rT  s                 r)   text_lengthzFont.text_length   s    9911(;$$\** 	;BBA228Q?!8#D!CCHaQWY]^	T%((sE::B	; 	h	r*   c                    t        |      S )z$Return the glyph name for a unicode.)unicode_to_glyph_name)r(   r
  s     r)   r
  zFont.unicode_to_glyph_name   s    $R((r*   c                    t        j                  | j                        }|D cg c]  }|j                   }}t	        |      }t        |      }|S c c}w )zE
        Returns sorted list of valid unicodes of a fz_font.
        )r   fz_enumerate_font_cmap2r   ucsr  sorted)r(   ucs_gidsrZ  ucssucss_uniqueucss_unique_sorteds         r)   valid_codepointszFont.valid_codepoints   sN     00;'(!(($i#K0!! )s   A)
NNNr   Nr  r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r/   r0   r1   r  r   r   r3  r   r*  r  r
  r!  r  r
  r
  r	  r
  r
  rp
  rq
  r
  rr
  r
  r   r
  r
  r
  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                      e Zd Zd Zd Zy)r  c                6    t        |       t        ury d| _        y r  )r   r  r   r.   s    r)   r  zGraftmap.__del__   s    DzX%r*   c                `    t        |      }t        j                  |      }|| _        d| _        y r  )r   r   pdf_new_graft_mapr   r   )r(   r%  dstmap_s       r)   r   zGraftmap.__init__   s*    s#&&s+	r*   N)r/   r0   r1   r  r   r-   r*   r)   r  r     s    
r*   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	        Zed
        Zed        Zedd       Zed        Zed        Zed        ZddZddZd Zed        ZdZy)Linkc                $    | j                          y r,   )r   r.   s    r)   r  zLink.__del__!  s    r*   c                J    t        |t        j                        sJ || _        y r,   )r>   r   FzLinkr   )r(   r   s     r)   r   zLink.__init__!  s    4...	r*   c                H    t        |        dt        | j                        z   S Nzlink on ra  r  r   r.   s    r)   r   zLink.__repr__
!      DC,,,r*   c                H    t        |        dt        | j                        z   S r
  r
  r.   s    r)   r   zLink.__str__!  r
  r*   c                    t        |d      }|j                  sy t        j                  ||d      }|j                  sy t	        |      }|S Nr   r%  )r   r   r   r  r  r(   r%  r  rT  link_objr
  s         r)   _borderzLink._border!  sG    sQ/~~))#tQ7""H%r*   c                    t        |d      }|j                  sy t        j                  ||d      }|j                  st	        t
              t        |      }|S r
  )r   r   r   r  r   r  r  r
  s         r)   _colorszLink._colors!  sO    sQ/~~))3a8""l++X&r*   c                     d | _         d| _        y r  )r   r   r.   s    r)   r   zLink._erase&!  s    r*   c                    t        |d      }|j                  sy t        j                  ||d      }|j                  sy t	        |||      }|S r
  )r   r   r   r  r_  )r(   r  r%  r  rT  r
  r
  s          r)   
_setBorderzLink._setBorder*!  sK    sQ/~~))#tQ7""X6r*   c                v    | j                  | j                  j                  j                  | j                        S r,   )r
  r   r   r  r.   s    r)   r  zLink.border4!  '    ||DKK..33TYY??r*   c                v    | j                  | j                  j                  j                  | j                        S r,   )r
  r   r   r  r.   s    r)   r  zLink.colors8!  r
  r*   c                   t        | d      r| j                  t        d      | j                  j                  j                  s | j                  j                  j                  rt        d      | j                  j                  }| j
                  s| j                  j                  d      rd}n|j                  | j                        }t        | ||      S )z Create link destination details.r   Norphaned object: parent is Noner$  r	  )
r;   r   r   r   r  r  rR  r3   r  linkDest)r(   r%  rR  s      r)   r  z	Link.dest<!  s     4"t{{':>??;;''4;;+=+=+J+J;<<kk  txx2237C""488,Cc3''r*   c                    t        |        | j                  j                  }|j                  sy|j                  | j                  d      }|d   dk7  rt        |d         S y)Nr   r  r   r  )ra  r   r  r  r  r4   )r(   r%  r  s      r)   r  z
Link.flagsL!  sU    Dkk  zzTYY,Q46>qt9r*   c                $   t        |        t        rt        j                  | j                        S | j                  }|j
                  r|j
                  j                  syt        t        j                  |j
                  j                              S )zFlag the link as external.F)
ra  r  r   Link_is_externalr   r   rR  r   r   fz_is_external_linkr(   	this_links     r)   r  zLink.is_externalW!  si     	D))49955II	##9+?+?+C+CU..	0D0D0H0HIJJr*   c                   | j                   j                  syt        |        	 | j                   j                         }|j                  syt        |      }|rd|_        | j                  |_	        ||j                  j                  t        |      <   | j                  dkD  r| j                  j                         D cg c]  }|d   t        j                  k(  s|d     }}| j                  j                         D cg c]  }|d   t        j                  k(  s|d     }}|j!                  | j                        }||dz      |_        ||dz      |_        |S d|_        d|_        |S c c}w c c}w )z
Next link.Nr   Tr   r   r\   )r   r   ra  r  r   	Link_nextr9  r
  r   r   r4  r5  r  r  r   r  rU  )r(   r  r"  
link_xrefslink_idsr2  s         r)   r9  z	Link.nextb!  s@    yy##D )).."C~~CjCKCJ.1CJJ""2c7+yy1},0KK,C,C,Efq1QVQeQeIeadf
f*.++*A*A*CdQqtuOcOcGcAaDdd &&tyy1%cAg.!#'* 
 
 gds   >E+E+?E0E0c                    t        |        | j                  | j                  j                  st        d      t	        | j                  j                               }t        |      }|S )zRectangle ('hot area').z"self.this.m_internal not available)ra  r   r   rg   rb  r   r  rL  s     r)   r   z	Link.rect~!  sS     	D 99DII$8$8ABBtyy~~/03i
r*   Nc                    t        |      t        ur|||d}| j                  || j                  j                  j                  | j
                        S )N)rY  rZ  r[  )r   r5   r
  r   r   r  )r(   r  rY  r[  rZ  s        r)   ra  zLink.set_border!  sA    <t#$uGFvt{{'9'9'>'>		JJr*   c                   t        |        | j                  j                  }t        |      t        ur||d}|j	                  d      }|j	                  d      }|t        d       |g dfv r|j                  | j                  dd       yt        |d	      rt        |      g}t        |       t        |      d
v sJ dt        |       d}|j                  | j                  d|       y)zSet border colors.rc  r   rd  Nz!warning: links have no fill colorr-   r  re  rf  rg  rh  ri  )ra  r   r   r5   r8   rr   rj  r  r;   rk  rl  r7   r   )r(   r  rd  r   r%  rn  s         r)   ro  zLink.set_colors!  s    Dkk  <t#"f5Fzz&!H%78b"XTYYT26;'Fm_F66{i'''	&!"!$C+r*   c                    t        |        | j                  j                  }|j                  st        d      t	        |      t
        urt        d      |j                  | j                  dt        |             y )Nr  zbad 'flags' valuer  )	ra  r   r  r   r   r4   rj  r  r  )r(   r  r%  s      r)   rr  zLink.set_flags!  s`    Dkk  zz[))E{c!011CU4r*   c                    t         rt        j                  | j                        S | j                  }|j                  r|j                  j
                  S dS )zUri string.r\   )r  r   link_urir   r   rR  r
  s     r)   rR  zLink.uri!  sB     >>$)),,II	+4+?+?y##''GRGr*   r  r1
  )Nr   NNr-  )r/   r0   r1   r  r   r   r   r
  r
  r   r
  r3  r  r  r  r  r  r9  r   ra  ro  rr  rR  r   r-   r*   r)   r
  r
  !  s    -- @ @ @ @ ( (   K K  6 	 	K
,( H H Dr*   r
  c                      e Zd Zd Zd Zd Zd Zd ZddddddddZd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd ZddZed        Zd Zd Zd Zd Ze	ZeZeZy)rp  c           	     j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r,   mathsqrtsumr(   r  s     r)   __abs__zMatrix.__abs__!  (    yy40aac01220   0c           
        t        |d      r^t        | j                  |z   | j                  |z   | j                  |z   | j
                  |z   | j                  |z   | j                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z   | j                  |d   z   | j                  |d	   z         S 
Nrf  r  Matrix: bad seq lenr   r   r   r   rG  r   
r;   rp  r!   r
  r  r  r[  r  r7   r   r(   r{  s     r)   __add__zMatrix.__add__!      1k"$&&1*dffqj$&&1*&&1*dffqj$&&1*> >q6Q;233dffqtmTVVad]DFFQqTM&&1Q4-!A$1G 	Gr*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r  r.   s    r)   r   zMatrix.__bool__!  &    IT/a/00/00r*   c                H    t        |d      syt        |      dk(  xr | |z
   S )Nr   Fr  r;   r7   )r(   rq  s     r)   __eq__zMatrix.__eq__!  s)    sI&3x1}1dSj!11r*   c                    | j                   | j                  | j                  | j                  | j                  | j
                  f|   S r,   r!   r
  r  r  r[  r  r  s     r)   r]  zMatrix.__getitem__!  s2    ?BBr*   Nr  c                  |s,dx| _         x| _        x| _        x| _        x| _        | _        nt        |      dkD  rt        d      t        |      dk(  r7t        t        |      \  | _         | _        | _        | _        | _        | _        nBt        |      dk(  rbt        |d   t        j                        rz|d   j                   | _         |d   j                  | _        |d   j                  | _        |d   j                  | _        |d   j                  | _        |d   j
                  | _        nt        |d   d      rt        j                  |d         }t!        t        j"                  |      d      }	t!        t        j$                  |      d      }
|	x| _         | _        |
| _        |
 | _        dx| _        | _        n
t        t        |d         \  | _         | _        | _        | _        | _        | _        nt        |      dk(  st        |      d	k(  rN|d   dk(  rFt        |d         ddt        |d         ddf\  | _         | _        | _        | _        | _        | _        ngt        |      d	k(  rN|d   dk(  rFd
t        |d         t        |d         d
ddf\  | _         | _        | _        | _        | _        | _        nt        d      ||| _         ||| _        ||| _        ||| _        ||| _        ||| _        yy)a  
        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   rf  r   r   r   r  zMatrix: bad argsN)r!   r
  r  r  r[  r  r7   r   r  rk  r>   r   rm  r;   r
  radiansroundcossin)r(   r!   r
  r  r  r[  r  r  thetac_s_s              r)   r   zMatrix.__init__!  s    BEEDFETVEdfEtvEY]233Y!^=@=M:DFDFDFDFDFDFY!^$q'5>>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 =QDF=QDF=QDF=QDF=QDF=QDF=r*   c                <    t               }|j                  |        |S )zCalculate inverted matrix.)rp  invert)r(   m1s     r)   
__invert__zMatrix.__invert__	"  s    X
		$	r*   c                     y)Nr  r-   r.   s    r)   r   zMatrix.__len__"      r*   c           	        t        |d      r^t        | j                  |z  | j                  |z  | j                  |z  | j
                  |z  | j                  |z  | j                  |z        S t        dd      }|j                  | |      S )Nrf  r   )	r;   rp  r!   r
  r  r  r[  r  concat)r(   r{  r  s      r)   __mul__zMatrix.__mul__"  sr    1k"$&&1*dffqj$&&1*&&1*dffqj$&&1*> >Aa[yyq!!r*   c                    t        | j                   | j                   | j                   | j                   | j
                   | j                         S r,   )rp  r!   r
  r  r  r[  r  r.   s    r)   __neg__zMatrix.__neg__"  s;    tvvgw$&&466'DFF7KKr*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r.   s    r)   __nonzero__zMatrix.__nonzero__"  r  r*   c                    t        |       S r,   )rp  r.   s    r)   __pos__zMatrix.__pos__"  s    d|r*   c                0    dt        t        |             z   S )Nrp  r  r   r.   s    r)   r   zMatrix.__repr__""  s    #eDk***r*   c                    t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      )Nr   r   r   r   rG  r   index out of range)rk  r!   r
  r  r  r[  r  r  r(   rZ  rF   s      r)   __setitem__zMatrix.__setitem__%"  s    !H!VaTV 	 !VaTV 	 !VaTV 	 !VaTV
 		 !VaTV 	 !VaTV 	 122r*   c           
        t        |d      r^t        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
  | j                  |z
  | j                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
  | j                  |d   z
  | j                  |d	   z
        S r  r  r	  s     r)   __sub__zMatrix.__sub__1"  r  r*   c           	     l   t        |d      rpt        | j                  dz  |z  | j                  dz  |z  | j                  dz  |z  | j
                  dz  |z  | j                  dz  |z  | j                  dz  |z        S t        |      d   }|st        d      t        dd      }|j                  | |      S Nrf  r  r   zmatrix not invertible)r;   rp  r!   r
  r  r  r[  r  util_invert_matrixZeroDivisionErrorr#  )r(   r{  r  m2s       r)   __truediv__zMatrix.__truediv__:"  s    1k"$&&2+a-"QA&&2+a-"QAG G"1%#$;<<Aa[yyr""r*   c                    t        |      t        |      cxk(  rdk(  st        d       t        d      t        ||      \  | _        | _        | _        | _        | _        | _        | S )z.Multiply two matrices and replace current one.r  r  )	r7   r   util_concat_matrixr!   r
  r  r  r[  r  )r(   onetwos      r)   r#  zMatrix.concatD"  s_    3x3s8(q(233 )2339KCQT9U6r*   c                    |t        |       }nt        |      }|d   dk(  ry|d   \  | _        | _        | _        | _        | _        | _        y)z}Calculate the inverted matrix. Return 0 if successful and replace
        current one. Else return 1 and do nothing.
        r   r   )r5  r!   r
  r  r  r[  r  )r(   r  r
  s      r)   r  zMatrix.invertK"  sP     ;$T*C$S)Cq6Q;9<Q6r*   c                    t        | j                        t        k  xr t        | j                        t        k  xs: t        | j                        t        k  xr t        | j
                        t        k  S )z,True if rectangles are mapped to rectangles.)r  r
  EPSILONr  r!   r  r.   s    r)   is_rectilinearzMatrix.is_rectilinearX"  sR     DFFg%?#dff+*? >[7"<s466{W'<	>r*   c                P   t        |      }|dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  rt        d|z
        t        k  r	 | S t        d|z
        t        k  rL| j                  }| j                  }| j
                  | _        | j                  | _        | | _        | | _        | S t        d|z
        t        k  rJ| j                   | _        | j                   | _        | j
                   | _        | j                   | _        | S t        d|z
        t        k  rL| j                  }| j                  }| j
                   | _        | j                   | _        || _        || _        | S t        j                  |      }t        j                  |      }t        j                  |      }| j                  }| j                  }||z  || j
                  z  z   | _        ||z  || j                  z  z   | _        | |z  || j
                  z  z   | _        | |z  || j                  z  z   | _        | S )z2Calculate pre rotation and replace current matrix.r   r  g     V@g     f@g     p@)rk  r  r?  r!   r
  r  r  r
  r  r  r  )r(   r  r!   r
  radrn  r  s          r)   	prerotatezMatrix.prerotate^"  s   eai#eaislESLEeslq5y>G#F C (AAVVDFVVDFRDFRDF6 3 ')ffWDFffWDFffWDFffWDF* ' ')AAffWDFffWDFDFDF  ,,u%CAAAAUQZ'DFUQZ'DFBFQZ'DFBFQZ'DFr*   c                    t        |      }t        |      }| xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | S )z1Calculate pre scaling and replace current matrix.rk  r!   r
  r  r  )r(   sxsys      r)   prescalezMatrix.prescale"  sM    2Y2Y""""r*   c                J   t        |      }t        |      }| j                  | j                  }}| xj                  || j                  z  z  c_        | xj                  || j                  z  z  c_        | xj                  ||z  z  c_        | xj                  ||z  z  c_        | S )z2Calculate pre shearing and replace current matrix.rE  )r(   r  rF   r!   r
  s        r)   preshearzMatrix.preshear"  sx    !H!Hvvtvv1!dff*!dff*!a%!a%r*   c                    t        |      }t        |      }| xj                  || j                  z  || j                  z  z   z  c_        | xj                  || j
                  z  || j                  z  z   z  c_        | S )z5Calculate pre translation and replace current matrix.)rk  r[  r!   r  r  r
  r  )r(   txtys      r)   pretranslatezMatrix.pretranslate"  s_    2Y2Y"tvv+TVV++"tvv+TVV++r*   r,   )r/   r0   r1   r  r
  r   r  r]  r   r  r   r$  r&  r(  r*  r   r0  r2  r8  r#  r  r3  r@  rC  rH  rJ  rN  __inv____div__normr-   r*   r)   rp  rp  !  s    3G12
C !% 5'n"L1+
G# > >
)V	 GGDr*   rp  c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)IdentityMatrixz"Identity matrix [1, 0, 0, 1, 0, 0]c                    t        d      S )N)r   r   r   r   r   r   )hashr.   s    r)   __hash__zIdentityMatrix.__hash__"  s    M""r*   c                2    t         j                  | dd       y )Nr  )rp  r   r.   s    r)   r   zIdentityMatrix.__init__"  s    c3'r*   c                     y)Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r-   r.   s    r)   r   zIdentityMatrix.__repr__"  s    =r*   c                r    |dv rd| j                   |<   y |dv rd| j                   |<   y || j                   |<   y )Nadr  bcefr  )r.
  )r(   r   r   s      r)   __setattr__zIdentityMatrix.__setattr__"  s:    4<"%DMM$V^"%DMM$"'DMM$r*   c                     t        d      )NzIdentity is readonly)NotImplementedError)r  s    r)   	checkargszIdentityMatrix.checkargs"  s    !"899r*   N)	r/   r0   r1   __doc__rV  r   r   r\  r_  r-   r*   r)   rS  rS  "  s    ,#(>(:r*   rS  c                      e Zd ZdZddZy)r
  z#link or outline destination detailsNc           	     B	    |j                   }| }d _        d _        d _        d _        d _        t         _        t        dd       _	        t                _        d _        |j                   _        t        dd       _        |j                   _         fd}d }|rI j                  j!                  d      s.d|d   dz    d	t#        |d          d
t#        |d           _        |j                   rd _        t$         _         j                  sd _        t         _        |r j                  r	 j                  j'                  dd       _         j                  j!                  d      rt(         _        t+        j,                  d j                        }|rt/        |j1                  d            dz
   _        t        t3        |j1                  d            t3        |j1                  d                   _	         j                  t4        z  t6        z   _        nt+        j,                  d j                        }|r#t/        |j1                  d            dz
   _        nt8         _        t+        j,                  d j                        }|sJ |rh|rf ||j1                  d            }	|j;                         j=                  |	       _         j                  t                _        |	 j                  d<   n= | j                  dd         _        n"t8         _         | j                         _        |j                   r6 j                  sn( j                  j!                  d      rډ j                  dd   _         j                  j!                  d      r j                  dd   _        d _        d _        t>         _         j                  jA                  d      }
tC        |
      dk(  r|
d   j!                  d      rttD         _        |
d    _        t/        |
d   jA                  d      d   dd        dz
   _        n3d j                  v rd _        t$         _        nd _        t>         _        tG         j                  t              sJ y )Nr\   r   Fc                    j                   dd  j                  d      }t               }|D ],  }|j                  d      }|dk\  r||dz   d  ||d | <   (d ||<   . |S )Nr   &r   r   )rR  r6   r5   r   )rR  rB   rG   rC   eqr(   s        r)   uri_to_dictz&linkDest.__init__.<locals>.uri_to_dict"  sp    HHQRL&&s+E&C %YYs^7%)"Q$%[CSb	N $CI% Jr*   c                    | j                  dd      }|j                  d      }|d   }|dd D ](  }|dd }|t        t        |d	            z  }||dd z  }* |S )
z'Unescape '%AB' substrings to chr(0xAB).z%%z%25%r   r   Nr   r	  )base)r  r6   r	  r4   )r   r6   r  rC   pieces        r)   unescapez#linkDest.__init__.<locals>.unescape"  sv    LLu-EKK$EAhGab	 $Ra3s5r2334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   rG  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r   z//zpage=rd  r_   T)$r  r  	file_specr  is_mapis_urir	  rK  r  ltr5   r  
new_windowr   rf  rR  r3   r   rY  r  rS  rer  r4   grouprk  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr  r8   rX  r6   r7   rV  r>   )r(   r
  rlinkr   isExtisIntrf  rk  r{  r  ftabs   `          r)   r   zlinkDest.__init__"  s   		
	1+V
HH	1+77				 ,,S1a1~Xia6I5J!IV[\]V^L_K`aDH??DI DIxxDI!DITXX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%)^^AB%7DN#'	~~++C0t9>Aw))'2$.	)-a$'Qc(:1(=ab(A$BQ$F	"$	"'	$**d+++r*   r,   r/   r0   r1   r`  r   r-   r*   r)   r
  r
  "  s    -b,r*   r
  c                  d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
        Zd Zd ZddZy)r6  z6
    Class describing a PDF form field ("widget")
    c                   d | _         d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d| _	        d| _
        d| _        d | _        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        y )Nr	  r   r   r   r   Helvr\   )r  border_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_stringrR  button_caption	is_signedr   	text_fonttext_fontsizetext_maxlentext_format_text_daro
  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r  r.   s    r)   r   zWidget.__init__1#  s     !!!%"#!!! 		r*   c                <    d| j                    d| j                   dS )NzWidget:(field_type=z script=r  )r  ro
  r.   s    r)   r   zWidget.__repr__V#  s#    $T%;%;$<HT[[MQRSSr*   c                    | j                   sd| _         yd}|D ]6  }| j                   j                         |j                         k(  s/|| _          y d| _         y)zAEnsure text_font is from our list and correctly spelled.
        r  N)CourTiRor  ZaDb)r  r  )r(   valid_fontsr  s      r)   _adjust_fontzWidget._adjust_fontY#  sZ     ~~#DN6 	A~~##%2!"	  r*   c           	        | j                   t        dd      vrt        d      | j                   t        j                  k(  r| j
                  dvrt        | d      r| j                  j                  }|j                  | j                  d      \  }}|dk(  ret        t        t        |dd j                  d	d
      j                                     }|D ]%  }|| j                  k7  s|j                  |dd       ' yyyyy)z Any widget type checks.
        r   r   zbad field type)FOffr   zParent/Kidsr  r  rP  r\   ASz/OffN)r  rF  r   r   PDF_WIDGET_TYPE_RADIOBUTTONr  r;   r   r  r  r   r  r4   r  r6   rj  )r(   r%  	kids_type
kids_valuer:  r  s         r)   _checkerzWidget._checkerg#  s     ??%1+--.. ??e???DDTDT\jDjovw{  ~F  pG ++$$C$'$4$4TYY$N!IzG#c#z!B'7'?'?b'I'O'O'QRS! =Dtyy(((tV<= $ pGDj?r*   c                    | j                   syd}d}d}| j                   j                         }t        |      D ]  \  }}|dk(  r2||dz
     dd }t        ||dz
           }dx||<   x||dz
  <   ||dz
  <   =|d	k(  r t        ||dz
           g}dx||<   ||dz
  <   b|d
k(  sh||dz
  | D cg c]  }t        |       }}dx||<   x||dz
  <   x||dz
  <   ||dz
  <    || _        || _        || _        d| _         yc c}w )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'.
        Nr  r   r~  Tfr   r   r\   grgr   )r  r6   r  rk  r  r  r   )r(   rT  r  rY  datrZ  rC   r  s           r)   r  zWidget._parse_da|#  sO   
 }}mm!!# ~ 	GAtt|1q5z!"~c!a%j)/11A1QqSC!Hs{c!a%j)+$&&AQqSt|),QU16AuQx66:<<A<QqS<C!Hs1Q3x	 " 7s   +C;c                   | j                   j                  s| j                   j                  rt        d      | j                  st        d      | j
                  dk(  rd| _        t        | j                         t        | j                         | j                  sd| _	        t        | j                         | j                  sd| _
        | j                  sd| _        | j                  j                         dd | _        | j                  t        j                   t        j"                  t        j$                  fv }| j&                  sd| _        n&t)        | j&                        t*        urt        d      |s| j,                  sd| _        n&t)        | j,                        t*        urt        d	      |s| j.                  sd| _        n&t)        | j.                        t*        urt        d
      |s| j0                  sd| _        n&t)        | j0                        t*        urt        d      |s| j2                  sd| _        n&t)        | j2                        t*        urt        d      |s| j4                  sd| _        n&t)        | j4                        t*        urt        d      |s| j6                  sd| _        n&t)        | j6                        t*        urt        d      | j9                          y)z$Validate the class entries.
        zbad rectzfield name missingUnnamedNr~  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r   is_infiniteis_emptyr   r  r  rl  r  rR  r   r  r  r  r.	  r  r   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXr  ro
  r   r  r  r  r  r  r  r  r  )r(   btn_types     r)   	_validatez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                $   | j                   sy| j                  j                  }|sJ t        |      }t        j                  || j                         }t        j
                  |t        d            }|j                         sy|j                  t        d      | j                         |j                  t        d            }|j                         st        d       yt        |j                               D ]  }|j                  |      }|j                         s%|j                         }|| j                   k(  rE|j                  t        d            }	|	j!                         dk(  ss|j                  t        d      | j                          y)	a  Propagate 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  Ffrx  z0warning: malformed PDF, Parent has no Kids arrayr  r6  T)r  r   r   r   r  r  r  ru  rC  r  r  rr   rF  r  r  r   rt  )
r(   r%  rT  
pdf_widgetr  rz  rZ  r{  r  r  s
             r)   _sync_flagszWidget._sync_flags#  sT    yykk  
ss#**3		:
##J0BC!!# 	0@0@A ""8F#34  "FGt))+, 	CA$$Q'C??$>>#Dtyy &&x	':;G&&(H4  $1A1AB	C r*   c                   | j                   dvryt        | d      r| j                  j                  }ny| j                  }ddd}|j	                  |d      }|d   dk(  rLg }|d   d	d
 }|j                  d      dd }|D ]$  }|j                  |j                         d          & ||d<   |d   dk(  rug }t        |d   j                  d      d         }|j                  |      }|j                  d      dd }|D ]$  }|j                  |j                         d          & ||d<   |j	                  |d      }	|	d   dk(  rLg }
|	d   d	d
 }	|	j                  d      dd }|D ]$  }|
j                  |j                         d          & |
|d<   |	d   dk(  rug }
t        |	d   j                  d      d         }|j                  |      }	|	j                  d      dd }|D ]$  }|
j                  |j                         d          & |
|d<   |S )a	  Return 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   )rJ  r  zAP/Nr   r5   r   r   r  r-  rJ  r  r   zAP/Dr  )	r  r;   r   r  r  r6   rk   r4   rq  )r(   r%  r  statesAPNnstatesapntr"  nxrefAPDdstatesapdtdxrefs                r)   button_stateszWidget.button_states$  s+    ??&(4"++$$Cyy $/tV,q6VGa&2,C99S>!"%D -qwwy|,-&F8q6VGAS)!,-E//%(C99S>!"%D -qwwy|,-&F8tV,q6VGa&2,C99S>!"%D -qwwy|,-$F6Nq6VGAS)!,-E//%(C99S>!"%D -qwwy|,-$F6Nr*   c                .    | j                   j                  S r,   )_annotr9  r.   s    r)   r9  zWidget.next@$  s    {{r*   c                    | j                   dvry| j                         }|
t               }|j                         D ]  }||   D ]  }|dk7  s	|c c S   t	        d       y)a  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  Nr  z(warning: radio button has no 'On' value.T)r  r  r5   r  rr   )r(   bstater  rF   s       r)   on_statezWidget.on_stateD$  so     ??&(##%>VF 	AAY :H	 	:;r*   c                B    t         j                  | j                         y)z.Reset the field value to its default.
        N)r  _reset_widgetr  r.   s    r)   r	  zWidget.resetY$  s     	DKK(r*   c                b   | j                          | j                          d| _        t        | j                        dk(  rd| j                  z   }nOt        | j                        dk(  rd| j                  z   }n't        | j                        dk(  rd| j                  z   } j
                  | j                  | j                  | j                  d| _        | j                  rt        | j                         t        j                  | j                  |        d| _        |r| j                          y	y	)
z!Reflect Python object in the PDF.r\   r   !{:g} {:g} {:g} rg /{f:s} {s:g} Tfr   z{:g} g /{f:s} {s:g} TfrG  z%{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tfr  rn  N)r  r  r  r7   r   r  r  r  r  util_ensure_widget_calcr  r  _save_widgetr  )r(   
sync_flagsr   s      r)   r
  zWidget.update^$  s     !Q&5EC!Q&*T]]:C!Q&9DMMIC"

DOOt~~&*&8&8: #DKK0 	4;;- r*   Nr  )r/   r0   r1   r`  r   r   r  r  r  r  r  r  r3  r9  r  r	  r
  r-   r*   r)   r6  r6  ,#  sX    #JT=*>EN+Z/b    *)
r*   r6  )_extrac                      e Zd Zd Zed        Zd Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        ZdgZy)rE  c                    || _         y r,   )r   r(   r  s     r)   r   zOutline.__init__$  s	    	r*   c                    t        | dd      S )zoutline destination detailsNr
  r.   s    r)   r  zOutline.dest$  s     dD))r*   c                    t        | d|      S )zo
        Like `dest` property but uses `document` to resolve destinations for
        kind=LINK_NAMED.
        Nr  )r(   r   s     r)   destinationzOutline.destination$  s    
 dH--r*   c                j    | j                   }|j                         }|j                  sy t        |      S r,   )r   r  r   rE  )r(   r  down_ols      r)   r  zOutline.down$  -    YY'')!!wr*   c                    t         rt        j                  | j                        S | j                  }|j                  sy|j                  j
                  }|yt        j                  |      S r  )r  r  Outline_is_externalr   r   rR  r   r
  )r(   r  rR  s      r)   r  zOutline.is_external$  sW     --tyy99YY}}mm;((--r*   c                D    	 | j                   j                  j                  S r,   )r   r   r   r.   s    r)   r   zOutline.is_open$  s    99''///r*   c                j    | j                   }|j                         }|j                  sy t        |      S r,   )r   r9  r   rE  )r(   r  next_ols      r)   r9  zOutline.next$  r  r*   c                X    	 | j                   j                  j                  j                  S r,   )r   r   r   r.   s    r)   r   zOutline.page$  s!    99'',,111r*   c                B    | j                   j                  j                  S r,   )r   r   ru  r.   s    r)   ru  zOutline.title$  s    yy##)))r*   c                `    | j                   }|j                  sy |j                  j                  S r,   )r   r   rR  r  s     r)   rR  zOutline.uri$  s%    YY}}}}   r*   c                B    | j                   j                  j                  S r,   )r   r   r"  r.   s    r)   r"  z	Outline.x$      yy##%%%r*   c                B    | j                   j                  j                  S r,   )r   r   r#  r.   s    r)   r#  z	Outline.y$  r  r*   r   N)r/   r0   r1   r   r3  r  r  r  r  r   r9  r   ru  rR  r"  r#  rJ
  r-   r*   r)   rE  rE  $  s     * *.     . . # #
     % %
 * * ! ! & & & & 	Ir*   rE  c                `   t        j                         }| |_        ||_        ||_        ||_        |rzrt        t         j                        sJ t        j                          G fddt         j                        } |       }|j                  |j                                ||_        |S )z4
    Returns a mupdf.PdfFilterOptions instance.
    c                  (     e Zd Z fdZd Z xZS )'_make_PdfFilterOptions.<locals>.Factoryc                P    t         |           | j                          | _        y r,   )r   r   use_virtual_filtersopts)r(   	__class__r  s    r)   r   z0_make_PdfFilterOptions.<locals>.Factory.__init__$  s!     "'')"
r*   c           	     h    	 t        j                  |||||| j                  j                               S r,   )r'   r  r  r   ll_pdf_new_sanitize_filter)r(   ctxr%  chainstruct_parents	transformr  s          r)   filterz._make_PdfFilterOptions.<locals>.Factory.filter$  s9     77&!

++- r*   )r/   r0   r1   r   r  __classcell__)r  r  s   @r)   Factoryr  $  s    #r*   r  )r   PdfFilterOptionsr  r  r  	no_updater>   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryr  _factory)	r  r  r  r  r  r  r  r  factorys	        `   r)   r  r  $  s     $$&GGO+GGM!G eU%C%CDDD224E	e-- 	2 )G,,./"Nr*   c                     e Zd Zd Zd Zd Zd ZddZddddddddej                  d	ddd
dfdZ
d Zd Zd ZddZd ZdMdZddZd Zd Zd Zd Zd Zd ZddZd ZddZ	 	 	 ddZd Zd Zdd Zd! Zdd#Z d$ Z!dd%Z"d& Z#d' Z$dd(Z%dd)Z&dd*Z'	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd+Z(ddddddddej                  d	ddd
dd,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd-Z)	 	 d	 dd.Z*dd/Z+dd0Z,dd1Z-dd2Z.dd3Z/	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd4Z0	 	 	 	 d	 dd5Z1dMdd6Z2ddd7Z3ddd8Z4ddd9Z5dd:Z6d; Z7d< Z8dd=Z9	 	 	 d	 	 	 	 	 	 	 	 	 dd>Z:dd?Z;d@ Z<dA Z=e>dB        Z?e>dC        Z@dD ZAddEZBe>dF        ZCe>dG        ZDdH ZEddIZFdJ ZGddKZHe>ddL       ZI	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddNZJ	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddOZK	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddPZL	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddQZM	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddRZN	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddSZO	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddTZP	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddUZQ	 	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddVZR	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddWZS	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddXZTddYZUdZ ZVe>d[        ZWe>d\        ZXe>d]        ZYdd^ZZdd_Z[d` Z\ddaZ]dddbZ^	 	 d	 	 	 	 	 	 	 ddcZ_ddddZ`de ZaddfZbecdddd
d"dg	 	 	 	 	 	 	 	 	 	 	 	 	 ddhZddi Ze	 	 d	 	 	 	 	 	 	 ddjZfddkZgdMdlZhddmZiddnZjddoZk	 d	 	 	 	 	 ddpZldq Zmdr Znds Zodt Zpdu ZqdddvZrdw Zsdx Zt	 	 ddzZudddddd	d"d"d
d{		 dd|Zvdddd"ddd"dddddd}d~ZwdddZxdddyddddddd	dddd"d	d	dd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZyddddd	d	dddyddd	ddd"dddd	d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZze>d        Z{e>d        Z|ddZ}ddZ~d Zd Ze>d        Ze>d        Zd Zd Zd Zdddd	 	 	 ddZe>d        Ze>dd       Zd Zdd
ddd	 ddZd Zd Zd Zd ZddZd Zd Zd Z	 	 	 	 	 	 d	 ddZe>d        Ze>d        ZddZddZd Z	 	 	 	 	 	 	 	 d	 	 	 ddZe>d        Z e>eAd      ZdZy)r   c                   t        |t        j                  t        j                  f      s
J d|        || _        d| _        d | _        d| _        t               | _	        || _
        |j                  r\t        |t        j                        r&|j                  j                  j                  | _        y |j                  j                  | _        y d | _        y )Nz	page is: Tr\   )r>   r   r   r   r   r   
last_point	draw_contr5   r4  r   r   r   rB  )r(   r   r   s      r)   r   zPage.__init__%  s    $u}} =>R)D6@RR>	6??4/"oo33::"oo44DKr*   c                "    | j                         S r,   )r   r.   s    r)   r   zPage.__repr__"%  s    ||~r*   c                   t        | dd       }t        | j                  j                  t        j
                        r+| j                  j                  j                  j                  }n | j                  j                  j                  }|rX| j                  j                  }| j                  j                  d}|dk(  rd}d| d| d| j                  j                  dd	}|S d| }|S )
Nr   rJ  r\   znew PDFr  z of <z, doc# r  >)r   r>   r   r   r   pdf_pager   rB  r   r   r	   r  )r(   r   rB  r"  rG   s        r)   r   zPage.__str__%%  s    x.dii**ENN;YY))//66FYY))00F  A{{!!-Bw&qc1F1Fq0IKC 
 &"C
r*   c                j   t         r+t        j                  | j                  t	        |            }|S | j                         }t        j                  |t        j                        }|rt	        |      }t        j                  |      }t        j                  |j                  |j                  |j                  |j                  z   |j                  z
  |j                  |j                  z   |j                   z
        }t        j"                  ||       t        j$                  |       t'        |d       |S Nr  )r  r   _add_caret_annotr   JM_point_from_py	_pdf_pager   pdf_create_annotr=  pdf_annot_rectrc  r"  r#  r  r  r  r  r  rJ  JM_add_annot_id)r(   r'  r   r   r  r  s         r)   r  zPage._add_caret_annot8%  s    **DII7G7NOE  >>#D**41F1FGE$U+((/LLacc133:+<accADDj144>OP((2""5)E3'r*   Nc                V   | j                         }|r|n|}|r|n|}	t        |      }
t        |      }|j                  st	        t
              t        j                  |t        j                        }t        j                  |      }t        j                  |
j                  |
j                  |
j                  |j                  z   |j                  z
  |
j                  |j                  z   |j                   z
        }t        j"                  ||       t        j$                  }t        j&                  ||       |rt        j(                  ||       t+        |j-                         ||||	d      }t        j.                  t        j0                  |      t3        d      |       t        j4                  t        j0                  |      t3        d      |       t        j6                  |       t        j"                  ||       t        j&                  ||       t9        |d       t;        |      S )Nr   r  r  r  )r
  r	  r"  r   r  r#  r   r  r?  r  fz_make_rectr"  r#  r  r  r  r  r  PDF_ANNOT_IS_PRINTrq  pdf_set_annot_icon_namer  r%  rH  r   r  r|  rJ  r  r   )r(   r'  r(  rf   r  r  iconr   ufr  r  filebufr   r  r  r  s                   r)   _add_file_annotzPage._add_file_annotG%  s   ~~#YDhU#$W-!!^,,&&tU-L-LM  'qssACCqttadd):ACC!$$J<MN  *((!!%/))%6DHHJ2q!D5..u5x~sK&&u':':5'A8JCWYabu%  *!!%/s#U|r*   r  r   r   Fc                Z   d| }| j                         }|r|st        d      |r|s|}t        |      \  }}t        |      \  }}t        |      }t	        j
                  |      st	        j                  |      rt        t              t	        j                  |t        j                        }t	        j                  |      }|st	        j                  ||       nBt	        j                  |t        d      |       |r t	        j                  |t        d      |       t	        j                  ||       |dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  r|dk7  r t	        j                  |t        d      |       t	        j                   ||       |dkD  rt	        j"                  ||d |        t	        j$                  ||       t	        j&                  ||       |	r&|	D ]!  }t	        j(                  |t+        |             # |
rjt	        j,                  |t        d      t        d	             t	        j.                  ||       t1        |
      }t3        j4                  |t7        |
      |       |st9        |||||       t	        j:                  |       t=        |d
       t?        |      }|S )Nz<?xml version="1.0"?>
            <body xmlns="http://www.w3.org/1999/xtml"
            xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"
            xfa:contentType="text/html" xfa:APIVersion="Acrobat:8.0.0" xfa:spec="2.4">
            r  r  DSr   r  r.  r  FreeTextCalloutr  ) r
  r   r5  r  r   r  r  r  r  r>  r   rz  r|  r  r  rC  pdf_set_annot_quaddingrD  pdf_set_annot_border_widthr  pdf_add_annot_border_dash_itemrk  rH  pdf_set_annot_callout_styler7   r   JM_set_annot_callout_liner   r  rJ  r  r   )r(   r   r   r   r   r   rR  r  r  r[  calloutline_endrP  r  rS  richtextrZ  r   r   rV  rW  ntcolr  r  r   r  r  point_countr  s                                r)   _add_freetext_annotzPage._add_freetext_annotb%  sV   $ F	
 ~~LMM
%J+J7t+J7tD!$$Q'5+A+A!+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 F44UE!HEF y(4.(CT:UV--eX>g,K++E5>;O UE48Du%s#El
r*   c                `   t        | j                        }t        |      st        t              t        j                         }t        j                  |t        j                  d      |       t        j                  |      }t        j                  |t
        j                        }t        j                  |      }t        |      }t        j                  |j                         |      }t!        |      D ]  }	||	   }
t        |
      }t        j                  |j                         d|z        }t!        |      D ]  }|
|   }t        |      rt#        |      dk7  rt        t              t        j$                  t'        |      |      }t        j(                  ||j*                         t        j(                  ||j,                          t        j.                  ||        t        j0                  |t3        d      |       t        j4                  |       t7        |d       t9        |      S )Nr   r   r  r  )r   r   PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr   rm  r  rc  fz_invert_matrixr  r@  r   r7   rE  r%  rF  PySequence_Sizer!  r	  rG  r"  r#  r  rH  r  rJ  r  r   )r(   r   r   r  inv_ctmr   r  n0inklistr|  sublistn1rd  rZ  r  r'  s                   r)   _add_ink_annotzPage._add_ink_annot%  s   DII&%344nn  u||A<((-&&tU-@-@A''.	Y%%dhhj"5r 	2A1gGWB((QV<F2Y ;AJ'*oa.@A.E$&;<<001A!1DgN))&%'':))&%'':;   &1	2 	9hy&97Cu%s#U|r*   c                8   | j                         }t        j                  |t        j                        }t	        |      }t	        |      }t        j
                  |||       t        j                  |       t        |d       |j                  sJ t        |      S r  )
r
  r   r  r8  r	  pdf_set_annot_linerJ  r  r   r   )r(   r  r  r   r   r!   r
  s          r)   _add_line_annotzPage._add_line_annot%  s}    ~~&&tU-A-ABR R   1-u%s#U|r*   c                j   | j                         }t        |      dk  rt        t              t	        j
                  ||      }|D ]@  }t        |      dk7  rt        t              t        |      }t	        j                  ||       B t	        j                  |       t        |d       t        |      S )Nr   r  )r
  r7   r   MSG_BAD_ARG_POINTSr   r  r(  r	  pdf_add_annot_vertexrJ  r  r   )r(   r  r  r   r   r  r'  s          r)   _add_multilinezPage._add_multiline%  s    ~~v;?011&&tZ8 	5A"a' "455$Q'E&&ue4		5 	u%s#U|r*   c                   | j                         }g d}d}	t        j                  |t        j                        }
t	        |      }t        j
                  |      }t        j                  |
|       |rt        |      \  }	}t        j                  |j                         |	      }t        |	      D ]  }t        j                  |||           t        j                  t        j                  |
      t        d      |       |r|sJ t        j                  t        j                  |
      dt        j                   |             t        j"                  t        j                  |
      t        d      |       t        j$                  t        j                  |
      t        d      |       t        j&                  |
       t)        |
d       t        j*                  |
j,                        }
t        j.                  |
      }
t1        |
      S )N)r   r   r   r   r   r-  r   DAr   r  )r
  r   r  r   JM_quad_from_pyfz_rect_from_quadr  r5  rE  r%  rF  rG  rH  r   r  r}  r~  r|  rC  rJ  r  ll_pdf_keep_annotr   r   r   )r(   r	  r   da_strr  r   r   r   rW  rV  r   qr  rH  rZ  s                  r)   _add_redact_annotzPage._add_redact_annot%  s   ~~&&tU-C-CDD!##A&  */5KE4%%dhhj%8C5\ 8))#tAw78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                v   | j                         }t        |      }t        j                  |      st        j                  |      rt        t              t        j                  ||      }t        j                  ||       t        j                  |       t        |d       |j                  sJ t        |      S r  )r
  r  r   r  r  r   r  r  r  rJ  r  r   r   )r(   r   r  r   r  r   s         r)   _add_square_or_circlezPage._add_square_or_circle
&  s    ~~D!$$Q'5+A+A!+Dl++&&tZ8  *u%s#U|r*   c                   t        |      }t        |      }t        j                  |      st        j                  |      rt        t              | j                         }g d}t        |      }d }d }|t        |      v r||   }nt        |t              r|j                         }n}t        |t              r$t        j                  |      j!                         }nIt        |t"        t$        f      r|}n0t        |t&        j(                        r|j+                         }n|d   }t        j,                  |t        j.                        }	|ret        j0                  |      }
t        j2                  |
      }|j5                         |j7                         }}t9        |j:                  |z  |j<                  |z        }||z  }||z  }|j>                  |j@                  z   dz  }|jB                  |dz  z
  }|jD                  |dz  z
  }||z   }||z   }t        jF                  ||||      }t        jH                  |	|       t        jJ                  |	|       t        jL                  t        jN                  |	      tQ        d      t        jR                  d             t        jT                  |	d       nht        jH                  |	|       t        jL                  t        jN                  |	      tQ        d      tQ        |             t        jT                  |	|       t        jV                  |	       tY        |	d       t[        |	      S )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
  r7   rF  r>   r  r  r  rj  rk  
read_bytesr  rZ  r9   r[  rs  r  rA  r  fz_new_image_from_bufferr   r  r  rY  r  r  r  r"  r#  r  r  pdf_set_annot_stamp_imagerH  r   r  r+  rz  rJ  r  r   )r(   r   stampr  r   stamp_idrE   r  r   r   fzbuffr  r   r  scalerY  r  r:  r  r  r  r  s                         r)   _add_stamp_annotzPage._add_stamp_annot&  s   DzD!$$Q'5+A+A!+D\**~~  ME!HE?Dv&--/Cs#,,u%002Cy12Crzz*.."CA;D&&tU-B-BC99#>F008C 557CEEGqA

Qa8EIEYF gg'1,FEAI%BFQJ&BeBfB""2r2r2A$$UA.++E37u22598F;KUM_M_`lMmn((>$$UA.u22598F;KXVZ^\((5u%s#U|r*   c                r   | j                         }t        |      }t        j                  |t        j                        }t        j
                  |      }t        j                  |j                  |j                  |j                  |j                  z   |j                  z
  |j                  |j                  z   |j                  z
        }t        j                  ||       t        j                  ||       |rt        j                  ||       t        j                   |       t#        |d       t%        |      S r  )r
  r	  r   r  rB  r  r  r"  r#  r  r  r  r  r  rz  r  rJ  r  r   )r(   r'  r   r  r   r  r   r  s           r)   _add_text_annotzPage._add_text_annotZ&  s    ~~e$&&tU-A-AB  'qssACCqttadd):ACC!$$J<MN  *$$UD1))%6u%s#U|r*   c                    t        |        | j                  j                  st        d      t	        | ||      }|sy t        j                  |       |_        || j                  t        |      <   |S )Nr  )	ra  r   r  r   Page__add_text_markerr  r  r4  r5  )r(   r	  r  r  s       r)   _add_text_markerzPage._add_text_markerh&  s_    D{{!![))#D%<]]4(
$'C!
r*   c                n   t        |        t        r?t        j                  | j                  _        t        j                  | j                  |      S t        | j                        }t        |      }|dk  ryd}t        |t              st        d      t        j                  |j                         t        d            j                   s.t        j"                  |j                         t        d      |       t        j                  |j                         t        d            }|j                   sJ d|d|j                          t%        |      D ]  }||   }t'        |      }|st)        d|d	d
       &	 t        j*                  |j-                         t/        |j-                         |            }t        j0                  |j-                         t        j2                  |      d      }	t        j4                  ||	        y# t6        $ r# t8        r
t;                t)        d|d	d       Y w xY w)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.
)ra  r  r   Page_addAnnot_FromStringr  rb  r   r   r7   r>   r   r   r   r  r
  r  r   r  rF  JM_StrAsCharrr   r  r%  r,  r  r   r  rg   r  rv   )
r(   linklistr   lcountrZ  r  txtpyr   r   r$  s
             r)   rb  zPage._addAnnot_FromStringv&  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 	DAQKE&D9!Aa@AD,,dhhj:Mtxxz[_:`a00$((*e>N>NPU>VXYZ$$fg6	D  D'N,<9!AcBCDs   ;B
H)H43H4c                    | j                         }|j                         }t        ||||      }|j                  st	        d      t        |d       t        |      S )Nzcannot create widgetr	  )r
  r%  JM_create_widgetr   r   r  r   )r(   r  r  r   rT  r   s         r)   
_addWidgetzPage._addWidget&  sR    ~~hhj dJ
C 677s#U|r*   c                    | j                         }t        j                         }d|_        ||_        ||_        ||_        t        j                  |j                         ||      }|S r   )	r
  r   PdfRedactOptionsblack_boxesr   image_methodline_artpdf_redact_pager%  )r(   r   r 	  graphicsr   r  successs          r)   _apply_redactionszPage._apply_redactions&  sY    ~~%%'	" ''
D$?r*   c                    | j                          	 | j                  j                  |        d | _        d| _        d | _        d | _        y # t        $ r t	                Y 2w xY wr  )_reset_annot_refsr   r  rg   rv   r   rB  r   r.   s    r)   r   zPage._erase&  s]     	KK$$T* 	  		s   A
 
A A c                8   t        |       }t        j                  |j                         t        j                        }t        j                  |j                         t        j
                        }t        | j                        }t        j                  |||      S )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
  r4  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)r(   r   r  r  rT  s        r)   _count_q_balancezPage._count_q_balance&  s{     D!  HHJ))
 !!HHJ((
 t{{+ 55c3EEr*   c                z   ||dk(  ry | j                   }|j                  |d      }d|v sd|v st        d      i }| j                         D ]
  \  }}|||<    ||j	                         v r||   S d}d|d}||j                         v r|d	z  }d|d}||j                         v r| j                  ||       |S )
Nr   Trn  	/Type/OCGr\  zbad optional content: 'oc'MCr  r   )r   rq  r   _get_resource_propertiesr  r	  _set_resource_property)	r(   r  r%  checkpropsr  r"  rZ  mcs	            r)   _get_optional_contentzPage._get_optional_content&  s    :qkkt4u$(=9::113 	DAqE!H	9!AZELLN"FAaUB ELLN" 	##B+	r*   c                X    | j                         }t        |j                               }|S )z/
        page list Resource/Properties
        )r
  JM_get_resource_propertiesr
  )r(   r   r   s      r)   rx  zPage._get_resource_properties&  s%     ~~'
3	r*   c                v    	 t        j                  | j                  |||      }t	        j
                  |      }|S r,   )r  r   page_get_textpager   r   r  r  r  fz_bound_pager  r  _globalsr   fz_enable_device_hintsFZ_NO_CACHEr>   r   r   r   r   fz_run_pager  fz_close_device)r(   r  r  r  ll_tpagetpager   r  r   r  devs              r)   _get_textpagezPage._get_textpage&  s4    ..tyy$vNH%%h/ELr*   r  c                   t        j                         }| j                         }|j                         }|
}|}|}d}d}d}d}d}d}|dkD  rt        j                  ||d      }t        j
                  t        j                  |t        d      t        d                  }t        j
                  t        j                  |t        d      t        d                  }||z   dk(  rt        t              d}d}d}d}n)|rt        |      }d}n|rt        j                  |      }d}|rt|j                  }|j                         }|j                         }t        j                  |      }|} |j!                  | d       }!|!.|!}t        j                  |j                         |d      }d}d}d}n|j#                         dk(  r)t        j$                  |t        j&                               }"nt        j(                  |t        j*                         t        j*                         t        j,                  d       t        j.                         d      }#d|#_        d |#_        t        j$                  |#t        j&                               }$t        j$                  ||$      }"d}d}|rt        j2                         }%t4        rt        j6                  |%       n?t        j8                  |%j:                  j<                  |j:                  j>                         |rgt        |      }t4        rt        j6                  |%|       n?t        j8                  |%|j:                  j<                  |j:                  j>                         t        j@                  |%      }tC        |      } |j!                  | d       }!|!|!}t        j                  |j                         |d      }t        j
                  t        j                  |t        d      t        d                  }t        j
                  t        j                  |t        d      t        d                  }d}d}n9t        jD                  |      }"|"j                         }|"j                         }|sd}|rt        jF                  "      }&|&j:                  st        d      |"jI                         }'|"j1                         }(t        jJ                  |"      \  })}*t        jD                  |      }$t        jL                  |||'|(|)|*ddtO               tO               |&|$      }"|rAt        jP                  |"      }|	rtS        |||	       t        jT                  |      }|| <   d}|rst        jV                  |jY                         t        d            }+|+j:                  s.t        jZ                  |jY                         t        d      d	      }+t        j\                  |+t        d
            },|,j:                  s t        jZ                  |+t        d
      d	      },t_        |||||      }-t        j`                  |,|       t        jb                  d      }.dte        |-jf                  |-jh                  |-jj                  |-jl                  |-jn                  |-jp                  f       d| d}/t        jr                  |.|/       tu        ||jY                         |.|       |r||fS |d fS )Nr   r   Widthr	  Heightr4  z#uncompressed image cannot have maskr/  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_pixmap2r8   r  fz_new_image_from_pixmapFzImagefz_convert_pixmapr  FzDefaultColorspacesFzColorParamsr  FzMd5r   fz_md5_update_bufferfz_md5_updater   rz  r7   fz_md5_final2r  rQ  fz_compressed_image_bufferbpcfz_image_resolution$fz_new_image_from_compressed_buffer2r   pdf_add_imager  r   r3  r
  rL  r  calc_image_matrixr}  r  r   r!   r
  r  r  r[  r  fz_append_stringJM_insert_contents)0r(   rf   pixmapr	   imaskr  overlayrS  keep_proportionr  rY  r  r  r  _imgnamedigestsmaskbufr   rT  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}  imager  maskstatecbuf1r  r  xresyresr\  xobjectrq  nresrn  s0                                                   r)   _insert_imagez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                   | j                         }|j                         }t        |||||||||	|

      }t        j                  |j                         t        d            }|j                         s.t        j                  |j                         t        d      d      }t        j                  |t        d            }|j                  sNt        j                  |d      }t        j                  |j                         |t        d      t        d             t        |d      \  }}|st        d      t        j                  ||d      }t        j                   |||       |S )Nr/  r   r)  r   zcannot insert font)r
  r%  r?  r   r3  r
  r  ru  rL  r  r   rM  r  r9  r   r  r}  )r(   r   r  r@  rA  
set_simpler2  r
  r
  r  r  r   rT  r   r\  r-  r  r  font_objs                      r)   _insertFontzPage._insertFont'  s#   ~~hhjsFHZSRWY^`hjrs22488:x?TU	$$&//
H[<QSTUI""9hv.>?&&sA.E
E8K3H(SYJZ[eQ'4 455))#tQ7E8X6r*   c                z    | j                         }|dk(  rt        ||      }nt        ||      }|rt        |      S y r   )r
  JM_get_annot_by_nameJM_get_annot_by_xrefr   )r(   r   r  r   r   s        r)   _load_annotzPage._load_annot'  s?    ~~19(t4E(t4E< r*   c           	     N    t        || j                  |||||      }t        |      S r,   )JM_pixmap_from_pager   r  )r(   r%  r  r  r  r  r  r  s           r)   _makePixmapzPage._makePixmap'  s&    !#tyy#r5&$Oc{r*   c                   t        j                  t         j                  j                        }t        | j                  d      }|j
                  rNt        j                  |j                         |      }t        j                  |      rt        j                  |      }t        j                  |      ry t        |      S NFr%  )r   rc  rd  r   r   r   r   r
  r  pdf_to_rectr  rb  )r(   boxtyper   r   r
  s        r)   
_other_boxzPage._other_box'  s    ||U\\889DII6??%%txxz7;C!!#&((-$$d+t$$r*   Tc                0    t        | j                  |      S )Nr%  )r   r   )r(   r   s     r)   r
  zPage._pdf_page'  s    DII99r*   c                8    | j                   j                          y)z,Invalidate / delete all annots of this page.N)r4  rk  r.   s    r)   rp  zPage._reset_annot_refs'  s     r*   c                   |dk\  r|dk\  r|y t        t        t        |d      dz              }|dk\  rd}t        t        t        |d      dz              }|dk\  rd}d|d|d}|sy t        | j                        }t        j                  |j                         t        d            }|j                  s.t        j                  |j                         t        d      d      }t        j                  |t        d	            }	|	j                  s t        j                  |t        d	      d      }	t        j                  |	      }
t        |
      D ]6  }t        j                  |	|      }t        j                  |      }||k(  s4|c S  t        j                  |j!                         d
      }t        j"                  |t        d      |       t        j"                  |t        d      |       t        j$                  |	||       |S )Nr   r   rt  c   fitzca02dr/  r   r3  r   r0  r1  )r4   r  r  r   r   r   r  r
  r  r   rL  rv  rF  rx  rt  rM  r%  rN  r}  )r(   gstater0  r1  r~  tCAtcar   r\  r^  rE   rZ  r)  r   opas                  r)   _set_opacityz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''a0B$$R(Dv~		
   Q/Xd^R8Xd^R8D&#.r*   c           
        | j                   }|t        d      |j                  st        d      d}||vrt        d      t        |      }| j                  }t        |d   |j
                  |d   z
  |d   |j
                  |d   z
        }|j                  |j                  cxk  r|j                  cxk  r|j                  k  r>n n;|j                  |j                  cxk  r|j
                  cxk  r|j
                  k  sn t        | d	      |j                  | j                  |d
t        t        |             d       y )Nr
  r  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   r   r   z not in MediaBoxrh  ri  )r   r   r  r  ra  r  r  r  r  rj  r  r   r   )r(   r  r   r%  valid_boxesmbs         r)   _set_pageboxz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                Z    | j                         }t        |j                         ||       y r,   )r
  JM_set_resource_propertyr
  )r(   r   r  r   s       r)   ry  zPage._set_resource_property(  s     ~~ T48r*   c	                   t        |      }	t        |      }
|}t        | j                        }|j	                         }|j                         }t        |       t        ||||j                        }|st        j                  |      }t        j                  |d      }t        j                  |d|       t        j                  |d      }t        j                  |t        d      |       t        j                  d      }t        j                  |d       t        j                   ||	|
||      }|dkD  r t#        |t        j$                  |      |       t        j&                  |t        d            }|j(                  s t        j*                  |t        d      d      }t        j,                  |t        d            }|j(                  s t        j*                  |t        d      d      }t        j                  |||       t        j                  d      }t        j                  |d	       t        j                  ||       t        j                  |d
       t/        ||||       |S )Nr   fullpager     z/fullpage Dor   r/  r  z q /z Do Q )r  r  r   r   r
  r%  rH  JM_xobject_from_pager   r   rM  r}  rH  r  r  r  pdf_new_xobjectr  r  r3  r   rL  r  r  )r(   
fz_srcpager  r  r  r  r  r  r  rO  rq  rc_xrefr  tpagerefr  xobj1subres1subresr  xobj2r\  r  s                         r)   _show_pdf_pagezPage._show_pdf_page!(  s   !$''TYY'99;  %VZx}}M&&u-G $$VQ/GZ7##FA.68I#6@!!"%sN3%%fgsFCH6VU%?%?%FK 228Xk=RS	##//+9NPQRI##Ix	/BC  ,,Y8KQOFFHe4
 ""2&tV,tX.tX.68T7;r*   c                    t        |       }	 | j                  |      }|dk7  r| j                  |       	 t        |      }t	        | |       t        |d      sJ |S # |dk7  r| j                  |       w w xY w)zAdd a 'Caret' annotation.r   r   )annot_preprocessr  r  r   annot_postprocessr;   )r(   r'  old_rotationr   s       r)   add_caret_annotzPage.add_caret_annotZ(  s~    '-	0))%0Eq !!,/u$&x((( q !!,/ !s   A A5c                    t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)z*Add a 'Circle' (ellipse, oval) annotation.r   )r  r?  r   r7  r  r  r(   r   r  r   s       r)   add_circle_annotzPage.add_circle_annotg(  m    '-	0..tU5K5KLEq !!,/$& q !!,/ !    A A+c                    t        |       }	 | j                  ||||||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z"Add a 'FileAttachment' annotation.)r  r  r  r   )r  r  r  r  )	r(   r'  r(  rf   r  r  r  r  r   s	            r)   add_file_annotzPage.add_file_annotr(  s     (-
	0((' ) E q !!,/$& q !!,/ !s   A	 	A"r   r   r   rR  r  r  r[  r  r  rP  r  rS  r   rZ  c                   t        |       }	 | j                  |||||||||	|
||||||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)zAdd a 'FreeText' annotation.r  r   )r  r#  r  r  )r(   r   r   r   r   r   rR  r  r  r[  r  r  rP  r  rS  r   rZ  r  r   s                      r)   add_freetext_annotzPage.add_freetext_annot(  s    , (-	0,,%%))!-!-!#%#!%! - E& q !!,/$& q !!,/ !s   !A A,c                    |t        | |||      }nt        |      }| j                  |t        j                        }|S )zAdd a 'Highlight' annotation.r  r  r  )get_highlight_selectionCheckMarkerArgr\  r   PDF_ANNOT_HIGHLIGHT)r(   r	  r  r  r  r<  rG   s          r)   add_highlight_annotzPage.add_highlight_annot(  s@     ='E4PAu%A##Au'@'@A
r*   c                    t        |       }	 | j                  |      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)znAdd 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_annotzPage.add_ink_annot(  sg    
 (-	0''4Eq !!,/$& q !!,/ !s   A Ac                    t        |       }	 | j                  ||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)zAdd a 'Line' annotation.r   )r  r1  r  r  )r(   r  r  r  r   s        r)   add_line_annotzPage.add_line_annot(  sg    '-	0((R0Eq !!,/$& q !!,/ !   A Ac                    t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)zAdd a 'Polygon' annotation.r   )r  r5  r   r:  r  r  r(   r  r  r   s       r)   add_polygon_annotzPage.add_polygon_annot(  sm    '-	0''0G0GHEq !!,/$& q !!,/ !r  c                    t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)zAdd a 'PolyLine' annotation.r   )r  r5  r   r9  r  r  r  s       r)   add_polyline_annotzPage.add_polyline_annot(  sm    '-	0''0I0IJEq !!,/$& q !!,/ !r  c                    t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)z&Add a 'Square' (rectangle) annotation.r   )r  r?  r   r6  r  r  r  s       r)   add_rect_annotzPage.add_rect_annot(  r  r  c	                   d}	|rt        t        j                        j                  |      st	        |       t	        |       |sd}|sd}|sd}t        |d      r|||f}t        |      dkD  r|dd }d}
 |
j                  |||d}	|d	}|r't        |d      r|||f}t        |      dkD  r|dd }nd}t        |       }	 | j                  |||	||
      }|dk7  r| j                  |       	 t        | |       |r|j                         j                         dd }|\  }}}}}|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  d       dj                  |      }|j!                  |d       |S # |dk7  r| j                  |       w w xY w)zAdd a 'Redact' annotation.Nr  r  r~  rf  r   r  r  r   r   r   )r   r;  r  r   r   r  r  r  )r  r	  
whitespacer=	  rl  r;   r7   r  r  r=  r  r  r  r  rk   r  r+  )r(   r	  r   r   r   r  r   r   r  r;  r   r  r   r  r  r  r  r  r   r  s                       r)   add_redact_annotzPage.add_redact_annot(  s    F--.99$?tz"!&
z;/(*jA
:"'^
5CSZZx8DF| 4- $-Dt9q=8DD'-	0**4d6" + /E q !!,/$& \\^..0"5F &Ar2r2MM"MM"MM"MM"MM"MM$F#BLLQ# q !!,/ !s   F0 0G	c                |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'Squiggly' annotation.r  )r  r  r\  r   PDF_ANNOT_SQUIGGLYr(   r	  r  r  r  r<  s         r)   add_squiggly_annotzPage.add_squiggly_annot=)  s<     ='E4PAu%A$$Q(@(@AAr*   c                    t        |       }	 | j                  ||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z$Add a ('rubber') 'Stamp' annotation.r   )r  rW  r  r  )r(   r   rS  r  r   s        r)   add_stamp_annotzPage.add_stamp_annotK)  sg    '-	0))$6Eq !!,/$& q !!,/ !r  c                |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'StrikeOut' annotation.r  )r  r  r\  r   PDF_ANNOT_STRIKE_OUTr  s         r)   add_strikeout_annotzPage.add_strikeout_annotV)  s:    ='E4PAu%A$$Q(B(BCCr*   c                    t        |       }	 | j                  |||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z&Add a 'Text' (sticky note) annotation.)r  r   )r  rY  r  r  )r(   r'  r   r  r  r   s         r)   add_text_annotzPage.add_text_annot^)  sl    '-	0((4(@Eq !!,/$& q !!,/ !s   A Ac                |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'Underline' annotation.r  )r  r  r\  r   PDF_ANNOT_UNDERLINEr  s         r)   add_underline_annotzPage.add_underline_annoti)  s:    ='E4PAu%A$$Q(A(ABBr*   c                   t        |        | j                  }|j                  st        d      |j	                          | j                  |j                  |j                        }|syd|_        t        j                  |       |_        || j                  t        |      <   |j                  |_        ||_        |j                          |S )zAdd a 'Widget' (form field).r  NT)ra  r   r  r   r  re  r  r  r   r  r  r4  r5  r  r
  )r(   r8  r%  r   s       r)   
add_widgetzPage.add_widgetq)  s    Dkkzz[)) 1 163D3DE}}T*&+E#r*   c                p    	 t        |        | j                  d      }|j                  sg S t        |      S )z.
        page get list of annot names
        Fr%  )ra  r
  r   JM_get_annot_id_listr(   r   s     r)   annot_nameszPage.annot_names)  s6     	>D~~u~-I#D))r*   c                    t        |       S )zH
        List of xref numbers of annotations, fields and links.
        )JM_get_annot_xref_list2r.   s    r)   r  zPage.annot_xrefs)  s     't,,r*   c              #    K   t         j                  t         j                  t         j                  f}t	        |d      s)| j                         D cg c]  }|d   |vs|d    }}n0| j                         D cg c]  }|d   |v s|d   |vs|d    }}|D ]  }| j                  |      }d|_        |   yc c}w c c}w w)a   Generator 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_POPUPr0  r;   r  
load_annot_yielded)r(   types
skip_typesr!   r  r  r   s          r)   r  zPage.annots)  s      **E,A,A5CYCYZ
um,)-)9)9);VAqt:?U1Q4VKV)-)9)9);hAqtu}QRSTQU]gQg1Q4hKh 	DOOD)EENK	 Whs0   ACB;B;$C9C C C 0Cc           	     (   d }t        |        | j                  }|j                  s|j                  rt	        d      |j
                  st	        d      g }| j                  t        j                  f      D ]!  }|j                  |j                                # |g k(  ry| j                  |||      }|st	        d      | j                         }	|D ]  }
|
d   }|
d   }|r$|	j                  |       |	j                  ||	       d
|
j                         v sF|
d
   }|
j!                  dd      }|
d   }|
d   }|
d   } |||||      }d}|dk  s|dk\  s|	j#                  ||||||      }|dz  }|dk  s|dk\  r( |	j%                          y)aD  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                   |r| j                   t        k  r| S 	 t        |||      }|dz  }| j                   }t        j                  ||z        |z  }|| j                  k\  r| S | }| j                  j                  | j                  j                  z   |z
  dz  }	|	|_        |S # t        t        j
                  f$ r t        r
t                | cY S w xY w)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?      ?)rY  r?  get_text_lengthr   r   FzErrorBaser  rv   r
  ceilr  r  r#  blr  )

annot_rectnew_textrT  r  
text_widthline_heightr  r  r  r#  s
             r)   center_rectz*Page.apply_redactions.<locals>.center_rect)  s      z//7:!!",XtUC

  #+K$$E		*u,-;AJ%%%!!A:==??2Q6#=AADH  1 12 "'"$!!"s   B! !+CCr$  r  )r3  FzError applying redactions.r   r   )r   r  r   r  r   r   r   r   r  rG  )r   r   r  r  r8  T)ra  r   r  r   r   r  r  r   r   rk   r  rn  	new_shape	draw_rectfinishr  r8   insert_textboxcommit)r   r 	  rl  r   rA  r%  redact_annotsr   r   shaperedactr=  r   r>  r  r  r  r  trects                      r)   r	  zPage.apply_redactions)  s   0 	D 	Dkks}};<<zz[))[[))+ ! 
 	=E   !9!9!;<		= B##D&(;9::  # 	!FJ&>D
+$d3&!&>

7A.z*z*|,#J%G1f!-- !&!&## . B SLE 1f!!	!6 	r*   c                    |dvrt        d      t        | j                        }t        j                         }||_        t        j                  |      }t        j                  || j                  |       y)zbConvert colorspaces of objects on the page.
        
        Valid values are 1, 3 and 4.
        rg  z!components must be one of 1, 3, 4N)	r   r   r   r   pdf_recolor_optionsnum_compPdfRecolorOptionspdf_recolor_pagerB  )r(   r  pdfdocroptroptss        r)   r  zPage.recolor*  sa    
 Y&@AA!$++.((*"''-vt{{E:r*   c                    t        |      }|j                  s|| j                  z  j                  rt	        d      || j
                  z  }t        |       }t        |      }t        j                  ||       y)z-Clip away page content outside the rectangle.z"rect must not be infinite or emptyN)
r  r  r   r  r   rf  r   r  r   pdf_clip_page)r(   r   r  r  pclips        r)   clip_to_rectzPage.clip_to_rect"*  se    Dztyy 0::ABB***t$%GU+r*   c                P    | j                   yt        syt        |       }|| _         y)z!Try to access layout information.N)layout_informationr   )r(   layout_infos     r)   
get_layoutzPage.get_layout,*  s+     "".!$'"-r*   c                    | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )z
The ArtBoxr  r   r   r   r   r  rO  ra  r  r  r(   r   r  s      r)   artboxzPage.artbox:*  s[     x(<<<]]DGRUUT!W_d1gruutAwGGr*   c                    | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )zThe BleedBoxr  r   r   r   r   r\  r]  s      r)   bleedboxzPage.bleedboxC*  s[     z*<<<]]DGRUUT!W_d1gruutAwGGr*   c                   t        |        t        | j                        }t        j                  |      }t        |      }|j                  r| j                  j                  rv| j                  }|j                  |j                  }}| j                  dvr||}}t        dd||      }t        j                  d      j                         d   }t!        |       |S )zGet page rectangle.r      r   F)r	  r  )ra  r   r   r   r  r  r  r   r  rO  rY  r  rL  r  mupdf_warningsr  rr   )r(   r   r  cbr   r  r   s          r)   boundz
Page.boundL*  s    D499%!!$'3i??t{{11B88RYYqA}}H,!1q!Q"C&&U&3>>@DCCL
r*   c                    |s| j                   s| j                          t        | j                  d      }|j                  sy t        d|      }t        j                  |j                         ||       y )NFr%  r   )r  r  )	
is_wrappedwrap_contentsr   r   r   r  r   pdf_filter_page_contentsr%  )r(   r  r   r  s       r)   r  zPage.clean_contents^*  sU     TYY7(XF&&
D'Br*   c                    t        |        | j                  d      }|j                  s t        j                  | j
                        }nt        |j                               }t        |      }|S )zThe CropBox.Fr%  )	ra  r
  r   r   r  r   rN  r
  r  )r(   r   r  s      r)   rO  zPage.cropboxg*  sU     	D~~u~-%%dii0CTXXZ(C3i
r*   c                .    | j                   j                  S r,   )rO  r  r.   s    r)   cropbox_positionzPage.cropbox_positiont*  s    ||r*   c                   t        |        t        |       | j                         }	 t        |j                        }|sn!t	        j
                  ||j                         9t	        j                  |j                        }t	        j
                  ||j                         t        |      }|rCd|_        t        j                  |       |_        ||j                  j                  t        |      <   |j                          |S )z!Delete annot and return next one.T)ra  r
  r  r   r   r  r1  r   r   r  r  r   r4  r5  r   )r(   r   r   r  	nextannotr  s         r)   delete_annotzPage.delete_annotx*  s    DE~~)%**5I""48  ((4	tUZZ0ICK t,CJ.1CJJ""2c7+
r*   c                l    t        t        dd      }|j                          | j                  ||       y)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_imagezPage.delete_image*  s/     V\1-4,r*   c                    t                t        t              sy fd}t         j                  d      }|j
                  s |       S t           }|dk  r |       S t        j                  |j                         t        d            }|j
                  s |       S t        j                  |      }|dk(  r |       S d}t        |      D ]2  }t        j                  t        j                  ||            }||k(  s2 n ||k7  r |       S t        j                  |       t        j                   |j#                         |       t        j$                  |j                         t        d      |       t'        |        |       S )zDelete a Link.Nc                     d   dk(  ry 	 d   } j                   |    }|j                          y # t        $ r t        dkD  r
t	                Y y w xY w)Nr  r   r5  r   )r4  r   rg   r  rv   )linkidlinkobjlinkdictr(   s     r)   finishedz"Page.delete_link.<locals>.finished*  sY    1$f!$**62  '!+0@s   $1 AAFr%  r   r  r   )ra  r>   r5   r   r   r   r   r   r  r
  r  r  rF  r   r  r  r8  r%  rH  r	  )	r(   rz  r{  r   r  r  r  oxrefrZ  s	   ``       r)   r	  zPage.delete_link*  sG   D8T*		 DII6:%!8:##TXXZ(1CD  :""F+19: 	A$$e&9&961&EFEu}	
 5=:*T2DHHJ(:FC$zr*   c                   t        |        t        |dd      }|t        d      |j                  }| j	                  |       d|j
                  _        t        |j                  j                               }|D ]  }|j                  |=  |S )z0Delete widget from page and return the next one.r  Nzbad type: widget)
ra  r   r   r9  rp  r  r   r   r.
  r  )r   r8  r   
nextwidgetkeylistr  s         r)   delete_widgetzPage.delete_widget*  s    D$/=/00[[
% #v++-. 	%C$	%r*   c                .   t         r(t        t        j                  | j                              S | j                  d      }|j                  s6t        t        j                  t        j                  j                              S t        t        |            S )zReflects page de-rotation.Fr%  )r  rp  r   Page_derotate_matrixr   r
  r   r   rc  UNITr  )r(   r  s     r)   rg  zPage.derotation_matrix*  si     %44dii@AA..%.0!!%,,u||'8'89::-g677r*   r+  c                    | j                         }|j                  t        |      t        |      t        |      t        |            }|j                  |||||||	|
|||       |j	                  |       |S )zODraw a general cubic Bezier curve from p1 to p4 using control points p2 and p3.r  r   r[  rY  lineCaplineJoinr  	closePathstroke_opacityfill_opacityr  )rB  draw_bezierr  rD  rF  )r   r  r  p3p4r  r   r[  rY  r  r  r  r  r  r  r  r  r  r   s                      r)   r  zPage.draw_bezier*  sy    ( nnOOE"IuRy%)U2YG

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

7r*   c                    | j                         }|j                  t        |      |      }|j                  ||||||	||||
       |j	                  |
       |S )*Draw a circle given its center and radius.
r  r   r[  rY  r  r  r  r  r  r  )rB  draw_circler  rD  rF  )r   r:  radiusr  r   r  r[  rY  r  r  r  r  r  r  r  r   s                   r)   r  zPage.draw_circle+  sf    " nnOOE&M62

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

7r*   c                    | j                         }|j                  t        |      t        |      t        |            }|j                  |||||
|||	|||       |j	                  |       |S )zdDraw a special Bezier curve from p1 to p3, generating control points on lines p1 to p2 and p2 to p3.r  )rB  
draw_curver  rD  rF  )r   r  r  r  r  r   r[  rY  r  r  r  r  r  r  r  r  r  r   s                     r)   r  zPage.draw_curve)+  ss    & nnNN59eBir;

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

7r*   c                    | j                         }|j                  t        |      t        |            }|j                  |||d|||	|
||
       |j	                  |       |S )z&Draw a line from point p1 to point p2.F
r  r[  rY  r  r  r  r  r  r  r  )rB  	draw_liner  rD  rF  )r   r  r  r  r[  rY  r  r  r  r  r  r  r  r  r  s                  r)   r  zPage.draw_lineO+  sj      nnMM%)U2Y/

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

7r*   c                    | j                         }|j                  |      }|j                  ||||||||
||
       |j                  |	       |S )z4Draw an oval given its containing rectangle or quad.r  )rB  	draw_ovalrD  rF  )r   r   r  r   r[  r  rY  r  r  r  r  r  r  r  r   s                  r)   r  zPage.draw_ovalq+  s`      nnMM$

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

7r*   c                    | j                         }|j                  |      }|j                  ||||||||
|||       |j                  |	       |S )z&Draw multiple connected line segments.r  )rB  draw_polylinerD  rF  )r   r  r  r   r[  rY  r  r  r  r  r  r  r  r  r  r   s                   r)   r  zPage.draw_polyline+  se    " nnf%

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

7r*   c                    | j                         }|j                  t        |            }|j                  ||||||||
||
       |j	                  |	       |S )zDraw a quadrilateral.r  )rB  	draw_quadQuadrD  rF  )r   r	  r  r   r[  rY  r  r  r  r  r  r  r  r  r   s                  r)   r  zPage.draw_quad+  sd      nnMM$t*%

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

7r*   c                    | j                         }|j                  t        |      |      }|j                  ||||||||
||
       |j	                  |	       |S )zG
        Draw a rectangle. See Shape class method for details.
        r  r  )rB  rC  r  rD  rF  )r   r   r  r   r[  rY  r  r  r  r  r  r  r  r  r  r   s                   r)   rC  zPage.draw_rect+  sh    & nnMM$t*VM4

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

7r*   c                    | j                         }|j                  t        |      t        |      ||      }|j                  ||||	||||
|||       |j	                  |       |S )a  Draw 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  )rB  draw_sectorr  rD  rF  )r   r:  r'  betar  r   r[  r  r  rY  r  r  r  r  r  r  r  r  r   s                      r)   r  zPage.draw_sector+  ss    6 nnOOE&M5<*OU

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

7r*   c                    | j                         }|j                  t        |      t        |      |      }|j                  |||d|||
|||
       |j	                  |	       |S )z/Draw a squiggly line from point p1 to point p2.breadthFr  )rB  draw_squiggler  rD  rF  r   r  r  r  r  r[  rY  r  r  r  r  r  r  r  r  r  s                   r)   r  zPage.draw_squiggle,,  sq    " nneBirGD

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

7r*   c                    | j                         }|j                  t        |      t        |      |      }|j                  |||d|||
|||
       |j	                  |	       |S )z-Draw a zigzag line from point p1 to point p2.r  Fr  )rB  draw_zigzagr  rD  rF  r  s                   r)   r  zPage.draw_zigzagO,  sn    " nnOOE"IuRy'OB

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

7r*   c                b   | j                   }|j                   }t        |t        j                        sJ t        j                         }||_        t        |      }t        j                  ||      }t        j                  |||t        j                                t        j                  |       y r,   )r   r>   r   r  r  r  r  r  r  r  r  )	r(   r  r  r  r   r  r  r  r  s	            r)   extend_textpagezPage.extend_textpager,  s    yyZZ2u00111&&('nnR)4c5>>+;<s#r*   c                .    t        j                  | fi |S r,   )tablefind_tables)r(   r  s     r)   r  zPage.find_tables},  s      000r*   c                &   t        |        | j                  d      }|j                  syt        j                  |      }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   |S )zFirst annotation.Fr%  NT)ra  r
  r   r   pdf_first_annotr   r   r  r  r   r4  r5  )r(   r   r   r  s       r)   first_annotzPage.first_annot,  s{     	D~~u~-%%d+El]]4(
$'C!
r*   c                "    | j                         S )z$
        First link on page
        )
load_linksr.   s    r)   
first_linkzPage.first_link,  s    
   r*   c                n   t        |        d}| j                  d      }|j                  syt        j                  |      }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   t               }t        j                  ||       |}|S )zFirst widget/field.r   Fr%  NT)ra  r
  r   r   pdf_first_widgetr   r   r  r  r   r4  r5  r6  r  r7  )r(   r   r   r  r8  s        r)   first_widgetzPage.first_widget,  s     	D~~u~-&&t,El]]4(
$'C!3'
r*   c                n   t        |        | j                  }|dk7  r| j                  d       | j                  }g }|rdnd}t	        ||      }t        j                  ||t        j                         t        j                                t        j                  |       |dk7  r| j                  |       |S )Nr   TF)
ra  rL  r  r   JM_new_bbox_devicer   r  rm  r  r  )r(   layersr  r   r   
inc_layersr  s          r)   get_bboxlogzPage.get_bboxlog,  s    D}}1a yy#T
 "j14enn&68HIs#1l+	r*   c                   t        |        | j                  }|dk7  r| j                  d       | j                  }t	        |t
        j                        rt        j                  |      }t	        |t
        j                        sJ d| j                         |rdnd}t        j                  |      }	 t        j                  ||||      }|dk7  r| j                  |       t        |      s|y|S )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFN)ra  rL  r  r   r>   r   r   r   r  r  r   get_cdrawingsr   callableJM_new_lineart_device_Devicerm  r  ptmr  r  r  )
r(   extendedcallbackmethodr  r   clipsprectr   r  s
             r)   r  zPage.get_cdrawings,  s    D}}1a yydEMM*<<%D$->*$))>- e##D)$$T8XvFB 1l+H!3	r*   c                   t        |        g }t        | j                        }|j                         }t	        j
                  |t        j                        }t	        j                  |      rct	        j                  |      }t        |      D ]>  }t	        j                  ||      }t	        j                  |      }|j                  |       @ |S |j                  r&t	        j                  |      }|j                  |       |S )zGet xrefs of /Contents objects.)ra  r   r   r
  r   r  rr  r  r  rF  r  r   rk   r   )	r(   rG   r   r
  rb  rE   rZ  icontr  s	            r)   r	  zPage.get_contents,  s    DDII&hhj%%c5+G+GHh'##H-A1X !++Ha8''.

4 ! 
   ##H-DJJ
r*   c                    t        |        |r*t        j                  | j                        }t        |      S t        j                  | j                        }t        |      S )z|
        Make a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.
        )ra  r   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsr  )r(   r  r  s      r)   get_displaylistzPage.get_displaylist,  sO     	D44TYY?B 2 ==diiHB2r*   c                h   d}| j                  |      }t        t        |            D ]   }||   }|d   j                  d      st	        |d         |d<   nt	        |d         |d<   |d   dk7  r|d   }g }|D ]  }|d	   }	|d
d }
|	dk(  r#dt	        |
d	         j                         |
d
   f}n<|	dk(  rdt        |
d	         f}n&t        |	g|
D cg c]  }t        |       c}z         }|j                  |        ||d<   |d   dv r|D ]  }|j                  |      ||<    ||<    |S c c}w )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   r  rY  r  r  r[  r  r  even_odd)r  r   r  r   scissorrs  rB   r   r   Nrr  qur  )r  rF  r7   r3   r  	normalizer  r   r  rk   r8   object)r(   r  allkeysr  rZ  npathrB   newitemsrC   cmdrestr  DrawpathDrawpathlistget_linearts                  r)   get_drawingszPage.get_drawings,  so      ( 3s3x 	AFE=++F3 $U6] 3f#'i(8#9i V}g%g! 	*Dq'C8Dt $d47m&=&=&?aI $d47m4$cU-E1eAh-E%EFOOD)	* "*gV}
*  ,A$yy|E!H, CF1	2 
 .Fs   D/c                   | j                   }|r|j                  rd}|j                  sd}t        | dd      }|r|s|S |s2| j                  t              }|j                  |      }~|r|| _        |r|j                  s|S | j                         }i }|D ]#  }|d   }	t        ||	      }
|	||
j                  <   ~
% t        t        |            D ]&  }||   }|j                  |d   d      }	|	|d	<   |||<   ( |S )
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  rF  r7   r8   )r   r  r:  r%  imginfor  imglistr  rC   r  r  rZ  s               r)   get_image_infozPage.get_image_info-  s    kkSZZFzzE$t45N"")=">B''v'6G#* CJJN//# 	D7Dd#C"&GCJJ		
 s7|$ 	A1:D;;tH~q1DDLGAJ		
 r*   c                P   t        |      t        t        fv r|d   }nkt        |      t        u r|}nW| j	                         D cg c]  }|d   |k(  s| }}|g k(  rt        d      t        |      dk7  rt        d      |d   d   }t        | j                  |      }|j                  }~| j                  d      }|s&|D 	cg c]  }	|	d   |k(  st        |	d	          }
}	|
S |D 	cg c]&  }	|	d   |k(  rt        |	d	         t        |	d
         f( }
}	|
S c c}w c c}	w c c}	w )a  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  r*  r  )r   r   r   r4   r  r   r7   r  r   r  r  r  rp  )r   r   r  r  rZ  r  r  r  infosimbboxess              r)   get_image_rectszPage.get_image_rects-  sD    :$&7D$Z3D"&//"3DQqtt|qDGD"} !122W" !=>>1:a=DT[[$'##4#016Q2"X,&:Pd2f:&QFQ   h<6) bj!6"[/#:;F 
 % E Rs   DDDD*+D#c                    | j                   j                         }|sy|j                          t        j                  | j
                  |      S )zReturn the label for this PDF page.

        Args:
            page: page object.
        Returns:
            The label (str) of the page. Errors return an empty string.
        r\   )r   r  r  r  rv  rB  )r   rs  s     r)   	get_labelzPage.get_label.  s<     --/""4;;77r*   c                   t        |        | j                  }g }|r@t        j                  || j                        }|j                  |       |j                  }|r@|g k7  r| j                  j                  rzt        |       D cg c]  }|d   t        j                  k(  r| }}t        |      t        |      k(  r5t        t        |            D ]  }||   d   ||   d<   ||   d   ||   d<     |S c c}w )z~Create a list of all links contained in a PDF page.

        Notes:
            see PyMuPDF ducmentation for details.
        r   r   r  r   r5  )ra  r  r  r  r   rk   r9  r  r.  r   r  r7   rF  )r   lnrq  nlr"  	linkxrefsrZ  s          r)   ra  zPage.get_links.  s     	D__""2t{{3BLLB  B;4;;-- ,D1q tu333  I 
 9~U+s9~. 5A'0|AE!HV$%.q\!_E!HTN5 s   C3r{  c               ~   |t         }|r|dz  }t        ||      }t        |      t        u r:|j	                         dk(  rt
        }n |j	                         dk(  rt        }nt         }|j                  dvrt        d      | j                  |      }|j                  ||||      }	d}|r|	j                  ||       |	S )	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  r  r  rg  zunsupported colorspace)r  )r  r  r  r  )r  rp  r   r  r.	  r  r  rE   r   r  r  r  )
r   r  r  r  r  r  r  rN  r  r  s
             r)   r  zPage.get_pixmap..  s    ( J8DD$'F
s"!V+#
!!#v-#
"
<<y(566!!!0mm6jTXmYKKS!
r*   c           	     x   | j                   }|dk(  rt        S | j                  }|dk(  rBt        dddd|j                  |j
                  z
  |j                  z
  |j                  z
  d      }nq|dk(  rBt        ddddd|j
                  |j                  z
  |j                  z
  |j                  z
        }n*t        ddddd|j                  z  d|j                  z        }|| j                  z  }t        t        |            dz   }|j                  d      }t        j                  | |d      }|d	v r4|\  }}}	}
||_        ||_        |
|_        |	|_        | j                  |       | j                  d       | }| j!                         D ]"  }|j"                  |z  }|j%                  |       $ | j'                         D ]2  }|d
   |z  }| j)                  |       ||d
<   	 | j+                  |       4 | j/                         D ](  }|j"                  |z  }||_        |j1                          * |S # t,        $ r Y }w xY w)z;Set page rotation to 0 while maintaining visual appearance.r   r  r     r  z cm r	  Fr  r  rJ  )rL  r}  ra  rp  r  r  r  r  rg  r   r   r  r  _insert_contentsset_mediaboxr  r  r   r  ra  r	  insert_linkrg   r  r
  )r(   rO  r  mat0rq  r  r  r  r  r  r  r   r  r  r8  s                  r)   remove_rotationzPage.remove_rotationY.  s%   mm!8 ]]"9!Q1beebeembee&;bee&CQGDCZ!Q1a)>)FGD!Q1b255j"ruu*=D T+++c
#f,jj ""4e4 )NBBBEBEBEBEb!!d[[] 	E

S ANN1	 NN$ 	DVs"AT"DL  &	 lln 	Fc!AFKMMO	 
  s   H--	H98H9c                   t        |        | j                  }|t        |      }|||| j                         }fd}|D cg c]u  }	 |d   j                  |j                  k\  rV|d   j
                  |j
                  k  r:|d   j                  |j                  k\  r|d   j                  |j                  k  r|w }	}t        |	D cg c]  }|d   	 c}d       }
g }|
r|
d   }d}|rYd}t        t        |
      dz
  dd	      D ]8  } ||
|   |      s||
|   j                  z  }||
|   j                  z  }|
|= d}: |rY|j                  |       |
d= t        t        |
      d
       }
|
rt        t        |      d       }|s|S |D cg c]$  }|j                  kD  s|j                   kD  s#|& c}S c c}w c c}w c c}w )a  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                   | j                   | j                  kD  r| j                  | j                   fn| j                   | j                  f\  }}| j                  | j                  kD  r| j                  | j                  fn| j                  | j                  f\  }}|j                   |j                  kD  r|j                  |j                   fn|j                   |j                  f\  }}|j                  |j                  kD  r|j                  |j                  fn|j                  |j                  f\  }}		 ||
z
  k  s||
z   kD  s||z
  k  s||	z   kD  ryy)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_neighborsz,Page.cluster_drawings.<locals>.are_neighbors.  s
    02uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFFFW,,FW,,FW,,FW,,  r*   r   r   c                2    | j                   | j                  fS r,   r  r  r  s    r)   rY	  z'Page.cluster_drawings.<locals>.<lambda>.  s    144, r*   r{	  r   TFr  c                2    | j                   | j                  fS r,   r  r  s    r)   rY	  z'Page.cluster_drawings.<locals>.<lambda>.  s    add| r*   c                2    | j                   | j                  fS r,   r  r  s    r)   rY	  z'Page.cluster_drawings.<locals>.<lambda>.  s    !$$ r*   )ra  r   r  r  r  r  r  r  r
  rF  r7   r  r  rk   r  rY  r  )r(   r  drawingsx_tolerancey_tolerancefinal_filterparear  r  pathsprects	new_rectsr  repeatrZ  r  r  s                  @@r)   cluster_drawingszPage.cluster_drawings.  s   0 	D		JE((*H	: 
&	(&	(&	(&	( 
 
 E2q628NO	
 
AFs6{Q26 &A$VAY2VAY\\)VAY\\)"1I!%&  Qq	CK-CDF   3y>/EF	$Qa'(9ahh>PQQK
 34 Rs   A:GGG+G;Gc                f    t        |        | j                  j                  | j                  |      S )z)List of fonts defined in the page object.r	  )ra  r   rn  rB  r(   rm  s     r)   	get_fontszPage.get_fonts.  s(    D{{))$++D)AAr*   c           	     f   t        |        | j                  }|j                  s|j                  rt	        d      t        dddd      }t               }|r||f}n|}t        |      t        t        fv r"t        |d         t        urt	        d      |}ne|j                  | j                  d      D cg c]  }||d   k(  s| }	}t        |	      dk(  r|	d   }n|	g k(  rt	        d      t	        d	| d
      |d   }
|
dk7  s|r	 | j                  ||      d   S | j#                         }t%        |      }t'        |      s|S |D ]  }|d   |d   k7  rt)        |d         }|j*                  }|dk(  r|} |}|S t        t-        |j.                  |j0                              }t3        |j.                  |j4                  z
        }t3        |j6                  |j4                  z
        }t        d|z  ddd|z  dd      }||z   }||f} |}|S  |}|S c c}w # t        $ r t!                |cY S w xY w)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 'rX  )r  )ra  r   r   r  r   r  rp  r   r   r   r4   rq  rB  r7   r  rg   rv   r
  JM_image_reporterr   r  r   util_hor_matrixlllrr  r  ur)r(   r   r  r%  inf_rectnull_matr   rC   rZ  r  r  r  r  rF   r<  r*  hmr  r   m0r{  s                        r)   get_image_bboxzPage.get_image_bbox.  sT    	Dkk==C,,;<<1b"%8H%BB:$&R>S( !DEED"%"5"5dkk4"HYQDTUVWTXLqYGY7|q qzB !122 #@b!IJJBx19	 ++DI+FqII >>#)Cy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   3HHH H0/H0c                f    t        |        | j                  j                  | j                  |      S )z*List of images defined in the page object.r	  )ra  r   rq  rB  r  s     r)   r  zPage.get_images7/  s(    D{{**4;;T*BBr*   c                    g }| j                         D ]E  \  }}| j                  j                  |d      }d|v rd}nd|v rd}n2|j                  |||f       G |S )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.
        Trn  rv  r  r\  ocmd)rx  r   rq  rk   )r(   r   pnamer  r   octypes         r)   get_oc_itemszPage.get_oc_items</  su     88: 	-KE4;;**4D*ADd"%IIudF+,	- 	r*   c                   t        |        t        j                  | j                        }t	        |      }|}|dk(  rt        j
                  nt        j                  }t        j                  ||      }t        j                  d      }t        j                  |      }t        j                  ||j                  |j                  z
  |j                  |j                  z
  |d      }	t        j                  | j                  |	|t        j                                 t        j"                  |	       |j%                          t'        |      }
|
S )zMake SVG image from page.r      )ra  r   r  r   r  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr  r  r  fz_new_svg_devicer  r  r  r  r  r  r  r  r"
  )r(   r  text_as_pathra  r  tboundstext_optionr  r  r  r   s              r)   get_svg_imagezPage.get_svg_imageO/  s    D&&tyy1'3?13De//%JcJc))'37!!$'nnS!%%

7::%

7::% 	$))S#u~~/?@c"%c*r*   c                    |}|| j                         }nt        |d      | k7  rt        d      |j                  |      }|~|S )Nr   not a textpage of this page)r  r   r   extractTextbox)r   r   r  r  r   s        r)   r  zPage.get_textboxg/  sU    
 :""$BR"d*:;;t$	r*   c                4    t        j                  | g|i |S r,   r  r  s      r)   r  zPage.get_textv/  r  r*   c                4    t        j                  | g|i |S r,   )r  get_text_blocksr  s      r)   r@  zPage.get_text_blocksy/  s    $$T;D;F;;r*   c                4    t        j                  | g|i |S r,   )r  get_text_selectionr  s      r)   rB  zPage.get_text_selection|/  s    ''>t>v>>r*   c                4    t        j                  | g|i |S r,   )r  get_text_wordsr  s      r)   rD  zPage.get_text_words/  s    ##D:4:6::r*   c                4    t        j                  | g|i |S r,   )r  get_textpage_ocrr  s      r)   rF  zPage.get_textpage_ocr/  s    %%d<T<V<<r*   c                V   t        |        |t        dd      }| j                  }|dk7  r| j                  d       	 | j	                  |||      }|dk7  r| j                  |       	 t        |      }t        j                  |       |_        |S # |dk7  r| j                  |       w w xY w)Nr   r   )r  r  )	ra  rp  rL  r  r  r   r  r  r   )r(   r  r  r  r  r  s         r)   r  zPage.get_textpage/  s    D>Aq\F}}1a 	0))$eF)KHq !!,/H%!---	 q !!,/ !s   B B(c                   t        |        | j                  }|dk7  r| j                  d       | j                  }g }	 t        j                  |      }t        j                  |      }t        j                  ddddd|j                        |_        t        j                  ||t        j                         t        j                                t        j                  |       |dk7  r| j                  |       |S Nr   r   r  )ra  rL  r  r   r  r   JM_new_texttrace_devicer   r  rm  r  r  r  r  r  )r(   r  r   r   r  r  s         r)   r	  zPage.get_texttrace/  s    D}}1a yy//3C ##D)..Aq"a:$U^^%5u~~7GHc"1l+	r*   c                b    t        |        | j                  j                  | j                        S )z,List of xobjects defined in the page object.)ra  r   r  rB  r.   s    r)   get_xobjectszPage.get_xobjects/  s#    D{{,,T[[99r*   rB
  c                $   | j                   }|t        d      d}|j                  d      r|dd  }t        j	                  |      }	|	t               k7  rt        d|	       t        | |      }
|
&|
d   }t        ||      r|S |j                  |       |S t        j                  |j                         d       }d}d}g d}g d}	 |j                  |      }d}|dk  r	 |j                  |      }d}|j                         t         j#                         v rdd l}|j'                  |      }~|Pt)        |      t*        u r|}n>t-        |d	      rt+        |      }n&t-        |d
      r|j.                  }nt        d      d }| j1                  ||||||||||
      }|s|S |d   }|d   }t        ||      r|S |j                  ||       |S # t        $ r t        dkD  r
t                Y w xY w# t        $ r t        dkD  r
t                Y w xY w)Nr
  r   r-  r   zbad fontname chars r  )re
  rg
  ri
  rh
  )rf
  china-ssjapan-skorea-sr  r   zbad fontfile)r6  )r   r   r3   r$
  r%
  r  	CheckFontr1  r<  rm
  r8   r  rU  rg   r  rv   rj
  r  rk
  rl
  r   r  r;   r   r  )r(   r   r@  rA  r  r
  r  r%  r2  	inv_charsrT  r  r  r
  
CJK_number
CJK_list_n
CJK_list_srk
  fontfile_strr  r6  s                        r)   insert_fontzPage.insert_font/  s>   kk;>??s#|H&33H=	29+>??x(7DS$'%K !$$X^^%5t<
=
C
	#))(3JE >'--h7
 >>388:: &--h7J H~$':."8}6*'}} 00Lxz:WZ$eXzC J1vq6d#K 	D84[  	#a'N,<	  '!+0@s$   G  G/ G,+G,/HH)	css	scale_lowarchiverS  r  rP  r  _scale_word_width_verbosec       	   	        |dz  dk(  st        d      |dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  rd|cxk  rdk  st        d       t        d      |d}t        |      }|d	v r#t        dd|j                  |j                        }n"t        dd|j                  |j                        }d
|z   }t	        |t
              rt        |||      }nt	        |t              r|}nt        d      |dk(  rdnd|z  }|j                  |d||
rt        j                  nd|      j                  sdj                  z  }d|fS t        j                        _        j                  j                  j                  j                  fdk(  sJ j                  j                  j                  j                  fdk(  sJ dj                  z  }||k\  sJ d|d|       t!        j                  j"                  j                  j"                  z
  |z  d      }fd}|j%                  |      }d|cxk  rdk  rFn nC|d   }|j'                  ||      }d| d}t(        j+                  ||j-                         d       | j/                  ||d|||	       j                  j0                  j                  j2                  z   dz  |z  }|j0                  |j2                  z   dz  }t5        |dd||j6                   |j8                         t5        |       z  t5        dddd|j6                  |j8                        z  }|d   j;                         D ]   }|dxx   |z  cc<   | j=                  |       " ||fS )as  Insert text with optional HTML tags and stylings into a rectangle.

        Args:
            rect: (rect-like) rectangle into which the text should be placed.
            text: (str) text with optional HTML tags and stylings.
            css: (str) CSS styling commands.
            scale_low: (float) force-fit content by scaling it down. Must be in
                range [0, 1]. If 1, no scaling will take place. If 0, arbitrary
                down-scaling is acceptable. A value of 0.1 would mean that content
                may be scaled down by at most 90%.
            archive: Archive object pointing to locations of used fonts or images
            rotate: (int) rotate the text in the box by a multiple of 90 degrees.
            oc: (int) the xref of an OCG / OCMD (Optional Content).
            opacity: (float) set opacity of inserted content.
            overlay: (bool) put text on top of page content.
            _scale_word_width: internal, for testing only.
            _verbose: internal, for testing only.
        Returns:
            A tuple of floats (spare_height, scale).
            spare_height:
                The height of the remaining space in <rect> below the
                text, or -1 if we failed to fit.
            scale:
                The scaling required; `0 < scale <= 1`.
                Will be less than `scale_low` if we failed to fit.
        r  r   zbad rotation angler  r   z'scale_low' must be in [0, 1]Nr\   r  zbody {margin:1px;})htmluser_cssrZ  z"'text' must be a string or a Story)	scale_min	scale_maxr  r	  r  r  z
scale_low=z scale=c                 6    j                   j                   d fS r,   r  )r  fits    r)   rect_functionz*Page.insert_htmlbox.<locals>.rect_functioni0  s    88SXXt++r*   r0  r1  r-   gs
)rS  r  r  r   rJ  )r   r  r  rY  r>   r  Story	fit_scaler   FZ_PLACE_STORY_FLAG_NO_OVERFLOW
big_enough	parameterfilledr   r  r  r  r  write_with_linksr  r  r  r  show_pdf_pager  r  rp  r"  r#  ra  r  )r   r   r   rX  rY  rZ  rS  r  rP  r  r[  r\  	temp_rectmycssstoryrect_scale_maxrV  spare_heightrd  r%  r  r]  rn  mp1mp2rq  r  rc  s                              @r)   insert_htmlboxzPage.insert_htmlbox0  ss   T {a122qjcMF qjmcMF m I""<== #<==;CDzYQ4;;

;IQ4::t{{;I %s* dC teW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%%W%=DD6A""5!((*a8 	4a2wO xx{{SXX[[(A-5 ww A% 5!Qvv6fWoQ1a./ 	 F$$& 	#DLCLT"	# U""r*   )r  rf   r  r  r  r  r  r  rS  r	   rY  r  c                  t        |        | j                  }|j                  st        d      |dk(  r1t	        |      t	        |      z   t	        |	      z   dk7  rt        d      |rNt        |      t        u rn<t        |d      rt        |      }n$t        |d      r|j                  }nt        d      |r.t        j                  j                  |      st        d| d	      |r1t        |      t        t        t        j                   fvrt        d
      |	rt        |	      t"        urt        d      |r|s|st        d      |r1t        |      t        t        t        j                   fvrt        d      |
dk  r|
dz  }
|
dk  r|
dk\  r|
dz  }
|
dk\  r|
dvrt        d      t%        |      }|j&                  s|j(                  rt        d      || j*                   z  }|j-                  | j.                        D cg c]  }|d   	 }}||j1                  | j.                        D cg c]  }|d   	 c}z  }||j3                  | j.                        D cg c]  }|d   	 c}z  }d}d}|dz   }||v r|dz  }|t        |      z   }||v r|r| j5                          |j6                  }| j9                  ||	|||||||
||||||      \  }}|||_        |S c c}w c c}w c c}w )a  Insert an image for display in a rectangle.

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

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

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

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

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

        Returns:
            xref (int) of inserted image. Re-use as argument for multiple insertions.
        r  r   r   z4xref=0 needs exactly one of filename, pixmap, streamr  r   zbad filenamezNo such file: '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  rc  r  bad rotate value!rect must be finite and not emptyr  rG  fzImgrz   )rf   r  r	   r  r  r  r  r  rS  r  rY  r  r  r  r  )ra  r   r  r   r   r   r  r;   r   rd   r
   r  r  r  rZ  r9   r[  r  r  r  r  rf  rq  rB  r  rn  ri  r  r  )r   r   r  rf   r  r  r  r  r  r  rS  r	   rY  r  r%  r  r  rZ  ilstrE   r  r  s                         r)   insert_imagezPage.insert_image0  s   ` 	Dkkzz[))19$x.4<7$v,F!KSTTH~$:.x=6*#== 00BGGNN8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D.... "11$++>?!??s44T[[AB!1BBs11$++>?!1??s7$FA3q6zH $  $$**+ + 
g" !(CC @B?s   K!0K&K+c                    t        |        t        j                  | |      }|dk(  rt        d      | j	                  |f       y)z'Insert a new link for the current page.r\   link kind not supportedN)ra  r  getLinkTextr   rb  )r   rZ  r#  r   s       r)   r  zPage.insert_link1  s?    D!!$,B;677!!5(+r*   皙?)r   rh  r   r@  r  r  r  r   r  miter_limitrender_moderS  r  r  r  r  r  c                   | j                         }|j                  |||||||||	|
||||||||      }|dk\  r|j                  |       |S )N)r   rh  r   r@  r  r  r  r   r  r  r  rS  r  r  r  r  r   )rB  r&  rF  )r   r'  r   r   rh  r   r@  r  r  r  r   r  r  r  rS  r  r  r  r  r  r  r   s                         r)   r&  zPage.insert_text1  ss    0 nn__!!%##)%%  
( 7JJw	r*   )r  r  r  r  
expandtabsr  r   r@  r   r   rh  r  r  r  r  r  rS  r  r  c                   | j                         }|j                  ||||||
||||	||||||||||      }|dk\  r|j                  |       |S )a3  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   rh  r   r@  r  r  r  r   r  r  r  r  r  rS  r  r  r  r  r   )rB  rE  rF  )r   r   r  r  r  r  r  r  r  r   r@  r   r   rh  r  r  r  r  r  rS  r  r  r  r   s                           r)   rE  zPage.insert_textboxJ1  s|    Z nn!!!##%)%)   
, 7JJw	r*   c                (    | j                         dk(  S )z3Check if /Contents is in a balanced graphics state.r  )rt  r.   s    r)   rh  zPage.is_wrapped1  s     $$&&00r*   c                    t        | j                  d      }|j                  syt        j                  |j                         t        d            }|j                  syt        j                  |      S )zPage language.Fr%  NLang)r   r   r   r   r3  r
  r  pdf_to_str_buf)r(   r  r&  s      r)   r'  zPage.language1  sX     tyy59!!--gkkmXf=MN##D))r*   c              #  V   K   | j                         }|D ]  }||d   |v s|  yw)z Generator 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.
        NrK  )ra  )r(   kinds	all_linksr  s       r)   rq  z
Page.links1  s8      NN$	 	D}V 5	s   ))c                (   t        |        t        |      t        u rd}|}n!t        |      t        u r|}d}nt	        d      | j                  ||      }|s|S d|_        t        j                  |       |_	        || j                  t        |      <   |S )zLoad 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)ra  r   r  r4   r   r  r   r  r  r   r4  r5  )r(   identr  r   r  s        r)   r1  zPage.load_annot1  s     	D;#DD%[CDDEFFtT*J]]4(
$'C!
r*   c                   t        |        t        j                  | j                        }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   d|_        d|_        | j                  j                  rS| j                         }|D cg c]  }|d   t        j                  k(  s| }}|r|d   }|d   |_        |d   |_        |S d|_        d|_        |S c c}w )zGet first Link.NTr   r\   r   r   )ra  r   fz_load_linksr   r   r
  r   r  r  r   r4  r5  r  r  r  r  )r(   r  r:  r"  link_ids        r)   r  zPage.load_links1  s    D!!499-~~Cj]]4(
$'C!;;$$&E %F111E1E)EQFEF("1:  
 CHCF
 Gs   4DDc                    t        |        t        | j                        }t        ||      }|}|s|S d|_        t        j                  |       |_        || j                  t        |      <   t               }t        j                  ||       |}|S )zLoad a widget by its xref.T)ra  r   r   JM_get_widget_by_xrefr   r  r  r   r4  r5  r6  r  r7  )r(   r  r   r   r  r8  s         r)   load_widgetzPage.load_widget1  s}    DDII&%tT2J]]4(
$'C!3'
r*   c                    t        |        | j                  d      }|j                  s*t        j                  | j
                        }t        |      S t        |j                               }t        |      S )zThe MediaBox.Fr%  )	ra  r
  r   r   r  r   JM_mediaboxr
  r  )r(   r   r   s      r)   ra  zPage.mediabox1  s_     	D~~u~-&&		2D Dz 
+DDzr*   c                j    t        | j                  j                  | j                  j                        S r,   )r  ra  r  r  r.   s    r)   mediabox_sizezPage.mediabox_size1  s#    T]]%%t}}'7'788r*   c                    t        |       S r,   )Shaper.   s    r)   rB  zPage.new_shape2      T{r*   c                ,    t         j                  |       S )z7All /Contents streams concatenated to one bytes object.)r  _get_all_contentsr.   s    r)   read_contentszPage.read_contents2  s    &&t,,r*   c                b    t        |        | j                  }|j                  |       }|| _        y)z-Refresh page after link/annot/widget updates.N)ra  r   rz  r   )r(   r%  r   s      r)   refreshzPage.refresh2  s(    Dkkt$	r*   )rf   r  r	   c               p   | j                   }|j                  |      st        d      t        |      t        |      z   t        |      z   dk7  rt        d      | j	                  | j
                  |||      }|j                  ||       | j                         d   }|j                  |d       d| _	        y)a  Replace the image referred to by xref.

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

        Args:
            xref: the xref of the image to replace.
            filename, pixmap, stream: exactly one of these must be provided. The
                meaning being the same as in Page.insert_image.
        zxref not an imager   z3Exactly one of filename/stream/pixmap must be given)rf   r	   r  r  r  N)
r   r
  r   r   r|  r   r
  r	  r
	  r  )r   r  rf   r  r	   r%  ro  last_contents_xrefs           r)   rt  zPage.replace_image2  s    . kk  &011>DL(4<71<RSS$$II % 
 	h%!..04 	,d3r*   c                v    t        |        t        | j                  d      }|j                  syt	        |      S )zPage rotation.r   r%  )ra  r   r   r   JM_page_rotationr+  s     r)   rL  zPage.rotation>2  s1     	DDII2%%r*   c                >    t        t        j                  |             S )zReflects page rotation.)rp  r  _rotate_matrixr.   s    r)   rN  zPage.rotation_matrixG2  s     e**4011r*   c                    t        |        t        j                  | j                  |j                  t        |      t        j                                y)z=Run page through a device.
        dw: DeviceWrapper
        N)ra  r   r  r   r  r  r  )r(   r  r{  s      r)   r  zPage.runL2  s5     	D$))RYY0A!0DennFVWr*   )r  r	  r  r  c                  |dt         z  t        z  t        z  t        z  }|t	        |      }t        |        |}|| j                  ||      }nt        |d      | k7  rt        d      |j                  ||      }|~|S )a  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	  r	  r	  r	  r  ra  r  r   r   search)r   r   r  r	  r  r  r  rlists           r)   r 	  zPage.search_forS2  s    ( ="#*+ ** %	%E :DD:""E":BR"d*:;;		$e	,r*   c                &    | j                  d|      S )zSet the ArtBox.r  r  r(   r   s     r)   
set_artboxzPage.set_artbox|2  s      400r*   c                &    | j                  d|      S )zSet the BleedBox.r  r  r  s     r)   set_bleedboxzPage.set_bleedbox2  s      T22r*   c                V   t        |        | j                  }|j                  rt        d      |j                  st        d      |t        d|j                               vrt        d      |j                  |      st        d      |j                  | j                  d|dd       y	)
z-Set object at 'xref' as the page's /Contents.r   r  r   r[  zxref is no streamr  r  r_  N)
ra  r   r   r   r  rF  rb  r	
  rj  r  )r(   r  r%  s      r)   set_contentszPage.set_contents2  s    Dkk==.//zz[))uQ 122Z((!!$'011J4($@r*   c                &    | j                  d|      S )z,Set the CropBox. Will also change Page.rect.r  r  r  s     r)   set_cropboxzPage.set_cropbox2        D11r*   c                l   t        |        t        | j                        }|s.t        j                  |j                         t        d             yt        j                  |      }t        t        d      sJ t        j                  |j
                  t        d      t        j                  |             y)zSet PDF page default language.r  r"  N)ra  r   r   r   r;  r
  r  r  r;   r|  r"  )r(   r'  r  r&  s       r)   r  zPage.set_language2  s    Dtyy)w{{}hv.>?55h?D5"ABBB**KKV$77=r*   c                   t        |        | j                         }t        |      }t        j                  |      st        j
                  |      rt        t              t        j                  |j                         t        d      |       t        j                  |j                         t        d             t        j                  |j                         t        d             t        j                  |j                         t        d             t        j                  |j                         t        d             y)zSet the MediaBox.MediaBoxr  r  r  r  N)ra  r
  r  r   r  r  r   r  r'  r
  r  r;  )r(   r   r   ra  s       r)   r  zPage.set_mediabox2  s    D~~"4(""8,,,X6l++Xj-A8LDHHJ(;<DHHJ(:;DHHJ(<=DHHJ(;<r*   c                    t        |        t        | j                        }t        |      }t	        j
                  |j                         t        d      |       y)zSet page rotation.r.  N)ra  r   r   JM_norm_rotationr   rC  r
  r  )r(   rL  r   rO  s       r)   r  zPage.set_rotation2  s?    DDII&x(
HX,>Dr*   c                &    | j                  d|      S )zSet the TrimBox.r  r  r  s     r)   set_trimboxzPage.set_trimbox2  r  r*   c	           
        dd}	t        |        | j                  }
|
j                  r|j                  st        d      |j                  s|j
                  rt        d      |dk  r||j                  z  }|dk  r||   }|| j                   z  }|s|j                  n|j                  |z  }|j                  s|j
                  rt        d      ||j                   z  } |	||||      }|
j                  | j                        D cg c]  }|d   	 }}||
j                  | j                        D cg c]  }|d   	 c}z  }||
j                  | j                        D cg c]  }|d	   	 c}z  }d
}d}|dz   }||v r|dz  }|t        |      z   }||v r|j                  }|
j                  |k(  rt        d      |
j                  j!                  |d      }|t#        |
      }||
j                  |<   ||f}|
j$                  j!                  |d      }|r| j'                          | j)                  ||||||||      }||
j$                  |<   |S c c}w c c}w c c}w )av  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           	        | j                   | j                  z   dz  }|j                   |j                  z   dz  }t        dddd|j                   |j                         t        |      z  }| |z  }|j
                  |j
                  z  }|j                  |j                  z  }	|rt        ||	      x}}	|t        ||	      z  }|t        dddd|j                  |j                        z  }t        |      S )ah  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  rp  r"  r#  rY  r  r  JM_TUPLE)
srtrr
  rS  smptmpr{  sr1fwfhs
             r)   calc_matrixz'Page.show_pdf_page.<locals>.calc_matrix2  s      55255=C'C55255=C'C q!QCEE6CEE62VF^CAq&CCII%BSZZ'Bb"+%RBA1aCEE35511AA;r*   r  ry  z!clip must be finite and not empty)r
  rS  r   r  rG  fzFrmrz   z%source document must not equal targetN)r  r  r  r  r  r  r  )Tr   )ra  r   r  r   r  r  r  rf  r   r  rB  rq  rn  r  r  r  r8   r  r  ri  r  )r   r   r  r  r  r  r  rS  r  r  r%  r  tar_rectsrc_rectr  rZ  r{  rE   r  isrcgmappno_idr  s                          r)   rn  zPage.show_pdf_page2  sm   2 	D 	Dkkzz[))==D,,@AAAg6$$$C Ag#;45555(,8==(--$2F 4 4@AAx====XxofU "33DKK@A!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   
I6I%Ic                   t        |        t        j                         }| j                  d      }|j                  st        |      S t        j                  t        j                  j                        }t        j                  |||       t        |      }| j                  dz  dk(  rt        |      }|S t        ddddd| j                  j                        }|S )zPage transformation matrix.Fr%  r  r   r   r  )ra  r   rm  r
  r   rl  rc  r\  r  rL  rp  rO  r  )r(   r  r   ra  r  s        r)   rf  zPage.transformation_matrix;3  s     	Dnn~~u~-$S))<< 7 78  x5$==3!#+C 
 Aq"a)<)<=C
r*   c                    | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )zThe TrimBoxr  r   r   r   r   r\  r]  s      r)   trimboxzPage.trimboxN3  s[     y)<<<]]DGRUUT!W_d1gruutAwGGr*   c                    t        |        t        j                  | |      }|dk(  rt        d      | j                  j                  |d   ||        y)z"Update a link on the current page.r\   r~  r  r   N)ra  r  r  r   r   rr  )r   rZ  r   s      r)   update_linkzPage.update_linkW3  sL    D!!$,B;677!!#f+u4!@r*   c              #     K   | j                         D cg c]  }|d   t        j                  k(  s|d     }}|D ](  }| j                  |      }||j                  |v s%| * yc c}w w)a    Generator 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)r  r   r0  r  r  )r(   r3  r!   widget_xrefsr  r8  s         r)   r  zPage.widgets`3  su      '+&6&6&8[AaDEDZDZ<Z![[  	D%%d+F} 1 1U :	 \s   A-A(A((A-!A-c                    | j                         \  }}|dkD  rd|z  }t        j                  | |d       |dkD  r d|z  dz   }t        j                  | |d       yy)z,Ensure page is in a balanced graphics state.r   r  Fs   
Qr  TN)rt  r  r  )r(   pushpopprependrk   s        r)   ri  zPage.wrap_contentsq3  sb    ))+	c!8tmG""4%87c\E)F""46 r*   c	           
        t        | t              sJ |st        d      t        |      t        u r |dk(  r||j                  | |||       y|f}|d   j                  }	t               }
|
j                  | j                  j                  | j                  j                        }|D ]%  }|	|j                  z  }	|j                  |||       ' ||	}| j                  ||
d||||	|       d}
d}y)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)rP  r  r  rB  )rP  r  )r  r  rS  r  r  )r>   r   r   r   
TextWriter
write_text	text_rectr   r  r   rY  r  rn  )r   r   writersr  r  rP  r  rS  r  r  textdocr  writers                r)   r  zPage.write_text{3  s   * $%%%CDD=J&{t|""4w"W"*qz##*  tyytyy?O?O P 	CFF$$$DeWEB	C <D+ 	 		
 r*   c                b    t        |        | j                  j                  | j                        S r
  r
  r.   s    r)   r  z	Page.xref3  r
  r*   zpage rectangle)r%  r-  r8
  r,   )r  r?
  r0
  r/  )Nr   N)NNNNNr   r   r   r   r   r   r   r  NN)r   r   Nr  )Nr   r   N)r   Nr   r   NNN)r'  r   r0
  r   )r   r   r0
  r   )r'  r   r(  r9
  rf   r  r  r/  r  r/  r  r/  r0
  r   )r   r   r   r  r   rk  r   r/  r   r1  rR  r1  r  r1  r  rk  r[  r1  r  r1  r  r4   rP  rk  r  r4   rS  r4   r0
  r   r2  )r0
  r   )r	  r   r0
  r   )r  r   r  r   r0
  r   )r  r   r0
  r   )NNr  r   NNT)r   r/  r   r/  r   rk  r  r4   r   r1  r   r1  r  r   r0
  r   )Note)r'  r   r   r  r  r  r0
  r   )r8  r6  r0
  r   )r   r   r   )
r   'Page'r 	  r4   rl  r4   r   r4   r0
  r   r,  )r   r  r  r4   )r   r  r8  r6  r0
  r6  )r0
  rp  )r+  NNr   NFr   r   Tr   r   r   )$r   r  r  r   r  r   r  r   r  r   r  r1  r   r1  r[  r/  rY  rk  r  r/  r  r   r  r4   r  r4   r  r   r  rk  r  rk  r  r4   r0
  r  )r+  NNNr   r   r   Tr   r   r   )r   r  r:  r   r  rk  r  r1  r   r1  r  r1  r[  r/  rY  rk  r  r4   r  r4   r  r   r  rk  r  rk  r  r4   r0
  r  )"r   r  r  r   r  r   r  r   r  r1  r   r1  r[  r/  rY  rk  r  r1  r  r   r  r4   r  r4   r  r   r  rk  r  rk  r  r4   r0
  r  )
r+  Nr   r   r   TNr   r   r   )r   r  r  r   r  r   r  r1  r[  r/  rY  rk  r  r4   r  r4   r  r   r  r1  r  rk  r  rk  r0
  r  )r   r  r   z"typing.Union[rect_like, quad_like]r  r1  r   r1  r[  r/  r  r1  rY  rk  r  r4   r  r4   r  r   r  rk  r  rk  r  r4   r0
  r  )r+  NNr   Nr   r   TFr   r   r   )r   r  r  r   r  r1  r   r1  r[  r/  rY  rk  r  r1  r  r4   r  r4   r  r   r  r   r  rk  r  rk  r  r4   r0
  r  )r+  NNr   r   r   NTr   r   r   )r   r  r	  r   r  r1  r   r1  r[  r/  rY  rk  r  r4   r  r4   r  r1  r  r   r  rk  r  rk  r  r4   r0
  r  )r+  NNr   r   r   NTr   r   r   N)r   r  r   r   r  r1  r   r1  r[  r/  rY  rk  r  r4   r  r4   r  r1  r  r   r  rk  r  rk  r  r4   r0
  r  )r+  NNTNr   Fr   r   Tr   r   r   )$r   r  r:  r   r'  r   r  rk  r  r1  r   r1  r[  r/  r  r   r  r1  rY  rk  r  r   r  r4   r  r4   r  r   r  rk  r  rk  r  r4   r0
  r  )r   r+  Nr   r   r   TNr   r   r   )r   r  r  r   r  r   r  rk  r  r1  r[  r/  rY  rk  r  r4   r  r4   r  r   r  r1  r  rk  r  rk  r  r4   r0
  r  r   Nr  )r  r   r0
  r   rE
  )r   r  r  r   r:  r   r0
  r   )r   r  r0
  r   )r   r  r  r   r  r  r  r   r  r   r  r   r0
  r>
  )NNr   r   T)r  rk  r  rk  r  r   r0
  r   r:
  rN  )r   r   r   r   r0
  r  )r  r   r  r4   r0
  r@
  )rB
  NNFr   r   )r0
  r   )r   r  rZ  r5   r#  r   r0
  r  )(r   r  r'  r   r   typing.Union[str, list]r   rk  rh  r0  r   r  r@  r/  r  r4   r  r4   r  r1  r   r1  r  rk  r  rk  r  r4   rS  r4   r  r1  r  r   r  rk  r  rk  r  r4   ).r   r  r   r   r  r  r  r4   r  rk  r  r1  r  r4   r  r4   r  rk  r   r1  r@  r/  r   r  r   rk  rh  r0  r  rk  r  r1  r  r4   r  r   r  r4   rS  r4   r  r4   r  rk  r0
  rk  )r  ztyping.Union[str, int]r0
  r   )r   TTr   r   Nr1
  )r   r  rZ  r5   r0
  r  )NNTNNTr   r   )r   r  r0
  r  )r/   r0   r1   r   r   r   r  r  r   PDF_ANNOT_LE_OPEN_ARROWr#  r.  r1  r5  r=  r?  rW  rY  r\  rb  re  rn  r   rt  r}  rx  r  r  r  r  r  r  r
  rp  r  r  ry  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r!  r#  r&  r(  r,  r  r  r	  r  rV  rZ  r3  r^  r`  rf  r  rO  rm  rp  ru  r	  r  rg  r  r  r  r  r  r  r  rC  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  ra  r}  r  r  r  r  r+  r  r1  r:  r  r  r@  rB  rD  rF  r  r	  rL  rW  rv  r|  r  r&  rE  rh  r'  rq  r1  r  r  ra  r  rB  r  r  rt  rL  rN  r  r 	  r  r  r  r  r  r  r  r  rn  rf  r  r  r  ri  r  r  r   rX  r-   r*   r)   r   r   %  s1    &< 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	$1   ! !  & >$|@ !''' ' 	'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                     e Zd Zd Zd Zd Zd Zd Zed        Z	d1dZ
d2d	Zd3d
Zed        Zd Zed        Zd Zed        Zd3dZed        Zed        Zed        Zed        Zd4dZd5dZd Zd Zd Zd Zed6d       Zed        Zd Zed        Z d7dZ!d8d Z"d9d!Z#d" Z$d# Z%d$ Z&d% Z'd& Z(ed'        Z)ed(        Z*d) Z+ed*        Z,d+ Z-ed,        Z.ed-        Z/ed.        Z0ed/        Z1e,Z2eZ3d0 Z4y):r  c                F   d| _         d| _        	 t        |t        t        j
                  ft        j                  t        j                  t        t        t        f      rC|\  }}d}t	        j                  |t        |      t	        j                  d      |      }|| _        yt        |t        t        j
                  ft        j                  t        j                  t        t        t        ft        t         f      rB|\  }}}t	        j                  |t        |      t	        j                  d      |      }|| _        yt        |t        t        j
                  t#        d      ft$        t        j&                  f      r"|\  }}t)        |t              r|j                  }n|t	        j
                  d      }t)        |t$              r|j                  }t	        j*                  |      j,                  st/        d      |j,                  rWt	        j0                  ||t	        j
                         t	        j2                  d      t	        j4                         d      | _        yt	        j6                  |      | _        | j                  j,                  st9        t:              yt        |t$        t        j&                  ft$        t        j&                  f      r|\  }}t)        |t$              r|j                  }t)        |t$              r|j                  }|}|}	|j,                  s0t	        j6                  |	      }
|
j,                  s%t9        t:              t	        j<                  ||	      }
|
| _        yt        |t$        t        j&                  ft>        t        ft>        t        fd      s7t        |t$        t        j&                  ft>        t        ft>        t        f      rtA        |      dk(  r*|\  }}}t	        j                  t        jB                        }n|\  }}}}t        |      }t)        |t$              r|j                  n|}t	        jD                  |      s>t	        jF                  ||jI                         |jK                         |||      }|| _        yt	        jF                  ||jI                         |jK                         ||t	        j                  t        jB                              }|| _        yt        |tL        t$        t        j&                  f      r1|d   dk(  r)|\  }}t)        |t$              r|j                  }|| _        yt        |t$        t        j&                  ft        df      r|d   }tA        |      dk(  r|d   nd}t)        |t$              r|j                  n|}tO        |dd      st/        d      t	        j*                  |      }|j,                  s|st/        d	      t	        j                         }t	        jP                  |      }t	        jR                  |      }t	        jT                  |      }t	        jV                  |||||      }|j,                  jH                  |j,                  _$        |j,                  jJ                  |j,                  _%        |j,                  jX                  |j,                  _,        |j,                  jZ                  |j,                  _-        	 t]        j^                  |j,                  |j,                  |       || _        yt        |t        j
                  t        ft        t        dt        t         f      r]|\  }}}}$}t)        |t              r(|j                  }t)        |t        j
                        sJ t	        jn                  |      }||z   |z  }%t	        j                         }t	        jV                  |||||      }t)        |$tp        tr        f      r!t	        jt                  |$      }&tA        |$      }nOtw        |$      }'|'j,                  st/        d
      t	        jx                  |'      \  }}(t	        jt                  |$      }&|%|z  |k7  rt/        d|d|d|d|d|%d|      t	        jz                  |j,                  |&       || _        yt        |d      r|\  })d}*t}        |)d      r(|)j                         }+|+rt	        j                  |+      },nt}        |)|*      r$|)j                  }+|+rt	        j                  |+      },nst)        |)tL              rt	        j                  |)      },nMtw        |)      }'|'j,                  r|'j,                  j@                  st/        d      t	        j                  |'      },t	        j                  ,t	        j                  t        t        t        t              t	        j                  |,j                         dd|,j                         dd            \  }}}t	        j                  |,      \  }-}.|-|j,                  _,        |.|j,                  _-        || _        yt        |t        t        j                  ft              ry|\  }/}0t        |/      }1t	        j                  |1      }2tO        |0d|2dz
        st/        t              t	        j                  |1|0d      }3t	        j                  |3t        d            }4t	        j                  |4t        d            sMt	        j                  |4t        d            s.t	        j                  |4t        d            st/        t              t	        j                  |1|3      },t	        j                  |,t	        j                  t        t        t        t              t	        j                  |,j                         dd|,j                         dd            \  }5}}|5| _        yd}6|D ]  }7|6dt#        |7       d|7 dz  }6 t        |6      )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_viewr  r  r   r  rc  FzIrectIRectr  r   fz_new_pixmap_with_bboxr  r  r   r4   r   r   r  FzPixmapr>   fz_pixmap_colorspacer   r   r  r  r   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskrk  r7   fz_infinite_irectr  fz_scale_pixmapr"  r#  r  r  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  r   pixmap_copyfz_pixmap_samples_memoryviewr  striderE   rF  fz_samples_setfz_samples_getr  r  rZ  r  r"  r  ll_fz_pixmap_copy_rawr;   r   fz_new_image_from_filer   rQ  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTrm  r   r  r  r   r   r   r  r  r  r  r  r  r  r  rg   )8r(   r  r  r   r  r  spixmpixspmmpmr
  r   r  r*  r  src_pixr  sepsrE   src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr#  r"  pm_isrc_irZ  src_pix_alphar|  samplesr   samples2r  r  	imagedatar   r  r  r  r  r%  r  rT  r	  r  rU  r  r   args8                                                           r)   r   zPixmap.__init__3  s{	     
 ! U//0u}}eT5A
 HBE..r3CD3I5K^K^_`KachiBDIU//0u}}eT5Ad #OBe..r3CD3I5K^K^_`KachiBDIz5+=+=tDzJVUZUcUcLd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JD$$'yy$'yyCC??<<SA~~&88==c3GDI7%s|UYZvu~~6uclS4yA~!
a}}U%<%<=#' aD'-#-dF#;diiG--d3**7GIIKaQRTXY DI **7GIIKaQRTYTaTabgbybyTz{DIcFENN#;<aEAQEAr"f%WWDIvu~~6dD 7D"4yA~DG1E#-dF#;diiGE1a( "344++G4B== "KLL&&(D))'2A%%g.A&&w/A$$RAtU;B%0022BMMO%0022BMMO!(!3!3!8!8BMM!(!3!3!8!8BMM  !!2=='2D2DaHh DIu11:>S$QTVZP[\'+$B1gu"j)WW!"e&8&8999%%b)A%i1_F&&(D$$RAtU;B7UI$67 33G<7|(1~~$&89911#6a 33G<zT! $:t4QD%1$iPVyX_Z^Y`"abb''ADI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HB1
 2237JD$!%BMM!%BMMDIx)9)9:C@IC"3'C((-GD!WQY/ ,//((dA6C&&sHY,?@E%%eXg->?!--eXg5FG!--eXl5KL /22&&sC0C 66MM/?OUdeNN3557Aq#%%'1a@ICA
 DI BD 4$tCykC5334T""r*   c                    | j                   S r,   )r  r.   s    r)   r   zPixmap.__len__4  s    yyr*   c                    t        |       t        ury d}| j                  r*| j                  j                  j                  j
                  }d| d| j                   d| j                   dS )NrI	  zPixmap(z, r  )r   r  r  r   r   r   irectr  )r(   r  s     r)   r   zPixmap.__repr__4  s[    DzV#
??--88==JBtzzl"TZZLBBr*   c                t   | j                   }t        j                  |      |j                         z  }t        j                  |      }t        j
                  |      }|dk(  rt        j                  ||       n|dk(  rt        j                  ||       n|dk(  rt        j                  ||       nl|dk(  rt        j                  ||       nP|dk(  rt        j                  ||       n4|dk(  rt        j                  |||d       nt        j                  ||       |j                          t        |      }|S )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_qualityr  r  r  r  barrays           r)   _tobyteszPixmap._tobytes4  s     YY%%b)BDDF2!!$'nnS!\E88bA\E88bA\E88bA\E88bA\E77R@\))#r;B((b1!#&r*   c                   | j                   }|dk(  rt        j                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j
                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j                  |||       y t        j                  ||       y )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(   rf   r)  r*  r  s        r)   	_writeIMGzPixmap._writeIMG4  s    YY\E77HE\E77HE\E77HE\E77HE\E66r8D\E88X{S!77HEr*   c                @    t        j                  | j                        S )z$Indicates presence of alpha channel.)r   fz_pixmap_alphar   r.   s    r)   r  zPixmap.alpha4  r  r*   Nc                    | t        j                  | j                         y|!t        j                  | j                  |       yt	        | j                  |t        |             y)z*Fill all color components with same value.N)r   fz_clear_pixmapr   fz_clear_pixmap_with_valueJM_clear_pixmap_rect_with_valuer  )r(   r   r*  s      r)   rs  zPixmap.clear_with5  sH    =!!$)),\,,TYY>+DIIu>Nt>TUr*   c                P    | j                   }t        ||      }|st        |      S |S )z-
        Return count of each color.
        )r   JM_color_countr7   )r(   r  r  r  r   s        r)   color_countzPixmap.color_count5  s*     YYR&8O	r*   c                   d}d}|#| j                   t        |      v r| j                   }| j                  d|      j                         D ]  \  }}||z  }||kD  s|}|} |sdt	        dg| j
                  z        fS ||z  fS )z/Return most frequent color and its usage ratio.r   T)r  r  r   r	  )r   r  r=  rB   r  rE   )r(   r  	allpixelscntpixelr  maxpixels          r)   color_topusagezPixmap.color_topusage5  s    	

d4j 8::D ,,Dd,CIIK 	!LE5Is{ 		!
 ucUTVV^,--i**r*   c                v    t        t        j                  | j                              }|j                  dk(  ry|S )zPixmap Colorspace.r  N)r  r   r  r   r   )r(   r  s     r)   r  zPixmap.colorspace&5  s1     22499=>77f	r*   c                4   | j                   }|j                   }t        j                  |      st        d      |j	                         |j	                         k7  rt        d      t        j
                  ||t        |      t        j                  d             y)zCopy bbox from another Pixmap.z'cannot copy pixmap with NULL colorspacez%source and target alpha must be equalN)r   r   r  r   r  fz_copy_pixmap_rectr  r  )r(   r  r*  r  r  s        r)   rP  zPixmap.copy.5  st    YY(())'2GHH88:(EFF!!"g/?/EuGaGabfGghr*   c                V    t        j                  | j                        }t        |      S )zMD5 digest of pixmap (bytes).)r   r  r   r  r  s     r)   r  zPixmap.digest85  s"     ""499-Szr*   c                    t        j                  | j                        st        d       yt        j                  | j                  |       y)z=Apply correction with some float.
        gamma=1 is a no-op.zcolorspace invalid for functionN)r   r  r   r   fz_gamma_pixmap)r(   gammas     r)   
gamma_withzPixmap.gamma_with>5  s6     ))4995=>tyy%0r*   c                @    t        j                  | j                        S )zThe height.)r   r  r   r.   s    r)   r  zPixmap.hF5  ry
  r*   c                
   | j                   }t        j                  |      j                  st	        d       yt        |      }t        j                  |      rt        j                  |       yt        j                  ||       y)z Invert the colors inside a bbox.zignored for stencil pixmapFT)	r   r   r  r   r   r  r  fz_invert_pixmapfz_invert_pixmap_rect)r(   r*  r  r  s       r)   invert_irectzPixmap.invert_irectK5  sg    YY))"-8889T"%%a(""2&##B*r*   c                V    t        j                  | j                        }t        |      S )zPixmap bbox - an IRect object.)r   fz_pixmap_bboxr   JM_py_from_irectrL  s     r)   r   zPixmap.irectX5  s#     ""499-%%r*   c                @    t        j                  | j                        S )zCheck if pixmap is monochrome.)r   fz_is_pixmap_monochromer   r.   s    r)   is_monochromezPixmap.is_monochrome^5  s     ,,dii88r*   c                    | j                   }|j                         }|j                         |j                         z  |z  }d }t	        d||      D ]#  }|dk(  r ||d|      } ||||      }|k7  s# y y)z5
        Check if pixmap has only one color.
        c                    t               }t        |      D ]*  }|j                  t        j                  | ||z                , |S r,   )r   rF  rk   r   r  )r  offsetrE   rG   rZ  s        r)   _pixmap_read_samplesz0Pixmap.is_unicolor.<locals>._pixmap_read_samplesk5  s>    &C1X ?

5//F1H=>?Jr*   r   FT)r   rE   r   r  rF  )r(   r  rE   r  rZ  rY  sample0samples           r)   is_unicolorzPixmap.is_unicolorc5  s    
 YYDDF!#	
 Qq) 	!F{.Aq9-r61=W$ 	! r*   c                    t         r)d }t        |      | j                  _        | j                  S t	        j
                  | j                        S )zThe size of one pixel.c                @    t        j                  | j                        S r,   )r   pixmap_nr   r.   s    r)   n2zPixmap.n.<locals>.n25  s    ~~dii00r*   )r  r3  r  rE   r   fz_pixmap_componentsr   )r(   ra  s     r)   rE   zPixmap.ny5  s:     1'|DNN66M))$))44r*   c                   t        |      }t        j                         }||_        |r|j	                  |       |r|j                  |       | j                  }t        |t              rt        j                  ||d|       yt        |      }	 t        j                  |||       |j                          y# |j                          w xY w)z4
        Save pixmap as an OCR-ed PDF page.
        r   N)get_tessdatar   FzPdfocrOptionsr	  language_set2datadir_set2r   r>   r  fz_save_pixmap_as_pdfocrr  fz_write_pixmap_as_pdfocrr  )r(   rf   r	  r'  tessdatar  r  r  s           r)   pdfocr_savezPixmap.pdfocr_save5  s      )$$& )x(iih$**C1dC'2C&//c4@##%##%s   B6 6Cc                |    t        |      }ddlm}  |       }| j                  ||||       |j	                         S )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   r 
  )r	  r'  rj  )rd  r9   r[  rk  rs  )r(   r	  r'  rj  r[  r
  s         r)   pdfocr_tobyteszPixmap.pdfocr_tobytes5  s;      )ix(XV||~r*   c                R   	 ddl m} | j                  }|sd}nB|j
                  dk(  r| j                  sdnd}n"|j
                  dk(  r| j                  sdnd	}nd
}|j                  || j                  | j                  f| j                        }|S # t        $ r t        d        w xY w)z&Create a Pillow Image from the Pixmap.r   )r  zPIL/Pillow not installedr  r   LAr   r  RGBAr  )PILr  r	  rr   r  rE   r  	frombytesrY  r  r  )r(   r  cspacer   r  s        r)   	pil_imagezPixmap.pil_image5  s    	!
 DXX]"jj3dDXX] $

5DDoodTZZ$=t||L
  	./	s   B B&c                    | j                         }d|j                         vr| j                  | j                  f|d<    |j                  |i | y)a6  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)rt  r  r  r  r  )r(   r  r  r  s       r)   pil_savezPixmap.pil_save5  sG     nn%!YY		2F5M$!&!r*   c                    t        j                         }| j                         }d|j                         vr| j                  | j
                  f|d<    |j                  |g|i | |j                         S )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  )r9   r[  rt  r  r  r  r  rs  )r(   r  r  	bytes_outr  s        r)   pil_tobyteszPixmap.pil_tobytes5  sf     JJL	nn%!YY		2F5M,T,V,!!##r*   c                   t         r+t        j                  | j                  j                  ||      S 	 |dk  sK|| j                  j                  j
                  k\  s(|dk  s#|| j                  j                  j                  k\  rt        t        t               | j                  j                  j                  }| j                  j                  j                  }||z  ||z  z   }t        | j                  |||z          }|S )zXGet 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_OUTSIDErF  rE   r   r   
samples_mv)r(   r"  r#  rE   r   rZ  rG   s          r)   rA  zPixmap.pixel5  s     %%dii&:&:AqAAq5		,,...q5		,,...%'78II  ""%%,,QJQT__a1-.
r*   c                0    | j                   }t        |      S r,   )r}  r  )r(   mvs     r)   r  zPixmap.samples5  s    __bzr*   c                z    | j                   $t        j                  | j                        | _         | j                   S )z,
        Pixmap samples memoryview.
        )r  r   r  r   r.   s    r)   r}  zPixmap.samples_mv5  s3     #$AA$))LDr*   c                R    | j                   r| j                   j                          y y r,   r  releaser.   s    r)   _samples_mv_releasezPixmap._samples_mv_release	6  "    $$& r*   c                @    t        j                  | j                        S r,   )r   fz_pixmap_samples_intr   r.   s    r)   samples_ptrzPixmap.samples_ptr6  s    **49955r*   c                   ddddddddddd
}t        |      t        u rn0t        |d      rt        |      }nt        |d	      r|j                  }|'t        j
                  j                  |      \  }}|dd
 }|j                  |j                         d
      }|(t        d| dt        |j                                      | j                  r|dv rt        d| d      | j                  r,| j                  j                  dkD  r|dv rt        d| d      |dk(  r&| j                  | j                   | j"                         | j%                  |||      S )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   rG  unsupported colorspace for ')r   r  r;   r   rd   r
   splitextr8   r  r   r   r  r  r  rE   r  r  r  r4  )r(   rf   r  r*  valid_formatsr  r  r2  s           r)   r  zPixmap.save6  sS     >S Xz*8}HXv&}}H>WW%%h/FAsWF5;}VHHU=CUCUCW=X<YZ[[::#*q(;<==??t0014	9I;F81EFF!8LLDII.~~h[99r*   c                <   | j                   }d}d}|j                         dk(  rt        t              t	        j
                  |      }t	        j                  |      }	t	        j                  |      }
|	|
z  |dz   z  }g d}g d}d}d}|r>t        |t        t        f      r(t        |      |k(  rt        |      D ]
  }||   ||<    d}|r>t        |t        t        f      r(t        |      |k(  rt        |      D ]
  }||   ||<    d}t               }d}|rJt        |t        t        f      r|}t        |      }nJ dt        |              ||	|
z  k  rt        d      	 t	        j                   ||||t	        j"                  |      |j$                  ||||
       y)a  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   r  r   r  r  r  r>   r   r   r7   rF  r  rZ  r   Pixmap_set_alpha_helperr  r   r  r  )r(   alphavaluespremultiplyopaquematter  r  r{  rE   r   r  balenr  rt  zero_outbgroundrZ  rz  data_lenr  r|  data_fix	fz_mul255s                          r)   	set_alphazPixmap.set_alpha:6  s    ii99;!o..%%c*!!#&""3'A1j$7CK1<L1X &"1Iq	&HZ63u:?1X &"1X
&Gw +y'9:"{+Q=d;>O=PQQq!a% "455)),,d3NNr*   c                   ddddddddddddd}|j                  |j                         d	      }|(t        d
| dt        |j	                                      | j
                  r|dv rt        d      | j                  r,| j                  j                  dkD  r|dv rt        d| d      |dk(  r&| j                  | j                  | j                         | j                  ||      }|S )zA
        Convert to binary image stream of desired type.
        r   r   r   rG  r   r  r  )r  r  r  r  r  r  tgatpicr  r  r  r  Nr  r  r  z'{output}' cannot have alphar  r  r   )r8   r  r   r   r  r  r  rE   r  r  r  r,  )r(   r  r*  r  r2  r+  s         r)   r  zPixmap.tobytes6  s    
  5;}VHHU=CUCUCW=X<YZ[[::#*;<<??t0014	9I;F81EFF!8LLDII.sK0r*   c                `    | j                   }||j                  _        ||j                  _        y)z"Set resolution in both dimensions.N)r   r   r  r  )r(   r  r  r  s       r)   r  zPixmap.set_dpi6  s#    YY!!r*   c                `    | j                   }||j                  _        ||j                  _        y)zSet top-left coordinates.N)r   r   r"  r#  )r(   r"  r#  r  s       r)   
set_originzPixmap.set_origin6  s!    YYr*   c                *   t         r,t        j                  | j                  j                  |||      S | j                  }t        |d|j                         dz
        rt        |d|j                         dz
        st        t              |j                         }t        |      D ]#  }||   }t        |dd      rt        t               t        j                  |      }||z  ||z  z   }	 t        |      D ]  }|j#                  ||z   ||           y)zSet color of pixel (x, y).r   r   r	  N)r  r   	set_pixelr   r   r  r   r  r   r|  rE   rF  MSG_BAD_COLOR_SEQr   r"  r  r}  r  )	r(   r"  r#  r  r  rE   r|  rZ  r   s	            r)   r  zPixmap.set_pixel6  s    ??499#7#7AuEEYY1bddfqj)!Q
1K/00DDFq 	5AaAAq#& "344	5 '',QJQ 1X 3!!!a%q23r*   c                   | j                   }|j                         }g }t        |      D ]4  }||   }t        |dd      st	        t
              |j                  |       6 t        |      }t        |||      }t        |      }|S )z Set color of all pixels in bbox.r   r	  )
r   rE   rF  r  r   r  rk   r  JM_fill_pixmap_rect_with_colorr   )	r(   r*  r  r  rE   r  r|  rZ  r   s	            r)   r  zPixmap.set_rect6  s    YYDDFq 	AaAAq#& "344HHQK		
  %*2q$7!W	r*   c                    |dk  rt        d       yt        j                  | j                  |       d| _        | j                          y)zgDivide width and height by 2**factor.
        E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)r   r   fz_subsample_pixmapr   r  r  )r(   factors     r)   shrinkzPixmap.shrink6  s?     A:89!!499f5   "r*   c                @    t        j                  | j                        S )zPixmap size.)r   fz_pixmap_sizer   r.   s    r)   r  zPixmap.size6  s     $$dii00r*   c                6    | j                   j                         S )z%Length of one image line (width * n).)r   r   r.   s    r)   r   zPixmap.stride6  s     yy!!r*   c                    | j                   r| j                   j                  dkD  rt        d       yt        j                  | j
                  ||      S )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)r  rE   rr   r   fz_tint_pixmapr   )r(   blackwhites      r)   	tint_withzPixmap.tint_with 7  s?    $//"3"3a"7>?##TYYu==r*   c                @    t        j                  | j                        S )z
The width.)r   r  r   r.   s    r)   r   zPixmap.w7  r  r*   c                    |j                   st        d      t        |      }|j                  |j                  |j
                  |j                  g}t        j                  | j                  |||      }t        |      S )z!Return pixmap from a warped quad.zquad must be convex)	is_convexr   r8  r  r&  r%  r$  r   fz_warp_pixmapr   r  )r(   r	  rY  r  r<  r  r
  s          r)   warpzPixmap.warp7  s`    ~~Z0E%FFD!44qttQTT*""DIIvufEs|r*   c                @    t        j                  | j                        S )zx component of Pixmap origin.)r   fz_pixmap_xr   r.   s    r)   r"  zPixmap.x7         ++r*   c                6    | j                   j                         S )zResolution in x direction.)r   r  r.   s    r)   r  zPixmap.xres7       yy~~r*   c                @    t        j                  | j                        S )zy component of Pixmap origin.)r   fz_pixmap_yr   r.   s    r)   r#  zPixmap.y7  r  r*   c                6    | j                   j                         S )zResolution in y direction.)r   r  r.   s    r)   r  zPixmap.yres#7  r  r*   c                R    | j                   r| j                   j                          y y r,   r  r.   s    r)   r  zPixmap.__del__+7  r  r*   r	  r  r,   )r   NN)TengN)r0
  r  )N_   )Nr   NN)r  r  )5r/   r0   r1   r   r   r   r,  r4  r3  r  rs  r=  rC  r  rP  r  rK  r  rP  r   rV  r]  rE   rk  rm  rt  rv  ry  rA  r  r}  r  r  r  r  r  r  r  r  r  r  r  r   r  r   r  r"  r  r#  r  rY  r  r  r-   r*   r)   r  r  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                      e Zd Zd Zd Zd Zd Zd Zd Zdddd	Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zed        ZeZeZy)r  c                    t        j                  | j                  | j                  z  | j                  | j                  z  z         S r,   )r
  r
  r"  r#  r.   s    r)   r  zPoint.__abs__27  s.    yy$&&466DFF?:;;r*   c                    t        |d      r&t        | j                  |z   | j                  |z         S t	        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z         S Nrf  r   Point: bad seq lenr   r   r;   r  r"  r#  r7   r   r(   r  s     r)   r
  zPoint.__add__57  e    1k"!TVVaZ00q6Q;122TVVad]DFFQqTM22r*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r.   s    r)   r   zPoint.__bool__<7  r  r*   c                H    t        |d      syt        |      dk(  xr | |z
   S )Nr   Fr   r  r  s     r)   r  zPoint.__eq__?7  s(    q)$1v{-D1H~-r*   c                8    | j                   | j                  f|   S r,   r"  r#  r  s     r)   r]  zPoint.__getitem__D7  s    ""r*   c                *    t        t        |             S r,   rU  r   r.   s    r)   rV  zPoint.__hash__G7      E$K  r*   Nr  c               n   |sd| _         d| _        nt        |      dkD  rt        d      t        |      dk(  r't	        |d         | _         t	        |d         | _        nt        |      dk(  r|d   }t        |t        j                  t        j                  f      r#|j                   | _         |j                  | _        nbt        |d      st        d      t        |      dk7  rt        d      t	        |d         | _         t	        |d         | _        nt        d      ||| _         ||| _        yy)	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)
r"  r#  r7   r   rk  r>   r   r   fz_pointr;   )r(   r"  r#  r  r  s        r)   r   zPoint.__init__J7  s    DFDFY]122Y!^47^DF47^DFY!^QA!emmU^^<=q-0$%677q6Q;$%9::qtqt122=QDF=QDF=r*   c                     yNr   r-   r.   s    r)   r   zPoint.__len__l7  r!  r*   c                   t        |d      r&t        | j                  |z  | j                  |z        S t        |d      r3t	        |      dk(  r%| j                  |d   z  | j                  |d   z  z   S t        |       }|j                  |      S )Nrf  r]  r   r   r   )r;   r  r"  r#  r7   r  )r(   r{  r  s      r)   r$  zPoint.__mul__o7  sw    1k"!TVVaZ001m$Q166AaD=466AaD=00$K{{1~r*   c                F    t        | j                   | j                         S r,   )r  r"  r#  r.   s    r)   r&  zPoint.__neg__x7  s    dffWtvvg&&r*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r.   s    r)   r(  zPoint.__nonzero__{7  r  r*   c                    t        |       S r,   )r  r.   s    r)   r*  zPoint.__pos__~7  r  r*   c                0    dt        t        |             z   S )Nr  r,  r.   s    r)   r   zPoint.__repr__7      U4[)))r*   c                b    t        |      }|dk(  r|| _        y |dk(  r|| _        y t        d      )Nr   r   r.  )rk  r"  r#  r  r/  s      r)   r0  zPoint.__setitem__7  s?    !H!VaTV  !VaTV  122r*   c                    t        |d      r&t        | j                  |z
  | j                  |z
        S t	        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
        S r  r  r  s     r)   r2  zPoint.__sub__7  r  r*   c                    t        |d      r,t        | j                  dz  |z  | j                  dz  |z        S t	        |      d   }|st        d      t        |       }|j                  |      S r4  )r;   r  r"  r#  r5  r6  r  )r(   r{  r  r  s       r)   r8  zPoint.__truediv__7  sf    1k""QA66"1%#$;<<$K{{2r*   c                ,   | j                   | j                   z  | j                  | j                  z  z   }|t        k  rt        dd      S t	        j
                  |      }t        t        | j                         |z  t        | j                        |z        S )z&Unit vector with positive coordinates.r   )r"  r#  r?  r  r
  r
  r  r(   rn  s     r)   abs_unitzPoint.abs_unit7  sk     FFTVVOdfftvvo-w;1:IIaLS[1_c$&&kAo66r*   c                   t        |      dkD  st        d      |d   }t        |      dk(  rt        |      }n%t        |      dk(  rt        |      }nt        d      t        |      dkD  r|d   }nd}dd	d
dd}||   d   ||   d   z  }t	        |      t        u rt        | |z
        |z  S t        |j                  |j                        }||j                  z  }| |v ry| j                  |j                  kD  r| j                  |j                  k\  r| j                  |j                  |      S | j                  |j                  k  r| j                  |j                  |      S | j                  |j                  z
  |z  S |j                  | j                  cxk  r|j                  k  rTn nQ| j                  |j                  k\  r| j                  |j                  z
  |z  S |j                  | j                  z
  |z  S | j                  |j                  k\  r| j                  |j                   |      S | j                  |j                  k  r| j                  |j                  |      S |j                  | j                  z
  |z  S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenr   rG  z$arg1 must be point-like or rect-liker   rW  )r  r  r        R@gRQ@r  gffffff9@r  rW  incmmmr  )r7   r   r  r  r   r  top_leftbottom_rightr"  r  r#  r  distance_tor  	top_rightr  bottom_left)r(   r  r"  unitur  r  s          r)   r  zPoint.distance_to7  s   4y1}CDDGq6Q;aAVq[QACDDt9q=7DD(+ dGAJ4#7etax=1$$ QZZ(1966ADD=vv~''==144''T::**TTTVV#qtt#vv~**tvv**vv~''t<<144''

D99tvv**r*   c                j    t        |      dk7  rt        d      t        | |      \  | _        | _        | S )z7Replace point by its transformation with matrix-like m.r  r  )r7   r   util_transform_pointr"  r#  r	  s     r)   r  zPoint.transform7  s2    q6Q;233-dA6r*   c                   | j                   | j                   z  | j                  | j                  z  z   }|t        k  rt        dd      S t	        j
                  |      }t        | j                   |z  | j                  |z        S )zUnit vector of the point.r   )r"  r#  r?  r  r
  r
  r  s     r)   r  z
Point.unit7  sc     FFTVVOdfftvvo-w;1:IIaLTVVaZ!,,r*   )r/   r0   r1   r  r
  r   r  r]  rV  r   r   r$  r&  r(  r*  r   r0  r2  r8  r3  r  r  r  r  rP  rQ  r-   r*   r)   r  r  07  s    <31.
#! !%  'D'1*3 7 70+d - - GDr*   r  c                     e Zd Zd Zd Zd Zd Zd Zd Zd Z	ddddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zed        Zed        Zd Zed        Zd ZeZ ed       Z ed       Zy)r  c                    | j                   ryt        | j                  | j                  z
        t        | j                  | j                  z
        z  S Nr  )r  r  r  r&  r$  r.   s    r)   r  zQuad.__abs__7  s;    ==477TWW$%DGGdgg,=(>>>r*   c                l   t        |d      rBt        | j                  |z   | j                  |z   | j                  |z   | j
                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z         S Nrf  rG  Quad: bad seq lenr   r   r   r   r;   r  r  r&  r$  r%  r7   r   r(   r<  s     r)   r
  zQuad.__add__7      1k"!TWWq[$''A+tww{KKq6Q;011DGGadNDGGadNDGGadNDGGaPQdNSSr*   c                    | j                    S r,   r  r.   s    r)   r   zQuad.__bool__7      ==  r*   c                t   	 |j                         }|dk(  rt	        ||       S |dk7  ryt        |      r6t        |      j                  ryt	        |d d |       xr t	        |dd  |       S t        |      r"t        d      D ]  }t	        ||   |       r y yy# t        $ r t        dkD  r
t                Y yw xY w)Nr   Fr   rG  T)
r   rg   r  rv   util_point_in_quad	CheckRectr  r  	CheckQuadrF  )r(   r"  r  rZ  s       r)   r  zQuad.__contains__7  s    			A 6%a..6Q<Aw%aeT2V7I!AB%QU7VVQ<1X !)!A$5 ! !  	#a'N,<	s   B B76B7c                    t        |d      syt        |      dk(  xrN | j                  |d   k(  xr: | j                  |d   k(  xr& | j                  |d   k(  xr | j
                  |d   k(  S Nr   FrG  r   r   r   r   )r;   r7   r  r&  r$  r%  )r(   r	  s     r)   r  zQuad.__eq__8  su    tY'4yA~ 
GGtAw GGtAwGGtAw GGtAw		
r*   c                d    | j                   | j                  | j                  | j                  f|   S r,   r  r&  r$  r%  r  s     r)   r]  zQuad.__getitem__8  &    $''4773A66r*   c                *    t        t        |             S r,   r  r.   s    r)   rV  zQuad.__hash__8  r  r*   Nr  c                  |s&t               x| _        x| _        x| _        | _        nWt        |      dkD  rt        d      t        |      dk(  r+t        t         |      \  | _        | _        | _        | _        nt        |      dk(  r|d   }t        |t        j                        rs|| _        t        |j                        t        |j                        t        |j                        t        |j                        f\  | _        | _        | _        | _        net        |d      st        d      t        |      dk7  rt        d      t        t         |      \  | _        | _        | _        | _        nt        d      |t        |      | _        |t        |      | _        |t        |      | _        |t        |      | _        yy)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.
    
        rG  r  r   r   r]  zQuad: bad argsN)r  r  r&  r$  r%  r7   r   r  r>   r   FzQuadr   r;   )r(   r  r&  r$  r%  r  r  s          r)   r   zQuad.__init__!8  sg    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                     yNrG  r-   r.   s    r)   r   zQuad.__len__D8  r!  r*   c                >    t        |       }|j                  |      }|S r,   )r  r  )r(   r{  r<  s      r)   r$  zQuad.__mul__G8  s    JKKNr*   c                v    t        | j                   | j                   | j                   | j                         S r,   )r  r  r&  r$  r%  r.   s    r)   r&  zQuad.__neg__L8  +    TWWHtwwh477(;;r*   c                    | j                    S r,   r  r.   s    r)   r(  zQuad.__nonzero__O8  r  r*   c                    t        |       S r,   )r  r.   s    r)   r*  zQuad.__pos__R8      Dzr*   c                0    dt        t        |             z   S )Nr  r,  r.   s    r)   r   zQuad.__repr__U8      E$K(((r*   c                    |dk(  rt        |      | _        y |dk(  rt        |      | _        y |dk(  rt        |      | _        y |dk(  rt        |      | _        y t        d      Nr   r   r   r   r.  )r  r  r&  r$  r%  r  r/  s      r)   r0  zQuad.__setitem__X8  sn    !VuQxTW  !VuQxTW
 	 !VuQxTW  !VuQxTW  122r*   c                l   t        |d      rBt        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
        S r  r  r  s     r)   r2  zQuad.__sub__a8  r	  r*   c                    t        |d      rd|z  }nt        |      d   }|st        d      t        |       }|j	                  |      }|S )Nrf  r  r   zMatrix not invertible)r;   r5  r6  r  r  )r(   r{  r  r<  s       r)   r8  zQuad.__truediv__h8  sN    1k"aB#A&q)B'(?@@JKKOr*   c                p   t        | j                  | j                        }| j                  |z  }| j                  |z  }|j
                  |j
                  z  dkD  ryt        | j                  | j                        }| j                  |z  }| j                  |z  }|j
                  |j
                  z  dkD  ryy)zCheck if quad is convex and not degenerate.

        Notes:
            Check that for the two diagonals, the other two corners are not
            on the same side of the diagonal.
        Returns:
            True or False.
        r   FT)planish_liner  r%  r$  r&  r#  )r(   r{  r  r  s       r)   r  zQuad.is_convexs8  s     $''*WWq[WWq[44"$$;?$''*WWq[WWq[44"$$;?r*   c                R    | j                   t        k  xs | j                  t        k  S )zsCheck whether all quad corners are on the same line.

        This is the case if width or height is zero.
        )rY  r?  r  r.   s    r)   r  zQuad.is_empty8  s!     zzG#<t{{W'<<r*   c                .    | j                   j                  S )z(Check whether this is the infinite quad.)r   r  r.   s    r)   r  zQuad.is_infinite8  s     yy$$$r*   c                   t        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryt        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryt        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryy)zCheck if quad is rectangular.

        Notes:
            Some rotation matrix can thus transform it into a rectangle.
            This is equivalent to three corners enclose 90 degrees.
        Returns:
            True or False.
        r   FT)util_sine_betweenr  r&  r%  r  r?  r$  )r(   sines     r)   is_rectangularzQuad.is_rectangular8  s     !$''477;tax=7" $''477;tax=7" $''477;tax=7"r*   c                    | j                   r
t               S t        dd      j                  |j                  |j
                        }| | z  |z  |z  }|S )zSMorph the quad with matrix-like 'm' and point-like 'p'.

        Return a new quad.r   )r  INFINITE_QUADrp  rN  r"  r#  )r(   r  r{  deltar<  s        r)   r  z
Quad.morph8  sO      ?"q!))!##qss3E6MA%r*   c                2   t               }t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_	        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        |S r,   )r  r  r  r"  r&  r%  r$  r  r#  r  r  r  r  r(   r  s     r)   r   z	Quad.rect8  s    F47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>r*   c                    t        |d      rnt        |      dk7  rt        d      | xj                  |z  c_        | xj                  |z  c_        | xj
                  |z  c_        | xj                  |z  c_        | S )z1Replace quad by its transformation with matrix m.rf  r  r  )r;   r7   r   r  r&  r$  r%  r	  s     r)   r  zQuad.transform8  s_    1k"Vq[2331111r*   c                    t        t        | j                  | j                  z
        t        | j                  | j
                  z
              S r,   )r  r  r  r&  r$  r%  r.   s    r)   rY	  zQuad.<lambda>8  1    3s477TWW+<'=s477TWWCT?U#V r*   c                    t        t        | j                  | j                  z
        t        | j                  | j
                  z
              S r,   )r  r  r  r$  r&  r%  r.   s    r)   rY	  zQuad.<lambda>8  r6  r*   )r/   r0   r1   r  r
  r   r  r  r]  rV  r   r   r$  r&  r(  r*  r   r0  r2  r8  r3  r  r  r  r.  r  r   r  rP  rY  r  r-   r*   r)   r  r  7  s    ?
T!*
7! "&$4D !0F
<!)T	  * = = % %  0  
 GVWEVWFr*   r  c                     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	d	d	d	d	d	d
dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zd Zed        Zd,dZd Zd Zd Zd Zed        Z ed         Z!ed!        Z"d" Z#d# Z$d$ Z%ed%        Z&d& Z'ed'        Z(ed(        Z)d) Z*d* Z+ed+        Z,eZ-eZ.eZ/ ee'      Z0e(Z1e)Z2y	)-r  c                    | j                   s| j                  ry| j                  | j                  z
  | j                  | j
                  z
  z  S r  )r  r  r  r  r  r  r.   s    r)   r  zRect.__abs__8  s9    ==D,,$''!dgg&788r*   c                l   t        |d      rBt        | j                  |z   | j                  |z   | j                  |z   | j
                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z         S Nrf  rG  Rect: bad seq lenr   r   r   r   r;   r  r  r  r  r  r7   r   r  s     r)   r
  zRect.__add__8  r	  r*   c                ~    t        |d      st        d      t        |      }t        |       }|j                  |      S )Nr   bad operand 2)r;   r   r  	intersect)r(   r"  r  r  s       r)   __and__zRect.__and__8  s7    q)$_--!WJ{{2r*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r.   s    r)   r   zRect.__bool__8  r  r*   c                   t        |d      r|t        |       v S t        |      }|dk(  rt        ||       S |dk(  rt	               }	 t        |      }| j                  |j                  cxk  xr! |j                  cxk  xr | j                  k  nc xr@ | j                  |j                  cxk  xr! |j                  cxk  xr | j                  k  S c S y# t        $ r+ t        dkD  r
t                t        |      j                  }Y w xY w)Nrf  r   rG  r   F)r;   r   r7   util_is_point_in_rectINFINITE_RECTr  rg   r  rv   r  r   r  r  r  r  )r(   r"  r  r  s       r)   r  zRect.__contains__8  s    1k"d##F6(D116A!G GGqtt6qtt6tww6 7GGqtt6qtt6tww6868  !'!+0@GLL!s   C 1DDc                H    t        |d      syt        |      dk(  xr | |z
   S )Nr   FrG  r  r  s     r)   r  zRect.__eq__8  s)    tY'4yA~3td{"33r*   c                d    | j                   | j                  | j                  | j                  f|   S r,   r  r  r  r  r  s     r)   r]  zRect.__getitem__9  r  r*   c                *    t        t        |             S r,   r  r.   s    r)   rV  zRect.__hash__9  r  r*   Nrf  r  r  r  r  r  c          
         t        |||||||d\  }}}}t        |      | _        t        |      | _        t        |      | _        t        |      | _        y)aa  
        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.
        rJ  N)util_make_rectrk  r  r  r  r  r(   rf  r  r  r  r  r  r  s           r)   r   zRect.__init__9  sO     ($2"rVXYBB****r*   c                     yr  r-   r.   s    r)   r   zRect.__len__9  r!  r*   c                    t        |d      rBt        | j                  |z  | j                  |z  | j                  |z  | j
                  |z        S t        |       }|j                  |      }|S )Nrf  )r;   r  r  r  r  r  r  )r(   r{  r  s      r)   r$  zRect.__mul__9  sX    1k"!TWWq[$''A+tww{KKJKKNr*   c                v    t        | j                   | j                   | j                   | j                         S r,   )r  r  r  r  r  r.   s    r)   r&  zRect.__neg__%9  r  r*   c                J    t        |       t        |       cxk(  xr dk(   S c  S r   r  r.   s    r)   r(  zRect.__nonzero__(9  r  r*   c                    t        |d      st        d      t        |       }t        |      dk(  r|j	                  |      S t        |      dk(  r|j                  |      S t        d      )Nr   r?  r   rG  )r;   r   r  r7   include_pointinclude_rect)r(   r"  r  s      r)   __or__zRect.__or__+9  s_    q)$_--Jq6Q;??1%%q6Q;>>!$$))r*   c                    t        |       S r,   r  r.   s    r)   r*  zRect.__pos__59  r   r*   c                0    dt        t        |             z   S )Nr  r,  r.   s    r)   r   zRect.__repr__89  r"  r*   c                    t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      r$  )rk  r  r  r  r  r  r/  s      r)   r0  zRect.__setitem__;9  sg    !H!VqTW  !VqTW
 	 !VqTW  !VqTW  122r*   c                l   t        |d      rBt        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
        S r;  r=  r  s     r)   r2  zRect.__sub__E9  r	  r*   c                .   t        |d      rNt        | j                  dz  |z  | j                  dz  |z  | j                  dz  |z  | j
                  dz  |z        S t        |      d   }|st        d|       t        |       }|j                  |      }|S )Nrf  r  r   zMatrix not invertible: )	r;   r  r  r  r  r  r5  r6  r  )r(   r{  r  r  s       r)   r8  zRect.__truediv__L9  s    1k""Q"Q"QRTUVWW"1%#&=aS$ABBJKKOr*   c                B    t        | j                  | j                        S zBottom-left corner.r  r  r  r.   s    r)   r  zRect.bottom_leftV9       TWWdgg&&r*   c                B    t        | j                  | j                        S zBottom-right corner.r  r  r  r.   s    r)   r  zRect.bottom_right[9  r_  r*   c                $    | j                  |      S )z.Check if containing point-like or rect-like x.r  r  s     r)   containszRect.contains`9        ##r*   c                H    t        d| j                  | j                  z
        S r   r  r  r  r.   s    r)   r  zRect.heightd9      1dgg'((r*   c                D    t        | j                  | j                  |      S zUCalculate area of rectangle.
parameter is one of 'px' (default), 'in', 'cm', or 'mm'.
_rect_arearY  r  r;  s     r)   get_areazRect.get_areah9      $**dkk488r*   c                    t        |      dk7  rt        d      t        | |      \  | _        | _        | _        | _        | S )zExtend to include point-like p.r   r  )r7   r   util_include_point_in_rectr  r  r  r  r  s     r)   rS  zRect.include_pointl9  s;    q6Q;122-Ga-P*$'47r*   c                   t        |      dk7  rt        d      t        |      }|j                  s| j                  r1t        t        t
        t
        f\  | _        | _        | _        | _	        | S |j                  r| S | j                  rI|j                  |j                  |j                  |j                  f\  | _        | _        | _        | _	        | S t        | |      \  | _        | _        | _        | _	        | S )zExtend to include rect-like r.rG  r<  )r7   r   r  r  r  r  r  r  r  r  r  util_union_rectr3  s     r)   rT  zRect.include_rects9  s    q6Q;011G==D,,1@/Sbds1s.DGTWdgtw  ZZK]]12qttQTT1441G.DGTWdgtw  2Aq1I.DGTWdgtwr*   c                $   t        |      dk(  st        d      t        |      }|j                  r| S | j                  rI|j                  |j
                  |j                  |j                  f\  | _        | _        | _        | _        | S |j                  rI|j                  |j
                  |j                  |j                  f\  | _        | _        | _        | _        | S | j                  r| S t        | |      \  | _        | _        | _        | _        | S )z)Restrict to common rect with rect-like r.rG  r<  )
r7   r   r  r  r  r  r  r  r  util_intersect_rectr3  s     r)   r@  zRect.intersect9  s    1v{011G==K12qttQTT1441G.DGTWdgtw  ZZ12qttQTT1441G.DGTWdgtw
 	 ]]K1DT11M.DGTWdgtwr*   c                f   t        |      }	 | j                   xr | j                   xr |j                   xry |j                   xrj | j                  |j                  k  xrO |j                  | j                  k  xr4 | j
                  |j                  k  xr |j
                  | j                  k  S )z4Check if intersection with rectangle x is not empty.)r  r  r  r  r  r  r  )r(   r"  rect2s      r)   
intersectszRect.intersects9  s    Q'%'(((' &' )))	'
 GGehh&' HHtww&' GGehh&' HHtww&		r*   c                j    | j                   | j                  k\  xs | j                  | j                  k\  S z True if rectangle area is empty.r  r  r  r  r.   s    r)   r  zRect.is_empty9  )     ww$''!7TWW%77r*   c                    | j                   | j                  cxk(  xr	 t        k(  nc xr( | j                  | j                  cxk(  xr	 t
        k(  S c S )z'True if this is the infinite rectangle.r  r  r  r  r  r  r.   s    r)   r  zRect.is_infinite9  9     ww$''4_4^DGG9^9^^9^^r*   c                j    | j                   | j                  k  xr | j                  | j                  k  S zTrue if rectangle is valid.r{  r.   s    r)   is_validzRect.is_valid9  )     ww$''!8dgg&88r*   c                f    | j                   r
t               S | j                  j                  ||      S zGMorph with matrix-like m and point-like p.

        Returns a new quad.r  r0  r	  r  r(   r  r{  s      r)   r  z
Rect.morph9  *      ?"yyq!$$r*   c           	     j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r,   r
  r  s     r)   rQ  z	Rect.norm9  r  r  c                    | j                   | j                  k  r#| j                   | j                  c| _        | _         | j                  | j                  k  r#| j                  | j                  c| _        | _        | S )z*Replace rectangle with its finite version.r   r.   s    r)   r  zRect.normalize9  W    77TWW#wwDGTW77TWW#wwDGTWr*   c                n    t        | j                  | j                  | j                  | j                        S z!Return Quad version of rectangle.r  r  r  r<  r  r.   s    r)   r	  z	Rect.quad9  %     DGGTWWdggtww77r*   c                *    t        t        |             S )zReturn the IRect.)r  util_round_rectr.   s    r)   r  z
Rect.round9  s    _T*++r*   c                B    t        | j                  | j                        S zTop-left corner.r  r  r  r.   s    r)   r  zRect.top_left9  r_  r*   c                B    t        | j                  | j                        S zTop-right corner.r  r  r  r.   s    r)   r  zRect.top_right9  r_  r*   c           	        t        |      }| j                  s$| j                  s|j                  s|j                  rt        d      t	        dddd| j
                   | j                         t	        |j                  | j                  z  |j                  | j                  z        z  t	        dddd|j
                  |j                        z  S z+Return matrix that converts to target rect.z'rectangles must be finite and not emptyr   r   	r  r  r  r   rp  r  r  rY  r  r3  s     r)   torectzRect.torect9  s     Gt}}FGG1aAx$''2QWWtzz)188dkk+ABCQ1aqtt,-	
r*   c                    t        |      dk(  st        d      t        | |      \  | _        | _        | _        | _        | S )z1Replace with the transformation by matrix-like m.r  r  )r7   r   util_transform_rectr  r  r  r  r	  s     r)   r  zRect.transform9  s;    1v{233-@q-I*$'47r*   c                H    t        d| j                  | j                  z
        S r   r  r  r  r.   s    r)   rY  z
Rect.width9  ri  r*   r0
  rk  )3r/   r0   r1   r  r
  rA  r   r  r  r]  rV  r   r   r$  r&  r(  rU  r*  r   r0  r2  r8  r3  r  r  re  r  rn  rS  rT  r@  rx  r  r  r  r  rQ  r  r	  r  r  r  r  r  rY  rP  r<  r  r   r  r  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                  <   e Zd ZdZed        ZddZd ZddZddZ		 	 	 	 	 	 	 	 	 	 d dZ
d!dZd"d	Z	 	 	 	 	 	 	 	 d#d
Z	 d$	 	 	 	 	 	 	 	 	 d%dZddd&dZd'dZ	 d(	 	 	 	 	 	 	 d)dZ	 d(	 	 	 	 	 ddZddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*dZddddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZ	 	 	 	 	 	 	 	 	 	 	 	 d,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-dZd$d.dZy)/r  zCreate a new shape.c                B   t        || z
        j                  }t        j                  t	        |j
                              }|j                  dk  r:|j
                  dk  rt        j                  |z
   }|S t        j                  |z
  }|S |j
                  dk\  r	 |S | }|S )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  r#  r"  pi)r  r  r	  alfas       r)   horizontal_anglezShape.horizontal_angle9  s     !a%LyyQSS"337ssax4(  ww~ 	 ssax  ur*   c                   t        |       || _        |j                  | _        | j                  j                  st        d      |j                  j                  | _        |j                  j                  | _
        |j                  j                  | _	        |j                  j                  | _        |j                  | _        | j                   | _        d| _        d| _        d| _        d | _        d | _        y )Nr  r\   )ra  r   r   r%  r  r   r  r#  r  r"  rY  rm  rf  pctmipctmr  	text_cont	totalcontr   r   r+  s     r)   r   zShape.__init__:  s    D	;;xx[))((**''))
&&((&&((..	iiZ
	r*   c                X   | j                   1t        |      dk(  rt        ||      | _         y t        |      | _         y t        |      dk(  rt        |      }t	        | j                   j
                  |j                        | j                   _        t	        | j                   j                  |j                        | j                   _        t        | j                   j                  |j                        | j                   _
        t        | j                   j                  |j                        | j                   _        y t        |      }t	        | j                   j
                  |j
                        | j                   _        t	        | j                   j                  |j                        | j                   _        t        | j                   j                  |j                        | j                   _
        t        | j                   j                  |j                        | j                   _        y r  )r   r7   r  r  r  r  r"  r  r#  r  r  r  r  s     r)   
updateRectzShape.updateRect!:  s>   991v{ AJ	 G	 1v{!H"499<<5		"499<<5		"499<<5		"499<<5		G"499<<6		"499<<6		"499<<6		"499<<6		r*   c                   t        |      }t        |      }| j                  |k(  sO| xj                  t        t	        || j
                  z              dz   z  c_        || _        | j                  |       | xj                  t        t	        || j
                  z              dz   z  c_        | j                  |       || _        | j                  S )zDraw a line between two points. m
 l
)r  r   r  r   r  r  r  )r(   r  r  s      r)   r  zShape.draw_line6:  s    2Y2Y2%NNidjj(ABVKKN DOOOB)HR$**_$=>GGr*   c           
        t        |      D ]  \  }}|dk(  ri| j                  t        |      k(  s| xj                  t	        t        t        |      | j                  z              dz   z  c_        t        |      | _        n@| xj                  t	        t        t        |      | j                  z              dz   z  c_        | j                  |        t        |d         | _        | j                  S )z%Draw several connected line segments.r   r  r  r  )r  r   r  r  r   r  r  r  )r(   r  rZ  r  s       r)   r  zShape.draw_polylineD:  s    f% 	DAqAv583NNiqDJJ9N0O&PSY&YYN&+AhDO)HU1X

5J,K"Lv"UUOOA	  r
+r*   c                |   t        |      }t        |      }t        |      }t        |      }| j                  |k(  s7| xj                  t        t	        || j
                  z              dz   z  c_        t	        t        || j
                  z        t        || j
                  z        z   t        || j
                  z        z         }| xj                  t        |      dz   z  c_        | j                  |       | j                  |       | j                  |       | j                  |       || _        | j                  S )z#Draw a standard cubic Bezier curve.r   c
)r  r   r  r   r  r  r   r  )r(   r  r  r  r  r  s         r)   r  zShape.draw_bezierR:  s     2Y2Y2Y2Y2%NNidjj(ABVKKNR$**_-R$**_0EERRVR\R\_H]]^)D/F22r*   c                   t        |      dk7  rt        d      t        |d   d      rt        |      j                  }nt        |      }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }| j                  |k(  s>| xj                  t        t        || j                  z              dz   z  c_        || _
        | j                  ||j                  |       | j                  ||j                  |       | j                  ||j                  |       | j                  ||j                  |       | j!                  |j"                         || _
        | j                  S )z"Draw an ellipse inside a tetrapod.rG  zinvalid arg lengthr   rf  r8  r  )r7   r   r;   r  r	  r  r  r&  r%  r$  r   r  r   r  r  r  r  r   )r(   tetrar<  mtmrr  mls          r)   r  zShape.draw_ovali:  sd   u:?12258[)U  AUATTQTTADD[C''TTQTTADD[C''TTQTTADD[C''TTQTTADD[C''2%NNidjj(ABVKKN DOADD"%ADD"%ADD"%ADD"%r*   c                x    |t         kD  st        d      t        |      }||dfz
  }| j                  ||dd      S )r  radius must be positiver   r  Fr  )r?  r   r  r  )r(   r:  r  r  s       r)   r  zShape.draw_circle:  sG    677vvqk!CEBBr*   c                    d}t        |      }t        |      }t        |      }|||z
  |z  z   }|||z
  |z  z   }| j                  ||||      S )z4Draw a curve between points using one control point.7.SQ?)r  r  )r(   r  r  r  kappak1k2s          r)   r  zShape.draw_curve:  sa     2Y2Y2Y27e##27e##BB//r*   c                R   t        |      }t        |      }d }d }d }t        j                  |       }t        j                  t        j                  d|            dz  }	t        j                  t        j                  d|            }
|
dz  }t	        |      dt        j
                  z  kD  r%||	z  }t	        |      dt        j
                  z  kD  r%| j                  |k(  s5| xj                   |t        || j                  z         z  c_        || _        t        dd      }|}|}||z
  }t	        |      }|t        kD  st        d	      | j                  ||      }t	        |      t	        |
      kD  r|j                  t        j                  ||
z         |z  z   }|j                  t        j                   ||
z         |z  z   }t        ||      }|j                  t        j                  ||z         |z  t        j                  |      z  z   }|j                  t        j                   ||z         |z  t        j                  |      z  z   }t        ||      }d
t        j                  |      z
  dz  dz  t	        ||z
        z  }|t	        ||z
        z  }|||z
  |z  z   }|||z
  |z  z   }| xj                   |t        t#        || j                  z        t#        || j                  z        z   t#        || j                  z        z          z  c_        ||
z  }||
z  }|}t	        |      t	        |
      kD  rt	        |      dkD  r|dz  }|j                  t        j                  ||z         |z  z   }|j                  t        j                   ||z         |z  z   }t        ||      }|j                  t        j                  ||z         |z  t        j                  |      z  z   }|j                  t        j                   ||z         |z  t        j                  |      z  z   }t        ||      }d
t        j                  |      z
  dz  dz  t	        ||z
        z  }|t	        ||z
        z  d
t        j                  |      z
  z  }|||z
  |z  z   }|||z
  |z  z   }| xj                   |t        t#        || j                  z        t#        || j                  z        z   t#        || j                  z        z          z  c_        |r| xj                   |t        || j                  z         z  c_        | xj                   |t        || j                  z         z  c_        | xj                   |t        || j                  z         z  c_        || _        | j                  S )zDraw a circle sector.c                "    t        | |f      dz   S )Nr  r   r!   r
  s     r)   rY	  z#Shape.draw_sector.<locals>.<lambda>:      )QF+f4 r*   c                *    t        | |||||f      dz   S )Nr  r  r  s         r)   rY	  z#Shape.draw_sector.<locals>.<lambda>:  s    iAq!Q0B&Cf&L r*   c                "    t        | |f      dz   S )Nr  r  r  s     r)   rY	  z#Shape.draw_sector.<locals>.<lambda>:  r  r*   r  r  r  r   r   r  r   rG  r   MbP?)r  r
  r  copysignr  r  r   r  r  r  r?  r   r  r"  r  r#  r  r   )r(   r:  r'  r  r  l3l4l5betarw360w90w45r   r  r  r	  rB  r  q1q2r  r  r  kappahr  cp1cp2beta2s                               r)   r  zShape.draw_sector:  s    ve4L4dU#||DMM#u56"=ll4==U34Ag%j1tww;&TME %j1tww;&5(NNb(54::+=">??N#DO!QKE!fW}677$$VU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QZ'Eq1uo%Cq1uo%CNNb(S4::%&cDJJ.>)??$q4::~BVV#  N SLE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QZ'1txx+>?Eq1uo%Cq1uo%CNNb(S4::%&cDJJ.>)??$q4::~BVV#  N NNb(54::+=">??NNNb(6DJJ+>"?@@NNNb(1tzz>":;;Nr*   Nr  c          
        t        |      }|| xj                  t        t        t	        |j
                  | j                  z        |j                  |j                  gz               dz   z  c_        | j                  |       |j                  | _        | j                  S t        |d      rE|dk  s|dkD  rt        d| d      t        |j                  |j                        |z  }|df}d|f}n}t        |d      rbt        |      dk(  rT|\  }}||j                  z  df}d||j                  z  f}t        ||      dk  st!        ||      dkD  rt        d| d      t        d| d      | j#                  |j                  |z   |j
                  |z
        }	| j%                  |	|j
                  |j
                  |z         }	| j#                  |	|j&                  |z
        }	| j%                  |	|j&                  |j&                  |z
        }	| j#                  |	|j(                  |z         }	| j%                  |	|j(                  |j(                  |z
        }	| j#                  |	|j                  |z         }	| j%                  |	|j                  |j                  |z         | _        | j                  |       | j                  S )	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
rf  r   r8  zbad radius value r   r   r   )r  r  r   r  r   r<  r  rY  r  r  r  r   r;   r   r  r7   r  r  r  r  r  )
r(   r   r  r  r  rW  pyrxryrg  s
             r)   rC  zShape.draw_rect:  sX    J>NNiQTTDJJ&'177AHH*==)  N OOAddDO??" 6;'{fsl #4VHA!>??AGGQXX&/AQBQBVY'CK1,<FBqww,"BR!((]#B2r{a3r2;#4 #4VHA!>??0:;;^^ADD2Iqttby1__Rqttby1^^Br	*__Rqttby1^^Br	*__Rqttby1^^Br	*//"addADD2I>r*   c                    t        |      }| j                  |j                  |j                  |j                  |j
                  |j                  g      S )zDraw a Quad.)r  r  r  r$  r%  r&  )r(   r	  r<  s      r)   r  zShape.draw_quad;  s;    J!!144qttQTT144"@AAr*   c                   t        |      }t        |      }||z
  }t        |      }dt        t        |d|z  z  d            z  }|dk  rt	        d      ||z  }t        t        ||            }| }	g }
t        d|      D ]G  }|dz  dk(  rt        |d      |z  }n|dz  dk(  rt        |d      |z  }n4|
j                  ||	z         I | j                  |g|
z   |gz          |S )z%Draw a zig-zagged line from p1 to p2.rG  r   points too closer   r  r   )
r  r  r4   r  r   rp  r#  rF  rk   r  )r(   r  r  r  r	  rB  r@  r  r  i_matr  rZ  r  s                r)   r  zShape.draw_zigzag;  s     2Y2YG!f#eC1w;/3447/003YB/0q# 	%A1uz!RL2%Q!!QK"$MM!e)$	% 	B4&=B4/0	r*   c                X   t        |      }t        |      }||z
  }t        |      }dt        t        |d|z  z  d            z  }|dk  rt	        d      ||z  }t        t        ||            }| }	d}
g }t        d|      D ]V  }|dz  dk(  rt        ||
       |z  }n'|dz  dk(  rt        ||
      |z  }nt        |d      |z  }|j                  ||	z         X |g|z   |gz   }t        |      }d}|dz   |k  r0| j                  ||   ||dz      ||dz             |dz  }|dz   |k  r0|S )z#Draw a squiggly line from p1 to p2.rG  r   r  gh?3OP@r   r   r   )r  r  r4   r  r   rp  r#  rF  rk   r7   r  )r(   r  r  r  r	  rB  r@  r  r  r  r  r  rZ  r  s                 r)   r  zShape.draw_squiggle7;  s`    2Y2YG!f#eC1w;/3447/003YB/0q# 	%A1uz!aRL2%Q!!QK"$!QK"$MM!e)$	% "%&k!eckOOF1Iva!e}fQUmDFA !eck 	r*   r  rB
  r   r  r   )r   rh  r   r@  r  r  r  r   r  r  r  rS  r  r  r  r  c          
     	   t        |      syt        |      t        t        fvr|j	                         }n|}t        |      dkD  syt        |      }	 t        dj                  |      D cg c]  }t        |       c}      }|}|j                  d      r|dd  }| j                  j                  ||||      }t        | j                   |      }|d   }|d   }|d   }|d   }|d	   }|d
   }|r||z  }n||z
  dk  r|dz  }n|||z
  z  }|dkD  r | j                   j#                  ||dz         } n|d   } g }!|D ]*  }"|r|dvrd }#n| }#|!j%                  t'        |"|#||             , |!}t)        |	d      }$t)        |
d      }%|
s|dk(  r|	}
t)        |	d      }%t+        |      }&|}'|'dz  dk7  rt-        d      |'dk  r|'dz  }'|'dk  r|'dz  }'d }(d })d}*d}+d},| j.                  }-| j0                  }.|&rkt3        dddd|d   j4                  | j4                  z   |-|d   j6                  z
  | j6                  z
        }/|/ |d   z  |/z  }0t9        t;        |0            dz   }1nd}1|-|j6                  z
  | j6                  z
  }2|j4                  | j4                  z   }3|2}4|'dk(  rJ|-|j6                  z
  | j6                  z
  }3|j4                   | j4                  z
  }2|1|*z  }1|.t=        |2      z
  }4n|'dk(  rG|- |j6                  z   | j6                  z   }3|j4                  | j4                  z   }2|1|+z  }1t=        |2      }4nc|'dk(  r^|j4                   | j4                  z
  }3|- |j6                  z   | j6                  z   }2|1|,z  }1t=        |j6                  | j6                  z         }4| j                  j?                  |      }5|5	d|5 d}6d}7ndx}6}7| j                  jA                  ||       }8|8d}8nd|8 d!}8 |(|6|8|1|3|2||      }9|dkD  r/|9| d"z  }9|9t9        ||z        d#z   z  }9||9t9        |      d$z   z  }9|	|9|$z  }9|
|9|%z  }9|9|d   z  }9d}:t        |      dkD  r|9 |)|      z  }9n|9d%z  }9tC        dt        |            D ](  };|4|k  r n!|;dkD  r|9d&z  }9|9||;   d%z   z  }9|4|z  }4|:dz  }:* |9d'|7 d(z  }9| xjD                  |9z  c_"        |:S c c}w # t        $ r t                Y yw xY w))Nr   r   r-  r   r   r@  r  r  r  r"  r   r   r!  r7  r	  r0  r/  r.  r  r  r  rx  r  c                R    d|  | d| dt        ||f       d| dt        |       dS )Nr  BT
1 0 0 1 z Tm
/r    Tf r  r!   r
  r  r  r[  r  r  s          r)   rY	  z#Shape.insert_text.<locals>.<lambda>;  sE    uQCs$qc)UVXYTZJ[I\\bcdbeefgpqrgsfttx-y r*   c                     dt        |        dS )NzTJ
0 -z TD
r  r!   s    r)   rY	  z#Shape.insert_text.<locals>.<lambda>;  s    WYq\N%8 r*   0 1 -1 0 0 0 cm
0 -1 1 0 0 0 cm
-1 0 0 -1 0 0 cm
 cm
r\   r  rc  /OC / BDC
EMC
re  rf   Tr  w  M TJz
T* z
ET
Q
)#r   r   r   r   r  r7   r  r  r  r
  rg   rv   r3   r   rW  r1  r%  r<  rk   getTJstrr  
CheckMorphr   r  rY  rp  r"  r#  r   r  r  r}  r  rF  r  )<r(   r'  r  r   rh  r   r@  r  r  r  r   r  r  r  rS  r  r  r  r  r   r  maxcoder  r  r7  r6  r  r"  r  r   r!  lheightr0  tabrA  r  	color_strfill_strmorphingrO  templ1templ2cmp90cmm90cm180r  rY  r  rq  r  r	  r  spaceoptcontbdcemcr  r  nlinesrZ  s<                                                               r)   r&  zShape.insert_text_;  s   0 F|<e},$$&DD4y1}e	388D>:a3q6:;G C !"IEyy$$XZ % 
 !40A;J'(#&!J'[)	+G	!Q&nG(Y"67GS=XX--dGaK@Fh'F 	9A&(BBJJx1fh78	9 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IlX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$   S *R><S >S SS)r  r  r  r  r  r  r   r@  r   r   rh  r  r  r  r  rS  r  r  c          
     X  PQ t        |      }|j                  s|j                  rt        d      t	        |d      }t	        |	d      }|	|dk(  r|}	t	        |d      }| j
                  j                  |      }|	d| d}d}nd	x}}| j
                  j                  ||
      }|d	}nd| d}|dz  dk7  rt        d      |}|dk  r|dz  }|dk  r|dz  }t        |      s|dv r|j                  S |j                  S d}d}d}| j                  }|} | j                  d      r| dd } | j
                  j                  | |
||      }!t        | j                  |!      }"|"d   }#|#d   Q|#d   }$|#d   P|#d   }%|#d   }&|#d   }'|r|}(n|&|'z
  dk  rd}(n|&|'z
  }(|(z  })t        |      t         t"        fv rdj%                  |      }*n|}*t'        |*D +cg c]  }+t)        |+       c}+      },|$r4|,dkD  r/d	j%                  |*D +cg c]  }+t)        |+      dk  r|+nd  c}+      }*|*j+                         }*| j                  j-                  |!|,dz         P|$r|%d!vrd}-nP}-PQfd"}.Qdk  rPd#   d   z  }/n}/d	}0t/        |      rut1        dddd|d   j2                  | j2                  z   | j                  |d   j4                  z
  | j4                  z
        }1|1 |d   z  |1z  }2t7        t9        |2            d$z   }3nd	}3d}4t;        d|&z        }5|dk(  r(|j<                  |5z   }6|j                  }7|j                  }8n|dk(  r<t;        |&z  d      }5|j>                  |5z   }6|j                  }7|j                  }8|3|z  }3n|d%k(  r?t;        d|&z         }5|j@                  |5z   }6|j                  }7d&}4|j                  }8|3|z  }3n>t;        |&z  d       }5|jB                  |5z   }6|j                  }7d&}4|j                  }8|3|z  }3g }9tE        |*      D ]I  \  }:};|;jG                  |      jI                  d'      }<tK        |<      }=d	}>|7}?tM        |=      D ]  }@|<|@   }A |.|A      }B|?|Bk\  r|>Ad'z   z  }>|?B|/z   z  }?&|>r)|>jO                         dz   }>|0|>z  }0|9jQ                  d(       d	}>|7}?B|7k  rAd'z   }>|7Bz
  |/z
  }?htK        |9      dkD  rd)|9d&<   AD ]9  }+ |.|>      |7 |.|+      z
  k  r|>|+z  }>|>dz  }>|0|>z  }0|9jQ                  d)       |+}>; |>d'z  }>|7 |.|>      z
  }? |>r$|0|>jO                         z  }0|9jQ                  d)       |:tK        |*      dz
  k  sE|0dz  }0L |0jS                  d      r|0dd& }0|0jU                  d      dz   }C|)|Cz  |'z  z
  }D|D|8z
  }E|EtV        kD  rd&Ez  S tY        E      }E|EtV        k  rd}Ed*| | d+|3z   }Fd, }G|0j+                         }Hd)|9d&<   tE        |H      D ]  \  }:}Id}J|7 |.|I      z
  }K|6|5|:|(z  z  z   }L|dk(  r0|dv rLt;        Kd-z  d      |4z  z   }LnmLt;        dKd-z        |4z  z
  }LnW|d-k(  r*|dv rLt;        Kd      |4z  z   }Ln;Lt;        dK      |4z  z
  }Ln(|d.k(  r#IjU                  d'      }M|MdkD  r|9|:   rKMz  }Jnd}J|Lj4                  z
  | j4                  z
  }N|Lj2                  | j2                  z   }O|dk(  r7|Lj4                  z
  | j4                  z
  }O|Lj2                   | j2                  z
  }Nnx|d/k(  r7| Lj4                  z   | j4                  z   }O|Lj2                  | j2                  z   }Nn<|d%k(  r7Lj2                   | j2                  z
  }O| |Lj4                  z   | j4                  z   }NF GON|       z  }F|dkD  r/F| d0z  }F|Ft7        |z        d1z   z  }F|Ft7        |      d2z   z  }F|d.k(  rFt7        J      d3z   z  }F|F|z  }F|	F|z  }FFt[        I|-|$Q       d4z  }F Fd5| d6z  }F| xj\                  |Fz  c_.        | j_                  |       ES c c}+w c c}+w )7aQ  Insert text into a given rectangle.

        Args:
            rect -- the textbox to fill
            buffer -- text to be inserted
            fontname -- a Base-14 font, font name or '/name'
            fontfile -- name of a font file
            fontsize -- font size
            lineheight -- overwrite the font property
            color -- RGB stroke color triple
            fill -- RGB fill color triple
            render_mode -- text rendering control
            border_width -- thickness of glyph borders as percentage of fontsize
            expandtabs -- handles tabulators with string function
            align -- left, center, right, justified
            rotate -- 0, 90, 180, or 270 degrees
            morph -- morph box with a matrix and a fixpoint
        Returns:
            unused or deficit rectangle area (float)
        z%text box must be finite and not emptyr  r  Nr   r  r  r  r\   re  r-  rf  r  zrotate must be multiple of 90r  rb  r  r  r  r   r  r  r"  r0  r   r   r!  r7  r%   r	  r  ?r  c           	         dk  r+t        | D cg c]  }t        |         d    c}      z  S t        |       z  S c c}w )zCalculate pixel length of x.r   r   )r   r
  r7   )r"  r  r   r0  r  s     r)   pixlenz$Shape.insert_textbox.<locals>.pixlen<  sF    !|q9!F3q6N1-9:XEE1v(( :s   A     r  rc  r  r   TFr  r  c                B    dt        | |f       d| dt        |       dS )Nr  z Tm /r   r  r  )r!   r
  r  r  s       r)   rY	  z&Shape.insert_textbox.<locals>.<lambda>%=  s+    XiA.?-@aS)TU,W[#\ r*   r   r   r  r  r  r  z Tw zTJ
zET
r  )0r  r  r  r   r  r   r}  r  r   r  rY  r3   rW  r1  r%  r   r   r   r  r  r
  r  r<  r  rp  r"  r#  r   r  r  r  r<  r  r  r  r  r6   r7   rF  r&   rk   r  r  r?  r  r  r  r  )Rr(   r   r  r  r  r  r  r  r  r   r@  r   r   rh  r  r  r  r  rS  r  r  r  r  r  r  r  r  rO  r  r   r  r  r  r  r7  r6  r"  r  r   r!  lheight_factorr  r	  r  r  	tj_glyphsr
  blenr   r  rq  r  progrc_pntr'  maxwidth	maxheightjust_tabrZ  ro   line_t	num_wordslbuffr  r|  wordpl_wlb_counttext_heightmorer  templtext_trA  re  plr^  spacesr	  r  r0  r  sR               `                                                                   @@r)   rE  zShape.insert_textbox<  sD	   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$$XZ % 
 !40A;J'(#(#&!J'[)	'N	!Q& N%	1N^+ <D%=(6"BBr*!s1v*+gmbAs1v|!4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
  } 2	GAt__Z066s;FFIED 9% #0ayd|4<TCZ'ED4K'D !LLNT1EEMDOOD)8# 3JE#d?T1D x=1$#(HRL "Ae}6!9(<<
 . !" &-/G#0J &&3r7Q;e2	j ==9D::d#a' (9x+??Y&'>$;4y'>DseE7$'",\"f% /	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_/	Fb 	$se3$] + Bs   `"`'c           
     t   | j                   dk(  ry|dk(  rd}n|d}t        |d      }t        |d      }| j                  j                  |      }|d| d| j                   z   | _         d}nd}| j                  j	                  ||
	      }|d
| d| j                   z   | _         |dk7  r&|dk7  r!| xj                   t        |      dz   z  c_         |dk7  r| d| j                   z   | _         |dk7  rd| j                   z   | _         |dvr| d| j                   z   | _         |	r| xj                   dz  c_         d| _        || xj                   |z  c_         |s| xj                   |z  c_         |.|s| xj                   dz  c_         nY| xj                   dz  c_         nC|s| xj                   dz  c_         n+| xj                   dz  c_         n| xj                   dz  c_         | xj                   |z  c_         t        |      rt        dddd|d   j                  | j                  z   | j                  |d   j                  z
  | j                  z
        }| |d   z  |z  }t        t        |            dz   | j                   z   | _         | xj                  d| j                   z   dz   z  c_        d| _         d| _        y)zFinish the current drawing segment.

        Notes:
            Apply colors, opacity, dashes, line style and width, or
            morphing. Also whether to close the path
            by connecting last to first point.
        r\   Nr   r  r  r  r  r  re  r-  rf  r    w
z J
z{lineJoin} j
)Nr\   [] 0z d
zh
zB
zB*
zf
zf*
zS
r  r  r  )r  r  r   r}  r  r   r   r  rp  r"  r  r#  r  r  )r(   rY  r  r   r  r  r[  r  r  r  r  r  r  r  r  r  r  r  r  rq  s                       r)   rD  zShape.finish`=  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                   t        | j                         | xj                  | j                  z  c_        | j                  j	                         | _        | j                  rc|r| j                  j                          t        j                  | j                  d|      }| j                  j                  || j                         d| _
        d| _        d| _        d| _        d| _        y)zUpdate the page's /Contents object with Shape data.

        The argument controls whether data appear in foreground (default)
        or background.
        r  Nr\   )ra  r   r  r  r  ri  r  r  r%  r
	  r   r   r  )r(   r  r  s      r)   rF  zShape.commit=  s     	DII$..(..0>>		'')))$))T7CDHH""48	r*   r5
  )r  r   r  r   r0
  r  )r  r   r0
  r  )
r  r   r  r   r  r   r  r   r0
  r  )r  z"typing.Union[quad_like, rect_like]r0
  r  )r:  r   r  rk  r0
  r  )r  r   r  r   r  r   r0
  r  r  )
r:  r   r'  r   r  rk  r  r   r0
  r  )r   r   r0
  r  )r	  r   r0
  r  )r   )r  r   r  r   r  rk  r0
  r  )&r'  r   r  r  r   rk  rh  r0  r   r  r@  r/  r  r   r  r4   r  r1  r   r1  r  r4   r  rk  r  rk  rS  r4   r  r1  r  rk  r  rk  r  r4   r0
  r4   )*r   r   r  r  r  r4   r  rk  r  r1  r  r4   r  r4   r  rk  r   r1  r@  r/  r   r/  r   rk  rh  r0  r  rk  r  r1  r  r4   r  r4   rS  r4   r  r   r  rk  r0
  rk  )r   r+  Nr   r   NFNTr   r   r   )rY  rk  r  r1  r   r1  r  r4   r  r4   r[  r/  r  r   r  r1  r  r   r  rk  r  rk  r  r4   r0
  r  )r  r   r0
  r  )r/   r0   r1   r`  r4  r  r   r  r  r  r  r  r  r  r  rC  r  r  r  r&  rE  rD  rF  r-   r*   r)   r  r  9  s+    &(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                      e Zd ZddZd Zed        Zed        Zd Z	ddZ
ddZdd	Zd
 ZddZedd       Zedd       ZddZ G d d      ZddZddZddZddZy)rg  Nc                b   t        j                  |j                  d            }|rt        |t              st	        |      }|r|j
                  nt        j                  d       }t        t         d      rt        j                  ||||      | _        y t        j                  ||||      | _        y )Nr  FzStoryS)
r   r  r  r>   r6  r   	FzArchiver;   r'  FzStory)r(   r^  r_  emrZ  r(  archs          r)   r   zStory.__init__=  s}    66G8LM:gw7g&G&w||EOOT,B5*%2tDDIw"dCDIr*   c                (   | j                   }d}|j                  ddd      }|ro|j                  }t        |      dk(  r>|d   dk(  r6|d   dv r/|j	                  d      }|sd| }|j                  d|       |dz  }|j                  ddd      }|rnyy)	zt
        Look for `<h1..6>` items in `self` and adds unique `id`
        attributes if not already present.
        r   Nr   r  r   123456r5  h_id_)r  r   r  r7   r  r  r  )r(   domrZ  r"  r   attrid_s          r)   add_header_idszStory.add_header_ids=  s    
 iiHHT4&99D4yA~$q'3,47h3F,,T2!!+COOD#.FAD$-A r*   c                   t        | t              r| }nt        d|       }t               }|D ]=  }|j                  dz  s|j                  s |j                  |v r/|||j                  <   ? |D ]  }|j                  dz  s|j
                  s!t               }t        |j                        |d<   |j
                  j                  d      rR|j
                  dd }	 ||   }	 t        |d<   |j                  \  }
}}}t        |
|      |d	<   |j                   dz
  |d
<   nO|j
                  j                  d      rt"        |d<   |j
                  dd |d<   nt$        |d<   |j
                  |d<   ||j                   dz
     j'                  |       " |S # t        $ r*}	t        dkD  r
t                t        d| d|       |	d}	~	ww xY w)a  
        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`.
        rT  r   rJ  r	  NzNo destination with id=z, required by position_from: rK  rM  r   zname:r   r   rR  )r>   r   r5   
open_closer5  r  r  r   r3   rg   r  rv   r   r'   rS  r  page_numrv  rY  r  )document_or_stream	positionsr   id_to_positionpositionposition_fromr  	target_idposition_tor[  r  r  r  r  s                 r)   add_pdf_linkszStory.add_pdf_links=  s   & ((3)H'9:H
 ! 	<H##a'X[[;;.03;NHKK0	< ' (	GM((1,-2D2D v#M$6$67V %%005 - 2 212 6IE&4i&@ 
 $-DL%0%5%5NBB "'r2DJ#.#7#7!#;DL %))44W='1V'4'9'9!"'=V'/V&3&8&8U //!34@@FQ(	GT ; % E/!38H*-DYKOlmzl{+|}  DE  EEs   F	G%GGc                B    | j                         }|j                         S r,   )r   r  r(   r/  s     r)   r  z
Story.bodyH>  s    mmo{{}r*   c                V    t        j                  | j                        }t        |      S r,   )r   fz_story_documentr   r  r?  s     r)   r   zStory.documentM>  s     %%tyy1Cyr*   c                    t        |      }|r|j                  nt        j                  d       }t        j                  | j                  ||       y r,   )r  r   r   r  fz_draw_story)r(   r  r  ctm2r  s        r)   drawz
Story.drawQ>  s8     &)#fkk)>TYYT2r*   c                d   t              t        u rFj                         D ]2  }t        |      t        u r|j	                         r%t        d| d       ni t              rj                  j                  dk7  rt        d      fd}t        j                  | j                  |       y)zU
        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                    G d d      } |       }| j                   |_         | j                  |_        | j                  |_        t        | j                        |_        | j
                  |_        | j                  |_        | j                  |_        | j                  |_	        r%j                         D ]  \  }}t        |||         |       y )Nc                      e Zd Zy)=Story.element_positions.<locals>.function2.<locals>.Position2Nr/   r0   r1   r-   r*   r)   	Position2rI  d>  s    r*   rK  )r  headingr5  rb  r   r   r4  rectangle_numrect_numr  rB   setattr)r9  rK  	position2r  rF   r  ri   s        r)   	function2z*Story.element_positions.<locals>.function2c>  s     !I&nnIO ( 0 0I#;;IL,X]];IN%]]IN#+#6#6I !)!7!7I%]]IN JJL .DAqY1-.i r*   N)r   r5   r  r  isidentifierr   r  __code__co_argcountr   fz_story_positionsr   )r(   ri   r  r  rQ  s    ``  r)   element_positionszStory.element_positionsV>  s     :YY[ ;Q31>>+;$}QCq%9::; D!X%6%6%B%Ba%G_``	!  	  $))Y7r*   c                    t        |      }t        j                         }t        j                  | j                  |||      }|t        |      fS )z5
        Wrapper for fz_place_story_flags().
        )r  r   rc  fz_place_story_flagsr   rb  )r(   wherer  rl  r  s        r)   placezStory.placeu>  sC      '))499eVUK_f---r*   c                B    t        j                  | j                         y r,   )r   fz_reset_storyr   r.   s    r)   r	  zStory.reset~>  s    dii(r*   c                   d }dd}t        dddd      }	  |||      \  }}	}
|dz  }|rdz  | j                  |	      \  }}rfd}| j                  |       |rq|r=|r|r |||d       |j                          |j	                  |      }|r |||d       | j                  ||
       |s0|r |||d       |j                          n| j                  d |
       |sy )Nr   r   c                $    | _          |        y r,   )r5  )r9  r5  
positionfns    r)   positionfn2z Story.write.<locals>.positionfn2>  s     )1H%x(r*   )r  rZ  rV  r^
  rY
  rE  )r(   r  rectfnr_  pagefnr  rN  rl  ra  r   r  r  r`  r5  s      `         @r)   r   zStory.write>  s   aAq!"(6":HdCMHA::t,LD&)
 &&{3!"8XsA>) ++X6Cx3:		3$(C;OO%		$$A r*   c	                    t               d }		 |	}
 |      }	d|	|
k(  rd|	}t        ||||      }|r|j                          t               fd}|j                  r| nd |||       ry b)NFTc                D    j                  |        rr	 |        y y y r,   r  )r9  r_  r7  stables    r)   r`  z+Story.write_stabilized.<locals>.positionfn2>  s%      *jx( )6r*   )r   rg  r2  r   )r  	contentfnra  r_  r*  r_  rb  rZ  r2  rt  content_prevcontent2rq  r`  r7  re  s        `        @@r)   write_stabilizedzStory.write_stabilized>  s    F	"L+GF,&H(Hb':E$$&I)
 KK$F$	 3 r*   c                    t        j                         }t        |      }	g fd}
t        j	                  |	| ||||
|||	       |	j                          |j                  d       t        j                  |      S )Nc                >    j                  |        r	 |        y y r,   r  r9  r_  r7  s    r)   r`  z6Story.write_stabilized_with_links.<locals>.positionfn2>  !    X&8$ r*   r   )r9   r[  rM
  rg  ri  r  r  r=  )rf  ra  r_  r*  r_  rb  rZ  r2  r	   r  r`  r7  s       `      @r)   write_stabilized_with_linksz!Story.write_stabilized_with_links>  sn     '		%
 	vy&(BU[]dftuA""6955r*   c                    t        j                         }t        |      }g fd}| j                  ||||       |j	                          |j                  d       t        j                  |      S )Nc                >    j                  |        r	 |        y y r,   r  rl  s    r)   r`  z+Story.write_with_links.<locals>.positionfn2>  rm  r*   )r_  rb  r   )r9   r[  rM
  r   r  r  rg  r=  )r(   ra  r_  rb  r	   r  r`  r7  s     `    @r)   rm  zStory.write_with_links>  s_    '		%
 	

66k&
IA""6955r*   c                      e Zd ZdZddZd Zy)Story.FitResulta  
        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                X    || _         || _        || _        || _        || _        || _        y r,   rj  rl  r  numcallsrk  r   )r(   rj  rl  r  ru  rk  r   s          r)   r   zStory.FitResult.__init__>  s,    (DO DKDI$DM&DNDIr*   c                    d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   S )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=rt  r.   s    r)   r   zStory.FitResult.__repr__?  sP    "4??"3t{{mTYYK !$..!1TYYK)r*   r.  )r/   r0   r1   r`  r   r   r-   r*   r)   	FitResultrr  >  s    	(		r*   ry  c                    fdt        t        t        f      sJ t        t        t        f      sJ  G fdd      } |       r# dj                  dj                  d        j                          fd} fd	d
 }	j                  -r d        |	j                  d      }
	  |
      sn7|
dz  }
 j                        rr dj                  d        |       S j                  -r d        |	j                  d      }
	  |
      rn>|
dz  }
 j                        s&d_        r dj                  d        |       S r# dj                  dj                  d       	 j                  j                  z
  |k  r |       S j                  j                  z   dz  }
 |
       H)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                *    sJ t        d|         y )Nzfit(): rr   )r   r	  s    r)   r'   zStory.fit.<locals>.log-?  s    N7gdV$%r*   Nc                      e Zd Z fdZy)Story.fit.<locals>.Statec                |    | _         | _        d | _        d | _        d | _        d| _        r| _        | _        y y r   )pminpmaxpmin_resultpmax_resultr  ru  pmin0pmax0)r(   r  r  r	  s    r)   r   z!Story.fit.<locals>.State.__init__5?  sE     	 	#' #' " !!%DJ!%DJ r*   Nr   )r  r  r	  s   r)   Stater~  4?  s    	&r*   r  zstarting. state.pmin= state.pmax=r   c            
        j                   Fj                  j                   k7  r r d        j                         } | sJ j                  }n8j                  rj                  nt        j                  j                        }r2 dj                  dj                  dj                   d|       |S )NzCCalling update() with pmax, because was overwritten by later calls.)ru  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  rg  ry  ru  r  r  )rj  r  r'   r  r
  r	  s     r)   rG   zStory.fit.<locals>.retF?  s    zz%<<5::-ac!'

!3J%%:**.3.?.?**U__^c^l^l_Em-n~]uzzmK_X^W`abMr*   c                    |       }t        |t              sJ dt        |      d|       |j                  r.d}t        j                  | 
j                        }r} d       nt	j                  |      \  }}
xj                  dz  c_        | }t        j                  ||
j                  | ||      }r  d
j                  d	d
|d| d|d	       |r| 
_        |
_	        n| 
_
        |
_        | 
_        |S )a  
            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)=rx  F)rk  ru  z9update(): not calling self.place() because rect is empty.r   )rl  r  ru  rk  r   rj  zupdate(): called self.place(): z>2dz: more=rw  r   )r>   r  r   r  rg  ry  ru  rZ  r  r  r  r  r  )rk  r   rj  r  r  rl  r  fnr'   r(   r  r	  s         r)   r
  zStory.fit.<locals>.updateT?  s    i=DdD)Ckd4j]'D7+CC)}}"
9u~~VSU#zz$6f!#!%X
%!!&"+!#- )  9%..9MXPTwVbXaWccjeidkklmn&
$*!&
$*!$ELr*   c                4    | | dk(  r|S || z  dkD  rd| z  S |  S )z
            Returns same sign as `direction`, larger or smaller than `p` if
            direction is positive or negative respectively.
            r   r   r-   )r  	directions     r)   oppositezStory.fit.<locals>.oppositey?  s1    
 yAqD  1}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=)r>   r4   rk  r  r  r	  )r(   r  r  r  r1  r	  r  r  rG   r  rk  r'   r  r
  s   ```` ``    @@@r)   rc  z	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                h   
 |\  }}|z
  |z
  

fd}	| j                  |	|||||      S )a  
        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        | z  z   | z  z         S r,   rW  )rV  r  rY  r  r  s    r)   r  zStory.fit_scale.<locals>.fn?  s&    BU5[ 0"uV|2CDDr*   rc  )r(   r   r`  ra  r1  r	  r  r  r  r  r  rY  r  r  s             @@@@r)   rh  zStory.fit_scale?  sC    . BBRb	ExxIy%%HHr*   c                T   	
 |\  
|z   		
fd}| j                  |||||      S )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        | z         S r,   rW  )r  r  r  r  s    r)   r  zStory.fit_height.<locals>.fn?  s    BBvI..r*   r  )r(   rY  
height_min
height_maxoriginr1  r	  r  r  r  r  s           @@@r)   
fit_heightzStory.fit_height?  s3    , B%Z	/xxJ
E7CCr*   c                T   	
 |\  		|z   
	
fd}| j                  |||||      S )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        | z         S r,   rW  )rY  r  r  r  s    r)   r  zStory.fit_width.<locals>.fn?  s    B5"--r*   r  )r(   r  	width_min	width_maxr  r1  r	  r  r  r  r  s           @@@r)   	fit_widthzStory.fit_width?  s3    , B&[	.xxIy%AAr*   )r\   Nr  Nr,   r+  r	  )Nr  NNNT)NNr  Fr   )r   Nr  Fr   )r   Nr  r  F)r/   r0   r1   r   r2  r4  r=  r3  r  r   rE  rV  rZ  r	  r   ri  rn  rm  ry  rc  rh  r  r  r-   r*   r)   rg  rg  =  s    D.& R Rh  3
8>.)%N  > 6 66% %NXtI<D8Br*   rg  c                      e Zd Zd Zd Zd ZddZd ZdddZddZ	dd	Z
ddd
ZdddZdddZd ZdddZd ZddZddZddZd Zed        ZddZeZy)r   c                    t        |t        j                        r |d   }t        j                  |      | _        n3t        |t        j                        r|d   | _        nt        d|       d| _        d | _        y )Nr   Unrecognised args: T)r  r   rc  r  r   rg   r   r   )r(   r  ra  s      r)   r   zTextPage.__init__@  sg    dELL)AwH))84DIe//0QDI1$899r*   c                n   | j                   }t        j                  d      }t        j                  |      }|dk(  rt        j                  ||d       nF|dk(  rt        j
                  ||d       n)|dk(  rt        j                  ||d       nt        ||       |j                          t        |      }|S )Nr3  r   r   r   rG  )
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)   _extractTextzTextPage._extractText@  s    YY
!!$'nnc" a<--c:qA\,,S*a@\..sJB'Z8%c*r*   c                2    t        | j                  ||       y r,   )JM_make_textpage_dictr   )r(   	page_dictr  s      r)   _getNewBlockListzTextPage._getNewBlockList!@  s    diiC8r*   c                    | j                   j                  | j                   j                  d}| j                  ||       |S )NrB  )r   rY  r  r  )r(   r  r  s      r)   _textpage_dictzTextPage._textpage_dict$@  s4    "iioo9I9IJ	i-r*   c                B    	 t        j                  | j                        S )z*Return a list with text block information.)"r  r   extractBLOCKSr   r   rc  r   ra  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"
  r*  i_imager  r  r   r  r  r  r  r  r  rk   )r(   block_nr  tp_rectr  r  block	blockrectline_n	last_charro   linerectr
  cbboxr   r  r  litems                     r)   r  zTextPage.extractBLOCKS)@  s    &&tyy11r*   Nc                    | j                  d      }||j                  |d<   |j                  |d<   |r|d   }|j                  d        ||d<   |S )z>Return page content as a Python dict of images and text spans.Fr  rY  r  blocksc                "    | d   d   | d   d   fS Nr*  r   r   r-   r
  s    r)   rY	  z&TextPage.extractDICT.<locals>.<lambda>e@      qy|QvYq\&B r*   r{	  r  rY  r  r  r(   re  r  r  r  s        r)   extractDICTzTextPage.extractDICT]@  s]    !!e!,>88CLIICM]FKKBKC"CM
r*   c                $    | j                  d      S )z%Return page content as a HTML string.r   r  r.   s    r)   extractHTMLzTextPage.extractHTMLi@  rf  r*   c           	        d}| j                   }g }|D ]  }|dz  }|j                  j                  t        j                  k(  r1|j                         }d}|j                         }|j                  rd}	nd}	t        j                  |      }
|
j                  r|
j                         }d}
|rt        j                  t        t        t        t              }t        j                  |      sJ t        j                  |j                         dd|j                         dd      }t        j                   |||      \  }}}t        j"                  |      }t%        |      }|dk(  r2|j                         |j                         z  |j'                         z  }t        j(                  t        j*                  |j                  j,                              }t/               }||t0        <   t3        |j                  j4                        |t6        <   t9        |j;                               |t<        <   |j                         |t>        <   |j                         |t@        <   t        jB                  |      |tD        <   t        jF                  |      |tH        <   |jK                         |tL        <   |jO                         |tP        <   |jS                         |tT        <   ||tV        <   |r|d<   |	|d<   |jY                  |        |S )	z*Return a list with image meta information.r  r   r   TFNr  zhas-mask)-r   r   r   r   r  r  r  r  fz_compressed_buffer_sizer  r  r  r  rm  r   r  r  r  r  rE   r  ll_fz_keep_colorspacer  r5   dictkey_numberrb  r*  dictkey_bboxrl  i_transformdictkey_matrixdictkey_widthdictkey_heightr  dictkey_colorspacer  r  r  dictkey_xresr  dictkey_yresr  dictkey_bpcr  rk   )r(   r  r  r  r   r  r  img_sizer  has_mask
compr_buffr  r{  r  r   r  r  r  
block_dicts                      r)   r  zTextPage.extractIMGINFOm@  sg   YY
 (	"EqLG$$(A(AA--/CH88:D 99#>J$$%??A!
MM/?OUde11!444NN3557Aq#%%'1a@!::31E	Q--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                   ddl ddl}| j                  d      } G fdd|j                        }||j                  |d<   |j
                  |d<   |r|d	   }|j                  d
        ||d	<   |j                  |d|d      }|S )z.Return 'extractDICT' converted to JSON format.r   NFr  c                      e Zd Z fdZy)'TextPage.extractJSON.<locals>.b64encodec                r    t        |      t        t        fv rj                  |      j	                         S y r,   r   r  rZ  	b64encoder  r(   rn  base64s     r)   r   z/TextPage.extractJSON.<locals>.b64encode.default@  3    7ui00!++A.5577 1r*   Nr/   r0   r1   r   r  s   r)   r  r  @      8r*   r  rY  r  r  c                "    | d   d   | d   d   fS r  r-   r  s    r)   rY	  z&TextPage.extractJSON.<locals>.<lambda>@  r  r*   r{	  r   r_   r   
separatorsr  rv  r  rc  r  JSONEncoderrY  r  r  dumpsr(   re  r  rc  r  r  r  r  s          @r)   extractJSONzTextPage.extractJSON@  s    !!e!,	8(( 	8
 >88CLIICM]FKKBKC"CMjj1jM
r*   c                    | j                  d      }||j                  |d<   |j                  |d<   |r|d   }|j                  d        ||d<   |S )zCReturn page content as a Python dict of images and text characters.Tr  rY  r  r  c                "    | d   d   | d   d   fS r  r-   r  s    r)   rY	  z)TextPage.extractRAWDICT.<locals>.<lambda>@  r  r*   r{	  r  r  s        r)   extractRAWDICTzTextPage.extractRAWDICT@  s]    !!d!+>88CLIICM]FKKBKC"CM
r*   c                   ddl ddl}| j                  d      } G fdd|j                        }||j                  |d<   |j
                  |d<   |r|d	   }|j                  d
        ||d	<   |j                  |d|d      }|S )z1Return 'extractRAWDICT' converted to JSON format.r   NTr  c                      e Zd Z fdZy)*TextPage.extractRAWJSON.<locals>.b64encodec                r    t        |      t        t        fv rj                  |      j	                         S y r,   r  r  s     r)   r   z2TextPage.extractRAWJSON.<locals>.b64encode.default@  r  r*   Nr  r  s   r)   r  r  @  r  r*   r  rY  r  r  c                "    | d   d   | d   d   fS r  r-   r  s    r)   rY	  z)TextPage.extractRAWJSON.<locals>.<lambda>@  r  r*   r{	  r  r   r  r  r  s          @r)   extractRAWJSONzTextPage.extractRAWJSON@  s    !!d!+	8(( 	8
 >88CLIICM]FKKBKC"CMjj1jM
r*   c                v    t        |      }t        |      }t        j                  | j                  ||d      }|S r   )r	  r   fz_copy_selectionr   )r(   pointapointbr!   r
  r  s         r)   extractSelectionzTextPage.extractSelection@  s5    V$V$''		1a;r*   c                    |s| j                  d      S | j                         dd }|j                  d        dj                  |D cg c]  }|d   	 c}      S c c}w )z%Return simple, bare text on the page.r   Nc                    | d   | d   fS )Nr   r   r-   r  s    r)   rY	  z&TextPage.extractText.<locals>.<lambda>@  s    1Q41, r*   r{	  r\   rG  )r  r  r  r  )r(   r  r  r
  s       r)   extractTextzTextPage.extractText@  sY    $$Q''##%a(./wwf-!-..-s   	Ac                    | j                   }t        |t        j                        sJ t	        |      }t        ||      }t        |      }|S r,   )r   r>   r   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)r(   r   r  r  r  r   s         r)   r=  zTextPage.extractTextbox@  sF    YY
*e&7&7888t$!*d3-e4	r*   c                D    	 t        j                  | j                  |      S )z)Return a list with text word information.)r  r   extractWORDSr   r   rc  r  r   ra  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  r  rK  r  r  ro   word_nr
  r  word_delimiterthis_char_rtls                     r)   r	  zTextPage.extractWORDS@  s    %%dii<<r*   c                $    | j                  d      S )z&Return page content as a XHTML string.rG  r  r.   s    r)   extractXHTMLzTextPage.extractXHTML"A  rf  r*   c                $    | j                  d      S )z$Return page content as a XML string.r   r  r.   s    r)   
extractXMLzTextPage.extractXML&A  rf  r*   c                    | j                   }t        j                  |j                  j                        }t        j
                  |      }d|_        |S )zTextPage current poolsize.N)r   r   Poolr   poolfz_pool_size)r(   r  r  r  s       r)   poolsizezTextPage.poolsize*A  sA    		zz%**//0!!4(r*   c                v    | j                   }|j                  j                  }t        |      }t	        |      }|S )zPage rectangle.)r   r   ra  rb  r  )r(   r  ra  r  s       r)   r   zTextPage.rect2A  s6     YY
((11h'3i
r*   c                   t        | j                  |      }|s|S t        |      }t        |      D ]'  }t	        ||         }|r|||<   |j
                  ||<   ) |r|S d}||dz
  k  rW||   }||dz      }	|j                  |	j                  k7  s||	z  j                  r|dz  }C||	z  ||<   ||dz   = |dz  }||dz
  k  rW|S )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r7   rF  r  r   r  r  )
r(   needlehit_maxr	  r  rB   rZ  r<  v1v2s
             r)   r  zTextPage.search<A  s    "499f5JCu 	 ASVAAA	  J%!)mQBQUBuu~"r'!3!3Q"WCFAE
QJE %!)m 
r*   r  r  rC
  r2
  r+  r,   )r   r   )r/   r0   r1   r   r  r  r  r  r  r  r  r  r  r  r  r  r=  r	  r  r  r  r3  r   r  extractTEXTr-   r*   r)   r   r   ?  s    	*9
2h
$.`,
*/6p$$  4 Kr*   r   c                      e Zd Zd	dZed        Zd
dZddZd Z	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	ddZ
y)r  Nc                   t        j                         | _        || _        || _        t        |      | _        t        ddddd| j                  j                        | _	        | j                   | _
        t               | _        d| j                  _        t               | _        d| j                  _        t               | _        d| _        y)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   rP  r  r  r   rp  r  r  ictmr  r   r`  r  r  
used_fontsr   )r(   	page_rectrP  r  s       r)   r   zTextWriter.__init__[A  s    %%'	
O	!Q2q$))*:*:;XXI	'"K!B%r*   c                    t        t        j                  | j                  t        j                  d       t        j
                                     }t        |      }|S r,   )rb  r   fz_bound_textr   FzStrokeStaterm  r  rL  s     r)   _bboxzTextWriter._bboxlA  sC    u22DIIu?R?RSW?XZ_ZhZhZjkl3i
r*   c           
     r   t        |      | j                  z  }|t        d      }|j                  s	 t        d|j                   d      |r-| j                  |      }dj                  t        |            }d}t!        j"                  |      }	t%        |      }
t!        j&                  |dd||
j(                  |
j*                        }d}d}|dk(  r1t!        j,                  | j                  |j                  ||||||	      }n&t/        | j                  |j                  ||||||	      }t1        |      }t        |dd       | j2                  z  | _        | j6                  | j2                  z  | _        | j8                  | j4                  f}|j:                  d   d	k(  r| j<                  j?                  |       |S )
z8Store 'text' at point 'pos' using 'font' and 'fontsize'.NrB
  r   zUnsupported font 'rX  r\   r  r
  r   ) r  r(  r)  r
  r'   r   r
  r
  mupdf_font_namer   r   r   r   	clean_rtlr  r  r   r  r	  fz_make_matrixr"  r#  fz_show_stringJM_show_string_csrl  r  r   r.  r  r  r)  r:  )r(   rX  r   rT  r   r'  right_to_leftr
  r
  r&  r  trm
markup_dirr
  r  s                  r)   rk   zTextWriter.appendrA  s{   Cj499$<<D 1$))B?@@>>$'D778D>*DM11(;S!""8Q8QSS!##F
?&&		499c4P]_ikopC#TYY		3e]\fhlmC$BC/DHH4dhh.nndoo-::f"OO%
r*   c           	         |dz  }|D ].  }| j                  ||||||       |xj                  |z  c_        0 | j                  | j                  fS )Nr7  )rT  r   r'  r
  )rk   r#  r  r   )	r(   rX  r   rT  r   r'  r
  r  r  s	            r)   appendvzTextWriter.appendvA  s[    S. 	AKKQTH!j  :EEWE	 ~~t..r*   c           	        |s|S |j                  d      }g }t        t        |            D ]j  }||   }t        |      dk  rt        |D cg c]  }t	        |       c}      dkD  r=dj                  t        |            ||<   |j                  |       l g }t        t        |            D ]  }|g k(  r|j                  ||          ||   |d   dz   kD  r8t        |      dkD  r#t        ||d   |d   dz          ||d   |d   dz    ||   g}c||   |d   dz   k(  sr|j                  ||           dj                  |      }|S c c}w )a)  Revert the sequence of Latin text parts.

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

        Args:
            text: str
        Returns:
            Massaged string.
        r   r   r	  r\   r  r   r   )r6   rF  r7   r  r
  r  r  rk   )r(   r   wordsr2  rZ  r   r  idx2s           r)   r1  zTextWriter.clean_rtlA  sW    K

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

1	 s3x 	$ArzCF#Q$r(Q,&t9q=4<d1gR155E$q'DHqL1 AxQ48a<'CF#	$ xx+ ':s   E

c                   
%&'( t        |      }|j                  rt        d      t              t        urt	        d      
fd(
fd&
 fd%dz  } (d      }|j
                  |z
  '|j                  |z   }&fd}%'(fd	}j                  }j                  }|s||z
  d
k  rd}n||z
  }n|}|z  }'}|t        |      }n|j                  ||z  fz   }||vrt        d      |t        k(  rd}n|t        k(  rd}nd}t        |      t        u r|j                         }n(g }|D ]!  }|j                  |j                                # t!        |j"                  |j$                  z
  |z        d
z   }g }g }t'        |      D ]e  \  }}|dv r@|j)                  ||f       |j
                  |z
  }|j)                  t+        |      d
z
         K|dk(  r|j,                  |j.                  z
  }n|j
                  |z
  }|	r j1                  |      } (|      }||k  r1|j)                  ||f       |j)                  t+        |      d
z
         |j3                  d      } |||      \  }}t+        |      }	 dj5                  |d|       } t7        |d|       ||d
z
  z  z   }!|!|k  r+|j)                  | |!f       ||d }||d }t+        |      }d} n|d
z  }t+        |      dk(  rc|sJ u t+        |      }"|"|kD  r(d| d|" d}#|n|rt9        d|#z          nt        |#      t               }$|t+        |      d
z
  gz  }t;        |      D ]  }	 |j=                  d      \  }}|	rdj5                  tE        |            }|dk(  r|}$|tF        k(  r/||vr+|'k  r& ||$|       ||$_        |$xj$                  |z  c_        s|dkD  s|j.                  |k(  r|$xj.                  ||z
  |z  z  c_         %|$|       ||$_        |$xj$                  |z  c_         |S # t>        $ r t@        dk\  r
tC                Y  |S w xY w)ay  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.rB
  c                ,    j                  |       S )zReturn length of a string.r   r
  )r
  r"  rT  r   r
  s    r)   re  z(TextWriter.fill_textbox.<locals>.textlenA  s"    ##H $  r*   c                ,    j                  |       S )z5Return list of single character lengths for a string.r?  )r
  r@  s    r)   r
  z-TextWriter.fill_textbox.<locals>.char_lengthsA  s    $$Qj$QQr*   c                4    j                  | |      }|S )N)rT  r   r
  r  )rX  r   rG   rT  r   r
  r  s      r)   append_thisz,TextWriter.fill_textbox.<locals>.append_thisA  s(    --D8
   C Jr*   皙?r   c                l   g }g }|D ]  } |      }t        |      }|| k  r#|j                  |       |j                  |       >t        |      }|dkD  sOt        |d|       }|| k  r;|j                  |d|        |j                  |       ||d }||d }t        |      }n|dz  }|dkD  rY ||fS )z.Cut any word in pieces no longer than 'width'.r   Nr   )r   rk   r7   )	rY  r;  nwordsword_lengthsr   wl_lstwlrE   r
  s	           r)   
norm_wordsz+TextWriter.fill_textbox.<locals>.norm_words
B  s    FL %a[;MM!$ ''+ K!eVBQZBU{ae,$++B/abE!'KQ !e( <''r*   c                N   |j                  d      D cg c]
  }|dk7  s	| }}t        |      }|dk(  ry|dk(  r 
| |d          yt        |D cg c]
  } |       c}      }|dz
  }|z
  |z  }|D ]"  } 
| |      \  }}	|	j                  |z   | _        $ yc c}w c c}w )zJustified output of a line.r   r\   r   Nr   )r6   r7   r   r"  )r  ro   r   r;  rF  r  gapsgaplr  rg  rC  	std_widthre  s             r)   output_justifyz/TextWriter.fill_textbox.<locals>.output_justify$B  s     !%

3;117Q;E;ZF{{E58,%0Qgaj01BA:DNd*D &#E1-2$$+&  < 1s   
BBB"r   r7  NzText must start in rectangle.r8  r  r   )r\   r   zOnly fitting  of z lines.z	Warning: r   r\   )$r  r  r   r   r)  rY  r  r   r!  r  r  r>  r?  r  r  ra  r4   r  r#  r  rk   r7   r  r"  r1  r6   r  r   rr   rF  r  r  r  rv   r  r@  ))r  r   r   rX  rT  r   rh  r  warnr5  r
  	tolerance	space_len	std_startrJ  rO  r9  r:  r  
LINEHEIGHTrY  r  	textlinesro   	max_lines	new_lines
no_justifyrZ  r  r;  rG  rE   line0rI  r  r   r  rC  r
  rN  re  s)   `   ``    `                          @@@@r)   fill_textboxz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d?<== %%F&&FF :)II 4  !234 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    P''QQc	                   t        |       t        | j                  |j                  z
        dkD  rt        d      |Jt	        |      t
        t        fvs(t	        |d         t        ust	        |d         t        urt        d      ||t        d      t        |dd      |d	k(  r| j                  }|| j                  }	 |j                         }	d}
|dk\  r|dk  r|}
d}g d
}|rt        |      \  }}|dk(  rt        j                         }n.|dk(  rt        j                          }nt        j"                         }t        j$                  |	j'                         d      }t        j(                  d      }t        j*                  |	j'                         t        j,                         ||      }t        j.                  || j0                  t        j,                         |||
t        j2                  t        j4                               t        j6                  |       t9        |	|      }t;        |      }||f}|}|d   }|d   }|\  }}|j=                         }|j?                  |      }|	d| d}d}ndx}}dg}|r|jA                  |       |jB                  }|jD                  dv r.|j                  jF                  |j                  jH                  z
  }nd}|jJ                  }tM        |      s|jN                  dk7  s|dk7  rD|jA                  dtQ        |jR                  |jT                  |jN                  z   |z
  f       d       |rN|d   | jV                  z  } t        dd      jY                  | jR                  | jT                        }| |d   z  |z  }|s|r&|jA                  tQ        t[        |            dz          |D ]  }!|!j]                  d      r|!dk(  r'|jA                  |!       |jA                  |dd       B|!j]                  d      r+t_        |!ja                         d   dd       |z   }"d|"dd}!n"|!j]                  d      ry|!ja                         }#tc        |#d         }$|dk7  r|$dz  }%nd}%|jA                  tQ        |%      dz          t_        |#d   dd       |z   }&d je                  d!|&dg|#dd z         }!n|!j]                  d"      r"|jA                  |!jg                  d#d$             ne|!j]                  d%      r"|jA                  |!jg                  d%d&             n2|!j]                  d'      r!|jA                  |!jg                  d'd(             |jA                  |!        |r|jA                  |       |jA                  d)       d*je                  |      ji                  d+      }tj        jm                  |||,       d}| jn                  D ]  }&tq        ||&        |S )-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 allowedrf  r  r  r   rG  r   r3  r  z BDCEMCr\   r<  r  r  z cmBTr  z Trz gsz/Alp Tfr  z wr   r   z/Fz rgr  RGz gz Gz kz Kr  r%   r  )r  )9ra  r  r   r   r   r   r   r  rp  r   rP  r  r
  r5  r   r  fz_device_cmykfz_device_grayrM  r%  r  pdf_new_pdf_devicerm  fz_fill_textr   r  fz_default_color_paramsr  JM_merge_resourcesr"
  r  r}  rk   rm  rL  r  rY  ra  r   r  r   r"  r#  r(  rN  r  r  r4   r6   rk  r  r  r  r  r  r)  repair_mono_font)'r(   r   r  rP  r  r  r  r  r  r  r  ncol	dev_colorr  r\  rb  r  max_numscont_stringr  r  rt  max_alpmax_fontold_cont_linesr  r  r  new_cont_linesre  r1  r  r  ro   alpr}  r  r   rT  s'                                          r)   r  zTextWriter.write_textB  sk    	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">iqy"002
"113
"113
**7;;=!<I**40H**GKKM5>>;KYX`aCIINN$''(E(EF !!3' *7I>H0(;K,FCq6a&$ ++-,,R0'$'CCNC#!!#&""==I%II$$tyy6EE]]8ruu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>OO 	)DT4(	)
r*   r  )Nr  Nr   r   )Nr  NF)NNr  Nr   NFF)r  z'TextWriter'r   r   r   r  rX  r   rT  ztyping.Optional[Font]r   rk  rh  r0  r  r4   rQ  r   r5  r   r
  r   r0
  r   )Nr  r   NNr   r   )r/   r0   r1   r   r3  r.  rk   r9  r1  r[  r  r-   r*   r)   r  r  YA  s    "  
*X/,d #*. #'"'$` `` *` 	`
 (` ` !` ` `  ` ` `DDr*   r  c                     e Zd ZdZd Zd Zd Zd Zd Zd Z	ddddddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zed        Zd Zd*dZd Zd Zd Zd Zed        Zed        Zed        Z d  Z!d! Z"d" Z#ed#        Z$ed$        Z%ed%        Z&ed&        Z'd' Z(d( Z)ed)        Z*eZ+eZ,e&Z-e'Z.y)+r  a  
    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                J    t         j                  | |      j                         S r,   )r  r
  r  r  s     r)   r
  zIRect.__add__GC      ||D!$**,,r*   c                J    t         j                  | |      j                         S r,   )r  rA  r  r  s     r)   rA  zIRect.__and__JC  rs  r*   c                .    t         j                  | |      S r,   )r  r  r  s     r)   r  zIRect.__contains__MC  s      q))r*   c                    t        |d      syt        |      dk(  xrN | j                  |d   k(  xr: | j                  |d   k(  xr& | j                  |d   k(  xr | j
                  |d   k(  S r  )r;   r7   r  r  r  r  r3  s     r)   r  zIRect.__eq__PC  sk    q)$1v{jtww!A$j477ad?jtwwRSTURVj[_[b[bfghifj[jjr*   c                d    | j                   | j                  | j                  | j                  f|   S r,   rH  r  s     r)   r]  zIRect.__getitem__UC  r  r*   c                *    t        t        |             S r,   r  r.   s    r)   rV  zIRect.__hash__XC  r  r*   NrJ  c          
     V    t        |||||||d\  | _        | _        | _        | _        y )NrJ  )util_make_irectr  r  r  r  rM  s           r)   r   zIRect.__init__[C  s-    -<trVX]_dfkm-n*$'47r*   c                     yr  r-   r.   s    r)   r   zIRect.__len__^C  r!  r*   c                J    t         j                  | |      j                         S r,   )r  r$  r  r	  s     r)   r$  zIRect.__mul__aC  rs  r*   c                v    t        | j                   | j                   | j                   | j                         S r,   )r  r  r  r  r  r.   s    r)   r&  zIRect.__neg__dC  s+    dggXx$''DGG8<<r*   c                J    t         j                  | |      j                         S r,   )r  rU  r  r  s     r)   rU  zIRect.__or__gC  s    {{4#))++r*   c                    t        |       S r,   )r  r.   s    r)   r*  zIRect.__pos__jC  r  r*   c                0    dt        t        |             z   S )Nr  r,  r.   s    r)   r   zIRect.__repr__mC  r  r*   c                    t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      r$  )r4   r  r  r  r  r  r/  s      r)   r0  zIRect.__setitem__pC  sg    F!VqTW  !VqTW
 	 !VqTW  !VqTW  122r*   c                J    t         j                  | |      j                         S r,   )r  r2  r  r  s     r)   r2  zIRect.__sub__zC  rs  r*   c                J    t         j                  | |      j                         S r,   )r  r8  r  r	  s     r)   r8  zIRect.__truediv__}C  s    a(..00r*   c                B    t        | j                  | j                        S r]  r^  r.   s    r)   r  zIRect.bottom_leftC  r_  r*   c                B    t        | j                  | j                        S ra  rb  r.   s    r)   r  zIRect.bottom_rightC  r_  r*   c                H    t        d| j                  | j                  z
        S r   rh  r.   s    r)   r  zIRect.heightC  ri  r*   c                $    | j                  |      S )zCheck if x is in the rectangle.rd  r  s     r)   re  zIRect.containsC  rf  r*   c                D    t        | j                  | j                  |      S rk  rl  r;  s     r)   rn  zIRect.get_areaC  ro  r*   c                P    | j                   j                  |      }|j                  S )z$Extend rectangle to include point p.)r   rS  r   )r(   r  r   s      r)   rS  zIRect.include_pointC  s     yy&&q)zzr*   c                P    | j                   j                  |      }|j                  S )z(Extend rectangle to include rectangle r.)r   rT  r   )r(   r  r   s      r)   rT  zIRect.include_rectC  s     yy%%a(zzr*   c                J    t         j                  | |      j                         S )z4Restrict rectangle to intersection with rectangle r.)r  r@  r  r3  s     r)   r@  zIRect.intersectC  s    ~~dA&,,..r*   c                .    t         j                  | |      S r,   )r  rx  r  s     r)   rx  zIRect.intersectsC  s    tQ''r*   c                j    | j                   | j                  k\  xs | j                  | j                  k\  S rz  r{  r.   s    r)   r  zIRect.is_emptyC  r|  r*   c                    | j                   | j                  cxk(  xr	 t        k(  nc xr( | j                  | j                  cxk(  xr	 t
        k(  S c S )zTrue if rectangle is infinite.r~  r.   s    r)   r  zIRect.is_infiniteC  r  r*   c                j    | j                   | j                  k  xr | j                  | j                  k  S r  r{  r.   s    r)   r  zIRect.is_validC  r  r*   c                f    | j                   r
t               S | j                  j                  ||      S r  r  r  s      r)   r  zIRect.morphC  r  r*   c           	     j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r,   r
  r  s     r)   rQ  z
IRect.normC  r  r  c                    | j                   | j                  k  r#| j                   | j                  c| _        | _         | j                  | j                  k  r#| j                  | j                  c| _        | _        | S )z)Replace rectangle with its valid version.r   r.   s    r)   r  zIRect.normalizeC  r  r*   c                n    t        | j                  | j                  | j                  | j                        S r  r  r.   s    r)   r	  z
IRect.quadC  r  r*   c                    t        |       S r,   rW  r.   s    r)   r   z
IRect.rectC  s    Dzr*   c                B    t        | j                  | j                        S r  r  r.   s    r)   r  zIRect.top_leftC  r_  r*   c                B    t        | j                  | j                        S r  r  r.   s    r)   r  zIRect.top_rightC  r_  r*   c           	        t        |      }| j                  s$| j                  s|j                  s|j                  rt        d      t	        dddd| j
                   | j                         t	        |j                  | j                  z  |j                  | j                  z        z  t	        dddd|j
                  |j                        z  S r  r  r3  s     r)   r  zIRect.torectC  s    Gt}}FGGq!QDGG8dggX64::-qxx$++/EFGAq!QTT14401	r*   c                J    t         j                  | |      j                         S r,   )r  r  r  r	  s     r)   r  zIRect.transformC  s    ~~dA&,,..r*   c                H    t        d| j                  | j                  z
        S r   r  r.   s    r)   rY  zIRect.widthC  ri  r*   r  )/r/   r0   r1   r`  r
  rA  r  r  r]  rV  r   r   r$  r&  rU  r*  r   r0  r2  r8  r3  r  r  r  re  rn  rS  rT  r@  rx  r  r  r  r  rQ  r  r	  r   r  r  r  r  rY  r  r<  r  r  r-   r*   r)   r  r  =C  s   --*k
7! "&$4DTd o-=,*-1 ' ' ' ' ) )$9

/( 8 8 _ _ 9 9%3 8 8   ' ' ' '	/ ) ) 
B	B	B	Br*   r  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr/  r.  r  rB
  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibir/  symbr.  zadbr  i   ifitzr   r   rG  r   r   r	  r  @   r  r  r  
   r  r     )r      r   )r   r  r   Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenr  MultiplyNormalOverlay
SaturationScreen	Softlightc                2    d|  dt        |||f       d| dS )Nz<</A<</S/GoTo/D[z	 0 R/XYZ z	]>>/Rect[]/BS<</W 0>>/Subtype/Link>>r  )r!   r
  r  r  r[  s        r)   rY	  rY	  E  s7    )9!IiQRTUWXPYFZE[[defdg  hC  (D r*   c                    d|  d| dS )Nz<</A<</S/GoTo/Dz>>/Rect[r  r-   r  s     r)   rY	  rY	  E  s    s(1#=XY r*   c                >    d|  dt        |||f       d| d| d| dS )Nz<</A<</S/GoToR/D[z /XYZ z]/F<</F()/UF()/Type/Filespec>>>>/Rect[r  r  r  s          r)   rY	  rY	  E  sU    0A!F9VWYZ\]U^K_J``hijhkkpqrps  tM  NO  MP  Pk  /l r*   c                    d|  d| d| dS )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[r  r-   r!   r
  r  s      r)   rY	  rY	   E  s    $4QCs1#YqcId"e r*   c                    d|  d| d| dS )Nz<</A<</S/Launch/F<</F(r  r  r  r-   r  s      r)   rY	  rY	  !E  s     $:1#U1#E^_`^aa|"} r*   c                    d|  d| dS )Nz<</A<</S/URI/URI(r  r  r-   r  s     r)   rY	  rY	  "E  s    /s)A3>YZ r*   c                    d|  d| dS )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[r  r-   r  s     r)   rY	  rY	  #E  s     03HKfg r*   )rL  goto2rO  rP  rQ  rR  r  c                      e Zd ZdZy)r
  z0Raised for documents with file structure issues.Nr/   r0   r1   r`  r-   r*   r)   r
  r
  &E  s    :r*   r
  c                      e Zd ZdZy)r  zRaised if file does not exist.Nr  r-   r*   r)   r  r  *E  s    (r*   r  c                      e Zd ZdZy)r  z5Raised when creating documents from zero-length data.Nr  r-   r*   r)   r  r  .E  s    ?r*   r  r  r   bidir*  r  r  r  r	  r  r  rt  rv  zcs-namedar[  descriptionr!  re  effectr  rf   r   r  
char_flagsrT  r  r  r5  r  rB   r  r  r  rw  r   rB  r  r   r  r  spansrd  rZ  rx  r   ru  r   r  rY  r
  r  r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?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	  Zd;O?)"   7A`?)#   r8  )r	   rh?)%   -?)&   gL7A`?)'   jt?)r  r  ))   r  )*   r8  )+   r  ),   r  )-   r  ).   r  )/   n?)0   r8  )1   r8  )r  r8  )3   r8  )4   r8  )5   r8  )6   r8  )7   r8  )8   r8  )9   r8  ):   r  );   r  )<   r  )=   r  )>   r  )?   g"~j?)r  r  )A   v?)B   MbX?)C   r	  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  r	  )I   r  )J   x&1?)K   r	  )L   ʡE?)M   g r?)N   r	  )O   r	  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   r  )U   Gz?)V   r  )W   r  )X   gp=
ף?)Y   q=
ףp?)r  r  )[   r  )\   gV-?)]   r  )^   uV?)r  r8  )`   r8  )a   r  )b   r  )r  r  )rt  V-?)e   r  )f   y&1?)g   M?)h   r  )i   uV?)j   r  )k   r  )l   r  )m   ;On?)n   r5  )o   r  )p   r  )q   r5  )r   r  )s   r  )t   r  )u   r?  )v   r  )w   r  )x   gZd;O?)y   r  )z   r2  ){   Q?)|   rD  )}   rN  )~   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )   r  )   gףp=
?)   gV-?)   r  )   gK7A`?)   r  )   r8  )   jt?)   rZ  )   rZ  )   rZ  )   y&1?)   r  )   r  )   /$?)   r  )   g?)   r  )   r7  )   r  )rc  r  )   r?  )   r2  r  )   r  )   r  )   r  )   r  )   r   )r	  r  )   r   )   r.  )   tV?)   r  )   r)  )   rc  )   r  )   r  )   rs  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   HzG?)   r  )   g{Gz?)   rs  )   r  )   r  )   r  )   r  )   r  )   r_  )   rc  )   r  )   rc  )   r  )   r2  )   r:  )   r  )   r  )   x&?)   r  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   r2  )   r2  )   r2  )   r2  r  )   r:  )   gK7?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r2  )   r2  )   r2  r  (   r  K7?r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  )r	  ^I+?)r  gn?)r  r  )r	  g\(\?)r  g5^I?)r  sh|??)r  r  )r  Zd;O?)r  r$  )r  gQ?)r  g?5^I?)r  r  )r  g\(\?)r  x&?)r  gB`"?)r  r  )r  g=
ףp=?)r  r  )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  r2  )r  gDl?)r  gv/?)r  gX9v?)r  g/$?)r
  r  )r  r  )r  r  )r  r  )r  gK7A`?)r  g rh?)r  &1?)r  rs  )r  r  )r  gx?)r  rs  )r  r  )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(  r  )r  r  )r*  9v?)r+  g-?)r,  gm?)r-  g;On?)r  g;On?)r/  gGz?)r0  r  )r1  r  )r  r  )rt  gCl?)r3  ʡE?)r4  g?5^I?)r6  r  )r8  gv/?)r9  r  )r;  r  )r<  gQ?)r=  r  )r>  V-?)r@  r  )rA  r  )rB  r  )rC  r  )rD  r  )rE  %C?)rF  r  )rG  r  )rH  gJ+?)rI  gx&1?)rJ  gDl?)rK  g|?5^?)rL  g(\?)rM  J+?)rO  r  )rP  K7A`?)rQ  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  )rS  gCl?)rT   rh?)rU  r  )rV  gQ?)rW  r  )rX  r  )rY  r  )r[  r  )r\  g
ףp=
?)r]  gh|?5?)r^  gx&1?)r`  r  )ra  r  )rb  r  )rd  r  )re  r  )rf  r  )rg  r  )rh  r  )rc  r  )ri  r  )rj  r  r  )rk  r  )rl  r  )rm  r  )rn  r  )ro  r  )r	  r  )rp  r  )rq  r  )rr  r  )rt  r  )ru  r  )rv  r  )rw  r  )rx  r  )ry  r  )rz  r  )r{  r  )r|  r  )r}  r  )r~  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r  V-?)r   rh?)r  r  )r  gK7A`?)r  Dl?)r  V-?)r  r  )r  g㥛 ?)r  r  )r  g"~?)r  r  )r  r  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r  gK7A?)r  獗n?)r  r  )r  X9v?)r  r  )r  r  )r  r  )r  +?r  )r  r  )r  r  )r  gʡE?)r  y&1?)r  gGz?)r  r  )r  "~j?)r  gl?)r  r  )r  r  )r  r  )r  r  )r  g
ףp=
?r  r  c                Z    |r|d   nd}ddddd}||   d   ||   d   z  d	z  }|| z  |z  S )
Nr   rW  )r   r   r  r  r  r  r   r   r-   )rY  r  r  r  r  r  s         r)   rm  rm  G  sK    47D[LQA	
4agaj	 Q&Au9vr*   c                    g }| j                         s|S t        |      D ]*  }|j                  t        j                  | ||z                , t        |      S r,   )r  rF  rk   r   r  r  )r  rY  rE   rG   rZ  s        r)   _read_samplesr  G  sR     C>>
AY ?

E((&&1*=>?#;r*   c                    || k  xr | |k  S r,   r-   )rF   lowhighs      r)   r  r  G  s    !8!T	!r*   c           
        t        j                  |       }t        |      D ]6  }|}||v rt        j                  | |      }t        j                  |t        d            }|j                  sMt        j                  |      }t        |dz
  dd      D ]  }t        j                  ||      }	t        j                  t        j                  |	t        d            t        d            sWt        j                  |	t        d            }
t        j                  |	t        d            }|
j                  r\t        j                  t        j                  |
t        d            t        d	            st        j                  |
t        d
            }d}t        j                  |      r-t        j                  |d      }t        j                  | |      }n\t        j                  |      rGt        j                  | j                         t        j                  |            \  }}}|j                   }|dk  r|}||v st        j"                  ||        9 y )Nr  r   r  r  r
  r  r  r	  GoTor  r   )r   r/  rF  r2  r  r  r   r  r  r  r  pdf_lookup_page_numberr
  r  r   r   r   r  )rT  rf  	pagecountrZ  r-  r8  r  r  r|  r  rw  r  r  r
  r  r  s                   r)   re  re  G  s   %%c*I9 3=++S!4##Whx.@A  ""6*taxR( 	3A##VQ/A$$e&8&8!Xi=P&QS[\bScd''HSM:F%%q(6*:;D  ((%*<*<fhsm*TV^_eVfg))68C=AC!!4(,,dA622C@$$d+!&!6!6		UE]E]_cEd!e!QmmQwBW}&&2+	33r*   c                    t        | t        j                  t        j                  f      sJ dt	        |       d|        | j
                  st        t              y )Nztype(cond)=z cond=)r>   r   r   r   r   r   rg   MSG_IS_NO_PDF)conds    r)   
ASSERT_PDFr  G  sQ    dU]]E,=,=>?YKDJ=PWRVQXAYY???&& r*   c                 >    t        t        t        t        t              S r,   )r  r  r  r-   r*   r)   EMPTY_IRECTr  G      /?OTTr*   c                 *    t               j                  S r,   )
EMPTY_RECTr	  r-   r*   r)   
EMPTY_QUADr  G  s    <r*   c                 >    t        t        t        t        t              S r,   )r  r  r  r-   r*   r)   r  r  G      /?SSr*   c                0    t        |       st        d      y )Nz No journalling operation started)JM_have_operationrg   rT  s    r)   rH  rH  G  s    S!:;; "r*   c                 >    t        t        t        t        t              S r,   )r  r  r  r-   r*   r)   INFINITE_IRECTr  G  r  r*   c                 *    t               j                  S r,   )rE  r	  r-   r*   r)   r0  r0  G  s    ?r*   c                 >    t        t        t        t        t              S r,   )r  r  r  r-   r*   r)   rE  rE  G  r  r*   c                h    t        | t        j                        sJ t        j                  |       }|S )z3
    Turn fz_buffer into a Python bytes object
    )r>   r   r]  r~
  )r(  rG   s     r)   r  r  G  s-     gu~~...

&
&w
/CJr*   c                    | yt        | t              sJ dt        |              | j                  dd      }d}|D ]  }|t	        |      z  } |S )Nr\   ztype(c)=r	  surrogateescape)r>   r  r   r  r	  )r  r
  rG   bbs       r)   r  r  G  sb    & 	ya,($q'},	*+A
C s2wJr*   c                Z   t        | t        t        f      r| }n~t        | d      r^| j	                         }t        |t
              r|j                  d      }t        |t        t        f      s+t        dt        |             t        j                         S t        j                  |      S )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.
    rs  r  z&.getvalue() returned unexpected type: )r>   r  rZ  r;   rs  r  r  rg   r   r   r]  r  )r	   rz  s     r)   r"  r"  H  s    
 &5),-		$ dC ;;w'D$	 23DT$ZLQRR~~//55r*   c                6    t        |       sy t        | |         S r,   )r%  rk  )r
  r2  s     r)   JM_FLOAT_ITEMr  H  s    C S?r*   c                ^    |t        |       k  r| |   }t        |t        t        f      rd|fS y)Nr   r  )r7   r>   r4   rk  )r
  r2  r}  s      r)   r9  r9  #H  s0    
SX~3xdS%L)d7Nr*   c                   d}d}d}	d}
|
r|}n|}d}|}t        |      }t        j                  |      }t        |      }t        j                  ||      }t        j
                  ||      }t        j                  |      }t        j                  |       }|j                  r@t        j                  |      t        j                  |      k(  rt        j                  |      }||k7  rt        j                  |      }|j                  rt        j                  |      }||	k(  r6t        |      D ]'  }t        j                  ||t        j                         ) nt        |      D ]'  }t        j                  ||t        j                          ) nwt        j"                  |      rt        j$                  d      }nL|j                  r@t        j                  |      t        j                  |      k7  rt        j$                  d      }t        j&                  ||||      }|rt        j(                  |       nt        j*                  |d       t        j,                  ||      }|r=t        j.                  ||t        j0                         t        j2                                n<t        j4                  ||t        j0                         t        j2                                t        j6                  |       |S )zf
    Pixmap creation directly using a short-lived displaylist, so we can support
    separations.
    r   r   r   TNr	  )r  r   r  r  fz_intersect_rectr  fz_round_rectfz_document_output_intentr   r  fz_keep_colorspacefz_page_separationsfz_count_separationsrF  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsr  r8  r9  r  r  rm  r  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   rclipr*  oirE   rZ  r  r  s                          r)   r  r  +H  s_   
 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 XA44T1e>V>VWX 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                    | S r,   r-   r\  s    r)   r_  r_  qH  s    Hr*   c                .    t        t        d |             S )Nc                :    t        |       dk\  rt        | d      S dS )Ng-C6?r   r   r  r  r\  s    r)   rY	  zJM_TUPLE.<locals>.<lambda>xH      c!fnuQ{ ! r*   r   r  r  s    r)   r  r  wH      CQGHHr*   c                .    t        t        d |             S )Nc                :    t        |       dk\  rt        | d      S dS )Nr  r   r   r  r\  s    r)   rY	  zJM_TUPLE3.<locals>.<lambda>|H  r  r*   r  r  s    r)   	JM_TUPLE3r  {H  r  r*   c                    | yt        | t              r| j                  d      } t        | t              sJ dt	        |       d|        | S )Nr\   r	  ztype(s)=z s=)r>   r  r  r  r   rn  s    r)   r   r   H  sM    y!UHHVa1($q'4QD11Hr*   c                   t        | t        j                        sJ t        |       }t        j                  |       }t        |      }d}	 t         d| | }||vrn|dz  }t        |      }t        j                  |t        |            }t        j                  |d|       d|j                         j                  _        y)z
    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)r>   r   r   r   r   r*  JM_annot_id_stemr_  pdf_new_stringr7   r}  r%  r   rK  )	r   stemr   r  r  rZ  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                   t        j                  | |d      }t        j                  |      st        t        t
               t        j                  |t        d            }t        j                  |t        d            dk(  s"t        j                  |t        d            dk(  r!t        j                  |t        d      |       yt        t        t
               y)z1
    Add OC object reference to a dictionary
    r   r#  r  OCMDr  N)
r   r  ru  r  MSG_BAD_OC_REFrF  r  r  ry  rH  )rT  r  r  indobjrU  s        r)   r  r  H  s     ##Cq1FV$ 01vx'78E0A5x'78A=37 01r*   c                V   t               }d }d}d}d }t        j                  | t        d            }t        j                  |      rt        j
                  t        j                  |d            }t        j                  |      dk(  rst        j                  |d      }t        t        j                  |            D ]<  }t        j                  t        j                  ||            }|j                  |       > t        j                  | t        d            }	|	j                  rt        j
                  t        j                  |	t        d                  }t        j                  t        j                  |	t        d                  }|d	k(  rd }t        j                  |	t        d
            }|j                  r]t        t        j                  |            D ]<  }t        j                  t        j                  ||            }|j                  |       > t        j                  | t        d            }|j                  r2t        j                  t        j                  |t        d                  }t               }
||
t        <   t        |      |
t         <   ||
t"        <   ||
d<   |
S )Nr  Borderr   rG  r   BSr	  r	  r\   r  BEIr\  )r   r   r  r  r  r  r  r  rF  r  rk   r   rt  r5   r  r   dictkey_dashesdictkey_style)r  dash_pyrZ  rY  r\  r
  dashrZ  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 %&&(;(;T1(EF$% y(4.9D!!5#5#5tXc]#KL!!5#5#5tXc]#KLB;E  $6>>E//56 %&&(;(;S!(DE$% 

i$
8C
~~!!5#5#5sHSM#JK
&CC '?CCCNJr*   c                   t               }t               }t               }t        j                  | t        j                        }t        j
                  |      r_t        j                  |      }t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > ||t        <   t        j                  | d      }t        j
                  |      r_t        j                  |      }t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > ||t        <   |S )Nr-  )r5   r   r   r  PDF_ENUM_NAME_Cr  r  rF  r  r  rk   dictkey_stroker   dictkey_fill)r  r  bcfcr  rE   rZ  rY  s           r)   r  r  H  s   
&C	BB9e&;&;<A!"q 	A##U%8%8A%>?CIIcN	 CIt,A!"q 	A##U%8%8A%>?CIIcN	 CJr*   c                   t        | t              sJ d }d}| j                  t              }| j                  t              }| j                  t
              }| j                  dd      }t        |      }	t        j                  |t        d             t        j                  |t        d             t        j                  |t        d             |dk  r|	j                  t              }||	j                  t              }||	j                  t
              }|dk  r|	j                  dd      }t        |t              rvt        |      dkD  rht        |      }t        j                  ||      }
|D ]  }t        j                  |
|        t        j                  ||
t        d      t        d             t        j                  |t        j                  |      t        d      t        d             |dk(  rt!        |      }nt        d      }t        j                  ||t        d      t        d	             |dkD  rt        j"                  |t        d      d
       t        j$                  |t        d            }t        j&                  |t        d	      t        d             t        j(                  |t        d      |       y y )Nr   r\  r  r%  r&  r$  r  r	  r	  r   r  r'  )r>   r5   r8   r  r(  r)  r  r   r;  r  r   r7   rE  pdf_array_push_intr  pdf_new_realJM_get_border_stylerL  r  rH  rC  )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$$dA.	/YhtnhsmL	'TNSM	 !|!6*sm	C$#G{HTNA>  )Xd^<C#>Xc]G<	 r*   c                    | dk(  ryd| cxk  rdk  sn | dk(  rt        |       S d| cxk  rdk  ry | d	k  rd
| dS d| dS )Nr+  z\u005cr     r  i   i  z\ufffd  z\ur	  z\U08xr	  r
  s    r)   make_escaperD  "I  s^    	Rx	rSB"H2w	2		 
 	vRH~RH~r*   c                B    t        j                  | t        |             y)zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)r   r  rD  )rK  r
  s     r)   r  r  /I  s     
4R1r*   c                   t        |      }|j                  |j                  |j                  |j                  ||||f}| j                  |       |dz   t        j                  t        j                  j                        fS )z'
    Functions for wordlist output
    r   )	r"
  r  r  r  r  rk   r   rc  r  )r  rK  r  r  r  r  rn  r  s           r)   r  r  6I  sm     	t$AHHHHHHHH	E 
LLA:u||ELL$<$<===r*   c                `   t        |       }t        j                  |t        d            }t        j                  |      s t        j
                  |t        d      d      }t        j                  | d      }t        j                  |t        d      |       | t        j                  |t        d      |       t        j                  |t        d      t        d             t        j
                  |t        d	      d      }|snt        j                  |t        d
            }t        |      }	t        |	      D ]]  }
d}t        ||
      \  }}|dk(  rt        j                  | |d      }t        j                  ||      sHt        j                  ||       _ t        j                  ||       y)z1
    Add OC configuration to the PDF catalog
    r  r   r   r  Nr  	BaseStater  r  r  r   )r  r   r  r  r  r  rM  r|  rH  r7   rF  r9  r  pdf_array_containsr  )rT  r   r~  r  r  configsr  onarrayrV  rE   rZ  r  r[  inds                 r)   r|  r|  II  sc    !#
&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 	4AD!"a(GAtAv((#tQ7C''s3$$gs3	4 
'1%r*   c                (   t        | |      }t        j                  |      }| j                  j                  s|S |j
                  |j                  |j                  j                  z   k  r(|j
                  |j                  j                  z
  |_        |S )z"
    return rect of char quad
    )JM_char_quadr   r9  r   r
  r  r  r  )ro   r
  r<  r  s       r)   r  r  gI  sp     	T2A"A??  ttaddR]]''''ttbmm(((Hr*   c                (   d}|r|r|t        ||      z  }|t        j                  |       t        z  z  }|t        j                  |       t
        z  z  }|t        j                  |       t        z  z  }|t        j                  |       t        z  z  }|S r   )
detect_super_scriptr   r
  TEXT_FONT_ITALICr
  TEXT_FONT_SERIFEDr
  TEXT_FONT_MONOSPACEDr
  TEXT_FONT_BOLD)rT  ro   r
  r  s       r)   JM_char_font_flagsrU  tI  s    E$T2..	U$$T*-===E	U##D),===E	U((.1EEEE	U""4(>99ELr*   c                
   t         r=t        j                  t        j                  | j
                  |j
                              S t        | t        j                        sJ t        |t        j                        sJ t        j                  r|j                  S | j
                  j                  r|j                  S t        j                  t        j                  |j
                  j                              }t!        |      }t#        |      }|j
                  j$                  }||z
  t&        z   }|dk\  r<t        j(                  dk(  r)t        j                  |j
                  j                        S |j
                  j$                  }t        j*                  |      }|j,                  |j.                  z
  }|dk  rd}d}d}t        j(                  s|dk  r
||z  }||z  }||z
  }||z  |z  }||z  |z  }| j
                  j0                  j2                  }	| j
                  j0                  j4                  }
t        j6                  |	|
 |
|	dd      }t        j6                  |	|
|
 |	dd      }|	dk(  rd|_        d|_        t        j6                  dddd|j
                  j:                  j2                   |j
                  j:                  j4                         }t        j6                  dddd|j
                  j:                  j2                  |j
                  j:                  j4                        }t        j<                  t        j                  |j
                  j                        |      }t        j<                  ||      }|	dk(  r^|j>                  j4                  dkD  rE||j>                  _        ||j@                  _        ||jB                  _        ||jD                  _        nH| |j>                  _        | |j@                  _        | |jB                  _        | |jD                  _        |jB                  j2                  dk  r"d|jB                  _        d|j>                  _        |jD                  j2                  |jB                  j2                  z
  }|t&        k  rt        jF                  ||j
                  jH                        }|r{t        jJ                  ||| j
                  j                        }|jB                  j2                  ||z  z   |jD                  _        |jD                  j2                  |j@                  _        t        j<                  ||      }t        j<                  ||      }|S )zI
    re-compute char quad if ascender/descender values make no sense
    r   r   r  皙?r  r  )&r  r   r  r   rN  r   r>   FzStextLineFzStextCharr  r   r	  r
  FzFontll_fz_keep_fontrT  JM_font_ascenderJM_font_descenderr  FLT_EPSILONr   r{
  r  r  re  r"  r#  r2  r  r  fz_transform_quadr  r&  r$  r%  r  r  r  )ro   r
  rT  r9  r:  r  asc_dscr*  fwidthr  rn  trm1trm2xlate1xlate2r	  cwidthr  s                     r)   rN  rN  I  s     ||E..OPPdE--...b%++,,,%%wwww<<--bmm.@.@ABD
4
 C
D
!CMMECi+%G!|449||BMM..//
 MMEd#DWWtwwF
Tz##w{GmGmCiG
+
C
+
C
 	AAA2q!Q2D1qb!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		FUN2DGGI		DGGI""4.D""40DKr*   c           
        t        j                  | j                        }t        j                  | d      }t	        |      }|dk(  ryt        j
                  |t        d            }g }t        |      D ]  }t        j                  t        j                  ||            }|dk(  rt        j                  t        j                  t        j                  ||      d            t        j                  t        j                  t        j                  ||      d            f}|j                  |       t        j                  t        j                  ||            }|j                  |        |S )z8
    return list of choices for list or combo boxes
    r   NOptr   r   )r   r   r   pdf_choice_widget_options2r7   r  r  rF  r  r  r   rk   )	r   r  r  rE   optarrr:  rZ  r{  r  s	            r)   JM_choice_optionsrl  I  s*    ##UZZ0I++UA6DT
AAvHUO<FEAY 
!4!4fa!@A6,,e.A.A5CVCVX^`aCbde.fg,,e.A.A5CVCVX^`aCbde.fgC LL#**E,?,?,KLCLL#
 Lr*   c                   t        j                  |t        j                  |             }|j                  |j                  z
  }|j
                  |j                  z
  }|dk  s|dk  ry| j                         }||j                  | j                         z
  z  | j                         |j                  | j                         z
  z  z   }t        j                  | j                               dk(  rd|z
  }	 |}t        d|      D ]  }t        j                  | |d       |dz  }t        j                  | |d       |dz  }t        j                  | |d       |dz  }t        j                  | ||       |dz  }| j                         st        j                  | |d       |dz  } ||z  }|dk(  r	 y|dz  }	 |}t        |      D ]  }t        | j                         dz
        D ]  }	t        j                  | ||       |dz  }  | j                         rt        j                  | |d       |dz  }mt        j                  | ||       |dz  } ||z  }|dk(  r	 y|dz  })zO
    Clear a pixmap rectangle - my version also supports non-alpha pixmaps
    r   rG  r	  r   )r   fz_intersect_irectrR  r  r  r  r  r   r#  rE   r"  r  r  rF  r  r  )
r  r   r
  r   r#  destspandestprn  r"  r  s
             r)   r:  r:  I  sO    	  E$8$8$>?A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE T__./14eA1a[ $$T1a0Q$$T1a0Q$$T1a0Q$$T1e4Q::<((q#6FA XEAv FA# ( q 		A4668A:& $$T1e4Q zz|$$T1c2Q$$T1e4Q		 	6 	
Q r*   c                   t        | t        t        f      r| g} t        | t        t        f      sdg fS t        |       dvrdg fS | d d  }t        t        |            D ]  }||   dk  s	||   dkD  sd||<    t        |      |fS )Nr  )r   r   r   rG  r   r   )r>   r4   rk  r   r   r7   rF  )r  rG   rZ  s      r)   r5  r5  +J  s    %#u&utUm,2v
5z%2v
(C3s8_ q6A:Q!CF s8S=r*   c                D    	 t        j                  | j                  |      S r,   )r  r   ll_JM_color_countr   r5   r   rR  rn  r  r  r   r  r  r  r  rE   r#  r"  r  fz_is_empty_irectrF  r8   )r  r  r   r@  r   r   rY  r  rE   	substridern  oldpixrZ  r|  newpixrA  r  s                    r)   r<  r<  =J  s    &&r}}d;;r*   c                    t        j                  | t         j                        \  }}|r|dk(  ryt        j                  t        j                  ||            }t        j
                  ||       |S )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)inbufferrz  compressed_lengthr  s       r)   JM_compress_bufferr  eJ  sh     $DD!!D

 $)
..66t=NO
PC	3 12Jr*   c                   d}t        j                         }| D ]  }|j                  j                  t        j
                  k7  r+|D ]n  }d}|D ]`  }t        ||      }t        ||      sd}|r|j                  d       d}|j                  t        |j                  j                               b |smd}p  |j                         }	|	S )Nr   r   r%   )r9   StringIOr   r   r   r  r  r  r   rD  r  rs  )
r   r  need_new_liner  r  ro   line_had_textr
  r  rn  s
             r)   r  r  uJ  s    M[[]F "  E$=$== 	"DM ? r*#D!,$%M$T*()LLR]]__!=>?  !	""  	AHr*   c                   t        j                         }d}|}|}||kD  rd}|}|}t        |      }|}		 t        |	||      snt        j                  | |	      }
t        j
                  |
      }t        j                  ||      \  }}}t        j                  |
|t        j                         t        j                                t        j                  |       d}t        j                  |||||      }t        j                  |d|       |	|z  }	t        j                         }d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        t        j2                  d      }t        j4                  |      }t        j6                  |||       |j9                          t        j:                  |      }t=        |t>              sJ |S )zx
    Convert any MuPDF document to a PDF
    Returns bytes object containing the PDF, created via 'write' function.
    r   r  NrG  r   i    ) r   r   r  r  r  r  pdf_page_writer  rm  r  r  r_  r`  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r~
  r>   r  )r%  rr  r  rS  r  ri  rn  r[  rO  rZ  r   ra  r  r\  rb  rc  r  r  r  r  s                       r)   r  r  J  s   
  FD
A
A	Bw
6
"C
A
1a !!#q)&&t,#(#7#7#I Y$U^^%5u~~7GHc"%%fhYQfb(3	T	    "DDODDDDDDMDDNDMDN


d
#C
..
C	VS$/$$S)AaHr*   c           
        t        j                  t        j                  t        j                  |       d            }t        j                  |t         j
                        }t        j                  |      }	 t        | ||       t        j                  |t        d      |       |t         j                  k(  rj|t        t        z  z  }t        j                  t        j                  |       t        j                  |      t        d      t        d      t        d             t        j                  t        j                  |       d      }|j                  s]t        j                   | d      }t        j                  t        j                  |       |t        d      t        d      t        d             t        j"                  ||       |S # t$        $ r t&        r
t)                t        j*                  ||       |t         j                  k(  rZt        j                  t        j                  |       t        j                  |      t        d      t        d      t        d              w xY w)	NzRoot/AcroForm/SigFlagsr  r&  r'  r  zRoot/AcroForm/Fieldsr   r  )r   r  r  r*  pdf_create_annot_rawr0  r   JM_set_field_typer|  r  PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyr  r  r   rE  r  rg   r  rv   r  )	r%  r   r   	fieldnameold_sigflagsr   r  r  r<  s	            r)   rd  rd  J  s   ##E$7$78I8I#8NPh$ijL
 &&tU-C-CDE##E*I&#y$/&&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& 	T9- L  N$4tU+5222%%c*%%l3V$Z(Z( 	s   7EG BI)c                   t         rt        j                  |       S t        |       }t	        j
                  t	        j                  | t        d                  }t	        j                  |      st	        j                  |      r|}|j                  |j                  z
  }|j                  |j                  z
  }||_        ||_
        |S )z%
    return a PDF page's CropBox
    r  )r  r   rN  r  r   r  r3  r  r  r  r  r  )rc  ra  rO  r  r  s        r)   rN  rN  J  s     ))8$H..x)9LMG   )U-C-CG-L	wzz	!B	wzz	!BGJGJNr*   c                    t        |       }t        |j                  |j                  z
        }t        |j                  |j
                  z
        }t        j                  ||      }|S r,   )rN  r  r  r  r  r  r   fz_make_point)rc  r   r   r  r  s        r)   JM_cropbox_sizer  K  sQ    hDDGGdggADGGdggAq!$DKr*   c                B    t        |       }t        j                  |      S )z&
    just the inverse of rotation
    )r  r   r'  )r   mps     r)   r  r  K  s     
t	$B!!"%%r*   c                   d}t        j                  | d      }t        j                  |t        d      d       t        j                  |t        d      d      }t        j                  |t        d      |       t        j                  |t        d      |       t        j                  |t        d      |       t        j
                  |t        d	      t        d
             d}	t        j                  | t        j                  |	      t        j                         d      }
t        j
                  |t        d      |
       t        | |
||       t        j                  |      \  }}t        j                  |
t        d      |       t        j                  |
t        d      |       t        j                  |
t        d      d      }t        j                  |t        d      |       |S )zE
    embed a new file in a PDF (not only /EmbeddedFiles entries)
    r   r  r  rG  r  r  r  r  r#  Filespecs     r  r  r  r  )r   rM  rL  r  r|  rH  r  r  r  r$  r  rC  )rT  r  rf   r  r  r	  r  r  efbsr  r  paramss                r)   r  r  K  sv    D


S!
$C	C$3		 	 htna	8B	""3x@	""3	B	""3(8$?	sHV,hz.BC	B004LLN	A 
r8C=!,S!S(+%%c*GD!	1htnd3	1hx0$7$$Q(:A>F	68F#3T:Jr*   c                   t        j                  t        j                  |       t        d            }t        j                  |t        d            }|j                  r7t        j
                  |      dk(  rt        j                  |t        d             t        j                  |t        d      t        d      t        d            }|j                  r!t        j                  |t        d      d       yy)	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]  rq	  N)	r   r  r*  r  r   rv  r;  r  rO  )rT  r8  collefiless       r)   r  r  <K  s     u00#68HID dH\$:;D5--d3q84,!78  W_%W	F hz&:<LM r*   c                d    | j                   syt        j                  |       }t        |d      }|S )Nr\   r  errors)r   r   r~
  r  )rK  rn  r  s      r)   r"
  r"
  TK  s-    ??$$T*A
*1Y
?CJr*   c           	        t        j                  t        j                  |       t        d            }|j                  st        j
                  d      }d}|D ]  }|t        |      z  } t        j                  t        j                  |       t        d      d      }t        j                  |t        j                  |t        |                   t        j                  |t        j                  |t        |                   yy)z!
    Store ID in PDF trailer
    r'  r	  r\   r   N)r   r  r*  r  r   
fz_memrnd2r	  r  r  r  r7   )rT  r1  rnd0rndrZ  s        r)   r  r  \K  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                   t        j                  t        j                  t        j                  |       t        d            t        d            }|j                  r|S t        j                  t        j                  |       t        d            }t        j
                  |t        d      d      }t        j                  |t        d      d       t        j
                  |t        d      d      }t        j                  |t        d      d       t        j                  |t        d	      d       t        j                  |t        d
      d       t        j                  |t        d      d       |S )z7
    Ensure OCProperties, return /OCProperties key
    r&  r>  r   r  r   r  r   r  r  r  RBGroups)r   r  r*  r  r   rL  r  )rT  r  r8  r  s       r)   r  r  lK  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                *   | sy| j                  d      ry| j                  d      ry| j                  d      ry| j                  d      ry| j                  d      ry	| j                  d
      ry	| j                  d      ry| j                  d      ryy)z'
    Make /DA string of annotation
    r  Cor  coTir  tiSySymbrG  Zar  za)r3   rv
  s    r)   JM_expand_fnamer  ~K  s|     6tvtvtvtvtvtvtvtvr*   c                   | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ry| t         j                  k(  ry| t         j                  k(  ryy)	z!
    String from widget type
    ButtonCheckBoxRadioButtonTextListBoxComboBox	Signaturer
  )r   r  r  r  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                   t        | t        j                        sJ t        j                  |t        j                  |             }|j
                  |j                  z
  }|j                  |j                  z
  }|dk  s|dk  ry| j                         }||j                  | j                         z
  z  | j                         |j                  | j                         z
  z  z   }	 |}t        |      D ]?  }t        | j                               D ]!  }	t        j                  | |||	          |dz  }# A ||z  }|dz  }|dk(  r	 yar  )r>   r   r  rn  rR  r  r  r  r  r   r#  rE   r"  rF  r  )
r  rY  r
  r   r#  ro  rp  rn  r"  rZ  s
             r)   r  r  K  s!   dENN+++  E$8$8$$?@A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE
q 	ADFFH% $$T1c!f5Q	 		Q6 r*   c                   t        | t        j                        sJ d}t        j                  |       }d}t	        |       }t        j
                  |      }	 t        |t        j                        sJ |j                  snft        j                  |      }t        j                  |d      }|j                  rt        j                  ||      sd}nt        j                  |      }|r|S y)z
    Return the first annotation whose /IRT key ("In Response To") points to
    annot. Used to remove the response chain of a given annotation.
    Nr   r   r  )
r>   r   r   r   r   r  r   r   ry  r1  )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##++I6u5<<##Ay1((3	   r*   c                    t        | t        j                        sJ t        j                  ryt        j
                  |       S )3
    need own versions of ascender / descender
    ri  )r>   r   r[  r  r   rx
  )rT  s    r)   r]  r]  K  s5     dELL)))%%!!$''r*   c                    t        | t        j                        sJ t        j                  ryt        j
                  |       }|S )r  gɿ)r>   r   r[  r  r   r
  )rT  rG   s     r)   r^  r^  K  s9     dELL)))%%

!
!$
'CJr*   c                p    	 | dk  s| dk(  sd| cxk  rdk  ry ny|syt        |       }|D ]	  }||k(  s	 y y)z7Check if ch is an extra word delimiting character.
    r  rR  i*   i.   TFrB  )r
  r  r
  r  s       r)   r
  r
  K  s^     	
89R!6! 	 " r7D 9 r*   c                    | dk  s| dkD  ryy)Ni  i 	  FTr-   rC  s    r)   r  r  K  s    	EzR%Zr*   c                    t        | t        j                        sJ t        j                  |       }|j	                  d      }t
        j                  s
|dk(  s|dk7  r|S ||dz   d  S )Nr	  r  r  r   )r>   r   r[  r
  r   r  r   )rT  r   rn  s      r)   JM_font_namer  L  s]    dELL)))d#D		#A  AGqAvA<r*   c           	     b   d}t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  ||      }t        j
                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t         j                        }	t        j                  |t         j                        }
|
j                  rt        j                  |
      r%t        j                  |t         j                        }n|
}t        j                  |t         j                        }t        j
                  |      r$t        j                  |t         j                         }t        j                  |      }d}|rt#        | |      }||t        j                  |	      t%        t        j                  |            t        j                  |      t        j                  |      |f}|j'                  |        |S )Nr   r   z' is no font dict ( 0 R)r  )r   rv  rF  rx  rw  ru  fz_warnrt  r   r  PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   r  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingr  r  rk   )rT  dict_fontliststream_xrefr   rE   rZ  refnamer6  r  r  r   r  r  r  r  s                   r)   JM_gather_fontsr  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%%h0H0HIDD%%h0L0LMX&))(E4T4TUH)&sD1C!!'*#E$5$5d$;<!!'*!!(+ 	=> Ir*   c           	     T   t        | t        j                        sJ d}t        j                  |      }t	        |      D ]  }t        j
                  ||      }t        j                  ||      }t        j                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t        d            }	t        j                  |	t        d            st        j                  |t        d            }
t        j                  |t        d            }|j                  rt        j                  |      }nt        j                          }|
j                  r*t        j"                  t        j$                  |
      |      }n-t        j&                  t        j&                  j(                        }t        j                  |      }|t        j                  |      |t+        |      f}|j-                  |        |S )	z6
    Store info of a /Form xobject in Python list
    r   r   z' is no form dict (r  r  Formr   rp  )r>   r   r   rv  rF  rx  rw  ru  r  rt  r   r  r  r  r   pdf_to_matrixrm  r  r  rc  rd  rb  rk   )r%  r  	imagelistr  r   rE   rZ  r  	imagedictrU  r  r{  rq  r*  r  r  s                   r)   JM_gather_formsr  2L  s    c5,,---	
B5!A1X  ((%3**5!4	  +MMQu009::MeN^N^_hNiMjjopq""9hy.AB  (89y(6*:;y(8*<=<<%%a(C.."C<<**E,=,=a,@#FD<< ; ;<D	* !!7+%	 	; < Ir*   c                   d}t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  ||      }t        j
                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t        d            }	t        j                  |	t        d            st        j                  |      }
d}t        j                  |t        d      t        d	            }|j                  rt        j                  |      }t        j                  |t        d
      t        d            }t        j                  |      rt        j                  |d      }t        j                   d      }t        j                  |t        d      t        d            }t        j                  |      r|}t        j                  |d      }t        j                  |t        d            st        j                  |t        d            rAt        j                  |d      }t        j                  |      rt        j                  |d      }t        j                  |t        d      t        d            }t        j                  |t        d      t        d            }t        j                  |t        d      t        d            }|
|t        j"                  |      t        j"                  |      t        j"                  |      t%        t        j                  |            t%        t        j                  |            t%        t        j                  |            t%        t        j                  |            |f
}|j'                  |        |S )z/
    Store info of an image in Python list
    r   r   z' is no image dict (r  r  r  r   r  r  Filterr  
ColorSpaceCSDeviceN
Separationr   r  r	  r  r4  BitsPerComponentBPC)r   rv  rF  rx  rw  ru  r  rt  r   r  r  r  r  r   r  r  r  r  r  rk   )r%  r  r  r  r   rE   rZ  r  r  rU  r  genr  r  altcsr  csesrY  r  r  r  s                        r)   JM_gather_imagesr  ZL  s    
BE"A1X 0 ((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!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0 b Ir*   c                4   t        | t        j                        sJ d}t        j                  |       }	 |j                  snD|t        j
                  t        j                  |            k(  rd}nt        j                  |      }Q|st        d|dd      |S )z$
    retrieve annot by its xref
    r   r   xref r  z is not an annot of this page)	r>   r   r   r  r   r   r   r1  rg   )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                j   t        | t        j                        sJ |syd}t        j                  |       }	 |j                  sn]t        j
                  t        j                  t        j                  |      d            \  }}||k(  rd}nt        j                  |      }j|st        d| d      |S )z*
    retrieve annot by name (/NM key)
    Nr   r   r  r   z' is not an annot of this page)
r>   r   r   r  r   pdf_to_stringr   r   r1  rg   )r   r   r  r   r  r  s         r)   r  r  L  s     dEMM***E!!$'E
,,U-@-@ATATUZA[]a-bc$8E$$U+  !D6!?@AALr*   c                   g }t        j                  | j                         t         j                        }|j                  s|S t        t        j                  |            D ]_  }t        j                  ||      }t        j                  |d      }|j                  s<|j                  t        j                  |             a |S )Nr  )r   r  r
  PDF_ENUM_NAME_Annotsr   rF  r  r  r   rk   r   )r   r  r  rZ  r  r   s         r)   r*  r*  L  s    EU-G-GHFE''/0 ''2	""9d3??LL((.	 Lr*   c                l   t         rt        j                  |       }|S g }t        j                  | t        d            }t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      }t        j                  |t        d            }|j                  sZt        j                  t        j                  |            }|t        j                  k(  rt        j                  |d      }	|j                  ||t        j                   |	      f        |S )zK
    return the xrefs and /NM ids of a page's annots, links and fields
    r  r  r  )r  r   rK  r   r  r  r  rF  r  r   r   r  rt  PDF_ANNOT_UNKNOWNr   rk   r   )
rc  r  r  rE   rZ  r  r  r  rU  r1  s
             r)   rK  rK  L  s    ,,h7E8H+=>FV$AAY 
E''3	+$$i)1DE!!00%2C2CW2MNE+++!!9d3tUE$<$<c$BCD
E Lr*   c                    | j                  d      } | j                  s
t               S t        | j	                               S r  )r
  r   r   rK  r
  r   s    r)   r.  r.  L  s1    >>5>)D??v!488:..r*   c                6   t         j                  }| |S | }|j                  d      s|j                  d      rt         j                  }|S |j                  d      s|j                  d      rt         j                  }|S |j                  d      s|j                  d      rt         j
                  }|S |j                  d      s|j                  d      rt         j                  }|S |j                  d	      s|j                  d
      rt         j                  }|S )z7
    return pdf_obj "border style" from Python str
    r
  r  r  r  rZ  r'  r  Urn  r	  )r   PDF_ENUM_NAME_Sr3   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)rZ  r  rn  s      r)   r6  r6  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
                d  	 	fd}
d}d}|r t        j                  d||d      } |
|      S |r+t        |      }t        j                  d||d      } |
|      S |dkD  rt        j                  |      } |
|      S | rHt        j
                  |       }|j                  r |
|      S t        j                  | ||      } |
|      S t        j                  ||      \  }}}d}|rt        j                  d|||d      }|j                  r |
|      S t        j                  |||||      } |
|      S )z6
    return a fz_font from a number of parameters
    c                    | j                   st        t              | j                   j                  j                  st        j                  |        | S r,   )r   r   MSG_FONT_FAILEDr  r
  r   fz_set_font_embedding)rT  rs
  s    r)   fertigz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@  rA  ro
  r&  r  rp
  rq
  rr
  rs
  r  rU  rT  r  rz  r  s            `      r)   rn
  rn
  L  s7    ED**D(E1Ed| ,,,dCBd|"}$$X.d| ''1??$<((7IFd| 1164@D$D,,dD$qId|&&hSD$<r*   c                Z   |dk  ryt        j                  | |      }t        j                  |t        d            }|j                  rIt        j
                  t        j                  |d            }t        j                  |t        d            }nt        j                  |t        d            }|j                  st        d       y|}d}t        j                  |t        d            }|j                  r|}t        j                  |t        d            }|j                  r|}t        j                  |t        d	            }|j                  r|}t        j                  |t        d
            }|j                  r!t        j                  |      st        d       yt        j                  |t        d            rnKt        j                  |t        d            rn+t        j                  |t        d            rnt        d       |st        d       yt        j                  |      S )z@
    Return the contents of a font file, identified by xref
    r   Nr	  r   r	  z%invalid font - FontDescriptor missingFontFile	FontFile2	FontFile3r  invalid font descriptor subtypeType1CCIDFontType0COpenTypez6warning: unhandled font type {pdf_to_name(ctx, obj)!r}zwarning: unhandled font type)r   r  r  r  r   r  r  rr   r  r  r  )r%  r  r  desftr
  r	   s         r)   r
  r
  <M  s    axc4(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56S(8"45sH_$=>sHZ$89LM./  ((r*   c                   t        j                  | t        d      t        d            }|j                  syt        j                  |      }|dk  ryg }t        |      D ]k  }t        j                  ||      }t        j                  ||      }t        j                  |      }t        j                  |      }|j                  ||f       m |S )z
    Return the items of Resources/Properties (used for Marked Content)
    Argument may be e.g. a page object or a Form XObject
    r/  
Propertiesr-   r   )r   r  r  r   rv  rF  rx  rw  rt  r   rk   )	r  
propertiesrE   r   rZ  r  r  r  r  s	            r)   r  r  sM  s    
 $$S(;*?,AWXJ  z*q5q 	!A((Q7C((Q7C!!#&A##C(DIIq$i 	! Ir*   c                $   d}t        j                  |       }|j                  rRt        j                  |      }|t        j                  |      k(  rd}n"t        j
                  |      }|j                  rR|st        d| d      t        |      S )z%
    retrieve widget by its xref
    FTr  z is not a widget of this page)r   r  r   r   r   r2  rg   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                >   t        j                  | j                        }t        | j                        }|j	                         }| }fd}d }t        j
                  |j                        }|_        |t         j                  k(  r*t        j                  ||      r
 |dd       n |dd       n	 |dd        |dt        t        j                  |                    |dt        t        |                   t        j                  |      }	 |d	|	       d
 }
 |
|t        d            }|
 |d|       d}|t         j                  k(  rt        j                  |t        d            }|j                   r |dt        j"                  |             t        j                  |t        d            }|j                   rt        j$                  |      }|st        j&                  |      } |dt        |              |dt        j(                  |             t        j*                  t        j,                  |t        d      t        d                  }|dk(  rd} |d|       t        j,                  |t        d      t        d            }t        j.                  |      rat        j0                  |      }dg|z  }t3        |      D ].  }t        j4                  t        j6                  ||            ||<   0  |d|        |dt        j8                  |j                                |dt        j:                  |j                               t        j,                  |t        d      t        d            }t        j.                  |      rat        j0                  |      }dg|z  }t3        |      D ].  }t        j*                  t        j6                  ||            ||<   0  |d|       t        j,                  |t        d      t        d            }t        j.                  |      rat        j0                  |      }dg|z  }t3        |      D ].  }t        j*                  t        j6                  ||            ||<   0  |d|        |d t=        |              t        j>                  t        j@                  |t        d!                  } |d"t        |             t        j,                  |t        d      t        d#            }|j                   r& |d$t        t        j>                  |                    |d%t        jB                  |             jE                          t        j                  |t        d&            }tG        |      } |d'|        |d(tG        t        j,                  |t        d)      t        d*                          |d+tG        t        j,                  |t        d)      t        d,                          |d-tG        t        j,                  |t        d)      t        d.                          |d/tG        t        j,                  |t        d)      t        d0                          |d1tG        t        j,                  |t        d)      t        jH                  d2                          |d3tG        t        j,                  |t        d)      t        jH                  d4                         y)5z
    Populate a Python Widget object with the values from a PDF form field.
    Called by "Page.first_widget" and "Widget.next".
    c                     t        | |       y r,   rO  )r  r   r6  s     r)   SETATTRz)JM_get_widget_properties.<locals>.SETATTRM  s    U#r*   c                    t        | ||       y r,   r  )modr  r   s      r)   SETATTR_DROPz.JM_get_widget_properties.<locals>.SETATTR_DROPM  s     	S% r*   r  TFNr  r  r  c                z   | }d}	 | j                   syt        j                  | |      }|j                   rt        j                  |      }|r|S t        j                  | t	        d            } | j                   |j                   k(  rt        d      |dz  }|dk(  r!t        j                  |t	        d            }d})a  
        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  rg   )r  r  slowhalfbeatr  rw  s         r)   'pdf_dict_get_inheritable_nonempty_labelzIJM_get_widget_properties.<locals>.pdf_dict_get_inheritable_nonempty_labelM  s     ??$$T3/C~~005 L%%dHX,>?D$//1 455MH1}))$0BC r*   TUr  r  r  r  r  r  r%  r	  r   r   r  r  r  r  r  MKBGrR  BCr  r  r7  r  r0  r  r  r  ro
  r  r  Kr  r  r  Vr  r  r  Blr  Fo)%r   r   r   r   r%  pdf_widget_typer  r  pdf_signature_is_signedr   pdf_field_border_styler  pdf_load_field_namer  r  r  r   r   rt  pdf_field_valuepdf_field_displayr  r  r  r  rF  r  r  pdf_text_widget_max_lenpdf_text_widget_formatrl  r   r3  pdf_field_flagsr  JM_get_scriptr+  )r   r6  r  r   rT  twr  r  r  r  r  rw  fvaluer
  r  rE   r  rZ  rY  r  rn  sss    `                    r)   JM_get_widget_propertiesr-  M  s    ##EJJ/I5::&D
((*C	B$! &&rww/J"FU444((i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A##E$7$7Q$?@AaD	AV_a0(E(Ebgg(NO(D(DRWW(MN


i$$
HC#$cAgq 	DA&&u':':3'BCCF	DV\3/


i$$
HC#$cAgq 	DA&&u':':3'BCCF	D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                "   |dk  ryt        j                  | |      }t        j                  |t        d            }|j                  rIt        j
                  t        j                  |d            }t        j                  |t        d            }nt        j                  |t        d            }|j                  sy|}t        j                  |t        d            }|j                  ryt        j                  |t        d            }|j                  ry	t        j                  |t        d
            }|j                  rt        j                  |t        d            }|j                  r!t        j                  |      st        d       yt        j                  |t        d            ryt        j                  |t        d            ryt        j                  |t        d            ryt        dt        j                  |       d       y)zF
    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   r  r  r  r   r  r  r  rr   r  rt  )r%  r  r  r  r
  s        r)   r  r  ;N  s    axc4(Aq(+<"=>E(()<)<UA)FG  h/?&@A  H-=$>?>>A


Q 4
5C
~~


Q 5
6C
~~


Q 5
6C
~~  hy&9:>>%"3"3C"856S(8"45sH_$=>sHZ$89+E,=,=c,B+C1EFr*   c                   t               }t        j                  |       rft        j                  |       }t	        |      D ]C  }t        j
                  | |      }t        j                  |      }||vs3|j                  |       E |S )z
    Get OCG arrays from OC configuration
    Returns dict {"basestate":name, "on":list, "off":list, "rbg":list, "locked":list}
    )r   r   r  r  rF  r  r   rk   )rH  list_rE   rZ  r
  rC   s         r)   JM_get_ocg_arrays_impr4  gN  sy    
 FE3%q 	#A%%sA.C##S)D5 T"		#
 Lr*   c                   t               }t        j                  | t        d            }t	        |      }|r||d<   t        j                  | t        d            }t	        |      }|r||d<   t        j                  | t        d            }t	        |      }|r||d<   t               }t        j                  | t        d            }t        j                  |      rWt        j                  |      }t        |      D ]4  }t        j                  ||      }t	        |      }|j                  |       6 |r||d<   t        j                  | t        d	            }|j                  rt        j                  |      }||d
<   |S )Nr  r  r  r1	  Lockedr  r  r2	  rH  r0	  )r5   r   r  r  r4  r   r  r  rF  r  rk   r   rt  )	confr   rH  r3  rE   rZ  r
  list1r  s	            r)   r?  r?  wN  sO   	B


dHTN
3C!3'E4


dHUO
4C!3'E5	


dHX$6
7C!3'E8FE


dHZ$8
9C3%q 	 A%%sA.C)3/ELL	  :


dH[$9
:C
~~!!3';Ir*   c                   t        j                  |      }t        d|d      D ]  }t        j                  t        j                  ||            }t        j
                  |      }t        j                  t        j                  ||dz               }t        |dd      }t        j                  |      }t        |t              sJ |j                  d      }| j                  ||f        y )Nr   r   r   r  )r   r  rF  r  r  r  r
  fz_buffer_extractr>   r  r  rk   )	r:  r  rE   rZ  r  r  r  r  r  s	            r)   r  r  N  s    D!A1a^  ((%*=*=dA*FGs#((%*=*=dAE*JK!#q!,##C(!U###HHWsAh r*   c                   | j                   syt        j                  | t        d            }t        j                  |      }|dk(  r,t        j                  | t        d            }|j                   syyt        j
                  |      rt        t        j                  |            }n7t        j                  |      r!t        j                  |      }t        |      }ny|r|S y)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.
    Nr	  
JavaScriptJS)r   r   r  r  rt  r
  r   r   r  r  r"
  )r  r|  jjjsro
  r  s         r)   r)  r)  N  s     >>3.A			1	B	\Xd^4}}2"5#;#;B#?@			R	 ##B'',
r*   c                ^    | j                   j                  rt        j                  | d      syy)z(
    Ensure valid journalling state
    r   r   )r   r  r   r  r  s    r)   r  r  N  s&     ~~e&=&=c1&Er*   c                4   | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry	| t         j                  k(  ry
| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ryy)z/
    return extension for MuPDF image type
    faxr  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)rU  s    r)   JM_image_extensionrZ  N  s     """u"""u$$$w"""u"""u"""u"""u$$$u###v"""u"""u"""u"""u###vr*   c                `   t        |t        j                        sJ t        j                  t        j                  j                        }t        j
                  t        j                  |      |      }t        j
                  |t              }|t        |      f}t        j                  |       y r,   )r>   r   rm  rc  r\  r`  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_infork   )r  r  r   r  r  r<  r}  s          r)   JM_image_filterr`  N  s{    c5>>***U\\,,-A!8!8!;SAA$56A##Ddr*   c                V   | syt        |       }|dk  rt        d       y| }t        j                  |      }|t        j                  k(  ry|rt        j
                  ||      }nt        j                  ||      }t        j                  |      }t        j                  |      }t        j                  |      \  }}	t        j                  |      }
t        j                  |j                               }t               }|j                         |t        <   |j!                         |t"        <   |
|d<   t%        |      |t&        <   ||t(        <   |	|t*        <   |j-                         |t.        <   |j1                         |t2        <   t5        |      |t6        <   ||t8        <   |r	||t:        <   |S )z
    Return basic properties of an image provided as bytes or bytearray
    The function creates an fz_image and optionally returns it.
    Nr   r  orientation)r7   rr   r   fz_recognize_image_formatFZ_IMAGE_UNKNOWNr  fz_new_buffer_from_shared_datarQ  fz_image_orientation_matrixr  fz_image_orientationr  r  r5   r   r  r  r  rl  r  r  r  rE   r  r  r  rZ  r  r  dictkey_image)r  
keep_imager  r  rU  r  r  r  r  r  rb  cs_namer  s                r)   JM_image_profilerk  N  sp   
 	?Dax!"A++Q/E&&&22At<22At<**C0E

+
+U
3C**51JD$,,e4K&&(8(8(:;GVF"WWYFM#ggiFN(FM/4FN FL FL"''')F 99;FK-e4FK&FO!&Mr*   c                `   | j                         }t        j                         at        j                         }t        j
                  | |t                G d dt        j                        } |       }t        dddd|      }g at        j                  || |       t        t              }g a|S )Nc                  $     e Zd Z fdZd Z xZS )0JM_image_reporter.<locals>.SanitizeFilterOptionsc                B    t         |           | j                          y r,   r   r   use_virtual_image_filterr(   r  s    r)   r   z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__$O  s    G))+r*   c                F    t        d t        j                  |      ||       y r,   )r`  r   rm  )r(   r  r  r   r  r  s         r)   image_filterz=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filter'O  s    D%.."5tUCr*   r/   r0   r1   r   rt  r  r  s   @r)   SanitizeFilterOptionsrn  #O  s    	,	Dr*   rw  r   )r  r  r  r  r  )r%  r   rm  r]  rc  r  PdfSanitizeFilterOptions2r  r_  rj  r   )r   r%  ra  rw  sanitize_filter_optionsfilter_optionsr   s          r)   r"  r"  O  s    
((*C(||~H	T8->?D ? ? D 45+)N J	""C~>	z	BJIr*   c                    t        t        d       } t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d	       }t               }	||	d
<   t        t        j                        |	d<   t        t        j
                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t               |	d<   t        t        j"                        |	d<   | |	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d <   t        t        j$                        |	d!<   |	S )"NTOFUTOFU_BASE14TOFU_CJKTOFU_CJK_EXTTOFU_CJK_LANG
TOFU_EMOJITOFU_HISTORICTOFU_SILTOFU_SYMBOLbase14cbzepubr^  iccr  rI  r?  rT  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   r5   r   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_SYMBOLrG   s
             r)   JM_fitz_configr  >O  s   %eV44I%e];;%eZ88M%e^<<%e_==%e\::O%e_==%eZ88M%e];;
&C.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'CK+C
O/C0C-C0C+C
O.C"5#6#67CJJr*   c                   t        j                  |t        d            }t        j                  | |t        j                         d      }t        j
                  |      }t        j                  |      r3|rt        j                  ||       |S t        j                  ||d       |S t        j                  | d      }|r9|j                  rt        j                  ||       t        j                  ||       n8t        j                  ||       |j                  rt        j                  ||       t        j                  |t        d      |       |S )ag  
    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.
    r  r   r   )r   r  r  r  r  r   r  r  rK  rE  r   rH  )rT  r8  newcontr  rb  newcontsr  carrs           r)   r  r  eO  s    !!'8J+?@H##C%,,.!DHH%D(#  84 K ""8Xq9 K ""3*""$$T84  x0  x0""$$T847HZ$8$?Kr*   c
           
     z   d}
d}d}d}d}d}d}d}d}d}t        |        |	dkD  rt        j                  |	      \  }}}|r7t        j                  d||d      }
t        j                  | |
|	||      }d}d}n|rt        j
                  |      \  }}|r5t        j                  ||dd      }
t        j                  | |
|      }d}d}n|rt        j                  d||d      }
nCt        |      }|j                  st        t        t               t        j                  d||d      }
|st        j                  | |
      }d}nt        j                  | |
|      }d}t        j                  |      }t!        t        j"                  t        j$                  |t'        d                        }t)        t        j"                  t        j$                  |t'        d                        }|st)        t+        | |            }t        j,                  |
      }t        j.                  |
      }||||t1        |      |	||d	g}|S )
z 
    Insert a font in a PDF
    Nr   r  r  r   r   r  r  )r   r   r  r"  r  r   r!  )rH  r   r  r  pdf_add_cjk_fontr	  pdf_add_simple_fontr  r"  r   r  r>  rF  r  pdf_add_cid_fontr   r  rt  r  r  r   r  rx
  r
  r   )rT  r  r@  rA  r  r2  r
  r
  r  r  rT  r  rz  ixrefrU  r"  r   r   r  extor  r  r9  r:  s                           r)   r?  r?  O  s1    D
CDEEF
E	D	DDS"}!44X>dE,,T4uaH))#tXueL
 44V<JD$00tQJD00dHEHDF 2243J(4~~.0@A44T3QG 11#t< 44S$IX&E 1 153E3EhPXYcPd3e fgDe//1C1CXxXaOb1cdeD !5c5!AB

 
 
&C

!
!$
'Cv,$ E Lr*   c                   t        | t        j                        r| S t        | t              rBt        j                  | j                  | j
                  | j                  | j                        } | S t        | t              rWt        j                  | j                  | j
                  | j                  | j                        }t        j                  |      }|S t        | t        j                        rt        j                  |       }|S | rt        |       rt        |       dk7  r#t        j                  t        j                        S g d}t        d      D ]_  }| |   ||<   ||   %t        j                  t        j                        c S ||   t        k  r	t        ||<   ||   t        kD  sWt        ||<   a t        j                   |d   |d   |d   |d         S )z>
    PySequence to mupdf.FzIrect. Default: infinite irect
    rG  r  r   r   r   r   )r>   r   r  r  r  r  r  r  r  rc  r%  r(  r  rF  r  r  fz_make_irect)r  rG   r  rZ  s       r)   r  r  O  sn    !U]]#!UMM144qttQTT2!Tll144qttQTT2mmC 
!U\\"mmA
$Q'?1+=+B}}U4455A1X #t!Q4<==!8!899Q4/!"AaDQ4/!"AaD# qtQqT1Q4166r*   c                   t        j                  |       }t        j                  |t        d            }t        j                  |      rt        j
                  |      S t        j                  |      }g }t        |      D ]p  }t        j                  ||      }t        j                  |      rt        j                  |d      }|j                  t        t        j
                  |                   r |S )z 
    ListBox retrieve value
    r  r   )r   r   r  r  r
  r   r  rF  r  r  rk   r   )r   r  rk  rE   r:  rZ  elems          r)   JM_listbox_valuer  O  s    
 ##U+IHSM:FF#''00 	V$AE AY K""FA.t$&&a0D')A)A4)HIJ	K
 Lr*   c           	     l   d}|dk  r|dz  }nZ|dk(  r||d   ddz  }nH|dk(  rJ |dk(  r||d   dd	|d   dd	|d   dd
z  }n!||d   dd	|d   dd	|d   dd	|d   ddz  }|dt        |       d	| dz  }t        j                  t        j                  |       t        j                  |       y )Nr\   r   z0 g r   r  z g r   r   r   z rg z k r-  r_  )r  r   r|  r   PDF_ENUM_NAME_DA)r   rh  rY  r   r   r  s         r)   r  r  P  s    
 Cax	#a&3	q	#a&1SVAJaAqz66#a&1SVAJaAqz3q6!*C@@Qx()8*C88C	""5#6#6u#=u?U?UWZ[r*   c                6    	 t        j                  | ||||      S r,   )4r  r   JM_make_spanlistr   r  rc  r  r  r  r  rU  r[  r\  r   rT  r   r  r  r  FZ_STEXT_SYNTHETICr  r  argbr]  r9  r^  r  r  dictkey_charsr"
  r   JM_py_from_pointdictkey_originrb  r  r  rk   r5   r  dictkey_flagsdictkey_bididictkey_char_flagsr  dictkey_fontr  r	  r  	dictkey_cr   r  r  dictkey_spans)	line_dictro   r  rK  r  	char_list	span_list	span_rect	line_rect
char_style	old_stylerZ  r  span_originr
  r  r  r  r9  r  	char_dicts                        r)   r  r  P  s    %%isD'JJr*   c                   | j                         }t        |      }t        j                  | j                        }	 |r5|t        j
                  t        j                  fv s|t        j                  k  r:t        j                  | t        j                  t        j                              }d}n|dk(  rM| j                         dk(  r:t        j                  | t        j                  t        j                        dd      }n2t        j                  t        j                  |j                              }t!        |      }| j#                         |t$        <   | j'                         |t(        <   ||t*        <   | j                         |t,        <   | j/                         |t0        <   | j3                         |t4        <   | j7                         |t8        <   t;        |      |t<        <   ||t>        <   y)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  rG  r  r   N) fz_compressed_image_typerZ  r   ll_fz_compressed_image_bufferr   rS  rd  rQ  fz_new_buffer_from_image_as_pngr  re  rE    fz_new_buffer_from_image_as_jpegr]  r}
  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r7   r  rh  )r  img_dictimg_typer  ll_cbufr  r  s          r)   r  r  P  sz    ++-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^H[#&557H  XXZH\ XXZH\GGIH[ [H\$H]r*   c                J   | j                         }t        ||       |j                         }|j                  rF|j	                  t        j                  t
        j                              }|j                         |d<   nd |d<   t        | j                               |t        <   y )Nr  )r  r  r  r   r  r   r  re  r:  rl  r  r  )r  r  r  r  rK  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    	 t        j                  | j                  |||j                  |j                        S r,   )r  r   JM_make_text_blockr   r   rc  r  r  r  r*  r  r5   r  r  r
  dictkey_wmoder  re  dictkey_dirrb  r  rk   dictkey_lines)
r  r  r  rK  r  	line_list
block_rectro   r  r  s
             r)   r  r  P  s/    ''(8(8*c4??\c\n\noor*   c                F    	 t        j                  | j                  ||      S r,   )r  r   r  r   r   r  rc  ra  fz_contains_rectr*  r  r   FZ_STEXT_BLOCK_IMAGEr  r  r5   r  r  rb  r  r  r  rk   dictkey_blocks)	r  r  r  text_buffer
block_listr  r  r  r  s	            r)   r  r  P  s    **2==)SIIr*   c           	     8   g d}t        | t        j                        r| S t        | t              rVt        j                  | j                  | j
                  | j                  | j                  | j                  | j                        S | rt        |       rt        |       dk7  rt        j                         S t        d      D ],  }t        | |      ||<   ||   t        j                         c S  t        j                  |d   |d   |d   |d   |d   |d         S )	N)r   r   r   r   r   r   r  r   r   r   r   rG  r   )r>   r   rm  rp  r!   r
  r  r  r[  r  r%  r(  rF  r  rc  )r{  r!   rZ  s      r)   r  r  Q  s    A!U^^$!V~~acc133QSS!##qss;;$Q'?1+=+B~~1X "Q"!Q4<<<>!" >>!A$!adAaD!A$!==r*   c           	        t        j                  t         j                  j                        }t        j                  t        j                  | t        d                  }t        j                  |      st        j                  |      rd|_        d|_	        d|_
        d|_        t        j                  t        j                  |j                  |j                        t        j                  |j                  |j                        t        j                  |j                  |j                        t        j                  |j                  |j                              }|j                  |j                  z
  dk  s|j                  |j                  z
  dk  r-t        j                  t         j                  j                        }|S )z&
    return a PDF page's MediaBox
    r  r   d    r   )r   rc  r\  r  r3  r  r  r  r  r  r  r  fz_minfz_max)rc  page_mediaboxra  s      r)   r  r  -Q  s2    LL!8!89M  **8Xj5IJH h'5+D+DX+NLLLLhkk2LLhkk2LLhkk2LLhkk2	M 	=+++a/-"2"22Q6U\\%<%<=r*   c
                   t         rt        j                  | |||||||||	
      S |}
d}t        j                  ||z
        dz   }||k  rO|}||k  rGt        | |||
||||	       |dz  }|dkD  r||z  dk(  rt        d| d| d       |dz  }|
dz  }
||k  rFyy|}||k\  rGt        | |||
||||	       |dz  }|dkD  r||z  dk(  rt        d| d| d       |dz  }|
dz  }
||k\  rFyy)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 rP  z pages.N)r  r   r  r   fz_absi
page_mergerr   )doc_desdoc_srcspageepageapagerS  rq  r  r  	graft_map	afterpagecounterr  r   s                 r)   r  r  JQ  sH   " ## 	 IGMM%%-(1,Eu}emwy&%QZ[qLGq W}%<%A)G9Dw?@AIDNI em emwy&%QZ[qLGq W}%<%A)G9Dw?@AIDNI emr*   c                P   t        j                  | j                         t        d            }|j                  s.t        j
                  | j                         t        d      d      }t        j                  |t        d            }t        j                  |t        d            }t        j                  |t        d            }t        j                  |t        d            }d}d}t        j                  |      rTt        j                  |      }	t        j                  |      rt        t        j                  |            D ]]  }
t        j                  t        j                  ||
            }|j                  d      s>t        j                  |dd       }||kD  s\|}_ n t        j
                  |t        d      |	      }|d	z  }t        |	      D ]x  }
t        j                  t        j                  ||
            }t        j                  |dd       |z   }d| }t        j                  ||
      }t        j                  |||       z t        j                  |      rt        t        j                  |            D ]]  }
t        j                  t        j                  ||
            }|j                  d
      s>t        j                  |d	d       }||kD  s\|}_ n t        j
                  |t        d      d      }|d	z  }t        t        j                  |            D ]x  }
t        j                  t        j                  ||
            }t        j                  |d	d       |z   }d
| }t        j                  ||
      }t        j                  |||       z ||fS )aW  
    Merge the /Resources object created by a text pdf device into the page.
    The device may have created multiple /ExtGState/Alp? and /Font/F? objects.
    These need to be renamed (renumbered) to not overwrite existing page
    objects from previous executions.
    Returns the next available numbers n, m for objects /Alp<n>, /F<m>.
    r/  r   r3  r)  r  Alpr   Nr   r  r   )r   r  r
  r  r   rL  ru  rv  rF  rt  rx  r3   fz_atoirw  r}  )r   temp_resr\  	main_extg
main_fonts	temp_extg
temp_fontsrl  	max_fontsrE   rZ  rp  r|  r   r  rT  s                   r)   rf  rf  Q  s    ""488:x/DEI++DHHJ8MqQ	""9h{.CDI##Ix/?@J ""8Xk-BCI##Hhv.>?JGI #y)Y'5--i89  '')?)?	1)MN~~e,MM#ab'*w;G  //	8K;PRSTI1q 	6A##U%;%;Y%JKCc!"g&0A9D(()Q7C	45	6 $u))*56 	A$$e&<&<j!&LMD??3'd12h'A9}		 ,,Y8H!L
NI5%%j12 3  %"8"8*a"HIMM$qr(#i/1#w$$Z3Jc23 Yr*   c                X    t         j                  |        t        rt        d|         yy)z!
    redirect MuPDF warnings
    zMuPDF warning: N)r  rk   JM_mupdf_show_warningsrr   rq   s    r)   JM_mupdf_warningr  Q  s)     ""4(/$() r*   c                Z    t         j                  |        t        rt        d|  d       y y )NzMuPDF error: r%   )r  rk   r  rr   rq   s    r)   JM_mupdf_errorr  Q  s)    ""4(-vR() r*   c                >    t        | t              sJ t        | |      S r,   )r>   r   JM_new_bbox_device_Device)r   r  s     r)   r  r  Q  s    b$$b*55r*   c           
     \   t        | t        j                        sJ t        j                  | j                  j
                        }t        j                  d      }| D ]  }|j                  j                  t        j                  k(  s+|D ]~  }|D ]X  }t        |t        ||            st        j                  |      s/t        j                  ||j                  j                         Z t        j                  |t        d              t        j                  |t        d              |S )z1
    make a buffer from an stext_page's text
    r  r%   )r>   r   r  rc  r   ra  r  r   r  r  r  r  fz_append_runer  r  r
  )r   r   r  r  ro   r
  s         r)   JM_new_buffer_from_stext_pager  Q  s     dE--...<<001D


c
"C 
1  E$=$== 5 ?B,T<b3IJ$)$=$=d$C ((bmmoo>? $$S#d)45   c$i0
1 Jr*   c                   |yt        |      }|yt        j                  |j                  d            }t        j                  | |t        j
                         d      }t        j                  | d      }t        j                  |t        d      t        j                  d             t        j                  |t        d      |       |S )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   rG  r	  r<  r=  )
r_  r   r  r  r  r  r^  rH  r  r+  )rT  r   rz  r  r
  	newactions         r)   JM_new_javascriptr	  Q  s     }D|

.
.t{{6/B
CC!!#sELLNA>F&&sA.I	y(3-1C1CL1QR	y(4.&9r*   c                    t        |       S r,   )JM_new_output_fileptr_Output)r
  s    r)   r  r  R  s    '--r*   c                X    | dk  r| dz  } | dk  r| dk\  r| dz  } | dk\  r| dz  dk7  ry| S )zB
    # return normalized /Rotate value:one of 0, 90, 180, 270
    r   r  r  r-   )rS  s    r)   r  r  R  sJ     1*# 1*
C-# C-{aMr*   c                    t        j                  d      }t        j                  |      }t        j                  || ||       |j	                          t        j
                  |       |S )Nr  )r   r  r  r  r  fz_terminate_buffer)r6  r	  r  r  r  s        r)   r
  r
  R  sS    


c
"C
..
C	T8U3	c"Jr*   c                .   | j                   s|S | }|j                   rt        j                  |      }||v s)t        j                  |t	        d            j                   r	 |S |j                  |       t        j                  |t	        d            }t        j                  |      rt        ||      }t        j                  |t	        d            }t        j                  |t	        d            }t        j                  |      s|}|j                   r|S )z
    Return list of outline xref numbers. Recursive function. Arguments:
    'obj' first OL item
    'xrefs' empty Python list
    r#  r6  Nextr  )r   r   r   r  r  rk   ru  r7  )r
  r:  thisobjnewxrefr<  r   s         r)   r7  r7  R  s     >>G


""G,eu117HV<LMXX L 	g""GXg->?e$$eU3E$$gx/?@##Whx.@A  '*G 

 Lr*   c                    d}t        j                  | j                         t         j                        }t        j                  |      }t        |      }|S )zE
    return a PDF page's /Rotate value: one of (0, 90, 180, 270)
    r   )r   r3  r
  rK  r  r  )r   rS  r
  s      r)   r  r  4R  sF     F

(
($((*e6P6P
QCc"Ff%FMr*   c                    t        j                  t        |d            }t        j                  |      }t        j                  t         j
                        }t        j                  | ||      }|S )zP
    create PDF object from given string (new in v1.14.0: MuPDF dropped it)
    r	  )r   r  r  rT  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r%  r  r(  r	   lexbufr  s         r)   r,  r,  @R  sX     225f3EFG!!'*F__U334F$$S&&9FMr*   c                x   t        | t        j                        sJ |t        j                         }|0t        |t        j                        sJ dt	        |      d|        t        j
                  |       }t        |      }t        |      }t        j                  ||      }t        j                  ||      }t        j                  |      }	t        |t        j                        sJ t        j                  ||	||      }
|rt        j                  |
       nt        j                  |
d       t        j                  |      sUt        j                   ||
|	      }t        j"                  | |t        j$                         |t        j&                                n~t        j(                  ||
      }t        j"                  | |t        j$                         t        j*                  t        j*                  j,                        t        j&                                t        j.                  |       t1        d|
      S )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	  r  )r>   r   r  r  r   r  r  r  r  r  r  r  r  r8  r9  r  r  r  rm  r  r  rc  rd  r  r  )r3  r  r  r  r  r  r   r  r	  r   r  r  s               r)   r  r  NR  s    eU00111|""$<:dE,?,?@Z[T$ZMQSTXSYBZZ@&&u-Ds#FD!E""4/D""40D%Er5--...

'
'E4
?Cc"((d3$$U+00eD!!%enn.>u~~GWX&&vs3!!%enn.>U\\MhMh@ikpkykyk{|	#5#r*   c                   t        | t        j                        r| S t        | t              r*t        j                  | j                  | j
                        S t        rt        j                  |       S t        j                  dd      }t        | d      }t        | d      }|||S t        |t              }t        |t              }t        |t              }t        |t              }t        j                  ||      S )zM
    PySequence to fz_point. Default: (FZ_MIN_INF_RECT, FZ_MIN_INF_RECT)
    r   r   )r>   r   r   r  r"  r#  r  r   r	  r  r  r  r  r  )r  rf  r"  r#  s       r)   r	  r	  {R  s     !U]]#!U}}QSS!##&&%%q))	q!	BaAaAyAI	Q AQ AQ AQ A==Ar*   c                N   t         rt        j                  | |      S t        | t        j
                        sJ t        |t        j                        sJ t	        j                  |j                  j                        }d}d}d}d}t        |      D ]a  \  }}|j                  j                  t        j                  k(  r0t        |      D ]  \  }	}
t        |
      D ]  \  }} |z  } |	z  }||z  }c |D ]  }|j                  j                  t        j                  k(  s+|D ]}  }
d}|
D ]R  }t        |
|      }t	        j                  |      st        ||      s1|j                  j                   }t#        | |       T |dk7  sb|dkD  sht	        j$                  | d         y)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  r>   r   r]  r  rc  r   ra  r  r   r  r  r  r  r  r  r  )r  r   r   r  n_blocksn_linesn_chars	n_blocks2r  n_lines2ro   n_chars2r
  chbboxs                 r)   r  r  R  s    00d;;c5>>***dE--...<<001DIHGG%t, 	5  E$=$=="+U"3 $$$-t$4 LHb8#$ xGI  6  E$=$== 6	 7B)$3F11$7/f= %'MMOO	&sI67 ?y1}**3566r*   c                   t        j                  | |      }t        j                  |       }|sH||j                  st        j                  | |       y|j                  rt        j                  ||       y|j                  r|j                  st        |      }nt        t        j                  ||            }||k7  rIt        ||      }|j                  st        j                  | ||       yt        j                  | |||       yy)a   
    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   r;  r)  r	  rH  r  )r  key1key2r   key1_objrT  ro
  r  s           r)   JM_put_scriptr'  R  s     !!)T2H

&
&y
1C <ty$/ 	   x. ??("5"5x(u11(DAB %c51	y$	:	9dDA r*   c                ^    | j                   | j                  | j                  | j                  fS r,   rH  r  s    r)   rS  rS  R  !    44qttQTT!!r*   c                    | j                   | j                  | j                  | j                  | j                  | j
                  fS r,   r  )r{  s    r)   rl  rl  R  s-    33QSS!##qssACC''r*   c                2    | j                   | j                  fS r,   r  )r  s    r)   r  r  R  s    338Or*   c                ^   | j                   j                  | j                   j                  f| j                  j                  | j                  j                  f| j                  j                  | j                  j                  f| j
                  j                  | j
                  j                  ffS )z"
    PySequence from fz_quad.
    )r  r"  r#  r&  r$  r%  )r<  s    r)   r^  r^  R  sn    
 TTVVQTTVVTTVVQTTVVTTVVQTTVVTTVVQTTVV	 r*   c                ^    | j                   | j                  | j                  | j                  fS r,   rH  r  s    r)   rb  rb  R  r)  r*   c           
     8   t        | t        j                        r| S t        | d      r8t	        |       dk(  r*t        | d   d      rt        j
                  t        |        } t        | t        j
                        rt        j                  |       S t        | t              rt        j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        S t        j                  dddddddd      }g d}| r$t        | t        t         f      rt	        |       dk7  r|S t#        | d      t        j                  t%        |             S t'        d      D ]  }|t	        |       k\  r|c S | |   }t)        |      rt+        |      dk7  r|c S t#        |d      ||   _        t#        |d      ||   _        ||   j                  ||   j                  |c S t-        ||   j                  t.              ||   _        t-        ||   j                  t.              ||   _        t1        ||   j                  t2              ||   _        t1        ||   j                  t2              ||   _         |d   |_
        |d   |_        |d   |_        |d   |_        |S )	Nr]  rG  r   rf  r  r   r   r   )r>   r   r  r;   r7   rc  r   r\  r  fz_make_quadr  r"  r#  r&  r$  r%  r   r  r  rF  r%  r(  r  r  r  r  )r  r<  r  rZ  r
  s        r)   r8  r8  R  sa   !U\\"q- SVq[WQqT;5OLL%(#1ell#&&**1d!!	 	 	1aAq!Q2AAJq5$-0CFaKQ"&&q'9::1X /A;Hd$(<(AHsA&!sA&!Q466>QqTVV^Hadffo.!adffo.!adffo.!adffo.!/ Q4ADQ4ADQ4ADQ4ADHr*   c                   t        | t        j                        sJ t        |               t        j                  | t        j
                        }t        j                  |      rt        j                  d      }t        t        j                  |            D ]t  }|dkD  rt        j                  |d       t        j                  ||      }t        j                  |      sJt        j                  |      }t        j                  ||       v |S |j                  rt        j                  |      }|S t        j                  d      }|S )zK
    Read and concatenate a PDF page's /Contents object(s) in a buffer
    r3  r   r  )r>   r   r  r   r  rr  r  r]  rF  r  r  r  r  r  fz_append_bufferr   )r8  rb  r  rZ  r
  r  s         r)   r  r  'S  s    gu||,@g@,!!'5+G+GHH(#nnT"u**845 	2A1u$$S"-%%h2C""3',,S1&&sD1	2 J	 
		##H- J nnQJr*   c                   t        | t        j                        r| S t        | t        j                        rt        j                  |       S t        | t              r@t        j
                  | j                  | j                  | j                  | j                        S t        | t              r@t        j
                  | j                  | j                  | j                  | j                        S | rt        |       rt        |       dk7  r-t        j                  t        j                  j                        S g d}t        d      D ]p  }t        | |      ||<   ||   /t        j                  t        j                  j                        c S ||   t         k  r	t         ||<   ||   t"        kD  sht"        ||<   r t        j
                  |d   |d   |d   |d         S )NrG  r  r   r   r   r   )r>   r   rc  r  r  r  r  r  r  r  r  r%  r(  rd  rF  r  r  r  )r  r  rZ  s      r)   r  r  =S  s`   !U\\"!U]]#||A!T!!!$$addADD99!U!!!$$addADD99$Q'?1+=+B||ELL7788A1X #Q"!Q4<<< ; ;<<Q4/!"AaDQ4/!"AaD# adAaD!A$!55r*   c                    	 | j                   |j                  k\  sK| j                  |j                  k\  s2| j                  |j                   k  s| j                  |j                  k  ryyr  r{  r  s     r)   r  r  TS  sG    	ttqtt|ttqtt|ttqtt|ttqtt|r*   c                
   | | j                   syt        j                  | j                         t	        d            }|j                   r| j                         }t        j                  || j                               }t        j                         }t        j                         }t        j                  | ||       t        j                  || |||      }t        j                  |j                         | j                   _        yy)z<
    refreshes the link and annotation tables of a page
    Nr  )r   r   r  r
  r  r%  r  rc  rm  r  pdf_load_link_annotsll_fz_keep_linkrq  )r   r
  rT  rB  r  r$  r  s          r)   r	  r	  _S  s     |4??


dhhj(8*<
=C
~~hhj--sDHHJ?>>#  $x@))3c68L % 5 5t G r*   c                   | j                   st        j                         S t        |       }|dk(  rt        j                         S t	        | j                               }|j                  }|j                  }|dk(  rt        j                  dddd|d      }|S |dk(  rt        j                  dddd||      }|S t        j                  ddddd|      }|S )z*
    calculate page rotation matrices
    r   r  r   r  rc  )	r   r   rm  r  r  r
  r"  r#  r2  )r   rL  cb_sizer   r  r{  s         r)   r  r  pS  s     ??~~%H1}~~dhhj)G		A		A2~  Ar1a3 H 
S  Q2q!4 H   B1a3Hr*   c                D    	 t        j                  | j                  |      S r,   )r  r   r  r   r   rc  ra  r7   r	  hfuzzvfuzzr  fz_string_from_bufferfind_stringr   r  r  r  r  on_highlight_char)r   r   r   r	  Hitshitsr(  haystack_stringhaystackbeginr  insiderZ  r  ro   r
  r  s                    r)   r  r  S  s    ))$//6BBr*   c           	        t        j                  |      rt        j                  d       y	 t        j                  |t         j                        }|dk(  r3t        j                  |t         j
                        }t        | |||       n?|dk(  rt        | |||       n+|dk(  rt        | |||       n	 t        j                  |       yt        j                  |      }t        |      D ]  }	t        j                  ||	      }
t        j                  |
      rt        j                  |
      }nd}t        j                  |
t         j                        }|j                   sw|}||vr"|j#                  |       t%        | |||||       t        j                  d        t        j                  |       y 	 t        j                  |       y# t        j                  |       w xY w)zP
    Step through /Resources, looking up image, xobject or font information
    z.Circular dependencies! Consider page cleaning.Nr   r   r   r   )r   pdf_mark_objr  r  PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_Fontr  r  r  pdf_unmark_objrv  rF  rw  r  r   r4  r   rk   r5  )rT  r9  r:  r6  r  r;  xobjrT  rE   rZ  r
  sxrefsubrsrcsxref_ts                 r)   r5  r5  S  s    $FG#!!$(C(CD19%%dE,D,DEDCuk:QYS${;QYCuk:( 	T"# t$q 	A((q1C""3'((-((e.K.KLG!!&(MM'*%sGUD%PMM"RST"!	  	T"T"s   BG BG >G 3G G"c                   |syt        |t        t        f      sJ t        |      }|dk(  ryt	        j
                  |       }t	        j                  |      }t	        j                  ||      }t        |      D ]  }||   }|}t        |t              rt	        j                  ||       1t        |t        t        f      rt        |      dk(  sJ d       |\  }	}
|	r|
sJ d       t	        j                  |d      }t	        j                  ||	       t	        j                  ||
        t	        j                  |t        d      |       y)z'
    set ListBox / ComboBox values
    Nr   r   zbad choice field listri  )r>   r   r   r7   r   r   r  rE  rF  r  pdf_array_push_text_stringpdf_array_push_arrayrH  r  )r   r:  rE   r  rT  rk  rZ  r  optopt1opt2	optarrsubs               r)   JM_set_choice_optionsrU  S  s%    uudm,,,UAAv##U+I

&
&	
2C  #q)F1X ?Ahc3,,fc:sUDM2sCyA~^G^^EJD$D9"99=22FA>I,,i>,,i>? 
	8E?F;r*   c                   d}d}d}|t         j                  k(  rt        d      }t         j                  }n|t         j                  k(  r,t        d      }t         j                  }t         j
                  }n|t         j                  k(  r-t        d      }t         j                  t         j
                  z  }n|t         j                  k(  rt        d      }n||t         j                  k(  rt        d      }t         j                  }nM|t         j                  k(  rt        d      }t         j                  }n|t         j                  k(  rt        d      }|,|j                  r t        j                  |t        d      |       |dk7  s|dk7  rKt        j                  |t        d            }|| z  }||z  }t        j                  |t        d      |       yy)	z
    Set the field type
    r   NBtnTxChSigr  r  )r   r  r  PDF_BTN_FIELD_IS_PUSHBUTTONr  PDF_BTN_FIELD_IS_RADIOr  r  r  PDF_CH_FIELD_IS_COMBOr  r  r   rH  rL  rC  )r%  r
  r   setbits	clearbitstypenamer
  s          r)   r  r  T  sx    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                x   d}t        j                  |       }|j                  d      }t        |      }|dz
  }||   }||= t        |      }t        j                  | |      }	|	j
                  sw|dkD  rrdj                  |      }
t        j                  t        j                  | t        |
                  rt        dt        |       d      ||dz
  = t        |      }|dkD  rrt        j                  | |t        j                  |             t        j                  | |      }	t        j                  |	      st        d| d      t        j                  |	      }||k7  rt        d| d      t        | dd      }t        |      }d| d	| d
}d| d| }|j!                  ||d      }t#        ||      }|S )z*
    Set a PDF dict key to some value
    zfitz: replace me!r-  r   r   z	path to 'z' has indirectszcannot insert value for 'r   r  r  r   )r   r  r6   r7   r  r   r  r  r_  rg   pdf_dict_putpr~  r
  r   r
  r"
  r  r,  )r
  r  r   
eyecatcherrT  r3  r  rZ  skeytestkeyrA  r}  r  objstrnullvalnewvalnewstrr  s                     r)   r&
  r&
  <T  s    %J

&
&s
+CIIcNEu:DqA8Dau:D!!#s+G QhA$$U%8%8l1o%NO)L,>+? OPPdQhu:D Qh 
S%";";J"GH!!#s+Gw'3C5:;;##G,Dz3C5:;;
c1a
(C#C(F $qA&GawF^^GVQ/F "#v.GNr*   c                0   |r t        j                  | t        d      |       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |t        j                  | t        d             |rct        j                  | t        d      d      }t        |      }t        |      D ])  }||   }	t        j                  |d      }
t        |
|	       + y y y )NrH  r  r   r  r6  r  )	r   rO  r  r;  r  JM_set_ocg_arrays_impr7   rF  rP  )r7  r0	  r  r1	  r2	  r  rH  rE   rZ  item0r
  s              r)   r/	  r/	  lT  s[   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 3 00#q9%sE23  r*   c                    t        j                  |       }|D ]/  }t        j                  ||d      }t        j                  | |       1 y)z
    Set OCG arrays from dict of Python lists
    Works with dict like {"basestate":name, "on":list, "off":list, "rbg":list}
    r   N)r   r  r  r  )rH  r3  rT  r  r
  s        r)   rk  rk  T  sG    
 
&
&s
+C '$$S$2S#&'r*   c                   t        j                  |       }t        j                  ||d      }|j                  st	        t
        t               t        j                  | t        d            }|j                  s t        j                  | t        d      d      }t        j                  |t        d            }|j                  s t        j                  |t        d      d      }t        j                  |t        j                  |      |       y)z
    Insert an item into Resources/Properties (used for Marked Content)
    Arguments:
    (1) e.g. page object, Form XObject
    (2) marked content name
    (3) xref of the referenced object (insert as indirect reference)
    r   r/  r   r
  N)r   r  r  r   r  r  rF  r  r  rL  rH  r+  )r  r   r  rT  rL  r\  r  s          r)   r  r  T  s     
&
&s
+C

 
 dA
.C>>./""3(=>I++C+1FJ	##Ix/EFJ  ,,Y8NPQR
	z5#5#5d#;SAr*   c                   t        | t              r| j                  } t        | t        j                        sJ dt        |       dt
               t        |       }|j                  sJ d       t        j                  |       }|j                         }fd} |d      }|} |d      }t        |      }t        |      }	t        j                  ||	      }t        j                  | |        |d      }|rot        |      rdt        |      }
t        j                   ||
      }d}t#        |
      D ]  }||   }t        j$                  ||        t        j&                  ||        |d	      }|rt        |      rtt        |      }
t        j                   ||
      }t#        |
      D ]  }t        j(                  |||           t        j*                  ||t-        d
      t-        d              |d      }|rt        |      rxt        |      }
t        j                   ||
      }d}t#        |
      D ]  }||   }t        j$                  ||        t        j*                  ||t-        d      t-        d              |d      }|+t/        |      }t        j0                  |t-        d      |        |d      }|Et/        |      }t        j2                  |      }||k7  r t        j0                  |t-        d      |       |t        j4                  k(  r, |d      }|}|r t        j6                  |t-        d      |        |d      }|}t        j8                  ||       |t        j:                  t        j<                  fv r |d      }t?        | |        |d      }tA        |      }t        j*                  ||t-        d
      t-        d              |d      }|}t        j*                  |t        jB                  |      t-        d
      t-        d              |d      }t/        |      }t        j0                  |t-        d      |       t        jD                  |t-        d             t        jD                  |t-        d              |d       }||t        j<                  k(  r|t        jF                  z  }nM|t        jH                  k(  r|t        jJ                  z  }n&|t        jL                  k(  r|t        jN                  z  }t        j6                  |t-        d!      |        |d"      }t/        |      }|rt        jP                  ||        |d#      }tS        |t-        d$      t        jT                         |        |d%      }tS        |t-        d&      t-        d'      |        |d(      }tS        |t-        d&      t-        d)      |        |d*      }tS        |t-        d&      t-        d+      |        |d,      }tS        |t-        d&      t-        d-      |        |d.      }tS        |t-        d&      t        jV                  d/      |        |d0      }tS        |t-        d&      t        jV                  d1      |        |d2      }t/        |      }|t        jH                  k(  r|s:t        jX                  ||d3d4       t        jZ                  |t-        d5      d3       nt        j\                  |      }|j                  rOt        j^                  |      }t        jX                  |||d4       t        jZ                  |t-        d5      |       n]|rZt        jZ                  |t-        d5      |       n8|t        j`                  k(  rt        j\                  |      }|j_                         }|d6|fv s|d7k(  rYt        jX                  |||d4       t        jZ                  |t-        d5      |       t        jZ                  |t-        d+      |       nt        jZ                  |t-        d5      d3       t        jZ                  |t-        d+      d3       n[|rYt        jX                  |||d4       |t        j<                  t        j:                  fv rt        jD                  |t-        d8             t        jb                  |        t        jd                  | d4       t        jf                  | d4       t        jh                  |        y)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        | d       S r,   )r   )r   r6  s    r)   GETATTRz)JM_set_widget_properties.<locals>.GETATTRT  s    vtT**r*   r  r   rR  r   r  r%  r  r  r  r  r  Nr  r  r  r  MaxLenr  r  r  r	  r  r	  r  r7  r  r  r  r  r  ro
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  TYesr'  )5r>   r   r   r   r   r   r   r   r   r%  r  r  r  r  r%  r7   rE  rF  rG  pdf_field_set_fill_colorr4  r  r  r_  r|  r#  r  rC  pdf_field_set_displayr  r  rU  r6  r5  r;  r]  r  r\  r  r[  pdf_field_set_button_captionr'  r  r+  pdf_set_field_valuerO  pdf_button_field_on_statert  r  rI  pdf_set_annot_hotpdf_set_annot_activerJ  )r   r6  r   r  rT  rq  r   r  r   rot_matrE   fill_colrY  rZ  r[  
border_colrw  r   old_namer  r  r  r  r  r  r1  r   onstater  s    `                           r)   JM_set_widget_propertiesr  T  s   
 5% 

uenn-H,$u+w/HH-5!D??:::?##E*I
((*C+ L!EJ FOE5!D#D)G""41D	UD) L!E!%(J&&sA.q 	5A(C%%h4	5 	&&y(; O$E!%(J$$S!,q 	7A$$VU1X6	7Ivx~x}M N#E!%(J((a0
q 	7A(C%%j#6	7 	Iz8D>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(eU+ 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%%c9eQ?##Ix~uE 55i@G!!&&w/))#y"a@''	8D>2F''	8D>4H	u55	511)<  "T2J$%-%%c9b!<##Ix~rB##Ix}bA##YF##YuE%%c9dA>e<<e>[>[\\""9hsm<	% 	E1%	ua(	5!r*   c                   d}|t        |      k  rt        j                  ||d        \  }	}
||	z  }t        j                  ||
      }|dk(  rt        j                  ||
d|      \  }}n|}t        j
                  | ||||
||||	       t        j                  |||      }|dk(  rt        j                  ||d      }nt        j                  |d|       }|t        |      k  r|S r   )r7   r   fz_chartoruner
  r
  fz_show_glyphr  fz_pre_translate)r   	user_fontr6  rn  r
  
bidi_levelr7  r'  rZ  r  r
  r
  rT  r  s                 r)   r4  r4  lU  s     	
A
c!f*$$QqrU+3	Q**9c:!8??	3PQS[\ICDD$S#uj*V^_$$T36A:((c15C((a#6C c!f* Jr*   c                    t        j                  |       }|j                  d      }|j                  t	        d            }|dk\  r|d | }|S )Nr  r  r   )r   r~
  r  r   r	  )rK  
buff_bytesr  r   s       r)   r  r  U  sN    --d3J


9

-CQAAv"1gJr*   c                     t        d|         y)z
    Generate a warning.
    z	warning: Nr|  rq   s    r)   r   r   U  s     ivr*   c                   |rt        j                  |      \  }}|dkD  rt        |      }t        |t         j                        sJ |j
                  rit        j                  |      \  }}||k  rLt        j                  |t         j                  t         j                         t        j                  | ||d       yt        j                  | ||d       y)zD
    update a stream object
    compress stream when beneficial
       r   Nr   )
r   r  r  r>   r]  r   rH  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecodepdf_update_stream)r%  r
  r(  r	  r  r  buffer_compressedlength_compresseds           r)   r$  r$  U  s    
 ++G4	B; 27 ;/@@@ ++','>'>?P'Q$!1$v-&&!66!;;
 ++C6GK	Cgq1r*   c                   t        |t        j                        sJ dt        |             |dkD  rt        j                  | |d      }|S t        |j                        }|j                         }t        j                  t        j                  |t        d                  }t        j                  |t        d            }|j                  rt        j                  ||      }	nt        j                  | |      }	t        |      }
t        j                  | |t        j                          t        j"                  d      |
      }t%        | ||
d       t        j&                  |t        d      |	       |S )zl
    Make an XObject from a PDF page
    For a positive xref assume that its object can be used instead
    ztype(gmap)=r   r  r/  r   )r>   r   PdfGraftMapr   r  r   r   r
  r  r3  r  r   r  pdf_graft_objectr  r  rm  r  r$  rH  )r  fsrcpager  r  r  srcpagespagerefra  r  r\  r  s              r)   r  r  U  s/   
 dE--.@;4:-0@@.ax&&vtQ72 L/ x}}-;;=$$U%C%CHhWaNb%cd**8Xk5JK??55dA>I..vq9I x(
 %%fh8H%,,WX/[^_Q/ 	5(;"7CLr*   c                .    t        | t        t        f      S r,   )r>   r   r   r  s    r)   r%  r%  U  s    a%''r*   c                    t        |       S r,   )r7   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'r[  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                    t        |       r,   )rg   )r   excs     r)   r  r  U  s     S/r*   c                    | syt        | t              r| j                  d|      }nt        | t              r| d d  }j	                  d|      }|S )Nr\   r	  r  raw_unicode_escape)r>   r  r  r  r  )rn  r  r   rG   s       r)   r  r  V  sO    !SXXfVX,	Au	qT
))()
8CJr*   c                    | rLt        |       t        t        fvs)t        |       dvst	        |       dk  st        |       dkD  rt        d      y y )Nrg  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   r   r   r7   r  r  r   r  s    r)   rl  rl  V  sM    GD%=(1vY&1vz1vzNOO  	r*   c                F    | j                         D ]  }|d   |k(  s|c S  y)zGReturn an entry in the page's font list if reference name matches.
    rG  N)r  )r   r   r  s      r)   rQ  rQ  V  s+     ^^ Q48Hr*   c                >    | j                   D ]  }||d   k(  s|c S  y)z3Return a font info if present in the document.
    r   N)r  )r%  r  r  s      r)   r1  r1  "V  s'     ]] 1Q4<Hr*   c                    t        |       rt        |       }|j                  fS t        |       r| fS | D ]$  }t        |      rt        |      rt	        d       | S )Nzbad quads entry)r  r  r	  r  r   )r	  r  r<  s      r)   r  r  *V  s]    Kyx 0!	!.//0 Lr*   c                2   t        |       syt        |       t        t        fv rt	        |       dk(  st        d      t	        | d         dk(  rt	        | d         dk(  st        d      | d   d   | d   d	   cxk(  rdk(  st        d
       t        d
      y)NFr   z$morph must be a sequence of length 2r   r   r  zinvalid morph param 0rG  r   zinvalid morph param 1T)r   r   r   r   r7   r   r  s    r)   r  r  6V  s    7Ge}$Q1?@@!INs1Q4yA~011Q47ad1g""011 #011r*   c                     y r,   )r;   r   r   r   r  s    r)   ra  ra  BV  s    
r*   c                v    	 t        |       }|j                  S # t        $ r t        dkD  r
t                Y yw xY w)zkCheck whether an object is convex, not empty  quad-like.

    It must be a sequence of 4 number pairs.
    r   F)r  rg   r  rv   r  )r<  q0s     r)   r  r  HV  s=    
!W <<  !#(8s    88c                    	 t        |       } | j                  xs | j
                   S # t        $ r t        dkD  r
t                Y yw xY w)zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    r   F)r  rg   r  rv   r  r  r  s    r)   r  r  UV  sI    
G 

+amm,,  !#(8s   ( AAc                L   | syt        | d      r| f} t        |        t        |       dk(  r t        | d         dz   }|dk(  r|dz   S |dz   S t        |       d	k(  r&t        t	        |             dz   }|dk(  r|d
z   S |dz   S t        t	        |             dz   }|dk(  r|dz   S |dz   S )Nr\   rf  r   r   r   r  zG zg r   zRG zrg zK zk )r;   rl  r7   r   r   )r  r  rn  s      r)   r  r  bV  s    q+DqM
1v{adOc!8q4x1T1
1v{eAh#%Hq5y3!e)3%(c!ACx1t8-QX-r*   c                   | j                         t              fd}	 dk7  r.t        j                  j	                         t        d      d       t        j                  |      }|D ]#  }t        |      }t        j                  ||       % t        j                  |       t        |d        |        t        |      S # t        $ r t        r
t                 |        Y y w xY w)Nc                 n    dk7  r/t        j                   j                         t        d             y y )Nr   r.  )r   rC  r
  r  )r  rL  s   r)   r  z$Page__add_text_marker.<locals>.finalwV  s,    q=""7;;=(82DhO r*   r   r.  r  )r
  r  r   rC  r
  r  r  r8  pdf_add_annot_quad_pointrJ  r  rg   r  rv   r   )	r(   r	  r  r  r   rC   r<  r  rL  s	          @@r)   r[  r[  tV  s    nnG(HPq=""7;;=(82DaH&&w
; 	5D%A**5!4	5 	u%s#
 <	  N$4s   BC	 	 C,+C,c                P    t        | t              sJ t        t        d|        }|S )Nr  )r>   r  r   r   )r"  rG   s     r)   r  r  V  s,    a
%>!-
.C Jr*   c                    |d   }d}t        | j                        D ]  \  }}|d   |k(  sd} n |r|| j                  <   y | j                  j                  |       y )Nr   FT)r  r  rk   )r%  r  r  r  rZ  fis         r)   r5  r5  V  sd    7DE3==) 2a5D=E aT"r*   c                    d}t        t        |            D ]D  }||   }|t        |       k\  rt        |t              rd|v r+ y|t        | |   |      s y|dz  }F |t        |       k7  ryy)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)rF  r7   r>   r   )r  r3  r|  rZ  rU  s        r)   r  r  V  s}     	
A3u: 
aD	>%'DEMZQ%?	Q
 	CI~r*   c                p   t        |      }t        j                  |      }|j                  |j                  z
  }|j
                  |j                  z
  }|}	|}
|rt        | |      }| |z  }||z  }ndx}}t        ||      }|dk7  r|dk7  r|}|}|}|dk  r||z  ||z  kD  r||z  }	|}
n,|}	||z  }
n$||k7  r||z  ||z  kD  r||z  }	|}
n|}	||z  }
n|}	|}
t        j                  |j                  |j                  z   dz  |j                  |j
                  z   dz        }t        j                  dddddd      }t        j                  ||      }t        j                  |t        j                  |	|
            }t        j                  |t        j                  |j                  |j                              }|S )z*
    # compute image insertion matrix
    r   r   rc  r   g      )r  r   	fz_rotater  r  r  r  r  r  r  r2  r  fz_scalefz_translater"  r#  )rY  r  r  rS  r
  rJ  rO  trwtrhr   r  larger  r  smallr  r  rq  s                     r)   r  r  V  s    BE
//&
!C
((UXX
C
((UXX
CAAE6"U]e^RBKE{v}	Av8cBheAAAeA	r8cBheAAAeA


XX A%XX A%C 

q!Q4
6C
//#s
#C
//#u~~a3
4C
//#u11#%%?
@CJr*   c                   | j                   j                  dk(  r| j                   j                  j                  dk(  r| j                   j                  j                  dk(  re|j                   j
                  j                  | j                   j                  j
                  j                  |j                   j                  dz  z
  k  S y)Nr   r   皙?)r   r
  re  r"  r#  r  
first_charr  )ro   r
  s     r)   rP  rP  V  s    !doo&9&9&;&;q&@T__EXEXEZEZ^_E_}}##%%(B(B(I(I(K(KbmmN`N`cfNf(fffr*   c           	         |  dt        |        dt        t        |              d}t        |       D ]  }|d| dz  } |S )Nr    (z):
r  r%   )r   r7   re  )r"  rG   rZ  s      r)   dir_strr  V  sP    Cqa	CAK=
-CV aS|Jr*   c           	     h   | j                  d      r| j                  d      r| S t        |       sy|r|;dj                  | D cg c]  }t	        |      dk  rt	        |      dnd! c}      }n@dj                  | D cg c]%  }t	        |      dk  r|t	        |         d   dnd' c}      }d|z   dz   S |dk  r1dj                  | D cg c]  }|t	        |         d   d	 c}      }n*dj                  | D cg c]  }t	        |      d	 c}      }d|z   dz   S c c}w c c}w c c}w c c}w )
a   Return a PDF string enclosed in [] brackets, suitable for the PDF TJ
    operator.

    Notes:
        The input string is converted to either 2 or 4 hex digits per character.
    Args:
        simple: no glyphs: 2-chars, use char codes as the glyph
                glyphs: 2-chars, use glyphs instead of char codes (Symbol,
                ZapfDingbats)
        not simple: ordering < 0: 4-chars, use glyphs not char codes
                    ordering >=0: a CJK font! 4 chars, use char codes as glyphs
    z[<z>]z[<>]r\   r  02xb7r   r	  )r3   r  r   r  r
  )r   r0  r"  r  r  otxts         r)   r  r  V  s.    tt!4:>77tT!s1v|s1vclETUD77OST!s1v|F3q6N1%c*ETD d{T!! !|wwDAq6#a&>!,S12ABww6A3q6#,67$; U U B6s   $D ?*D%D*=D/c                >   t        |       syd }d}| D ]  }t        |      }|dkD  r
 ||       c S |dkD  r|dk  r|dv r|dz  }||z  }6|dkD  r
|d|d	z  }E|d
k(  r|dz  }P|dk(  r|dz  }[|dk(  r|dz  }f|dk(  r|dz  }q|dk(  r|dz  }||dz  } d|z   dz   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    t        ddg      t        | d      z   }d|j                         z   dz   S )Nr  r	  zUTF-16BE<r  )rZ  hex)rn  r  s     r)   make_utf16bez!get_pdf_str.<locals>.make_utf16be/W  s1    sCj!Ia$<<QUUW}s""r*   r\   r	     r?  )r  r  rc
  rc
  03or   z\br  z\tr  r	  r  z\fr  z\rz\267r  r  )r   r
  )rn  r  r  r  r  s        r)   rW  rW  "W  s     7# 	A V8?"7rCx$$T	FA82bXA 7JA1WJA2XJA2XJA2XJALA7: 7S=r*   c                L   | r| S t        j                  d      } | r| S ddl}|j                  ddddd      }|j                  dk(  r5t        j                  d|j                        }|r|j                  d      } | S t        j                  d	k(  r|j                  d
dddd      }|j                  j                         }|j                  s|st        d      t         j                  j                  |      }t         j                  j                  |d      } t         j                  j!                  |       r| S t        d      t#               }dD ]  }|j                  d| dddd      }|j                  dk(  s,|j                  j                         j%                         }t'        |      dk(  sc|d   }| d}|j)                  |       t+        j*                  |      }	|	j-                          |	s|	d   c S  |rd}
|D ]
  }|
d| z  }
 t        |
      t        d      )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_outputrz  r   z%List of available languages in "(.+)"win32zwhere tesseractz4No tessdata specified and Tesseract is not installedrj  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:
r  )rd   r   
subprocessr  
returncoderr  r  stdoutrs  rH
  platformr  r   r
   dirnamer  r  r   r6   r7   rk   globr  )rj  r  cpr{  r  r  attemptsr
   pattern	tessdatasr   attempts               r)   rd  rd  WW  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.	 $R=() : 	%Gd7)$$D	%4  QRRr*   )CSSrZ  r   c                  d}t        |      t        urt        d      |d}t        j	                         D cg c]  }|j                  |       s| }}|g k(  rt        d|  d      t        |      dkD  rt        d      || }|D ]I  }t        |   }|d   }	|d	   }
 |d
          }|j                  ||       |	rdnd}|
rdnd}||||||fz  z  }K |S c c}w )a  Create @font-face items for the given fontcode of pymupdf-fonts.

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

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

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

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

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

    Args:
        fontcode: (str) font code for naming the font variants to include.
                  E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
                  A maximum of 4 font variants is accepted.
        CSS: (str) CSS string to add @font-face definitions to.
        archive: (Archive, mandatory) where to place the font buffers.
        name: (str) use this as family-name instead of 'fontcode'.
    Returns:
        Modified CSS, with appended @font-face statements for each font variant
        of fontcode.
        Fontbuffers associated with "fontcode" will be added to 'archive'.
    z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an Archiver\   zNo font code 'z' found in pymupdf-fonts.rG  zfontcode too shortrI  r]  r  zfont-weight: bold;zfont-style: italic;)r   r6  r   rj
  r  r3   r7   r:  )fontcoder  rZ  r   CSSFONTr  	font_keysfkeyrT  rI  r]  fbuff	bold_textitalic_texts                 r)   css_for_pymupdf_fontr  W  s   R DG=G#788
{ 1557Rq1<<;QRIRB>(3LMNN
9~-..| >#D)F|hX E4 ,0(b	/5+2w$i===> J# Ss   CCc           	        |j                         }t        j                  |d      }d}|dk(  rt        }|dk(  rt        }|Ct        | D cg c])  }t        |      dk  r|t        |         d   n|d   d   + c}      }||z  S |t        j                         v rt        | t        |   ||      S |dv rt        |       |z  S t        d| d	      c c}w )
a  Calculate 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   r  )re
  rg
  rf
  rN  ri
  rO  rh
  rP  zFont 'z' is unsupported)r  rm
  r8   r4  r3  r   r
  r  util_measure_stringr7   r   )r   r   r   r  r  r0  r  r   s           r)   r9  r9  W  s     ~~H""8T2HF8>!PTU1c!fslA"sAFUV8|?''))"/(+Xx
 	
  	 	 4y8##
vhZ'78
99) Vs   
.Cc                   t        |       t        j                  u r| j                         }nBt	        | d      r| j                         }n%t        |       t        t        fv r| }nt        d      t        j                  |      S )aG   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.
    ro  zbad argument 'img')r   r9   r[  rs  r;   ro  r  rZ  r   r  image_profile)r  r	   s     r)   r  r  X  sg     CyBJJ	f		cui(	(-..v&&r*   c                    t         j                  t              sJ t         j                        s j                  rS j                  J  t         j                   j                         j                        }|st        d       d _        y fd}t         j                  t              sJ t         j                        }|dk(  r |       S  j                  t           }|dk7  r |       S  j                  |dz
     }|t           }|dk7  r |       S |t           } j                  t           }||k7  r |       S 	  j                  j                         D ]  \  }	}
|	|vs|
||	<    d}|dk(  r$d	|t        <    j                  j                          yt        d
        |        y# t        $ r t        r
t                d}Y Yw xY w)aq  
    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                      j                   j                   j                  j                                 j                  j	                          y r,   )r  rk   pathdictrP  rk  )r  s   r)   rk   zjm_append_merge.<locals>.append=X  s0    s||((*+r*   rn  r   r  r  r  z$could not merge stroke and fill path)r>   r  r   r  r  r   r  rr   r7   r  dictkey_itemsrB   rg   r  rv   rk  )r  resprk   r  thistyper  prevtype	previtems	thisitemsr  rF   r   s   `           r)   jm_append_merger  "X  s    cggt$$$ 

szz::1 07377CJJ/=DHI cggt$$$sww<Dqyx||\*H3x77DFD\"H3xm$Im,IIxLL&&( 	DAq}Q	 
 
Qw"l67  N$4s   $F- (	F- -G
Gc                    | j                   s'| j                  j                  |t        |      f       y | j                  j                  |t        |      | j                  f       y r,   )r  r  rk   rb  
layer_name)r  r  r   r  s       r)   jm_bbox_add_rectr  iX  sG    ::

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

D/$"7HIr*   c                    t        j                  t         j                  j                        }t        j                  |j	                         |      }t        | ||d       y )Nz
fill-image)r   rc  r\  ll_fz_transform_rectr  r  )r  r  r  r  r  color_paramsr  s          r)   jm_bbox_fill_imager  pX  s@    U\\,,-A""AJJL#6Ac3<0r*   c                    	 t        | |t        j                  t        j                  |      d       y # t        $ r t
        r
t                 w xY w)Nzfill-imgmask)r  r   r  fz_unit_rectrg   r  rv   )r  r  r  r  r  r  r  r  s           r)   jm_bbox_fill_image_maskr  vX  sD    #sE$>$>u?Q?QSV$WYgh N$4s	   03 Ac	           	         |rdnd}	 t        | |t        j                  |d |      d       y # t        $ r t        r
t                 w xY w)NTFz	fill-pathr  r   ll_fz_bound_pathrg   r  rv   	r  r  r
   r  r  r  r  r  r  s	            r)   jm_bbox_fill_pathr  ~X  sG    tUH#sE$:$:4s$K[Y N$4s	   #, Ac                    	 t        | |t        j                  ||      d       y # t        $ r t        r
t                 w xY w)Nz
fill-shade)r  r   ll_fz_bound_shaderg   r  rv   )r  r  shader  r  r  s         r)   jm_bbox_fill_shader  X  s<    #sE$;$;UC$H,W N$4s	   "% A c           	         	 t        | |t        j                  |||      d       y # t        $ r t        r
t                 w xY w)Nzstroke-textr  r   ll_fz_bound_textrg   r  rv   )r  r  r   rd  r  r  s         r)   jm_bbox_stroke_textr  X  ?    #sE$:$:D&#$NP]^ N$4	   #& Ac           	         	 t        | |t        j                  |d |      d       y # t        $ r t        r
t                 w xY w)Nz	fill-textr  )r  r  r   r  r  s        r)   jm_bbox_fill_textr  X  s>    #sE$:$:D$$LkZ N$4r	  c           	     J    t        | |t        j                  |d |      d       y )Nzignore-text)r  r   r  )r  r  r   r  s       r)   jm_bbox_ignore_textr  X  s    c3 6 6tT3 GWr*   c	           	         	 t        | |t        j                  |||      d       y # t        $ r t        r
t                 w xY w)Nzstroke-pathr  )	r  r  r
   rd  r  r  r  r  r  s	            r)   jm_bbox_stroke_pathr  X  r  r	  c                   | j                   t           }t        |      }dgdz  }t        d      D ]P  }||dz
  |z      }t	        |d         }|j
                  ||dz  <   |j                  ||dz  dz   <   t	        |d         }R j
                  |d   k7  s|j                  |d   k7  ryd| _        t        j                  |d   |d   |d   |d   |d   |d   |d   |d	         }d
t        |      f}	|	||dz
  <   ||dz
  |= y)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   rG  r   r   r  r  r   r   r  )r  r  r7   rF  r	  r"  r#  	linecountr   r/  r^  )
r  rB   r  r  rZ  ro   r}  rg  r<  r   s
             r)   jm_checkquadr  X  s*    LL-(Eu:D	
aAAY )dQhl#a)66!a%vv!a%!)tQx() 
ttqt|rttqt|  CM 	1Q41qtQqT1Q41qtQqTJA/!$%DE4!8tax$r*   c                &   d| _         d}| j                  t           }t        |      }||dz
     }t	        |d         }t	        |d         }||dz
     }t	        |d         }t	        |d         }		 |j
                  |j
                  k7  sK|j                  |	j                  k7  s2|j
                  |	j
                  k7  s|j                  |j                  k7  ry|	j
                  |j
                  k  rCt        j                  |	j                  |	j
                  |j                  |j
                        }
d}nBt        j                  |j                  |j
                  |j                  |j
                        }
d}dt        |
      |f}|||dz
  <   ||dz
  |= y)z}
    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  rr  )
r  r  r  r7   r	  r#  r"  r   r  rb  )r  rb  rB   r  rZ  r$  r%  line2r&  r  r  r   s               r)   jm_checkrectr  X  sZ    CMKLL-(Eu:D4!8E	5!9	%B	5!9	%B 4!8E	5!9	%B	5!9	%B 	
ttrtt|ttrtt|ttrtt|ttrtt| 
ttbdd{rttRTT2446rttRTT2446?1%{3DE4!8tax$r*   c           
     `    |j                   }	 |sy t        | |||||||       |j                  }"r,   )headjm_trace_text_spanr9  )	r  r   rU  r  r  r  r  seqnor  s	            r)   jm_trace_textr  Y  s8    99D
Cuc:ueUSyy	 r*   c                   d}t        |t        j                        sJ t        j                  |      }t        |t        j                        sJ t        j
                  |      }t        |j                               }	t        j                  |j                         |      }
t        j                  t        j                  dd      |
      }t        j                  |j                  |j                  z  |j                  |j                  z  z         }t        j                   |      }d}t#        |j                               }t%        |j                               }|dk  rd}d}||z  ||z
  z  }||z  ||z
  z  }d}t        j&                  |j                               }||t(        z  z  }|t        j*                  |j                               t,        z  z  }|t        j.                  |j                               t0        z  z  }|t        j2                  |j                               t4        z  z  }d}t        j6                         }t        j8                  |j                  |j                  |j                   |j                  dd      }|j                  dk(  rd|_        g }t=        |j>                  j@                        D ]  }d}|jC                  |      jD                  dk\  rRt        jF                  |j                         |jC                  |      jD                  |j>                  jH                        }||z  }|}|jC                  |      jJ                  dk(  r|}t        j                  |jC                  |      j                  |jC                  |      j                        }t        jL                  ||      }t        j8                  dddd|j                   |j                         }t        j                  ||      }t        j                  |t        j
                  dddd|j                  |j                              }|j                  }||z   }|
j:                  dkD  r|j                  dk(  s8|j                  dk(  s)|
jN                  dk7  r9|
jN                  |
jP                   k(  r|j                  |z   }|j                  |z   }n|j                  |z
  }|j                  |z
  }t        jR                  ||||      } t        jT                  | |      } |jW                  |jC                  |      jJ                  |jC                  |      jD                  |j                  |j                  f| jX                  | jZ                  | j\                  | j^                  ff       |dkD  rt        j`                  ||       }| } tc        |      }|sw|t(        z  slt        jd                  |j                         ddd      \  }!}t        jF                  |j                         |!|j>                  jH                        }||z  }|s|}n|}tg               }"ti        |      |"d	<   tk        |	      |"d
<   |j>                  jH                  |"d<   ||"d<   |j>                  jl                  |"d<   |j>                  jn                  |"d<   ||"d<   ||"d<   d|"d<   |r{t        jp                  t        jr                  t        jt                  |            |t        jv                         t        jr                         t        jx                               }#|#dd }#nd}#| jz                  dkD  r| jz                  }$n|dz  }$|#|"d<   ||"d<   ||"d<   |$|"d<   ||"d<   ||"d<   t}        |      |"d<   | j~                  |"d<   ||"d<   ||"d<   | j                  jW                  |"       y)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  rW  rX  r  r  re  rT  r
  r  bidi_lvlbidi_dirr   r!  r   r  r~  r  r  r  rP  	linewidth
spacewidthr   r*  layerr  r	  )Ar>   r   fz_text_span
FzTextSpan	fz_matrixrm  r  rT  r  r6  fz_transform_vectorr  r
  r
  r"  r#  fz_normalize_vectorr]  r^  r
  rS  r
  rQ  r
  rR  r
  rT  rc  r2  r  rF  r   r7   rB   r
  r  r
  r
  r!  r
  r  r  r  rk   r  r  r  r  r  r   r
  r5   r  r  r  r7  fz_convert_colorr  r  r  r  r  rb  r  r  )%r  r  rU  r  r  r  r  r  out_fontr   rq  re  r  	space_advr9  r:  ascsizedscsizefflagsr
  last_adv	span_bboxrO  r	  rZ  r  	char_origr  r  r  r  r  	char_bboxr  	span_dictr  r  s%                                        r)   r  r  Y  s    HtU//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 EkS3Y'GEkS3Y'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                4   | rx	 t        j                  t         j                  j                        }t        j                         }t        j                  | ||j
                  d |j                               }|d d S y# t        $ r t        r
t                 w xY w)Nr   r-   )
r   r  r  r  ll_fz_convert_colorr   r  rg   r  rv   )r  r  r  r  r  s        r)   jm_lineart_colorr3  Y  s    	 ##U%7%7%A%ABB$$&B++MMKKMC 2Aw	  	#(8	s   A2A< <Bc                T    t        | j                  t              rg | _        g | _        y r,   )r>   r  r   scissorsr  r  s     r)   jm_lineart_drop_devicer7  Y  s    #''4 CLr*   c	                   |rdnd}	 t        |t        j                        sJ t        j                  |      | _        t
        | _        t        | ||       | j                  y d| j                  t        <   || j                  d<   || j                  d<   t        ||      | j                  d<   t        | j                        | j                  t        <   | j                  | j                  d<   | j                  | j                  d<   | j                   r| j"                  | j                  d	<   t%        |        | xj                  d
z  c_        y # t&        $ r t(        r
t+                 w xY w)NTFr  r  r  r   r  r   r   r   )r>   r   r#  rm  r  trace_device_FILL_PATH	path_typejm_lineart_pathr  r  r3  rb  pathrectdictkey_rectr  r  r  r  r  rg   r  rv   r  s	            r)   jm_lineart_fill_pathr>  Y  s     tUH3000..#&.c4(<< &)l#$,j!(-n% !1*e Df&5cll&Cl#!$g!$g99%(YYCLL'"		Q	 N$4s   AE #C'E E&c           
     h    	 t        | |d||||| j                         | xj                  dz  c_        y r  )r'   r   r  r  )r  r  r   r  r  r  r  r  s           r)   jm_lineart_fill_textr@  Y  s.     #tQZsyyIIINIr*   c           
     f    t        | |d|d d d| j                         | xj                  dz  c_        y )Nr   r   r  r  )r  r   r  s      r)   jm_lineart_ignore_textrC  Y  s)    #tQT4CII>IINIr*   c                  6     e Zd Z fdZd Zd Zd Zd Z xZS )Walkerc                    t         |           | j                          | j                          | j	                          | j                          || _        y r,   )r   r   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathr  )r(   r  r  s     r)   r   zWalker.__init__Z  sE    !!  """$r*   c                   	 | j                   j                  dk(  rt        | j                         ry d| j                   _        | j                   j                  r| j                   j                  | j                   j
                  k7  rdt        | j                   j                        t        | j                   j
                        f}| j                   j                  t           j                  |       | j                   j
                  | j                   _        d| j                   j                  d<   nd| j                   j                  d<   d| j                   _        y # t        $ r t        r
t                 w xY w)Nr   r   r  Fr  T)r  r  r  havemove	lastpoint
firstpointr  r  r  rk   rg   r  rv   )r(   r  rC   s      r)   	closepathz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   .E D(E E5c                2   	 d| j                   _        t        j                  ||      }t        j                  ||      }	t        j                  ||      }
t        j                  || j                   j
                        }t        j                  |	| j                   j
                        }	t        j                  |
| j                   j
                        }
t        j                  | j                   j                  |      | j                   _        t        j                  | j                   j                  |	      | j                   _        t        j                  | j                   j                  |
      | j                   _        dt        | j                   j                        t        |      t        |	      t        |
      f}|
| j                   _	        | j                   j                  t           j                  |       y # t        $ r t        r
t                 w xY w)Nr   r  )r  r  r   r  r!  r  fz_include_point_in_rectr<  r  rM  r  r  rk   rg   r  rv   )r(   r  r  r  x2y2x3y3r  r  r  r3  s               r)   curvetozWalker.curveto'Z  s~   	!"DHH$$R,B$$R,B$$R,B))"dhhll;B))"dhhll;B))"dhhll;B % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH $TXX%7%78$R($R($R(E "$DHHHH}-44e< 	#(8	s   G8G; ;Hc                   	 t        j                  t        j                  ||      | j                  j                        }t        j
                  | j                  j                  |      | j                  _        dt        | j                  j                        t        |      f}|| j                  _        | j                  j                  t           }|j                  |       | j                  xj                  dz  c_        | j                  j                  dk(  r4| j                  j                  t        k7  rt        | j                         y y y # t         $ r t"        r
t%                 w xY w)Nr  r   rG  )r   r!  r  r  r  rQ  r<  r  rM  r  r  rk   r  r:  r9  r  rg   r  rv   )r(   r  r"  r#  r  r3  rB   s          r)   linetozWalker.linetoBZ  s   	))5+>+>q!+DdhhllSB % > >@Q@QSU VDHH$dhh&8&89$R(E
 "$DHHHH%%}5ELL% HH!#xx!!Q&488+=+=AW+WTXX& ,X&  	#(8	s   EE E+c                   	 	 t        j                  t        j                  ||      | j                  j                        | j                  _
        t        j                  | j                  j                        rt        j                  | j                  j                  j                  | j                  j                  j                  | j                  j                  j                  | j                  j                  j                        | j                  _        | j                  j                  | j                  _        d| j                  _        d| j                  _        y # t&        $ r t(        r
t+                 w xY wr  )r>   r  r  r5   r'   rB   r   r!  r  r  rM  r  r<  r  r"  r#  rN  rL  r  rg   r  rv   )r(   r  r"  r#  rE   rF   s         r)   movetozWalker.movetoWZ  s   	!&!9!9''1-HHLL"DHH (($((*;*;<$)$6$6**,,**,,**,,**,,	%! #'(("4"4DHH !DHH!"DHH 	#(8	s   EE   E;)	r/   r0   r1   r   rO  rV  rX  rZ  r  rv  s   @r)   rE  rE  Z  s    86*r*   rE  c                   	 t        j                  t         j                  j                        | _        d| _        t        j
                  dd      | _        t               | _        g | j                  t        <   t        |       }t        j                  t        j                  t        j                  |            ||j                         | j                  t           sd| _        yy# t        $ r t         r
t#                 w xY w)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   rc  rd  r<  r  r   rM  r5   r  r  rE  fz_walk_pathFzPathll_fz_keep_pathr   rg   r  rv   )r  r  r
   walkers       r)   r;  r;  tZ  s    ||U\\%@%@Aq!,v')m$  	ELL)>)>t)DEvvO`O`a||]+CL , N$4s   C"C& &Dc	                2   	 t        |t        j                        sJ d| _        |j                  dk7  rFt        |j                        t        |j                        k(  rt        |j                        | _        nT|j                  dk7  rEt        |j                        t        |j                        k(  rt        |j                        | _        t        j                  |      | _
        t        | _        t        | ||       | j                  y d| j                  t        <   || j                  d<   t!        ||      | j                  d<   | j                  |j"                  z  | j                  t$        <   |j&                  |j(                  |j*                  f| j                  d<   | j                  |j,                  z  | j                  d<   d| j                  vrd	| j                  d<   |j.                  rt        j0                  d
      }	t        j2                  |	d       t5        |j.                        D ]Q  }
t        j6                  |j8                  |
      }t        j2                  |	t;        | j                  |z         d       S t        j2                  |	dt;        | j                  |j<                  z                |	| j                  d<   nd| j                  d<   t?        | j@                        | j                  tB        <   | jD                  | j                  d<   | jF                  | j                  d<   | jH                  r| jJ                  | j                  d<   tM        |        | xjF                  dz  c_#        y # tN        $ r tP        r
tS                 w xY w)Nr   r   rn  r  r  r  r  r  Fr  z[ r   z] r[  r#  r   r  r   )*r>   r   r#  
pathfactorr!   r  r  r
  r  rm  r  trace_device_STROKE_PATHr:  r;  r  r  r3  r  r  	start_capdash_capend_caplinejoindash_lenr  r  rF  floats_getitem	dash_listr   
dash_phaserb  r<  r=  r  r  r  r  r  rg   r  rv   )r  r  r
   rd  r  r  r  r  r  rK  rZ  r   s               r)   jm_lineart_stroke_pathrk  Z  s   2300055A:#cee*CEE
2 ZCNUUaZCJ#cee*4 ZCN..#&0c4(<<&)l#*/&'!1:u!Eg'*~~8H8H'Hm$  $i 
 %(NNV__$Dj!cll*(-CLL% ??&&,D""D$/FOO, W ,,f.>.>B&&3>>E;Q1R0SST.UV	W
 ""DBy&J[J[9[/\.]*^_&*CLL(#&,CLL(#&5cll&Cl# #W!$g99%(YYCLL'"		Q	 N$4s   D
M; I-M; ;Nc                   | j                   sy t        j                  |      | _        t        | _        t        | ||       | j                  y d| j                  t        <   t        |      | j                  d<   d| j                  vrd| j                  d<   t        t        |             | j                  d<   | j                  | j                  d<   | j                  | j                  d<   t        |        | xj                  dz  c_        y )	Nr  r  r  Fr  r   r   r   )r  r   rm  r  trace_device_CLIP_PATHr:  r;  r  r  r   rb  compute_scissorr  r  r  )r  r  r
   r  r  r  s         r)   jm_lineart_clip_pathro  Z  s    99nnS!CG*CMCd#
||"(CLL, $XCLL*#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr*   c                   | j                   sy t        j                  |      | _        t        | _        t        | ||       | j                  y d| j                  d<   d | j                  d<   d| j                  vrd| j                  d<   t        t        |             | j                  d<   | j                  | j                  d<   | j                  | j                  d<   t        |        | xj                  d	z  c_
        y )
Nr  r  r  r  Fr  r   r   r   )r  r   rm  r  trace_device_CLIP_STROKE_PATHr:  r;  r  rb  rn  r  r  r  )r  r  r
   rd  r  r  s         r)   jm_lineart_clip_stroke_pathrr  Z  s    99nnS!CG1CMCd#
||#)CLL #CLL#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr*   c                ^    | j                   sy t        |        | xj                  dz  c_        y rN  r  rn  r  )r  r  r   rd  r  r  s         r)   jm_lineart_clip_stroke_textru  Z  !    99CIINIr*   c                ^    | j                   sy t        |        | xj                  dz  c_        y rN  rt  )r  r  r   r  r  s        r)   jm_lineart_clip_textrx  Z  rv  r*   c                ^    | j                   sy t        |        | xj                  dz  c_        y rN  rt  )r  r  r  r  r  s        r)   jm_lineart_clip_image_maskrz  [  rv  r*   c                    | j                   r| j                  sy t        | j                        }|dk  ry | j                  d= | xj                  dz  c_        y )Nr   r  )r  r5  r7   r  )r  r  r  s      r)   jm_lineart_pop_clipr|  [  sC    99CLLs||DaxRIINIr*   c                &    |r|| _         y d| _         y Nr\   r  )r  r  r   s      r)   jm_lineart_begin_layerr  [  s    r*   c                    d| _         y r~  r  r6  s     r)   jm_lineart_end_layerr  [  s	    CNr*   c           	        | j                   sy dt        |      t        |      t        |      t        j                  |      || j
                  | j                  d| _        t        |        | xj
                  dz  c_        y )Nrs  )r   r   isolatedknockoutr~  rP  r   r   r   )	r  rb  r   r   fz_blendmode_namer  r  r  r  )r  r  r*  r  r  r  r~  r  s           r)   jm_lineart_begin_groupr  "[  sd    99#D)XX00;YY^^	CL CIINIr*   c                H    | j                   sy | xj                  dz  c_        y rN  )r  r  r6  s     r)   jm_lineart_end_groupr  4[  s    99IINIr*   c	           
     f    t        | |d||||| j                         | xj                  dz  c_        y rN  rB  )	r  r  r   rd  r  r  r  r  r  s	            r)   jm_lineart_stroke_textr  ;[  s)    #tQZsyyIIINIr*   c	                >    |j                   | _         t        | |       y r,   )r  jm_increase_seqno)	r  r  r
   rd  r  r  r  r  r  s	            r)   jm_dev_linewidthr  @[  s    $$CMsC r*   c                l    	 | xj                   dz  c_         y # t        $ r t        r
t                 w xY wrN  )r  rg   r  rv   )r  r  vargss      r)   r  r  E[  s.    		Q	 N$4s    3c                X    t        |       } t        |      }t        t        | |            S )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  rp  r#  )r  r  s     r)   r(  r(  M[  s(     
rB	rB/"b)**r*   c                  $     e Zd Z fdZd Z xZS )JM_image_reporter_Filterc                B    t         |           | j                          y r,   rp  rr  s    r)   r   z!JM_image_reporter_Filter.__init__^[  s    %%'r*   c                    t        |t        j                        sJ t        | t        j                  |      ||       t
        ryy r   )r>   r   r#  r`  rm  r   )r(   r  r  r   r  s        r)   rt  z%JM_image_reporter_Filter.image_filterb[  s:    #u///ennS14?  r*   ru  rv  s   @r)   r  r  ][  s    (r*   r  c                  F     e Zd Z fdZeZeZeZ	e
ZeZeZeZeZeZeZ xZS )r  c                   t         |           || _        || _        d| _        | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          y 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   z"JM_new_bbox_device_Device.__init__l[  s    ""$$$&""$$$&$$&##%##%((*$$&""$r*   )r/   r0   r1   r   r  begin_layerr  	end_layerr  	fill_pathr  stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shader  
fill_imager  fill_image_maskr  rv  s   @r)   r  r  k[  s<    %" )K$I!I%K!I%K%K#J#J-Or*   r  c                  6     e Zd Z fdZd Zd Zd Zd Z xZS )r  c                    t         |           || _        | j                          | j	                          | j                          | j                          y r,   )r   r   r
  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)r(   r
  r  s     r)   r   z%JM_new_output_fileptr_Output.__init__[  sE     !!#r*   c                :    | j                   j                  ||      S r,   )r
  r  )r(   r  rY  whences       r)   r  z!JM_new_output_fileptr_Output.seek[  s    xx}}ff--r*   c                :    | j                   j                         }|S r,   )r
  tell)r(   r  rG   s      r)   r  z!JM_new_output_fileptr_Output.tell[  s    hhmmo
r*   c                6    | j                   j                         S r,   )r
  truncate)r(   r  s     r)   r  z%JM_new_output_fileptr_Output.truncate[  s    xx  ""r*   c                d    t        j                  ||      }| j                  j                  |      S r,   )r   raw_to_python_bytesr
  r   )r(   r  data_rawdata_lengthrz  s        r)   r   z"JM_new_output_fileptr_Output.write[  s'    ((;?xx~~d##r*   )	r/   r0   r1   r   r  r  r  r   r  rv  s   @r)   r  r  [  s    $.#$r*   r  c                L   | j                   t               | _         t        | j                         }|dkD  r>| j                   |dz
     }t        |      }t	        j
                  || j                        }n| j                  }| j                   j                  t        |             |S )zs
    Every scissor of a clip is a sub rectangle of the preceding clip scissor
    if the clip level is larger.
    r   r   )	r5  r   r7   r  r   r  r<  rk   rb  )r  num_scissorslast_scissorr  s       r)   rn  rn  [  s    
 ||vs||$La||LN3!,/))'3<<@,,LL01Nr*   c                  j     e Zd ZdZ fdZeZeZe	Z
eZeZeZeZeZeZeZeZeZeZeZeZeZe Z!e"Z# xZ$S )r  z?
    LINEART device for Python method Page.get_cdrawings()
    c                ,   t         |           | j                          | j                          | j	                          | j                          | j                          | j                          | j                          | j                   | j                   | j                   | j                          | j                          | j                          | j                          | j!                          | j#                          | j%                          | j'                          || _        d| _        d| _        || _        || _        d | _        d| _        d | _        d| _        t;        j<                         | _        t;        j<                         | _         t;        j<                         | _!        t;        jD                         | _#        t;        jD                         | _$        d| _%        t;        jL                         | _        d| _'        d| _(        d| _)        y Nr   r\   )*r   r   r  r  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr  r  r  r  r  r  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr  r  r  r  r  r  r  r5  r  r<  r  r   rm  r  r  rO  r   rM  rN  rL  rc  ra  r  r:  )r(   r  r  r  r  s       r)   r   z%JM_new_lineart_device_Device.__init__[  s    	""$$$&""$((*))+))+""$""$$$$##%##%((*!!#$$&""$$$&""$


>>#>>#>>#--/r*   )%r/   r0   r1   r`  r   r>  r  rk  r  rz  clip_image_maskro  	clip_pathrr  clip_stroke_pathrx  	clip_textru  clip_stroke_textr  r  r  r  r  r  r  r|  pop_clipr  begin_groupr  	end_groupr  r  r  r  r  rv  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                  J     e Zd ZdZ fdZeZeZe	Z
eZeZeZeZeZeZeZ xZS )rJ  zB
    Trace TEXT device for Python method Page.get_texttrace()
    c                2   t         |           | j                          | j                          | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          || _        d| _        d| _        d| _        d | _        d| _        t#               | _        t'               | _        d| _        t-        j.                         | _        t-        j.                         | _        t-        j.                         | _        t-        j6                         | _        t-        j:                         | _        d| _        d| _         d| _!        d| _"        y r  )#r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r5   r  r   r5  r  r   rm  r  r  rO  r   rM  rc  r<  ra  r  r:  r  )r(   r  r  s     r)   r   z JM_new_texttrace_device.__init__\  s)   ""$$$&""$$$&$$&##%##%((*$$&""$



>>#>>#>>#r*   )r/   r0   r1   r`  r   r  r  r  r  r@  r  r  r  rC  r  r  r  r  r  r  r  r  r  rv  s   @r)   rJ  rJ  \  sB    "H "I"K$I(K(K"J"J'O(K$Ir*   rJ  c                    | j                         }dd l}|j                  d      }|j                  d| d      }|j                  d      }d}d| d}|d	k(  r|}	|	S |d
k(  r|}	|	S |dk(  r|}	|	S |dk(  r|}	|	S |}	|	S )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>
            r\   z{"document": "z", "pages": [
r^  rc  r  xhtml)r  textwrapdedent)
rZ  rf   rA  r  r^  r  r  r   rc  r  s
             r)   ConversionHeaderr  =\  s    		A??  D // %J ' C
 OO  E DXJo6DF{ H 
f H 
e H 
g H Hr*   c                    | j                         }d}d}d}d}|}|dk(  r|}|S |dk(  r|}|S |dk(  r|}|S |dk(  r|}|S |}|S )	Nr\   z]
}z</body>
</html>
z</document>
r^  rc  r  r  )r  )rZ  rA  r   rc  r^  r  r  r  s           r)   ConversionTrailerr  q\  s    		ADDD
CEF{ H 
f H 
e H 
g H Hr*   c                    t        |        | j                  j                  st        d      | j                  }|dk7  r| j                  d       |S )zPrepare for annotation insertion on the page.

    Returns:
        Old page rotation value. Temporarily sets rotation to 0 when required.
    r  r   )ra  r   r  r   rL  r  )r   r  s     r)   r  r  \  sI     ;;%%==Lq!r*   c                    t        | t              sJ t        |t              sJ | |_        || j                  t        |      <   d|_        y)zuClean up after annotation insertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)r>   r   r   r   r4  r5  r   )r   r   s     r)   r  r  \  sF     tT"""ue$$$EL"'DRYEMr*   c                4   t        | t              sJ | dk(  s
| dk(  s| dk(  rt        d      S | t        d      k(  s| t        d      k(  s| t        d      k(  rt        d      S | t        d      k\  r(| t        d	      k  r| t        d      z
  t        d
      z   S | S )NrR  i(   i)   r   r%   	r  Zr!   )r>   r4   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                t    t        | t              sJ t        j                  |       \  }}t	        |      }||fS r,   )r>   r  r   r  r  )rn  rE   r  s      r)   chartocanonr  \  s8    aq!DAqaAa4Kr*   c                   t        j                  | t        d            }t        j                  t        j                  |t        d            t        d            r*t	        t        j                  |t        d            |      syt        j                  | t        d            }|j
                  s	 yt        j                  |      rt	        ||      S t        t        j                  |d      ||      syy)Nr  r	  r  r  r   r  r   )	r   r  r  r  string_in_names_listr   r
  dest_is_valid_pager  )r  r  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                n    t        j                  |       }|dk(  ryt        |      D ]  }||   |k(  s y yr  )r   r   rF  )r
  r  r  numrZ  s        r)   r  r  \  sE    


3
C
ax9 A#% r*   c                    t        | t              sJ t        t        |             D ]  }t	        | |d  |      }|||z  }||fc S  y)Nr	  )r>   r  rF  r7   match_string)rn  r   rZ  r  s       r)   r=  r=  \  sW    a3q6] 1QR5&)?1HCc6M	
 r*   c                    ddl } t        t        | j                  dz              j	                  dd      }t        t        | j                  dz        dz        j	                  dd      }| d| d} | j
                  d | j                               }| j                  dkD  r
|d	|z   z  }|S | j                  dk  r
|d
|z   z  }|S 	 |S )z'
    "Now" timestamp in PDF Format
    r   Ni  r   rz   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]]+^T^^-=>F||a#(
 M	 
	#( M 	Mr*   c                      e Zd ZdZd Zy)ElementPositionzDConvert a dictionary with element position information to an object.c                     y r,   r-   r.   s    r)   r   zElementPosition.__init__\  r  r*   Nr{  r-   r*   r)   r  r  \  s
    Nr*   r  c                     t               S r,   )r  r-   r*   r)   make_story_elposr   ]  s    r*   c                   || j                   }t        |      }||j                  }||j                  }|j                  |_        |j                  |_        |j                  s|j                  rg S | j                  dd|      d   }g }|D ]k  }t        |d         }|j                  s|j                  r*|d   D ]:  }t        |d         }|j                  s|j                  r*|j                  |       < m |g k(  r|S |j                  d        |j                  d      }	|	j
                  |j                  z
  d	|	j                  z  k  rVt        |j                  |	j
                  |	j                        }
|
j                  s1|
j                  s%|j                  d|
       n|j                  d|	       |g k(  r|S |j                         }|j                  |j                  z
  d	|j                  z  k  rVt        |j                  |j                  |j                        }
|
j                  s|
j                  s|j                  |
       |S |j                  |       |S )
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.
    r5   r   )r  r  r  r*  r  c                    | j                   S r,   )r  )r*  s    r)   rY	  z)get_highlight_selection.<locals>.<lambda>3]  s
     r*   r{	  r  )r   r  r  r  r#  r  r  r  r  r  rk   r  r  r  r"  insert)r   r  r  r  r  r  r
  r*  ro   bboxfr  bboxls               r)   r  r  ]  s	     |yy:D}|wwggDGffDG}}((	 ]]ad  F E AfIt}}gJ 	D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                h    ddl }	 t        |j                  |             }|S # t        $ r d}Y |S w xY w)z+Convenience function accessing unicodedata.r   Nr	  )unicodedatar
  lookuprg   )r   r  r	  s      r)   r
  r
  M]  sA    +$$T*+ J  J   " 11c                    |j                   |j                   z
  }|j                  |j                  z
  }t        j                  || j                   z  || j                  z  z         S r,   r"  r#  r   fz_absre  r!   r
  dxdys        r)   hdistr
  W]  H    	
qssB	
qssB<<SUU
R#%%Z/00r*   c                   t        |       } | j                  s| j                  rt        d      | j                  }| j
                  |z  }| j                  |z  }|d|df}d|d|f}t        ||j                  |z   |j                  |z         }|g}	t        d|      D ]  }
||z  }|	j                  |        |	g}t        d|      D ]8  }
||
dz
     }	g }|	D ]  }|j                  ||z           |j                  |       : |S )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.
    ry  r   r   )r  r  r  r   r  r  rY  r"  r#  rF  rk   )r   rQ  rowsr  r  rY  delta_hdelta_vr  rowrZ  rectsnrows                r)   
make_tabler  ]]  s    :D}}((<==	B[[4FJJEa"G&!V$GRrttf}-A #C1d^ 	W

1
 EE1d^ AEl 	%AKKG$	%T Lr*   c                   t        j                  | j                        }t        j                  |      }t        j                  d      }t        j
                  t        j                  |      t        d      t        d            }t        j                  ||      }t        j                  |      st        j                  ||d      }t        j                  |      }d}t        j                  |      }t        |      D ]4  }	t        j                  t        j                  ||	            }
||
k(  s2d} n |s,t        j                  |t        j                   ||d             yy)zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    r  r&  r'  r   r   r   N)r   r   r   r  r+  r  r*  r  r  r  r  r  r   rF  r  r  r  )r   r  rT  
PDFNAME_COr  r  rE   r  r  rZ  r  s              r)   r  r  ]  s)    ##EJJ/I

&
&y
1C##D)Jc"VZ D 
		D*	-Bb!%%dJ:BAEI&D1X   !4!4R!;<5=E	
 R!7!7T1!EF r*   rJ  c                    d d fd} |       \  }}	}
}|  |       \  }}	| |      \  }
}||}||}	||}
||}||	|
|fS )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                    t        | t        t        f      rt        |       dk(  r
| d   | d   fS t        | t        t
        j                  t
        j                  f      r| j                  | j                  fS y)Nr   r   r   r	  )
r>   r   r   r7   r  r   r   r  r"  r#  )r  s    r)   get_xyzutil_make_rect.<locals>.get_xy]  sZ    sT5M*sCyA~q63q6>!sUEMM5>>BC55#%%<r*   c                p   t        | t              r| S t        | t              r| j                  | j                  fS t        | t
        t        t        j                  t        j                  f      r.| j                  | j                  | j                  | j                  fS t        | t        t        f      s| f} | S r,   )r>   r   r  r"  r#  r  r  r   rc  fz_rectr  r  r  r  r   r  s    r)   
make_tuplez"util_make_rect.<locals>.make_tuple]  s    q% Hq% 338OT5%,,FG44qttQTT))1tUm,Ar*   c                 :   t              dk(  ryt              dk(  rɉd   } t        | t        t        f      r,t        |       dk(  r| \  }}g ||}t        |      dk(  sJ |S t        | t        t        f      rGt        |       dk(  r9| \  }}} |      } |      } |      }g |||}t        |      dk(  sJ |S  |       }t        |      dk(  sJ d| d|       |S t              dk(  r) d          d         z   }t        |      dk(  sJ |S t              dk(  rB d         \  }}||fd	k7  r||d   d   fS  d         \  }	}
|	|
fd	k7  r,d   d   |	|
fS t              dk(  rd   d   d   d   fS t	        d
       )Nr   r  r   r   rG  r   zarg=z ret=r	  r  )r7   r>   r   r   rg   )r  r  r  rG   r!   r
  r  r  r  r  r  r  r  r  s              r)   handle_argsz#util_make_rect.<locals>.handle_args]  s   t9>Y!^q'C3u.39>BrhBh3x1}$}
3u.39>1a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Bx<'2tAwQ//T!W%FBBx<'AwQR//Y!^7DGT!Wd1g55.tf566r*   r-   )rf  r  r  r  r  r  r  r  ret_x0ret_y0ret_x1ret_y1r  r  s         `     @@r)   rL  rL  ]  sz    .	"7F &1]"FFFF	~	~	~	~	~	~666))r*   c           
         t        || |||||d\  }}}	}
d } ||d      } ||d      } ||	d      }	 ||
d      }
|||	|
fS )NrJ  c                ~    |rt        t        j                  |             S t        t        j                  |             S r,   )r4   r
  r;  floor)r"  r;  s     r)   convertz util_make_irect.<locals>.convert]  s+    tyy|$$tzz!}%%r*   FT)rL  )rf  r  r  r  r  r  r  r!   r
  r  r  r%  s               r)   rz  rz  ]  se    $2"rbQJAq!Q&
 	5A5A4A4AaA:r*   c                P    t        t        j                  t        |                   S r,   )rS  r   r  r  r  s    r)   r  r  ^  s    E//0EFGGr*   c                    t         rt        j                  | |      S t        t	        j
                  t        |       t        |                  S r,   )r  r   r  rb  r   r  r  r  )r   r  s     r)   r  r  
^  s<    (($77522?43HJ[\bJcdeer*   c                d    t        t        j                  t        |       t        |                  S r,   )rb  r   r  r  r  r  s     r)   ru  ru  ^  s-    #### r*   c                R    t        j                  t        |       t        |            S r,   )r   fz_is_point_inside_rectr	  r  )r  r  s     r)   rD  rD  ^  s%    (( #" r*   c                d    t        t        j                  t        |       t	        |                  S r,   )rb  r   rQ  r  r	  )r  r  s     r)   rq  rq  ^  s-    **" # r*   c                Z    t        |       }t        |      }t        j                  ||      S r,   )r	  r8  r   fz_is_point_inside_quad)r  r   r  r<  s       r)   r  r  (^  s)    AA((A..r*   c                d    t        t        j                  t        |       t	        |                  S r,   )r  r   r!  r	  r  )r'  r  s     r)   r  r  .^  s-    $$ '!&) r*   c                d    t        t        j                  t        |       t        |                  S r,   )rb  r   r  r  r)  s     r)   rs  rs  7^  s-    ## r*   c                d    t        t        j                  t        |       t        |                  S r,   )rl  r   r  r  )r  r7  s     r)   r:  r:  @^  s+    OO!"%!"% r*   c                4   	 t'        |       }|j                  }||j                  z  |j                  |j                  z  z
  }|t         j"                  j$                   k  s|t         j"                  j$                  kD  rt        j                         }d|z  }|j                  |z  |_        |j                   |z  |_        |j                   |z  |_	        ||z  |_
        |j                   |j                  z  |j                  |j                  z  z
  }|j                   |j                  z  |j                  |j                  z  z
  |_        ||_        d|j                  |j                  |j                  |j                  |j                  |j                  ffS y)Nr   r   )r   r-   )r>   r   r   r   rm  r#  rp  r!   r
  r  r  r[  r  r   r'  r  rH
  
float_infoepsilonr  )r  rG   r  r!   detr
  rdets          r)   r5  r5  I^  s3   ( F
#CA
cee)ceeceem
#C
cnn$$$$cnn.D.D(Dnn3wDUUFSUUNSUUSUU]*.355#%%suucee<<<r*   c                   t        j                  |      }d}d}|t        |       k  rt        j                  | |d        \  }}||z  }|t         j                  k(  rt        j
                  |      }n>|t         j                  k(  rt        j                  |      }nt        j                  |      }|dk  rd}t        j                  ||      }	t        j                  ||	d      }
||
z  }|t        |       k  r||z  }|S )Nr   r  )r   r  r7   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  rT  r   rX  rA  r  r  r  rG   s               r)   r  r  p^  s    ##H-D	A
C
D	/""4:.1qu666//2A;;;2215A2215Aq5A%%dA.##D!Q/	R D	/ h,CJr*   c                r   t        |       }t        |      }t        |      }t        j                  t        j                  |j                  |j                  z
  |j
                  |j
                  z
              }t        j                  dddd|j                   |j
                         }t        j                  |j                  |j
                   |j
                  |j                  dd      }t        j                  ||      }t        j                  ||      }t        j                  |      }|j
                  S )Nr   r   )	r	  r   r%  r  r"  r#  r2  r  r!  )	r  r  r   r  r  r<  rn  r  r7  s	            r)   r,  r,  ^  s    AAA!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8B	R	 B  B'A!!!$A33Jr*   c                    t        |       }t        |      }t        j                  t        j                  |j                  |j                  z
  |j
                  |j
                  z
              }t        j                  dddd|j                   |j
                         }t        j                  |j                  |j
                   |j
                  |j                  dd      }t        t        j                  ||            S )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  r"  r#  r2  rl  r  )r  r  r  r  rn  r  r7  s          r)   r#  r#  ^  s    
 	AA 	!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8BU__R455r*   c                   d}d}|}t        | |d        \  }}||z  }t        ||d        \  }}||z  }||k(  r|}|t        d      k(  r'	 t        | |d        \  }}||z  }|t        d      k7  rn&t        | |d        \  }}||z  }|t        d      k(  r'	 t        ||d        \  }}||z  }|t        d      k7  rn&t        ||d        \  }}||z  }||k(  r|dk7  rd S |S )Nr   r   )r  r
  )	h0r*  r  rE   r[  r  hcdelta_nncs	            r)   r  r  ^  s-   	A	A	Abf%KGRLAbf%KGRLA
(S>)"QR&1WS>	  &bf-KGRLAS>)"QR&1WS>	  &bf-KGRLA' (( 74!!r*   c                   | sJ t        |t        j                        sJ t        |t        j                        sJ |j                  j
                  | j                  z  }|j                  j
                  | j                  z  }t        ||      }| j                  dkD  r?| j                  | j                  dz
     }t        |      }	 t        |j                  j                  |j                  |j                        |k  rt!        |j                  j                  |j                  |j                        |k  rt        |j                  j                  |j"                  |j$                        |k  rot!        |j                  j                  |j"                  |j$                        |k  r7|j"                  |_        |j                  |_        | j                  d   |k(  sJ y | j                  j'                  |       | xj                  dz  c_	        y rI  )r>   r   rY  rZ  r   r  r;  r:  rN  r7   r	  r8  r
  re  r%  r$  vdistr&  r  rk   )r@  ro   r
  r;  r:  ch_quadr	  r  s           r)   r>  r>  ^  sy   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                   t         rt        j                  | |||||||      S t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d	      g	}t	        j
                  ||      }	t	        j                  | d
      }
t	        j                  |
t        d      t        d             t        t        |            D ]`  }t	        j                  |	||         }|j                  s)t	        j                  |
||   t	        j                  |j                  |             b |rt	        j                  |	t        d            }t	        j                  |      }|dkD  rt	        j                   |
t        d      |      }t        |      D ]y  }t	        j"                  ||      }|j                  rt	        j$                  |      s<t	        j&                  |d      j                  r]t	        j                  |t        d            }t	        j(                  |t        d            rt	        j(                  |t        d            rt	        j(                  |t        d            rt	        j*                  |t        d             t	        j*                  |t        d             t	        j                  |j                  |      }t	        j,                  | t	        j.                  |      d      }t	        j0                  ||       | |dk7  r t	        j2                  |
t        d      |       t	        j4                  | |
      }t	        j6                  | ||       y)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.
    r  r/  r  r  r  r  r  r.  UserUnitrG  r#  r   r  r   r  r  r
  r  r6  r  r  N)r  r   r  r  r   r2  rM  rH  rF  r7   r3  r   r  r   r  r  r  r  ru  r   r  r;  r  r   r  rC  r  r`  )r  r  	page_frompage_torS  rq  copy_annotsr  known_page_objspage_refr  rZ  r
  r  rE   r  r  r  r  r   r  s                        r)   r  r  ^  s    '9gvuVaclmm 	

O (()<H ""7A.I	y(6"2HV4DE C() s,,h8JK>>	?1+=u?\?\]f]k]kmp?qr	s ''8H3EF
,q5119hx>PRSTJ1X 9''Q7||5+<+<Q+?&&51<<,,a)1DE$$gx/?@$$gx/@A$$Whx.@A""Ax'89""Ax}566	J..9I9I69RTUV$$j%8#9( |	8H+=vF



3C 
7GS1r*   c                :    t        |       \  }}t        dd||      S )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  )rn  rY  r  s      r)   
paper_rectrP  #_  s"     qMME6S%((r*   c                    | j                         }d}|j                  d      rd}|dd }|j                  d      r|dd }t               j                  |d      }|dk(  r|S |d   |d	   fS )
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-lr  Nr  z-pr  r   r   )r  r  paper_sizesr8   )rn  r  r  r   s       r)   rO  rO  *_  sy     779DA}}TCRy}}TCRy			4	*BCx	qE2a5>r*   c                     i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdO
S )Pa6  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)  rU  a10)r  r9  a2)  rW  a3)r7
  rZ  a4)r6
  r7
  a5)  r6
  a6)*  r^  a7)r  r`  a8)   r  a9)r9  rc  b0)  i  b1)  rf  b10)r'  rP  b2)  rh  b3)  rk  b4)  rm  b5)  ro  b6)b  rq  r  )r  rs  b8)re  r  b9)rP  re  c0)'
  i]  c1)-  rw  c10)r  rC  c2)  ry  c3)  r|  c4)  r~  c5)  r  c6)C  r  c7)r  r  c8)rT  r  c9)rC  rT  zcard-4x6)i   i  )r  i  )i)  i  )i
  i  )i  r  )r  i  )r  i  )r  i  )r  r  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar-   r-   r*   r)   rR  rR  >_  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                .    t        j                  | |      S r,   )r   rJ  )r%  r   s     r)   rJ  rJ  v_  s    $$S&11r*   c                    J d       )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    zuse mupdf.pdf_debug_obj() ?)r   r  r  rF  r  pdfobj_stringr6  array_get_boolru  rv  rx  r  pdf_is_embedded_fileembedded_file_namer  r
  r  pdf_is_jpx_imager  rt  r  r
  r  r  r
  r  )r  rv	  rG   r  rZ  oor  r   s           r)   r  r  z_  s     ,++1r*   c                   |j                   d   sy| j                  }| j                         }|D cg c]A  }|d   |j                  k(  r-|d   j	                  d      r|d   j	                  d      r|d   C }}|g k(  ryt        |      }t        t        |j                  d	      d
z              }|D ]6  }t        j                  |||      rt        d|j                   d|d       8 yc c}w )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   rG  r  r   r}  r   r  i  zCannot set width for 'z
' in xref r  )r  r   r  r   r3   r  r4   r  r
  r  set_font_widthr'   )r   rT  r%  r  r  r:  rY  r  s           r)   rg  rg  _  s     ::f
++C~~H aDDII!A$//#"61Q4??:;V 	
!E 
 {JEt))"-467E H##Cu5(:d1XFGHs   AC,c                F    t        |       }|d   dz  |d   dz  |d   dz  fS )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   )r   )srgbrA  s     r)   sRGB_to_pdfr  _  s3     	DAQ4%<1qte|33r*   c                R    | dz  } | dz	  }| |dz  z
  dz	  }| |dz  z
  |dz  z
  }|||fS )aI  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  r  r
  s       r)   r   r   _  sM     	HD
A	b	aARAF#Aq!9r*   c                    |rt        j                  |      nd}t        j                  |       }t        d|d      D ]0  }t        j                  t        j                  ||            |k(  s0 y y)Nr   r   r   )r   r  r   rF  r  )r  r  rE   str_rZ  s        r)   r  r  _  se    ,6Z(AA##Q'D1a^ ##U%8%8*a%HITQ r*   c                L   d}d}|}d}|j                   rt        | ||||      }	t        ||||      s)|	dk(  rt        j                  |t        d            }
|
j                   s,|j                   rt        j                  |t        d             nl|j                   rAt        j                  |t        d      |
       t        j                  |
t        d      |       nt        j                  |
t        d             |
}nt        j                  |t        d             t        j                  |t        d             t        j                  |t        d            }n6|r|j                   s|}|}t        j                  |t        d            }|dz  }|j                   r|||fS )z'
    Returns (count, first, prev).
    Nr   r  Prevr  r  r   )r   strip_outlinesr  r   r  r  r;  rH  )r%  outlinesr  r  r  r<  r  currentr  rC  r9  s              r)   strip_outliner  _  sk    EEGD


 C*6F
SWj2BJ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                   |j                   syt        j                  |t        d            }|j                   sd}nt	        | ||||      \  }}}|dk(  r_t        j
                  |t        d             t        j
                  |t        d             t        j
                  |t        d             |S t        j                  t        j                  |t        d                  }t        j                  |t        d      |       t        j                  |t        d             t        j                  |t        d      t        j                  |dkD  r|n|              |S )Nr   r6  Lastr  )	r   r   r  r  r  r;  r  rH  r  )	r%  r  r  r  r  r<  rC  r	  	old_counts	            r)   r  r  !`  s"   x'):;E'UJ@PR\]E4	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                h    ddl }	 |j                  t        |             }|S # t        $ r d}Y |S w xY w)z5
    Convenience function accessing unicodedata.
    r   Nz.notdef)r  r   r	  r   )r
  r  r   s      r)   r
  r
  =`  sB     B( K  Kr  c                    |j                   |j                   z
  }|j                  |j                  z
  }t        j                  || j                  z  || j                   z  z         S r,   r  r  s        r)   rE  rE  I`  r  r*   r-   single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsrl  r  concurrency_statsc       	        h   |
rt        j                          }|dk(  r`|r ||i | t               }t        |       }|t        t	        |            }|D ]$  }||   } ||g|i |}|j                  |       & nddlm} |q|
rt        j                          }t        |       5 }t	        |      }t        t        |            }ddd       |
r&t        j                          z
  }t        |dd       |
rt        j                          }|dk(  r|j                  | ||||||||	|

      }n+|dk(  r|j                  | ||||||||	|

      }nJ d	|d
       |
r&t        j                          z
  }t        |dd       |
r&t        j                          z
  }t        |dd       |S # 1 sw Y   xY w)a  
    Returns list of results from `pagefn()`, optionally using concurrency for
    speed.
    
    Args:
        path:
            Path of document.
        pagefn:
            Function to call for each page; is passed (page, *pagefn_args,
            **pagefn_kwargs). Return value is added to list that we return. If
            `method` is not 'single', must be a top-level function - nested
            functions don't work with concurrency.
        pagefn_args
        pagefn_kwargs:
            Additional args to pass to `pagefn`. Must be picklable.
        initfn:
            If true, called once in each worker process; is passed
            (*initfn_args, **initfn_kwargs).
        initfn_args
        initfn_kwargs:
            Args to pass to initfn. Must be picklable.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork()`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        _stats:
            Internal, may change or be removed. If true, we output simple
            timing diagnostics.
    
    Note: We require a file path rather than a Document, because Document
    instances do not work properly after a fork - internal file descriptor
    offsets are shared between the parent and child processes.
    r  Nr   )_apply_pagesz.2fzs: count pages.r  forkzUnrecognised method=r   zs: work.z	s: total.)r  r   r   rF  r7   rk   r\   r  r'   _multiprocessing_fork)r
   rb  r  r  r  r  r  rl  r  r  r  r	  rG   r   r  r   r  r  rA  	num_pagess                       r)   apply_pagesr  O`  s   p YY[K1=1fD>=#h-(E 	C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   % F((F1)
rl  r  r  r  r  r  r  r  r  r  c       
   	     d    t        ||||||	      }t        | t        j                  |||||
      S )ag  
    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  r  )r  rl  r  r  r  )r5   r  r   r  )r
   rl  r  r  r  r  r  r  r  r  r  	args_dicts               r)   r  r  `  sI    X !I MM## r*   c                     e Zd ZdZd Zed        Zed        Zed-d       Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zed        Zed        Zed.d       Zed/d       Zed/d       Zed        Zed-d       Zed        Z ed        Z!ed/d        Z"ed!        Z#ed"        Z$ed.d#       Z%ed/d$       Z&ed/d%       Z'ed/d&       Z(ed'        Z)ed(        Z*ed)        Z+ed*        Z,ed/d+       Z-d,Z. e/       Z0y)0r  zU
    We use @staticmethod to avoid the need to create an instance of this class.
    c                    t        | t        j                        rt        t	        |             S t        t        j
                               S r,   )r>   r   r   rl  r  rm  r   s    r)   _derotate_matrixzTOOLS._derotate_matrixa  s3    dEMM*$%<T%BCC$U^^%566r*   c                   t        | |      }t        | j                        |_        | j                  |_        | j                  |_        | |_        |j                  sd |_        |j                  sd |_        |j                  sd |_        |j                  sd |_	        |j                  sd |_
        |j                  sd |_        |j                  sd |_        |S r,   )r-  r  r   r  r   r  ro
  r  r  r  r  r  r  )r   r8  r  s      r)   r7  zTOOLS._fill_widgeta  s    &uf55::&jj}} FM###'F ###'F ###'F !!!%F!!!%F"""&F
r*   c                x    t        | j                        } t        | j                               }t	        |      }|S r,   )r   r   r  r
  r  )r   r  r  s      r)   r  zTOOLS._get_all_contents4a  s/    DII&txxz*!3'r*   c                    t        | d      }t        |      }t        |j                         |j	                         ||      }|S )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)   r  zTOOLS._insert_contents;a  s;     ta0$W-!'++-Qr*   c                   | j                   d   }| j                  d   }|sd}dj                  t        t        |            dz   }|r|}n| j                  d   }|sd}dj                  t        t        |            dz   }|}	|}
t        t        |	|
            }| }|	|z  }|
|z  }d	| j                  cxk  rd
k  rn nd}nd}||||||||fS )as  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)
        rY  rd  r~  r   z RG
r   r  z rg
r   r   r  r\   )r  r  r  r  r  rp  r#  rP  )r   r  r  rR  r   scscolr2  rW  np1np2r{  r  r  r  rP  s                   r)   _le_annot_parmszTOOLS._le_annot_parmsDa  s     LL!\\(#BxxC%/Bf%BBxxC%/?3,-R!G!G!!GG"aAtT722r*   c                b   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r|n|}|d| dz  fz   |z  }|d|dz  fz   |z  }d| |j                  dd|j                  dd}||j                  dd|j                  dd	z  }|t        |	      d
z   z  }||
dz   z  }|S )zaMake stream commands for butt line end symbol. "lr" denotes left (False) or right point.
        r   r   r   r  r  r  r   r  r  r"  s
Q
r  r  r  r"  r#  r   )r   r  r  r%  rR  r{  r  r  r  r   r  rW  rP  r  r  r  r	  botr  s                      r)   r  zTOOLS._le_buttja  s     /4.C.CE2rS].^+2q!QdGC1IAAr"u:~#Aqt9}"WIceeAYaay5
q	355)4((
ilV##
dXo	r*   c                   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }d|z   t         j	                  |j
                  |z  |j                  |z  |j                  |z  |j                  |z        z   }|t        |	      dz   z  }||
|z   dz   z  }|S )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
              @r   r  r   q
r"  b
Q
)
r  r  r  r  _oval_stringr  r  r  r<  r   )r   r  r  r%  rR  r{  r  r  r  r   r  rW  rP  r  r  r  r  r  s                     r)   r  zTOOLS._le_circleza  s     /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'W_u11!$$)QTTBYr	STSWSWZ\S\]]
ilV##
dTkH$$	r*   c                   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d| |j                  dd	|j                  dd
}||j                  dd	|j                  ddz  }||j                  dd	|j                  ddz  }|t        |	      dz   z  }||
|z   dz   z  }|S )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        r  r   r  r   r  r   r  r  r   r  r  r"  r  r  r   r  r  r%  rR  r{  r  r  r  r   r  rW  rP  r  r  r  r  s                    r)   r  zTOOLS._le_closedarrowa  sX    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}
b
b
bWIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
ilV##
dTkH$$	r*   c                `   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }|j                  |j
                  |j                  z
  dz  z   |z  }d| |j                  dd|j                  dd	}|j                  |j                  |j                  z
  dz  z   |z  }||j                  dd|j                  dd
z  }|j                  |j                  |j                  z
  dz  z   |z  }||j                  dd|j                  dd
z  }|j                  |j
                  |j                  z
  dz  z   |z  }||j                  dd|j                  dd
z  }|t        |	      dz   z  }||
|z   dz   z  }|S )zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        r  r   r  r   r8  r  r  r   r  r  r"  r  )r  r  r  r  r  r<  r"  r#  r  r  r   r   r  r  r%  rR  r{  r  r  r  r   r  rW  rP  r  r  r  r  r  r  s                      r)   r  zTOOLS._le_diamonda  s    /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'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##
dTkH$$	r*   c                   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d| |j                  dd	|j                  dd
}||j                  dd	|j                  ddz  }||j                  dd	|j                  ddz  }|t        |	      dz   z  }||
dz   z  }|S )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        r  r   r  r   r  r   r  r  r   r  r  r"  S
Q
r  r  s                    r)   r  zTOOLS._le_openarrowa  sS    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}
b
b
bWIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
ilV##
dXo	r*   c                   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
|d|z  dfz
  n	|d|z  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d| |j                  dd|j                  dd	}||j                  dd|j                  dd
z  }||j                  dd|j                  dd
z  }|t        |	      dz   z  }||
|z   dz   z  }|S )zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        r  r   r   r   r  r  r  r   r  r  r"  r  r  r  s                    r)   r  zTOOLS._le_rclosedarrowa  sX    /4.C.CE2rS].^+2q!QdGC1IQ!A#q\Q!A#q\!R1Q3)^rRTA2J R1Q3(]bBqD!9n
b
b
bWIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
ilV##
dTkH$$	r*   c                   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d| |j                  dd	|j                  dd
}||j                  dd	|j                  ddz  }||j                  dd	|j                  ddz  }|t        |	      dz   z  }||
|z   dz   z  }|S )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        r  r   g      @r   r   r  r  r  r   r  r  r"  r  r  r  s                    r)   r  zTOOLS._le_ropenarrowa  sX    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m!R1Q3)^rRTA2J R1Q3(]bBqD!9n
b
b
bWIbdd1XQrttAhd3
a"$$q&&
a"$$q&&
ilV##
dTkH$$	r*   c                   t         j                  | |||      \  }}}}}	}
}}dt        d|	      z  dz  }|r|n|}t        |j                  |z
  |j
                  d|	z  z
  |j                  |z   |j
                  d|	z  z         }|j                  |z  }|j                  |z  }d| |j                  dd|j
                  dd}||j                  dd|j
                  dd	z  }|t        |	      d
z   z  }||
dz   z  }|S )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  r"  r  )	r  r  r  r  r"  r#  r  r  r   )r   r  r  r%  rR  r{  r  r  r  r   r  rW  rP  rwr  r  r	  r  r  s                      r)   r  zTOOLS._le_slasha  s	    /4.C.CE2rS].^+2q!QdGc!Qi#%Ar133Q;b!##A+>ddRiddRiWIceeAYaay5
q	355)4((
ilV##
dXo	r*   c                x   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }|j                  |z  }d| |j
                  dd|j                  dd}|j                  |z  }||j
                  dd|j                  dd	z  }|j                  |z  }||j
                  dd|j                  dd	z  }|j                  |z  }||j
                  dd|j                  dd	z  }|t        |	      d
z   z  }||
|z   dz   z  }|S )zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        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)   r  zTOOLS._le_squarea  sj    /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'DD2I7)ACC7!ACC7$/DD2I
QqQt$$DD2I
QqQt$$DD2I
QqQt$$
ilV##
dTkH$$	r*   c                   d }d}| || z
  dz  z   }| || z
  dz  z   }|||z
  dz  z   }|||z
  dz  z   }	|| |z
  |z  z   }
|| |z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|	||	z
  |z  z   }|	||	z
  |z  z   }|||z
  |z  z   }|j                   dd|j                  dd}| ||
||      z  }| ||||      z  }| ||||	      z  }| ||||      z  }|S )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                    | j                   dd| j                  dd|j                   dd|j                  dd|j                   dd|j                  ddS )Nr  r   r  r  )r  r<  r  s      r)   bezierz"TOOLS._oval_string.<locals>.bezierb  sQ    cc!WAacc!WAacc!WAacc!WAacc!WAacc!WDIIr*   r  r8  r  r   r  r  )r  r  r  r  r  r  r  mor  muol1ol2or1or2ur1ur2ul1ul2r  s                      r)   r  zTOOLS._oval_stringb  s^   	J 27c/!27c/!27c/!27c/!BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$Qxqa%
fS#r""
fS#r""
fS#r""
fS#r""	r*   c                   t         r t        j                  | j                        }nd } ||       }|syd}d}d}|j	                         }t        |      D ]  \  }}|dk(  r2||dz
     dd  }t        ||dz
           }d	x||<   x||dz
  <   ||dz
  <   =|d
k(  r t        ||dz
           g}d	x||<   ||dz
  <   b|dk(  r<||dz
  | D 	cg c]  }	t        |	       }}	d	x||<   x||dz
  <   x||dz
  <   ||dz
  <   |dk(  s||dz
  | D 	cg c]  }	t        |	       }}	d	x||<   x||dz
  <   x||dz
  <   x||dz
  <   ||dz
  <    |||f}|S c c}	w c c}	w )Nc                   | j                   }t        |t        j                        sJ t        j                  |      }t        j
                  |      }	 t        j                  |t        d            }|j                  sHt        j                  |      }t        j                  |t        d      t        d      t        d            }t        j                  |      }|S # t        $ r t        r
t                Y y w xY w)Nr7  r&  r'  )r   r>   r   r   r   r  r3  r  r   r*  r  r   rg   r  rv   )r   r%  this_annot_objrT  r  r  r;  s          r)   Tools__parse_daz(TOOLS._parse_da.<locals>.Tools__parse_da6b  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 C:9C:)r+  r\   r   r  r  r~  r  r   r   r\   r  r  r   r  rG  )r  r   Tools_parse_dar   r6   r  rk  )
r   r  r  rT  r  rY  r  rZ  rC   r  s
             r)   r  zTOOLS._parse_da0b  s    &&

3C& "%(C iik ~ 	GAtt|1q5z!"~c!a%j)/11A1QqSC!Hs{c!a%j)+$&&AQqSt|),QU16AuQx66:<<A<QqS<C!Hs1Q3xs{),QU16AuQx66EGGAGQqSGC!HGs1Q3x#ac(#	& D% 
 7 7s   E	Ec                    | }t        j                  |      }t        j                  |      }t        j                  ||       y r,   )r   r   r  pdf_field_reset)r   r%  r  rT  s       r)   r  zTOOLS._reset_widgetgb  s7    
,,Z8**>:c>2r*   c                    | j                  d      }|j                  st        t        j                               S t        t        |            S r  )r
  r   rl  r   rm  r  )r   r  s     r)   r  zTOOLS._rotate_matrixnb  s>    ..%.0!!$U^^%566 !6w!?@@r*   c                    t        | |       y r,   )r  )r   r8  s     r)   r  zTOOLS._save_widgetub  s     /r*   c                   t         r!t        j                  | j                  |       y 	 | j                  }t	        |t
        j                        sJ t        j                  t        j                  |      t        d      |       t        j                  t        j                  |      t        d             t        j                  t        j                  |      t        d             y # t        $ r t        r
t                Y y w xY w)Nr7  r  r  )r  r   Tools_update_dar   r>   r   r   r|  r   r  r;  rg   r  rv   )r   r;  r%  s      r)   
_update_dazTOOLS._update_dayb  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   B?C) )DDc                      t         dz  a t         S rN  )TOOLS_JM_UNIQUE_IDr-   r*   r)   r  zTOOLS.gen_idb  s     	a!!r*   c                 ,    t        j                          y)z(
        Empty the glyph cache.
        N)r   fz_purge_glyph_cacher-   r*   r)   glyph_cache_emptyzTOOLS.glyph_cache_emptyb  s    
 	""$r*   c                    t        | |      S )z5
        Metadata of an image binary stream.
        )rk  )r	   ri  s     r)   r  zTOOLS.image_profileb  s    
  
33r*   Nc                (    | t        |       at        S )z;
        Set MuPDF error display to True or False.
        )r   r  r  s    r)   mupdf_display_errorszTOOLS.mupdf_display_errorsb  s     >#'8 ##r*   c                (    | t        |       at        S )z>
        Set MuPDF warnings display to True or False.
        )r   r  r  s    r)   mupdf_display_warningszTOOLS.mupdf_display_warningsb  s     >%)"X"%%r*   c                 "    t         j                  S )z"Get version of MuPDF binary build.)r   
FZ_VERSIONr-   r*   r)   r  zTOOLS.mupdf_versionb  s     r*   c                    t        j                          dj                  t              }| rt        j                          |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        r%   )r   fz_flush_warningsr  r  r  reset_mupdf_warnings)r	  rG   s     r)   rd  zTOOLS.mupdf_warningsb  s3     	!ii01&&(
r*   c                     t               ay r,   )r   r  r-   r*   r)   r  zTOOLS.reset_mupdf_warningsb  s     #'&r*   c                .    t        j                  |        y)z*
        Set anti-aliasing level.
        N)r   fz_set_aa_level)r   s    r)   set_aa_levelzTOOLS.set_aa_levelb  s    
 	e$r*   c                R    | t         S t        |       dz   }|dkD  rd}| d d a t         S )Nr   r  )r  r7   )r  r  s     r)   set_annot_stemzTOOLS.set_annot_stemb  s:     <##4y1}"9D9r*   c                   t        | d      }|j                  syt        j                  ||      }t        j                  |t        d            }t        j                  |      rt        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |d      }	t        j                  |	t        j                  d             t        j                  |	t        j                  d             t        j                  |	t        j                  |             t        j                  |t        d      |	        y)	Nr   r%  Fr	  r   r@  r	  T)r   r   r   r  r  r  r  r  rF  r  rE  r  r  rH  )
r%  r  rY  rT  rT  dfontsrE   rZ  dfontwarrays
             r)   r  zTOOLS.set_font_widthb  s   sQ/~~$$S$/##D(3D*EFf%##F+A1X A++FA6,,S!4$$VU->->q-AB$$VU->->u-EF$$VU->->u-EF""5(3-@A r*   c                .    t        j                  |        y)z6
        Set the graphics minimum line width.
        N)r   fz_set_graphics_min_line_width)min_line_widths    r)   set_graphics_min_line_widthz!TOOLS.set_graphics_min_line_widthb  s    
 	,,^<r*   c                    | r6t         j                  rt        j                          yt        dt               yt         j                  rt        j
                          yy)z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)r   r  fz_enable_iccr  rF  fz_disable_iccr  s    r)   set_icczTOOLS.set_iccb  sB     ""##%67GH    " !r*   c                N    | t        |       t        _        t        j                  S )z!Set / unset MuPDF device caching.)r   r  r   r  s    r)   set_low_memoryzTOOLS.set_low_memoryb  s!     >)-bH&)))r*   c                    | =t        |       t        _        t        r#t	        j
                  t        j                         t        j                  S )z Set / unset small glyph heights.)r   r  r   r  r   set_small_glyph_heightsr  s    r)   r  zTOOLS.set_small_glyph_heightsc  s8     >+/8H(--h.J.JK+++r*   c                    | =t        |       t        _        t        r#t	        j
                  t        j                         t        j                  S )zK
        Set / unset returning fontnames with their subset prefix.
        )r   r  r   r  r   set_subset_fontnamesr  s    r)   r  zTOOLS.set_subset_fontnamesc  s8    
 >(,RH%**8+D+DE(((r*   c                     t        t        j                         t        j                         t        j                               S )z,
        Show anti-aliasing values.
        )rl  r   graphics_min_line_width)r5   r   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr-   r*   r)   show_aa_levelzTOOLS.show_aa_levelc  s5    
  557--/*/*J*J*L 	r*   c                      y)z)
        MuPDF store size limit.
        Nr-   r-   r*   r)   store_maxsizezTOOLS.store_maxsize"c       r*   c                t    | dk\  rt        j                          y| dkD  rt        j                  d| z
         yy)z7
        Free 'percent' of current store size.
        rt  r   N)r   fz_empty_storefz_shrink_store)percents    r)   rv  zTOOLS.store_shrink*c  s8    
 c>  "Q;!!3=1 r*   c                      y)z+
        MuPDF current store size.
        Nr-   r-   r*   r)   
store_sizezTOOLS.store_size6c  r%  r*   c                    | =t        |       t        _        t        r#t	        j
                  t        j                         t        j                  S )zA
        Set ascender / descender corrections on or off.
        )r   r  r   r  r   set_skip_quad_correctionsr  s    r)   unset_quad_correctionszTOOLS.unset_quad_corrections>c  s8    
 >-1"XH*//0N0NO---r*   r  r,  r+  r,   )1r/   r0   r1   r`  r  r4  r7  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd  r  r  r
  r  r  r  r  r  r  r"  r$  rv  r+  r.  r  r  fitz_configr-   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                     t        j                          t        j                  d        t        j                  d        y r,   )r   r  fz_set_warning_callbackfz_set_error_callbackr-   r*   r)   _atexitr3  fc  s*    		!!$'	%r*   	_wxcolorsr	  c                     t         S )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_dictr8  c  s	     Or*   c                     t         S )z
    Returns list of (name, red, green, blue) tuples:
        name: upper-case name.
        red, green, blue: integers in range 0..255.
    r4  r-   r*   r)   colors_wx_listr:  c  s
     r*   c                2   ddl }t        dt               t        j                  j                  t         d      }| d}|j                         dk(  r| d}n|}t        d       t        d	|       t        d
|       t        j                  j                  |      sJ d|d       t        j                  j                  |      sJ d|d       |j                         dk7  r)| r&t        d|dt         d       t        j                  d      dd }dj                  |      }d| d}t        d|d       t        j                  |      D ]  }t        j                  ||      }|s| d|j                  d       }	t        j                  j                  |	      st        j                  j!                  |	      r$t        d|	d       t        j"                  |	       t        d|	 d|        t        j$                  ||	        ||fS )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=r-  zRemoving existing link pfrom=zCreating symlink: z -> )r  r'   r  rd   r
   normpath__file__systemrl  r6   r  rm  rr  r  rs  islinkr  r3  symlink)

make_linksr  r  mupdf_include	mupdf_libregex_suffixmupdf_lib_regexleafr{  pfroms
             r)   _mupdf_develrJ  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$+Qqwwqzl3 77>>%(BGGNN5,A8%;<IIe$(tD6:;

4'	( )##r*   )r  )r  c                      e Zd Zy)FitzDeprecationNrJ  r-   r*   r)   rL  rL  c  s    r*   rL  c                    t        j                  dt               dd} | t         _        dd} |t        dd        |t        d        |t        dd	        |t        d
        |t        d        |t        dd        |t        d        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        d        |t        dd        |t
        d        |t
        dd        |t        d        |t        d        |t        dd         |t        d!        |t        d"        |t        d#d$        |t        d%d&        |t        d'd(        |t        d)d*        |t        d+d,        |t        d-d.        |t        d/d0        |t        d1d2        |t        d3        |t        d4        |t        d5        |t        d6        |t        d7        |t        d8d9        |t        d:d;        |t        d<d=        |t        d>        |t        d?        |t        d@dA        |t        dBdC        |t        dDdE        |t        dF        |t        dG        |t        dHdI        |t        dJ        |t        dKdL        |t        dMdN        |t        dO        |t        dP        |t        dQ        |t        dR        |t        dS        |t        dT        |t        dU        |t        dV        |t        dW        |t        dX        |t        dYdZ        |t        d[        |t        d\d]        |t        d^d_        |t        d`da        |t        db        |t        dc        |t        dd        |t        de        |t        dfdg        |t        dh        |t        di        |t        dj        |t        dkdl        |t        dm        |t        dn        |t        do        |t        dp        |t        dqdr        |t        ds        |t        dsdt        |t        du        |t        dv        |t        dw        |t        dx        |t        dy        |t        d        |t        d        |t        dz        |t        d{d|        |t        d}d~        |t        dd        |t        dd        |d dd        |d dd        |d d        |d dd        |d dd        |d dd        |d dd        |d d        |d d        |t        dy        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        dd        |t        d        |t        dd«        |t        dë        |t        d        |t        ddū        |t        d
        |t        dƫ        |t        dǫ        |t        d        |t        dd        |t        dȫ        |t        dɫ        |t        dʫ        |t        d˫        |t        d̫        |t        ddΫ        |t        dϫ        |t        dЫ        |t        ddҫ        |t        ddԫ        |t        dի        |t        d֫        |t        d׫        |t        dث        |t        ddګ        |t        ddܫ        |t        dݫ        |t        dd߫        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        dd        |t        dd        |t        dd        |t        dd        |t        dd        |t        d        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        dd        |t        dd        |t        d        |t        dw        |t        d        |t        ds        |t        dsdt        |t        du        |t        dv        |t        dw        |t        dx        |t        d        |t        d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d        |t         d˫        |t         d̫       y (   Noncecategoryc                    t        j                  | ||||      }|j                  d      }|dk  rt        |       y ||d  j	                         d   dd  }t        |       y )N)ro   rL  r   rG  )warningsformatwarningr   r'   r  )r   catrf   rh   ra   ro   r   rn  s           r)   showthisz!restore_aliases.<locals>.showthisc  sa    %%c3&tLII'(q5IABx""$Q'+D	r*   c                x     t         j                  t            s0dd}D ]'  }|dk(  rd}|r|j                         z  d}#|z  ) t	               t	         d      rJ d  d        t              r- fd}t         |       d	 d
j                   |_        yt                y)a  
        Adds an alias for a class_ or module item clled <class_>.<new>.

        class_:
            Class/module to modify; use None for the current module.
        new_name:
            String name of existing item, e.g. name of method.
        legacy_name:
            Name of legacy object to create in <class_>. If None, we generate
            from <item> by removing underscores and capitalising the next
            letter.
        Nr\   Fr  Tzclass z already has c            	     ^    t        j                  dd d dt                | i |S )Nz"legacy_name=z" removed from z after v1.19.0 - use "z".rO  )rR  rQ  rL  )r  r  class_legacy_namenew_name
new_objects     r)   deprecated_functionz<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". ***
)rH
  modulesr/   r.	  r   r  rO  r`  )rX  rZ  rY  capitalise_nextr  r\  r[  s   ```   @r)   _aliaszrestore_aliases.<locals>._alias d  s     >[[*FK#O %8&*O$1779,K&+O1$K% fh/
FK6c&VaUb8cc6Z 4 V[*=>QRZQ[[c!))*,  '
 V[*5r*   r  fileGetr  r  soundGetr  r  r  getTextPager.  rV  setBlendModera  ro  rr  r  r  r  r  setOCr  r  r  fileUpdr  r  r  convertToPDFr  r  r  deletePageRanger  embeddedFileAddr  embeddedFileCountr  embeddedFileDelr  embeddedFileGetr  embeddedFileInfor  embeddedFileNamesr  embeddedFileUpdr  r  r  r  r<  rY  getOCGsrn  getPageFontListrq  getPageImageListr~  r  r  getPageXObjectListr  getSigFlagsr  getToCr  r  r  	insertPDFr  r  	isFormPDFr  isPDFr  r  r  r  r$  r2  r  r  rI  r  rP  pageCropBoxr`  rp  
PDFCatalogr*  
PDFTrailerrr  previousLocationr  r!	  r  r	  r	  setToCr	  rr  r
	  r	
  isStreamrb  rq  r		  r

  r-
  metadataXMLrn  getRectArearS  rT  r  r  r  r@  rC  	preRotaterH  preScalerJ  preShearrN  preTranslater  	getPDFnowrW  	getPDFstrr9  getTextlengthr  ImagePropertiesrP  	PaperRectrO  	PaperSizerR  r(  r   r  r  r  r  r  r
  r  r  r  r  r  r  r  r!  r#  r&  r(  r  rO  r  rm  CropBoxPositionrp  r	  r  rg  r  r  r  r  r  r  r  rC  r  r  r  r  r  r  r	  r  getDisplayListr  r  getFontListr+  r  getImageListra  r:  getSVGimager@  rD  rW  r|  r  r&  rE  rh  
_isWrappedr1  r  ra  r  r  MediaBoxSizerB  r  rN  r 	  r  
setCropBoxr  setMediaBoxr  rn  showPDFpagerf  r  ri  r  rs  rP  
copyPixmaprK  rP  invertIRectrv  pillowWritery  
pillowDatar  
writeImagewritePNGr  r  setResolutionr  r  r  r  getImageData
getPNGData
getPNGdatar  r.  r[  r	  r,   )rR  filterwarningsrL  showwarningr   r  r   r  r
  rp  rE  r   r  r  r  r  r  )rU  r_  s     r)   restore_aliasesr  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 r  l        z-bit).
)r\   r   r_
  r  )r   r   r   r   r   N)r  typing.Sequencer0
  r   )r  mupdf.PdfObjr  r4   )r%  zmupdf.PdfDocumentr  r  r  r4   )strict)r  r1  )r   r   r   r  r0
  r   )r%  r   r  r4   r0
  r   )r	  rA
  r0
  r   )r  rA
  r0
  r   )r  rA
  )r<  rA
  r0
  r   )r  rA
  r0
  r   )r  z&typing.Union[list, tuple, float, None]r  r  r0
  r  )r%  r   r  r  )
r   r  r0  ztyping.Union[list, tuple, None]r"  r   r  r4   r0
  r  )rn  r  r0
  r  r,   )
r  r  r  r/  rZ  AnyTyper   r/  r0
  r  )rB
  r  r   )
r   r  r   r  r   rk  r  r4   r0
  rk  )r  r9
  r0
  r5   )r  r   r  r   r0
  rp  )r
  )rZ  r  rf   r/  )rZ  r  )r   r  r0
  r4   )r   r  r   z'Annot'r0
  r  r2
  r-  )r  r   r  r   r  r   r0
  r   )r   r  r0
  r4   )rr  r   r   )r   r   rQ  r4   r  r4   r0
  r   )rn  r  r0
  r  )rn  r  r0
  r   )r   r  rT  z'Font'r0
  r  )r  r4   r0
  r   )r
  r4   r0
  r  (  r`  
__future__r   atexitr(  collectionsr  importlib.utilr   rb   r9   r
  rd   rj  rr  r	  rH
  ru  r  rF
  rR  r  rp  r\   r   rH   r}   r8   r  rW   rZ   r   rM   rP   rN   rR   rT   rX   r[   r'   rr   rv   r  r  r	  r$
  r   r   r  r  r   r  r   __annotations__r   r   r   r   r?  	machinerySourceFileLoaderload_moduler
  r
  r   rg   r;   r   reinit_singlethreadedr   _buildr   r   r   r   r   r   r   r   r  r  pymupdf_dater   r6   rS  FZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHversionVersionFitzVersionBindVersionDater   format_gr9
  r  r  rZ  r  Optionalr;
  r5   r=
  rk  r0  Unionr4   r?
  Sequencer1  r  r/  r   r   r   r   r   r   r   r   r   r  r   r6  r  r  r  r  FzDocument_insert_pdfr  r   r:   rM
  r)  r  r
  rp  rS  r}  r
  r6  r  rE  r  r   r  r  r  r  r  rg  r   r  r  r]  r/   _selfr.
  rB   r  _valuer3   rO  
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Anyr  Base14_fontnamesrm
  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	  rS  rY  rX  rv  rV  rt  ru  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_SUPERSCRIPTrQ  rR  rS  rT  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLFZ_STEXT_PRESERVE_LIGATURESr	  FZ_STEXT_PRESERVE_WHITESPACEr	  FZ_STEXT_PRESERVE_IMAGESr  FZ_STEXT_INHIBIT_SPACESTEXT_INHIBIT_SPACESFZ_STEXT_DEHYPHENATEr	  FZ_STEXT_PRESERVE_SPANSTEXT_PRESERVE_SPANSFZ_STEXT_MEDIABOX_CLIPr	  $FZ_STEXT_USE_CID_FOR_UNKNOWN_UNICODE TEXT_USE_CID_FOR_UNKNOWN_UNICODEFZ_STEXT_COLLECT_STRUCTURETEXT_COLLECT_STRUCTUREFZ_STEXT_ACCURATE_BBOXESTEXT_ACCURATE_BBOXESFZ_STEXT_COLLECT_VECTORSTEXT_COLLECT_VECTORSFZ_STEXT_IGNORE_ACTUALTEXTTEXT_IGNORE_ACTUALTEXTFZ_STEXT_SEGMENTTEXT_SEGMENTFZ_STEXT_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  r  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_SoftLightrT  r   r
  r  r  r  r  r  r  dictkey_ascr  r  r  r  r  r  r  r  r  r  r  
dictkey_dar(  r  dictkey_descr  dictkey_effectr  r  r0  r  r  r  dictkey_glyphr  r  rh  r  r  r  r  r  r  r  r  r=  r  r  r  r/  r)  r  r   r  r  r  r  r  r   r  r  rk
  r  r  rP  rj
  r  r  r	  r4  r3  rm  r  r  re  r  r  r  r  rH  r  r0  rE  r  r  r"  r  r9  r  r_  r  r  r   r  r  r  r  r_  rD  r  r  r|  r  rU  rN  rl  r:  r5  r<  r  r  r  rd  rN  r  r  r  r  r"
  r  r  r  r  r  r  r]  r^  r
  r  r  r  r  r  r  r  r*  rK  r.  r6  rn
  r
  r  r  r-  r  r4  r?  r  r)  r  rZ  r_  r`  rk  r"  r  r  r?  r  r  r  r  r  r  r  r  r  r  r  rf  r  r  r  r  r	  r  r  r
  r7  r  r,  r  r	  r  r'  rS  rl  r  r^  rb  r8  r  r  r  r	  r  r  r5  rU  r  r&
  r/	  rk  r  r  r4  r  r   r$  r  r%  r(  r  r!  r&  r3  r#  r  MSG_BAD_DOCUMENTMSG_BAD_FILETYPEMSG_BAD_LOCATIONr  r	  r!  rE  r1  r	  r  r
  r  MSG_COLOR_COUNT_FAILEDr>  r  r  r  r  r	  r  r|  r  rF  r  r  rl  rQ  r1  r  r  ra  r  r  r  r[  r  r5  r  r  rP  r  r  rW  rd  r  r9  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r7  r>  r@  rC  FzPathWalker2rE  r;  rk  ro  rr  ru  rx  rz  r|  r  r  r  r  r  r  r  r(  PdfFilterOptions2r  	FzDevice2r  	FzOutput2r  rn  r  rJ  r  r  r  r  r  r  r  r  r=  r  r  r  r  r  r
  r
  r  r  rL  rz  r  r  ru  rD  rq  r  r  rs  r:  r5  r  r,  r#  r  r>  r  rP  rO  rR  rJ  r  rg  r  r   r  r  r  r9  rb  rm  rq  r
  rE  r  r  r  r1  r2  r3  registerr5  r7  r   r  r  r
  r8  r:  rJ  r  recover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadr  DeprecationWarningrL  r  __version__rI
  r  maxsize)rZ  s   0r)   <module>rH     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-.###%E! # & $ # # )   &    -2E2Ec2JKQgaj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*  	
Z< Z<z*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 ;|g: g:Tu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3 	2ME6 89##$45 E5&1	22 )*--).)))* ++), 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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*h  $$4D Hf/$N,6 ">2D2N)(6
p2/dH@4$)X,     ! 	1 ffJ =@{# {#~ !E!!"23E/(&    	 6 3MD!QeQsUAcE2HTZZ\3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 G\  H LN  0"Z/J0J]  sM   5AJ <AJ:AJ 	AAJ* J	AJJAJJAJ'J&AJ'J*	AJ7J6AJ7