
    Bi                    %   U d 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lZddddddddddd
dZ eej                            d          ej                  a eej                            d	          ej                  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$dddZ%dedZ&d Z' e(ej)        dz    e*d          z             Z+d Z,d Z- e-dd          Z. e,dd          Z/ G d d          Z0 e0            Z1dZ2ej3        ej4                 e5d<   da6d Z7d Z8ej                            d           Z9e9z e%e: d!e9d"            e%e: d#ej        d$                     e9dk    rddl9Z9n1ddlZej;        <                    d%e9          =                                Z9e9j>        j?        j@        Z@nA	 dd&lm@Z@ n# eA$ r ddl@Z@Y nw xY w eBe@d'          r e@jC                      e@jD                     d( ZEdd)lFmGZG dd*lFmHZH dd+lFmIZI dd,lFmJZJ dd-lFmKZK dd.lFmLZL dd/lFmMZM dd0lFmNZN e@jO        ZPdZQ eRd1 ePS                    d2          D                       ZTeTe@jU        e@jV        e@jW        fk    s"J d3eTd4e@jU        e@jV        e@jW        f            eKePdfZXePZYeKZZdZ[d5d6d7Z\e\Z]	 ej^        Z^n# e_$ r e`eaz  ebz  Z^Y nw xY wej3        e^         Zcej3        ed         Zeej3        ef         Zgejh        eidf         Zjej3        ejk                 Zlej3        em         Znd8Zod9Zpd:Zqd;Zrd<Zsd=Ztd> Zudfd?Zvd@ ZwdfdAZxdB ZydZz G dC dD          Z{ G dE dF          Z| G dG dH          Z} G dI dJ          Z~ G dK dL          Z G dM dN          Ze/rej        Z G dO dP          ZeZ G dQ dR          Z G dS dT          Z G dU dV          Z G dW dX          Z G dY dZ          Z G d[ d\e          Z e            Z G d] d^          Z G d_ d`          ZddalmZ  G db dc          Z	 	 	 	 	 	 dgddZ G de df          Zo G dg dh          Z[p G di dj          Zp G dk dl          Z G dm dn          Z G do dp          Z G dq dr          Z G ds dt          Z G du dv          Z G dw dx          Z	 ej        e         Z	 e@j                                        D ]=\  ZZe                    dy          r#e                    dz          r0 eeee           >	 de@j        z  e@j        z  e@j        z  e@j        z  e@j        z  e@j        z  Ze@j        dk    sJ ee@j        k    sJ ee@j        k    sJ [[[ej        Zd{Zi ZeD ]Zeee                                <   d|ed}<   d~ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dZdZdZdZdag adadae@j        Ze@j        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
eTdk    r?e@j        Ze@j        Ze@j        Ze@j        Ze@j        Ze@j        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Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:d d d d d d d dÜZ; G dĄ dŐe<          Z= G dƄ dǐe<          Z> G dȄ dɐe=          Z? e~e(          Z@ e~e)          ZA e~e*          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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Zw	 ddlxmyZymzZz  eyj{                    Z|e|}                                D ]Z~eze~         e|e~         d <   [y[zn# e$ r i Z|Y nw xY w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ejk        deRfdZdejk        deRf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d? Zd@ ZdAe@j        dBeifdCZdDe@j        dAe@j        dBeif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 ZdaԐ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Z&dZ'dZ(dZ)dZ*dZ+dŐZ,dZ-d Z.dhdZ/delfdZ0deodemdeRfdZ1dDedeidefdZ2dej        deRfdZ3dej        de4fdZ5dej        fdZ6dej        de4fdZ7dej        de4fdZ8dejh        eeRefdf         demdemfdZ9d Z:dÄ Z;dDedejk        fdńZ<dƄ Z=dǄ Z>dȄ Z?dɄ Z@demdejh        eeRdf         dːe4deidemf
d̈́ZAdemdemfdτZBdidЄZCddddќdemdendedendemf
dՄZDdjdemdemdefdeideff
d؄ZEde^dedfdڄZFdۄ ZGd܄ ZHd݄ ZI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 G d de@jZ                  Z[d Z\d Z]d Z^d Z_d Z`d Zad Zbd Zcd Zdd Zed Zfd Zgd Zhd Zid Zjderd erdefdZk G d de@jl                  Zm G d de@jn                  Zo G d de@jp                  Zqd Zr G d	 d
e@jn                  Zs G d de@jn                  ZtdkdemdenfdZudemfdZvddfdeifdZwdldZxd Zyd Zzd Z{d Z|d Z}demfdZ~ G d de          Zd Zdmderderdetdefd Zdemdeifd!Zd" Zdndetd$eid%eidef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d0 Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zd8 Zd9 Zd: Zdemdefd;ZdemdeRfd<Zd= Zd> Zded?Zdod@ZdAeideRfdBZdAeideRfdCZdD ZdE ZdF ZdZdZdZdZdGeidemfdHZdI ZdJ ed            ddJ ed            ddKdd
dL	dMZddKdddddd
dd
dN
dOZ G dP dQ          Ze9s$ e@j        e            e@j        e           dR Z ej        e           ddSlmZ ej        Z ed            ZeD ]6\  ZZZZedTz  edTz  edTz  fee                                <   7dU ZdV ZdfdWZddXlmZ ej        Zej        Zej        Zej        Zej        ZddYlmZ eeo_         G dZ d[e¦          ZÐd\ Z	 eZZŐd]eZ d^eY d_ej        d          d2ej        d          d`ej         daej        dbk    rdnd dcZ dS (p  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   )extra
textfdstreampathpath_append	pyloggingpylogging_loggerpylogging_levelpylogging_namedefaultc        
         b   | D|                      d          rt          | dd                   }n|                      d          r| dd         }n|                      d          r| dd         }n|                      d          rd}t                      }
| d	d                             d
          }|D ]F}|s|                    dd          }t	          |          dk    sJ d|d            |\  }}||
|<   G|
                    d          t                    |
                    dd          }nJ d| d            |t          j        |dd          }n|'t          |d          sJ t          |d          sJ |}n|t          j        |d          }n|t          j        |d          }nr	 ||gddl	}|d}|
                    |          t          |j                  sJ                                  G fdd          } |            }n|	}|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dS )_make_output.<locals>.Outc                 f    |                     d          }|r                    |           d S d S )N
)rstriplog)selfr   r   r   s     h/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/pymupdf/__init__.pyr   z_make_output.<locals>.Out.write   sG     {{4(( @$(($?????@ @    c                     d S N r'   s    r(   r   z_make_output.<locals>.Out.flush   s    r)   N)__name__
__module____qualname__r   r   )r   r   s   r(   Outr"      sH        @ @ @ @ @ @    r)   r1   )
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;   r1   s         ``           r(   _make_outputrG   ,   s   f ??5!! 	\T!""XBB__W%% 	\8DD__W%% 	\qrr(KK__Z(( 	\IffGHNN3''E   ZZQ''2ww!|||%<D%<%<%<|||1

%kk'22O*"%o"6"6$[[;;NN[[SW[[[[[[	~gbsE222		vw'''''vw'''''		gdC  		 gk3''$+*)#%!*&00@@*GN;;;;;".@@BBO		 		 		 		 		 		 		 		 		 		 		 ceeJr)   PYMUPDF_MESSAGE)r   r   PYMUPDF_LOGFc                      t           S r+   _g_log_itemsr,   r)   r(   
_log_itemsrM      s    r)   c                 
    | a d S r+   )_g_log_items_active)actives    r(   _log_items_activerQ      s     r)   c                      t           d d = d S r+   rK   r,   r)   r(   _log_items_clearrS      s    QQQr)   	r   r   r   r	   r
   r   r   r   r   c        	         B    t          | ||||||||t          
  
        adS )zO
    Sets destination of PyMuPDF messages. See _make_output() for details.
    r   N)rG   _g_out_messagerT   s	            r(   set_messagesrW      s:      "#-+)"  NNNr)   c        	         B    t          | ||||||||t          
  
        adS )zh
    Sets destination of PyMuPDF development/debugging logging. See
    _make_output() for details.
    r   N)rG   
_g_out_logrT   s	            r(   set_logrZ      s:    " #-+)  JJJr)    c                    	 t          j        d          }||         }	 t          j                            |j                  }n# t          $ r
 |j        }Y nw xY w|j        }|j        }| d| d| d|  } n# t          $ r Y nw xY wt          rt                              |            t          rt          | t          d           dS dS )z0
    For development/debugging diagnostics.
    r   )context:z(): r   filer   N)inspectstackosr	   relpathfilename	ExceptionlinenofunctionStopIterationrO   rL   appendrY   print)r   callerrb   frame_recordre   linerh   s          r(   r&   r&      s
   9a((( V}	-w|'<==HH 	- 	- 	-#,HHH	-"(88T88H88$88      "D!!! .d1------. .s"   A8 $A AA8
BBc                 F    t           rt          | t           d           dS dS )z
    For user messages.
    r   r_   N)rV   rk   r   s    r(   messagerq     s1      2dq1111112 2r)   c                  n    dd l } t          d           t          |                                            d S )Nr   zexception_info:)	tracebackr&   
format_exc)rs   s    r(   exception_inforu     s=    	r)   z
()<>[]{}/%c                     t           j                            |           }||}n"|dk    rd}n|dk    rd}nJ d|  d|            ||k    rt          d	|  d|           |S )
}
    Returns `True`, `False` or `default` depending on whether $<name> is '1',
    '0' or unset. Otherwise assert-fails.
    N1T0Fr   zUnrecognised value for : Using non-default setting from )rc   environr7   r&   r   r   rE   rF   s       r(   get_env_boolr~     s    
 	
Ay	
c	
c99D99A99999
g~~;d;;a;;<<<Jr)   c                     t           j                            |           }||}nt          |          }||k    rt	          d|  d|            |S )rw   Nr{   rz   )rc   r|   r7   r3   r&   r}   s       r(   get_env_intr   -  s[    
 	
Ay!ff
g~~9d99a99:::Jr)   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                       e Zd Zd ZdS )_Globalsc                 >    d| _         d| _        d| _        d| _        d S Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsr-   s    r(   __init__z_Globals.__init__H  s(    !"#$  !%&"""r)   Nr.   r/   r0   r   r,   r)   r(   r   r   G  s#        ' ' ' ' 'r)   r   _get_layoutc                  
    da dS )z:For users who never want to see the layout recommendation.FN)_recommend_layoutr,   r)   r(   no_recommend_layoutr   V  s     r)   c                      d} 	 	 t           rQt          Lt          j        d          dk    r6t          j                            d          st          |            da dS dS dS dS dS )z;Check if we should recommend installing the layout package.zVConsider using the pymupdf_layout package for a greatly improved page layout analysis.r   NPYMUPDF_SUGGEST_LAYOUT_ANALYZERry   zpymupdf.layoutF)r   r   rc   getenv	importlibutil	find_specrk   )msgs    r(   _warn_layout_oncer   \  s    dC 	
""  I788C?? (()9:: @
 	c


!" "   @???r)   MUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATHmupdf_cppyy)mupdfinternal_check_ndebugc                 j    |                      d          }|dk    r
| d|         } t          |           S )z<
    Converts string to int, ignoring trailing 'rc...'.
    rcr   N)findr3   )r   r   s     r(   _int_rcr     s5     
4B	QwwCRCyt99r)   )mupdf_location)pymupdf_git_branch)pymupdf_git_diff)pymupdf_git_sha)pymupdf_version)pymupdf_version_tuple)swig_version)swig_version_tuplec                 ,    g | ]}t          |          S r,   )r   .0is     r(   
<listcomp>r     s    KKKQgajjKKKr)   r   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   rF   rE   s       r(   r   r     sp     %$'' 2 	) 	)A s
9QC((((CC
%c5111r)   Page_forward_declPoint_forward_declmatrix_like
point_like	quad_like	rect_likec                 F   t          | t                    r| j        rt          d          | j        } t          | t
          j                  r| S t          | t
          j                  r|                                 S | 
J d            J dt          |                       )zz
    Returns document as a mupdf.FzDocument, upcasting as required. Raises
    'document closed' exception if closed.
    document closedNr   document is NoneUnrecognised type(document)=)
r=   Document	is_closed
ValueErrorthisr   
FzDocumentPdfDocumentsupertype)documents    r(   _as_fz_documentr     s    
 (H%% ! 	0.///=(E,-- 4	He/	0	0 4~~		%%%%%33$x..33333r)   c                 `   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   Nr   r   r   )
r=   r   r   r   r   r   r   r   
m_internalr   )r   requiredrF   s      r(   _as_pdf_documentr     s     (H%% ! 	0.///=(E-.. 
4	He.	/	/ 4)) 	">!!!
		%%%%%33$x..33333r)   c                    t          | t                    r| j        } t          | t          j                  r|                                 S t          | t          j                  r| S | 
J d            J dt          |                       )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    Nr   page is NoneUnrecognised type(page)=)r=   Pager   r   PdfPager   FzPager   pages    r(   _as_fz_pager     s     $ y$&& 0zz||	D%,	'	' 0	!/!!!//$t**/////r)   c                 4   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.
    Nr   r   r   )	r=   r   r   r   r   r   pdf_page_from_fz_pager   r   )r   r   rF   s      r(   _as_pdf_pager     s     $ y$&& 
0	D%,	'	' 0)$// 	">!!!
	!/!!!//$t**/////r)   c                 Z    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   4  s2     &&D? ;9:::Kr)   c                   N   e Zd Zd Zd Zd Zd Zd Zd ZdLdZ	dMdZ
ed             Zed             Zed             Zed             ZdNdZed             Zd Zed             Zed             Zd Zd Zd ZdOdZd Zd Zd ZdPd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,dQd.Z-dRd/Z.d0 Z/dSd1Z0d2 Z1dTd3Z2d4 Z3d5 Z4dLd6Z5d7 Z6d8 Z7d9 Z8d: Z9dLd;Z:ed<             Z;	 	 	 	 	 	 	 	 	 dUd>e<d?e=d@e>dAe<dBe?dCe?dDe?dEe@dFeAfdGZBdVdHZCeDdI             ZEedJ             ZFedK             ZGd
S )WAnnotc                 L    t          |t          j                  sJ || _        d S r+   )r=   r   PdfAnnotr   r'   r   s     r(   r   zAnnot.__init__K  s%    5%.11111			r)   c                 d    t          | dd          }d| j        d         dt          |          S )Nparentz<>'r   z' annotation on )getattrr   str)r'   r   s     r(   __repr__zAnnot.__repr__O  s2    x..*.)A,,,FDDr)   c                 *    |                                  S r+   )r   r-   s    r(   __str__zAnnot.__str__S  s    }}r)   c                 :    t          | dd          r	d| _        d S d S )NthisownF)r   r   r-   s    r(   _erasezAnnot._eraseV  s+    4E** 	! DLLL	! 	!r)   c                    | j         }t          j        |          t          j        k    rd S 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"          <   n&# t$          $ r t&          rt)                       Y d S w xY w|}|s|S | j        |d<   t,                              |           \  }}	}
||d<   |	|d	<   |
|d
<   | j        d         }||d<   |S )NROzIgnoring redaction key '/RO'.OverlayTextr[   Qr   rect
text_colorfontnamefontsizefill)r   r   pdf_annot_typePDF_ANNOT_REDACTr4   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_alignrf   g_exceptions_verboseru   r   TOOLS	_parse_dacolors)r'   r   valuesobjxrefr   alignvalr   r   r   r   s               r(   _get_redact_valueszAnnot._get_redact_valuesZ  s   	&&%*@@@F	%e&9%&@&@$GGC~ , ?@@@',,'+|$%e&9%&@&@-PPC~ */44'8'>'>|$$')|$$U%8%?%?#OOCE~ .(--$)F=!! 	 	 	#8(8(8(8FF	  	JiF).)>)>&
Hh&L"J"J{6"F
s   DE E98E9c                    t           rSt          | 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'   rF   rresr   	annot_objaps          r(   _getAPzAnnot._getAP  s     	ty%.99999#DI..CsE*****JACIEuen55555+U33I$i$#OOB"B'' 1+R00 *s~ *$S))Hr)   r   c                    	 | 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          |                                ||d           |rGt          j        |t          d                    }t          j        |t          d          |           d S d S # t"          $ r t$          rt'                       Y d S Y d S 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_rectrf   r	  ru   )	r'   buffer_r   r   r  r   apobjr  bboxs	            r(   _setAPzAnnot._setAP  sX   	9IE+U33I"5))D'HTNNHSMMRRE# 1"K000&.. 1"K000$g..C> 2 .111dhhjj%a888 H.	8F;K;KLL'0@0@$GGGGGH H  	9 	9 	9#8(8(8(8(8(8(8888	9s   D2D8 8EENc                 
   | j         }|j        sJ t          j        |          }t	          |          }|                                }t          j        |          }	t          |          \  }
}	 |
dk    s;|	t          j        t          j	        t          j
        t          j        t          j        fvr#t          j        |t          d                     n#|
dk    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k    rt          j        ||d |
                    n}|
dk    rwt          j        |                                |
          }t3          |
          D ]}t          j        |||                    t          j        |t          d          |           t          j        |           t          j        |           d|_        n:# t>          $ r-}t@          rtC                       tE          d|             d }~ww xY w|dk     s|dk    r|sdS 	 t          j#        t          j        |          t          d          t          d                    }|j        stI          tJ                    t          j&        |t          d	                    }|j        s#t          j'        |t          d	          d
          }t          j(        |                                d          }|dk    ro|dk     rit          j)        |t          d          |           t          j)        |t          d          |           t          j)        |t          d          |           |rFt          j*        |t          d          |           t          j*        |t          d          |           t          j&        |t          d                    }|j        s#t          j'        |t          d          d
          }t          j        |t          d          |           n:# t>          $ r-}t@          rtC                       tE          d|             d }~ww xY wdS )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_requiredrf   r	  ru   rq   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colr   er   	resourcesalp0extgs                       r(   _update_appearancezAnnot._update_appearance  s   	'//	u%%hhjj$e,,+J77t1	 zzU**(-++   "Ix~~>>>>2E4<HHH$kkqJ)*-3'(-+*)(   
 N&y(82D2DfMMM 111199-eT&5&\BBB)$((**e<< < <A-c47;;;;"9htnncBBB!%((("5)))#$C   	 	 	# !   0Q00111		 aKK7a<<<4 	$'..TNNSMM B
 = 1"K000*B0E0EFFI' S!3R+9N9NPQRR	%txxzz155D!||!'x~~wGGG'x~~wGGG'HTNNGLLL P'x~~zJJJ'HTNNJOOO%y(;2G2GHHD? U.	8K;P;PRSTThsmmT:::: 	 	 	#8(8(8(8?A??@@@	
 ts2   /HJ 
J<(J77J<G<S 
T(S??Tc                    t          |            | j        }t          j        |          }t          j        |t          d          t          d                    }|j        s1t          t          j        t          j        j	                            }n1t          j
        |t          d                    }t          |          }t          |          |                                 j        z  }||                                 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	'..	 HTNNHSMMJJ} 	(!%,u|/J"K"KLLCC*2x/?/?@@D!$''C3ii$//++AAt  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)re  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Matrixrf   r	  ru   )r'   r   r   matr  s        r(   
apn_matrixzAnnot.apn_matrix  s    	IEeU^44444$'..*) B
 = ;()9)9:::+B0JKKC#C((C++CJ 	 	 	#8(8(8(8	s   BC >C !C7c           
         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
        |          rt          j        |          }t          |          D ]w}	t          j        ||	          }
t          j        |
t          d                    dk    r:t          t          j        t          j        ||	                              }|c c S x|S )zannotation BlendModer7  Nr  r  r4  r8  r   )re  r   r   r   r  r  r   r  pdf_to_namer  pdf_is_dictpdf_dict_lenrK  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r'   r   r  r  rV  rD   r   obj1mjobj2s              r(   	blendmodezAnnot.blendmode4  s    	D	'..	 HTNN;;
> 	*5+<S+A+ABBJ!%%%%  S!! 
	."3''A1XX . .-c155$T** .*400A"1XX . .$5dA>> +D(4..AAQFF):5;LUMcdhjkMlMl;m;m)n)nJ#------ G r)   c                 L   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   )re  r   r   r<  rC  rE  r=  r>  r?  r;  r4   r   r   JM_annot_border)r'   atypeaorF   s       r(   borderzAnnot.borderT  s     	D	!&)#$)'&   66M ++b!!
r)   r   c                     t          |            | j        }t          j        t          j        |                    }t          ddd|          }t          j        |||           dS )z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)re  r   r   pdf_get_bound_documentr   _make_PdfFilterOptionspdf_filter_annot_contents)r'   r  r   rY  filter_s        r(   clean_contentszAnnot.clean_contentsg  sd    D	*5+>u+E+EFF(1AX`aa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.)
re  r   r=   r   r   JM_annot_colorsr   rf   r	  ru   r   s     r(   r  zAnnot.colorso  s|    	IEeU^44444"5#6u#=#=>>> 	 	 	#8(8(8(8	s   AA !A6c                    t          |            | j        }t          j        |          }t	          |          }	 t          |          }|snt          j        ||           (t          j        |t          d                     t          j	        |
                                t          d                    }t          j        |          }d}t          |dz
  dd          D ]m}t          j        ||          }	t          j	        |	t          d                    }
|	j        sAt          j        |
|          st          j        ||           d}n|r7t          j        |
                                t          d          |           dS dS )z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   r0  ParentN)re  r   r   r   r   JM_find_annot_irtpdf_delete_annotr@  r  r  r  pdf_array_lenrK  pdf_array_getr   r}  pdf_array_deleterM  )r'   r   r  r   	irt_annotannotsrD   foundr   ops              r(   delete_responseszAnnot.delete_responses{  s   D	'..	u%%	4)%00I "4333		4
 	9hw&7&7888#DHHJJ0B0BCC''qsB## 	 	A#FA..A"1hx&8&899A< #Ay11 &vq111 	Gtxxzz8H+=+=vFFFFF	G 	Gr)   c                    t          |            t                      }d}d}d}| j        }t          j        |          }t          j        |          }|t          j        k    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.r0  NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)re  r4   r   r   r   r   rD  	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  rZ  r   fsr  re   s               r(   	file_infozAnnot.file_info  s     	Dff	'..	$U++E333/000$	    	L46JKKK	8D>>::r8D>>22< 	7/22HH"2x}}55A| 7 3A66r8F#3#344< 	/+A..Dvx'9'9::< 	)%a((F(:(:HV<L<LMM< 	'#A&&D!4X!>!>/55]%^!\
r)   c                 V    t          |            | j        }t          j        |          S )zFlags field.)re  r   r   pdf_annot_flagsr   s     r(   flagszAnnot.flags  s*     	D	$U+++r)   c                    t          |            | j        }t          j        |          }t          j        |          }|t          j        k    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  )re  r   r   r   r   rD  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0$YPXY\P]P]^^  	L46JKK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re  r   r   r   r  r  r   r   )r'   ocr   r  r  s        r(   get_oczAnnot.get_oc  sc    D	'..	 HTNN;;> 	'!#&&B	r)   c                 ,   	 t          | d          }n# t          $ rt t          | j                  }t	          |t
          j                  sJ |j        r!t          |	                                          nd }t          ||          }|| _        Y nw xY w|S )Nr   )r   AttributeErrorr   r   r=   r   r   r   r   r)  r   r   )r'   rF   r   r   s       r(   ri  zAnnot.get_parent  s    	4**CC 	 	 	"49--DtU]3333304Ix,,,THtX&&CDKKK	 
s    A;BBc                    t          |            t          t          t          d}t	          |          t
          u r(|                    |                                d          }|rt          |dz  |dz            }t          |          }|}|st          j                    }t          j        | j        ||t          j        d          |          }t          |          }	|r|	                    ||           |	S )zannotation Pixmap)grayrgbcmykNH   r   )re  csGRAYcsRGBcsCMYKr   r   r7   lowerrt  JM_matrix_from_pyr   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
r'   matrixdpi
colorspacealphacspacesctmcspixrF   s
             r(   
get_pixmapzAnnot.get_pixmap  s     	D!%@@
s"" Z%5%5%7%7>>J 	0C"HcBh//F'' 	'$&&B-dib%BUVWBXBXZ_``Skk 	"KKS!!!
r)   c                 f   t          |            | j        }t          j        |          }t          j        |          }t          j        |t          d                    }|t          j        k    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   )re  r   r   r   r   r  r  PDF_ANNOT_SOUNDr   r  r  r  r  r4   pdf_to_realr  rx  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3> 	G/1EFFFff 66> 	1+C00CK 66> 	4#.s33C
O 66> 	/)#..CJ 66> 	5#/44C
O!%..> 	8!&!23!7!7C#E**!#&&H
r)   c                 ,    t          j        | g|R i |S r+   utilsget_textr'   argskwargss      r(   r  zAnnot.get_text.  "    ~d4T444V444r)   c                 ,    t          j        | g|R i |S r+   )r  get_textboxr  s      r(   r  zAnnot.get_textbox1  s#     7777777r)   c                    t          |            t          j        |          }|rjt          t          d          sJ dt           d            t          |          }|                                |_        |xj        t          j	        z  c_        | j
        }t          j        ||          }t          |          }|                                 }t          |t          j                  r||_        nt          j        |          |_        |S )zMake annotation TextPage.FZ_STEXT_CLIP_RECTzMuPDF-z% does not support FZ_STEXT_CLIP_RECT.)re  r   FzStextOptionsr:   mupdf_versionJM_rect_from_pyinternalclipr  r  r   FzStextPageTextPageri  r=   weakref	ProxyTyper   proxy)	r'   r   r  optionsclip2r   	stextpagerF   r  s	            r(   get_textpagezAnnot.get_textpage4  s    D&u-- 	65"677vv9v-9v9v9vvvv#D))E >>++GLMMU55MM	%eW55	y!!OOa*++ 	*CJJ q))CJ
r)   c                     t          |            | j        }t          j        t          j        |          t          d                    }|j        rdndS )z Check if annotation has a Popup.r  TF)re  r   r   r  r   r  r   )r'   r   r  s      r(   	has_popupzAnnot.has_popupG  sO     	D	 !4U!;!;Xg=N=NOO~0tt5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)re  r   r4   r  r   pdf_annot_contentsdictkey_contentr  r   r  rx  dictkey_namer  dictkey_titler   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)r'   r   r  r  s       r(   infoz
Annot.infoO  s    	D	ff01I%1P1PQQOu25998F;K;KLL-e.?.B.BCCL u25998C==II.u/G/J/JKKM  3E : :NKK$5e6Nq6Q6Q$R$R ! u25998C==II01I!1L1LMMO  3E : :FCC$7::O  3E : :DAA+E,DQ,G,GHHJ
r)   c                     | j         }t          j        |          }t          j        |t	          d                    }|j        sdS t          j        |          S )z%
        annotation IRT xref
        IRTr   )r   r   r   r  r  r   r   )r'   r   r  irts       r(   irt_xrefzAnnot.irt_xrefq  sS    
 	'//	 )Xe__==~ 	1%%%r)   c                 R    t          |            t          j        | j                  S )z-Get 'open' status of annotation or its Popup.)re  r   pdf_annot_is_openr   r-   s    r(   is_openzAnnot.is_open}  s%     	D&ty111r)   c                     | j         }t          j        |          }|t          j        k    rdS 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  sV     Y
'
335&&&Fu=>>>>>24888r)   c                     t          |            | j        }t          j        |          sdS t          j        |          }t          j        |          }||fS )zLine end codes.N)re  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  s[     	D	5e<< 	F1%88-e44t|r)   c                    t          |            | j        }t          |t          j                  sJ |j        sJ t          j        |          }|t          j        k    rt          j        |          }nt          j	        |          }|j        rt          |          nd}|sdS d|_        |                                j                                        |                                 j                                        k    sJ ||j        j        t!          |          <   |j        d         t          j        k    r+t%                      }t&                              ||           |}|S )zNext annotation.NTr   )re  r   r=   r   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   ri  m_internal_valuer   _annot_refsidr   Widgetr
  _fill_widget)r'   r'  rZ  r   r  widgets         r(   nextz
Annot.next  s@    	DY
*en55555$$$$$Z00E***(44EE)*55E#.8eElllD 	4~~$55774??;L;L;Q;b;b;d;ddddd*-
r#ww'8A;%000XXFsF+++C
r)   c                     t          |            | j        }d}t          j        t          j        |          t          j                  }t          j        |          rt          j        |          }|S )zOpacity.r0  )re  r   r   r  r   PDF_ENUM_NAME_CApdf_is_numberr  )r'   r   opyr6  s       r(   rU  zAnnot.opacity  sf     	D	!4U!;!;U=ST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        z  }||                                 j        z  }|S )zannotation 'Popup' rectangler  r#  )re  r   rg  rh  r   r   r  r  r   r*  rf  r#  ri  rj  rk  )r'   r   r   r  r  r  s         r(   
popup_rectzAnnot.popup_rect  s     	D|EL788	'//	 )Xg->->??> 	B*30@0@AADd## 3ii$//++AAt  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  sg     	D	'..	 HW,=,=>>> 	)#C((Dr)   c                     t           rt          j        | j                  }nt	          j        | j                  }t          |          }|                                 }||j        z  }|S )zannotation rectangle)	r  r   Annot_rect3r   r   pdf_bound_annotr#  ri  rk  )r'   r  r  s      r(   r   z
Annot.rect  sb      	3#TY//CC'	22C3ii 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 dS )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2	 )Xd^^<<$$))%u':C'C'CDD%u':C'C'CDD&(;S!(D(DEEE&(;S!(D(DEEE	  *)r)   c                     t          |            | j        }t          j        t          j        |          t          j                  }|j        sdS t          j        |          S )zannotation rotationr0  )re  r   r   r  r   PDF_ENUM_NAME_Rotater   r  )r'   r   rotations      r(   rN  zAnnot.rotation   sZ     	D	%u':5'A'A5C]^^" 	2***r)   c                    t          |            |                                 }|j        }|j        }||| z  z  }| j        }t          j        |          }t          j        |t          d          t          d                    }|j	        st          t                    t          |          }t          j        |t          d          |           dS )z1
        Set annotation appearance bbox.
        r  r  r$  N)re  ri  rotation_matrixrj  r   r   r   r  r  r   r   r%  r  r+  )	r'   r.  r   rotru  r   r  r   r   s	            r(   set_apn_bboxzAnnot.set_apn_bbox
  s     	D  "(sd
	'..	 HTNNHSMMJJ} 	-,,,t$$HV$4$4d;;;;;r)   c                 T   t          |            | j        }t          j        |          }t          j        |t          d          t          d                    }|j        st          t                    t          |          }t          j
        |t          d          |           dS )z!Set annotation appearance matrix.r  r  rt  N)re  r   r   r   r  r  r   r   r%  r  pdf_dict_put_matrix)r'   r  r   r  r   ru  s         r(   set_apn_matrixzAnnot.set_apn_matrix  s    D	'..	 HTNNHSMMJJ} 	-,,,''!"hx&8&8#>>>>>r)   c                     t          |            | j        }t          j        |          }t          j        |t          d          |           dS )zSet annotation BlendMode.r7  Nre  r   r   r   rT  r  )r'   rV  r   r  s       r(   set_blendmodezAnnot.set_blendmode&  sH    D	'..		8D>>:FFFF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           dS |t          j        t          j        t          j        t          j	        fvr|dk    rt          d| d           d}t          |          t          ur||||d}|                    d	d           |                    d
d           |                    dd           |                    dd           |d	         d|d	<   |d         d|d<   t          |d         d          r?t          |d                   |d<   |d         D ]}t          |t                     s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 'r0  )widthstyledashescloudsr[  r\  r]  r^  __getitem__)re  r   r   r<  rC  rE  r=  r>  r?  r;  rq   r4   
setdefaultr:   r   r=   r3   r   r   r  JM_annot_set_border)r'   r  r[  r\  r]  r^  r  atnamerB   r   r  rY  s               r(   
set_borderzAnnot.set_border-  s    	D	"1"v&)#$)'&   8f8889994&)'&	   zzCCCCDDD<<t##$uRXYYF'2&&&'4((((D)))(B''''?" F7O(#!F86(#]33 	$VH%566F8x(  !$,, '+F8$E 	'//	*I66"FC;;;r)   c                 z   | j         d         t          j        k    rt          d          t	          |            |                                 j        }t          |          t          ur||d}|                    d          }|                    d          }t          j	        t          j
        t          j        t          j        t          j        t          j        f}|g dfv r|                    | j        dd           ns|qt#          |d
          rt%          |          g}t'          |           t)          |          dv sJ dt+          |           d}|                    | j        d|           |r.| j         d         |vrt-          d| j         d         z             d	S |g dfv r|                    | j        dd           d	S |st#          |d
          rt%          |          g}t'          |           t)          |          dv sJ dt+          |           d}|                    | j        d|           d	S d	S )z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        r   z'cannot be used for FreeText annotationsr   stroker   rf  r,   r  []N	__float__r   r   rI  []z0Warning: fill color ignored for annot type '%s'.r   r2  )r   r   rC  r   re  ri  r   r4   r7   r<  r;  r=  r>  r?  r   xref_set_keyr  r:   float
CheckColorr6   r   rq   )r'   r  rf  r   r)  fill_annotsss          r(   
set_colorszAnnot.set_colors\  sM   
 9Q<5444FGGGDoo&<<t##"f55Fzz&!!H%%-u/EuG[]b]vx}  yP-0 b"XTYT2222v{++ )--vv;;)++++(If%%(((ATYQ/// 	DIaL33FSTUVVVFB8TYd33333t[)) %d}tt99	))))&IdOO&&&ATYa00000 r)   c                 \    t          |            | j        }t          j        ||           dS )zSet annotation flags.N)re  r   r   pdf_set_annot_flags)r'   r  r   s      r(   	set_flagszAnnot.set_flags  s0    D	!%/////r)   c                 "   t          |            t          |          t          u rp|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }d}| j        }t          j        |          }|rt          j        ||           |r|rt          j        ||           |r5t          j	        t          j
        |          t          d          |           |r5t          j	        t          j
        |          t          d          |           |r>t          j        t          j
        |          d	t          j        |                     dS dS dS )
zSet various properties.contentNtitlecreationDatemodDatesubjectr  r  r  )re  r   r4   r7   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  rv  rw  rx  ry  rz  r   	is_markups	            r(   set_infozAnnot.set_info  s   D::hhy$//GHHWd++E88ND99Lhhy$//Ghhy$//GD	.u55	 	9(888 	l 9*5%888 s.u/B5/I/I8TbKcKceqrrr c.u/B5/I/I8TW==Zabbb l#E$7$>$>HabiHjHjkkkkk	l 	ll lr)   c                 <   | j         }t          j        |          }t          |          }|dk     s*|t          j        |                                          k    rt          t                    t          j        |                                |d          }t          j	        |t          d                    }t          j        t          j        |                    }|dk     rt          t                    t          j        |t          d          |           dS )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_stringrx  MSG_IS_NO_ANNOTrM  )r'   r  r   r  r   r  subtirt_subts           r(   set_irt_xrefzAnnot.set_irt_xref  s     	'//	u%%!88tu1488::>>>>l+++$dhhjj$::!3(;(;<<3U5F5M5MNNa<<o...Ix<<<<<r)   c                     t          |            | j        }|st          j        }nt          j        |          }t          j        ||           dS )zSet annotation language.N)re  r   r   r&  fz_text_language_from_stringpdf_set_annot_language)r'   r)  r'  r(  s       r(   set_languagezAnnot.set_language  sS    DY
 	@&DD5h??D$Z66666r)   c                     t          |            | j        }t          j        |          rt          j        |||           dS t          d           dS )zSet line end codes.zbad annot type for line endsN)re  r   r   r+   pdf_set_annot_line_ending_stylesr   )r'   startendr   s       r(   set_line_endszAnnot.set_line_ends  sZ    D	1%88 	<25%EEEEE:;;;;;r)   c                     t          |            | j        }t          j        |          }t          j        |t          d          |           dS )zSet /Name (icon) of annotation.r  NrW  )r'   r   r   r  s       r(   set_namezAnnot.set_name  sJ    D	'..		8F+;+;TBBBBBr)   c                     t          |            | j        }t          j        |          }|s$t          j        |t          d                     dS t          t          j        |          ||           dS )z Set / remove annotation OC xref.r  N)re  r   r   r   r@  r  JM_add_oc_objectr  )r'   r  r   r  s       r(   set_oczAnnot.set_oc  ss    D	'..	 	Uy(4..99999U9)DDiQSTTTTTr)   c                     t          |            | j        }t          |dd          st          j        |d           dS t          j        ||           |dk     rt          |          }d|_        dS dS )zSet opacity.              ?r   N)re  r   _INRANGEr   pdf_set_annot_opacityr   transparency)r'   rU  r   r   s       r(   set_opacityzAnnot.set_opacity  s    D	c** 	'q111F#E7333S=="5))D !D =r)   c                 \    t          |            | j        }t          j        ||           dS )z-Set 'open' status of annotation or its Popup.N)re  r   r   pdf_set_annot_is_open)r'   r"  r   s      r(   set_openzAnnot.set_open  s0    D	#E733333r)   c                     t          |            | j        }t          |          }t          |          }t	          j        t          |          |          }t	          j        ||           dS )z@
        Create annotation 'Popup' or update rectangle.
        N)re  r   r   JM_rotate_page_matrixr   fz_transform_rectr  pdf_set_annot_popup)r'   r   r   pdfpagerQ  r  s         r(   	set_popupzAnnot.set_popup  sf     	D	!%((#G,,#OD$9$93??!%+++++r)   c                    t          |            | j        }t          |          }t          |          }t	          j        t          |          |          }t	          j        |          st	          j        |          rt          t                    	 t	          j        ||           dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)zSet annotation rectangle.zcannot set rect: NF)re  r   r   r  r   r  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectrf   rq   )r'   r   r   r  rQ  r  r_  s          r(   set_rectzAnnot.set_rect  s    D	!%((#G,,#OD$9$93??!!$$ 	,(A!(D(D 	,l+++	$UA..... 	 	 	+++,,,55555	s   B+ +
C5CCc                 D   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dS |}|dk     r|dz  }|dk     |dk    r|dz  }|dk    |t          j        k    r|dz  dk    rd}t          j        |          }t          j        |t#          d          |           dS )zSet annotation rotation.Nr   h  Z   r3  )re  r   r   r   rB  r<  rC  rD  rE  r=  r>  r?  r;  rF  rG  r   rH  r  )r'   rX  r   r   rQ  r  s         r(   set_rotationzAnnot.set_rotation
  s   D	#E**%&)/#$)'&%$   FAgg3JC AggSjj3JC Sjj5,,,rQC'..	y(8*<*<cBBBBBr)   c                 ^   t          |            | j        j        sdS 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)
re  r   r   r   r   pdf_string_from_annot_typer   r   pdf_is_namerx  )r'   rZ  cr  its        r(   r   z
Annot.type(  s     	Dy# 	6$TY//,U33!4TY!?!?FF| 	u033 	1:q!!q"~r)   TrV  rU  r   r   r   border_colorrW  	cross_outrX  c
                    t          j        | j                  }
|r3t          j        |
t	          d                    }|st          d          t                                           t          |            d }| j	        d         }| j
                            dd          }| j
                            dd          }| j        d	         }||}n| j        d
         }d}| j        }|	dk    r=|	dk     r|	dz  }	|	dk     |	dk    r|	dz  }	|	dk    |t           j        k    r|	dz  dk    rd}	|| j        }t!          |d          s| j        }d|cxk    rdk     sn |rd}nd}|t           j        k    rvt%          |           t%          |           t&                              |           \  }}}|dk    rd}|r|}|r|}|dk    r|}t+          | t-          |          |||           d}|                     ||||	          }|du rt1          d          |t           j        k    rS|                                 }d|cxk    rdk     r0n n-|                    d          s|                     d|z              dS  ||d          } ||d          }|                                 j        }| }|rDdd                    t?          t@          |                    z   dz   }|!                    d          }nd}| j"        r| j"        \  }} nd\  }} |                                 }|#                                }!d}"|t           j$        k    r;|rd}"|!dd         }!|!\  }#}$}%}&}'|!%                    |%           |!%                    |$           |!%                    |&           |!%                    |$           |!%                    |'           |!%                    d           |dk    s|d k    rd}"|dk    r%tM          |          !                                d!z   gng }(|!D ]R})|)'                    d"          r|)'                    d#          r|d k    r
|dd         })|(%                    |)           S|(}!d$                    |!          }|t           j(        t           j)        fv rd$                    |!dd                   d$z   }d}"|d k    r/|t           j(        k    r	||z   d%z   }nA|t           j)        k    r|dz   }n+|t           j(        k    r|d&z   }n|t           j)        k    r|dz   }|||z   }|*                    d'd(d          }d}"|r|!                    d          |z   }d}"d)|z   d*z   }|| z   dk    r|t           j(        t           j)        fv rzdt&          j+        t&          j,        t&          j-        t&          j.        t&          j/        t&          j0        t&          j1        t&          j2        t&          j3        f
}*ti          dt-          |*                    }+d+tk          d| j
        d                   z  },| j6        |, |, |,|,fz   }d}"| j7        }-||+v r\tq          |-d                   |z  }.tq          |-d                   |z  }/ |*|         | |.|/d|          }0||0!                                z  }| |+v r\tq          |-d,                   |z  }.tq          |-d                   |z  }/ |*|          | |.|/d|          }0||0!                                z  }|"rF|r-| 9                    |           |                     |d-           n|                     |d-           |t           j:        t           j;        t           j<        t           j=        t           j>        t           j)        t           j(        t           j?        t           j@        t           jA        f
vrdS | jB        }1|1dk    rdS | j6        jC        | j6        jD        z   d+z  }2|1dk    rt          |t          dd          z
            d.k     rdS | j6        G                    |2|           }3| H                    |3j6                   | I                    t          dd                     dS t          |1          }4| j6        G                    |2|4          }3| 9                    |3j6                   | I                    ||4z             dS )/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                 X    t          | |          }|sdS |dz                                   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_stringZ  s6     2t$$B sI%%'''r)   r   r]  Nr[  r0  rf  r   r  r  rh  r   /H gs
r[      )rU  rV  rW  rX  FzError updating annotation.s   /H gss   /H gs
fr  rj  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_testre  r   r  r7   r  rv  rC  r  r:   rU  rn  r
  r  JM_make_annot_DAr6   rc  r   r!  r2   r/  ri  rj  joinmapr   r  r0  
splitlinesr   rj   r   endswithr?  r>  replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashrK  maxr   verticesPointr  rB  r<  rD  rE  r=  r;  rF  rG  rN  tlbrabsrt  morphsetRectrU  )5r'   rV  rU  r   r   r   r  rW  r  rX  r  is_rich_textr  
annot_typedtbwidthrf  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ntabrn   le_funcsle_funcs_rangedpointsp1p2leftrQ  r  quadru  s5                                                        r(   updatezAnnot.update6  s/	   8 '	22	 	R -i$HHL R !PQQQ  """D	( 	( 	( Yq\
[__Xt,,"--X&!DD;v&DR<<1**# 1**C--# C--U6666B;!;K;K
 Jw,, 	#lG!z HHH222z"""z"""!&!6!6D% zz "! ! !|| T3t99dE5AAAJ
 %%!	 & 
 
 %<<;<<<222BGah(?(?JO,,,FT3'',vs++!!7v 	388CRLL111I=F]]7++FFF> 	,'+~$K'+$K [[]]
/// 	$!
$*!2r2rb!!!b!!!b!!!b!!!b!!!d###zzW^^!
?Ezz	&))0022U:;;r" & &D}}T** ! }}U++ ,3&ss|KK%%%%F##B%153LMMMF3B3K((50BJ||!888ed*BB5#<<<dB!888dBB5#<<<dB"BH&6::BJ 	))B.BJb[8# $q((ZE<SUZUn;o-o-oe.0@)5+>-u~,e.D	)H
 #1c(mm44NC4;w/000A9QB1~-DJ]Fn,,6!9%%,6!9%%,,x,T2r5*MMdkkmm#n,,6":&&-6":&&-,x,T2r4LLdkkmm# 	( (d###BQ''''BQ'''
 %&/#$)'&%$   Fm"99FY\DIL(A-!886F1aLL())D009??1vg..DLL###q!---FSkkyq#&&di   FSL)))))r)   c                    t          |            | j        }t          j        |          }t          j        |          }t          j        |          }|t          j        k    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
          |           |rFt          j        |	t          d	          |           t          j        |
t          d	          |           |rHt          j        |	t          d          |           t          j        |
t          d          |           dS dS )zUpdate attached file.r  r  r  bad PDF: no /EF objectr   DLr  r  r  Contentsr  N)re  r   r   r   r  r   rD  r  r  r  r  r   r  r  r  r&  r   r'  r(  fz_buffer_storagepdf_new_intrM  pdf_dict_putlr~  )r'   r,  re   	ufilenamer  r   r  rY  r   r   r  r  r6   r  ls                  r(   update_filezAnnot.update_file3  s   D	'..	*955#E**5222/000$YPXY\P]P]^^  	E-/CDDD	8D>>:: !)) 	.3> 	.n--- 	QS&#q111,S11FC!#&&Avx~~q9998H+=+=x?O?OPPP 	V*68C==(KKK*2x}}hGGG*68D>>8LLL*2x~~xHHH*9hz6J6JHUUU 	J*68D>>9MMM*2x~~yIII 	G*68F3C3CTJJJ*2x/?/?FFFFF	G 	Gr)   c                  8    d} t          d          D ]}| |z  } | S )Nr   i0u  )rK  )totalr   s     r(   r  zAnnot.update_timing_test^  s,     	 	AQJEE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        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        f           |                    |           |S d	S )
zannotation vertex pointsVerticesL
QuadPointsCLr   r   r   InkListN)re  r   r=   r   r   r   r   rq  rg  pdf_page_transformJM_derotate_page_matrix	fz_concatr  r  r   r   rK  r  r  r  FzPointfz_transform_pointrj   xy)r'   r   r  r   page_ctmdummyderotr  r  r   r$  r%  pointres1o1r  s                   r(   r  zAnnot.verticese  s    	D	%00000'..	u%%>## uh777'--?8U33 y(:*>*>??|PE$6y(3--$P$P|YE$6y(<BXBX$Y$Y|HE$7	4$H$H< 
	 C1e1!44a88 0 0%e&9!Q&?&?@@%e&9!QqS&A&ABBa++0AA

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

4    J	 	r)   c                 z    t          |            | j        }t          j        t          j        |                    S )zannotation xref number)re  r   r   r   r   r   s     r(   r  z
Annot.xref  s5     	D	 3E : :;;;r)   r   )r0  NNr0  r   )NNNr   r   )Nr0  NNr0  NNNNNNNNNr+   )	NNr   NNNNTr0  NNNN)Hr.   r/   r0   r   r   r   r   r  r!  r/  rc  propertyrl  rv  r  r  r  r  r  r  r  r  r  ri  r  r  r  r  r	  r  r  r  r"  r)  r0  r;  rU  rA  rC  r   rK  rN  rR  rU  rX  rc  rq  rt  r  r  r  r  r  r  r  r  r  r  r  r   OptStrOptFloatrm  OptSeqboolr3   r  r  staticmethodr  r  r  r,   r)   r(   r   r   I  s         E E E  ! ! !% % %N  &9 9 9 9(a a a aF   X    X.   X>   X$= = = = 	 	 X	G G G6 / / X/b , , X,  	 	 	     (  @5 5 58 8 8   & 1 1 X1   XB 	& 	& X	& 2 2 X2
 9 9 X9 	 	 X	   X2   X   X$ 	 	 X	   X&   X + + X+< < <"	? 	? 	?G G G-< -< -< -<^'1 '1 '1 '1R0 0 0l l l l<= = = 7 7 7 7< < <C C CU U U U
" 
" 
"4 4 4	, 	, 	,   C C C C<   X !%#" $"& $!{* {*{*{* {* 	{*
 {* !{* {* {* {* {* {* {*z)G )G )G )GV   \ 3 3 X3j < < X< < <r)   r   c                   l    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dS )Archivec                 x    t                      | _        t          j                    | _        |r | j        |  dS dS )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__  sG     !FF.00	 	DHt	 	r)   c                 0    dt          | j                   S )NzArchive, sub-archives: )r6   r;  r-   s    r(   r   zArchive.__repr__  s    AT->)?)?AAAr)   Nc                 <    t          j        | j        ||           d S r+   )r   fz_mount_multi_archiver   )r'   subarchr	   s      r(   	_add_archzArchive._add_arch  s    $di$?????r)   c                 d    t          j        |          }t          j        | j        ||           d S r+   )r   fz_open_directoryrA  r   )r'   folderr	   subs       r(   _add_dirzArchive._add_dir  s/    %v..$did;;;;;r)   c                     t          |          }t          j        t          j                              }t          j        |||           t          j        | j        ||           d S r+   )r&  r   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferrA  r   )r'   memoryr   r	   buffrG  s         r(   _add_treeitemzArchive._add_treeitem  sW    !6**'88(#tT:::$did;;;;;r)   c                     |dk    rt          j        |          }nt          j        |          }t          j        | j        ||           d S Nr   )r   fz_open_zip_archivefz_open_tar_archiverA  r   )r'   filepathrZ  r	   rG  s        r(   _add_ziptarfilezArchive._add_ziptarfile  sJ    A::+X66CC+X66C$did;;;;;r)   c                     t          |          }t          j        |          }|dk    rt          j        |          }nt          j        |          }t          j        | j        ||           d S rQ  )r&  r   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamrA  r   )r'   rM  rZ  r	   rN  r   rG  s          r(   _add_ziptarmemoryzArchive._add_ziptarmemory  sg    !6**%t,,!887@@CC7@@C$did;;;;;r)   c                 p	    d } fd}t          |t          j                  rt          |          }t          |t                    rt          j                            |          r5                     ||            |t	          j        |          |d          S t          j        	                    |          rt          |t                    r|dk    sJ d|d            t          j        |d          5 }|                                }ddd           n# 1 swxY w Y                        ||            ||gdd	          S t          d
|           ||          rEt          |t                    r
|d|dk    sJ                      ||            ||gdd	          S t          |t          j                  rzt#          |dd          }|1|j                                        }                     |d|           n                     |d|            ||                                |d          S t          |t.          j                  rt#          |j        dd          }|R|j        }t          |t          j                  s|j        }                     |                                d|           n                     |d|            ||                                |d          S t          |t8                    r#                     ||            |g |d          S t          |t<                    r#t?          |          dk    r|\  }	}
t          |
t                    sJ dtA          |
                       ||	          r                     |	|
|           nt          |	t                    ryt          j        	                    |	          rYt          j        |	d          5 }|                                }ddd           n# 1 swxY w Y                        ||
|           nJ dtA          |	          d             ||
g|d	          S tC          |d          r|D ]} "                    ||           dS tG          dtA          |           d          )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                 P    t          | t          t          t          j        f          S r+   )r=   r  	bytearrayr8   BytesIOr$  s    r(   is_binary_dataz#Archive.add.<locals>.is_binary_data  s    a%BJ!?@@@r)   c                 j   t          || |          }|dk    sj        g k    rj                            |           d S j        d         }|d         dk    s|d         |d         k    rj                            |           d S |d                             |d                    |j        d<   d S )N)r   entriesr	   treer0  r   r	   rb  )r4   r;  rj   extend)rb  mountr   rB  ltreer'   s        r(   make_subarchz!Archive.add.<locals>.make_subarch  s    sG%@@@Gf}} 1R 7 7!((11111)"-<6))U6]gfo-M-M%,,W55555)$++GI,>???,1D%b)))r)   dirr[   z'Need name for binary content, but path=r   rbNrc  zNot a file or directory: re   r   zipr   r   tarmultir   zUnexpected type(name)=)r	   zUnexpected type(data)=r_  zUnrecognised type )$r=   pathlibPathr   rc   r	   isdirrH  listdirisfiler8   r9   readrO  r   zipfileZipFiler   fpgetvaluerZ  rU  namelisttarfileTarFilefileobjr^  getnamesr9  rC  r   r6   r   r:   r=  r  )r'   rv  r	   r`  rg  r  ffre   ru  datar   rB   s   `           r(   r=  zArchive.add  sx   $	A 	A 	A
	2 
	2 
	2 
	2 
	2 gw|,, 	#'llGgs## *	3w}}W%% Jgt,,,#|BJw$7$7uEEE(( J!$,, FETEEE 2<WWd++ "qB" " " " " " " " " " " " " " """2t,,,#|TFD&999 !HW!H!HIII^G$$ 	3dC(( BT 6B9=6B 6B 6B .B .B .B .Bw---<f55511 	3w
D99HZ((**&&r1d3333$$Xq$777< 0 0 2 2D%@@@11 	3w==H_!"bj11 $B&&r{{}}a>>>>$$Xq$777< 0 0 2 2D%@@@)) 	3NN7D)))<D'222gu%% 	C#g,,!*;*; JD$dC((EE*ET

*E*EEEE~d## 7""4D"9999D#&& 77>>$'' <t,, &VVXX& & & & & & & & & & & & & & &&&r4d&;;;66T

666666<f555Wm,, 	C % %t$$$$F AgAAABBBs$   :DD"D=PP"%P"c                     | j         S )z'
        List of sub archives.
        )r;  r-   s    r(   
entry_listzArchive.entry_list:  s    
   r)   c                 6    t          j        | j        |          S r+   )r   fz_has_archive_entryr   r'   r   s     r(   	has_entryzArchive.has_entryA  s    )49d;;;r)   c                 T    t          j        | j        |          }t          |          S r+   )r   fz_read_archive_entryr   r  )r'   r   rN  s      r(   
read_entryzArchive.read_entryD  s$    *DIt<<&&&r)   r+   )r.   r/   r0   r   r   rC  rH  rO  rU  rZ  r=  r2  r  r  r  r,   r)   r(   r9  r9    s          B B B@ @ @ @< < < << < < << < < << < < <g g g gR ! ! X!< < <' ' ' ' 'r)   r9  c                      e Zd Zd Zd Zd Zd Zd Zd ZdKdZ	d	 Z
d
 Zd ZdLdZd ZdMdZdKdZd ZdNdZd Zd Zd ZdKdZdKd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$d0             Z2d1 Z3d2 Z4d3 Z5dOd5Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;dOd;Z<d< Z=d= Z>d> Z?d? Z@d@ ZAdA ZBdB ZC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPdCZDdD ZEdQdFZFdG ZGdH ZHe$dI             ZIe$dJ             ZJe	ZKe	ZLe	ZMdS )RXmlc                     | S r+   r,   r-   s    r(   	__enter__zXml.__enter__K      r)   c                     d S r+   r,   r>  s     r(   __exit__zXml.__exit__N      r)   c                    t          |t          j                  r	|| _        d S t          |t                    r/t          j        |          }t          j        |          | _        d S J dt          |                       )Nr   zUnsupported type for rhs: )r=   r   FzXmlr   r   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r'   rhsrN  s      r(   r   zXml.__init__Q  sv    c5;'' 	?DIIIS!! 	?7<<D5d;;DIII>>499>>>>>r)   c                 4    fdd}g } | ||          }|S )Nc           	         | | j         r(|                    |d| j         df           | j        } 1|                    |d| j         f           |                                                                 D ]#\  }}|                    |d| d| df           $| j        }|r |||dz             }|                    |d| j         f           | j        } | |S )N"(r   z 'r   r   ))is_textrj   r   r;  tagnameget_attributesrA   first_child)noderA   shiftkrE   child	show_nodes         r(   r  z%Xml._get_node_tree.<locals>.show_node[  s   "< LL%)9TY)9)9)9!:;;;9De%7%7%78999 //117799 9 9DAqLL%Q!!78888( ?%IeUEAI>>Ee%7%7%78999y " Lr)   r   r,   )r'   r  rA   r  s      @r(   _get_node_treezXml._get_node_treeZ  s@    	 	 	 	 	  	$u--r)   c                 Z    |                      d          }|                     |           |S )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childr'   r  s     r(   add_bullet_listzXml.add_bullet_listp  .    ##D))%   r)   c                     |                      d          }|||v r| S |                     d           ||}n|d|z   z  }|                     d|           | S )z5Set some class via CSS. Replaces complete class spec.classNr   get_attribute_valueremove_attributeset_attribute)r'   r   clss      r(   	add_classzXml.add_classv  sp    &&w//?ts{{Kg&&&;CC3:C7C(((r)   Nc                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | 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  s|    ##F++::t44T::;;;!!<D%   r)   c                 Z    |                      d          }|                     |           |S )z!Add monospaced lines ("pre" node)prer  r  s     r(   add_codeblockzXml.add_codeblock  .    ##E**%   r)   c                 Z    |                      d          }|                     |           |S )zAdd description list ("dl" tag)dlr  r  s     r(   add_description_listzXml.add_description_list  r  r)   c                 Z    |                      d          }|                     |           |S )zAdd "div" tagdivr  r  s     r(   add_divisionzXml.add_division  r  r)   r   c                     |t          dd          vrt          d          | j        }d| }|                     |          }|dvr|                     |           |S | j                            |           |S )zAdd header tagr      zHeader level must be in [1, 6]h)h1h2h3h4h5h6r  )rK  r   r  r  r  r   )r'   r   this_tagnew_tagr  s        r(   
add_headerzXml.add_header  s    a##=>>><e++##G,,DDDe$$$L  '''r)   c                 Z    |                      d          }|                     |           |S )zAdd horizontal line ("hr" tag)hrr  r  s     r(   add_horizontal_linezXml.add_horizontal_line  r  r)   c                 T   |                      d          }||                    d|            ||                    d|            ||                    dd|            ||                    d|            |                    d|            |                     |           |S )	zAdd image node (tag "img").imgNr[  heightr\  zfloat: r  src)r  r  r  )r'   r   r[  r  imgfloatr  r  s          r(   	add_imagezXml.add_image  s    ##E**E444V+666)=8)=)=>>>E444Ed9---%   r)   c                 4   |                      d          }t          |t                    s|}|                    d|           |                    |                     |                     |                                 }|| }|                    |           | 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  s    ##C(($$$ 	DFD)))40066777!!<D%   r)   c                     | j         dvrt          d| j                   |                     d          }|                     |           |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  sN    <|++6EEE##D))%   r)   c                     |                      d          }|dk    r#|                    dt          |                     ||                    d|           |                     |           |S )zAdd numbered list ("ol" tag)r  r   r  Nr   )r  r  r   r  )r'   r  numtyper  s       r(   add_number_listzXml.add_number_list  so    ##D))199U444000%   r)   c                     |                      d          }| j        dk    r|                     |           n| j                            |           |S )zAdd "p" tagr  )r  r  r  r   r  s     r(   add_paragraphzXml.add_paragraph  sT    ##C((<3e$$$$K$$U+++r)   c                 Z    |                      d          }|                     |           |S Nspanr  r  s     r(   add_spanzXml.add_span  s.    ##F++%   r)   c                     |                      d          }|||v r| S |                     d           ||}n|d|z   z  }|                     d|           | S )z;Set some style via CSS style. Replaces complete style spec.r\  N;r  )r'   r   r\  s      r(   	add_stylezXml.add_style  sq    ((11Kg&&&=EES4ZE7E***r)   c                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | S )zAdd a subscript ("sub" tag)rG  r  r  s       r(   add_subscriptzXml.add_subscript  |    ##E**::t44T::;;;!!<D%   r)   c                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | S )zAdd a superscript ("sup" tag)supr  r  s       r(   add_superscriptzXml.add_superscript	  r  r)   c                 X   |                                 }t          |          }|                                 }|| }t          |          D ]^\  }}|                    |                     |                     ||dz
  k     r(|                    |                     d                     _| S )z"Add text. Line breaks are honored.Nr   r  )r  r6   r  	enumerater  r  r  )r'   r   lines
line_countr  r   rn   s          r(   add_textzXml.add_text	  s    !!ZZ
!!<D '' 	= 	=GAtd33D99::::>!!!!$"5"5d";";<<<r)   c                 D    t          j        | j        |j                   d S r+   )r   fz_dom_append_childr   r  s     r(   r  zXml.append_child 	  s    !49ej99999r)   c                     |                      d          }|                    |           |                                 }|| }|                    |           |S r  )r  r  r  r  )r'   r\  r  r  s       r(   append_styled_spanzXml.append_styled_span#	  s[    ""6**u!!<D$r)   c                 N    t          t          j        | j                            S r+   )r  r   fz_dom_bodyr   r-   s    r(   bodytagzXml.bodytag,	  s    E%ty11222r)   c                 R    t          j        | j                  }t          |          S r+   )r   fz_dom_cloner   r  r'   rF   s     r(   clonez	Xml.clone/	  s      $),,Cyy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   r3   sRGB_to_rgbr   r   )colors    r(   
color_textzXml.color_text3	  sp    ;;#L;;#/+e,,////;;5$-'''u'''r)   c                 P    t          t          j        | j        |                    S r+   )r  r   fz_dom_create_elementr   )r'   tags     r(   r  zXml.create_element=	  s    E/C@@AAAr)   c                 P    t          t          j        | j        |                    S r+   )r  r   fz_dom_create_text_noder   r'   r   s     r(   r  zXml.create_text_node@	  s    E149dCCDDDr)   c                     |                                  }|D ]7}t          d|d         z  |d                             dd          z              8dS )z)Print a list of the node tree below self.z  r   r   r$   \nN)r  rq   r  )r'   rA   rB   s      r(   debugz	Xml.debugC	  s`    ##%% 	C 	CDD47NT!W__T5%A%AABBBB	C 	Cr)   c                 j    t          j        | j        |||          }|j        rt	          |          S d S r+   )r   fz_dom_findr   r   r  r'   r  attmatchrF   s        r(   r   zXml.findI	  s:    Ce<<> 	99	 	r)   c                 j    t          j        | j        |||          }|j        rt	          |          S d S r+   )r   fz_dom_find_nextr   r   r  r  s        r(   	find_nextzXml.find_nextN	  s:    $dic5AA> 	99	 	r)   c                     t          j        | j                  rd S t          j        |           }|j        rt          |          S d S r+   )r   fz_xml_textr   fz_dom_first_childr   r  r   s     r(   r  zXml.first_childS	  sL    di(( 	F&--> 	99	 	r)   c                 >    |sJ t          j        | j        |          S r+   )r   fz_dom_attributer   r'   keys     r(   r  zXml.get_attribute_value\	  s     


%ty#666r)   c                     t          j        | j                  rd S t                      }d}	 t          j        | j        |          \  }}|r|sn|||<   |dz  }-|S Nr   r   )r   r  r   r4   fz_dom_get_attribute)r'   resultr   r  r  s        r(   r  zXml.get_attributes`	  sw    di(( 	F	149a@@HC c FCLFA	 r)   c                 D    t          j        | j        |j                   d S r+   )r   fz_dom_insert_afterr   r'   r  s     r(   insert_afterzXml.insert_aftern	  s    !49di88888r)   c                 D    t          j        | j        |j                   d S r+   )r   fz_dom_insert_beforer   r$  s     r(   insert_beforezXml.insert_beforeq	  s    "DIty99999r)   c                 (   |                                 }t          |          }t          |          D ]^\  }}|                     |                     |                     ||dz
  k     r(|                     |                     d                     _| S )Nr   r  )r  r6   r  r  r  r  )r'   r   r  r  r   rn   s         r(   insert_textzXml.insert_textt	  s    !!ZZ
 '' 	= 	=GAtd33D99::::>!!!!$"5"5d";";<<<r)   c                     | j         duS )zCheck if this is a text node.Nrp   r-   s    r(   r  zXml.is_text}	  s     y$$r)   c                 6    | j         }|dS 	 |j        }|s|S |})zReturn last child node.N)r  r;  )r'   r  r;  s      r(   
last_childzXml.last_child	  s9      =4	:D E		r)   c                 d    t          j        | j                  }|j        rt	          |          S d S r+   )r   fz_dom_nextr   r   r  r   s     r(   r;  zXml.next	  s4    ++> 	99	 	r)   c                 d    t          j        | j                  }|j        rt	          |          S d S r+   )r   fz_dom_parentr   r   r  r   s     r(   r   z
Xml.parent	  s4    !49--> 	99	 	r)   c                 d    t          j        | j                  }|j        rt	          |          S d S r+   )r   fz_dom_previousr   r   r  r   s     r(   previouszXml.previous	  s4    #TY//> 	99	 	r)   c                 8    t          j        | j                   d S r+   )r   fz_dom_remover   r-   s    r(   removez
Xml.remove	  s    TY'''''r)   c                 B    |sJ t          j        | j        |           d S r+   )r   fz_dom_remove_attributer   r  s     r(   r  zXml.remove_attribute	  s&    


%ty#66666r)   c                 N    t          t          j        | j                            S r+   )r  r   fz_xml_rootr   r-   s    r(   rootzXml.root	  s    E%ty11222r)   c                    d}t          |t                    r|}nJ|t          k    rd}n<|t          k    rd}n.|t          k    rd}n |t
          k    rd}nt          d|          ||z  }|                     |           | S )z Set text alignment via CSS styleztext-align: %sr
  centerrightjustifyzUnrecognised align=)r=   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   r  )r'   r  r   ts       r(   	set_alignzXml.set_align	  s    uc"" 	7AAo%%AA'''AA&&&AA(((AA5U55666axtr)   c                 D    |sJ t          j        | j        ||           d S r+   )r   fz_dom_add_attributer   )r'   r  r   s      r(   r  zXml.set_attribute	  s(    


"DIsE:::::r)   c                 `    d|                      |          z  }|                     |           | S )z"Set background color via CSS stylezbackground-color: %s)r  r  r'   r  r   s      r(   set_bgcolorzXml.set_bgcolor	  s/    &)?)??tr)   Tc                 H    |rd}nd}d|z  }|                      |           | S )zSet bold on / off via CSS styleboldnormalzfont-weight: %sr  r'   r  r   s      r(   set_boldzXml.set_bold	  s9     	CCC 3&%%%r)   c                 `    d|                      |          z  }|                     |           | S )zSet text color via CSS stylez	color: %s)r  r  rJ  s      r(   	set_colorzXml.set_color	  s1    dooe444%%%r)   c                 :    d| }|                      |           | S )z(Set number of text columns via CSS stylez	columns: rO  )r'   colsr   s      r(   set_columnszXml.set_columns	  s(    !4!!%%%r)   c                 :    d|z  }|                      |           | S )z"Set font-family name via CSS stylezfont-family: %srO  )r'   fontr   s      r(   set_fontzXml.set_font	  s%     4'%%%r)   c                 t    t          |          t          u rd}nd}d| | }|                     |           | S )z Set font size name via CSS styler[   pxzfont-size: )r   r   r  )r'   r   r[  r   s       r(   set_fontsizezXml.set_fontsize	  sJ    >>S  BBB+X+r++%%%r)   c                     | j         }|                    dd|          rt          d| d          |                     d|           | S )zSet a unique id.Nr7  zid 'z' already exists)r<  r   r   r  )r'   uniquer<  s      r(   set_idz
Xml.set_id	  sX     y99T4(( 	><F<<<===4(((r)   c                 H    |rd}nd}d|z  }|                      |           | S )z!Set italic on / off via CSS styleitalicrN  zfont-style: %srO  rP  s      r(   
set_italiczXml.set_italic	  s9     	CCC#%%%%r)   c                 :    d| }|                      |           | S )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r  )r'   leadingr   s      r(   set_leadingzXml.set_leading
  s&    +'++tr)   c                 :    d| }|                      |           | S )z,Set inter-letter spacing value via CSS stylezletter-spacing: rO  r'   spacingr   s      r(   set_letter_spacingzXml.set_letter_spacing
  s(    +'++%%%r)   c                 :    d| }|                      |           | S )z6Set line height name via CSS style - block-level only.zline-height: rd  )r'   
lineheightr   s      r(   set_lineheightzXml.set_lineheight
  s&    +z++tr)   c                 :    d|z  }|                      |           | S )zSet margin values via CSS stylezmargins: %srO  rP  s      r(   set_marginszXml.set_margins
  s%    s"%%%r)   c                 :    d| }|                      |           | S )zSet opacity via CSS stylez	opacity: rO  )r'   rU  r   s      r(   r  zXml.set_opacity
  s(    $7$$%%%r)   c                 4    d}|                      |           | S )z$Insert a page break after this node.zpage-break-after: alwaysrd  r  s     r(   set_pagebreak_afterzXml.set_pagebreak_after
  s    )tr)   c                 4    d}|                      |           | S )z%Insert a page break before this node.zpage-break-before: alwaysrd  r  s     r(   set_pagebreak_beforezXml.set_pagebreak_before%
  s    *tr)   c                    | j         }|                                }||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||	                    |           |	|
                    |	           |
|                    |
           ||                    |           ||                    |           ||                    |           ||                                 ||                                 ||                    |           ||                     |           ||                     |           g }|                    d          }||                    |           |j        }|r1|                    |                    d                     |j        }|1|                     dd                    |                     |                                 | S )z`Set any or all properties of a node.

        To be used for existing nodes preferably.
        Nr\  r  )r<  r  rF  rK  rQ  rS  rV  rY  r\  set_text_indentrb  rf  rj  rm  ro  rr  rt  set_word_spacingr_  r  r  rj   r  r  r  r7  )r'   r  bgcolorrM  r  columnsrX  r   indentra  re  letter_spacingrl  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r<  tempstyles	top_styler  s                           r(   set_propertieszXml.set_properties+
  s   2 y  ""NN5!!!W%%%MM$NN5!!!W%%%MM$h'''  (((OOF###W%%%%##N333!
+++W%%%&$$&&&'%%'''#!!,///KK?NN3,,W55	 MM)$$$  	&MM%33G<<===%E  	& 	7CHHV$4$4555r)   c                 :    d| }|                      |           | S )z;Set text indentation name via CSS style - block-level only.ztext-indent: rd  )r'   rz  r   s      r(   rv  zXml.set_text_indentw
  s&    'v''tr)   	underlinec                 :    d|z  }|                      |           | S )Nztext-decoration: %srO  rP  s      r(   set_underlinezXml.set_underline}
  s%    $s*%%%r)   c                 :    d| }|                      |           | S )z*Set inter-word spacing value via CSS stylezword-spacing: rO  rh  s      r(   rw  zXml.set_word_spacing
  s(    )))%%%r)   c                     | }| j         }|dS |j        r|j        }|n|j        ||j        dk    rdS 	 ||S |j        dv s|j        r|j        }|j        dk    r
|}|j        }n|S 4)z$Find deepest level in stacked spans.Nr  T)r    rG  r  body)r-  r  r4  r  r;  r  )r'   r   r  s      r(   r  zXml.span_bottom
  s    =4m 	NE} m 	 =EMV334
	}} 999U]9
}&&)
	r)   c                 4    t          j        | j                  S r+   )r   
fz_xml_tagr   r-   s    r(   r  zXml.tagname
  s    +++r)   c                 4    t          j        | j                  S r+   )r   r  r   r-   s    r(   r   zXml.text
  s     $),,,r)   r+   r.  r1  r   NT)NNNNNNNNNNNNNNNNNN)r  )Nr.   r/   r0   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  r7  r  r  r  r  r   r  r2  r  r  r  r%  r(  r*  r  r-  r;  r   r4  r7  r  r<  rF  r  rK  rQ  rS  rV  rY  r\  r_  rb  rf  rj  rm  ro  r  rr  rt  r  rv  r  rw  r  r  r   add_varadd_sampadd_kbdr,   r)   r(   r  r  I  s.           ? ? ?  ,    	 	 	 	                          
  	 	 	 		 	 	 	  : : :  3 3 3     \B B BE E EC C C  
  
   X7 7 7  9 9 9: : :   % % X% 	 	 X	   X
   X
   X
( ( (7 7 7 3 3 X3  &; ; ;                                  !'J J J JX     
    2 , , X, - - X- GHGGGr)   r  c                   L    e Zd Zd Zd Zd Zed             Zed             ZdS )
Colorspacec                    t          |t          j                  r	|| _        dS |t          k    r*t          j        t          j        j                  | _        dS |t          k    r*t          j        t          j        j                  | _        dS |t          k    r*t          j        t          j        j	                  | _        dS t          j        t          j        j	                  | _        dS )z!Supported are GRAY, RGB and CMYK.N)
r=   r   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r'   rZ  s     r(   r   zColorspace.__init__
  s    ue011 		IDIIIg*5+=+HIIDIIIg*5+=+HIIDIIIf__*5+=+GHHDIII*5+=+GHHDIIIr)   c                 6    d| j                  }d|d| j        S )N)r[   GRAYr[   RGBCMYKzColorspace(CS_z) - )rD   r   r'   r$  s     r(   r   zColorspace.__repr__
  s#    +DF3+,11dii88r)   c                 4    t          j        | j                  S r+   )r   fz_colorspace_namer   r-   s    r(   _namezColorspace._name
  s    '	222r)   c                 4    t          j        | j                  S )zSize of one pixel.)r   fz_colorspace_nr   r-   s    r(   rD   zColorspace.n
       $TY///r)   c                 *    |                                  S )zName of the Colorspace.r  r-   s    r(   r   zColorspace.name
  s     zz||r)   N)	r.   r/   r0   r   r   r  r2  rD   r   r,   r)   r(   r  r  
  sz        I I I9 9 93 3 3 0 0 X0   X  r)   r  c                       e Zd Zd ZdS )DeviceWrapperc                    t          |t          j                  r|\  }|| _        d S t          |t          d           r|\  }}t          |          }t          j        |          r-t          j        t          j                    |          | _        d S t          j	        t          j                    ||          | _        d S t          |t          j
                  r|\  }t          j        |          | _        d S t          |t          j        d           r5|\  }}t          j        |          }	t          j        ||	          | _        d S t          d|          )Nz%Unrecognised args for DeviceWrapper: )
args_matchr   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicerq  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicerf   )
r'   r  devicepmr   r.  r  tpr  optss
             r(   r   zDeviceWrapper.__init__
  s?   tU^,, 	OGFDIIIvt,, 	OHB#T**D)400 \!4en6F6FKK			!>@P@PRTVZ[[			u233 	OCB0"55DIIIu0$77 	OIB'//D12t<<DIIIMTMMNNNr)   Nr   r,   r)   r(   r  r  
  s(        O O O O Or)   r  c                   F    e Zd Zd Zd Zd
dZddZed             Zd	 Z	dS )DisplayListc                 D    t          |           t          urd S d| _        d S NF)r   r  r   r-   s    r(   __del__zDisplayList.__del__
  s"    Dzz[((&&r)   c                 H   t          |          dk    rAt          |d         t          j                  r!t          j        |d                   | _        d S t          |          dk    r/t          |d         t          j                  r|d         | _        d S J d|            )Nr   r   zUnrecognised args=)r6   r=   r   rg  r  r   r>  s     r(   r   zDisplayList.__init__
  s    t99>>ja%,??>+DG44DIIIYY!^^
47E4G H H^QDIII--d-----r)   Nr   c                     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
  s[    j*-- 	J#JJ+E,>,HIIJ)$)VZPTVZ[[
r)   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
  s8    ,..#	=99
r)   c                 p    t          t          j        | j                            }t	          |          }|S r+   )rf  r   fz_bound_display_listr   r#  r'   r  s     r(   r   zDisplayList.rect  s,    e9$)DDEE3ii
r)   c                     t          j        | j        |j        t	          |          t          |          t          j                               d S r+   )r   fz_run_display_listr   r  r  r  FzCookie)r'   dwr  areas       r(   runzDisplayList.run
  sL    !		!!$$%%  	 	 	 	 	r)   )NNr   N)r   )
r.   r/   r0   r  r   r  r	  r2  r   r  r,   r)   r(   r  r  
  s          . . .         X
    r)   r  c                      e Zd ZdefdZddZd Zd Zej	        dde
defd	            Zej        d
k    r8ej	        dedee         fd            Zej	        dee
e
f         defd            ZddZd dZde
fdZdefdZd Zde
ddfdZd Zd Zd Z	 	 	 d!dd dd de
de
de
ddfdZ	 	 	 	 d"dd d d de
de
de
ddfd!Zd" Zd#ej        e
ef         de
fd$Zd#d%Z d& Z!d' Z"d( Z#d$d)Z$d* Z%d+efd,Z&dd-e
d.ed/ed0e
d1e
de
fd2Z'd3 Z(d4 Z)d5 Z*d6 Z+d7 Z,d%d8Z-d9 Z.d: Z/d; Z0d&d>Z1d? Z2d@ Z3dA Z4dB Z5d'dCZ6e7dD             Z8d%dEZ9d(dGZ:dH Z;dI Z<dJdJdKdLedMeddfdNZ=e7dO             Z>dP Z?dQ Z@d)dRZAd*dSe
dTe
fdUZBdV ZCd*dSe
fdWZDdX ZE	 	 	 d#dYedZeFd[eGd\eGd]eGddfd^ZHde
fd_ZId#ej        e
ef         fd`ZJd#ej        e
ef         deKfdaZLd#ej        e
ef         deMfdbZNdefdcZO	 	 	 	 d$d#ej        e
ef         dZePd[eGd\eGd]eGddfddZQd+deZRdf ZS	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,djZTdk ZUd*dlZV	 	 	 d-dnd d-e
d1e
de
doeWdefdpZXd*dqZYdr ZZds Z[dnd d-e
de
fdtZ\du Z]dnd d-e
deMfdvZ^dw Z_d.dSe
dxedefdyZ`d.dSe
dxedefdzZad{ Zbd.d|ZcdddddhdJd}dnd dSe
d~eddeedefdedLeddfdZg	 	 	 	 	 d/dnd dSe
dedefdehdddedeji        fdZjdSe
defdZkd Zl	 d0dnd dedefdZmd Zndnd defdZodnd defdZpd Zq	 	 	 	 	 	 	 	 d1dZr	 	 	 	 	 	 	 d2dnd dSe
dej        eedf         desdesdesdedeGdetde
fdZudddddFdFdFdddFdddZve7d             Zwe7d             Zxe7d             Zye7d             Zze7d             Z{e7d             Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd3dZd Zd Ze7d             Ze7d             Zd Zd4dZd Zd Zd Ze7deMfd            Zd*dSe
dTe
fdZe7d             Zd3dZe7d             Z	 	 	 d&dnd dSe
desdesdef
dZd Zd Ze7d             Zd Zd Zd Ze7defdÄ            Ze7defdĄ            Zej        j        d
k     rej        j        Znej        j        e         Zd#dehdehdehdefdȄZdɄ Zd5dʄZe7d˄             Zd̄ Zd+edefd̈́Zd6d΄Z	 	 	 	 	 	 	 	 	 	 d7dτZd8dЄZdф Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d҄Zdӄ ZdԄ Z	 	 	 	 	 	 	 	 	 	 	 	 	 d:dnd dededededededede
dedededededdfdZ	 	 	 	 d;dnd dSe
dededefde
dddefdZd Zd3dZd<dZddZdeMdefdZd3dnd deMddfdZdnd d-e
de
ddfdZ	 	 	 	 d=dnd d-e
dej        edf         deGdej        edf         de
fdZdefdZdefdZd Z	 d8dnd dede
de
fdZ	 	 	 	 	 	 	 	 d>dnd de
deWdehdSehdeGdeGdTed[eGdesddfd Zd Zd?dnd dededehfdZddZd3dZÐd@dZe7d             Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dAd	ZƐd
 Ze7d             Zdddnd de
de
deddf
dZɐd Zʐd Zːd Z̐d ZddZΐd Zϐd ZАd5dZѐd ZҐd ZӐd ZԐd ZՐdZ e7d           ZeZdS (B  r   returnc                 ~   t          |          t          u r|| j        k     rdS dS t          |          t          t          fvst          |          dk    rdS |\  }}	 t          |t                    r|dk     s|| j        k    rdS 	 t          |t                    r|dk     s||                     |          k    rdS dS )NTFr   r   )	r   r3   
page_countr   r   r6   r=   chapter_countchapter_page_count)r'   locchapterpnos       r(   __contains__zDocument.__contains__  s    99T_$$t599UDM))SXX]]5	!'3//	Q;;d0005	!#s++	77$11'::::5tr)   Nc                    | j         st          d          t          |          t          u r|                     |          S t          |          t
          t          t          fv r|                     |          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     ||k    rt          d          |dk     r||z  }|dk     ||k    rt          d          |                     t          |||                    S )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r   r3   delete_pager   r   rK  delete_pagesslicer  r  stopstep)r'   r   pcr  r  r  s         r(   __delitem__zDocument.__delitem__/  sP   { 	*[)))77c>>##A&&&77tUE***$$Q'''77%0111_7)'qvvR&qvvQaiiRKE aiiB;;1222QhhBJD Qhh"991222  udD!9!9:::r)   c                     | S r+   r,   r-   s    r(   r  zDocument.__enter__F  r  r)   c                 .    |                                   d S r+   closer>  s     r(   r  zDocument.__exit__I      

r)   r   r   c                     d S r+   r,   r'   r   s     r(   r_  zDocument.__getitem__L  s    r)   )r   	   c                     d S r+   r,   r  s     r(   r_  zDocument.__getitem__Q      Cr)   c                     d S r+   r,   r  s     r(   r_  zDocument.__getitem__U  r  r)   c                     t          |t                    r5 fdt          |                    t	                                D             S t          |t
                    sOt          |t                    r,t	          |          dk    rt          d |D                       sJ d|d            | vrt          d| d           	                    |          S )Nc                      g | ]
}|         S r,   r,   )r   r  r'   s     r(   r   z(Document.__getitem__.<locals>.<listcomp>[  s    BBBDGBBBr)   r   c              3   @   K   | ]}t          |t                    V  d S r+   )r=   r3   r   r$  s     r(   	<genexpr>z'Document.__getitem__.<locals>.<genexpr>\  s0      RqRqjkS]^_adSeSeRqRqRqRqRqRqr)   zInvalid item number: i=r   page z not in document)
r=   r  rK  indicesr6   r3   r   all
IndexError	load_pager  s   ` r(   r_  zDocument.__getitem__Y  s    a 	CBBBBUAIIc$ii,@,@%ABBBB!S!! 	.jE&:&: 	.s1vv{{sRqRqopRqRqRqOqOq{{---- @K{{D==8Q888999~~a   r)      c                    t           }da 	 d| _        d| _        d| _        d| _        g | _        i | _        i | _        i | _        t          j	                    | _
        t          |t          j                  r|}	|	| _        d| _        	 |a dS |}
|}t!          |          }t          j        |          s|j        |j        z
  }
|j        |j        z
  }|| _        || _        |i|||}t          |t0          t2          f          rntt          |t4                    rt1          |          }nOt          |t6          j                  r|                                }n t=          dt?          |          d          || _        t          |t0          t2          f          sJ tA          |          dk    rtC          d          t          j"        t          j#        |          tA          |                    }	 t          j$        |r|nd|          }n?# tJ          $ r.}tL          d	k    rtO                       tQ          d
          |d}~ww xY w|r|rJ t          |tR                    rn[tU          |d          rtS          |          }n;tU          |d          r|j+        }n#t=          dt?          |          d|d          || _        tX          j-        .                    |          st_          d| d          tX          j-        0                    |          stQ          d| d          tX          j-        1                    |          dk    rtC          d|d          |rm	 t          j2        |          }t          j$        ||          }n# tJ          $ r5}tL          d	k    rtO                       tQ          d|d|d          |d}~ww xY w	 t          j3        |          }nf# tJ          $ r2}tL          d	k    rtO                       tQ          d|d          |d}~ww xY wt          j                    }t          j4        |          }|
dk    r|dk    rt          j5        ||
||           n+t          j6        |          rt          j5        |ddd           || _        d| _7        | j7        rtp          9                                | _:        | j;        rd| _        n| <                                 |r'|=                                >                    d          s|rgd|=                                v rQ	 | ?                                }n;# tJ          $ r.}tL          d	k    rtO                       tQ          d          |d}~ww xY wt          rNt          | j        t          j                  | _        | j        rt          jB        | _C        nt          jD        | _C        |a dS # |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  r  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  
memoryviewr]  r8   r^  rv  r  r   r6   EmptyFileErrorfz_open_memorypython_buffer_datafz_open_document_with_streamrf   r	  ru   FileDataErrorr   r:   r   rc   r	   existsFileNotFoundErrorrq  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'   re   r   filetyper   r[  r  r   JM_mupdf_show_errors_oldpdf_documentr   r  r  stream2r)  r_  	fz_streamrY  r  s                      r(   r   zDocument.__init__b  sf   $ $8  B	< %DN %D %D#DM!DN!DN!DO#%D&:<<DO(E$566 '(	#' h $<   e AA%%A,Q//  D14KD14K!DJ DK!'H,<  (Hfuj&9:: E	22 E"6]]FF
33 E#__..FF#$C4<<$C$C$CDDD$!&5**=>>>>>v;;!## ))DEEE.u/G/O/OQTU[Q\Q\]]H<=YXXWY[bccCC  H H H+a//N4D4D4D'(?@@aGH  ',!!!!h,, UXz22 U"8}}HHXv.. U'}HH#$ST(^^$S$Sx$S$S$STTT%
 w~~h// R+,Ih,I,I,IJJJ11 R'(BH(B(B(BCCCW__X..!33()PH)P)P)PQQQ Yn$)$6x$@$@	#@9UU$ n n n/!338H8H8H+,e8,e,eX`,e,e,efflmmnY#4X>>$ Y Y Y/!338H8H8H+,P8,P,P,PQQWXXY
 '))&s++1uuQ(aH====055 <(c3;;;DI  DL| R!&? $(,D%%MMOOO  R 0 0 9 9% @ @ RH RQVZbZhZhZjZjQjQjR //11$ R R R/!338H8H8H+,IJJPQQR  ;#-ty%:K#L#L # ;',';D$$',':D$#;   #; ;;;;s   A:W 
E(W 3H W 
I)IIDW %)N W 
O0O		OW O' &W '
P#1-PP##DW 4U	 W 	
V)U<<VAW W!c                     | j         S r+   )r  r-   s    r(   __len__zDocument.__len__  s
    r)   c                     | j         rdnd}| j        &| j        dk    r|d| j        z  z   S |d| j        dz   S |d| j        | j        fz  z   S )Nzclosed r[   zDocument(<new PDF, doc# %i>)z
Document('z')z!Document('%s', <memory, doc# %i>))r   r   r   r  r'   r  s     r(   r   zDocument.__repr__  sh    /IIR;yB9DNJJJ149996666$)T^9TTTTr)   c           	         | j         s| j        rt          d          t          | d          }|j        sdS t          j        t          j        |          t          d          t          d          t          d          t          d                    }|j        rt          j	        |          st          d	          t          j        |          }t          ||          }t          j        |||           dS )
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  ry  r   pdf_new_nameJM_pdf_obj_from_strrM  )r'   r   rX  rY  fontsr  rE   s          r(   _addFormFontzDocument._addFormFont  s    > 	=T. 	=;<<<ta000~ 	F#!3''  $$     	=u'8%'@'@ 	= ;<<<%%d++E1a(((((r)   idxc                 d    |                                  |         }|                     |           dS )z$Delete TOC / bookmark item by index.N)get_outline_xrefs_remove_toc_item)r'   r6  r  s      r(   del_toc_itemzDocument.del_toc_item  s4    
 %%'',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        ||
           +|                    |           |}|                                  |S )zDelete the TOC.r+  r   r,  r-  OutlinesFirst)r   r  r   r   r   r   r  r1  r  JM_outline_xrefsr6   r   pdf_delete_objectr@  rK  JM_INT_ITEMrj   r  )r'   xrefsrY  r<  olrootfirst
xref_countolroot_xrefr   r  r  r  s               r(   _delToCzDocument._delToC"  su   > 	=T. 	=;<<<ta000~ 	L!%"3C"8"8(6:J:JKK#D(:*>*>??  	L"68G+<+<== ..ZZ
&v..[1114*!5!5666z"" 	/ 	/A!%++GAt#C....[!!!
r)   c                     t          |           }t          j        ||           |j        j        rt          j        |j                   d S d S r+   )r   r   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)r'   r  rY  s      r(   _delete_pagezDocument._delete_pageB  sR    t$$sC(((>& 	9'88888	9 	9r)   c                     t          |           }t          |dt          j        |          dz
            st	          t
                    t          j        ||           dS )zDelete object.r   N)r   r  r   r  r   r  r?  r'   r  rY  s      r(   _deleteObjectzDocument._deleteObjectH  sZ    t$$a!3C!8!8!:;; 	,l+++T*****r)   r0  doc1doc2	from_pageto_pagestart_atc                 (   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   |                    }	fdt          t	          |	                    D             }
g }g }t          t	          |	                    D ]f}|	|         }|
|         }|                    |          }|                     |          }|                    |           |                    |           gt          t	          |                    D ]}||	|                  }|                                }t	          |          dk    rd}:|j         }| |
|                  }g }|D ]C}|d         t          k    r|d	         |	vr ||||	|          }|r|                    |           D|g k    r"|
                    t          |                     dS )
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    rZt          d         }|                    | d                   }| d         |z  } |||         |j        |j        | d         |          }	nU| d         t          k    r| d         dk    rt          d         }|                     dt          dd                    }
t          |
          t          urt          dd          }
 || d         |
j        |
j        | d         | d	         | d	         |          }	nt          d
         }t          | d                   }|dd         }| d	         } ||||          }	nk| d         t          k    r't          d         } || d	         | d	         |          }	n3| d         t          k    r t          d         } || d         |          }	nd}	|	S )z5Create annotation object string for a passed-in link.fromkindgoto1r   tozoomr   gotor1r`   gotor2r   r0  launchurir[   )r   r   	LINK_GOTO
annot_skelindexr$  r%  
LINK_GOTORr7   r  r   get_pdf_strLINK_LAUNCHLINK_URI)lnkxref_dstpno_srcr  r  r   txtr6  r  r   pntrY  r  s                r(   	cre_annotz%Document._do_links.<locals>.cre_annot_  s    Fc!AU1XX&&D6{i'' )mmCK00IOHSM13S[$GGV
**v;!##$X.C''$a44CCyy--#AqkkCFFFF EE %X.C$SY//BAbDBFACAt,,EEV++ *CKVd;;V(( 'CJ-- Lr)   r   r   z'start_at' must be >= 0r0  c                     g | ]}|z   S r,   r,   )r   r   sas     r(   r   z&Document._do_links.<locals>.<listcomp>  s    777a26777r)   NrW  r   )r  r   r   rK  r6   	page_xrefrj   	get_linksrj  r_  _addAnnot_FromStringr   )rO  rP  rQ  rR  rS  rk  ru  r  incrrh  pno_dstxref_srcrg  r   p_srcp_dstold_xrefnew_xrefpage_srclinksr  page_dstlink_tabr  
annot_textrm  s                            @r(   	_do_linkszDocument._do_linksO  sk    ,	 ,	 ,	b q==BB$/))1$BBBQ;;'T_441$BBBa<<6777"HHqq" uRdD112277775W#6#6777 s7||$$ 	& 	&AAJEAJE~~e,,H~~e,,HOOH%%%OOH%%%% s8}}%% 	@ 	@AGAJ'H&&((E
 5zzQ11CGAJ'HH 0 0V9	))qy/G/G&Yq(GSAA
 0OOJ///2~~--uX???)	@ 	@r)   rk  r  c           	        ,-. |j         sdS d ,d .-fd--fd}d,.fd	}d }	t          j        |           }
t          j        |          }| j         r |	|           }|                    t	          d	                    }|                    t	          d
                    }|                                s#|                    t	          d
          d          }nt          j         |	|                    }|                    t	          d	                     |                    t	          d	          d           |                    t	          d
                     |                    t	          d
          d           t          j	        ||          }t          j
        |
|          }|                    t	          d	                    }|                    t	          d
                    }|                                }t          j        |
|d          }t          j        t          j        |
          t	          d                    }|                    t	          d          |           ||k    rt          ||dz             }nt          ||dz
  d          }i }|D ]{}||         }d |                                D             D ]R}t          j        ||          }|                    t	          d                      ||          \  }}|r	d|g d||<   S||                                D ]}t          j        ||          }t          j	        ||          }t          j
        |
|          } -|g           }|                                } t          j        |
| d          }!|                    |!           | ||         d<   |||         d<   t          t)          |                    D ]k}| ||z            }"|||                  }d |                                D             }#|#s=t          j        |"          }$t          j        |$                                t	          d                    }%t          j        |%          s5t          j        |$                                t	          d          d          }%|#D ]}t          j        ||          }t          j        t          j        |d                    }&t          j        |                    t	          d                              }|dk    r	 t          j	        ||          }'n,# t2          $ r}(t5          d|d|(            Y d}(~(d}(~(ww xY wt          j
        |
|'          })|)                                }t          j        |
|d          }*t          j        |%|*           t          j        ||*           n\||         }|d                             |          }+|d         |+         }t          j        |
|d          }*t          j        |%|*           |&rt          j        ||*           m ||
||           dS )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   t          |                                           D ]}|                     |          }|                    t	          d                    }t          |                                          D ]:}|                    |          }|                    t	          d          |           ;dS )z3 Make sure all kids have correct "Parent" pointers.Kidsr  N)rK  r  r  r  r  rM  )acro_fieldsr   r   kidsr  kids         r(   clean_kid_parentsz/Document._do_widgets.<locals>.clean_kid_parents  s    ;446677 A A$22155**8F+;+;<<t113344 A AA,,Q//C$$Xh%7%7@@@@AA Ar)   c           	         d }d }t          j        | |          }t          j        | |          }|                    t          d                    }	|                    t          d                    }
|	                                r || |||	||
           dS |
                                r || |||
||	           dS  || ||||||           dS )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          }|                    |          }|                    |           |                                sqt          j        | |          }	|	                    t          d                     |	                    t          d          |           |	                    |           dS t          |                                          D ]w}
|                    |
          }|                    t          d          |           t          j        | |                                d          }|	                    |           xdS )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  rM  pdf_array_pushrK  r  r  r   )rY  r  xref1kids1xref2kids2w1_indw2_indr6  r:  r   r  kid_inds                r(   	re_targetz=Document._do_widgets.<locals>.join_widgets.<locals>.re_target  sc    /UA>>/UA>>!0088,,S111))++ 6"23>>F ''666''(:(:FCCC ((00000"5#6#6#8#899 6 6#11!44(((););VDDD"'"8cnn>N>NPQ"R"R,,W5555	6 6r)   c                 h   t          j        | d          }|                    t          d          |           |                    t          d          d          }t          j        | |          }	|	                                }
t          j        | |
d          }|                    t          d                    }|	                    t          d                     |	
                    t          d          |           |                    t          d                    }|	                    t          d                     |	
                    t          d          |           |	                    t          d                     |
                    t          d          |           |	                    t          d                     |
                    t          d          |           t          j        | |d          }t          j        | |d          }|                    |           |                    |           |                    |          }|                    |           |                    |          }|                    |           |                    |           d	S )
a  Make new "Parent" for two widgets with same name.

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

                Result:
                    Both widgets have no "Kids". We create a new object with the
                    name and a "Kids" array containing the widgets.
                    Original widgets must be removed from AcroForm/Fields.
                r   r  r  r   r   FTAAr  N)r   rR  r~  r  pdf_dict_put_arraypdf_add_objectr   r  r  r@  rM  r  r  r  )rY  r  r  w1r  w2r   newr  new_objnew_obj_xrefnew_indftaaind1ind2r6  s                    r(   
new_targetz>Document._do_widgets.<locals>.join_widgets.<locals>.new_target  sD    (a00,,Xc]]DAAA--hv.>.>BB.sC88&11330lAFF __Xd^^44///$$Xd^^R888__Xd^^44///$$Xd^^R888 ... 2 2G<<<... 2 2G<<< -c5!<<-c5!<<##D)))##D))) "0066,,S111!0066,,S111**733333r)   r  N)r   r  r  r  r  )rY  r  r  r  r   r  r  r  r  r  r  s              r(   join_widgetsz*Document._do_widgets.<locals>.join_widgets  s   6 6 6<04 04 04d &sE22B&sE22BOOHV$4$455EOOHV$4$455E !!## I	#{E5%GGGGG##%% I	#{E5%GGGGG
3UBr4HHHHHr)   c           	         t          j        | t          d                    }|                                s|S t	          |                                          D ]}|                    |          }t          j        t          j        |t          d                              r ||          }X|                    |	                                           |S )z^Return xref list of leaf kids for a parent.

            Call with an empty list.
            r  )
r   r  r  r  rK  r  r  ry  rj   r   )r   	kids_listr  r   r  get_kidss        r(   r  z&Document._do_widgets.<locals>.get_kidsM  s    
 %fhv.>.>??D$$&& !  4--//00 7 7((++$U%7Xf=M=M%N%NOO 7 (i 8 8II$$S^^%5%56666r)   c                     g }t          j        | t          d                    }|                                }|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   )r:  r  r   parent_xrefr  s       r(   
kids_xrefsz(Document._do_widgets.<locals>.kids_xrefs]  se    I'0B0BCCF ++--Ka"I-- 33I	))r)   Fc                 |   i }t          t          j        |                    D ]}}t          j        ||          }|                                }t          j        |t          d                    }|                    |g           }|                    |           |||<   ~|	                                D ]y\  }	}t          |          dk     r|dd         \  }
}|r | ||
||	           8|	d| dz   }t          j        | |          }|                    t          d          |           z |           dS )z6Handle any widget name duplicates caused by the merge.r  r   Nz [rk  )rK  r   r  r  r   pdf_dict_get_text_stringr  r7   rj   rA   r6   r  r~  )rY  r  join_duplicatesnamesr   wobjectr  r  rA  r   xref0r  newnamer  r  s                r(   deduplicate_namesz/Document._do_widgets.<locals>.deduplicate_namesg  sW   E 5.{;;<< ! !-k1==))++ 27HSMMJJ		!R((T""" a${{}} 	M 	Meu::>>$RaRyu" M Lk5%FFFF"]%]]]2G#3C??G44Xc]]GLLLLk*****r)   c                 x    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_getpr1  )r)  rY  s     r(   get_acroformz*Document._do_widgets.<locals>.get_acroform  s0    5c::C&u'8'='=OOOr)   Fieldsr  r   r   r-  r.  r   r0  c                 :    g | ]\  }}}|t           j        k    |S r,   r   r2  r   r  wtyper  s       r(   r   z(Document._do_widgets.<locals>.<listcomp>  s6       "D%E222 222r)   P)rw  old_kidsnew_kidsrw  r  c                 :    g | ]\  }}}|t           j        k    |S r,   r  r  s       r(   r   z(Document._do_widgets.<locals>.<listcomp>  s6       "D%E222 222r)   r  zAA/Cr  zcannot copy widget at xref=rz   r  )r  F)is_form_pdfr   r  r  r  r  r  pdf_deep_copy_objr@  pdf_graft_mapped_objectr  r   r  r1  rM  rK  annot_xrefsr  keysr  r6   r   r  ry  r  rf   r   ra  )/rk  r  graftmaprQ  rR  rS  r  r  r  r  tarpdfsrcpdfacror  tar_co
acro_graftacro_tartar_xrefacro_tar_indr<  	src_rangeparentsr   src_pager  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_indr6  r  r  r  s/                                               @@@r(   _do_widgetszDocument._do_widgets  s     	F	A 	A 	Ah	I h	I h	IT	 	 	 	 	 	* 	* 	* 	* 	*	+ 	+ 	+ 	+ 	+ 	+ 	+8	P 	P 	P 4S994S99? 	B<$$D++HX,>,>??K&&x~~66F&&(( D00$CC *<<+<+<==D hx00111##HX$6$6:::htnn---##HTNNA666 6xFFJ +FJ??H"//0B0BCCK**8D>>::F  **,,H 1&(AFFL%e&7&?&?&AQAQRRDhz22LAAAi155IIi1b99I  	 	A1vH &.&:&:&<&<    
 -fd;;""8C==111 )3
5(9(9%X $%$,$&, ,GK(" LLNN 		7 		7D*6488F 86JJL-flCCJ%Xj"55N(3355O/KKJ&&z222(7GDM*%(6GDM*%%s9~~&& 8	@ 8	@A8a<(H 9Q<(H &.&:&:&<&<  G
   !6x@@L +L,<,<,>,>@R@RSSJ%j11 "5 $$&&(:(:A 
   @ @-fd;; *5+>uf+M+MNN $.&&x'9'9::  !##!&+&CHe&T&T$ ! ! !'(M(M(M!(M(MNNN ! !& 4V[ I II(3355H$)$:68Q$O$OM(]CCC(mDDDD$[1F ,22488C%j1#6H$)$:68Q$O$OM(]CCC  @(???=@@ 	&+OOOOOOs   ?U
U>U99U>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  r1  r  r  r  r  )r'   r6  rY  r  entryfilespecr  conts           r(   _embeddedFileGetzDocument._embeddedFileGet  s    t$$#!#&&  !!))!!  #E1S5733&uhtnnhsmmLL#H--$$r)   rB   c                     |                                  }dt          |          z  }||v r|                    |          }n0|t          t	          |                    v r|}nt          |          |S )Nz '%s' not in EmbeddedFiles array.)embfile_namesr   ra  rK  r6   r   )r'   rB   	filenamesr   r6  s        r(   _embeddedFileIndexzDocument._embeddedFileIndex  sr    &&((	03t99<9//$''CCU3y>>****CCS//!
r)   c           	         t          |           }t          |          }|j        st          t                    t          j        t          j        |          t          d          t          d          t          d          t          d                    }t          j	        |          st          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  r1  r  r  r  rJ  r  JM_embed_filer   r  r  )r'   r   r,  re   r  r  rY  r}  r  r<  	fileentryr  s               r(   _embfile_addzDocument._embfile_add)  s   t$$!'** 	-^,,,#!#&&  !!))!!  !%(( 		%e&7&<&<hv>N>NOOD'Q//EW%%_--W%%   "#tXy$JJ	#Ix~~x}}MM  	UE$=d$C$CDDDUI...r)   c           	      :   t          |           }t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t          j        ||dz              t          j        ||           d S )Nr-  r  r  r   )r   r   r  r1  r  r  )r'   r6  rY  r  s       r(   _embfile_delzDocument._embfile_delH  s    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        |          }nKt          j        |t	          d          t	          d                    }|j        rt          j        |          }||t           <   ||t"          <   |S )Nr   r-  r  r  r   r   CI
collectionr  r  r  r0  r  r  r  r  r  )r   r   r1  r  r  r  r  r   r   r  r  r  dictkey_ufilenamer  r  r  r  r  )r'   r6  infodictrY  r  ci_xreftrailerr  r  cir   len_r  r  s                 r(   _embfile_infozDocument._embfile_infoT  s^   t$$#C((#  !!))!!  quQw//8D>>22= 	+&r**G!('(:1hsmm(L(LMM%8%>%>!"'(:1htnn(M(MNN&9$&?&?"#'(:1hv>N>N(O(OPP"3D"9"9'8D>>8C==II		**y(8*<*<==< 	'#A&&Dy(4..99< 	)!!$$BB#Ix/A/A8FCSCSTTA| )%a((!##' r)   c           	         t          |           }t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t          j        |          rqt          j        |          }t          d|d          D ]M}t          t          j	        t          j
        ||                              }|                    |           LdS dS )z Get list of embedded file names.r-  r  r  r   r   N)r   r   r  r1  r  r  r  rK  r  r  r  rj   )r'   rw  rY  r  rD   r   r  s          r(   _embfile_nameszDocument._embfile_names  s    t$$#!#&&  !!))!!  e$$ 	%#E**A1a^^ % %)0!/q9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  r1  r  r  r   r  r  r&  r  r'  r(  r  r  rM  r  r   r~  )r'   r6  r,  re   r  r  rY  r  r  r  r  r  r6   r  r  s                  r(   _embfile_updzDocument._embfile_upd  s   t$$#!#&&  !!))!!  #E1S5733&uhtnnhsmmLL" 	E-/CDDD )) 	-w) 	-#. 	-^,,,> 	Sg 	S'*< 	SS(C333,S11FC!#&&Ax$;;;!Xh-?-?&AQAQRRR)) 	K*5(3--JJJ 	M*5(4..)LLL 	J*5(62B2BDII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dS t          j        |t          d                    }|j        sdS t          j        |t          d	                    }	|	j        sdS g }
t          |	|
          }
t          |
          }t          |          }|sdS ||k    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k    rd||<   t          j        |t          d                    }t          j        |          rt          j        |          dk    r~t          j        t          j        |d                    t          j        t          j        |d                    t          j        t          j        |d                    f}||t4          <   d}t          j        |t          d                    }|j        rt          j        |          s0t          j        |t          d          t          d                    }t          j        |          r?t          j        |          dk    r't          j        t          j        |d                    }t9          |          ||<   ||d<   |||<   dS )z4Add color info to all items of an extended TOC list.r   rZ  rM  ra  collapser-  Nr<  r=  z$internal error finding outline xrefsr   zneed non-simple TOC formatr  r   Tr   Countr   Fr  DestADr   rI  )r   r   r  r   Document_extend_toc_itemsr   r   r   r  r1  r  r   r>  r6   r  rK  r3   r=   r4   r  r  r  r  r  r  r  dictkey_colorr  rm  )r'   rA   rY  rZ  rM  ra  r  r<  rB  rC  rA  rD   r  r   r  rB   itemdictbmr  countr^  r  zr  s                           r(   _extend_toc_itemszDocument._extend_toc_items  s   > 	0./// 	F2DIuEEEt$$!%"3C"8"8(6:J:JKK 	F#D(:*>*>??  	F"68G+<+<== 	F ..JJJJ 	F66DEEE q %	 %	AuQx==D8DAwHh-- @ ">???%*1XH\"&sD11B$e&8Xc]]&K&KLLEzz#'  !!%!#' !%$e&8Xg=N=N&O&OPPEqyy%)""%*"$R#77C!#&& 05+>s+C+Cq+H+H)%*=c1*E*EFF)%*=c1*E*EFF)%*=c1*E*EFF
 +0'A$R&)9)9::C> L);C)@)@ L)"hsmmXc]]KK!#&& C5+>s+C+Cq+H+H%e&9#q&A&ABB"1XXHTNDGE!HHK%	 %	r)   r   c                 J    t          |          }|| j        v r
| j        |= dS dS )z&Remove a page from document page dict.N)r7  r  )r'   r   pids      r(   _forget_pagezDocument._forget_page  s2    hh$/!!$$$ "!r)   r  bfnameextorderinglimitc                    t          |           }|}|dk     rd}|dk    r1t          j        |          \  }	}
}t          j        d |	|
|d          }nrt          j        |          \  }	}
|	rt          j        ||	|
dd          }n@t          ||          }|j        st          d|z            t          j        d ||d          }g }t          |          D ]j}t          j
        ||          }t          j        ||d          }|dk    r|}|dk    r|                    ||f           S|                    |df           k|S )N   r   z font at xref %d is not supportedr  )r   r   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   rf   fz_new_font_from_bufferrK  fz_encode_characterfz_advance_glyphrj   )r'   r  r  r  r  r  r6  rY  mylimitr}  r  ra  rX  r  wlistr   glyphadvs                     r(   _get_char_widthszDocument._get_char_widths  se   t$$S==Gq== % 8 B BD$0tT5!LLDD4V<<JD$ H4VT4ANN'T22~ O#$F$MNNN4T3QGGw 	, 	,A-dA66E(ua88C1}}qyy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 ]Y}t          j        t          j        t          j        ||          t          d                              }t          ||           Z|S )N
PageLabelsr-  Numsr  )r   r   r2  r  r1  r  r   pdf_resolve_indirectr  JM_get_page_labelsr  r  rK  r  )	r'   rY  r   
pagelabelsr  numsr  rD   r   s	            r(   _get_page_labelszDocument._get_page_labels&  s   t$$'55
!5#4S#9#98F;K;KZXX~ 	I)5+=sHVDTDT+U+UVV? 	r4(((I)5+>sHVDTDTV^_eVfVf+g+ghh? 	r4(((I)5+=sHVDTDT+U+UVV 	e&8&>&> 	I%%q 	) 	)A-&+D!44 ((  D r4((((	r)   c                     	 t          j        | j        |          S # t          $ r t          dk    rt                       Y dS w xY w)zGet metadata.r   r[   )r   fz_lookup_metadata2r   rf   r	  ru   r  s     r(   _getMetadatazDocument._getMetadataF  sT    	,di=== 	 	 	#a''N,<,<,<22	s    #AAc                 z   | 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-  r<  rI  Type)r   r  r   r   r   r  r1  r  r   rR  rM  r  r   )r'   rY  r<  rB  ind_objs        r(   _getOLRootNumberzDocument._getOLRootNumberN  s   > 	=T. 	=;<<<t$$!5#4c#:#:HV<L<LMM#T8J+?+?@@  	E'a00F(8(8(::N:NOOO*C88Ghz&:&:GDDD'x
/C/CDDF(((r)   c                    t          | d          }|j        sdS g }t          j        t          j        |          t          d                    }|j        rxt          j        |          }t          |          D ]T}t          j        ||          }t          j	        |          }t          j        |          }|                    |           U|S )zGet PDF file id.r   r,  NID)r   r   r   r  r1  r  r  rK  r  r  binasciihexlifyrj   )	r'   rY  idlistidentityrD   r   r  r   hex_s	            r(   _getPDFfileidzDocument._getPDFfileid_  s    ta000~ 	F%e&7&<&<htnnMM 	$#H--A1XX $ $'!44/2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     ||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)  	pageCountrD   rY  pagerefrsrclistetracers              r(   _getPageInfozDocument._getPageInfoo  s    > 	=T. 	=;<<<i2<S%BS2T2TsE)#...Z_ZnorZsZs	!eeNA !ee	>>n---t$$+C33-gu7TUU? 	Ac4a@@@r)   c                     t          |           }|s|st          t                    t          |d||dddddd
  
        }|S )z;
        Utility: insert font from file or binary.
        Nr   r0  )r   r   MSG_FILE_OR_BUFFERJM_insert_font)r'   fontfile
fontbufferrY  r   s        r(   _insert_fontzDocument._insert_font  sS     t$$ 	2
 	20111sD(J1aArRRr)   c                     | j         }t          |t          j                  sJ 	 t          j        |          }n*# t
          $ r t          dk    rt                       Y dS w xY wt          |          S )zLoad first outline.r   N)	r   r=   r   r   fz_load_outlinerf   r	  ru   Outline)r'   r)  r  s      r(   _loadOutlinezDocument._loadOutline  s    i3 011111	&,,BB 	 	 	#a''N,<,<,<FF	 ||s   : #A! A!c                 B    | j         rt          d          J d            )z)Make an array page number -> page object.r   r   z_make_page_map() is no-op)r   r   r-   s    r(   _make_page_mapzDocument._make_page_map  s*    > 	0.///.....r)   c                    t          |           }d}t          ||          \  }}}	t          j        |t	          d                    }
t          ||          \  }}}t          j        |t	          d                    }|r|}n|dz   }t          j        |
|          }|s)|dk    r#t          j        |t	          d          |           t          j        |||           |dk    r|}|j        rqt          j	        |t	          d                    }t          j
        |t	          d          |dz              t          j        |t	          d                    }|j        q|st          j        |
|	           |}|j        rqt          j	        |t	          d                    }t          j
        |t	          d          |dz
             t          j        |t	          d                    }|j        qn|r{|}|j        rqt          j	        |t	          d                    }t          j
        |t	          d          |dz              t          j        |t	          d                    }|j        qn4|	|k     rt          j        |
|	           nt          j        |
|	dz              |j        j        rt          j        |j                   |                                  dS )z"Move or copy a PDF page reference.r   r  r   r  r  N)r   pdf_lookup_page_locr   r  r  r}  rM  pdf_array_insertr   pdf_dict_get_intrH  r  rI  rJ  _reset_page_refs)r'   r  nbbeforecopyrY  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-=-=>> 	CCq&C ..  	D		x'9'97CCCuc222199F# I.8I8IJJ&0A0A519MMM+VXh5G5GHH # I  M&r222 ' M!2FHW<M<MNNE*FHW4E4EuqyQQQ"/(9K9KLLF ' M
  
; ' M!2FHW<M<MNNE*FHW4E4EuqyQQQ"/(9K9KLLF ' M
 88*E26666*E26:::>& 	9'888r)   S  J  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        |||           |                                  | |         S )zMake a new PDF page.r+  r0  r   r   )r   r  r   r  r   _newPager   r   r   rg  
Fixed_UNITr  r
  FzBufferr=  pdf_add_new_dictpdf_add_pagepdf_insert_pagerY  )	r'   r  r[  r  rY  mediaboxcontentsr`  page_objs	            r(   ri  zDocument._newPage  s    > 	=T. 	=;<<< 	7NDIsE6::::"4((C|EL$;<<HHK HK~''HRxx .111 .sA66I)3!YQQH!3X666 	Cyr)   c                 D    t          |           }t          ||           d S r+   )r   _remove_dest_range)r'   numbersrY  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          |           d S )Nr   r  r  r   皙?r  )	r   r   r  r@  r  rJ  rK  rL  rM  )r'   r  rY  rB   r  r   s         r(   r9  zDocument._remove_toc_item  s    t$$%c433D(6"2"2333D(3--000#S!,,q 	3 	3A%uc2222D(3--77777r)   c                     t          | dd          rdS d | j                                        D             }|D ]}|r|                                 d}| j                                         dS )z,Invalidate all pages in document dictionary.r   TNc                     g | ]}|S r,   r,   r   r  s     r(   r   z-Document._reset_page_refs.<locals>.<listcomp>  s    555q555r)   )r   r  r  r   clear)r'   pagesr   s      r(   rY  zDocument._reset_page_refs  s    4d++ 	F55DO2244555 	 	D r)   c                     t          |           }t          j        d          }t          j        t          j        |          t          d                    }t          j        ||           t          j        |t          j        |d          |t          d                     | 	                                }| 
                    |d          }|                    dd|z            }|                     ||           d S )	Nr$  r-  r   r%  T
compressedz/Nums[]z	/Nums[%s])r   r   r2  r  r1  r  r@  r  rJ  pdf_catalogxref_objectr  update_object)r'   labelsrY  r(  r<  r  r   s          r(   _set_page_labelszDocument._set_page_labels  s    t$$'55
!%"3C"8"8(6:J:JKK4,,,D%"5c1"="=z8TZK[K[\\\!!66||I{V';<<4&&&&&r)   c                    t          |           }t          j        ||d          }|r#t          j        |t	          d          |           |rUt          j        |t	          d                     t          ||          }	t          j        |t	          d          |	           t          j        |t	          d          |           |rht          j	        |d          }
t          d          D ]}||         }t          j        |
|            t          j        |t	          d          |
           n$|"t          j        |t	          d                     |t          j        |t	          d	                    j        rbt          j        |t	          d	                    }|dk     r|d
u s
|dk    r2|du r0|dz  }t          j        |t	          d	          |           dS dS dS dS dS )zB
        "update" bookmark by letting it point to nowhere
        r   Titler  r  r  r   r  Nr  FTr0  )r   r   r  r~  r  r@  r3  rM  rH  rJ  rK  rL  r  r   rX  )r'   r  actionrw  r  r  r  rY  rB   r  r  r   r  s                r(   _update_toc_itemzDocument._update_toc_item  s    t$$%sD!44 	L*D(72C2CUKKK 	:hv&6&6777%sF33ChsmmS999hsmmU;;; 	5#S!,,A1XX 1 1!H)1a0000hsmmQ7777hsmm444!4'):):;;F H*D(72C2CDDEEh%//QUUx4?O?ORA*D(72C2CQGGGGG  H H5:U?O?Or)   c           	      &   t          | d          }|j        sdS t          j        t          j        |          t          d          t          d          t          d          t          d                    }t                      }|j        rt          j        |          rot          j        |          }t          |          D ]K}t          j
        ||          }|                    t          t          j        |                               L|S )z&Get list of field font resource names.r   r,  Nr-  r.  r/  r0  )r   r   r   r  r1  r  r   ry  rz  rK  r|  rj   r  rx  )r'   rY  r4  rF  rD   r   r  s          r(   	FormFontszDocument.FormFonts0  s     ta000~ 	F#!#&&  $$     	F 1% 8 8 	F"5))A1XX F F*5!44.u/@/C/CDDEEEEr)   c                 z    t          |           }t          ||||           t          j        |j                   dS )zAdd a new OC layer.N)r   JM_add_layer_configr   ll_pdf_read_ocgr   )r'   r   creatoronrY  s        r(   	add_layerzDocument.add_layerE  s<    t$$S$44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                     n^t          |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k    r{t          j        |t	          d                    }t          j        |          st%          t&                    t          j        ||          }|j        st%          t&                    n"t          j        |t	          d                    }t          j        |t	          d                    }|j        s#t          j        |t	          d          d          }t          j        ||           |rMt          j        |t	          d                    }|j        s#t          j        |t	          d          d          }nLt          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OCGsr0  Configsr  Orderr   ONOFF)r   r   rl  rM  r  r~  r  r  r=   r   r   r2  rQ  rT  r  JM_ensure_ocpropertiesr  r  r   MSG_BAD_OC_CONFIGr  r   r  r   )r'   r   configr  intentusager  rY  ocgintentsuse_forci_namecre_infoindocgocpr  cfgs                    r(   add_ocgzDocument.add_ocgK  s   t$$ $S!,,3 0 0(5//BBB&sHV,<,<dCCC*30B0BAFF 	F (6*:*:;;;;FC(( 	FLLT&\\LLTLLLLL  %*<V*D*DEEE)#x/@/@!DD$]33*7GQ??&x)1D1DiPPP 	N#Hhy.A.A5IIII#Hhy.A.A9MMM%c3// %S)) hv&6&677S&)))B;;$S(9*=*=>>C%c** 5 "3444%c622C> 5 "34445 $S(3--88C hw&7&788~ 	F*30A0A1EECS&))) 	G$S(4..99C> G.sHTNNAFF#C%99C> G-c8E??AFFS&))) 	cn---''r)   c                     | j         rt          d          t          j        | j        |          }|r)d| _        d| _        |                                  d| _        |S )zDecrypt document.r   FT)r   r   r   fz_authenticate_passwordr   r  r  r   )r'   passwordr  s      r(   authenticatezDocument.authenticate  s`    > 	0.///,TYAA 	  %D %DMMOOODL
r)   c                 ^    t          | d          }|j        sdS t          j        |          S )z-Check whether incremental saves are possible.r   r,  F)r   r   r   pdf_can_be_saved_incrementallyr'   rY  s     r(   can_save_incrementallyzDocument.can_save_incrementally  s4    ta000~ 	53C888r)   T)r  widgetsr  r  c                    t          |           }t          j        |t          |          t          |                     dS )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_documentr3   )r'   r  r  rY  s       r(   bakezDocument.bake  s8     t$$S[[#g,,?????r)   c                 `    | 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  s0     > 	0.///&	2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  chaptersr|  s       r(   r  zDocument.chapter_page_count  sh    > 	0.///*DI66Q;;'X--2333,diAAr)   c                     t          | dd          rt          d          t          | d          r| j        rd| _        |                                  d| _        i | _        d| _        dS )zClose document.r   Tr   _outlineN)r   r   r:   r  rY  r   r  r   r-   s    r(   r  zDocument.close  sv    4d++ 	0.///4$$ 	! 	! DM ! 			r)   c                    | j         s| j        rt          d          | j        }|}|}t	          j        |          }|dk     rd}||dz
  k    r|dz
  }|dk     r|dz
  }||dz
  k    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   r<  r6   JM_mupdf_warnings_storeJM_convert_to_pdfrK  rq   )r'   rQ  rR  rX  fz_docru  r  srcCountlen0r)  len1r   s               r(   r  zDocument.convert_to_pdf  s    > 	=T. 	=;<<<'//66B1AB66AB1AB*++B77*++tT"" 	5 	5A.q134444
r)   r  rY  c                    | j         rt          d          t          |           }|t          |          vs|t          d|          vrt          d          d}d}|dk    r|dz
  }d}|                     ||||          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   r0  r  r   r   r   r   r6   rK  re  r'   r  rY  r  r[  r\  s         r(   	copy_pagezDocument.copy_page  s     > 	0.///YY
5,,,,U2z2222122288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                     dS dS )zDelete XML metadata.r+  r-  MetadataN)
r   r  r   r   r   r  r1  r  r   r@  )r'   rY  r<  s      r(   del_xml_metadatazDocument.del_xml_metadata	  s    > 	=T. 	=;<<<t$$!5#4c#:#:HV<L<LMM? 	<hz&:&:;;;;;	< 	<r)   c                 ,    |                      |          S )z% Delete one page from a PDF.
        )r  )r'   r  s     r(   r  zDocument.delete_page  s       %%%r)   c                 ^   | j         st          d          | j        rt          d          | j        }dx}}|r|rt          d          |                    dd          }|                    dd          }|dk     r||z  }|dk     |dk     r||z  }|dk     ||cxk    r|k     sn t          d          t          t          ||d	z                       }nt          |          d
k    s|g k    rt          d          t          |          d
k    r|\  }}t          |          t          u rt          |          t          u st          d          ||k    r||}}||cxk    r|k     sn t          d          t          t          ||d	z                       }nMt          |d         t                    r|d         }|dk     r||z  }|dk     |f}nt          |d                   }t          t          t          t          |                              }|g k    rt          d           dS |                                 |d         dk     s|d         |k    rt          d          t!          |          }|                                 }	t%          |                                           D ]-\  }
}|	|
         d
         d	z
  |v r|                     |           .|                     |           t-          |          D ]}
|                     |
           |                                  dS )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   r0  z*cannot mix keyword and positional argumentrQ  rR  r   r  r   r   z need 1 or 2 positional argumentszboth arguments must be intznothing to deleteN)r  r   r   r  r7   r   rK  r6   r   r3   r=   r   r  setrq   sort	frozensetget_tocr  r8  r9  ru  reversedrK  rY  )r'   r  kwr  r  rE  rt  r  frozen_numberstocr   r  s               r(   r  zDocument.delete_pages  s`    { 	*[)))> 	0.///_

A 	) O !MNNN{B''Ay"%%Aa%%Z a%%a%%Z a%%&&&&J&&&& !5666E!QUOO,,GG4yy1}}

 !CDDD4yyA~~1Q3477c>>$%ABBBq55aqAA****
****$%9:::aQ00DGS)) )1gAgg:%C Agg&Q..s3G--..b=='(((F1:>>WR[J661222"7++llnn !7!7!9!9:: 	, 	,GAt1vay1}..%%d+++n---'"" 	! 	!Aa    r)   r   r,  re   r  r  c                    |                                  }dt          |          z  }||v rt          |          ||}||}||}|                     |||||          }t	                      }	|                     |dd           |                     |dt          |	                     |                     |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 '%s' already exists.Nr,  re   r  r  r/  z/EmbeddedFileParams/CreationDateParams/ModDate)r  r   r   r  get_pdf_nowrl  rc  )
r'   r   r,  re   r  r  r  r   r  dates
             r(   embfile_addzDocument.embfile_add\  s      &&((	)CII59S//!H I<D  !# !   }}$888$ 5{47H7HIII$ 0+d2C2CDDDr)   c                 D    t          |                                           S )zGet number of EmbeddedFiles.)r6   r  r-   s    r(   embfile_countzDocument.embfile_count  s    4%%''(((r)   c                 V    |                      |          }|                     |          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'   rB   r6  s      r(   embfile_delzDocument.embfile_del  s+     %%d++  %%%r)   c                 V    |                      |          }|                     |          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                    |                      |          }d|                                 |         i}|                     ||          }|                     |d          \  }}|dk    r||d<   |                     |d          \  }}|dk    r||d<   |                     |d          \  }}|dk    r;t	          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  rx  r  ry  zParams/CheckSumchecksum)r  r  r  xref_get_keyr4  r5  r  decode)r'   rB   r6  r  r  rE  r  md5s           r(   embfile_infozDocument.embfile_info  s     %%d++D..0056!!#x00##D*?@@4;;'+H^$##D*:;;4;;"&HY""4):;;3;;#+#3CJJLL#A#A#H#H#J#JHZ r)   c                 4    g }|                      |           |S )z#Get list of names of EmbeddedFiles.)r  )r'   r  s     r(   r  zDocument.embfile_names  s!    	I&&&r)   c                     |                      |          }|                     |||||          }t                      }|                     |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  rl  rc  )	r'   rB   r,  re   r  r  r6  r  r  s	            r(   embfile_updzDocument.embfile_upd  sq    & %%d++  !# !   }}$ 0+d2C2CDDDr)   c           
      f   t          |           }t          j        ||          }t          j        |t	          d                    }t          j        |t	          d                    }t          j        |t	          d                    rt          j        |                              d          sZt          j        |t	          d                    }|j        rt          j	        |          r#t          j        |t	          d                    }	n|}	t          ||          }
|
dk    r"|s t          ||          }t          |          }nd}|sRt          t          j        |	                    t          |
          t          t          j        |                    |f}nt          t          t          j        |	                    t           t          |
          t"          t          t          j        |                    t$          |i}n#|sd	}nt          d
t           d
t"          d
t$          di}|S )zD
        Get a font by xref. Returns a tuple or dictionary.
        r/  r  r0  CIDFontTypeBaseFontr  n/ar)   )r[   r[   r[   r)   r[   )r   r   r  r  r  pdf_name_eqrx  r2   r   pdf_is_nullJM_get_fontextensionr  r  r  r  r  dictkey_extdictkey_typer  )r'   r  	info_onlynamedrY  r  rZ  subtypebasefontbnamer  r,  bytes_r   s                 r(   extract_fontzDocument.extract_font  s   
 t$$#C.."3(8(899$S(9*=*=>>eXf%5%566 %	)733>>}MM%	 )#x
/C/CDDH& !%*;H*E*E !*30@0@AA &sD11Ce||I|+C66)'22 +E,=e,D,DEE)#..)%*;G*D*DEE	 %&9%:KE:R:R&S&S#%6s%;%;$&78I'8R8R&S&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        |                                          |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_imager4   _make_image_dictdictkey_smaskr  r  dictkey_cs_name)	r'   r  rY  r  r  r  smaskr  r   s	            r(   extract_imagezDocument.extract_image  s]   > 	=T. 	=;<<<t$$a!3C!8!8!:;; 	,l+++$S$22$S(9*=*=>> (7*;*;<< 	.n---Xg%6%68H8HII< 	$Q''EEE "3,,VVb!!!!=#6s~~7G7GHH?	r)   r   F  c                 R    |                      |||||||||	|
|||||||||          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)save)r'   re   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,  sX    2 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_bookmark[  sI    > 	=T. 	=;<<<,di<<..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 ]7}
t          j        ||
          }t          j	        |t          d                    }t          j        |t          d                    r]t          j        |d          j        rxt          j        t          j        |                    }t          j        |          }t          j        |||           t          j        ||d          }t          j        |t          d                     t          j        |t          d                     t          j        |	|           9t          j        |t          d          |	           t1          |          }|rv|j        rot          j        |t          j        d	          t          j                    d          }t9          |||d           t          j        |t          d
          |           t          j        |          }t          j        |||           t          j        ||d          }t          j        |||           t          j        |j                   n# t          j        |j                   w xY w|                                  dS )zMake a full page duplicate.r   r   r0  r  r  r  r  r      r  N) r   r   r;  r  r   r=  r&  r>  r  r  r  r   r  rJ  rK  r  r  r   pdf_create_objectpdf_update_objectr  r@  r  rM  JM_read_contentspdf_add_streamr  PdfObjr(  rn  rJ  rY  )r'   r  rY  rY  r  r^  ra  
old_annotsrD   
new_annotsr   r  r  copy_or  r  rp  s                    r(   fullcopy_pagezDocument.fullcopy_pageb  s-   t$$*C00
0	9S!Z!^44 2#BJN;;2 !.111.0I3PS0T0TUUE+U33E+UHX4F4FGGJ $ K'44"0#q99
q > >A+Z;;A#0!Xi5H5HIIG('8G3D3DEE ! *Au55@ ! "4e6PRS6T6TUUF 2C88D+S$???"3S$BBF&0A0ABBB&>>>(*f===="E8H+=+=zJJJ #E**C  Ks~ K /e6Z\`6a6achcocqcqstuu #xa888"E8J+?+?JJJ *C00D#S$666*Cq99E!3E222'8888E'8888s   LM M,r  r)  fontdictc                    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                            |           n |d         }|d         }|d         }|d         }|d}nt          |          }t          d|          }||k    r|S |dk     r-| 
                    ||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   r0  ZapfDingbatsSymbolglyphsr  )CheckFontInfor  _get_font_propertiesr   zapf_glyphssymbol_glyphsr  rj   r6   r  r"  UpdateFontInfo)r)  r  r  r6  r/  fontinfor   r  stypeascdscr  r3  rA  oldlimitr  s                   r(   get_char_widthszDocument.get_char_widths  sA   ( !d++-2-GT-R-R*c5#s ! #!$   'uo (#J/!(+byy !5666 888 )))***---,,,!'HX~%%$!!&!'HX#+HZ h'HM  ****{Hh'Fh'F
+H>HH6{{Hc5//hMa<<))hv&*9MwX[ FF F#sH%%%r)   c                    t          |           }t          j        t          j        |          t	          d          t	          d                    }|j        sdS |dk    r#t          j        |t	          d                    }n5t          j        t          j        |t	          d                    |          }|j        st          t                    t          |          }|S )z,Content of ON, OFF, RBGroups of an OC layer.r-  OCPropertiesNr0  r  r  )r   r   r  r1  r  r   r  r  r   r  JM_get_ocg_arrays)r'   r  rY  r  r  r   s         r(   	get_layerzDocument.get_layer  s    t$$!!3''  (( 
 ~ 	FR<<$c8C==99CC%&Xi-@-@AA C ~ 	1/000$$	r)   c                    t          |           }t          j        |          }|dk    rft          j        t          j        |          t          d          t          d          t          d                    }t          j        |          sd}g }t          j                    }t          |          D ]=}t          j	        |||           ||j
        |j        d}|                    |           >|S )zShow optional OC layers.r   r-  rN  r  r   )numberr   r  )r   r   pdf_count_layer_configsr  r1  r  r  PdfLayerConfigrK  pdf_layer_config_infor   r  rj   )r'   rY  rD   r  r   r  r   rB   s           r(   
get_layerszDocument.get_layers  s    t$$)3//66%%s++V$$^,,Y''	 C %s++ #%%q 	 	A'a666 I#| 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'   rY  r  s      r(   get_new_xrefzDocument.get_new_xref.  sZ    > 	=T. 	=;<<<t$$&s++r)   c                 2   | j         s| j        rt          d          |                     |d          \  }}|dk    s|dvrt          d|z            |                     |d          \  }}|dk    rdS t	          |                    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 %ir  r  r   0 Rr[   )r   r  r   r  r3   r  )r)  r  rE  r   r  r   s         r(   r  zDocument.get_oc8  s     = 	<C, 	<:;;;""4334;;$&9999D@AAA  t,,2;;1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(|                    t          j        |                     nt          j        |          rvt          j	        |          }t          |          D ]R}t          j        ||          }t          j        |          r'|                    t          j        |                     St&          d
k    r+t          j                    }t          j        ||||          }n(t          j        |t          j                    ||          }|	|| |d}|}|||<   |S )z&Show existing optional content groups.r  r-  rN  r  r  r  r  Nr  )r      r  )r   r  r  r  )r   r2  r   r  r  r1  r  r4   r  r  rK  r  r   r  r   rx  r   r  rj   mupdf_version_tuplePdfResourceStackpdf_is_ocg_hiddenr*  )r'   r  rY  ocgsr   rD   r   r  r  r   r  r  r  r  r  r  r  resource_stackhiddenrB   r  s                        r(   get_ocgszDocument.get_ocgsI  s   //t$$""E$5s$;$;Xf=M=MNN((   
 VV!4(( 	I&&q 	 	A%tQ//C#S))D+U-?hvFVFV-W-WXXD%sHW,=,=r8ICVCVWWCE~ 0)3//ffG'hx.@.@AAF  C$f-- CNNE$5v$>$>????'00 C+V44A"1XX C C!/;; ,a00 C#NNE,=q,A,ABBB"k11!&!7!9!90#~ucRR0#u|~~ucRR %$*"	 D DBII	r)   c                    |t          |                                           vrt          d          |                     |d          }d|vrt          d          t	          |          }|                    d          }|                    d|          }|dk     s|dk     rd	}nU||d
z   |                             dd                                          }t          t          t          |                    }|                    d          }|dk     rd	}nW|                    d|          }|dk     r|                    d|          }|dk     rt          d          ||dz   |dz            }|                    d          }|dk     rd	}n0dx}	}
|}|	dk     s|	|
k    rH|dz  }||k     st          d          ||         dk    r|	dz  }	||         dk    r|
dz  }
|	dk     B|	|
k    H||dz   |dz            }|                    dd                              dd                              dd          }|                    dd                              dd                              dd           }dd	l}	 |                    |          }n/# t          $ r" t                       t          d!|            w xY w||||d"S )#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 xrefTr~  
/Type/OCMDzbad object type/OCGs[rk  r   Nr  r`  r   z/P/r|  r  zbad object at xrefr   r   z/VE[r   rj  z/Andz"and",z/Notz"not",z/Orz"or",z 0 R] 0 Rr   z][z],[zbad /VE key: )r  rf  policyve)rK  xref_lengthr   r  r6   r   r  r5   r   r  r3   jsonloadsrf   ru   rq   )r)  r  r   textlenp0r  rf  ro  rp  lprprr  s               r(   get_ocmdzDocument.get_ocmdx  s    uS__..////Z(((t55t##.///d))YYx  YYsB66R!VVDDQ$,,UC88>>@@DC''DYYu66FF4$$BAvvYYtR((Avv !5666b1frAvo.YYv66BBKBBq&&B"HHaG||$%9:::8s??!GB8s??!GB q&&B"HH b1frAvo&B

68,,**(( 
 GS))11&#>>FFtUSSBKKKZZ^^      .../// dfBGGGs   :J ,J<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-  r<  r=  )r   r   r   r  r1  r  r>  )r'   rA  rY  r<  rB  rC  s         r(   r8  zDocument.get_outline_xrefs  s    ta000~ 	L!%"3C"8"8(6:J:JKK 	L#D(:*>*>??  	L"68G+<+<== 	L ..r)   fullc                 .   | j         s| j        rt          d          | j        sdS t	          |          t
          ur4	 |j        }n+# t          $ r t                       t          d          w xY w| 	                    |d          }|sd |D             S |S )z1Retrieve a list of fonts used on a page.
        r+  r,   zneed a Page or page numberr   c                 "    g | ]}|d d         S Nr0  r,   r   rE   s     r(   r   z+Document.get_page_fonts.<locals>.<listcomp>       (((qAcrcF(((r)   )
r   r  r   r  r   r3   rR  rf   ru   rH  r'   r  rz  r  s       r(   get_page_fontszDocument.get_page_fonts  s     > 	=T. 	=;<<<{ 	299C?j ? ? ?    !=>>>? Q'' 	)((C((((
s   A (A.c                     | j         s| j        rt          d          | j        sdS |                     |d          }|sd |D             S |S )z2Retrieve a list of images used on a page.
        r+  r,   r   c                 "    g | ]}|d d         S r}  r,   r~  s     r(   r   z,Document.get_page_images.<locals>.<listcomp>  r  r)   r   r  r   r  rH  r  s       r(   get_page_imageszDocument.get_page_images  sl     > 	=T. 	=;<<<{ 	2Q'' 	)((C((((
r)   c                 >    d |                                  D             S )zReturn page label definitions in PDF document.

        Returns:
            A list of dictionaries with the following format:
            {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
        c                 6    g | ]}t          j        |          S r,   )r  	rule_dict)r   rB   s     r(   r   z,Document.get_page_labels.<locals>.<listcomp>  s"    JJJ$%%JJJr)   )r*  r-   s    r(   get_page_labelszDocument.get_page_labels  s%     KJ$2G2G2I2IJJJJr)   c                     g }|s|S |                                  }|g k    r|S t          | j                  D ]6}t          j        ||          }||k    r|                    |           |r n7|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*  rK  r  r  get_label_pnorj   )r)  labelonly_onert  r  r   plabels          r(   get_page_numberszDocument.get_page_numbers  s      	N%%''R<<Ns~&& 	 	A(F33Fq!!! Er)   r  r  r  r   r  r  r  r  r   r  r  c                h    |t           }|t          }| |                             ||||||          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
        Nr  )Identityr  r  )r)  r  r  r  r  r   r  r  s           r(   get_page_pixmapzDocument.get_page_pixmap  sK    . >FJ3x""J #   	r)   r   optionr  textpager  r  c                 @    | |                              ||||          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  r  r   r  r  r  s          r(   get_page_textzDocument.get_page_text2  s%    & 3x  d%d KKKr)   c                 ~    | j         s| j        rt          d          | j        sdS |                     |d          }|S )z4Retrieve a list of XObjects used on a page.
        r+  r,   r   r  )r'   r  r  s      r(   get_page_xobjectszDocument.get_page_xobjectsG  sP     > 	=T. 	=;<<<{ 	2Q''
r)   c                    t          | d          }|j        sdS t          j        t          j        |          t          d          t          d          t          d                    }d}|j        rt          j        |          }|S )zGet the /SigFlags value.r   r,  r0  r-  r.  SigFlags)r   r   r   r  r1  r  r  )r'   rY  sigflagssigflags       r(   get_sigflagszDocument.get_sigflagsQ  s    ta000~ 	2&!#&&  $$$$	   	1&x00Gr)   r3  c                       fd j         rt          d                                             j        }|sg S d}g } |||          } j        rs                     |           |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                    | r| j         j        r| j        r| j        }nd}| j        sF| j        r<| j        dk    r&                    | j                  }|d         dz   }n| j        dz   }nd}nd}	s/t          j        |           }|	                    ||||g           n|	                    |||g           | j
        r | j
        ||dz             }| j        } | r| j         j        |S )zPRecursively follow the outline item chain and record item information in a list.r   r0  r   r   )r   r   rw  is_externalr^  r   resolve_linkr  getLinkDictrj   downr;  )
olItemrF  lvlrw  resolver   linkr)  r  r3  s
          r(   r  z!Document.get_toc.<locals>.recursej  s'    %V[3 %<  "LEEE) 
z "!;",,&)&6&6vz&B&BG#*1:>DD#);?DD!D 5 ,VS99DLL#udD!9::::LL#ud!3444; A#GFKa@@E5  %V[3 %6 Lr)   r   r   )r   r   r  outliner  r  )r)  r3  r  r  rF  r  r  s   ``    @r(   r  zDocument.get_toca  s    	 	 	 	 	 	 	@ = 	0./// 	IgfeS)): 	'f 	'!!#&&&
r)   c                    d}t          | d          }|j        rBt          j        t          j        |          t          d          t          d                    }|+|j        r$t          j        |          }t          |          }nd}|S )zGet document XML metadata.Nr   r,  r-  r  r[   )r   r   r   r  r1  r  r  JM_UnicodeFromBuffer)r'   xmlrY  rN  r   s        r(   get_xml_metadatazDocument.get_xml_metadata  s    ta000> 	%%c**V$$Z(( C
 ?s~?(--D%d++BBB	r)   c                    | j         rt          d          | j        st          d          t          | j                  D ]J}|                     |          D ]2}|d         t          j        k    s|d         t          j        k    s  dS 3KdS )z0Check whether there are annotations on any page.r   r  r   TF)	r   r   r  rK  r  page_annot_xrefsr   PDF_ANNOT_LINKr2  r)  r   rB   s      r(   
has_annotszDocument.has_annots  s    = 	0.///z 	*[)))s~&& 	  	 A,,Q//    Q5#77747eF\;\;\444  ur)   c                     | j         rt          d          | j        st          d          t          | j                  D ]4}|                     |          D ]}|d         t          j        k    r  dS 5dS )z*Check whether there are links on any page.r   r  r   TF)r   r   r  rK  r  r  r   r  r  s      r(   	has_linkszDocument.has_links  s    = 	0.///z 	*[)))s~&& 	  	 A,,Q//    7e222444 3  ur)   c                 P     j         rt          d                                            _        t	           fdddddddd	d
ddd
                                D                        _                             d          dk    rd n                     d           j        d<   d S )Nz,cannot initialize - document still encryptedc                 D    g | ]\  }}|                     |          fS r,   )r-  )r   r  rE   r'   s      r(   r   z%Document.init_doc.<locals>.<listcomp>  s=       58Qq4,,Q//0  r)   formatz
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
r  rw  authorrz  keywordsr  producerrx  ry  trappedr  None)r  r   rR  r  r4   rA   r   r-  r-   s   `r(   r  zDocument.init_doc  s     	MKLLL))++   %-$0%2&4'6&4'6+>&4&4= = $egg     /3.?.?.M.Mv.U.Udd[_[l[lmy[z[zl###r)   c
                    d}
t          |t                    rH|j        j        dk    rt          t          |          }t          d|                                          }
n't          |t
                    r|}
nt          |          }
|
st          d          |
j        s$|
	                                }t          d|          }
| 
                    |
||||||||		  	        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 parameterrY  )rQ  rR  rS  rX  ry  r  show_progressfinal)r=   r  r  rD   r  r   tobytesr   r  r  
insert_pdf)r'   infilerQ  rR  rS  rX  ry  r  r  r  r  pdfbytess               r(   insert_filezDocument.insert_file  s    " ff%% 	# "Q&&v..5&.."2"233CC)) 	#CC6""C 	53444z 	,))++H5(++C#!+  
 
 
	r)   helvr-  r   r[  r  r   rL  r  c	                     |                      |||          }	t          |          sdS |	                    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  r[  r  r   )2   r  )r   r   rL  r  )new_pager6  r*  )r)  r  r   r   r[  r  r   rL  r  r   r   s              r(   insert_pagezDocument.insert_page  sa    " ||5|@@Dzz 	1  
 
 	r)   )rQ  rR  rS  rX  ry  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k    rdk    rin nft          j	        
                    |j                  }|sd}t          j	        
                    | j                  }|sd}t          d|d|d           |j        }| j                            |d	          }|t          |           }|| j        |<   t           r$t#          | j        |j        |||||||
||           nbt'          |           }t'          |          }|j        r|j        st+          d
          t-          |           t/          |||||||||
|
  
         |                                  |r|                     ||||           |r|                     ||||||	           |dk    rd	| j        |<   d	S d	S )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)rQ  rR  rS  )rQ  rR  rS  r  )r   r  r   r  r  r  minr6   rc   r	   basenamer   rq   r  r7   Graftmapr  extra_FzDocument_insert_pdfr   r   r   r  rX  JM_merge_rangerY  r}  r  )r'   docsrcrQ  rR  rS  rX  ry  r  r  r  r  r  r  rm  outCountr  ru  r  innameoutnameisrtpdfoutpdfsrcs                          r(   r  zDocument.insert_pdf   s   L > 	=T. 	=;<<<>V---FGGG66B?$  QZZX\""66ABX\""66BXv;;*********W%%fk22F &%g&&ty11G '&G@AAA ""4..=TNNE#(DN4  	d'IK!    &d++F%f--F$ ?F,= ?!=>>>V$$$662r2vufm]bccc 	 	JNN6RbNIII 	tVUb"rcrsssA::#'DN4    :r)   c                 j    t          | d          }|j        sdS t          j        |          }|rdndS )Nr   r,  FT)r   r   r   pdf_has_unsaved_changesr'   rY  r  s      r(   is_dirtyzDocument.is_dirty  sB    ta000~ 	5)#..#tte#r)   c                 ^    t          | d          }|j        rt          j        |          S dS )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  s6    
 ta000> 	5/444ur)   c                 |   t          | d          }|j        sdS d}	 t          j        t          j        |          t          j        t          j        t          j                  }t          j        |          rt          j	        |          }n&# t          $ r t          rt                       Y dS w xY w|dk    r|S dS )z Either False or PDF field count.r   r,  Fr0  )r   r   r   r  r1  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr  r  rf   r	  ru   )r'   rY  r  fieldss       r(   r  zDocument.is_form_pdf  s     ta000~ 	5	(%c**,0.	 F !&)) 4+F33 	 	 	#8(8(8(855	 A::Lus   A/B B10B1c                     t          | j        t          j                  rdS t          j        | j        j                  rd}nd}|S )zCheck for PDF.TF)r=   r   r   r   ll_pdf_specificsr   r   s     r(   r  zDocument.is_pdf  sK     di!233 	4
 !$)"677 	CCC
r)   c                 p    | j         rt          d          t          t          j        |                     S )z Check if document is layoutable.r   )r   r   r6  r   r  r-   s    r(   is_reflowablezDocument.is_reflowable  s6     > 	0.///E3D99:::r)   c                 j    t          | d          }|j        sdS t          j        |          }|rdS dS )zCheck whether PDF was repaired.r   r,  FT)r   r   r   pdf_was_repairedr  s      r(   is_repairedzDocument.is_repaired  sG     ta000~ 	5"3'' 	4ur)   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_redor6  )r'   r  r  rY  s       r(   journal_can_dozDocument.journal_can_do  sv    > 	=T. 	=;<<<t$$!#&&!#&&T

DJJ777r)   c                     | j         s| j        rt          d          t          |           }t	          j        |           dS )zActivate document journalling.r+  N)r   r  r   r   r   pdf_enable_journalr  s     r(   journal_enablezDocument.journal_enable  sI    > 	=T. 	=;<<<t$$ %%%%%r)   c                     | j         s| j        rt          d          t          |           }|j        o|j        j        }|S )z Check if journalling is enabled.r+  )r   r  r   r   r   journal)r'   rY  enableds      r(   journal_is_enabledzDocument.journal_is_enabled  sH    > 	=T. 	=;<<<t$$.;S^%;r)   c                 j   | j         s| j        rt          d          t          |           }t	          |t
                    rt          j        ||           n8t          |          }t          j	        |          }t          j
        ||           |j        j        st          dt                     dS dS )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&  rW  pdf_deserialise_journalr   r  r  r  )r'   re   rY  r  stms        r(   journal_loadzDocument.journal_load  s    > 	=T. 	=;<<<t$$h$$ 	4"31111$X..C&s++C)#s333~% 	P8:NOOOOO	P 	P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  rY  r   s       r(   journal_op_namezDocument.journal_op_name	  sI    > 	=T. 	=;<<<t$$&sD1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'   stepsrY  r   s       r(   journal_positionzDocument.journal_position  sU    > 	=T. 	=;<<<t$$,S11	E5yr)   c                     | j         s| j        rt          d          t          |           }t	          j        |           dS )zMove forward in the journal.r+  T)r   r  r   r   r   pdf_redor  s     r(   journal_redozDocument.journal_redo  G    > 	=T. 	=;<<<t$$str)   c                 &   | j         s| j        rt          d          t          |           }t	          |t
                    rt          j        ||           dS t          |          }t          j	        ||           |
                                 dS )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'   re   rY  outs       r(   journal_savezDocument.journal_save"  s    > 	=T. 	=;<<<t$$h$$ 	""311111'11C#C---!!!!!r)   c                     | j         s| j        rt          d          t          |           }|j        j        st          d          |rt          j        ||           dS t          j	        |           dS )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   rY  s      r(   journal_start_opzDocument.journal_start_op.  s    > 	=T. 	=;<<<t$$~% 	; 9::: 	4%c400000.s33333r)   c                     | j         s| j        rt          d          t          |           }t	          j        |           dS )zEnd a journalling operation.r+  N)r   r  r   r   r   pdf_end_operationr  s     r(   journal_stop_opzDocument.journal_stop_op:  sI    > 	=T. 	=;<<<t$$$$$$$r)   c                     | j         s| j        rt          d          t          |           }t	          j        |           dS )zMove backwards in the journal.r+  T)r   r  r   r   r   pdf_undor  s     r(   journal_undozDocument.journal_undoA  r  r)   c                     t          | d          }|j        sdS t          j        |          }|t          j        k    rdS t          j        |          S )zDocument language.r   r,  N)r   r   r   pdf_document_languager&  r$  )r'   rY  r(  s      r(   r)  zDocument.languageI  sY     ta000~ 	F*3//5&&&F248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_locationT  s?     > 	0.///%di00..r)   c                 f   t          |           }t          j                    }t          j        |          }g }t	          |          D ]h}t          j        |||           |j        dk    rd}n|j        dk    rd}nd}||j        |j        ||j	        |j
        d}|                    |           i|S )z-Show OC visibility status modifiable by user.r   checkboxr   radioboxr  )rR  r   depthr   r  locked)r   r   PdfLayerConfigUipdf_count_layer_config_uirK  pdf_layer_config_ui_infor   r   r#  selectedr$  rj   )r'   rY  r  rD   r   r   rZ  rB   s           r(   layer_ui_configszDocument.layer_ui_configs\  s    t$$%''+S11q 	 	A*CD999yA~~"a" I!Z!-"k D IIdOOOO	r)   c                    | j         s| j        rt          d          | j        }t	          j        |          sdS |}|}t          |          }t	          j        |          s|j        |j	        z
  }|j
        |j        z
  }|dk    s|dk    rt          d          t	          j        ||||           |                                  |                                  dS )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  rY  r  )	r'   r   r[  r  r   r)  r   r  r  s	            r(   layoutzDocument.layoutu  s    > 	=T. 	=;<<<i.44 	FD!!(++ 	qtAqtA88qCxxo... #q!X66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     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+  Nr   zpage not in documentT)r   r  r   r   r3   r  r=   r   fz_load_pager   fz_load_chapter_pager   r   r   r  r7  r  r  r6  rR  )r'   page_idnpr   r  pagenumr  s          r(   r  zDocument.load_page  s    > 	=T. 	=;<<<?G$3444==CGaKKBA++2 A++gs## 	K%di99DD&GW-di'JJD4
#&3 !577

r)   c                 *   | j         rt          d          | j        }t          j        dd          }t          j        |          }|dk     r||z  }|dk     ||k    rt          t                    t          j        ||          }|j        |j	        fS )zConvert pno to (chapter, page).r   r0  r   )
r   r   r   r   fz_make_locationr<  r=  fz_location_from_page_numberr  r   )r'   r  this_docr  r  s        r(   location_from_page_numberz"Document.location_from_page_number  s    > 	0.///9$R,,)(33
Agg:C Agg*n---03??{CH$$r)   c                     | j         s| j        rt          d          t          j        | }t          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  sV    > 	=T. 	=;<<<$)49+?PPr)   c                    |                                  }|dk    rdS |                     |d          }|d         dk    ri S |d         dk    rEt          |d                                         d                   }|                     |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                             d          }|dd         D ]S}	 |                                \  }}n-# t
          $ r  t          dk    rt                       |cY c S w xY w|dk    rd||<   T|S )zReturn the PDF MarkInfo value.r   NMarkInfor  r  r   Tr~  r4   r   <<r  >>FMarkedUserPropertiesSuspects/true)r  r  r3   r5   r  rf   r	  ru   )r'   r  r   r  validrE   r  r   s           r(   markinfozDocument.markinfo  s    !!1994tZ00a5F??Ia5F??r!u{{}}Q'((D""4D"99CCUf__Q%CCC;s2A2w$3rss8t3C3CI EuMM!B$iooc""QRR 	" 	"AWWYY
UU   '!++0@0@0@ !c
s   9D%D;:D;c                    | j         rt          d          t          |           }|t          |          vs|t          d|          vrt          d          d}d}|dk    r|dz
  }d}|                     ||||          S )zMove a page within a PDF document.

        Args:
            pno: source page number.
            to: put before this page, '-1' means after last page.
        r   r0  r  r   r   r  r  s         r(   	move_pagezDocument.move_page  s     > 	0.///YY
uZ((((BeB
6K6K,K,K122288aBF##CVT:::r)   c                     | j         S r+   r  r-   s    r(   r   zDocument.name  s
    zr)   c                    | j         sdS 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.Nr0  NeedAppearancesr  r   )r  r   r   r  r1  r   pdf_is_boolpdf_to_boolr  PDF_TRUE	PDF_FALSE)r'   r   rY  oldvalappkeyformapps          r(   need_appearanceszDocument.need_appearances  s     	4t$$""!#&&  !$//S!! 	,&s++F 	?fen====feo>>>=Q;r)   c                     | j         rt          d          t          | j        t          j                  r| j        n| j                                        }t	          j        |          }|S )zIndicate password required.r   )r   r   r=   r   r   r   r   fz_needs_password)r'   r   rF   s      r(   r  zDocument.needs_pass  s]     > 	0./// *49e6F G G^499TY__M^M^%x00
r)   c                 B    |                      |||           | |         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.
        r[  r  )ri  )r)  r  r[  r  s       r(   r  zDocument.new_page  s%     	Sf5553xr)   c                    | j         s| j        rt          d          t          |          t          u rd|f}|| vrt          d          t          |          | j        k    rdS 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   r3   r   r  r   r=   r  MSG_BAD_PAGEIDPyExc_ValueErrorr   r3  fz_next_pager  r   )r'   r/  r5  r  r  r  r  next_locs           r(   next_locationzDocument.next_location&  s    > 	=T. 	=;<<<==C'lG$6777>>T///2"4((qk#s## 	6N$4555qk$Wc22%x5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     ||k    rt          t                    t          j        ||          }t          |          }|S r   )r  r   r  r   r=   r   r   r;  r<  r   r   r=  r>  JM_get_annot_xref_list)r'   rD   r  r#  rq  r  s         r(   r  zDocument.page_annot_xrefs;  s     	9)49a888di!233 	2.ty99J9LL-di88J+D11L!eeOA !eez>>n---,\1=='11r)   c                    | j         rt          d          t          r|                     |           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   r<  r;  r-   s    r(   r  zDocument.page_countM  sv     > 	0./// 	*##D)))ty%"233 	5'333($)444r)   c                 d   | j         rt          d          | j        }t          j        |          }|}|dk     r||z  }|dk     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   r<  r   r=  r>  
JM_cropboxrf  r#  )	r'   r  r5  r  rD   rY  rD  cropboxr  s	            r(   page_cropboxzDocument.page_cropboxY  s    > 	0.///9)844
!eeOA !eet$$
??n---+S!44W%%g&&3ii
r)   c                     t          |          t          u r| j        }|dk     r||z  }|dk     d|f}|| vrt          d          |\  }}t	          j        ||          }t	          j        | j        |          }|S )z&Convert (chapter, pno) to page number.r   r[  )r   r3   r  r   r   r3  fz_page_number_from_locationr   )r'   r/  r0  r  r  r  page_ns          r(   page_number_from_locationz"Document.page_number_from_locationm  s    ==CBA++2 A++'lG$6777$gs333TYDDr)   c                 p   t           rt          j        | j        |          S | j        rt          d          t          j        | j                  }|}|dk     r||z  }|dk     t          |           }d}||k    rt          t                    t          j
        t          j        ||                    }|S )zGet xref of page number.r   r   )r  r   rn  r   r   r   r   r<  r   r=  r   r>  )r'   r  r  rD   rY  r  s         r(   rn  zDocument.page_xref{  s     	4?DIs333> 	0.///)$)44
!eeOA !eet$$
??n--- 9#q A ABBr)   c                     |                                  }|dk    rdS |                     |d          }|d         dk    rdS |d         dk    r|d         dd         S dS )z)Return the PDF PageLayout value.
        r   N
PageLayoutr  
SinglePager   r   r  r  r'   r  r   s      r(   
pagelayoutzDocument.pagelayout  sn     !!1994t\22a5F??<a5F??a59|r)   c                     |                                  }|dk    rdS |                     |d          }|d         dk    rdS |d         dk    r|d         dd         S dS )z'Return the PDF PageMode value.
        r   NPageModer  UseNoner   r   rp  rq  s      r(   pagemodezDocument.pagemode  sn     !!1994tZ00a5F??9a5F??a59yr)   r  r  r  c              #   `  K   | j         sdS |pd}|dk     r|| j         z  }|dk     |t          | j                   vrt          d          ||| j         k    r|n| j         }|dk    rt          d          |||k    rd}nd}t          |||          D ]}|                     |          V  dS )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 zeror0  r   )r  rK  r   r  )r'   r  r  r  r  s        r(   r|  zDocument.pages  s      
  	F
aiiT_$E aiido....4555 'DDO,C,Ctt 1995666<t||d++ 	( 	(C>>#&&''''	( 	(r)   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  r1  r  r   )r'   rY  r  r<  s       r(   r  zDocument.pdf_catalog  sb    ta000~ 	K!%"3C"8"8(6:J:JKK%%r)   c                 2    |                      d||          S )zGet PDF trailer as a string.r0  )r  r  )r  )r'   r  r  s      r(   r1  zDocument.pdf_trailer  s    zGGGr)   c                    | j         rdS | 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)  rY  perms       r(   r  zDocument.permissions  s      	1Y1#66 > 	71#666 &sE,EFF 	/%..D&sE,DEE 	0%//D&sE,DEE 	.%--D&sE,HII 	2%11Dr)   c                 *   | j         s| j        rt          d          t          |          t          u rd|f}|| vrt          d          |dk    rdS |\  }}t          j        ||          }t          j        | j        |          }|j	        |j
        fS )z%Get (chapter, page) of previous page.r+  r   r[  r  r,   )r   r  r   r   r3   r   r3  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7v2$Wc22)$)S99..r)   c                    i }|j         }|j                                        D ]
\  }}|||<   |j        j        j        }|j                                        }d|_        |                                 d}t          	                    d           | 
                    |          }|                                D ]\  }}||         }||j        |<   |dk    rn4|j                                        }	|	|k    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=)rR  r6  rA   r   r   refsr5  r   r
  store_shrinkr  )
r'   r   r+  r  r  rE   refs_oldm_internal_oldr   m_internal_news
             r(   reload_pagezDocument.reload_page  s7   
k$**,, 	 	DAqJqMM4 9',3355	3~~c"" $$&& 	( 	(DAqqME"'DQq==
  "Y7799N!^333LxLL>LLLLLL 433r)   c                    |s|rdS dS 	 t          j        | j        |          \  }}}n+# t          $ r t          rt                       |rY dS Y dS w xY w|r|j        |j        f||fS t          j        | j        |          }|||fS )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).
        )r0  r0  r   r   )r0  r   r   )	r   fz_resolve_linkr   rf   r	  ru   r  r   ri  )r'   r^  r  r  xpypr  s          r(   r  zDocument.resolve_link=  s      	 &%~8	/	3??KCRR 	 	 	#8(8(8(8 &%~~88		
  	3K*B220C@@B{s   ) !AAc                    t          |          }|sdx}}|dk    r||k    rt          d          t          j                    }t	          t          |                    }|
s5t          j                    }|r7t          j        |_        t          j        |_	        ||_
        ||_        ||_        |rr|r7t          j        |_        t          j        |_        ||_        ||_        ||_        |r7t          j        |_        t          j        |_        ||_        ||_        ||_        |rr|r7t          j        |_        t          j        |_        ||_        ||_        ||_        |r7t          j        |_        t          j        |_        ||_        ||_         ||_!        n|
}t	          t          |                    }||z
  }|rt          d|           |	r| "                    d           tG          |           }t          j$        ||           dS )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  rh  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_optionsrY  s                     r(   rewrite_imageszDocument.rewrite_imagesW  s   B 'll 	+)**MJ>>jM99OPPP5773}%%&& #	022D G7<7N46;6P32</8C59F6 L OBGBZD?AFA[D>=GD:DQDACND@ L?D?WD<>C>XD;AND>:DD7@KD= K NAFAYD>@E@ZD=<FD9CPD@BMD? K>C>VD;=B=WD:@MD=9CD6?JD<D3t99~~+ 	DBBBCCC 	LLOOOt$$ d+++++r)   c                     | j         st          d          t          | j                  D ]*}|                     |                              |           +dS )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   rK  r  r  r  )r'   
componentsr   s      r(   r  zDocument.recolor  sb     { 	*[)))t'' 	2 	2ANN1%%j1111	2 	2r)   c                    	
 t           d          r j        S  fdt           j                  D             
d 		
fdfd}t	          j                   }t	          j        t	          j        |          d          }i }t	          j        d          }t	          j	        ||          }|
                                r |||           t	          j        ||          }|
                                r |||           | _        |S )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                 <    i | ]}                     |          |S r,   )rn  )r   r   r'   s     r(   
<dictcomp>z*Document.resolve_names.<locals>.<dictcomp>  s'    KKKqdnnQ''KKKr)   c                     t          j        d          }t          j        |          }t          j        || dd           |                                 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  sX    (--F^F++FQ222""$$$'///r)   c                    ddd}|                                  rt          j        |           } |                                 r |           }n5|                                 r t          j        | d                    }n|S |                    dd          dd         }|                    d          }|dk     r||d	<   |S |d
|                                         }||d
         }||d	<   |	                    d          r|d	= |
                                dd         }t          |          dk     r(|                    d           t          |          dk     (t          t          t          |                    }|d         |d         f|d<   |d         |d<   |                    d          r?                    t%          |
                                d                   d          |d<   nt%          |          |d<   |S )z3Generate value of one item of the names dictionary.r0  r[   )r   destr  r  ry   r   rD  r  Nz/XYZrI  r   r   rY  r   rZ  r`  r   )pdf_is_indirectr   r&  r  ry  r   r  r   stripr2   r5   r6   rj   r   r  rm  r  r7   r3   )	r  
templ_dictarrayr6  subval
array_listrE  r  
page_xrefss	          r(   	get_arrayz)Document.resolve_names.<locals>.get_array  s   "$b11J""$$ 6055!! ""
3"" ""
5#6sC#@#@AA!! MM&#..qt4E **S//CQww%*
6"!!4C4[&&((F#$$KE!&Jv '' *v& #[[]]1Q3/
 *oo))%%c*** *oo)) UJ//00$%aD!A$<
4 %&qT
6" u%% 1%/^^Cq8I4J4J2%N%N
6""%([[
6"r)   c                 D   t          j        |          }t          |          D ]z}t          j        ||          }t          j        ||          }|                                r|                                }nt          d| d           d}|r |          | |<   {dS )zyGenerate name resolution items for pdf_dict.

            This may be either "/Names/Dests" or just "/Dests"
            zkey z is no /NameN)r   rz  rK  r|  r{  r  rx  rq   )	dest_dictpdf_dict
name_countr   r  r  dict_keyr  s          r(   	fill_dictz)Document.resolve_names.<locals>.fill_dict  s     +H55J :&& 
9 
9,Xq99,Xq99??$$ $"00HH21222333#H 9*3)C..Ih'
9 
9r)   r-  Dests)r:   r  rK  r  r   r  r   r1  r2  r  ry  pdf_load_name_tree)r'   r  rY  catalogr  dests	old_destsrc  r  r  r  s   `       @@@r(   resolve_nameszDocument.resolve_names  sX   2 4*++ 	(''KKKKE$/4J4JKKK
	0 	0 	0.	 .	 .	 .	 .	 .	`	9 	9 	9 	9 	9, 1$77 %e&7&<&<fEE	 "7++ &w66	  "" 	,Ii+++ 'U33 	'Ii&&&(r)   c                 b   | j         s| j        rt          d          t          |          t          u rnWt          |d          rt	          |          }n7t          |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        |k    s| j        rt          d
          |rt          |          dk    s|r"t          |          dk    rt          d          t          |           }t          j                    }||_        ||_        ||_        ||_        ||_        |	|_        ||_        ||_        |
|_        ||_        ||_        ||_        ||_        ||_        ||_        ||                    |           n||                    |           ||                    |           ||_        ||_        ||_         d}d|j!        _"        tG          |           |dk    rtI          |           tK          |t                    rt          j&        |||           dS tO          |          }t          j(        |||           |)                                 dS )z/Save PDF to file, pathlib.Path or file pointer.r+  r9   r   seek)filename must be str, Path or file objectz$save to original must be incrementalz3'linear' and 'use_objstms' cannot both be requestedr   zcannot save with zero pageszincremental needs original file(   z"password length must not exceed 40Nr   )*r   r  r   r   r   r:   r   r  r   r6   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   rP  JM_embedded_cleanJM_ensure_identityr=   pdf_save_documentr  pdf_write_documentr  )r'   re   r  r  r  r  r  r  r  r  r  r  
appearancer  r  r  r  r  r  r  r  rY  r  r  s                           r(   r  zDocument.save>  s   4 > 	=T. 	=;<<<>>S  Xv&& 	J8}}HHXv&& 	J}HH6** 	JHIIIty   CDDD 	Tk 	TRSSS?Q:;;; 	DyH$$$ !BCCC 	Cs7||b((H(X9K9KABBBt$$$&&)""0!.#! "+'$&$$X.... $$W---$$W---$5!)"4*+'#>>s###h$$ 	"#C488888'11C$S#t444!!!!!r)   c                 j   | j         rt          d          t          |          t          u rnGt	          |d          rt          |          }n't	          |d          r|j        }nt          d          || j        k    rt          d          t          |           }t          j        ||           dS )z.Save a file snapshot suitable for journalling.zdoc is closedr9   r   r  zcannot snapshot to originalN)	r   r   r   r   r:   r   r   r   pdf_save_snapshot)r'   re   rY  s      r(   save_snapshotzDocument.save_snapshot  s    > 	._--->>S  Xv&& 	J8}}HHXv&& 	J}HHHIIIty  :;;;t$$X.....r)   c                 P    |                      | j        dt          j                  S )z Save PDF incrementallyT)r  r  )r  r   r   PDF_ENCRYPT_KEEPr-   s    r(   saveIncrzDocument.saveIncr  s    yyAWyXXXr)   attached_filesclean_pagesembedded_fileshidden_text
javascriptr   
redactionsredact_imagesremove_linksreset_fieldsreset_responses
thumbnailsxml_metadatac                 l   d }| j         st          d          | j        s| j        rt          d          |sd}d}|r|                     i            | D ]}|
r+|                                D ]}|                                 |	r.|                                }|D ]}|                    |           d}|	                                D ]h}|j
        d         t          j        k    r|r|                    d           |r|                                 |j
        d         t          j        k    rd}i|r|r|                    |	           |s|s|                                 |                                s(|r|                                }t'          |          d
k    sJ |d         }|                     |          } ||                                          }|r+d                    |          }|                     ||           |rA|                     |j        d          d         dk    r|                     |j        dd           |r,|                                 D ]}|                     |           |r|                                  |s|sd}n|                                 }t?          d
|          D ]}|                      |          sd|z  }t          |          |r9|                     |d          d
         dk    rd}| !                    ||           f|si|                     |d          d
         dk    r/| !                    |d           |                     |dd           |                     |d          d         dk    r|                     |dd           d S )Nc                    g }d}d}d}| D ]}|dk    rd}|                     |            |dk    rd}|                     |           >|dk    rd}d}I|dd         dk    r$|d	         d
k    rd}|                     |           {|dk    rd}|                     |           |r|r|                     |           |r|S dS )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rj   )
cont_lines	out_linesin_textsuppressmake_returnrn   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***    &&&&   tr)   r  zclosed or encrypted docFr   r%  )r,  T)imagesr   r  Thumbr  z(bad xref %i - clean PDF before scrubbingSz/JavaScriptz<</S/JavaScript/JS()>>r/  z	/Metadata<<>>s   deleted)r  r  )"r  r   r  r   set_metadatar  resetro  delete_linkr  r   r   rD  r  r  r   apply_redactionsr  get_contentsr6   xref_streamr  r  update_streamr  r  rl  r  r  r  rq  rK  r  r  )r)  r
	  r	  r	  r	  r	  r   r	  r	  r	  r	  r	  r	  r	  r 	  r   r:  ry  r  found_redactsr   rA  r  r  r	  r   
xref_limitr   r  s                                r(   scrubzDocument.scrub  sQ   "/	 /	 /	b z 	*[))) 	8s} 	86777 	KJ 	!R    )	A )	AD #"llnn # #FLLNNNN +((! + +D$$T****!M ) ):a=E$CCCC%%d%333" -**,,,:a=E$:::$(M <m <%%]%;;; ; !!!$$&&  2))++5zzQQxt,,*]4??+<+<==
 2 ::j11D%%dD111 A##DIw77:fDD$$TY@@@  	&))++ & &%%%% 	#  """ 	+
 	+JJ**J!Z(( 	; 	;D??4(( &@4G oo% c..tS99!<MM.!!$,,, f--a0K??!!$///!!$
!===j11!4>>  z6:::)	; 	;r)   quadsc                     |"dt           z  t          z  t          z  t          z  }| |                             |||||          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.
        Nr   )r/	  r   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_forK  sd    * =&'-. // )	)E 3x"" # 
 
 	
r)   c                 2   | 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          dk    r!t          j        ||t          j                   nt          j        ||           |                                  dS )	z,Build sub-pdf with page numbers in the list.r+  r  r_  zsequence requiredr   r  )r      r   N)r   r  r   r  r:   rK  r6   r  r  r   rc  r   pdf_rearrange_pages2PDF_CLEAN_STRUCTURE_KEEPrY  )r'   pylistevalid_rangerY  s       r(   selectzDocument.selecto  s   > 	=T. 	=;<<<{ 	*[)))w.. 	20111CII&&LLA7||;..7||;..1222 t$$ *,, &sGU5STTTT&sG444 	r)   c                     t          |           }|st          j        }nt          j        |          }t          j        ||           dS r  )r   r   r&  r  pdf_set_document_language)r'   r)  rY  r(  s       r(   r  zDocument.set_language  sJ    t$$ 	@&DD5h??D'T222tr)   c                 ^   | j         rt          d          t          |                                                                           }|t                      k    rt          d          |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rt          |          t          t          fvrt          d	          |D ]w}	t          |	          t          t          fvrt          d
|	z            t          |	                              |          }|t                      k    rt          d|z            x|r<t          |          
                                }|dk    rd}|dvrt          d          t          |           }
t          j        t          j        |
          t          d          t          d                    }|j        sdS |dk    r#t          j        |t          d                    }n5t          j        t          j        |t          d                    |          }|j        st          t&                    t)          ||||||           t          j        |
j                   dS )z5Set the PDF keys /ON, /OFF, /RBGroups of an OC layer.r   z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)r  r  rB	  zbad 'basestate'r-  rN  Nr0  r  r  )r   r   r  ri  r  r   r   r   
differencer   upperr   r   r  r1  r  r   r  r  r  JM_set_ocg_arraysr  )r'   r  	basestater  offrbgroupsr$  rf  rp  r$  rY  r  r  s                r(   	set_layerzDocument.set_layer  sm   > 	0.///4==??''))**355==?@@@ 	=Bxxe},, !1222B""4((ACEEzz !7!!;<<< 	>Cyyu-- !2333C##D))ACEEzz !81!<=== 	AF||D%=00 !5666F&&t,,ACEEzz !;a!?@@@ 	DH~~dE]22 !7888 D DAww4-//$%7!%;<<<FF%%d++::$%>%BCCC   	4I,,..IK'''	 ::: !2333t$$!!3''  (( 
 ~ 	FR<<$c8C==99CC%&Xi-@-@AA C ~ 	1/0003	2sHfEEEs~.....r)   c                 p   t          t                    rAfd|                                 D             }|g k    rt          d d          |d         t	          |           }|dk    rt          j        |           dS |dk    rt          j        |           dS t          j        |           dS )z$Set / unset OC intent configuration.c                 8    g | ]}|d          k    |d         S )r   rR  r,   )r   uirR  s     r(   r   z0Document.set_layer_ui_config.<locals>.<listcomp>  s,    ]]]r6
V\H\H\blH\H\H\r)   z	bad OCG 'rZ  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'   rR  r  r=	  rY  s    `   r(   set_layer_ui_configzDocument.set_layer_ui_config  s     fc"" 	]]]]T-B-B-D-D]]]F|| !7V!7!7!7888AYFt$$Q;;,S&99999q[[.sF;;;;;,S&99999r)   rG  c                    |                                  }|dk    rt          d          |rt          |t                    sdS dddd}t	          |                                                              |                                          sXdt	          |                                                              |                                           }t          |          d}|                    |           |	                                D ]K\  }}t          |                                          }|dvrt          d| d	| d
          |d| d| z  }L|dz  }|                     |d|           dS )zSet the PDF MarkInfo values.r   	not a PDFFr@  zbad MarkInfo key(s): r>  )rE  falsezbad key value 'z': 'r   rD  r   r?  r=  T)r  r   r=   r4   r  r  
issupersetrC	  r  rA   r   r  rl  )r'   rG  r  rF  badkeyspdfdictr  r   s           r(   set_markinfozDocument.set_markinfo  s   !!199[))) 	z(D99 	5 EuMM5::<<  ++HMMOO<< 	&]c(--//.B.B.M.Mejjll.[.[]]GW%%%X++-- 	) 	)JCe**""$$E--- !D3!D!DE!D!D!DEEE(3(((((GG4$
G444tr)   r  c                 r   | 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                                                    }t          |                                                              |          }|t                      k    rd|z  }t          |          | 	                    dd          \  }}|dk    rd}n#t          |                    dd                    }|i k    r|dk    rdS |dk    rE|                                 }|                     |d           |                     ddd|z             n3|i k    r-|                     ddd           |                                  dS fd|                                D             D ]I\  }}	|         }
t#          |	          r|	dv rd}	nt%          |	          }	|                     ||
|	           J|                                  dS )zcUpdate the PDF /Info object.

        Args:
            m: a dictionary like doc.metadata.
        r  r+  Nzbad metadataAuthorProducerr  r  r  ModDateSubjectKeywordsTrapped)r  r  r  rw  r  r  rx  ry  rz  r  r  zbad dict key(s): %sr0  Infor  r   r`  r[   r$	  %i 0 Rr  c                 .    g | ]\  }}|         ||fS r+   r,   )r   r  rE   keymaps      r(   r   z)Document.set_metadata.<locals>.<listcomp>2  s*    OOODAq9N!Q9N9N9Nr)   )noner  )r  r   r   r  r   r4   r  r  rC	  r  r3   r  rY  r  rl  r  rA   r6  rc  )r)  r  
valid_keysdiff_setr   rE  r  	info_xrefr  r  pdf_keyrb	  s              @r(   r%	  zDocument.set_metadata  sd    z 	*[)))= 	=C, 	=;<<<9AA!WWD  ^,,," *  " 
 
 ''
qvvxx==++J77suu'(2CS//!""2v..4;;IIDLL3344I77yA~~F>>((**Ii000RI)=>>>>"WWR000LLNNNFOOOOAGGIIOOO 	6 	6HCSkG99 ''7 7 7!#&&Y5555r)   r  c                    | j         s| j        rt          d          |                     |d          \  }}|dk    s|dvrt          d|z            |dk    r5|                     |d          \  }}|dk    s|dvrt          d|z            |dk    r0d	|                     |          v r|                     |d	d
           dS |                     |d	d|z             dS )zAttach optional content object to image or form xobject.

        Args:
            xref: (int) xref number of an image or form xobject
            oc: (int) xref number of an OCG or OCMD
        r[  r  r   r\  r_  r   r/  )z/OCGz/OCMDr  r  Nr`	  )r   r  r   r  xref_get_keysrl  )r)  r  r  rE  r   s        r(   r  zDocument.set_oc<  s    = 	<C, 	<:;;;""4334;;$&9999D@AAA66&&r622GAtF{{d*;;; !=!BCCC77ts006666T40004tX]333tr)   rf  ro  rp  c                 &  	
 t          |                                                                           		
fd
d}|rt          |          t          t
          fv rut          |                              	          }|t                      k    rd|z  }t          |          |dd                    t          d |                    z   dz   z  }|rLt          |                                          }dd	d
dd}|dvrt          d|z            |d||         z  z  }|r|d 
|          z  z  }|dz  }|dk    r|                                 }n(d|                     |d          vrt          d          |                     ||           |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                 d   t          |           t          t          fvst          |           dk     rt	          d| z            | d                                         dvrt	          d| d         z            | d                                         dk    r%t          |           dk    rt	          d| z            d| d                                         z  }| dd          D ]H}t          |          t          u r|vrt	          d	|z            |d
|z  z  }7|d |          z  z  }I|dz  }|S )Nr   zbad 've' format: %sr   )andornotzbad operand: %srn	  z[/%sr   z
bad OCG %iz %i 0 Rz %srk  )r   r   r   r6   r   r  rw  r3   )rp  rB   r$  all_ocgsve_makers      r(   rp	  z#Document.set_ocmd.<locals>.ve_makerg  s4   Bxxe},,B! !6!;<<<!u{{}}$888 !2RU!:;;;!u{{}}%%#b''Q,, !6!;<<<BqEKKMM)DV 0 077c>>((()9:::IM)DDEHHQKK//DDCKDKr)   z<</Type/OCMDzbad OCGs: %srm  r   c                     d| z  S )Nr`	  r,   r_  s    r(   <lambda>z#Document.set_ocmd.<locals>.<lambda>  s
    hl r)   rk  AnyOnAllOnAnyOffAllOff)anyonallonanyoffalloffzbad policy: %sz/P/%sz/VE%sr?  r   rl  Tr~  zbad xref or not an OCMD)r  ri  r  r   r   r   rC	  r   r  r  r   r  rY  r  r  )r)  r  rf  ro  rp  r   rp  r   polsro	  rp	  s            @@r(   set_ocmdzDocument.set_ocmdR  s   & s||~~**,,--	 	 	 	 	 	$  	QDJJ4-//D		$$X..ACEEzz$q( oo%Hsxx,B,BD(I(IJJJSPPD 
	+[[&&((F  ""	 D CCC !1F!:;;;Gd6l**D 	+Ghhrll**D 199##%%DD$!G!GGG6777$%%%r)   rr  c                 \   d}|                                  }|dk    rt          d          |st          d          |d         dk    r
|dd         }|D ]I}|                                |                                k    r|                     |dd|             d	S Jt          d          )
zSet the PDF PageLayout value.)ro  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   rR	  zbad PageLayout valuerD  r   Nrn  Tr  r   r  rl  )r'   rr  rF  r  rE   s        r(   set_pagelayoutzDocument.set_pagelayout  s    m!!199[))) 	53444a=C#ABBJ 	 	A!!QWWYY..!!$g!gg>>>tt / /000r)   rv  c                 \   d}|                                  }|dk    rt          d          |st          d          |d         dk    r
|dd         }|D ]I}|                                |                                k    r|                     |dd|             d	S Jt          d          )
zSet the PDF PageMode value.)ru  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   rR	  zbad PageMode valuerD  r   Nrt  Tr	  )r'   rv  rF  r  rE   s        r(   set_pagemodezDocument.set_pagemode  s    `!!199[))) 	31222A;#|H 	 	A~~17799,,!!$
GGG<<<tt - -...r)   c                 T    d fd}|                       ||                     dS )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         z  }|                      dd          dk    r|d| d         z  z  }|                      dd          dk    r|d| d         z  z  }|                      dd	          d	k    r|d
| d         z  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 "<<", ">>".
            z%i<<	startpageprefixr[   z/P(%s)r\  z/S/%sfirstpagenumr   z/St %ir?  )r7   )r  rp  s     r(   create_label_strz2Document.set_page_labels.<locals>.create_label_str  s     {++Ayy2&&",,Xh//yy"%%++WuW~--yy++a//Xn 555IAHr)   c                 x    |                      d            d                    fd| D                       }|S )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 )Nr	  r,   r_  s    r(   rr	  z?Document.set_page_labels.<locals>.create_nums.<locals>.<lambda>  s
    an r)   r  r[   c                 &    g | ]} |          S r,   r,   )r   r  r	  s     r(   r   zADocument.set_page_labels.<locals>.create_nums.<locals>.<listcomp>  s%    EEEU))%00EEEr)   )r  r  )r  rp  r	  s     r(   create_numsz-Document.set_page_labels.<locals>.create_nums  sH     KK44K555EEEEfEEEFFAHr)   N)r  )r)  r  r	  r	  s      @r(   set_page_labelszDocument.set_page_labels  sQ    	 	 	$	 	 	 	 	 	[[0011111r)   r  r  c           	         | j         s| j        rt          d          | j        st          d          |s!t	          |                                           S t          |          t          t          fvrt          d          t	          |          }| j	        }|d         }t          |          t          t          fvrt          d          |d         dk    rt          d          t          t          |dz
                      D ]}||         }||dz            }d|d	         cxk    r|k    sn t          d
|z            t          |          t          t          fvst	          |          dvrt          d|dz   z            t          |d                   t          us|d         dk     rt          d|dz   z            |d         |d         dz   k    rt          d|dz   z            |                                 }	g }	dg|	z   }
|                                 |
d<   |t	          |	          k    rIt          |t	          |	          z
            D ])}|
                    |                                            *ddi}ddd|
d         dg}t          |          D ]}||         }|d         }t          |d                   }t!          | j	        dz
  t#          d|d	         dz
                      }|                     |          }|                     |          j        }t+          d|dz
            }|t,          d}|d	         dk     r
t.          |d<   t	          |          dk    rt          |d                   t          t0          fv rt+          d||d         z
            |d<   nt          |d                   t2          u r|d                                         n|}d|vr||d<   nQ| |         }t+          |d                   }|j        j        |j        z
  |_        ||j        z  }|j        |j        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<   |!                    d          |d<   |!                    d d          d	|!                    d!d          z  z   |d"<   |dz   ||<   |||dz
                    }|!                    d#          s|r||k    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<   |                    |           tE          |          D ]\  }}d$}|d         dk    r|d%|d         z  z  }	 ||d         z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d         dk    r|d&|
|d                  z  z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d         dk    r|d'|
|d                  z  z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d         dk    r|d(|
|d                  z  z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d         dk    r|d)|
|d                  z  z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d         dk    r|d*|
|d                  z  z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w	 |d+|d         z   z  }n)# tF          $ r tH          d	k    rtK                       Y nw xY w|!                    d          rBt	          |d                   dk    r)|d,tM          t          |d                              d-z  }|!                    d"d          dk    r|d.|d"         z  z  }|dk    r|d/z  }|d0z  }| '                    |
|         |           | (                                 |S )1a  Create new outline tree (table of contents, TOC).

        Args:
            toc: (list, tuple) each entry must contain level, title, page and
                optionally top margin on the page. None or '()' remove the TOC.
            collapse: (int) collapses entries beyond this level. Zero or None
                shows all entries unfolded.
        Returns:
            the number of inserted items, or the number of removed items respectively.
        r+  r  z'toc' must be list or tupler   z'items must be sequences of 3 or 4 itemsr   z#hierarchy level of item 0 must be 1r0  r   z row %i: page number out of range)r   rI  z
bad row %izbad hierarchy level in row %i)r  rC  lastr  r  $   )rY  rW  rW  r   rY  rC  r  r	  r  r;  r  toprw  r   r  r  ra  rM  r  r  r>  z	/Count %iz/First %i 0 Rz/Last %i 0 Rz/Next %i 0 Rz/Parent %i 0 Rz/Prev %i 0 Rz/Titlez/C[ rk  z/F %iz/Type/Outlinesr?  ))r   r  r   r  r6   rF  r   r   r   r  rK  r3   r1  rj   rY  rc  r  r  rn  rg  r  r  r_  	LINK_NONErm  r4   r\  rf  r%  rP  r$  r  
getDestStrr7   r  rf   r	  ru   r   r  r  )r)  r  r  toclenr  t0r   t1t2	old_xrefsr  lvltabolitemsr  r  rw  r  rn  page_heightr	  r  r   r)  r  r   r  r  ri  s                               r(   set_toczDocument.set_toc  s}	    = 	=C, 	=;<<<z 	*[))) 	&s{{}}%%% 99T5M)):;;;S^
V88D%=((FGGGa5A::BCCCeFQJ''(( 
	L 
	LAQBQUBA,,,,*,,,, !Ca!GHHHRu--#b''2G2G Q!7888RU3&&2a5199 !@AE!JKKK!ur!uqy   !@AE!JKKK ! KKMM	 	sY&&((QC	NN""FS^^355 0 0C,,..////Q
 RaIIJ v 8	 8	AAAA$C!%%Ecnq(#a1*:*:;;Cc**I**3//6KK",--C"I66Itaxx$-	&!1vvzz!::#u--&+Bad0B&C&CIdOO 04AaDzzT/A/A!		yI9,,*-	$"3x %io 6 6"&,"5"? %(< <+07EG*<	$AAgJAgJAfIAfIAfI(I>>AfI AeHAgJ q/AhKQUAfI"w//AgJ"x33a)--PQ:R:R6RRAgJa%F3KVC!G_-F j))%-5%:=..w1$w1$g"$$"#a%w!"Qv"6N&	vf~. 1uV!"QvNN1
 w'' :	, :	,EArC'{a{R[00r&z!   '1,,0@0@0@g;##?T"W+->>>C   '1,,0@0@0@f:??>DF,<<<C   '1,,0@0@0@f:??>DF,<<<C   '1,,0@0@0@h<"$$+d2h<.@@@C   '1,,0@0@0@f:??>DF,<<<C   '1,,0@0@0@x"W+--   '1,,0@0@0@
 vvg ?3r'{#3#3q#8#8>ibk(:(:;;>>>>vvgq!!A%%wG,,Avv''4KCd1gs++++s~   W#W?>W? X$$#Y
	Y
 Y//#ZZ Z::#[ [ $ \#\+*\+/ ]#]65]6:^		#^/.^/r  rW  r^  rw  rZ  c
                 B   |                                  |         }
d}t          |          t          u r|d         t          k    ro|d         }|                     |          }|                     |          j        }|                    dt          dd                    }||j	        z
  |_	        ||d<   t          j        ||          }|                    d          st          d          |                    d	          }|rjt          t          t           |                    }t#          |          d
k    s&t%          |          dk     st'          |          dk    rt          d          |                    dd          }|                    dd          }|d|z  z   }|                    d          }|                     |
|dd         ||||          S |t*          k    r|                     |          S ||dS ||                     |
d|          S |t          k    r||t/          d| j        dz             vrt          d          |                     |dz
            }|                     |dz
            j        }|t          d|dz
            }nt          |          }||j	        z
  |_	        ||||||	d}t          j        ||          }|dk    s|                    d          st          d          |                     |
|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   rW  r   rY  r  r	  z/Azbad bookmark destr  r   r   zbad color valuerM  Fra  r   r  N)r  rw  r  r  r  )r  rw  zbad page number)rW  rY  r^  r   r`   rZ  r[   )r8  r   r4   r_  rn  rg  r  r7   r  r%  r  r	  r2   r   r   r  rm  r6   r  r  r  r	  r:  rK  r  )r)  r6  r  rW  r  r^  rw  rY  re   rZ  r  rn  r	  r  r  rM  ra  r  r  ddicts                       r(   set_toc_itemzDocument.set_toc_item  s.   Z $$&&s+		??d"" I--'MM#..	!..s33:]]4r277"RT)"$	$%i;;F$$T** 6 !4555MM'**E 8S..//u::??c%jj1nnE

Q$%6777==//D]]8U33FQX%E }}Z00H''abbz! (    9##C(((<EM4<''T'GGG9{cq#.12D)E)EEE !2333cAg..I**3733:Kz2{R/002YY"RT) 
 
 !)U33R<<v0066<0111##D5#IIIr)   c                 &   | j         s| j        rt          d          t          |           }t	          j        t	          j        |          t          d                    }|j        st          t          t                     t	          j        |                    d                    }t	          j        |t          d                    }|j        rt          |||d           d	S t	          j        ||t	          j                    d          }t	          j        |t          d          t          d                     t	          j        |t          d          t          d                     t	          j        |t          d          |           d	S )
z"Store XML document level metadata.r+  r-  r  r  r   r/  r  XMLN)r   r  r   r   r   r  r1  r  r   r  MSG_BAD_PDFROOTr  r  r  r(  r)  r*  rM  )r'   r   rY  r<  r  r  s         r(   set_xml_metadatazDocument.set_xml_metadata  sT   > 	=T. 	=;<<<t$$!5#4c#:#:HV<L<LMM 	<_&:;;;2HOOG4L4LMM $(<(<==> 	Ac3Q/////&S%,..!DDCXf%5%5x
7K7KLLLXi%8%8(5//JJJhz&:&:C@@@@@r)   verbosefallbackc                 "    |sJt          j                   }t          j        |t          t	           j                                       dS i  fd} fd} fd}d }fd}fd}	 |            s|rt          d           d	S d	}
d	}                                D ]}|
t          |          z  }
 D ]}|	                                D ]}t          |          t          ur|d
         dd         } |	|          }|7|         \  }}\  }}|d         D ]8}|                    |d	                    |                    |d                    9||||ff|<                                   D ]\  }\  }}} |||d	         |d                   }t          |          d	         }| t          |          t          |          k    r|rt          d|d           p|rt          d|d                                |          }|d	         } ||                                |d          }|D ]7} ||          \  }}                     ||           |s|r ||||           8|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k    rdS t          |d         dd                             dd                    }                     |d	          }|d         dk    rd
}n|d         }                     |d          }|d         dk    rd
}n|d         }||fS )z(Retrieve old font '/W' and '/DW' values.DescendantFontsr   r  NNr   r0  r`  r[   WNDWr3   )r  r3   r  )r  dfdf_xrefwidthsdwidthsr)  s        r(   get_old_widthsz-Document.subset_fonts.<locals>.get_old_widthsG  s    !!$(9::B!u!z"Q%"+--eR8899G%%gs33FayG##&&w55GqzU""!!*7?"r)   c                 N                        | d          }|d         dk    rdS t          |d         dd                             dd                    }t          |          t          us|s8                     |d	          d         d
k    r                    |d	d
           n                    |d	|           t          |          t          us|s8                     |d          d         d
k    r                    |dd
           n                    |d|           dS )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   r0  r`  r[   r	  r  r	  )r  r3   r  r   r   rl  )r  r	  r	  r	  r	  r)  s        r(   set_old_widthsz-Document.subset_fonts.<locals>.set_old_widthsY  sG    !!$(9::B!ut"Q%"+--eR8899GVC''v'3;K;KGUX;Y;Y<< <   #v6666  #v666WS(((S=M=M> >>> >   $7777  $8884r)   c                    ddl }ddl}d                    |                    t	          |j                  d                    dz   }
                    | d          }|                    d	d	|z             }
                    | d
          }|d         dk    rt          |d         dd                             dd                    }
                    |d          }|d         dk    rot          |d                             dd                    }
                    |d          }	|	                    dd|z             }	

                    ||	           

                    | |           dS )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  +Tr~  z
/BaseFont/r	  r  r   r0  r`  FontDescriptorr  z
/FontName/)randomstringr  choicesr   ascii_uppercaser  r  r  r3   r  )rw  r	  r	  r	  font_strr	  r	  r   fd_xreffd_strr)  s             r(   set_subset_fontnamez2Document.subset_fonts.<locals>.set_subset_fontnameq  sg    MMMMMMWWV^^E&2H,I,IQ^OOPPSVVFxDAAH''lV6KLLH!!(,=>>B!ubeAbDk11%<<==%%g/?@@a5F??!"Q%--r":":;;G __W_FFF#^^L,:OPPF%%gv666h11111r)   c           	      l   	 ddl m} n3# t          $ r& t          rt	                       t          d            w xY wddl}|                                5 }| d}| d}| d}|dd| d	d
dddg}	t          j	        | ddd          5 }
d|v rZ|	
                    d|            |                    d           t          |          }|D ]}|
                    d|z             nY|	
                    d|            |                    d           t          |          }|D ]}|
                    d|z             ddd           n# 1 swxY w Y   t          j	        |d          5 }|                    |            ddd           n# 1 swxY w Y   	 t          j        |           n# t           $ r Y nw xY w	 |                    |	           t%          |          }|j        }|j        dk    rd}n # t           $ r t	                       d}Y nw xY wddd           n# 1 swxY w Y   |S )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=   z%i
z--unicodes-file=   z%04x
wb)rL  )fontTools.subsetsubsetImportErrorr	  ru   rq   tempfileTemporaryDirectoryr8   r9   rj   r=  r   r   rc   r7  rf   mainr0  r  glyph_count)r  unc_setgid_setftsr	  tmp_diroldfont_pathnewfont_pathuncfile_pathr  unc_fileunc_listuncrL  rX  
new_buffers                   r(   build_subsetz+Document.subset_fonts.<locals>.build_subset  s   .......   '<N,<,<,<IJJJ OOO,,.. -&'")777")777")777 #3\33)*-/#	 W555sVLLL ;PX(($A<$A$ABBBC(((#'==#+ 9 9C$NN6C<88889 $E|$E$EFFFC(((#'==#+ ; ;C$NN8c>::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; W\400 +HNN6***+ + + + + + + + + + + + + + +Il++++    D&HHTNNN666D!%J'1,,%)
  & & &"$$$!%JJJ&W-& -& -& -& -& -& -& -& -& -& -& -& -& -& -&\ s   	 097H)B8EH)E	H)E	H)/FH)F	H)F	H)F21H)2
F?<H)>F??H)9G=<H)=HH)HH))H-0H-c           
         d fd}t          | j                  D ]6}|                     |d          D ]}|d         }|d         }|d         }|dvr t          |          d	k    r|d	         d
k    r@|                     |          }|d         } || |          }	                    |t                      t                      t                      t                      ff          \  }
}}|                    |           |	D ]}|
                    |           t          |          }|
                    |j	                   ~|
||f|<   8dS )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 re|                      d          }t          | |dz   |dz            d          }|                     | ||dz            t          |                    } d| v e| S )zlRecreate font name that contains PDF hex codes.

                E.g. #20 -> space, chr(32)
                #r   r      )r   r3   r  chr)r   r  r  s      r(   	norm_namez@Document.subset_fonts.<locals>.repl_fontnames.<locals>.norm_name  ss    
 Tkk		#ADQQ/44A<<QQYQ@@D Tkk r)   c                    |d         }|g}|                      |d         d          d         dd         } |          }||vr|                    |           |                      |d         d          }|d         dk    r|S |d         dd         }|                    d	          r.t          |dd
                   }|                     |d          }|                    d          }|dk    r|                    d|dz             }t          |                    d|dz             |                    d|dz                       }||dz   |         } |          }||vr|                    |           |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  r0  rn  Tr~  z	/BaseFontrD  r?  )r  rj   r  r3   r  r   r  )	r)  rB   r   r  descendentsr  r  r	  r	  s	           r(   get_fontnameszDDocument.subset_fonts.<locals>.repl_fontnames.<locals>.get_fontnames  s   
  7!
++DGZ@@CABBG$9X..5((LL***!..tAw8IJJq>W,, L)!nQrT2''// I{3B3/00D"%//$4/"H"HK %%k2277$))#rAv66B[--c26::K<L<LTSUXYSY<Z<Z[[B*26B;7H(y22Hu,,X...r)   Trz  r   r   r   )otfttfwoffwoff2r  r	  r0  rM  N)
rK  r  r  r6   r  r7   r  r=  r0  r   )r)  r	  r   r  	font_xreffont_extr  extrrM  r  name_setxref_setsubsetsr   rX  r	  font_bufferss                  @r(   repl_fontnamesz-Document.subset_fonts.<locals>.repl_fontnames  s   	 	 	    8 3>** M M++AD+99 M MA !!I tH tH (   !8}}q((Xa[C-?-? ++I66D!%bJ)M#q11E2>2B2B"SUUCEECEE355>$B3 3/Hh LL+++ % + + T****:666DLL+++08(G/LL,,9MM Mr)   c                 T                                     D ]\  }\  }}}| |v r|c S d S r+   )rA   )r   r  r	  r  r	  s       r(   find_buffer_by_namez2Document.subset_fonts.<locals>.find_buffer_by_name  sH    ,8,>,>,@,@ " "((1a8##!MMM $4r)   zNo fonts to subset.r   rX  !   charsr   zCannot subset r   zBuilt subset of font r	  Tr~  )r   r  pdf_subset_fonts2r   rK  r  rq   r  r6   get_texttracer   r4   r=  rA   rN  r  r  ) r)  r	  r	  rY  r	  r	  r	  r	  r	  r	  old_fontsizenew_fontsizerM  r   r  r   r  r	  r	  set_ucsset_gidr  
old_bufferr	  r	  r  rw  r	  r	  width_table	def_widthr	  s    `                              @r(   subset_fontszDocument.subset_fonts$  s   8  	5c::C#CeCN.C.C)D)DEEEF	# 	# 	# 	# 	#$	 	 	 	 	0	2 	2 	2 	2 	20>	 >	 >	@K	M K	M K	M K	M K	MZ	 	 	 	 	 	s 	 0.///1&++-- 	, 	,JC
OO+LL  	P 	PD **,, P P::T))<,,,X66>9Ef9M6($6Wgg & &AKK!%%%KK!%%%%(0(Wg<N'OV$$P :F9K9K9M9M 	, 	,5J58W%j'!*gajIIJH~~a(H!S__J%G%G <:X:::;;; ?====>>>""j"99C1vH))) '  H
 & F F	)7	)B)B&Y!!)X666 F) F"N9k9EEE C
OO+LLl**r)   c                    t          |           }t          j        t          j        |          t	          d          t	          d          t	          d                    }t          j        |          rt          j        |          s|dk     rdS t          t                    |dk     rdS t          j	        ||           |r/t          j
        |           t          j        |j                   dS dS )zActivate an OC layer.r-  rN  r  r   Nr   )r   r   r  r1  r  r  r  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr  r   )r'   r  
as_defaultrY  cfgss        r(   switch_layerzDocument.switch_layer\  s    t$$"!3''  ((##	  !4(( 	00CT0J0J 	0zz.///A::F%sF333 	313777!3>22222	3 	3r)   c                    | j         s| j        rt          d          t          |           }t	          j        |          }t          |d|dz
            st          dt                     t          |           t          ||          }t	          j        |||           |rt          t          |                     dS dS )z!Replace object definition source.r+  r   rk  N)r   r  r   r   r   r  r  r  r  rX  r3  r'  JM_refresh_linksr   )r'   r  r   r   rY  xreflenr  s          r(   r  zDocument.update_objectp  s    > 	=T. 	=;<<<t$$$S))a++ 	.J---%c400T7333 	2l40011111	2 	2r)   c                    | j         s| j        rt          d          t          |           }t	          j        |          }|dk     s||k    rt          t                    t	          j        ||d          }t	          j        |          st          t                    t          |          }|j        st          t                    t          ||||           d|_        dS )zReplace xref stream part.r+  r   r   N)r   r  r   r   r   r  r  r  ry  MSG_IS_NO_DICTr&  r   r  r'  r(  dirty)	r'   r  r   r  compressrY  r
  r  r  s	            r(   r+	  zDocument.update_stream  s    > 	=T. 	=;<<<t$$$S))!88tg~~l+++$S$22 %% 	.n--- ((~ 	-^,,,c3111			r)   c                 ^    t          | d          }|j        rt          j        |          S dS )z1
        Count versions of PDF document.
        r   r,  )r   r   r   pdf_count_versionsr  s     r(   version_countzDocument.version_count  s6    
 ta000> 	1+C000qr)   c                     ddl m}  |            }|                     ||||
||||||||	||||||||           |                                S )Nr   r^  )r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r8   r^  r  rv  )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  s    , 	gii		#%-+'%'!"3'#5) 	 	
 	
 	
, ||~~r)   c                      | j         |i |S r+   )r   r  s      r(   r  zDocument.tobytes  s    tz4*6***r)   c                 ^    t          |            | j                            | j                  S zPDF xref number of page.re  r   rn  rR  r-   s    r(   r  zDocument.xref  *     	D{$$T[111r)   )keepsourcetargetr 
  c                   |                      |          r.|                     |          }|                     ||dd           |g }|                     |          D ]}||v r|                     ||d           |                     |          D ]5}|                     ||          }|                     |||d                    6dS )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+	  ri	  rl  r  )r)  r!
  r"
  r 
  r   r  rB   s          r(   	xref_copyzDocument.xref_copy  s    f%% 	((00F	     <D$$V,, 	2 	2Cd{{VS&1111$$V,, 	3 	3C##FC00DVS$q'2222	3 	3r)   c                 J   t          |           }t          j        |          }t          |d|dz
            s|dk    rt	          t
                    |dk    rt          j        ||          }nt          j        |          }|j        sdS t          j	        ||          }|j        sdS d}t          j
        |          rd}dt          j        |          z  }n%t          j        |          rd}nt          j        |          rd	}nt          j        |          rd
}dt          j        |          z  }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        |          z  }n:t          j        |          r$d}t/          t          j        |                    }nd}| t3          |dd          }	t5          |	          }||fS )z+Get PDF dict key value of object at 'xref'.r   r0  r   )r  r  Nr  r`	  r  r4   r3   z%irm  r  r6  rE  rS	  r   z/%sr	  unknown)r   r   r  r  r   r  r  r1  r   r  r  r   r  ry  
pdf_is_intr  pdf_is_realr  rM  rN  r  rx  pdf_is_stringr  r  JM_object_to_bufferr  )
r'   r  r  rY  r
  r  subobjr   r   r  s
             r(   r  zDocument.xref_get_key  sI   t$$$S))a++ 	,

l+++!88'T22CC#C((C~ 	$##$S#..  	$## (( 	De.v666DD'' 	DDv&& 	DDf%% 	D%*6222DDv&& 	DDv&& 	DDDv&& 	D (( v&& 	D5,V444DD (( 	D$U%=f%E%EFFDDD<%fa33C',,Dd|r)   c                    t          |           }t          j        |          }t          |d|dz
            s|dk    rt	          t
                    |dk    rt          j        ||          }nt          j        |          }t          j        |          }g }|dk    r|S t          |          D ]>}t          j
        t          j        ||                    }|                    |           ?|S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   r0  r   )r   r   r  r  r   r  r  r1  rz  rK  rx  r|  rj   )	r'   r  rY  r
  r  rD   r   r   r  s	            r(   ri	  zDocument.xref_get_keys)  s    t$$$c**a++ 	,

l+++!88'd33CC#S))C$$66Iq 	 	A#U%;S!%D%DEECIIcNNNN	r)   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )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_font<  sO    > 	=T. 	=;<<<T6**1-884ur)   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )z!Check if xref is an image object.r+  r  r   r]  TFr0
  r1
  s     r(   xref_is_imagezDocument.xref_is_imageD  sO    > 	=T. 	=;<<<T9--a0H<<4ur)   c                 z    t          | d          }|j        sdS t          t          j        ||                    S )z!Check if xref is a stream object.r   r,  F)r   r   r6  r   pdf_obj_num_is_streamrM  s      r(   r$
  zDocument.xref_is_streamL  s>    ta000~ 	5E/T::;;;r)   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )z Check if xref is a form xobject.r+  r  r   r^  TFr0
  r1
  s     r(   xref_is_xobjectzDocument.xref_is_xobjectS  sO    > 	=T. 	=;<<<T9--a0G;;4ur)   c                 b    d}t          | d          }|j        rt          j        |          }|S )zGet length of xref table.r   r,  )r   r   r   r  )r'   r
  rY  s      r(   rq  zDocument.xref_length[  s8    ta000> 	.(--Gr)   c                    | j         rt          d          t          rt          j        | j        |||          }|S t          |           }t          j        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }t          t          j        |          ||          }t          |          }	|	S )z#Get xref object source as a string.r   r   r0  r   )r   r   r  r   r  r   r   r   r  r  r  r  r1  r,
  r&  JM_EscapeStrFromBuffer)
r'   r  r  r  rF   rY  r
  r  r  r   s
             r(   r  zDocument.xref_objectc  s    > 	0./// 	#TYj%HHCJt$$$S))a++ 	,

l+++!88'T22CC#C((C!%"<S"A"A:uUU%c**r)   c           	         | j         rt          d          |r@t          |t                    r+t                              |          t                      dhfvrt          d          t          |t                    r@|r>|d         dk    rAt                              |dd                   t                      k    rt          d          t          |           }t          j	        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }t          |||          }|j        sdS |dk    rt          j        |||           dS t          j        |          }t%          |          D ]>}	t          j        |t          j        ||	          t          j        ||	                     ?dS )	z&Set the value of a PDF dictionary key.r   rD  z	bad 'key'r   r   Nzbad 'value'r0  )r   r   r=   r   INVALID_NAME_CHARSintersectionr  r   r   r  r  r  r  r1  JM_set_object_valuer   r'  rz  rK  rM  r|  r{  )
r'   r  r  r   rY  r
  r  r  rD   r   s
             r(   rl  zDocument.xref_set_keyv  s   > 	0./// 	**S#.. 	*2D2Q2QRU2V2V_b_d_dgjfk^l2l2l[)))%%% 	,U 	,eAh#ooJ\JiJijopqprprjsJtJtx{x}x}J}J}]+++t$$$S)) a++ 	,

l+++2::'T22CC#C((C%c366! 	F2::#Cw77777"7++A1XX  ".w::.w::    r)   c                    | j         s| j        rt          d          t          |           }t	          j        |          }t          |d|dz
            s|dk    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   r0  r   N)r   r  r   r   r   r  r  r  r  r1  r  pdf_load_stream_numberr  r'   r  rY  r
  r  r  r  s          r(   r*	  zDocument.xref_stream  s    > 	=T. 	=;<<<t$$$c**a++ 	,

l+++199(#tQ77CC#S))C$$ 	'.T::C #&&Ar)   c                    | j         s| j        rt          d          t          |           }t	          j        |          }t          |d|dz
            s|dk    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   r0  r   N)r   r  r   r   r   r  r  r  r  r1  r  pdf_load_raw_stream_numberr  rB
  s          r(   r%
  zDocument.xref_stream_raw  s    > 	=T. 	=;<<<t$$$c**a++ 	,

l+++199(#tQ77CC#S))C$$ 	'2C>>C #&&Ar)   c                 L   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  r1  r  r   r  r	  r  r   )r'   rY  r<  r  r  s        r(   xref_xml_metadatazDocument.xref_xml_metadata  s    t$$!5#4c#:#:HV<L<LMM 	<_&:;;; $(<(<==> 	*#S))Dr)   )r   r  r  __dict__c                     | j         S r+   )r  r-   s    r(   rr	  zDocument.<lambda>  s    DM r)   )r  N)NNNNr   r   r  )r0  r0  r0  )r0  r0  r0  r   r/  r1  r	  )r0  rf  rg  NNr   NN)r0  r   NN)r   r0  r   )r0  )r   r   N)r   FTTTFFFFFr   r  NNTr   r   r   )r  r   Nr  )r   NNNFr  )r0  r0  r0  r0  TTr   r   )Nr  rf  rg  r  Nr-  r+   )Nr   r   r  r  r   )
Nr   r   TTTTTFNr.  )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NNr   r   r   )TTTTTTTr   TTTTT)FNNN)NNNNN)r   NNN)NNNNNNNr   FF)r   Nr   r   )FFFFFFFFFFFFr   r  NNr   r   r   )r.   r/   r0   r6  r  r  r  r  typingoverloadr3   r   r_  sysversion_infor  r   r   r   r'  r   r   r5  r:  rF  rK  rN  r}  r  r  Unionr  r  r  r  r  r   r  r  r"  r*  r-  r1  r9  rH  rN  rR  rT  re  ri  ru  r9  rY  r  r  r2  r  r  r  r  r  r  r  r  r  r  r  r  r  r  
ByteStringr3  r  r  r  r  r  r4   r  r  OptBytesr  r  r
  r  r#  r.  OptDictrL  rP  rV  rY  r  ri  rx  r8  r  r  r  r  r   r  r   r  OptIntAnyr  r  r  r  r  r  r  r  r  rm  r5  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r)  r  r)  r+  r  r6  r;  rG  rI  r   rU  r  r  r`  r  r  rg  rk  rn  rr  rv  implementationversioncollectionsabcIterable
_pages_retr|  r  r1  r  r  r  r  r  r  r  r  r	  r		  r.	  r6	  r=	  r  rI	  rP	  rW	  r%	  r  r|	  r	  r	  r	  r	  r   r	  r	  r
  r
  r  r+	  r
  r   r  r  r&
  r  ri	  r2
  r4
  r$
  r8
  rq  r  rl  r*	  r%
  rF
  	__slots__r  	is_streamr,   r)   r(   r   r     s&       4    ,; ; ; ;.     _ S     _ 6!!		 	4: 	 	 	 
	 
	sCx 	T 	 	 	 
	! ! ! !W< W< W< W<r    U# U U U U) ) )($$ $ $ $ $  @9 9 9+ + +  w@ w@w@w@ w@ 	w@
 w@ w@ w@ w@ w@|  DP DPDPDP 	DP
 DP DP DP DP DP DPL
  	v|CH'= 	# 	 	 	 	   >
+ 
+ 
+- - -^% % %(" " " "HD D DL% % % % % S # C 3 WZ ad    <  @  ) ) )"     (   	 	 	/ / /6  6  6 p   0) ) )	8 	8 	8	  	  	 
' 
' 
'H H H H8   X(/ / / /D D D DL
 
 
9 9 9 &*4 @ @ @d @D @D @ @ @ @$ 3 3 X3    $   .; ;S ;c ; ; ; ;2< < <& &s & & & &
C  C  C P ##& &&& & 	&
 & & & & &P)s ) ) ) )&S#X 6 & & & &	*S#X 6 	*5 	* 	* 	* 	*c3h!7 D    ,t      $"# ,sCx(  	
     >/ / / /b  B  )- - - -^/ / /6  6  6  6 v  $c ccc c 	c
 c c c c cJ   ,  2  J c c    "- - -^AHj AH AH AH AH AH AHF  $ # T T    $
 
3 
d 
d 
 
 
 
K K K   < #'%)"! ! !!!  	! #! ! ! ! ! ! ! !L !" #'L LLL L 	L
 L !L L L L L L*S T      $  4 444 4 4 4 4l  "
 t    
z 
d 
 
 
 
{ { {0 ) ) ) )\ 37 "#   ,sD$/ 	
         D t( t( t( t( t(n $ $ X$   X   X,   X ; ; X;   X	8 	8 	8& & &  P P P      
" 
" 
"
4 
4 
4 
4% % %   9 9 X9 / / X/  2   (  <% % %   $    X:; ;S ;c ; ; ; ;(   X   0   X 	   	
    $/ / /*  $ 	5 	5 X	5  (    " C    X #    X !F** _-

 _-d3
( (6 (v (6 (T^ ( ( ( (:  H H H H   X0/ / / 9 9 9 9 9 9v   8 U, U, U, U,n2 2 2 2A A AL  +W" W" W" W"r/ / /"Y Y Y $( $#' $#!#!"!%!%$(#!%Y; Y;Y; Y; Y; !	Y;
 Y; Y; Y; Y; Y; Y; Y; "Y; Y; Y; Y; Y; Y; Y;~  "#'"
 "
"
"
 "
 	"

 "
 "
 !"
 "
 "
 "
 "
H     <   ?/ ?/ ?/ ?/B: : : :"T d    .; ;* ; ; ; ; ; ;zJ c s t    0 -1!+/G GGG ,tTz*G 	G
 T4Z(G G G G GR1 1 1 1 1 /S / / / / *2 *2 *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 jJ jJ jJ jJXA A A$v+ v+* v+t v+t v+X^ v+ v+ v+ v+p	3 3 3 3(2 2 2 2   $   X   ). . . .`+ + + 2 2 X2
 NR !3 !3 !3z !33 !3 !3d !3VZ !3 !3 !3 !3F0 0 0d  &    < < < <       &$ $ $L  $  $
 
 
 CIh1122GIIIr)   r   c                   4    e Zd Zd Zd Zd	dZd Zd Zd ZdS )
DocumentWriterc                     | S r+   r,   r-   s    r(   r  zDocumentWriter.__enter__  r  r)   c                 .    |                                   d S r+   r  r>  s     r(   r  zDocumentWriter.__exit__  r  r)   r[   c                    t          |t                    rn7t          |d          rt          |          }nt          |d          r|j        }t          |t                    r,t	          j        ||t          j        j                  | _        d S t          |          }t	          j        ||t          j        j	                  | _        |
                                dk    sJ t          | j        d          sJ d S )Nr  r   r   _out)r=   r   r:   r   r   FzDocumentWriterPathType_PDFr   r  OutputType_PDFr5  )r'   r	   r  r  s       r(   r   zDocumentWriter.__init__  s    tS!! 	dJ'' 	::DDdF## 	9DtS!! 	/.gu?U?bccDIII (..C.We>T>cddDI''))Q....DIv.......r)   c                 v    t          |          }t          j        | j        |          }t	          |          }|S r+   )r  r   fz_begin_pager   r  )r'   ro  	mediabox2r  device_wrappers        r(   
begin_pagezDocumentWriter.begin_page  s6    #H--	$di;;&//r)   c                 8    t          j        | j                   d S r+   )r   fz_close_document_writerr   r-   s    r(   r  zDocumentWriter.close  s    &	22222r)   c                 8    t          j        | j                   d S r+   )r   fz_end_pager   r-   s    r(   end_pagezDocumentWriter.end_page  s    49%%%%%r)   Nr[   )	r.   r/   r0   r  r  r   rj
  r  ro
  r,   r)   r(   r^
  r^
    ss            / / / /.  3 3 3& & & & &r)   r^
  c                   x   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dS )!r0  c                 6    t          |           t          urd S d S r+   )r   r0  r-   s    r(   r  zFont.__del__   s     ::T!!4 "!r)   Nr   r0  r   c                 "   |rmt          |d          r|                                }n$t          |t                    rt	          |          }t          |t                    st          d          t          |t                    r|                                }d|v sd|v sd|v rt          d           |dv rd}n|	                    d	          rd
}n|	                    d          rd}nq|	                    d          rd}nY|t                                          v rdd l}|                    |          }d }~n!|dk     rt                              ||          }t!          j        |          }t%          |||||||||	|

  
        }|| _        d S )Nrv  zbad type: 'fontbuffer'rD  \r   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanr   )r:   rv  r=   r]  r  r   r   r  rq   r2   fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr7   r   r  JM_get_fontr   )r'   r   rL  rM  scriptr)  r  is_bold	is_italicis_serifembedfname_lowerr|
  r(  rX  s                  r(   r   zFont.__init__   s     	;z:.. /'0022

J	22 /":..
j%00 ; !9:::h$$ 	C"..**Kk!!T[%8%8C;<N<N;<<<<<<''	22 C''00 C''00 	C 4 9 9 ; ;;;$$$$*11+>>
!MA*..xBB1(;;8XvtXIx8 8 			r)   c                     d| j         z  S )Nz
Font('%s')r   r-   s    r(   r   zFont.__repr__9   s    di''r)   c                 4    t          j        | j                  S )z Return the glyph ascender value.)r   fz_font_ascenderr   r-   s    r(   r1  zFont.ascender<        %di000r)   c                 4    | j                                         S r+   )r   fz_font_bboxr-   s    r(   r.  z	Font.bboxA   s    y%%'''r)   c                     t          j        t          j        | j        j        j                            }t          j        |          S r+   )r   rk  ll_fz_keep_bufferr   r   r  fz_buffer_extract_copy)r'   r,  s     r(   r  zFont.bufferE   s5    .%"949;O;V"W"WXX+W555r)   r  c           	      D   t          j        |          }g }|D ]}	t          |	          }
|r(t          j        | j        |
          }|dk    r| j        }nt          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_fallbackrj   r  )r'   r   r   r)  r
  wmode
small_capsr(  r   chr  gidrX  s                r(   char_lengthszFont.char_lengthsJ   s    1(;; 	K 	KBBA `249a@@!889D!CDIqRXZ^__	TIIh!7c5!I!IIJJJJ	r)   c                 4    t          j        | j                  S )z!Return the glyph descender value.)r   fz_font_descenderr   r-   s    r(   r2  zFont.descenderY   s     &ty111r)   c                 p   t          j        | j        j                  }|sd S t	          |t           j                  sJ t          r|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|n|j        dS )Nc                 F    d         d| z  dz
  z  }d         | z	  d<   |S r  r,   )bitsrF   rE   s     r(   bzFont.flags.<locals>.bh   s/    dqDy!m,tt|!
r)   r   )monoserifrM  ra  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxru
  zcjk-langr
  znever-embed)r   ll_fz_font_flagsr   r   r=   fz_font_flags_tr   is_monor
  r
  r
  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxru
  cjk_langr
  never_embed)r'   r  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  rE   s                   @r(   r  z
Font.flags^   s   "49#788 	F1e344444 	A     addGqttHaddG!IAaDDM1J!I!A$$K1Q44L1Q44LqttHAaDDE!A$$K+6 EAI,7 GQZ+6 EAI-8 I		ak1< Q!/.9 K

q|-8 I		ak/: M0; O0; O,7 BQU,7 GQZ)4 A!'/: M  	r)   c                     t          j        |          }|r(t          j        | j        |          }|dk    r| 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)  r
  r
  r
  r(  r
  rX  s	            r(   glyph_advancezFont.glyph_advance   ss    1(;; 	_.ty$??Caxxy?	4QWY]^^IC%dC777r)   c                 $   t          j        |          }|r(t          j        | j        |          }|dk    r| 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_glyphrq  )r'   charr)  r
  r
  r(  r
  rX  s           r(   
glyph_bboxzFont.glyph_bbox   s    1(;; 	`.	4@@Caxxy?DRXZ^__ICE($U^5E5EFFGGGr)   c                 $    | j         j        j        S r+   )r   r   r	  r-   s    r(   r	  zFont.glyph_count   s    y#//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                     |r4t          j        |          }t          j        | j        |||          \  }}n7|rt          j        | j        |          }nt          j        | j        |          }|S )z0Check whether font has a glyph for this unicode.)r   r  r
  r   r
  r  )	r'   r	  r)  r
  r	  r
  r(  r
  rX  s	            r(   	has_glyphzFont.has_glyph   ss     	@5h??D?	3PVX\]]IC @249cBB/	3??
r)   c                 4    t          j        | j                  S r+   )r   fz_font_is_boldr   r-   s    r(   r
  zFont.is_bold   s    $di000r)   c                 4    t          j        | j                  S r+   )r   fz_font_is_italicr   r-   s    r(   r
  zFont.is_italic   s    &	222r)   c                 4    t          j        | j                  S r+   )r   fz_font_is_monospacedr   r-   s    r(   is_monospacedzFont.is_monospaced   s    *DI666r)   c                 4    t          j        | j                  S r+   )r   fz_font_is_serifr   r-   s    r(   r
  zFont.is_serif   s    %ty111r)   c                     dS r  )r   r   r
  r   r   cppyygbl"mupdf_mfz_font_flags_ft_substituter
  ll_fz_font_t3_procspdf_font_writing_supported)r'   rX  r  r
  r
  s        r(   is_writablezFont.is_writable   s    tr)   c                 8    t          j        | j                  }|S r+   )r   fz_font_namer   r   s     r(   r   z	Font.name   s     ++
r)   c                 j   | j         }t          j        |          }d}	t          |t                    st          t                    |D ]d}
t          |
          }|rt          j        ||          }|dk    r|}nt          j	        ||||          \  }}|	t          j
        |||          z  }	e|	|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)  r
  r
  r
  thisfontr(  r   r
  r  r
  rX  s                 r(   text_lengthzFont.text_length   s    91(;;$$$ 	+\*** 	; 	;BBA _28Q??!88#D!CHaQWY]^^	T%(sE:::BB
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 |D             }t          |          }t	          |          }|S )zE
        Returns sorted list of valid unicodes of a fz_font.
        c                     g | ]	}|j         
S r,   )ucsr   s     r(   r   z)Font.valid_codepoints.<locals>.<listcomp>   s    (((!(((r)   )r   fz_enumerate_font_cmap2r   r  sorted)r'   ucs_gidsucssucss_uniqueucss_unique_sorteds        r(   valid_codepointszFont.valid_codepoints   sH     0;;((x((($ii#K00!!r)   )
NNNr   Nr0  r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r.   r/   r0   r  r   r   r2  r1  r.  r  r
  r2  r  r
  r
  r	  r
  r
  r
  r
  r
  r
  r
  r   r
  r
  r
  r,   r)   r(   r0  r0      sA          1 1 1 1f( ( ( 1 1 X1 ( ( X( 6 6 X6    2 2 X2 ) ) X)V	8 	8 	8 	8	H 	H 	H 	H 0 0 X0+ + +
 
 
 
 1 1 X1 3 3 X3 7 7 X7 2 2 X2   X$   X
   &) ) )" " " " "r)   r0  c                       e Zd Zd Zd ZdS )r  c                 D    t          |           t          urd S d| _        d S r  )r   r  r   r-   s    r(   r  zGraftmap.__del__!  s#    DzzX%%Fr)   c                 h    t          |          }t          j        |          }|| _        d| _        d S r  )r   r   pdf_new_graft_mapr   r   )r'   r)  dstmap_s       r(   r   zGraftmap.__init__!  s1    s##&s++	r)   N)r.   r/   r0   r  r   r,   r)   r(   r  r     s2          
    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efd            Zed             Zed             Zed             ZddZddZd Zed             ZdZdS )Linkc                 .    |                                   d S r+   )r   r-   s    r(   r  zLink.__del__!  s    r)   c                 L    t          |t          j                  sJ || _        d S r+   )r=   r   FzLinkr   )r'   r   s     r(   r   zLink.__init__!  s%    4.....			r)   c                 N    t          |            dt          | j                  z   S Nzlink on re  r   r   r-   s    r(   r   zLink.__repr__!  %    DC,,,,r)   c                 N    t          |            dt          | j                  z   S r
  r
  r-   s    r(   r   zLink.__str__!  r
  r)   c                     t          |d          }|j        sd S t          j        ||d          }|j        sd S t	          |          }|S Nr   r,  )r   r   r   r  r  r'   r)  r  rY  link_objr
  s         r(   _borderzLink._border!  sY    sQ///~ 	F)#tQ77" 	FH%%r)   c                     t          |d          }|j        sd S t          j        ||d          }|j        st	          t
                    t          |          }|S r
  )r   r   r   r  r   r  r  r
  s         r(   _colorszLink._colors'!  sb    sQ///~ 	F)3a88" 	,l+++X&&r)   c                 "    d | _         d| _        d S r  )r   r   r-   s    r(   r   zLink._erase1!  s    r)   c                     t          |d          }|j        sd S t          j        ||d          }|j        sd S t	          |||          }|S r
  )r   r   r   r  ra  )r'   r  r)  r  rY  r
  r
  s          r(   
_setBorderzLink._setBorder5!  s]    sQ///~ 	F)#tQ77" 	FX66r)   c                 V    |                      | j        j        j        | j                  S r+   )r
  r   r   r  r-   s    r(   r  zLink.border?!       ||DK.3TY???r)   c                 V    |                      | j        j        j        | j                  S r+   )r
  r   r   r  r-   s    r(   r  zLink.colorsC!  r
  r)   c                 f   t          | d          r| j        t          d          | j        j        j        s| j        j        j        rt          d          | j        j        }| j        s| j                            d          rd}n|                    | j                  }t          | ||          S )z Create link destination details.r   Norphaned object: parent is Noner+  r	  )
r:   r   r   r   r  r  r^  r2   r  linkDest)r'   r)  r^  s      r(   r  z	Link.destG!  s     4"" 	@t{':>???;' 	=4;+=+J 	=;<<<k  	-tx22377 	-CC""48,,Cc3'''r)   r  c                     t          |            | j        j        }|j        sdS |                    | j        d          }|d         dk    rt          |d                   S dS )Nr   r  r   r  )re  r   r  r  r  r3   )r'   r)  r  s      r(   r  z
Link.flagsW!  sb    Dk z 	1TY,,Q46>>qt99qr)   c                     t          |            t          rt          j        | j                  S | j        }|j        r|j        j        sdS t          t          j	        |j        j                            S )zFlag the link as external.F)
re  r  r   Link_is_externalr   r   r^  r6  r   fz_is_external_linkr'   	this_links     r(   r  zLink.is_externalb!  sp     	D 	6)49555I	# 	9+?+C 	5U.	0D0HIIJJJr)   c                 :   | j         j        sdS t          |            	 | j                                         }|j        sdS t          |          }|rd|_        | j	        |_	        ||j	        j
        t          |          <   | j        dk    rd | j	                                        D             }d | j	                                        D             }|                    | j                  }||dz            |_        ||dz            |_        nd|_        d|_        |S )z
Next link.Nr   Tc                 J    g | ] }|d          t           j        k    |d         !S r   r   r   r  r  s     r(   r   zLink.next.<locals>.<listcomp>!  s.    fffq1QVQeIeIeadIeIeIer)   c                 J    g | ] }|d          t           j        k    |d         !S )r   r   r  r  s     r(   r   zLink.next.<locals>.<listcomp>!  s-    dddQqtuOcGcGcAaDGcGcGcr)   r   r[   )r   r   re  r  r   	Link_nextr;  r
  r   r   r6  r7  r  r  ra  )r'   r  
link_xrefslink_idsr6  s        r(   r;  z	Link.nextm!  s    y# 	4D	# )..""C~ 	4Cjj 	CKCJ.1CJ"2c77+y1}}ffDK,C,C,E,Efff
dd$+*A*A*C*Cddd &&ty11%cAg.!#'*
r)   c                     t          |            | j        | j        j        st          d          t	          | j                                                  }t          |          }|S )zRectangle ('hot area').Nz"self.this.m_internal not available)re  r   r   rf   rf  r   r#  r  s     r(   r   z	Link.rect!  s^     	D 9DI$8ABBBty~~//003ii
r)   Nr   c                     t          |          t          ur|||d}|                     || j        j        j        | j                  S )N)r[  r\  r]  )r   r4   r
  r   r   r  )r'   r  r[  r]  r\  s        r(   rc  zLink.set_border!  sB    <<t##$uGGFvt{'9'>	JJJr)   c                    t          |            | j        j        }t          |          t          ur||d}|                    d          }|                    d          }|t          d           |g dfv r|                    | j        dd           dS t          |d	          rt          |          g}t          |           t          |          d
v sJ dt          |           d}|                    | j        d|           dS )zSet border colors.re  r   rf  Nz!warning: links have no fill colorr,   r  rg  rh  ri  rj  rk  )re  r   r   r4   r7   rq   rl  r  r:   rm  rn  r6   r   )r'   r  rf  r   r)  rp  s         r(   rq  zLink.set_colors!  s   Dk <<t##"f55Fzz&!!H%%7888b"XTYT222F6;'' 	%Fmm_F66{{i''''$	&!!$$$C+++++r)   c                    t          |            | j        j        }|j        st          d          t	          |          t
          urt          d          |                    | j        dt          |                     d S )Nr  zbad 'flags' valuer  )	re  r   r  r   r   r3   rl  r  r   )r'   r  r)  s      r(   rt  zLink.set_flags!  sw    Dk z 	*[)))E{{c!!0111CU444tr)   c                 z    t           rt          j        | j                  S | j        }|j        r|j        j        ndS )zUri string.r[   )r  r   link_urir   r   r^  r  s     r(   r^  zLink.uri!  s>      	->$),,,I	+4+?Gy#''RGr)   r0  )Nr   NNr/  )r.   r/   r0   r  r   r   r   r
  r
  r   r
  r2  r  r  r  r3   r  r  r;  r   rc  rq  rt  r^  r   r,   r)   r(   r
  r
  !  s           - - -- - -         @ @ X@ @ @ X@ ( ( X( S    X K K XK   X6 	 	 X	K K K K
, , , ,(   H H XH DDDr)   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dS )rt  c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r,   r,   r   r  s     r(   r   z"Matrix.__abs__.<locals>.<listcomp>!      000aac000r)   mathsqrtsumr-   s    r(   __abs__zMatrix.__abs__!  )    y00400011222r)   c           
         t          |d          rDt          | j        |z   | j        |z   | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z   | j        |d	         z             S 
Nrh  r  Matrix: bad seq lenr   r   r   r   rI  r   
r:   rt  r    r
  r  r  r_  r  r6   r   r)  s     r(   __add__zMatrix.__add__!      1k"" 	>$&1*dfqj$&1*&1*dfqj$&1*> > >q66Q;;2333dfqtmTVad]DFQqTM&1Q4-!A$1G G 	Gr)   c                 X    t          |           t          |           cxk    odk    nc  S r   r  r  r-   s    r(   __bool__zMatrix.__bool__!  3    IIT////a////00r)   c                 X    t          |d          sdS t          |          dk    o| |z
   S )Nr'  Fr  r:   r6   )r'   ru  s     r(   __eq__zMatrix.__eq__!  s5    sI&& 	53xx1}1dSj!11r)   c                 Z    | j         | j        | j        | j        | j        | j        f|         S r+   r    r
  r  r  r_  r  r  s     r(   r_  zMatrix.__getitem__!  s&    ?BBr)   Nr*  c                   |s,dx| _         x| _        x| _        x| _        x| _        | _        nt          |          dk    rt          d          t          |          dk    r<t          t          |          \  | _         | _        | _        | _        | _        | _        nt          |          dk    rqt          |d         t          j                  rn|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| _        | _        nJt          t          |d                   \  | _         | _        | _        | _        | _        | _        nt          |          dk    st          |          d	k    r`|d         dk    rTt          |d                   ddt          |d                   ddf\  | _         | _        | _        | _        | _        | _        nt          |          d	k    r`|d         dk    rTd
t          |d                   t          |d                   d
ddf\  | _         | _        | _        | _        | _        | _        nt          d          ||| _         ||| _        ||| _        ||| _        ||| _        |	|| _        dS dS )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   rh  r   r   r   r  zMatrix: bad argsN)r    r
  r  r  r_  r  r6   r   r  rm  r=   r   rq  r:   r  radiansroundcossin)r'   r    r
  r  r  r_  r  r  thetac_s_s              r(   r   zMatrix.__init__!  s     	1BEEDFETVEdfEtvEYY]]2333YY!^^=@=M=M:DFDFDFDFDFDFFYY!^^$q'5>22 Uaaaaaaa+.. 	UT!W--48E??A..48E??A.."$$"%%ADUDQRGATAT>YY!^^s4yyA~~$q'Q,,=B47^^S%Q..#s>3:DFDFDFDFDFDFFYY!^^Q1=@d1gd1gS#>>:DFDFDFDFDFDFF /000 =QDF=QDF=QDF=QDF=QDF=QDFFF==r)   c                 L    t                      }|                    |            |S )zCalculate inverted matrix.)rt  invert)r'   m1s     r(   
__invert__zMatrix.__invert__"  s    XX
		$	r)   c                     dS )Nr  r,   r-   s    r(   r'  zMatrix.__len__"      qr)   c           	          t          |d          rDt          | j        |z  | j        |z  | j        |z  | j        |z  | j        |z  | j        |z            S t          dd          }|                    | |          S )Nrh  r   )	r:   rt  r    r
  r  r  r_  r  concat)r'   r  r5  s      r(   __mul__zMatrix.__mul__"  sx    1k"" 	>$&1*dfqj$&1*&1*dfqj$&1*> > >Aa[[yyq!!!r)   c                 r    t          | j         | j         | j         | j         | j         | j                   S r+   )rt  r    r
  r  r  r_  r  r-   s    r(   __neg__zMatrix.__neg__$"  s2    tvgw$&46'DF7KKKr)   c                 X    t          |           t          |           cxk    odk    nc  S r   r#  r-   s    r(   __nonzero__zMatrix.__nonzero__'"  r%  r)   c                      t          |           S r+   )rt  r-   s    r(   __pos__zMatrix.__pos__*"  s    d||r)   c                 @    dt          t          |                     z   S )Nrt  r   r   r-   s    r(   r   zMatrix.__repr__-"  s    #eDkk****r)   c                     t          |          }|dk    r|| _        nU|dk    r|| _        nG|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S )Nr   r   r   r   rI  r   index out of range)rm  r    r
  r  r  r_  r  r  r'   r   rE   s      r(   __setitem__zMatrix.__setitem__0"  s    !HH!VVaTVV!VVaTVV!VVaTVV!VVaTVV!VVaTVV!VVaTVV1222r)   c           
         t          |d          rDt          | j        |z
  | j        |z
  | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    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__<"  r!  r)   c           	      f   t          |d          rVt          | 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          }|
                    | |          S Nrh  r  r   zmatrix not invertible)r:   rt  r    r
  r  r  r_  r  util_invert_matrixZeroDivisionErrorr:  )r'   r  r5  m2s       r(   __truediv__zMatrix.__truediv__E"  s    1k"" 	G$&2+a-"QA&2+a-"QAG G G""1% 	=#$;<<<Aa[[yyr"""r)   c                     t          |          t          |          cxk    rdk    sn t          d          t          ||          \  | _        | _        | _        | _        | _        | _        | S )z.Multiply two matrices and replace current one.r  r  )	r6   r   util_concat_matrixr    r
  r  r  r_  r  )r'   onetwos      r(   r:  zMatrix.concatO"  sj    3xx3s88((((q((((23339KCQT9U9U6r)   c                     |t          |           }nt          |          }|d         dk    rdS |d         \  | _        | _        | _        | _        | _        | _        dS )z}Calculate the inverted matrix. Return 0 if successful and replace
        current one. Else return 1 and do nothing.
        Nr   r   )rL  r    r
  r  r  r_  r  )r'   r  r
  s      r(   r4  zMatrix.invertV"  s^     ;$T**CC$S))Cq6Q;;19<Q6qr)   c                     t          | j                  t          k     rt          | j                  t          k     p9t          | j                  t          k     o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_rectilinearc"  sR     DFg%?#df++*? >[[7"<s46{{W'<	>r)   c                    t          |          }|dk     r|dz  }|dk     |dk    r|dz  }|dk    t          d|z
            t          k     rnt          d|z
            t          k     r8| j        }| j        }| j        | _        | j        | _        | | _        | | _        nBt          d|z
            t          k     r5| j         | _        | j         | _        | j         | _        | j         | _        nt          d|z
            t          k     r7| j        }| j        }| j         | _        | j         | _        || _        || _        nt          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@)rm  r  rV  r    r
  r  r  r  r,  r/  r.  )r'   r0  r    r
  radrp  r  s          r(   	prerotatezMatrix.prerotatei"  s   eaii#eaiisllESLEesllq5y>>G##((AAVDFVDFRDFRDFF'))fWDFfWDFfWDFfWDFF'))AAfWDFfWDFDFDFF ,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.rm  r    r
  r  r  )r'   sxsys      r(   prescalezMatrix.prescale"  sY    2YY2YY""""r)   c                 
   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.r\  )r'   r  rE   r    r
  s        r(   preshearzMatrix.preshear"  s|    !HH!HHvtv1!df*!df*!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.)rm  r_  r    r  r  r
  r  )r'   txtys      r(   pretranslatezMatrix.pretranslate"  s_    2YY2YY"tv+TV++"tv+TV++r)   r+   )r.   r/   r0   r  r   r$  r(  r_  r   r6  r'  r;  r=  r?  rA  r   rG  rI  rO  r:  r4  r2  rW  rZ  r_  ra  re  __inv____div__normr,   r)   r(   rt  rt  !  s       3 3 3G G G1 1 12 2 2
C C C !% 5' 5' 5' 5' 5'n    " " "L L L1 1 1  + + +
 
 
G G G# # #      > > X>
) ) )V  	 	 	   GGDDDr)   rt  c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )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                 >    t                               | dd           d S )Nr  )rt  r   r-   s    r(   r   zIdentityMatrix.__init__"  s    c3'''''r)   c                     dS )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                 Z    |dv rd| j         |<   d S |dv rd| j         |<   d S || j         |<   d S )Nadr  bcefr  )rG
  )r'   r   r   s      r(   __setattr__zIdentityMatrix.__setattr__"  sJ    4<<"%DM$V^^"%DM$"'DM$r)   c                       t          d          )NzIdentity is readonly)NotImplementedError)r  s    r(   	checkargszIdentityMatrix.checkargs"  s    !"8999r)   N)	r.   r/   r0   __doc__rm  r   r   rs  rv  r,   r)   r(   rj  rj  "  se        ,,# # #( ( (> > >( ( (: : : : :r)   rj  c                       e Zd ZdZddZdS )r
  z#link or outline destination detailsNc           	      	    |j         }| }d _        d _        d _        d _        d _        t           _        t          dd           _	        t                       _        d _        |j         _        t          dd           _        |j         _         fd}d }|rY 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                            dd           _         j                            d          rt(           _        t+          j        d j                  }|rt/          |                    d                    dz
   _        t          t3          |                    d                    t3          |                    d                               _	         j        t4          z  t6          z   _        n#t+          j        d j                  }|r+t/          |                    d                    dz
   _        nt8           _        t+          j        d j                  }|sJ |rq|ro ||                    d                    }	|                                                    |	           _         j        t                       _        |	 j        d<   n? | j        dd                     _        n!t8           _         | j                   _        |j         rO j        snF j                            d          r j        dd           _         j                            d          r j        dd           _        d _        d _        t>           _         j                             d          }
tC          |
          dk    rr|
d                             d          rWtD           _        |
d          _        t/          |
d                              d          d         dd                    dz
   _        n0d j        v rd _        t$           _        nd _        t>           _        tG           j        t                    sJ d S )Nr[   r   Fc                     j         dd                              d          }t                      }|D ];}|                    d          }|dk    r||dz   d          ||d |         <   6d ||<   <|S )Nr   &r   r   )r^  r5   r4   r   )r^  rA   rF   rB   eqr'   s        r(   uri_to_dictz&linkDest.__init__.<locals>.uri_to_dict"  s    HQRRL&&s++E&&C % %YYs^^77%)"Q$%%[CSbS	NN $CIIJr)   c                     |                      dd          }|                    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  r5   r	  r3   )r   r5   r  rB   pieces        r(   unescapez#linkDest.__init__.<locals>.unescape"  s    LLu--EKK$$EAhGabb	 $ $RaR3s5r22233348#Nr)   r	  z#page=r   z&zoom=0,r   r   r0  z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   rI  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r   z//zpage=r{  r^   T)$r  r  	file_specr  is_mapis_urir	  rW  r  ltr4   r  
new_windowr   ri  r^  r2   r   re  r  r_  rer  r3   grouprm  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr  r7   rd  r5   r6   rb  r=   )r'   r  rlinkr   isExtisIntr}  r  r  r  ftabs   `          r(   r   zlinkDest.__init__"  sY   		
	1++VV
H	1++7		 		 		 		 				 		 		  	b,,S11 	baa1aaia6I6IaaIV[\]V^L_L_aaDH? 	!DI DIx 	"DI!DI 	3TX 	3x''Y??DHx""3'' 3%	HVX\X`aa C #AGGAJJ! 3DI#E1771::$7$7qwwqzz9J9JKKDG!%.?!?BS!SDJJ!3TX>>A C$'

OOa$7		$.	H%7BB'# 	C 	C$,HQWWQZZ$8$8E)1)?)?)A)A)E)Ee)L)LDJ#z1 .2VV
6;DJ{33)4TXabb\)B)BDJJ&	([22
? 	(8 ($$W-- (!%!"">,,T22 8%)^ABB%7DN#'	~++C00t99>>Aw))'22 G$.	)-a$'Qc(:(:1(=abb(A$B$BQ$F	"$		"'	$*d+++++++r)   r+   r.   r/   r0   rw  r   r,   r)   r(   r
  r
  "  s4        --b, b, b, b, b, b,r)   r
  c                   l    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dS )r8  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| _        d S )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_stringrW  button_caption	is_signedr   	text_fonttext_fontsizetext_maxlentext_format_text_dar
  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r  r-   s    r(   r   zWidget.__init__<#  s     !!!%"#!!! 				r)   c                 (    d| j          d| j         dS )NzWidget:(field_type=z script=r  )r  r
  r-   s    r(   r   zWidget.__repr__a#  s#     TT%;SST[SSSSr)   c                     | j         s	d| _         dS d}|D ];}| j                                         |                                k    r
|| _          dS <d| _         dS )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_fontg#  sp     ~ 	#DNF6 	 	A~##%%22!" 3  r)   c           	         | j         t          dd          vrt          d          | j         t          j        k    r| j        dvrt          | d          r| j        j        }|                    | j	        d          \  }}|dk    r}t          t          t          |dd                             d	d
                                                              }|D ],}|| j	        k    r|                    |dd           %dS dS dS dS dS )z Any widget type checks.
        r   r   zbad field type)FOffr   zParent/Kidsr  r0  r`  r[   ASz/OffN)r  rK  r   r   PDF_WIDGET_TYPE_RADIOBUTTONr  r:   r   r  r  r   r  r3   r  r5   rl  )r'   r)  	kids_type
kids_valuerA  r  s         r(   _checkerzWidget._checkeru#  s1    ?%1++---... ?e???DDT\jDjDjovw{  ~F  pG  pGDj +$C$'$4$4TY$N$N!IzG##c#z!B$'7'?'?b'I'I'O'O'Q'QRRSS! = =Dty((((tV<<< @?DjDjDjDj
 $#= =r)   c                    | j         sdS d}d}d}| j                                         }t          |          D ]\  }}|dk    rA||dz
           dd         }t          ||dz
                     }dx||<   x||dz
  <   ||dz
  <   L|d	k    r't          ||dz
                     g}dx||<   ||dz
  <   y|d
k    r5d ||dz
  |         D             }dx||<   x||dz
  <   x||dz
  <   ||dz
  <   || _        || _        || _        d| _         dS )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rgc                 ,    g | ]}t          |          S r,   rm  r   r  s     r(   r   z$Widget._parse_da.<locals>.<listcomp>#      666AuQxx666r)   r   )r  r5   r  rm  r  r  r   )r'   rX  r  r^  datr   rB   s          r(   r  zWidget._parse_da#  se   
 } 	Fm!!## ~~ 	 	GAtt||1q5z!""~c!a%j))/11A1QqSC!Hs{{c!a%j))+$&&AQqSt||66QU1W666:<<A<QqS<C!Hs1Q3x  "r)   c                 n   | 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                                        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| 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| j        sd| _        n*t)          | j                  t*          urt          d          |                                  dS )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  rn  r  rW  r   r  r  r  rD	  r  r   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXr  r
  r   r   r  r  r  r  r  r  r  )r'   btn_types     r(   	_validatezWidget._validate#  s    I! 	)y!	) Z((( 	31222y((#D4$%%%4?### 	('DO4?###  	" !D! 	#!"D -3355ac: ?,.1' 
 { 	@DKK$+c))>???  	E4+ 	E#D$"##3..CDDD 	G4- 	G!%D$$%%S00EFFF 	G4- 	G!%D$$%%S00EFFF 	G4- 	G!%D$$%%S00EFFF 	E4+ 	E#D$"##3..CDDD 	F4, 	F $D$#$$C//DEEEr)   c                 z   | j         sdS | j        j        }|sJ t          |          }t          j        || j                   }t          j        |t          d                    }|                                sdS |                    t          d          | j	                   |                    t          d                    }|
                                st          d           dS t          |                                          D ]}|                    |          }|                                s,|                                }|| j         k    rL|                    t          d                    }	|	                                dk    s|                    t          d          | j	                   dS )	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  Ffr  z0warning: malformed PDF, Parent has no Kids arrayr  r8  T)r  r   r   r   r  r  r  ry  rH  r  r  rq   rK  r  r  r   rx  )
r'   r)  rY  
pdf_widgetr  r  r   r  r  r  s
             r(   _sync_flagszWidget._sync_flags#  s    y 	5k 


s##*3	::
#J0B0BCC!!## 	5 	0@AAA ""8F#3#344  "" 	FGGG5t))++,, 	C 	CA$$Q''C??$$ >>##Dty  &&x	':':;;G&&((H44  $1ABBBBtr)   c                 &   | j         dvrdS t          | d          r| j        j        }ndS | j        }ddd}|                    |d          }|d         dk    rfg }|d         d	d
         }|                    d          dd         }|D ]/}|                    |                                d                    0||d<   |d         dk    rg }t          |d                             d          d                   }|                    |          }|                    d          dd         }|D ]/}|                    |                                d                    0||d<   |                    |d          }	|	d         dk    rfg }
|	d         d	d
         }	|	                    d          dd         }|D ]/}|
                    |                                d                    0|
|d<   |	d         dk    rg }
t          |	d                             d          d                   }|                    |          }	|	                    d          dd         }|D ]/}|
                    |                                d                    0|
|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   )rN  r  zAP/Nr   r4   r   r   r  rD  rN  r  r   zAP/Dr  )	r  r:   r   r  r  r5   rj   r3   r  )r'   r)  r  statesAPNnstatesapntr$  nxrefAPDdstatesapdtdxrefs                r(   button_stateszWidget.button_states$  s    ?&((44"" 	+$CCFy $//tV,,q6VGa&2,C99S>>!""%D - -qwwyy|,,,,&F8q6VGAS))!,--E//%((C99S>>!""%D - -qwwyy|,,,,&F8tV,,q6VGa&2,C99S>>!""%D - -qwwyy|,,,,$F6Nq6VGAS))!,--E//%((C99S>>!""%D - -qwwyy|,,,,$F6Nr)   c                     | j         j        S r+   )_annotr;  r-   s    r(   r;  zWidget.nextN$  s    {r)   c                     | j         dvrdS |                                 }|t                      }|                                D ]}||         D ]}|dk    r|c c S t	          d           dS )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  r4   r  rq   )r'   bstater  rE   s       r(   on_statezWidget.on_stateR$  s     ?&((4##%%>VVF 	 	AAY  ::HHHHH  	:;;;tr)   c                 D    t                               | j                   dS )z.Reset the field value to its default.
        N)r
  _reset_widgetr  r-   s    r(   r&	  zWidget.resetg$  s      	DK(((((r)   Fc                 ,   |                                   |                                  d| _        t          | j                  dk    rd| j        z   }nEt          | 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
        |            d| _        |r|                                  d	S d	S )
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} TfrI  z%{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tfr  rp  N)r  r  r  r6   r   r  r  r  r  util_ensure_widget_calcr  r
  _save_widgetr  )r'   
sync_flagsr   s      r(   r  zWidget.updatel$  s$    !!Q&&5ECC!!Q&&*T]:CC!!Q&&9DMIC"
DOt~&*&8: : :  	1#DK000 	4;--- 		 	r)   Nr  )r.   r/   r0   rw  r   r   r  r  r  r  r  r  r2  r;  r  r&	  r  r,   r)   r(   r8  r8  7#  s         # # #J8 8 8  = = =*  >E E EN+ + +Z/ / /b     X   *) ) )
     r)   r8  )_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dS )rQ  c                     || _         d S 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                 h    | j         }|                                }|j        sd S t          |          S r+   )r   r  r   rQ  )r'   r  down_ols      r(   r  zOutline.down$  4    Y''))! 	Fwr)   c                     t           rt          j        | j                  S | j        }|j        sdS |j        j        }|dS t          j        |          S r  )r  r  Outline_is_externalr   r   r^  r   r   )r'   r  r^  s      r(   r  zOutline.is_external$  sZ     	: -ty999Y} 	5m;5(---r)   c                 &    	 | j         j        j        S r+   )r   r   r"  r-   s    r(   r"  zOutline.is_open$  s    	09'//r)   c                 h    | j         }|                                }|j        sd S t          |          S r+   )r   r;  r   rQ  )r'   r  next_ols      r(   r;  zOutline.next$  r  r)   c                 0    	 | j         j        j        j        S r+   )r   r   r   r-   s    r(   r   zOutline.page$  s    	29',11r)   c                 $    | j         j        j        S r+   )r   r   rw  r-   s    r(   rw  zOutline.title$  s    y#))r)   c                 :    | j         }|j        sd S |j        j        S r+   )r   r   r^  r  s     r(   r^  zOutline.uri$  s#    Y} 	4}  r)   c                 $    | j         j        j        S r+   )r   r   r$  r-   s    r(   r$  z	Outline.x$      y#%%r)   c                 $    | j         j        j        S r+   )r   r   r%  r-   s    r(   r%  z	Outline.y$  r   r)   r   N)r.   r/   r0   r   r2  r  r  r  r  r"  r;  r   rw  r^  r$  r%  r[
  r,   r)   r(   rQ  rQ  $  sC          * * X*. . .     X  . . X. # # X#
     X  % % X%
 * * X* ! ! X! & & X& & & X& 	IIIr)   rQ  c                 r   t          j                    }| |_        ||_        ||_        ||_        |rrt          t           j                  sJ nt          j                     G fddt           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                 ~    t                                                       |                                  | _        d S r+   )r   r   use_virtual_filtersopts)r'   	__class__r  s    r(   r   z0_make_PdfFilterOptions.<locals>.Factory.__init__ %  s6      """'')))"


r)   c           	      d    	 t          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%  s>    	9 7&!
++--  r)   )r.   r/   r0   r   r  __classcell__)r  r  s   @r(   Factoryr  $  sM        # # # # # #      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 (#  	5eU%CDDDDDD24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dpdZddZd Zd Zd Zd Zd Zd Zdedefd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'd+e(de)fd,Z*d-e+de)fd.Z,	 	 	 dd+e(d/e-d0e.d1ed2ed3ede)fd4Z/ddddddddej	        d	ddd
dd5d-e+d6e.d7e0d8ed9e1d:e1d;e1d<e0d=e1d>e1d?e2d@e0dAe2dBe2de)fdCZ3	 	 dde)fdDZ4dEe5de)fdFZ6dGe(dHe(de)fdIZ7dJe5de)fdKZ8dJe5de)fdLZ9d-e+de)fdMZ:	 	 	 	 	 	 	 d d6ed8ed7e0dAe2dNe1d9e1dOe;de)fdPZ<	 	 	 	 dde)fdQZ=dpd-e+de)fdRZ>dde)fdSZ?dd+e(d6e.d3e.de)fdUZ@dde)fdVZAdWeBde)fdXZCdY ZDdZ ZEdd[ZF	 	 	 dd]d d^e2d_e2d6e2de;f
d`ZGddaZHdb ZIdc ZJeKdd             ZLeKde             ZMdf ZNddgZOeKdh             ZPeKdi             ZQdj ZRd]d dke2fdlZSdm ZTd]d dWeBdeBfdnZUeKdeVfdo            ZW	 	 	 	 	 	 	 	 	 	 	 	 dd]d dGe(dHe(dqe(dre(dse1dNe1d=edte0duedve;dwe2dxe2dye;dze0d{e0de2deXf$d|ZY	 	 	 	 	 	 	 	 	 	 	 dd]d d}e(d~e0dse1dNe1due1d=edte0dwe2dxe2dye;dze0d{e0de2deXfdZZ	 	 	 	 	 	 	 	 	 	 	 	 dd]d dGe(dHe(dqe(dse1dNe1d=edte0due1dve;dwe2dxe2dye;dze0d{e0de2deXf"dZ[	 	 	 	 	 	 	 	 	 	 dd]d dGe(dHe(dse1d=edte0dwe2dxe2dye;due1dze0d{e0deXfdZ\	 	 	 	 	 	 	 	 	 	 	 dd]d d-e]j^        e+e_f         dse1dNe1d=edue1dte0dwe2dxe2dye;dze0d{e0de2deXfdZ`	 	 	 	 	 	 	 	 	 	 	 	 dd]d dJe5dse1dNe1d=edte0due1dwe2dxe2dye;dve;dze0d{e0de2deXfdZa	 	 	 	 	 	 	 	 	 	 	 dd]d de_dse1dNe1d=edte0dwe2dxe2due1dye;dze0d{e0de2deXfdZb	 	 	 	 	 	 	 	 	 	 	 	 d	d]d d-e+dse1dNe1d=edte0dwe2dxe2due1dye;dze0d{e0de2deXfdZc	 	 	 	 	 	 	 	 	 	 	 	 	 d
d]d d}e(d+e(de0dse1dNe1d=ede;due1dte0dve;dwe2dxe2dye;dze0d{e0de2deXf$dZd	 	 	 	 	 	 	 	 	 	 	 dd]d dGe(dHe(de0dse1d=edte0dwe2dxe2dye;due1dze0d{e0de2deXfdZe	 	 	 	 	 	 	 	 	 	 	 dd]d dGe(dHe(de0dse1d=edte0dwe2dxe2dye;due1dze0d{e0de2deXfdZfddZgeKd             ZheKd             ZieKd             ZjddZkddZld ZmddZndde;de5fdZo	 	 dd]d de;de;de5fdZpdd]d de5fdZqd Zrd]d de5fdZsetdddd
d$dd]d deudevde+de;de;ddfdZwd Zx	 	 dde0de0de;de5fdZyddZzdpdZ{ddZ|de5fdZ}ddZ~	 dd]ed-e+de.fdZd Zd Zd Zd Zd Zdde+de2ddfdZd Zd Z	 	 ddZdddddd	d$d$d
d	defdZdddd$ddd$dddddddZdd]d dede;ddfdÄZdddddddddd	dddd$d	d	ddŜd]d d+e(d6e]j^        e.e5f         d7e0ded8e.dede2de2dse1dNe1d<e0de0de2dBe2due1dye;dze0d{e0de2f(d̄Zddddddddd	dddd	ddd$d	d	dd͜d]d d-e+de]j^        e.e5f         d8e.dede2de2d7e0dedse1dNe1de2dAe2dBe2de2de0d<e0due1dye;dze0d{e0de2de0f.dЄZeKdф             ZeKd҄             ZddӄZde]j^        e.e2f         de)fdՄZdք Zdׄ ZeKd؄             ZeKdل             Zdڄ Zdۄ Zd܄ Zddddݜd]d dke2fdބZeKd߄             ZeKdeVfd            Zd Zdd
dddde5fdZd Zd Zd Zd ZddZd Zd Zd Z	 	 	 	 	 	 dde2fdZeKd             ZeKd             Zd]d deddfdZddZd Z	 	 	 	 	 	 	 	 d	 	 	 ddZeKd             Z eKeNd          ZdZdS (  r   c                 ~   t          |t          j        t          j        f          sJ d|             || _        d| _        d | _        d| _        t                      | _	        || _
        |j        rEt          |t          j                  r|j        j        j        | _        d S |j        j        | _        d S d | _        d S )Nz	page is: Tr[   )r=   r   r   r   r   r   
last_point	draw_contr4   r6  r   r   r   rR  )r'   r   r   s      r(   r   zPage.__init__ %  s    $u} =>>RR@RD@R@RRRR	66? 	4// 5"o3:"o4DKKKr)   c                 *    |                                  S r+   )r   re  r   r   r   r  rR  r  s     r(   r   zPage.__repr__0%  s    ||~~r)   c                 X   t          | dd           }t          | j        j        t          j                  r| j        j        j        j        }n| j        j        j        }d| }|rE| j        j	        }| j        j
        d| j        j        fz  }|dk    rd| j        j        z  }|d| z  }|S )Nr   r  z<memory, doc# %i>r[   z<new PDF, doc# %i> of )r   r=   r   r   r   pdf_pager   rR  r   r   r   r  )r'   r   rR  rF   r$  s        r(   r   zPage.__str__:%  s    x..di*EN;; 	1Y)/6FFY)0Ff 	 A{!-'4;+@*BBBww(4;+@@:!::C
r)   c                    t           r(t          j        | j        t	          |                    }n|                                 }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_annotrB  pdf_annot_rectrg  r$  r%  r  r	  r
  r  r  rO  JM_add_annot_id)r'   r)  r   r   r  r  s         r(   r#  zPage._add_caret_annotK%  s     	(*DI7G7N7NOOEE>>##D*41FGGE 3$U++(//Lac13:+<acADj14>OPP(222"5)))E3'''r)   Nc                 $   |                                  }|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+          |                                ||||	d          }t          j        t          j        |          t3          d          |           t          j        t          j        |          t3          d          |           t          j        |           t          j        ||           t          j        ||           t9          |d           t;          |          S )Nr   r  r  r  )r%  r$  r&  r   r  r'  r   r&  rD  r'  fz_make_rectr$  r%  r  r	  r
  r  r  PDF_ANNOT_IS_PRINTrs  pdf_set_annot_icon_namer  r)  rM  r   r  r~  rO  r(  r   )r'   r)  r,  re   r  r  iconr   ufr  r  filebufr   r  r  r  s                   r(   _add_file_annotzPage._add_file_annotZ%  s   ~~#1YY&DDhU##$W--! 	-^,,,&tU-LMM ''qsACqtad):AC!$J<MNN ***(!%/// 	7)%666DHHJJ2q!DD5.u55x~~sKKK&u':5'A'A8JCWCWYabbbu%%% ***!%///s###U||r)   r  r   r   Fc                    d| }|                                  }|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        ||           nHt	          j        |t          d          |           |r#t	          j        |t          d          |           t	          j        ||           |dk     r|dz  }|dk     |dk    r|dz  }|dk    |dk    r#t	          j        |t          d          |           t	          j        ||           |dk    rt	          j        ||d |                    t	          j        ||           t	          j        ||           |	r'|	D ]$}t	          j        |t+          |                     %|
rwt	          j        |t          d          t          d	                     t	          j        ||           t1          |
          }t3          j        |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  r3  r  FreeTextCalloutr  ) r%  r   r:  r  r   r  r  r  r&  rC  r   r|  r~  r  r  rH  pdf_set_annot_quaddingrI  pdf_set_annot_border_widthr  pdf_add_annot_border_dash_itemrm  rM  pdf_set_annot_callout_styler6   r   JM_set_annot_callout_liner   r  rO  r(  r   )r'   r   r   r   r   r   rW  r  r  r]  calloutline_endrU  r  rX  richtextr\  r   r   r[  r\  ntcolr  r  r   r  r  point_countr  s                                r(   _add_freetext_annotzPage._add_freetext_annotu%  s   $ 	 
 ~~ 	N 	NLMMM 	&
 	&%J+J77t+J77tD!!$Q'' 	,5+A!+D+D 	,l+++&tU-FGG'..	  	P(5555*9Xd^^RHHH P.y$OOO ***qjjcMF qjjmmcMF mmQ;;"9hx.@.@&III$UE222199%eT&5&\:::(===#E7333 	F F F4UE!HHEEEE  	Py(4..(CT:U:UVVV-eX>>>g,,K+E5>>;OOO  	EUE48DDDu%%%s###Ell
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        |                                |          }t!          |          D ]}	||	         }
t          |
          }t          j        |                                d|z            }t!          |          D ]}|
|         }t          |          rt#          |          dk    rt          t                    t          j        t'          |          |          }t          j        ||j                   t          j        ||j                   t          j        ||           t          j        |t3          d          |           t          j        |           t7          |d           t9          |          S )Nr   r   r  r  )r   r   PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr   rq  r  rg  fz_invert_matrixr&  rE  r   r6   rJ  r)  rK  PySequence_Sizer#  r$  rL  r$  r%  r  rM  r  rO  r(  r   )r'   r   r   r  inv_ctmr   r  n0inklistr  sublistn1rf  r   r  r)  s                   r(   _add_ink_annotzPage._add_ink_annot%  s   DI&&%% 	53444n u|A<<<(--&tU-@AA'..	YY%dhhjj"55r 	2 	2A1gGWB(QV<<F2YY ; ;AJ'** =oa.@.@A.E.E$&;<<<01A!1D1DgNN)&%':::)&%':::: &11119hy&9&97CCCu%%%s###U||r)   c                 H   |                                  }t          j        |t          j                  }t	          |          }t	          |          }t          j        |||           t          j        |           t          |d           |j        sJ t          |          S r"  )
r%  r   r&  r=  r$  pdf_set_annot_linerO  r(  r   r   )r'   r  r	  r   r   r    r
  s          r(   _add_line_annotzPage._add_line_annot%  s    ~~&tU-ABBR  R   1---u%%%s###U||r)   c                    |                                  }t          |          dk     rt          t                    t	          j        ||          }|D ]M}t          |          dk    rt          t                    t          |          }t	          j        ||           Nt	          j	        |           t          |d           t          |          S )Nr   r  )r%  r6   r   MSG_BAD_ARG_POINTSr   r&  rC  r$  pdf_add_annot_vertexrO  r(  r   )r'   r  r  r   r   r  r)  s          r(   _add_multilinezPage._add_multiline%  s    ~~v;;??0111&tZ88 	5 	5A""a'' "4555$Q''E&ue4444u%%%s###U||r)   c                 2   |                                  }g d}d}	t          j        |t          j                  }
t	          |          }t          j        |          }t          j        |
|           |rt          |          \  }	}t          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   r2  r   DAr   r  )r%  r   r&  r   JM_quad_from_pyfz_rect_from_quadr  r:  rJ  r)  rK  rL  rM  r   r  r  r  r~  rH  rO  r(  ll_pdf_keep_annotr   r   r   )r'   r  r   da_strr  r   r   r   r\  r[  r   qr  rJ  r   s                  r(   _add_redact_annotzPage._add_redact_annot%  s   ~~}}&tU-CDDD!!#A&& *** 	P/55KE4%dhhjj%88C5\\ 8 8)#tAw7777u25998D>>3OOO 	UMMM'..!-d33  
 *5+>u+E+ExPT~~W]^^^"5#6u#=#=x}}eTTTu%%%s###'(899&&U||r)   c                    |                                  }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  rO  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!+D+D 	,l+++&tZ88 ***u%%%s###U||r)   c                    t          |          }t          |          }t          j        |          st          j        |          rt          t                    |                                 }g d}t          |          }d }d }|t          |          v r	||         }nt          |t                    r|                                }nt          |t                    r't          j        |                                          }nVt          |t"          t$          f          r|}n7t          |t&          j                  r|                                }n|d         }t          j        |t          j                  }	|rNt          j        |          }
t          j        |
          }|                                |                                }}t9          |j        |z  |j        |z            }||z  }||z  }|j        |j         z   dz  }|j!        |dz  z
  }|j"        |dz  z
  }||z   }||z   }t          j#        ||||          }t          j$        |	|           t          j%        |	|           t          j&        t          j'        |	          tQ          d          t          j)        d                     t          j*        |	d           nlt          j$        |	|           t          j&        t          j'        |	          tQ          d          tQ          |                     t          j*        |	|           t          j+        |	           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%  r6   rK  r=   r  r  r   rm  rn  
read_bytesr  r]  r8   r^  rv  r&  rF  r  fz_new_image_from_bufferr   r  r  r[  r  r  r  r$  r%  r*  r  pdf_set_annot_stamp_imagerM  r   r  r2  r|  rO  r(  r   )r'   r   stampr  r   stamp_idrD   r  r   r   fzbuffr  r   r  scaler[  r  r>  r	  r  r  r
  s                         r(   _add_stamp_annotzPage._add_stamp_annot)&  s   DzzD!!$Q'' 	+5+A!+D+D 	+\***~~    MME!HHE?DDv&& 		--//CCs## 	,u%%0022CCy122 	CCrz** 	..""CCA;D&tU-BCC 	69#>>F088C 5577CEEGGqA
Qa88EIEYF g'1,FEAI%BFQJ&BeBfB"2r2r22A$UA...+E3777u25998F;K;KUM_`lMmMmnnn(>>>>$UA...u25998F;K;KXVZ^^\\\(555u%%%s###U||r)   c                 ,   |                                  }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&  rG  r'  r*  r$  r%  r  r	  r
  r  r  r|  r,  rO  r(  r   )r'   r)  r   r-  r   r  r   r  s           r(   _add_text_annotzPage._add_text_annotm&  s    ~~e$$&tU-ABB ''qsACqtad):AC!$J<MNN ***$UD111 	7)%666u%%%s###U||r)   c                     t          |            | j        j        st          d          t	          | ||          }|sd S t          j        |           |_        || j        t          |          <   |S )Nr  )	re  r   r  r   Page__add_text_markerr  r  r6  r7  )r'   r/	  r  r  s       r(   _add_text_markerzPage._add_text_marker{&  sr    D{! 	*[)))#D%<< 	4]4((
$'C!
r)   c                    t          |            t          r0t          j        | j        _        t          j        | j        |          S t          | j                  }t          |          }|dk     rdS d}t          |t                    st          d          t          j        |                                t          d                    j        s5t          j        |                                t          d          |           t          j        |                                t          d                    }|j        sJ d|d|j                    t%          |          D ]}||         }t'          |          }|st)          d|           ,	 t          j        |                                t/          |                                |                    }t          j        |                                t          j        |          d	          }	t          j        ||	           # t6          $ r* t8          rt;                       t)          d
|z             Y w xY wdS )z&Add links from list of object sources.r   Nr0  zbad 'linklist' argumentr  zlcount=z annots.m_internal=z"skipping bad link / annot item %i.r   z#skipping bad link / annot item %i.
)re  r  r   Page_addAnnot_FromStringr  rp  r   r   r6   r=   r   r   r   r  r  r  r   r  rK  JM_StrAsCharrq   r  r)  r3  r  r   r  rf   r	  ru   )
r'   linklistr   lcountr   r  txtpyr   r   r0  s
             r(   rp  zPage._addAnnot_FromString&  s8   D 	H272PDN/149hGGGDI&&XA::F (E** 	97888!488::x/A/ABBM 	N$dhhjj(82D2DfMMM#TXXZZ(1C1CDD CC"CV"C"Cv/@"C"CCCCv 	D 	DAQKE&&D <a@@@D,dhhjj:Mtxxzz[_:`:`aa0$((**e>NPU>V>VXYZZ$fg6666 D D D'<N,<,<,<>BCCCCCD	D 	Ds   BH))1IIc                     |                                  }|                                }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   rY  r   s         r(   
_addWidgetzPage._addWidget&  sg    ~~hhjj dJ
CC 	8 6777s###U||r)   c                     |                                  }t          j                    }d|_        ||_        ||_        ||_        t          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&  s^    ~~%''	" '

D$??r)   c                     |                                   	 | j                            |            n# t          $ r t	                       Y nw xY wd | _        d| _        d | _        d | _        d S r  )_reset_annot_refsr   r  rf   ru   r   rR  r   r-   s    r(   r   zPage._erase&  s       	K$$T**** 	 	 	D	 			s   1 AAc                 8   t          |           }t          j        |                                t          j                  }t          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  r@  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)r'   r   r  r  rY  s        r(   _count_q_balancezPage._count_q_balance&  s     D!! HHJJ)
 
 !HHJJ(
 
 t{++ 5c3EEEr)   r  r  c                    ||dk    rd S | j         }|                    |d          }d|v sd|v st          d          i }|                                 D ]
\  }}|||<   ||                                v r||         S d}d|z  }||                                v r |dz  }d|z  }||                                v  |                     ||           |S )	Nr   Tr~  	/Type/OCGrl  zbad optional content: 'oc'zMC%ir   )r   r  r   _get_resource_propertiesr  r  _set_resource_property)	r'   r  r)  checkpropsr  r$  r   mcs	            r(   _get_optional_contentzPage._get_optional_content&  s   :q4kt44u$$(=(=9:::1133 	 	DAqE!HH9aZELLNN""FA!B ELLNN"" 	##B+++	r)   c                 p    |                                  }t          |                                          }|S )z/
        page list Resource/Properties
        )r%  JM_get_resource_propertiesr  )r'   r   r   s      r(   r  zPage._get_resource_properties&  s-     ~~'

33	r)   c                 h    	 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    	.ty$vNNH%h//ELr)   r0  c                 $   t          j                    }|                                 }|                                }|
}|}|}d}d}d}d}d}d}|dk    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}|rx|j        }|                                }|                                }t          j        |          }|} |                    | d           }!|!1|!}t          j        |                                |d          }d}d}d}n|                                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          j                    }%t4          rt          j        |%|           n*t          j        |%|j        j        |j        j                   |rVt          |          }t4          rt          j        |%|           n*t          j        |%|j        j        |j        j                   t          j         |%          }tC          |          } |                    | d           }!|!|!}t          j        |                                |d          }t          j        t          j        |t          d          t          d                              }t          j        t          j        |t          d          t          d                              }d}d}n@t          j"        |          }"|"                                }|"                                }|sd}|rt          j#        |"          }&|&j        st          d          |"$                                }'|"                                }(t          j%        |"          \  })}*t          j"        |          }$t          j&        |||'|(|)|*ddtO                      tO                      |&|$          }"|rCt          j(        ||"          }|	rtS          |||	           t          j*        |          }||| <   d}|rlt          j+        |,                                t          d                    }+|+j        s5t          j-        |,                                t          d          d	          }+t          j.        |+t          d
                    },|,j        s#t          j-        |+t          d
          d	          },t_          |||||          }-t          j0        |,||           t          j1        d          }.dte          |-j3        |-j4        |-j5        |-j6        |-j7        |-j8        f           d| d}/t          j9        |.|/           tu          ||,                                |.|           |r||fS |d fS )Nr   r   Widthr	  Heightr9  z#uncompressed image cannot have maskr4  r   XObjectr  
q
z cm
/z Do
Q
);r   rk  r%  r)  r  r  r  r  r   MSG_IS_NO_IMAGEr&  fz_read_filer   r   r  fz_md5_pixmap2r7   r  fz_new_image_from_pixmapFzImagefz_convert_pixmapr  FzDefaultColorspacesFzColorParamsr  FzMd5r   fz_md5_update_bufferfz_md5_updater   r}  r6   fz_md5_final2r  rl  fz_compressed_image_bufferbpcfz_image_resolution$fz_new_image_from_compressed_buffer2r   pdf_add_imager  r   r?  r  rQ  r  calc_image_matrixr  r  r   r    r
  r  r  r_  r  fz_append_stringJM_insert_contents)0r'   re   pixmapr   imaskr   overlayrX  keep_proportionr  r[  r  r  r  _imgnamedigestsmaskbufr   rY  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`  xobjectru  nresrp  s0                                                   r(   _insert_imagezPage._insert_image'  s   
 .""~~ hhjj	!88(dA66C %"5sHW<M<MxX[}}"]"]^^A %"5sHX<N<NPXY\P]P]"^"^__A1uzz /222 ! !MMM  *+F33$%!! *"/99F()% "	" kG		A		A)'22FF;;vt,,D,TXXZZ1EE$%! ! !==??a''!:7EMOOTTEE0#!.00!.00!6t<<!/11 B  !BH$(BM 9"emooNND!:7DIIE$%! ! 	& KMME Z*E6::::#E6+<+A6CTCXYYY `,U33 `.w????'w/A/FHZH^___(//F6]]F;;vt,,D,TXXZZ1EE$e&93@Q@QS[\_S`S`&a&abb$e&93@R@RT\]`TaTa&b&bcc ! !6v>>GGIIGGII &$%M 	 4e<<E# I "GHHH))++C))++J2599JD$1'::D>FFFF E  	%c511C / c2...',,H&GFOI 	?6txxzz8KCXCXYYI' Z!3DHHJJ@U@UWXYY	(HY4G4GHHG% U1)Xi=P=PRSTT#Aq$HHC3777&r**Dg	35#%suce"LMMggU]gggA"4+++sDHHJJg>>> 	"W$$T>!r)   c                 "   |                                  }|                                }t          |||||||||	|

  
        }t          j        |                                t          d                    }|                                s5t          j        |                                t          d          d          }t          j	        |t          d                    }|j
        sXt          j        |d          }t          j        |                                |t          d          t          d                     t          |d          \  }}|st          d          t          j        ||d          }t          j        |||           |S )Nr4  r   r0  r   zcannot insert font)r%  r)  rK  r   r?  r  r  ry  rQ  r  r   rR  r  r@  r   r  r  )r'   r   r  rL  rM  
set_simpler6  r
  r
  r  r  r   rY  r   r`  r4  r  r  font_objs                      r(   _insertFontzPage._insertFont'  s]   ~~hhjjsFHZSRWY^`hjrss2488::x?T?TUU	$$&& 	V/

H[<Q<QSTUUI"9hv.>.>?? 	\&sA..E

E8K3H3H(SYJZJZ[[[eQ''4 	6 4555)#tQ77E8X666r)   c                     |                                  }|dk    rt          ||          }nt          ||          }|j        rt	          |          S d S r   )r%  JM_get_annot_by_nameJM_get_annot_by_xrefr   r   )r'   r   r  r   r   s        r(   _load_annotzPage._load_annot'  s[    ~~199(t44EE(t44E 	 <<	  	 r)   c           	      T    t          || j        |||||          }t          |          S r+   )JM_pixmap_from_pager   r  )r'   r)  r  r  r  r  r   r  s           r(   _makePixmapzPage._makePixmap'  s)    !#ty#r5&$OOc{{r)   c                 j   t          j        t           j        j                  }t          | j        d          }|j        rOt          j        |                                |          }t          j        |          rt          j	        |          }t          j
        |          rd S t          |          S NFr,  )r   rg  rh  r   r   r   r   r  r  pdf_to_rectr  rf  )r'   boxtyper   r   r  s        r(   
_other_boxzPage._other_box'  s    |U\899DI666? 	.%txxzz7;;C!#&& .(--$d++ 	Ft$$$r)   Tc                 .    t          | j        |          S )Nr,  )r   r   )r'   r   s     r(   r%  zPage._pdf_page'  s    DI9999r)   c                 8    | j                                          dS )z,Invalidate / delete all annots of this page.N)r6  r{  r-   s    r(   r  zPage._reset_annot_refs'  s         r)   c                 h   |dk    r
|dk    r|d S t          t          t          |d          dz                      }|dk    rd}t          t          t          |d          dz                      }|dk    rd}d||fz  }|sd S t          | j                  }t          j        |                                t          d                    }|j	        s5t          j
        |                                t          d          d          }t          j        |t          d                    }	|	j	        s#t          j
        |t          d          d          }	t          j        |	          }
t          |
          D ]5}t          j        |	|          }t          j        |          }||k    r|c S 6t          j        |                                d	          }t          j        |t          d
          |           t          j        |t          d          |           t          j        |	||           |S )Nr   r   r  c   zfitzca%02i%02ir4  r   r8  r   r5  r6  )r3   r-  r  r   r   r   r  r  r  r   rQ  rz  rK  r|  rx  rR  r)  rS  r  )r'   gstater5  r6  r  tCAtcar   r`  rb  rD   r   r+  r   opas                  r(   _set_opacityzPage._set_opacity'  s   77rQww9#4F%Bc)**++#::C%B

S())**#::C!S#J. 	FDI&&&txxzz8K3H3HII	# 	V/

H[<Q<QSTUUI!)Xk-B-BCC 	P*9h{6K6KQOODt$$q 	 	A'a00B$R((Dv~~  Q//Xd^^R888Xd^^R888D&#...r)   c           
      n   | 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
        |d
t          t          |                     d           d S )Nr
  r  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   r   r   z not in MediaBoxrj  rk  )r   r   r  r#  ro  r
  r	  r  r  rl  r  r   r   )r'   r  r   r)  valid_boxesmbs         r(   _set_pageboxzPage._set_pagebox(  sS   k;>???z 	*[)))B+%%]+++Dzz]DGRUT!W_d1grutAwGG3333473333be333338[8[8[8[478[8[8[8[VXV[8[8[8[8[999:::G-J5;;1G1G-J-J-JKKKKKr)   c                 t    |                                  }t          |                                ||           d S r+   )r%  JM_set_resource_propertyr  )r'   r   r  r   s       r(   r  zPage._set_resource_property0(  s1    ~~ T488888r)   c	                    t          |          }	t          |          }
|}t          | 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k    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   r4  r  z q /z Do Q )r  r  r   r   r  r)  rX  JM_xobject_from_pager   r   rR  r  rM  r  r  r  pdf_new_xobjectr  r&  r?  r   rQ  r  r  )r'   
fz_srcpager  r  r  r  r   r  r  rf  ru  rc_xrefr  tpagerefr  xobj1subres1subresr  xobj2r`  r  s                         r(   _show_pdf_pagezPage._show_pdf_page4(  s@   !$''''TY''99;;    %VZx}MM 	.&u--G $VQ//GZ777#FA..68I#6#6@@@!"%%sN333%fgsFCHH66VU%?%F%FKKK 28Xk=R=RSS	# 	S/+9N9NPQRRI#Ix	/B/BCC  	P,Y8K8KQOOFFHe444
 "2&&tV,,,tX...tX...68T7;;;r)   r)  c                 ,   t          |           }	 |                     |          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          |          }t	          | |           t          |d          sJ |S )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_annotm(  s    '--	0))%00Eq  !!,/// q  !!,//// !u$&&&x(((((   A A r   c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z*Add a 'Circle' (ellipse, oval) annotation.r   )r  rZ  r   r<  r  r  r'   r   r  r   s       r(   add_circle_annotzPage.add_circle_annotz(      '--	0..tU5KLLEq  !!,/// q  !!,//// !$&&&    A A+r,  re   r  r  r-  c                     t          |           }	 |                     ||||||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z"Add a 'FileAttachment' annotation.)r  r  r-  r   )r  r0  r  r  )	r'   r)  r,  re   r  r  r-  r  r   s	            r(   add_file_annotzPage.add_file_annot(  s     (--
	0((' )  E q  !!,/// q  !!,//// !$&&&s   A A&r   r   r   rW  r  r  r]  r9  r:  rU  r  rX  r;  r\  r   r   r   r   rW  r  r  r]  r9  r:  rU  r  rX  c                
   t          |           }	 |                     |||||||||	|
||||||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'FreeText' annotation.r  r   )r  r>  r  r  )r'   r   r   r   r   r   rW  r  r  r]  r9  r:  rU  r  rX  r;  r\  r  r   s                      r(   add_freetext_annotzPage.add_freetext_annot(  s    , (--	0,,%%))!-!-!#%#!%! -  E& q  !!,/// q  !!,//// !$&&&s   %A A0c                     |t          | |||          }nt          |          }|                     |t          j                  }|S )zAdd a 'Highlight' annotation.Nr  r  r   )get_highlight_selectionCheckMarkerArgrw  r   PDF_ANNOT_HIGHLIGHT)r'   r/	  r  r  r   rW  rF   s          r(   add_highlight_annotzPage.add_highlight_annot(  sK     ='E4PPPAAu%%A##Au'@AA
r)   handwritingc                     t          |           }	 |                     |          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )r  rI  r  r  )r'   r!  r  r   s       r(   add_ink_annotzPage.add_ink_annot(  s    
 (--	0''44Eq  !!,/// q  !!,//// !$&&&r  r  r	  c                     t          |           }	 |                     ||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'Line' annotation.r   )r  rL  r  r  )r'   r  r	  r  r   s        r(   add_line_annotzPage.add_line_annot(  s    '--	0((R00Eq  !!,/// q  !!,//// !$&&&   A A!r  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'Polygon' annotation.r   )r  rP  r   r?  r  r  r'   r  r  r   s       r(   add_polygon_annotzPage.add_polygon_annot(  s    '--	0''0GHHEq  !!,/// q  !!,//// !$&&&r  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'PolyLine' annotation.r   )r  rP  r   r>  r  r  r(  s       r(   add_polyline_annotzPage.add_polyline_annot(  s    '--	0''0IJJEq  !!,/// q  !!,//// !$&&&r  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z&Add a 'Square' (rectangle) annotation.r   )r  rZ  r   r;  r  r  r  s       r(   add_rect_annotzPage.add_rect_annot)  r  r  r   r  c	                 d   d}	|rt          t          j                                      |          st	          |           t	          |           |sd}|sd}|sd}t          |d          r|||f}t          |          dk    r
|dd         }d}
 |
j        |||d}	|d	}|r2t          |d          r|||f}t          |          dk    r
|dd         }nd}t          |           }	 | 	                    |||	||
          }|dk    r| 
                    |           n!# |dk    r| 
                    |           w w xY wt          | |           |r|                                                                dd         }|\  }}}}}|                    |           |                    |           |                    |           |                    |           |                    |           |                    d           d                    |          }|                    |d           |S )zAdd a 'Redact' annotation.Nr  r  r  rh  r   r  r  r   r   r   )r   rV  r  r   r   r0  r  r  )r  r	  
whitespacerT	  rn  r:   r6   r  r  rX  r  r  r!  r  rj   r  r/  )r'   r  r   r   r   r  r   r   r  rV  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;// B(*jA
:""'^
5CSZx8DDDF|  $4-- . $-Dt99q==8DD'--	0**4d6" + / /E q  !!,/// q  !!,//// !$&&&  
	 \\^^..00"5F &Ar2r2MM"MM"MM"MM"MM"MM$F##BLLQs   (D D<c                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'Squiggly' annotation.Nr  )r  r  rw  r   PDF_ANNOT_SQUIGGLYr'   r/	  r  r  r   rW  s         r(   add_squiggly_annotzPage.add_squiggly_annotP)  sG     ='E4PPPAAu%%A$$Q(@AAAr)   c                     t          |           }	 |                     ||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z$Add a ('rubber') 'Stamp' annotation.r   )r  rr  r  r  )r'   r   rn  r  r   s        r(   add_stamp_annotzPage.add_stamp_annot^)  s    '--	0))$66Eq  !!,/// q  !!,//// !$&&&r&  c                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'StrikeOut' annotation.Nr  )r  r  rw  r   PDF_ANNOT_STRIKE_OUTr4  s         r(   add_strikeout_annotzPage.add_strikeout_annoti)  sE    ='E4PPPAAu%%A$$Q(BCCCr)   Notec                     t          |           }	 |                     |||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z&Add a 'Text' (sticky note) annotation.)r-  r   )r  rt  r  r  )r'   r)  r   r-  r  r   s         r(   add_text_annotzPage.add_text_annotq)  s    '--	0((4(@@Eq  !!,/// q  !!,//// !$&&&s   A A#c                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'Underline' annotation.Nr  )r  r  rw  r   PDF_ANNOT_UNDERLINEr4  s         r(   add_underline_annotzPage.add_underline_annot|)  sE    ='E4PPPAAu%%A$$Q(ABBBr)   r:  c                    t          |            | j        }|j        st          d          |                                 |                     |j        |j                  }|sdS d|_        t          j
        |           |_        || j        t          |          <   |j        |_        ||_        |                                 |S )zAdd a 'Widget' (form field).r  NT)re  r   r  r   r  r  r  r  r   r  r  r6  r7  r  r  )r'   r:  r)  r   s       r(   
add_widgetzPage.add_widget)  s    Dkz 	*[))) 163DEE 	4}T**&+E#r)   c                 ~    	 t          |            |                     d          }|j        sg S t          |          S )z.
        page get list of annot names
        Fr,  )re  r%  r   JM_get_annot_id_listr'   r   s     r(   annot_nameszPage.annot_names)  sE     	>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              #   B  K   t           j        t           j        t           j        ft	          d          s!fd|                                 D             }n!fd|                                 D             }|D ]"}|                     |          }d|_        |V  #dS )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_  c                 4    g | ]}|d          v|d         S r  r,   )r   r    
skip_typess     r(   r   zPage.annots.<locals>.<listcomp>)  s+    VVVAqt:?U?U1Q4?U?U?Ur)   c                 H    g | ]}|d          v |d          v|d         S r  r,   )r   r    rK  typess     r(   r   zPage.annots.<locals>.<listcomp>)  s;    hhhAqtu}}QRSTQU]gQgQg1Q4QgQgQgr)   TN)r   r  PDF_ANNOT_POPUPr2  r:   r  
load_annot_yielded)r'   rM  r  r  r   rK  s    `   @r(   r  zPage.annots)  s       *E,A5CYZ
um,, 	iVVVV)9)9););VVVKKhhhhh)9)9););hhhK 	 	DOOD))EENKKKK	 	r)   r   r   r!	  r  c           	         d }t          |            | j        }|j        s|j        rt	          d          |j        st	          d          g }|                     t          j        f          D ])}|	                    |
                                           *|g k    rdS |                     |||          }|st	          d          |                                 }	|D ]}
|
d         }|
d         }|r,|	                    |           |	                    ||	           d
|
                                v r~|
d
         }|
                    dd          }|
d         }|
d         }|
d         } |||||          }d}|dk     r2|dk    r,|	                    ||||||          }|dz  }|dk     r|dk    ,|	                                 dS )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                 p   |r| j         t          k    r| S 	 t          |||          }n3# t          t          j        f$ r t          rt                       | cY S w xY w|dz  }| j         }t          j	        ||z            |z  }|| j
        k    r| S | }| j        j        | j        j        z   |z
  dz  }	|	|_        |S )a  Calculate minimal sub-rectangle for the overlay text.

            Notes:
                Because 'insert_textbox' supports no vertical text centering,
                we calculate an approximate number of lines here and return a
                sub-rect with smaller height, which should still be sufficient.
            Args:
                annot_rect: the annotation rectangle
                new_text: the text to insert.
                font: the fontname. Must be one of the CJK or Base-14 set, else
                    the rectangle is returned unchanged.
                fsize: the fontsize
            Returns:
                A rectangle to use instead of the annot rectangle.
            333333?      ?)r[  rV  get_text_lengthr   r   FzErrorBaser	  ru   r  ceilr  r  r%  blr  )

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

 12 " " "' %"$$$!!!!"  #+K$E	*u,--;AJ%%%!!A:=?2Q6#=AADHs   ( -AAr+  r  )rM  FzError applying redactions.r   r   )r   r  r   r  r   r   r   r   r0  rI  )r   r   r  r  rT  T)re  r   r  r   r   r  r  r   r   rj   r  r  	new_shape	draw_rectfinishr  r7   insert_textboxcommit)r   r!	  r  r   r]  r)  redact_annotsr   r   shaperedactrY  r   rZ  r  r  r  r  trects                      r(   r(	  zPage.apply_redactions)  s0   0 	  	  	D 	Dk 	=s} 	=;<<<z 	*[)))[[)+ ! 
 
 	= 	=E   !9!9!;!;<<<<B5##D&(;; 	;9:::   # 	! 	!FJ&>D 4
+++$d333&&!&>

7A..z*z*|,#J%GG1ff!-- !&!&## .  B SLE 1ff! 	tr)   c                     |dvrt          d          t          | j                  }t          j                    }||_        t          j        |          }t          j        || j        |           dS )zbConvert colorspaces of objects on the page.
        
        Valid values are 1, 3 and 4.
        ri  z!components must be one of 1, 3, 4N)	r   r   r   r   pdf_recolor_optionsnum_compPdfRecolorOptionspdf_recolor_pagerR  )r'   r  pdfdocroptroptss        r(   r  zPage.recolor(*  so    
 Y&&@AAA!$+..(**"'--vt{E:::::r)   c                     t          |          }|j        s|| j        z  j        rt	          d          || j        z  }t          |           }t          |          }t          j	        ||           dS )z-Clip away page content outside the rectangle.z"rect must not be infinite or emptyN)
r#  r  r   r  r   rj  r   r  r   pdf_clip_page)r'   r   r   r  pclips        r(   clip_to_rectzPage.clip_to_rect5*  sz    Dzz 	Cty 0: 	CABBB**t$$%%GU+++++r)   c                 V    | j         dS t          sdS t          |           }|| _         dS )z!Try to access layout information.N)layout_informationr   )r'   layout_infos     r(   
get_layoutzPage.get_layout?*  s:     ".F 	F!$''"-r)   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )z
The ArtBoxr  Nr   r   r   r   r  rf  ro  r#  r
  r'   r   r  s      r(   artboxzPage.artboxM*  sY     x((<<]DGRUT!W_d1grutAwGGGr)   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )zThe BleedBoxr  Nr   r   r   r   rx  ry  s      r(   bleedboxzPage.bleedboxV*  sY     z**<<]DGRUT!W_d1grutAwG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                              d                                          d         }t!          |           |S )zGet page rectangle.r      r   F)r&	  r0  )re  r   r   r   r  r#  r  r   r  rf  r[  r  rN  r
  mupdf_warningsr  rq   )r'   r   r  cbr   r  r   s          r(   boundz
Page.bound_*  s    D49%%!$''3ii? 	t{1 	B8RYqA}H,,!1q!Q""C&&U&33>>@@DCCLLL
r)   c                     |s| j         s|                                  t          | j        d          }|j        sd S t          d|          }t          j        |                                ||           d S )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_contentsq*  s}     	! 	!   TY777 	F(XFFF&

D'BBBBBr)   c                     t          |            |                     d          }|j        st          j        | j                  }n!t          |                                          }t          |          }|S )zThe CropBox.Fr,  )	re  r%  r   r   r  r   re  r  r#  )r'   r   r  s      r(   rf  zPage.cropboxz*  sh     	D~~u~-- 	)%di00CCTXXZZ((C3ii
r)   c                     | j         j        S r+   )rf  r  r-   s    r(   cropbox_positionzPage.cropbox_position*  s    |r)   c                    t          |            t          |           |                                 }	 t          |j                  }|snt	          j        ||j                   2t	          j        |j                  }t	          j        ||j                   t          |          }|r<d|_        t          j
        |           |_        ||j        j        t          |          <   |                                 |S )z!Delete annot and return next one.r   T)re  r%  r  r   r   r  r3  r   r   r  r  r   r6  r7  r   )r'   r   r   r  	nextannotr  s         r(   delete_annotzPage.delete_annot*  s    DE~~	9)%*55I "4888	9 (44	tUZ000I 	2CK t,,CJ.1CJ"2c77+
r)   r  c                     t          t          dd          }|                                 |                     ||           dS )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*  sD     V\1--4,,,,,r)   c                 r    t                      t          t                    sdS  fd}t           j        d          }|j        s
 |            S t                   }|dk     r
 |            S t          j        |	                                t          d                    }|j        s
 |            S t          j        |          }|dk    r
 |            S d}t          |          D ]1}t          j        t          j        ||                    }||k    r n2||k    r
 |            S t          j        ||           t          j        |                                |           t          j        |	                                t          d          |           t'          |            |            S )zDelete a Link.Nc                      d         dk    rd S 	 d         } j         |          }|                                 d S # t          $ r t          dk    rt	                       Y d S w xY w)Nr  r   r7  r   )r6  r   rf   r	  ru   )linkidlinkobjlinkdictr'   s     r(   finishedz"Page.delete_link.<locals>.finished*  s    1$$ff!$*62        '!++0@0@0@s   )< #A#"A#Fr,  r   r  r   )re  r=   r4   r   r   r   r  r   r  r  r  r  rK  r   r  r  r?  r)  rM  r
  )	r'   r  r  r   r  r  r  oxrefr   s	   ``       r(   r'	  zPage.delete_link*  s   D8T** 	F		 		 		 		 		 		 DI666 	8::%!888::#TXXZZ(1C1CDD  	8::"F++1998:: 	 	A$e&961&E&EFFEu}}  5==8::***T222DHHJJ(:(:FCCC$xzzr)   c                    t          |            t          |dd          }|t          d          |j        }|                     |           d|j        _        t          |j        	                                          }|D ]
}|j        |= |S )z0Delete widget from page and return the next one.r  Nzbad type: widget)
re  r   r   r;  r  r  r   r   rG
  r  )r   r:  r   
nextwidgetkeylistr  s         r(   delete_widgetzPage.delete_widget*  s    D$//=/000[
%   #v++--.. 	% 	%C$$r)   c                 .   t           r&t          t          j        | j                            S |                     d          }|j        s0t          t          j        t          j        j	                            S t          t          |                    S )zReflects page de-rotation.Fr,  )r  rt  r   Page_derotate_matrixr   r%  r   r   rg  UNITr   )r'   r  s     r(   rk  zPage.derotation_matrix*  sz      	B%4di@@AAA..%.00! 	;%,u|'899:::-g66777r)   r-  p3p4r  r[  r  	closePathlineCaplineJoinr  stroke_opacityfill_opacityc                 0   |                                  }|                    t          |          t          |          t          |          t          |                    }|                    |||||||	|
|||           |                    |           |S )zODraw a general cubic Bezier curve from p1 to p4 using control points p2 and p3.r  r   r]  r[  r  r  r  r  r  r  r  )r^  draw_bezierr  r`  rb  )r   r  r	  r  r  r  r   r]  r[  r  r  r  r  r  r  r  r  r  r   s                      r(   r  zPage.draw_bezier*  s    ( nnOOE"IIuRyy%))U2YYGG

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

7r)   r>  radiusc                     |                                  }|                    t          |          |          }|                    ||||||	||||
  
         |                    |
           |S )*Draw a circle given its center and radius.
r  r   r]  r[  r  r  r  r  r  r  )r^  draw_circler  r`  rb  )r   r>  r  r  r   r  r]  r[  r  r  r  r  r  r  r  r   s                   r(   r  zPage.draw_circle+  s~    " nnOOE&MM622

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

7r)   c                    |                                  }|                    t          |          t          |          t          |                    }|                    |||||
|||	|||           |                    |           |S )zdDraw a special Bezier curve from p1 to p3, generating control points on lines p1 to p2 and p2 to p3.r  )r^  
draw_curver  r`  rb  )r   r  r	  r  r  r   r]  r[  r  r  r  r  r  r  r  r  r  r   s                     r(   r  zPage.draw_curve<+  s    & nnNN599eBiir;;

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

7r)   c                     |                                  }|                    t          |          t          |                    }|                    |||d|||	|
||
  
         |                    |           |S )z&Draw a line from point p1 to point p2.F
r  r]  r[  r  r  r  r  r  r  r  )r^  	draw_liner  r`  rb  )r   r  r	  r  r]  r[  r  r  r  r  r  r  r  r  r  s                  r(   r  zPage.draw_lineb+  s      nnMM%))U2YY//

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

7r)   c                     |                                  }|                    |          }|                    ||||||||
||
  
         |                    |	           |S )z4Draw an oval given its containing rectangle or quad.r  )r^  	draw_ovalr`  rb  )r   r   r  r   r]  r  r[  r  r  r  r  r  r  r  r   s                  r(   r  zPage.draw_oval+  sv      nnMM$

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

7r)   c                     |                                  }|                    |          }|                    ||||||||
|||           |                    |	           |S )z&Draw multiple connected line segments.r  )r^  draw_polyliner`  rb  )r   r  r  r   r]  r[  r  r  r  r  r  r  r  r  r  r   s                   r(   r  zPage.draw_polyline+  s{    " nnf%%

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

7r)   r  c                     |                                  }|                    t          |                    }|                    ||||||||
||
  
         |                    |	           |S )zDraw a quadrilateral.r  )r^  	draw_quadQuadr`  rb  )r   r  r  r   r]  r[  r  r  r  r  r  r  r  r  r   s                  r(   r  zPage.draw_quad+  s|      nnMM$t**%%

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

7r)   c                     |                                  }|                    t          |          |          }|                    ||||||||
||
  
         |                    |	           |S )zG
        Draw a rectangle. See Shape class method for details.
        r  r  )r^  r_  r#  r`  rb  )r   r   r  r   r]  r[  r  r  r  r  r  r  r  r  r  r   s                   r(   r_  zPage.draw_rect+  s    & nnMM$t**VM44

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

7r)   beta
fullSectorc                     |                                  }|                    t          |          t          |          ||          }|                    ||||	||||
|||           |                    |           |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
        r  r  )r^  draw_sectorr  r`  rb  )r   r>  r)  r  r  r   r]  r  r  r[  r  r  r  r  r  r  r  r  r   s                      r(   r  zPage.draw_sector,  s    6 nnOOE&MM5<<*OUU

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

7r)   breadthc                     |                                  }|                    t          |          t          |          |          }|                    |||d|||
|||
  
         |                    |	           |S )z/Draw a squiggly line from point p1 to point p2.r  Fr  )r^  draw_squiggler  r`  rb  r   r  r	  r  r  r]  r[  r  r  r  r  r  r  r  r  r  s                   r(   r  zPage.draw_squiggle?,  s    " nneBiirGDD

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

7r)   c                     |                                  }|                    t          |          t          |          |          }|                    |||d|||
|||
  
         |                    |	           |S )z-Draw a zigzag line from point p1 to point p2.r  Fr  )r^  draw_zigzagr  r`  rb  r  s                   r(   r  zPage.draw_zigzagb,  s    " nnOOE"IIuRyy'OBB

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

7r)   c                 N   | j         }|j         }t          |t          j                  sJ t          j                    }||_        t          |          }t          j        ||          }t          j        |||t          j	                               t          j
        |           d S 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_textpage,  s    yZ2u011111&((''nR))4c5>+;+;<<<s#####r)   c                 (   t          |            |                     d          }|j        sdS t          j        |          }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   |S )zFirst annotation.Fr,  NT)re  r%  r   r   pdf_first_annotr   r   r  r  r   r6  r7  )r'   r   r   r  s       r(   first_annotzPage.first_annot,  s     	D~~u~-- 	F%d++ 	FEll]4((
$'C!
r)   c                 *    |                                  S )z$
        First link on page
        )
load_linksr-   s    r(   
first_linkzPage.first_link,  s    
    r)   c                    t          |            d}|                     d          }|j        sdS t          j        |          }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   t                      }t                              ||           |}|S )zFirst widget/field.r   Fr,  NT)re  r%  r   r   pdf_first_widgetr   r   r  r  r   r6  r7  r8  r
  r9  )r'   r   r   r  r:  s        r(   first_widgetzPage.first_widget,  s     	D~~u~-- 	F&t,, 	FEll]4((
$'C!3'''
r)   c                 v   t          |            | j        }|dk    r|                     d           | j        }g }|rdnd}t	          ||          }t          j        ||t          j                    t          j                               t          j	        |           |dk    r|                     |           |S )Nr   TF)
re  rN  r  r   JM_new_bbox_devicer   r  rq  r  r  )r'   layersr  r   r   
inc_layersr  s          r(   get_bboxlogzPage.get_bboxlog,  s    D}1a   y#.TT
 "j114en&6&68H8HIIIs###1l+++	r)   c                    t          |            | j        }|dk    r|                     d           | j        }t	          |t
          j                  rt          j        |          }t	          |t
          j                  sJ d| j                    |rdnd}t          j        |          }	 t          j        ||||          }|dk    r|                     |           t          |          s|dS |S )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFr   N)re  rN  r  r   r=   r   r   r   r  r  r   get_cdrawingsr   callableJM_new_lineart_device_Devicerq  r
  ptmr  r  r  )
r'   extendedcallbackmethodr  r   clipsprectr   r  s
             r(   r  zPage.get_cdrawings,  s   D}1a   ydEM** 	&<%%D$-->>$)>>> +e#D))
	'$T8XvFFB 1l+++H 	!3F	r)   c                    t          |            g }t          | j                  }|                                }t	          j        |t          j                  }t	          j        |          ret	          j        |          }t          |          D ]@}t	          j
        ||          }t	          j        |          }|                    |           An0|j        r)t	          j        |          }|                    |           |S )zGet xrefs of /Contents objects.)re  r   r   r  r   r  r  r  r  rK  r  r   rj   r   )	r'   rF   r   r  rp  rD   r   icontr  s	            r(   r)	  zPage.get_contents,  s    DDI&&hhjj%c5+GHHh'' 	#H--A1XX ! !+Ha88'..

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

        Include (default) or exclude annotations.
        )re  r   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsr  )r'   r  r  s      r(   get_displaylistzPage.get_displaylist,  sM     	D 	I4TY??BB=diHHB2r)   r  c                    d}|                      |          }t          t          |                    D ]<}||         }|d                             d          st	          |d                   |d<   nt	          |d                   |d<   |d         dk    r|d         }g }|D ]}|d	         }	|d
d         }
|	dk    r1dt	          |
d	                                                   |
d
         f}n;|	dk    rdt          |
d	                   f}nt          |	gd |
D             z             }|                    |           ||d<   |d         dv r|D ]}|	                    |          ||<   |||<   >|S )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  r[  r  r  r]  r  r  even_odd)r  r   r   r   scissorr  rA   r   r   Nr  quc                 ,    g | ]}t          |          S r,   r  r   s     r(   r   z%Page.get_drawings.<locals>.<listcomp>/-  s    -E-E-E1eAhh-E-E-Er)   r  )r  rK  r6   r2   r#  	normalizer  r   rj   r7   object)r'   r  allkeysr  r   npathrA   newitemsrB   cmdrestr  DrawpathDrawpathlistget_linearts                  r(   get_drawingszPage.get_drawings	-  s      ( 33s3xx 	 	AFE=++F33 : $U6] 3 3f#'i(8#9#9i V}g%%g! 	* 	*Dq'C8Dt $d47mm&=&=&?&?aI $d47mm4$cU-E-E-E-E-E%EFFOOD))))!)gV}
**  , ,A$yy||E!HHCFF
r)   hashesrA  c                    | j         }|r	|j        rd}|j        sd}t          | dd          }|r|s|S |s;|                     t                    }|                    |          }~|r|| _        |r|j        s|S |                                 }i }|D ]%}|d         }	t          ||	          }
|	||
j	        <   ~
&t          t          |                    D ]0}||         }|                    |d         d          }	|	|d	<   |||<   1|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  r  r   r  r  )r   r  r   r	  TEXT_PRESERVE_IMAGESextractIMGINFOr  
get_imagesr  r  rK  r6   r7   )r   r  rA  r)  imginfor  imglistr  rB   r  r  r   s               r(   get_image_infozPage.get_image_info-  sU    k 	SZ 	Fz 	E$t44 	5 	N 	+"")=">>B''v'66G +#*  	CJ 	N//## 	 	D7Dd##C"&GCJs7||$$ 	 	A1:D;;tH~q11DDLGAJJr)   c                    t                    t          t          fv r	d         }n~t                    t          u r}nefd|                                 D             }|g k    rt          d          t          |          dk    rt          d          |d         d         }t          | j        |          }|j	        ~| 
                    d          }|sfd|D             }nfd	|D             }|S )
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   c                 ,    g | ]}|d          k    |S r  r,   r   r   r   s     r(   r   z(Page.get_image_rects.<locals>.<listcomp> .  s"    DDDQqtt||q|||r)   bad image namer   zmultiple image names foundTr  c                 R    g | ]#}|d          k    t          |d                   $S )r  r.  r#  r   imr  s     r(   r   z(Page.get_image_rects.<locals>.<listcomp>.  s3    QQQ2"X,&:P:Pd2f:&&:P:P:Pr)   c                 |    g | ]8}|d          k    t          |d                   t          |d                   f9S )r  r.  r  )r#  rt  r  s     r(   r   z(Page.get_image_rects.<locals>.<listcomp>.  sO       h<6)) bj!!6"[/#:#:;)))r)   )r   r   r   r3   r   r   r6   r  r   r  r  )	r   r   r  r  r  r  infosbboxesr  s	    `      @r(   get_image_rectszPage.get_image_rects-  s)    ::$&&7DD$ZZ3DDDDDD$//"3"3DDDG"}} !1222W"" !=>>>1:a=DT[$''##4#00 	QQQQQQQFF     F
 r)   c                     | j                                         }|sdS |                                 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  r  rR  )r   r  s     r(   	get_labelzPage.get_label.  sF     --// 	2"4;777r)   c                    t          |            | j        }g }|r8t          j        || j                  }|                    |           |j        }|8|g k    r| j        j        rd t          |           D             }t          |          t          |          k    rMt          t          |                    D ]0}||         d         ||         d<   ||         d         ||         d<   1|S )z~Create a list of all links contained in a PDF page.

        Notes:
            see PyMuPDF ducmentation for details.
        c                 >    g | ]}|d          t           j        k    |S r.  r  r  s     r(   r   z"Page.get_links.<locals>.<listcomp>3.  s7       q tu333  433r)   r   r  r   r7  )re  r  r  r  r   rj   r;  r  rH  r6   rK  )r   lnry  nl	linkxrefsr   s         r(   ro  zPage.get_links$.  s     	D_ 	"2t{33BLLB  	 B;;4;-; +D11  I
 9~~U++s9~~.. 5 5A'0|AE!HV$%.q\!_E!HTNNr)   r  r  r  r   r  r  r  c                   |t           }|r|dz  }t          ||          }t          |          t          u rG|                                dk    rt
          }n'|                                dk    rt          }nt           }|j        dvrt          d          | 	                    |          }|
                    ||||          }	d}|r|	                    ||           |	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  ri  zunsupported colorspace)r  )r  r  r  r   )r  rt  r   r   rD	  r  r  rD   r   r  r  r  )
r   r  r  r  r   r  r  rZ  r  r  s
             r(   r  zPage.get_pixmap>.  s    ( J 	(8DD$''F
s""!!V++#

!!##v--#

"
<y((5666!!!00mm6jTXmYY 	"KKS!!!
r)   c           	      h   | j         }|dk    rt          S | j        }|dk    r2t          dddd|j        |j        z
  |j        z
  |j        z
  d          }n\|dk    r2t          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   }|                    d          }t                              | |d          }|d	v r8|\  }}}	}
||_        ||_        |
|_        |	|_        |                     |           |                     d           | }|                                 D ]!}|j        |z  }|                    |           "|                                 D ]M}|d
         |z  }|                     |           ||d
<   	 |                     |           ># t,          $ r Y Jw xY w|                                 D ]'}|j        |z  }||_        |                                 (|S )z;Set page rotation to 0 while maintaining visual appearance.r   r  r     r  z cm r	  Fr  r  rV  )rN  r  ro  rt  r
  r  r	  r  rk  r   r   r  r
  _insert_contentsset_mediaboxr  r  r   r  ro  r'	  insert_linkrf   r  r  )r'   rQ  r  mat0ru  r  r  r	  r  r  r
  r   r  r  r:  s                  r(   remove_rotationzPage.remove_rotationi.  s^   m!88 ]"99!Q1bebembe&;be&CQGGDDCZZ!Q1a)>)FGGDD!Q1b25j"ru*==D T++c

##f,jj  ""4e44 )NBBBEBEBEBEb!!!!d[[]] 	 	E
S ANN1NN$$ 	 	DVs"AT"""DL  &&&&   llnn 	 	Fc!AFKMMOOOO
s   G&&
G32G3r   x_tolerancey_tolerancefinal_filterc                    t          |            | j        |t          |          ||||                                 }fd}fd|D             }t	          d |D             d           }g }	|r|d         
 }
d}|r_d	}t          t          |          d
z
  dd          D ]9} |||         |
          r%|
||         j        z  }
|
||         j        z  }
||= d}:|_|		                    |
           |d= t	          t          |          d           }|t	          t          |	          d           }	|s|	S fd|	D             S )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.
        Nc                    | j         | j        k    r| j        | j         fn| j         | j        f\  }}| j        | j        k    r| j        | j        fn| j        | j        f\  }}|j         |j        k    r|j        |j         fn|j         |j        f\  }}|j        |j        k    r|j        |j        fn|j        |j        f\  }}		 	 ||
z
  k     s||
z   k    s||z
  k     s	||	z   k    rdS dS )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.
            r   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     02uru}}beRU^^25"%.NFF/1uru}}beRU^^25"%.NFF/1uru}}beRU^^25"%.NFF/1uru}}beRU^^25"%.NFFFW,,,FW,,,FW,,,FW,,, u tr)   c                     g | ]^}	 	 |d         j         j         k    rD|d         j        j        k    r.|d         j        j        k    r|d         j        j        k    \|_S )r   r   r	  r  r  r
  )r   r  pareas     r(   r   z)Page.cluster_drawings.<locals>.<listcomp>.  s{     
 
 

 &	((&	((&	((&	((  )((r)   c                     g | ]
}|d          S r  r,   rz  s     r(   r   z)Page.cluster_drawings.<locals>.<listcomp>.  s    222q6222r)   c                     | j         | j        fS r+   r
  r	  r  s    r(   rr	  z'Page.cluster_drawings.<locals>.<lambda>.  s    14, r)   r	  r   TFr   r0  c                     | j         | j        fS r+   r9  r:  s    r(   rr	  z'Page.cluster_drawings.<locals>.<lambda>.  s    ad| r)   c                     | j         | j        fS r+   r9  r:  s    r(   rr	  z'Page.cluster_drawings.<locals>.<lambda>.  s    !$ r)   c                 @    g | ]}|j         k    |j        k    |S r,   rY  )r   r  r1  r2  s     r(   r   z)Page.cluster_drawings.<locals>.<listcomp> /  s1    QQQa'(9(9ah>P>P>P>P>Pr)   )re  r   r#  r  r
  rK  r6   r  r  rj   r  )r'   r   drawingsr!  r"  r#  r3  pathsprects	new_rectsr  repeatr   r1  r2  r6  s                @@@r(   cluster_drawingszPage.cluster_drawings.  s   0 	D	JJE((**H	 	 	 	 	 	6
 
 
 

 
 
 22E2228N8NOOO	
  	E
AF &s6{{Q266 & &A$}VAY22 &VAY\)VAY\)"1I!%  & Qq	CKK-C-CDDDF  	E  3y>>/E/EFFF	 	QQQQQ9QQQQr)   c                 b    t          |            | j                            | j        |          S )z)List of fonts defined in the page object.r	  )re  r   r  rR  r'   rz  s     r(   	get_fontszPage.get_fonts/  s-    D{))$+D)AAAr)   c           	         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          }njfd|                    | j        d          D             }t          |          dk    r	|d         }n'|g k    rt	          d          t	          d	z            |d         }	|	dk    s|r>	 |                     ||
          d         S # t          $ r t!                       |cY S w xY w|                                 }
t%          |
          }t'          |          s|S |D ]}|d         |d         k    rt)          |d                   }|j        }|dk    r|} nt          t-          |j        |j                            }t3          |j        |j        z
            }t3          |j        |j        z
            }t          d|z  ddd|z  dd          }||z   }||f} |}|S )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   r0  z!need item of full page image listc                 ,    g | ]}|d          k    |S r  r,   r  s     r(   r   z'Page.get_image_bbox.<locals>.<listcomp>/  s%    YYYQDTUVWTXLLqLLLr)   Tr   r  z!found multiple images named '%s'.)r  )re  r   r   r  r   r#  rt  r   r   r   r3   r  rR  r6   r  rf   ru   r%  JM_image_reporterr6  r  r   util_hor_matrixlllrr  r  ur)r'   r   r  r)  inf_rectnull_matr   rB   r  r  r   r  rE   rW  r.  hmr  r   m0r  s    `                  r(   get_image_bboxzPage.get_image_bbox/  s    	Dk= 	=C, 	=;<<<1b"%%88 	H%BBB::$&&R>>S(( !DEEEDDYYYY#"5"5dk4"H"HYYYG7||q  qzB !1222 !Dt!KLLLBx199	9 ++DI+FFqII           >>##))Cyy 	I 	 	AttBxQqT

A6DA~~ad3344BAD14K  AAD14K  AAq!QUAq11Br'
AB
s   $E EEc                 b    t          |            | j                            | j        |          S )z*List of images defined in the page object.r	  )re  r   r  rR  rE  s     r(   r   zPage.get_imagesG/  s-    D{**4;T*BBBr)   c                     g }|                                  D ]H\  }}| j                            |d          }d|v rd}nd|v rd}n0|                    |||f           I|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.
        Tr~  r  r  rl  ocmd)r  r   r  rj   )r'   r   pnamer  r   octypes         r(   get_oc_itemszPage.get_oc_itemsL/  s     88:: 	- 	-KE4;**4D*AADd""%%IIudF+,,,,	r)   c                 Z   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        |	           |                                 t'          |          }
|
S )zMake SVG image from page.r      )re  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_pathro  r  tboundstext_optionr  r  r  r   s              r(   get_svg_imagezPage.get_svg_image_/  s
   D&ty11''3?13D3De//%Jc)'377!$''nS!!%
7:%
7:%  	$)S#u~/?/?@@@c"""%c**r)   c                     |}||                                  }n#t          |d          | k    rt          d          |                    |          }|~|S )Nr   not a textpage of this page)r	  r   r   extractTextbox)r   r   r  r  r   s        r(   r  zPage.get_textboxw/  sf    
 :""$$BBR""d**:;;;t$$	r)   c                 ,    t          j        | g|R i |S r+   r  r  s      r(   r  zPage.get_text/  r  r)   c                 ,    t          j        | g|R i |S r+   )r  get_text_blocksr  s      r(   rh  zPage.get_text_blocks/  s#    $T;D;;;F;;;r)   c                 ,    t          j        | g|R i |S r+   )r  get_text_selectionr  s      r(   rj  zPage.get_text_selection/  s#    '>t>>>v>>>r)   c                 ,    t          j        | g|R i |S r+   )r  get_text_wordsr  s      r(   rl  zPage.get_text_words/  s#    #D:4:::6:::r)   c                 ,    t          j        | g|R i |S r+   )r  get_textpage_ocrr  s      r(   rn  zPage.get_textpage_ocr/  s#    %d<T<<<V<<<r)   r  r  c                    t          |            |t          dd          }| j        }|dk    r|                     d           	 |                     |||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          |          }t          j        |           |_        |S )Nr   r   )r  r  )	re  rt  rN  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)KKHq  !!,/// q  !!,//// !H%%!---s   A9 9Bc                    t          |            | j        }|dk    r|                     d           | j        }g }	 t          j        |          }t          j        |          }t          j	        ddddd|j
                  |_        t          j        ||t          j	                    t          j                               t          j        |           |dk    r|                     |           |S Nr   r   r0  )re  rN  r  r   r  r   JM_new_texttrace_devicer   r  rq  r
  r  r  r  r  )r'   r  r   r   r  r  s         r(   r	  zPage.get_texttrace/  s    D}1a   y	./33C #D)).Aq"a::$U^%5%5u~7G7GHHHc"""1l+++	r)   c                 ^    t          |            | j                            | j                  S )z,List of xobjects defined in the page object.)re  r   r  rR  r-   s    r(   get_xobjectszPage.get_xobjects/  s(    D{,,T[999r)   r  c                    | j         }|t          d          d}|                    d          r
|dd          }t                              |          }	|	t                      k    rt          d|	           t          | |          }
|
1|
d         }t          ||          r|S |                    |           |S t          
                    |                                d           }d}d}g d}g d}	 |                    |          }d}n)# t          $ r t          dk    rt                       Y nw xY w|dk     rB	 |                    |          }d}n)# t          $ r t          dk    rt                       Y nw xY w|                                t                                           v rdd l}|                    |          }~|`t)          |          t*          u r|}nIt-          |d	          rt+          |          }n)t-          |d
          r|j        }nt          d          d }|                     ||||||||||
  
        }|s|S |d         }|d         }t          ||          r|S |                    ||           |S )Nr
  r   rD  r   zbad fontname chars r0  )rv
  rx
  rz
  ry
  )rw
  china-ssjapan-skorea-sr  r   zbad fontfile)r/  )r   r   r2   r=
  r>
  r  	CheckFontrB  rL  r~
  r7   r  ra  rf   r	  ru   r{
  r  r|
  r}
  r   r   r:   r   r  )r'   r   rL  rM  r  r
  r  r)  r6  	inv_charsrX  r  r  r
  
CJK_number
CJK_list_n
CJK_list_sr|
  fontfile_strr  r/  s                        r(   insert_fontzPage.insert_font/  s   k;>???s## 	$|H&33H==	>9>>???x((7DS$'' %%%K !$$X^^%5%5t<<
===
CCC
	#))(33JEE 	 	 	#a''N,<,<,<D	
 >>'--h77
   '!++0@0@0@
 >>388::::    &--h77J H~~$$':.. 1"8}}6** 1'} 000Lxz:WZ$eXzC C  	J1vq6d## 	K 	D8444s$   5D #D32D3=E #E;:E;)	css	scale_lowarchiverX  r  rU  r  _scale_word_width_verbosec       	   	         |dz  dk    st          d          |dk     r|dz  }|dk     |dk    r|dz  }|dk    d|cxk    rdk    sn 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  }|                    |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}|                    |          }d|cxk    rdk     rVn nS|d         }|                    ||          }d| d}t(                              ||                                d           |                     ||d|||	           j        j        j        j        z   dz  |z  }|j        |j        z   dz  }t5          |dd||j         |j                   t5          |           z  t5          dddd|j        |j                  z  }|d                                         D ]'}|dxx         |z  cc<   |                     |           (||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_cssr  z"'text' must be a string or a Story)	scale_min	scale_maxr  r	  r0  r  z
scale_low=z scale=c                  "    j         j         d fS r+   r  )r  fits    r(   rect_functionz*Page.insert_htmlbox.<locals>.rect_functiony0  s    8SXt++r)   r5  r6  rD  z gs
)rX  r  r  r   rV  )r   r#  r  r[  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  rt  r$  r%  ro  r  )r   r   r   r  r  r  rX  r  rU  r  r  r  	temp_rectmycssstoryrect_scale_maxrq  spare_heightr  r)  r  ra  rp  mp1mp2ru  r  r  s                              @r(   insert_htmlboxzPage.insert_htmlbox0  s   T {a1222qjjcMF qjjmmcMF mm I""""""""<===;CDzzYQ4;
;;IIQ4:t{;;I %s* dC   	CteWEEEEEe$$ 	CEEABBB "+aQ]oo(?PWe;;VW     ~ 	%E; #*%%
SX[)V3333
sz}-7777CM!	!!!#;i#;#;5#;#;!!!CHK#*-75@!DD	, 	, 	, 	, 	, $$]33 !FE%%W%==DDA""5!((**a888 	4a2wOOO x{SX[(A-5 w A% 5!Qvv66fWooQ1a../ 	 F$$&& 	# 	#DLLLCLLLT""""U""r)   )r  re   r  r  r  r  r  r  rX  r   r[  r  c                   t          |            | j        }|j        st          d          |dk    rBt	          |          t	          |          z   t	          |	          z   dk    rt          d          |r^t          |          t          u rnGt          |d          rt          |          }n't          |d          r|j        }nt          d          |r1t          j
                            |          st          d|z            |r7t          |          t          t          t          j        fvrt          d	          |	r%t          |	          t"          urt          d
          |r|s|st          d          |r7t          |          t          t          t          j        fvrt          d          |
dk     r|
dz  }
|
dk     |
dk    r|
dz  }
|
dk    |
dvrt          d          t%          |          }|j        s|j        rt          d          || j         z  }d |                    | j                  D             }|d |                    | j                  D             z  }|d |                    | j                  D             z  }d}d}|dz   }||v r|dz  }|t          |          z   }||v |r|                                  |j        }|                     ||	|||||||
||||||          \  }}|||_        |S )a  Insert an image for display in a rectangle.

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

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

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

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

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

        Returns:
            xref (int) of inserted image. Re-use as argument for multiple insertions.
        r  r   r   z4xref=0 needs exactly one of filename, pixmap, streamr  r   zbad filenamezNo such file: '%s'z#stream must be bytes-like / BytesIOzpixmap must be a Pixmapz mask requires stream or filenamez!mask must be bytes-like / BytesIOr  )r   r  r  r  bad rotate value!rect must be finite and not emptyc                     g | ]
}|d          S r  r,   r   s     r(   r   z%Page.insert_image.<locals>.<listcomp>0  s    ???!???r)   c                     g | ]
}|d          S r.  r,   r   s     r(   r   z%Page.insert_image.<locals>.<listcomp>0  s    BBB!1BBBr)   c                     g | ]
}|d          S rI  r,   r   s     r(   r   z%Page.insert_image.<locals>.<listcomp> 1      ???!1???r)   fzImgry   )re   r  r   r  r   r  r  r  rX  r  r[  r  r  r  r  )re  r   r  r   r6  r   r   r:   r   rc   r	   r  r  r  r]  r8   r^  r  r#  r  r  rj  r  rR  r  r  r  r  r  )r   r   r  re   r  r  r  r  r  r  rX  r   r[  r  r)  r  r   ilstrD   r   r  r  s                         r(   insert_imagezPage.insert_image0  s   ` 	Dkz 	*[)))199$x..4<<7$v,,F!KKSTTT 	1H~~$$:.. 1x==6** 1#= 000 	8BGNN844 	8#$88$CDDD 	8VUIrz,JJJBCCC 	8VF226777 	A 	A8 	A?@@@ 	BDJJui&DDD@AAAqjjcMF qjjmmcMF mm***/000JJ: 	B 	B@AAAD... @?c11$+>>???BBs44T[AABBBB??s11$+>>????s7$FA3q66zH $  	!   $**+ + 
 
g" !(Cr)   rf  r:  c                     t          |            t          j        | |          }|dk    rt          d          |                     |f           dS )z'Insert a new link for the current page.r[   link kind not supportedN)re  r  getLinkTextr   rp  )r   rf  r:  r   s       r(   r  zPage.insert_link!1  sV    D!$,,B;;6777!!5(+++++r)   皙?)r   rl  r   rL  r  r  r  r   r  miter_limitrender_moderX  r  r  r  r  r  rl  rL  r  r  r  r  c                    |                                  }|                    |||||||||	|
||||||||          }|dk    r|                    |           |S )N)r   rl  r   rL  r  r  r  r   r  r  r  rX  r  r  r  r  r   )r^  r*  rb  )r   r)  r   r   rl  r   rL  r  r  r  r   r  r  r  rX  r  r  r  r  r  r  r   s                         r(   r*  zPage.insert_text)1  s    0 nn__!!%##)%%  
 
( 77JJw	r)   )r   rL  r  r  r   rl  r  r   
expandtabsr  rX  r  r  r  r  r  r  r  r  r  r  c                    |                                  }|                    |||||||||	|
||||||||||          }|dk    r|                    |           |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   rl  r   rL  r  r  r  r   r  r  r  r  r  rX  r  r  r  r  r   )r^  ra  rb  )r   r   r  r   rL  r  r  r   rl  r  r   r  r  rX  r  r  r  r  r  r  r  r  r  r   s                           r(   ra  zPage.insert_textboxZ1  s    Z nn!!!##%)%)   
 
, 77JJw	r)   c                 2    |                                  dk    S )z3Check if /Contents is in a balanced graphics state.r  )r  r-   s    r(   r  zPage.is_wrapped1  s     $$&&&00r)   c                     t          | j        d          }|j        sdS t          j        |                                t          d                    }|j        sdS t          j        |          S )zPage language.Fr,  NLang)r   r   r   r   r?  r  r  pdf_to_str_buf)r'   r  r(  s      r(   r)  zPage.language1  sj     ty5999! 	F-gkkmmXf=M=MNN 	F#D)))r)   c              #   \   K   |                                  }|D ]}|
|d         |v r|V  dS )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.
        NrW  )ro  )r'   kinds	all_linksr  s       r(   ry  z
Page.links1  sM       NN$$	 	 	D}V 5 5	 	r)   identc                 P   t          |            t          |          t          u rd}|}n*t          |          t          u r|}d}nt	          d          |                     ||          }|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)re  r   r   r3   r   r  r   r  r  r   r6  r7  )r'   r  r  r   r  s        r(   rO  zPage.load_annot1  s     	D;;#DDD%[[CDDDEFFFtT** 	J]4((
$'C!
r)   c                    t          |            t          j        | j                  }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   d|_        d|_        | j	        j        rE|                                 }d |D             }|r"|d         }|d         |_        |d         |_        nd|_        d|_        |S )zGet first Link.NTr   r[   c                 >    g | ]}|d          t           j        k    |S r.  r  r  s     r(   r   z#Page.load_links.<locals>.<listcomp>1  s)    FFF111E)E)EQ)E)E)Er)   r   )re  r   fz_load_linksr   r   r
  r   r  r  r   r6  r7  r  r  r  )r'   r  rA  link_ids       r(   r  zPage.load_links1  s    D!49--~ 	FCjj]4((
$'C!; 		$$&&EFFFFFE $("1: CHCF
r)   c                 <   t          |            t          | j                  }t          ||          }|}|s|S d|_        t          j        |           |_        || j        t          |          <   t                      }t                              ||           |}|S )zLoad a widget by its xref.T)re  r   r   JM_get_widget_by_xrefr   r  r  r   r6  r7  r8  r
  r9  )r'   r  r   r   r  r:  s         r(   load_widgetzPage.load_widget1  s    DDI&&%tT22 	J]4((
$'C!3'''
r)   c                     t          |            |                     d          }|j        st          j        | j                  }n!t          |                                          }t          |          S )zThe MediaBox.Fr,  )	re  r%  r   r   r  r   JM_mediaboxr  r#  )r'   r   r   s      r(   ro  zPage.mediabox2  sd     	D~~u~-- 	,&	22DD

++DDzzr)   c                 J    t          | j        j        | j        j                  S r+   )r  ro  r  r
  r-   s    r(   mediabox_sizezPage.mediabox_size2  s    T]%t}'7888r)   c                      t          |           S r+   )Shaper-   s    r(   r^  zPage.new_shape2      T{{r)   c                 6    t                               |           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                 j    t          |            | j        }|                    |           }|| _        dS )z-Refresh page after link/annot/widget updates.N)re  r   r  r   )r'   r)  r   s      r(   refreshzPage.refresh 2  s3    Dkt$$			r)   )re   r  r   c                   | j         }|                    |          st          d          t          |          t          |          z   t          |          z   dk    rt          d          |                     | j        |||          }|                    ||           |                                 d         }|                    |d           d| _	        dS )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)re   r   r  r0  r%  N)
r   r4
  r   r6  r  r   r&
  r)	  r+	  r  )r   r  re   r  r   r)  rw  last_contents_xrefs           r(   r  zPage.replace_image(2  s    . k  && 	20111>>DLL(4<<71<<RSSS$$I % 
 
 	h%%%!..004 	,d333r)   c                 |    t          |            t          | j        d          }|j        sdS t	          |          S )zPage rotation.r   r,  )re  r   r   r   JM_page_rotationrE  s     r(   rN  zPage.rotationN2  sC     	DDI222 	1%%%r)   c                 P    t          t                              |                     S )zReflects page rotation.)rt  r
  _rotate_matrixr-   s    r(   rP  zPage.rotation_matrixW2  s      e**400111r)   c                     t          |            t          j        | j        |j        t          |          t          j                               dS )z=Run page through a device.
        dw: DeviceWrapper
        N)re  r   r  r   r  r  r  )r'   r  r  s      r(   r  zPage.run\2  sD     	D$)RY0A!0D0DenFVFVWWWWWr)   )r   r/	  r  r  c                @   |"dt           z  t          z  t          z  t          z  }|t	          |          }t          |            |}||                     ||          }n#t          |d          | k    rt          d          |	                    ||          }|~|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.
        Nr   )r   r  r   rd  )r/	  )
r1	  r3	  r2	  r4	  r#  re  r	  r   r   search)r   r   r   r/	  r  r  r  rlists           r(   r5	  zPage.search_forc2  s    ( ="#*+ ** %	%E ::DD:""E"::BBR""d**:;;;		$e	,,r)   c                 .    |                      d|          S )zSet the ArtBox.r  r  r'   r   s     r(   
set_artboxzPage.set_artbox2  s      4000r)   c                 .    |                      d|          S )zSet the BleedBox.r  r  r  s     r(   set_bleedboxzPage.set_bleedbox2  s      T222r)   c                 v   t          |            | j        }|j        rt          d          |j        st          d          |t          d|                                          vrt          d          |                    |          st          d          |                    | j	        dd|z             dS )	z-Set object at 'xref' as the page's /Contents.r   r  r   rk  zxref is no streamr  r`	  N)
re  r   r   r   r  rK  rq  r$
  rl  r  )r'   r  r)  s      r(   set_contentszPage.set_contents2  s    Dk= 	0.///z 	*[)))uQ 1 12222Z(((!!$'' 	20111J4@@@@@r)   c                 .    |                      d|          S )z,Set the CropBox. Will also change Page.rect.r  r  r  s     r(   set_cropboxzPage.set_cropbox2        D111r)   c                    t          |            t          | j                  }|s6t          j        |                                t          d                     dS t          j        |          }t          t          d          sJ t          j	        |j        t          d          t          j
        |                     dS )zSet PDF page default language.r  r$  N)re  r   r   r   r@  r  r  r  r:   r~  r$  )r'   r)  r  r(  s       r(   r  zPage.set_language2  s    Dty)) 		w{{}}hv.>.>?????5h??D5"ABBBBB*KV$$7==    r)   c                    t          |            |                                 }t          |          }t          j        |          st          j        |          rt          t                    t          j        |	                                t          d          |           t          j        |	                                t          d                     t          j        |	                                t          d                     t          j        |	                                t          d                     t          j        |	                                t          d                     dS )zSet the MediaBox.MediaBoxr  r  r  r  N)re  r%  r  r   r  r  r   r  r+  r  r  r@  )r'   r   r   ro  s       r(   r  zPage.set_mediabox2  s   D~~"4(("8,, 	,,X66	, l+++Xj-A-A8LLLDHHJJ(;(;<<<DHHJJ(:(:;;;DHHJJ(<(<===DHHJJ(;(;<<<<<r)   c                     t          |            t          | j                  }t          |          }t	          j        |                                t          d          |           dS )zSet page rotation.r3  N)re  r   r   JM_norm_rotationr   rH  r  r  )r'   rN  r   rQ  s       r(   r  zPage.set_rotation2  sW    DDI&&x((

HX,>,>DDDDDr)   c                 .    |                      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     ||         }|| j         z  }|s|j        n	|j        |z  }|j        s|j        rt          d          ||j         z  } |	||||          }d |
	                    | j
                  D             }|d	 |
                    | j
                  D             z  }|d
 |
                    | j
                  D             z  }d}d}|dz   }||v r|dz  }|t          |          z   }||v |j        }|
j        |k    rt          d          |
j                            |d          }|t#          |
          }||
j        |<   ||f}|
j                            |d          }|r|                                  |                     ||||||||          }||
j        |<   |S )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)
        Tr   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  rt  r$  r%  r[  r  r  JM_TUPLE)
srtrr 
  rX  smptmpr  sr1fwfhs
             r(   calc_matrixz'Page.show_pdf_page.<locals>.calc_matrix2  s      525=C'C525=C'C q!QCE6CE622VF^^CAq&CCI%BSZ'B &b"++%RBA1aCE35111AA;;r)   r  r  z!clip must be finite and not empty)r 
  rX  c                     g | ]
}|d          S r.  r,   r   s     r(   r   z&Page.show_pdf_page.<locals>.<listcomp>!3  s    AAA!AAAr)   c                     g | ]
}|d          S r  r,   r   s     r(   r   z&Page.show_pdf_page.<locals>.<listcomp>"3  s    @@@!1@@@r)   c                     g | ]
}|d          S r  r,   r   s     r(   r   z&Page.show_pdf_page.<locals>.<listcomp>#3  r  r)   fzFrmry   r   z%source document must not equal targetN)r  r  r  r  r   r  r  )Tr   )re  r   r  r   r  r  r  rj  r   r  rR  r  r  r   r  r  r7   r  r  r  r
  )r   r   r  r  r  r  r  rX  r   r  r)  r  tar_rectsrc_rectr  r  rD   r   r  isrcgmappno_idr  s                          r(   r  zPage.show_pdf_page2  s   2 	  	  	  	D 	Dkz 	* 	*[)))= 	BD, 	B@AAAAgg6$$C Agg#;4555(,F8==(-$2F 	B 4 	B@AAAx===XxofUUU BAc33DK@@AAA@@s224;??@@@@??s11$+>>???? s7$FA3q66zH $ =D  DEEE }  t,,<C==D"&CM$ ~!!&!,, 	!   "" # 	
 	
 "&vr)   c                    t          |            t          j                    }|                     d          }|j        st          |          S t          j        t          j        j                  }t          j        |||           t          |          }| j	        dz  dk    rt          |          }nt          ddddd| j        j                  }|S )zPage transformation matrix.Fr,  r  r   r   r0  )re  r   rq  r%  r   rp  rg  rj  r  rN  rt  rf  r  )r'   r  r   ro  r  s        r(   rj  zPage.transformation_matrixK3  s     	Dn~~u~-- 	*$S)))< 788 x555$$=3!##++CCAq"a)<==C
r)   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )zThe TrimBoxr  Nr   r   r   r   rx  ry  s      r(   trimboxzPage.trimbox^3  sY     y))<<]DGRUT!W_d1grutAwGGGr)   c                     t          |            t          j        | |          }|dk    rt          d          | j                            |d         ||            dS )z"Update a link on the current page.r[   r  r  r   N)re  r  r  r   r   r  )r   rf  r   s      r(   update_linkzPage.update_linkg3  sa    D!$,,B;;6777!!#f+u4!@@@@@r)   c              #      K   d |                                  D             }|D ]&}|                     |          }|	|j        |v r|V  'dS )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.
        c                 J    g | ] }|d          t           j        k    |d         !S r  r  )r   r    s     r(   r   z Page.widgets.<locals>.<listcomp>z3  s-    [[[AaDEDZ<Z<Z!<Z<Z<Zr)   N)r  r  r  )r'   rM  widget_xrefsr  r:  s        r(   r  zPage.widgetsp3  sp       \[d&6&6&8&8[[[  	 	D%%d++F} 1U : :	 	r)   c                     |                                  \  }}|dk    r!d|z  }t                              | |d           |dk    r&d|z  dz   }t                              | |d           dS dS )z,Ensure page is in a balanced graphics state.r   r  Fs   
Qr  TN)r  r
  r  )r'   pushpopprependrj   s        r(   r  zPage.wrap_contents3  s}    ))++	c!88tmG""4%88877c\E)F""466666 7r)   c	           
         t          | t                    sJ |st          d          t          |          t          u r&|dk    r||                    | |||           dS |f}|d         j        }	t                      }
|
                    | j	        j
        | j	        j                  }|D ]$}|	|j        z  }	|                    |||           %||	}|                     ||
d||||	|           d}
d}dS )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)rU  r  r  rY  )rU  r  )r  r  rX  r   r  )r=   r   r   r   
TextWriter
write_text	text_rectr   r  r   r[  r  r  )r   r   writersr  r  rU  r  rX  r  r   textdocr  writers                r(   r  zPage.write_text3  s:   * $%%%%% 	ECDDD==J&&{{t|""4w"WWWt"*qz#**  tyty?O PP 	C 	CFF$$DeWEBBBB<D+ 	 		
 		
 		
 r)   c                 ^    t          |            | j                            | j                  S r
  r
  r-   s    r(   r  z	Page.xref3  r
  r)   zpage rectangle)r)  r/  rI
  r+   )Nr   N)NNNNNr   r   r   r   r   r   r   r0  NN)r   r   Nr  )Nr   r   N)r   Nr   r   NNNr1  )NNr  r   NNT)r;  )r   r   r   r.  )r-  NNr   NFr   r   Tr   r   r   )r-  NNNr   r   r   Tr   r   r   )
r-  Nr   r   r   TNr   r   r   )r-  NNr   Nr   r   TFr   r   r   )r-  NNr   r   r   NTr   r   r   )r-  NNr   r   r   NTr   r   r   N)r-  NNTNr   Fr   r   Tr   r   r   )r   r-  Nr   r   r   TNr   r   r   r   Nr  rJ
  )NNr   r   TrQ  )r  NNFr   r   )r   TTr   r   N)NNTNNTr   r   )r   r   r  N)r.   r/   r0   r   r   r   r#  r0  r   PDF_ANNOT_LE_OPEN_ARROWr>  rI  rL  rP  rX  rZ  rr  rt  rw  rp  r  r  r   r  rS
  r3  r  r  r  r  r  r  r  r  r%  r  r  r  r  r
  r   r   r  r   r  rP
  r   r  rm  r5  r3   r  r   r   r#  r%  r)  r+  r-  r6  r1  r5  r7  r:  r=  r@  r8  rB  rF  r  r  r(	  r  rr  rv  r2  rz  r|  r  r  rf  r  r  r  r'	  r  rt  rk  r  r  r  r  r  rK
  rO
  r   r  r  r  r_  r  r  r  r  r  r  r  r  r  r)	  r  r  r  r  r  ro  r  r   r  r  r   rC  rF  rS  r   rY  rb  r   r  r  rh  rj  rl  rn  r	  r	  rt  r  r   r  r  r4   r  r4  r*  ra  r  r)  ry  rO  r  r  ro  r  r^  r  r  r  rN  rP  r  r5	  r  r  r  r  r  r  r  r  r  rj  r  r  r  r  r  r  r   rt  r,   r)   r(   r   r   %  s.          2 2 2  "     < 2!N N N N`  @	 	 	     <
 
 
B B B BH      D  D  DD    
 
 
F F F0 6    .     4 GKJK59j" j" j" j"X  *        	% 	% 	%: : : :! ! !   BL L L*9 9 97 7 7 7rZ E    	Y 	5 	 	 	 	   $    	
       <  " $ $"&!" !7%. . .. .
 . . . . !.  . . . . . .  !.& '. . . .` 59*. 38    %    	 	 	 	 	 	 		 	 	 	 	 		 	% 	 	 	 		9 	 	 	 	 	 " $!< < < 	<
 < < < < < < < < <@ B B B B B B	 	I 	5 	 	 	 	D DSX D D D D	 	J 	c 	 	QV 	 	 	 	C CSX C C C C E    $	* 	* 	*- - -   ( 	m mmm m 	m
 m m m m^; ; ; ;, , ,. . . H H XH H H XH  $C C C C 
 
 X
   X  .-6 - - - - -* * *XF F v     86 8 8 8 X8 !! # $%"##% %%% % 	%
 % % % % % % % % % % "%   !%" #%$ %% % % %V ! ! $%"#        	 
               "              N !! # $%"#!$ $$$ $ 	$
 $ $ $ $ $ $ $ $ $ "$  $  !$" #$ $ $ $T !!  $%"#        	 
             "            J !!  $%"#    ,y)34    	 
             "              J !!  #$%"#" """ " 	"
 " " " " " " " ""  " " " " " "N !!  $%"#        	 
             "              J !!  $%"## ### # 	#
 # # # # # # "#  # # # # # #T !!# # $%"##, ,,, , 	,
 , , , , , , , , , , ",   !," #,$ %, , , ,d  !  $%"#! !!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! ! ! ! !N  !  $%"#! !!! ! 	!
 ! ! ! ! ! ! ! "!  ! ! ! ! ! !F	$ 	$ 	$ 	$   X ! ! X!   X&       >  $   | |T |D | | | |@ !' ''' ' 	' ' ' 'R" "f " " " " "H8 8 8  4    : %-'+ $!!) ) )) $)
 ')  ) ) ) ) ) ) )V4 4 4n VW!aR aR5:aRMRaRaR 
aR aR aR aRFB B B B
> > > >@C C C C
d    &   6   	   5 5 5< < <? ? ?; ; ;= = =  # S]       *: : :
 FJ78Q Q Q Qp Q# Q# Q# 
Q# Q# Q# Q#n  z z z z zx, ,& ,t ,4 ,4 , , , , !#'"# "&!"   $%"#+/ / /// ,sDy)/
 / !/ / / / / / /  / / /  !/" #/$ %/& "'/(  )/* +/ / / /l ## #'  !""&  $%"#/F F FFF Ld+F
 F F F F F !F F F F F F  !F" #F$  %F& 'F( )F* "+F,  -F. /F0 1F F F FP 1 1 X1 * * X*   S#X 6 5    .  6  $   X 9 9 X9  - - -   $  $  $ $ $  $  $  $ L & & X& 2 2 2 2 X2X X X ' ' ' ' ' ' 'R1 1 13 3 3A A A2 2 2   = = =E E E2 2 2  z z z z z zx   X$ H H XHA& At A A A A A   "7 7 7  11 1 1 1 1f 2 2 X2
 8E/000D r)   r   c                   h   e Zd Zd Zd Zd Zd Zd Zed             Z	d8dZ
d9d
Zd:dZed             Zd Zed             Zd Zed             Zd:dZed             Zed             Zed             Zed             Zd;dZd<dZd Zd Zd Zd Zedefd             Zed!             Zd" Z ed#             Z!d=d%Z"d>d&Z#d?d(Z$d) Z%d* Z&d+ Z'd, Z(d- Z)ed.             Z*ed/             Z+d0 Z,ed1             Z-d2 Z.ed3             Z/ed4             Z0ed5             Z1ed6             Z2e-Z3eZ4d7 Z5dS )@r  c                 T   d| _         d| _        	 t          |t          t          j        ft          j        t          j        t          t          t          f          rF|\  }}d}t	          j        |t          |          t	          j        d          |          }|| _        dS t          |t          t          j        ft          j        t          j        t          t          t          ft          t           f          rE|\  }}}t	          j        |t          |          t	          j        d          |          }|| _        dS 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        rTt	          j        ||t	          j                    t	          j        d          t	          j                    d          | _        dS t	          j        |          | _        | j        j        st9          t:                    dS t          |t$          t          j        ft$          t          j        f          r|\  }}t)          |t$                    r|j        }t)          |t$                    r|j        }|}|}	|j        s0t	          j        |	          }
|
j        st9          t:                    nt	          j        ||	          }
|
| _        dS t          |t$          t          j        ft>          t          ft>          t          fd          s<t          |t$          t          j        ft>          t          ft>          t          f          r tA          |          dk    r%|\  }}}t	          j        t          j!                  }n|\  }}}}t          |          }t)          |t$                    r|j        n|}t	          j"        |          s>t	          j#        ||$                                |%                                |||          }nYt	          j#        ||$                                |%                                ||t	          j        t          j!                            }|| _        dS t          |tL          t$          t          j        f          r6|d         dk    r*|\  }}t)          |t$                    r|j        }|| _        dS t          |t$          t          j        ft          df          rx|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	          j(        |          }t	          j)        |          }t	          j*        |          }t	          j+        |||||          }|j        j$        |j        _$        |j        j%        |j        _%        |j        j,        |j        _,        |j        j-        |j        _-        	 t]          j/        |j        |j        |           || _        dS t          |t          j        t          ft          t          dt          t           f          rd|\  }}}}$}t)          |t                    r#|j        }t)          |t          j                  sJ t	          j7        |          }||z   |z  }%t	          j                    }t	          j+        |||||          }t)          |$tp          tr          f          r$t	          j:        |$          }&tA          |$          }nPtw          |$          }'|'j        st/          d          t	          j<        |'          \  }}(t	          j:        |$          }&|%|z  |k    r!t/          d|d|d|d|d|%d|          t	          j=        |j        |&           || _        dS t          |d          r|\  })d}*t}          |)d          r+|)?                                }+|+rt	          j@        |+          },nt}          |)|*          r|)jA        }+|+rt	          j@        |+          },not)          |)tL                    rt	          j@        |)          },nEtw          |)          }'|'j        r|'j        j         st/          d          t	          jB        |'          },t	          jC        |,t	          j        t          t          t          t                    t	          jF        |,G                                dd|,H                                dd                    \  }}}t	          jI        |,          \  }-}.|-|j        _,        |.|j        _-        || _        dS t          |t          t          jK        ft                    r|\  }/}0t          |/          }1t	          jM        |1          }2tO          |0d|2dz
            st/          t                    t	          jO        |1|0d          }3t	          jP        |3t          d                    }4t	          jR        |4t          d                    sXt	          jR        |4t          d                    s6t	          jR        |4t          d                    st/          t                    t	          jT        |1|3          },t	          jC        |,t	          j        t          t          t          t                    t	          jF        |,G                                dd|,H                                dd                    \  }5}}|5| _        dS 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' colorspacer	  zbad samples datazbad samples length w=z h= alpha=z n=z stride=z size=r   r  bad image datar  r  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    rz   r$   )V_samples_mv_memory_viewr  r  r   r  rg  FzIrectIRectr#  r   fz_new_pixmap_with_bboxr  r  r   r3   r6  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_maskrm  r6   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  striderD   rK  fz_samples_setfz_samples_getr  r  r]  r  r&  r  ll_fz_pixmap_copy_rawr:   r   fz_new_image_from_filer   rl  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTrq  r   r  r  r   r   r   r  r  r  r  r  r  r  r  rf   )8r'   r  r  r   r  r  spixmpixspmmpmr
  r   r  r.  r   src_pixr  sepsrD   src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr%  r$  pm_isrc_ir   src_pix_alphar  samplesr/  samples2r  r  	imagedatar   r  r  r  r  r)  r  rY  r
  r  rZ  r  r   args8                                                           r(   r   zPixmap.__init__3  s
     
 !A	# U/0u}eT5A  ~	#
 HBE.r3CD3I3I5K^_`KaKachiiBDIIIU/0u}eT5Ad  t	# #OBe.r3CD3I3I5K^_`KaKachiiBDIIIz5+=tDzzJVUZUcLdee j	#HB"j)) .W'--$'' !y-d33> H "FGGG} 9!3*,,2488+-- 			 "BDII	y+ 9&8889 9 vu~68PQQ P	#JD$$'' !y$'' !yCC? H<SAA~ 9&8889 =c3GGDIII7%s|UYZZ 	#vu~6uclSS	# 4yyA~~!
a}U%<==#' aD'--#-dF#;#;EdiiG-d33 |*7GIIKKaQRTXYY*7GIIKKaQRTYTabgbyTzTz{{DIIIcFEN#;<< n	#aEAQAQEAr"f%% WDIIIvu~6dDD g	# 7D"4yyA~~DGG1E#-dF#;#;EdiiGE1a(( 5 "3444+G44B= M M "KLLL&((D)'22A%g..A&w//A$RAtU;;B%02BMO%02BMO!(!3!8BM!(!3!8BM62 !2='2DaHHHh DIIIu1:>S$QTVZP[\\ X	#'+$B1gu"j)) :W!"e&899999%b))A%i1_F&((D$RAtU;;B7UI$677 	= 3G<<7||(11~ :$&89991#66a 3G<<zT!! "a"a"aQ"a"a%"a"a1"a"aPV"a"aZ^"a"abbb'AAADIIId## >	#JIDy),, :!))++ >6u==CD)) 
:! >6u==CIs++ :29==(33~ 8S^-? 8$&67774S99
 5M/?OUdeeNCEEGGQ35577AqAA HB1
 2377JD$!%BM!%BMDIIIx)9:C@@ 	#IC"3''C(--GD!WQY// 0 ,///(dA66C&sHY,?,?@@E%eXg->->?? 3!-eXg5F5FGG3!-eXl5K5KLL3 !/222&sC00C 6M/?OUdeeN35577Aq#%%''1a@@ ICA
 DIII BD 4 43tCyy33C3333T"""r)   c                     | j         S r+   )r  r-   s    r(   r'  zPixmap.__len__4  s
    yr)   c                     t          |           t          urd S | j        r*d| j        j        j        j        d| j        d| j        dS ddd| j        d| j        dS )NzPixmap(z, r  r  )r   r  r  r   r   r   irectr  r-   s    r(   r   zPixmap.__repr__4  s    DzzV##VV? 	K 	K+/?+?+J+O+O+OQUQ[Q[Q[]a]g]g]ghh	K ,2664:::tzzzJJr)   c                 z   | j         }t          j        |          |                                z  }t          j        |          }t          j        |          }|dk    rt          j        ||           n|dk    rt          j        ||           n|dk    rt          j        ||           nk|dk    rt          j	        ||           nO|dk    rt          j
        ||           n3|dk    rt          j        |||d           nt          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  s7    Y%b))BDDFF2!$''nS!!\\E8bAAAA\\E8bAAAA\\E8bAAAA\\E8bAAAA\\E7R@@@@\\)#r;BBBB(b111!#&&r)   c                    | j         }|dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        |||           d S t          j        ||           d S )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'   re   rX  rY  r  s        r(   	_writeIMGzPixmap._writeIMG5  s    Y\\E7HEEEEE\\E7HEEEEE\\E7HEEEEE\\E7HEEEEE\\E6r8DDDDD\\E8X{SSSSS!7HEEEEEr)   c                 4    t          j        | j                  S )z$Indicates presence of alpha channel.)r   fz_pixmap_alphar   r-   s    r(   r  zPixmap.alpha5  r  r)   Nc                     |t          j        | j                   dS |t          j        | j        |           dS t	          | j        |t          |                     dS )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(   r  zPixmap.clear_with5  sc    =!$),,,,,\,TY>>>>>+DIu>Nt>T>TUUUUUr)   r   c                 V    | j         }t          ||          }|st          |          S |S )z-
        Return count of each color.
        )r   JM_color_countr6   )r'   r  r   r  r   s        r(   color_countzPixmap.color_count5  s2     YR&& 	88O	r)   c                 
   d}d}|| j         t          |          v r| j         }|                     d|                                          D ]\  }}||z  }||k    r|}|}|sdt	          dg| j        z            fS ||z  |fS )z/Return most frequent color and its usage ratio.r   NT)r  r   r   r	  )rO  r#  rl  rA   r  rD   )r'   r   	allpixelscntpixelr  maxpixels          r(   color_topusagezPixmap.color_topusage%5  s    	
d4jj 8 8:D ,,Dd,CCIIKK 	! 	!LE5Is{{  	.ucUTV^,,--i**r)   c                 l    t          t          j        | j                            }|j        dk    rdS |S )zPixmap Colorspace.r  N)r  r   r#  r   r   )r'   r  s     r(   r  zPixmap.colorspace45  s5     249==>>7f4	r)   c                 F   | j         }|j         }t          j        |          st          d          |                                |                                k    rt          d          t          j        ||t          |          t          j        d                     dS )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(   r\  zPixmap.copy<5  s    Y()'22 	IGHHH88::((EFFF!"g/?/E/EuGabfGgGghhhhhr)   c                 R    t          j        | j                  }t          |          S )zMD5 digest of pixmap (bytes).)r   r  r   r  r   s     r(   r  zPixmap.digestF5  s"     "49--Szzr)   c                     t          j        | j                  st          d           dS t          j        | j        |           dS )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_withL5  sH     )4955 	=>>>Fty%00000r)   c                 4    t          j        | j                  S )zThe height.)r   r+  r   r-   s    r(   r  zPixmap.hT5  r
  r)   c                    | j         }t          j        |          j        st	          d           dS t          |          }t          j        |          rt          j        |           dS t          j        ||           dS )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_irectY5  s    Y)"--8 	89995T""%a(( 	"2&&&4#B***tr)   c                 R    t          j        | j                  }t          |          S )zPixmap bbox - an IRect object.)r   fz_pixmap_bboxr   JM_py_from_irectr  s     r(   rO  zPixmap.irectf5  s$     "49--%%%r)   c                 4    t          j        | j                  S )zCheck if pixmap is monochrome.)r   fz_is_pixmap_monochromer   r-   s    r(   is_monochromezPixmap.is_monochromel5  s     ,di888r)   c                    | j         }|                                }|                                |                                z  |z  }d }t	          d||          D ],}|dk    r ||d|          } ||||          }||k    r dS -dS )z5
        Check if pixmap has only one color.
        c                     t                      }t          |          D ]-}|                    t          j        | ||z                        .|S r+   )r   rK  rj   r   r1  )r  offsetrD   rF   r   s        r(   _pixmap_read_samplesz0Pixmap.is_unicolor.<locals>._pixmap_read_samplesy5  sK    &&C1XX ? ?

5/F1H==>>>>Jr)   r   FT)r   rD   r   r  rK  )r'   r  rD   r  r  r  sample0samples           r(   is_unicolorzPixmap.is_unicolorq5  s    
 YDDFF!#	 	 	
 Qq)) 	! 	!F{{..Aq99--r61==W$$ 55 %tr)   c                     t           r#d }t          |          | j        _        | j        S t	          j        | j                  S )zThe size of one pixel.c                 4    t          j        | j                  S r+   )r   pixmap_nr   r-   s    r(   n2zPixmap.n.<locals>.n25  s    ~di000r)   )r  r2  r  rD   r   fz_pixmap_componentsr   )r'   r  s     r(   rD   zPixmap.n5  sE      	1 1 1'||DN6M)$)444r)   r   c                    t          |          }t          j                    }||_        |r|                    |           |r|                    |           | j        }t          |t                    rt          j	        ||d|           dS t          |          }	 t          j        |||           |                                 dS # |                                 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'   re   r
  r)  tessdatar  r  r  s           r(   pdfocr_savezPixmap.pdfocr_save5  s      ))$&&  	*))) 	)x(((ih$$ 	&*C1dCCCCC'22C&/c4@@@##%%%%%##%%%%s   C	 	CTengc                     t          |          }ddlm}  |            }|                     ||||           |                                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)  r  )r  r8   r^  r  rv  )r'   r
  r)  r  r^  r
  s         r(   pdfocr_tobyteszPixmap.pdfocr_tobytes5  sY      ))giix(XVVV||~~r)   c                    	 ddl m} n# t          $ r t          d            w xY w| j        }|sd}n0|j        dk    r| j        sdnd}n|j        dk    r| j        sdnd	}nd
}|                    || j        | j	        f| j
                  }|S )z&Create a Pillow Image from the Pixmap.r   )r  zPIL/Pillow not installedr  r   LAr   r  RGBAr  )PILr  r	  rq   r  rD   r  	frombytesr[  r  rI  )r'   r  cspacer   r  s        r(   	pil_imagezPixmap.pil_image5  s    	!!!!!!! 	 	 	.///	  	DDX]]"j233dDDX]] $
655DDDoodTZ$=t|LL
s   	 $c                     |                                  }d|                                vr| j        | j        f|d<    |j        |i | dS )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)r  r  r  r  r  )r'   r  r  r  s       r(   pil_savezPixmap.pil_save5  sU     nn%%!Y	2F5M$!&!!!!!r)   c                     t          j                    }|                                 }d|                                vr| j        | j        f|d<    |j        |g|R i | |                                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  )r8   r^  r  r  r  r  r  rv  )r'   r  r  	bytes_outr  s        r(   pil_tobyteszPixmap.pil_tobytes5  sw     JLL	nn%%!Y	2F5M,T,,,V,,,!!###r)   c                    t           r t          j        | j        j        ||          S 	 |dk     s0|| 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_OUTSIDEr]  rD   r/  r   
samples_mv)r'   r$  r%  rD   r/  r   rF   s          r(   rp  zPixmap.pixel5  s      	B%di&:AqAAA	9q55	,...q55	,...%'7888I "%,QJQT_a1f-..
r)   r  c                 .    | j         }t          |          S r+   )r  r  )r'   mvs     r(   rI  zPixmap.samples6  s    _bzzr)   c                 Z    | j         t          j        | j                  | _         | j         S )z,
        Pixmap samples memoryview.
        )r  r   r.  r   r-   s    r(   r  zPixmap.samples_mv
6  s+     #$A$)LLDr)   c                 J    | j         r| j                                          d S d S r+   r  releaser-   s    r(   _samples_mv_releasezPixmap._samples_mv_release6  2     	'$$&&&&&	' 	'r)   c                 4    t          j        | j                  S r+   )r   fz_pixmap_samples_intr   r-   s    r(   samples_ptrzPixmap.samples_ptr6  s    *49555r)   _   c                    ddddddddddd
}t          |          t          u rn7t          |d          rt          |          }nt          |d	          r|j        }|,t          j                            |          \  }}|dd
         }|                    |                                d
          }|4t          d| dt          |                                                     | j        r|dv rt          d|z            | j        r'| j        j        dk    r|dv rt          d| d          |dk    r |                     | 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  z'%s' cannot have alphar   r   rI  unsupported colorspace for 'r   )r   r   r:   r   rc   r	   splitextr7   r  r   r   r  r  r  rD   r  r  r  rc  )r'   re   r  rY  valid_formatsr  r  r6  s           r(   r  zPixmap.save6  s      >>S  Xz** 	%8}}HHXv&& 	%}H>W%%h//FAsWF55;ZVZZU=CUCUCWCW=X=XZZ[[[: 	@#**5>???? 	Gt0144	9I9IEFEEEFFF!88LLDI...~~h[999r)   c                    | j         }d}d}|                                dk    rt          t                    t	          j        |          }t	          j        |          }	t	          j        |          }
|	|
z  |dz   z  }g d}g d}d}d}|rNt          |t          t          f          r2t          |          |k    rt          |          D ]}||         ||<   d}|rNt          |t          t          f          r2t          |          |k    rt          |          D ]}||         ||<   d}t                      }d}|r`t          |t          t          f          r|}t          |          }nJ dt          |                       ||	|
z  k     rt          d          	 t	          j        ||||t	          j        |          |j        ||||
  
         dS )	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 valuesr	  c                 ,    | |z  dz   }||dz  z  }|dz  S )N   r  r,   )r    r
  r$  s      r(   	fz_mul255z#Pixmap.set_alpha.<locals>.fz_mul2556  s%    ECKQ#X Cxr)   N)r   r  r   r%  r   r)  r*  r+  r=   r   r   r6   rK  r  r]  r   Pixmap_set_alpha_helperr  r   r1  r0  )r'   alphavaluespremultiplyopaquematter  r  r  rD   r   r  balenr  rx  zero_outbgroundr   r}  data_lenr  r  data_fixr  s                          r(   	set_alphazPixmap.set_alphaH6  s    i99;;!o...%c**!#&&"3''A1,, 	j$77 	CKK1<L<L1XX & &"1Iq		H 	Z66 	3u::??1XX & &"1X

Gww 	6 +y'9:: R"{++QQd;>O>OQQQQQ!a% "4555.	),d33N    r)   r  c                    ddddddddddddd}|                     |                                d	          }|4t          d
| dt          |                                                     | j        r|dv rt          d          | j        r'| j        j        dk    r|dv rt          d| d          |dk    r |                     | j	        | j
                   |                     ||          }|S )zA
        Convert to binary image stream of desired type.
        r   r   r   rI  r   r  r  )r  r  r  r  r  r  tgatpicr  r  r  r  Nr  r  r  z'{output}' cannot have alphar  r  r   )r7   r  r   r   r  r  r  rD   r  r  r  r[  )r'   r  rY  r  r6  rZ  s         r(   r  zPixmap.tobytes6  s%   
   55;ZVZZU=CUCUCWCW=X=XZZ[[[: 	=#**;<<<? 	Gt0144	9I9IEFEEEFFF!88LLDI...sK00r)   c                 D    | j         }||j        _        ||j        _        dS )z"Set resolution in both dimensions.N)r   r   r  r  )r'   r  r  r  s       r(   r  zPixmap.set_dpi6  s#    Y!!r)   c                 D    | j         }||j        _        ||j        _        dS )zSet top-left coordinates.N)r   r   r$  r%  )r'   r$  r%  r  s       r(   
set_originzPixmap.set_origin6  s    Yr)   c                 l   t           r!t          j        | j        j        |||          S | j        }t          |d|                                dz
            r&t          |d|                                dz
            st          t                    |
                                }t          |          D ]/}||         }t          |dd          st          t                    0t          j        |          }||z  ||z  z   }	 t          |          D ]!}|                    ||z   ||                    "dS )zSet color of pixel (x, y).r   r   r	  N)r  r   	set_pixelr   r   r  r   r  r   r  rD   rK  MSG_BAD_COLOR_SEQr   rQ  r  r  r0  )	r'   r$  r%  r  r  rD   r  r   r/  s	            r(   r  zPixmap.set_pixel6  s7    	F?49#7AuEEEY1bddffqj)) 	1!Q
1K1K 	1/000DDFFq 	5 	5AaAAq#&& 5 "34445',,QJQ		3 1XX 3 3!!!a%q22223 3r)   c                 F   | j         }|                                }g }t          |          D ]D}||         }t          |dd          st	          t
                    |                    |           Et          |          }t          |||          }t          |          }|S )z Set color of all pixels in bbox.r   r	  )
r   rD   rK  r  r   r  rj   r  JM_fill_pixmap_rect_with_colorr6  )	r'   r.  r  r  rD   r  r  r   r   s	            r(   r  zPixmap.set_rect6  s    YDDFFq 	 	AaAAq#&& 5 "3444HHQKKKK%%*2q$77!WW	r)   c                     |dk     rt          d           dS t          j        | j        |           d| _        |                                  dS )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  sV     A::8999F!49f555   """""r)   c                 4    t          j        | j                  S )zPixmap size.)r   fz_pixmap_sizer   r-   s    r(   r  zPixmap.size7  s     $di000r)   c                 4    | j                                         S )z%Length of one image line (width * n).)r   r/  r-   s    r(   r/  zPixmap.stride	7  s     y!!!r)   c                     | j         r| j         j        dk    rt          d           dS t          j        | j        ||          S )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)r  rD   rq   r   fz_tint_pixmapr   )r'   blackwhites      r(   	tint_withzPixmap.tint_with7  sF     	$/"3a"7"7>???F#TYu===r)   c                 4    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   rS  r  rN  rM  rL  r   fz_warp_pixmapr   r  )r'   r  r[  r  rW  r  r
  s          r(   warpzPixmap.warp7  s_    ~FZ0E%F%FFD!!4qtQT*"DIvufEEs||r)   c                 4    t          j        | j                  S )zx component of Pixmap origin.)r   fz_pixmap_xr   r-   s    r(   r$  zPixmap.x"7        +++r)   c                 4    | j                                         S )zResolution in x direction.)r   r  r-   s    r(   r  zPixmap.xres'7       y~~r)   c                 4    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                 4    | j                                         S )zResolution in y direction.)r   r  r-   s    r(   r  zPixmap.yres17  r  r)   c                 J    | j         r| j                                          d S d S r+   r  r-   s    r(   r  zPixmap.__del__97  r  r)   r	  r  r+   )r   NN)Tr  N)Nr  )Nr   NN)r  r  )6r.   r/   r0   r   r'  r   r[  rc  r2  r  r  rl  rr  r  r\  r  rz  r  r  rO  r  r  rD   r  r  r  r  r  rp  r  rI  r  r  r  r  r  r  r  r  r  r  r  r  r/  r  r   r  r$  r  r%  r  r[  r  r  r,   r)   r(   r  r  3  s	       V# V# V#p  K K K  *F F F 0 0 X0V V V V   + + + +   Xi i i   X
1 1 1 1 1 X1    & & X&
 9 9 X9   X* 
5 
5 X
5& & & &*   *  *" " "$ $ $"  $ u    X 
  
  X
 ' ' ' 6 6 X6': ': ': ':R] ] ] ]~   <" " "  3 3 32  	# 	# 	# 1 1 X1 " " X"> > > 0 0 X0   , , X,     X  , , X,     X  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dS )r  c                 d    t          j        | j        | j        z  | j        | j        z  z             S r+   )r  r  r$  r%  r-   s    r(   r  zPoint.__abs__A7  s'    y$&46DF?:;;;r)   c                     t          |d          r t          | j        |z   | j        |z             S t	          |          dk    rt          d          t          | j        |d         z   | j        |d         z             S Nrh  r   Point: bad seq lenr   r   r:   r  r$  r%  r6   r   r'   r  s     r(   r   zPoint.__add__D7  r    1k"" 	1!TVaZ000q66Q;;1222TVad]DFQqTM222r)   c                 X    t          |           t          |           cxk    odk    nc  S r   r#  r-   s    r(   r$  zPoint.__bool__K7  r%  r)   c                 X    t          |d          sdS t          |          dk    o| |z
   S )Nr'  Fr   r'  r  s     r(   r(  zPoint.__eq__N7  s4    q)$$ 	51vv{-D1H~-r)   c                 *    | j         | j        f|         S r+   r$  r%  r  s     r(   r_  zPoint.__getitem__S7  s    ""r)   c                 :    t          t          |                     S r+   rl  r   r-   s    r(   rm  zPoint.__hash__V7      E$KK   r)   Nr  c                   |sd| _         d| _        nIt          |          dk    rt          d          t          |          dk    r5t	          |d                   | _         t	          |d                   | _        nt          |          dk    r|d         }t          |t          j        t          j        f          r|j         | _         |j        | _        nt          |d          st          d          t          |          dk    rt          d          t	          |d                   | _         t	          |d                   | _        nt          d          ||| _         |	|| _        dS dS )	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%  r6   r   rm  r=   r   r"  fz_pointr:   )r'   r$  r%  r  r  s        r(   r   zPoint.__init__Y7  sD     	3DFDFFYY]]1222YY!^^47^^DF47^^DFFYY!^^QA!emU^<== 	%q-00 8$%6777q66Q;;$%9:::qtqt1222=QDF=QDFFF==r)   c                     dS Nr   r,   r-   s    r(   r'  zPoint.__len__{7  r8  r)   c                 2   t          |d          r t          | j        |z  | j        |z            S t          |d          r4t	          |          dk    r!| j        |d         z  | j        |d         z  z   S t          |           }|                    |          S )Nrh  r_  r   r   r   )r:   r  r$  r%  r6   r  )r'   r  r  s      r(   r;  zPoint.__mul__~7  s    1k"" 	1!TVaZ0001m$$ 	1Q16AaD=46AaD=00$KK{{1~~r)   c                 :    t          | j         | j                   S r+   )r  r$  r%  r-   s    r(   r=  zPoint.__neg__7  s    dfWtvg&&&r)   c                 X    t          |           t          |           cxk    odk    nc  S r   r#  r-   s    r(   r?  zPoint.__nonzero__7  r%  r)   c                      t          |           S r+   r  r-   s    r(   rA  zPoint.__pos__7  r  r)   c                 @    dt          t          |                     z   S )Nr  rC  r-   s    r(   r   zPoint.__repr__7      U4[[))))r)   c                 z    t          |          }|dk    r|| _        n|dk    r|| _        nt          d          d S )Nr   r   rE  )rm  r$  r%  r  rF  s      r(   rG  zPoint.__setitem__7  sC    !HH!VVaTVV!VVaTVV1222tr)   c                     t          |d          r t          | j        |z
  | j        |z
            S t	          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
            S r  r  r  s     r(   rI  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          |           }|                    |          S rK  )r:   r  r$  r%  rL  rM  r  )r'   r  r5  r  s       r(   rO  zPoint.__truediv__7  s|    1k"" 	7"QA666""1% 	=#$;<<<$KK{{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%  rV  r  r  r  r  r'   rp  s     r(   abs_unitzPoint.abs_unit7  sj     FTVOdftvo-w;;1::IaLLS[[1_c$&kkAo666r)   c                    t          |          dk    st          d          |d         }t          |          dk    rt          |          }n2t          |          dk    rt          |          }nt          d          t          |          dk    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dS | j        |j	        k    rh| j
        |j        k    r|                     |j        |          S | j
        |j        k    r|                     |j        |          S | j        |j	        z
  |z  S |j        | j        cxk    r|j	        k    r7n n4| j
        |j        k    r| j
        |j        z
  |z  S |j        | j
        z
  |z  S | j
        |j        k    r|                     |j        |          S | j
        |j        k    r|                     |j        |          S |j        | j        z
  |z  S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenr   rI  z$arg1 must be point-like or rect-liker   r[  )r  r  r        R@gRQ@r!  gffffff9@r!  r[  incmmmr  )r6   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  s6   4yy1}}CDDDGq66Q;;aAAVVq[[QAACDDDt99q==7DDD(+   dGAJ4#77etax==1$$ QZ((19936AD==v~~''===14''T:::**TTV####qt#####v~~**tv**v~~''t<<<14''
D999tv**r)   c                     t          |          dk    rt          d          t          | |          \  | _        | _        | S )z7Replace point by its transformation with matrix-like m.r  r  )r6   r   util_transform_pointr$  r%  r)  s     r(   r  zPoint.transform7  s<    q66Q;;2333-dA6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%  rV  r  r  r  r  s     r(   r-  z
Point.unit7  s^     FTVOdftvo-w;;1::IaLLTVaZ!,,,r)   )r.   r/   r0   r  r   r$  r(  r_  rm  r   r'  r;  r=  r?  rA  r   rG  rI  rO  r2  r  r*  r  r-  rg  rh  r,   r)   r(   r  r  ?7  sq       < < <3 3 31 1 1. . .
# # #! ! ! !%  '  '  '  '  'D    ' ' '1 1 1  * * *  3 3 3   7 7 X70+ 0+ 0+d   - - X- GDDDr)   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dS )r  c                     | j         rdS t          | j        | j        z
            t          | j        | j        z
            z  S Nr  )r  r  r  rN  rL  r-   s    r(   r  zQuad.__abs__7  s>    = 	347TW$%%DGdg,=(>(>>>r)   c                 ^   t          |d          r2t          | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z             S Nrh  rI  Quad: bad seq lenr   r   r   r   r:   r  r  rN  rL  rM  r6   r   r'   rW  s     r(   r   zQuad.__add__8      1k"" 	L!TWq[$'A+tw{KKKq66Q;;0111DGadNDGadNDGadNDGaPQdNSSSr)   c                     | j          S r+   r  r-   s    r(   r$  zQuad.__bool__8      =  r)   c                    	 |                                 }n*# t          $ r t          dk    rt                       Y dS w xY w|dk    rt	          ||           S |dk    rdS t          |          rFt          |          j        rdS t	          |d d         |           ot	          |dd          |           S t          |          r-t          d          D ]}t	          ||         |           s dS dS dS )Nr   Fr   rI  T)
r'  rf   r	  ru   util_point_in_quad	CheckRectr#  r  	CheckQuadrK  )r'   r$  r  r   s       r(   r  zQuad.__contains__8  s   			AA 	 	 	#a''N,<,<,<55	 66%a...665Q<< 	WAww t%aeT22V7I!ABB%QU7V7VVQ<< 	1XX ! !)!A$55 ! 55!4us    #>>c                     t          |d          sdS t          |          dk    oC| j        |d         k    o2| j        |d         k    o!| j        |d         k    o| j        |d         k    S Nr'  FrI  r   r   r   r   )r:   r6   r  rN  rL  rM  )r'   r  s     r(   r(  zQuad.__eq__ 8  sy    tY'' 	54yyA~ 
GtAw GtAwGtAw GtAw		
r)   c                 B    | j         | j        | j        | j        f|         S r+   r  rN  rL  rM  r  s     r(   r_  zQuad.__getitem__*8      $'473A66r)   c                 :    t          t          |                     S r+   r  r-   s    r(   rm  zQuad.__hash__-8  r  r)   NrE  c                $   |s*t                      x| _        x| _        x| _        | _        nt          |          dk    rt          d          t          |          dk    r0t          t           |          \  | _        | _        | _        | _        n$t          |          dk    r|d         }t          |t          j
                  ro|| _        t          |j                  t          |j                  t          |j                  t          |j                  f\  | _        | _        | _        | _        nt          |d          st          d          t          |          dk    rt          d          t          t           |          \  | _        | _        | _        | _        nt          d          |t          |          | _        |t          |          | _        |t          |          | _        |t          |          | _        dS dS )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.
    
        rI  r7  r   r   r_  zQuad: bad argsN)r  r  rN  rL  rM  r6   r   r  r=   r   FzQuadr   r:   )r'   r  rN  rL  rM  r  r  s          r(   r   zQuad.__init__08  s     	/49GG;DG;dg;$''YY]]0111YY!^^14UD1A1A.DGTWdgtwwYY!^^QA!U\** C	5:14[[%++uUVUY{{\abcbf\g\g5g2$'477Q.. C !1222Q1 !455558]]2$'477-...>eBiiDG>eBiiDG>eBiiDG>eBiiDGGG>>r)   c                     dS NrI  r,   r-   s    r(   r'  zQuad.__len__S8  r8  r)   c                 N    t          |           }|                    |          }|S r+   )r  r  )r'   r  rW  s      r(   r;  zQuad.__mul__V8  s!    JJKKNNr)   c                 V    t          | j         | j         | j         | j                   S r+   )r  r  rN  rL  rM  r-   s    r(   r=  zQuad.__neg__[8  &    TWHtwh47(;;;r)   c                     | j          S r+   r<  r-   s    r(   r?  zQuad.__nonzero__^8  r=  r)   c                      t          |           S r+   )r  r-   s    r(   rA  zQuad.__pos__a8      Dzzr)   c                 @    dt          t          |                     z   S )Nr  rC  r-   s    r(   r   zQuad.__repr__d8      E$KK((((r)   c                     |dk    rt          |          | _        n`|dk    rt          |          | _        nE|dk    rt          |          | _        n*|dk    rt          |          | _        nt          d          d S Nr   r   r   r   rE  )r  r  rN  rL  rM  r  rF  s      r(   rG  zQuad.__setitem__g8  sr    !VVuQxxTWW!VVuQxxTWW!VVuQxxTWW!VVuQxxTWW1222tr)   c                 ^   t          |d          r2t          | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
            S r6  r8  r9  s     r(   rI  zQuad.__sub__p8  r:  r)   c                     t          |d          rd|z  }n&t          |          d         }|st          d          t          |           }|                    |          }|S )Nrh  r  r   zMatrix not invertible)r:   rL  rM  r  r  )r'   r  r  rW  s       r(   rO  zQuad.__truediv__w8  si    1k"" 	AaBB#A&&q)B A'(?@@@JJKKOOr)   c                    t          | j        | j                  }| j        |z  }| j        |z  }|j        |j        z  dk    rdS t          | j        | j                  }| j        |z  }| j        |z  }|j        |j        z  dk    rdS dS )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  rM  rL  rN  r%  )r'   r  r  r	  s       r(   r  zQuad.is_convex8  s     $'**Wq[Wq[4"$;??5$'**Wq[Wq[4"$;??5tr)   c                 B    | j         t          k     p| j        t          k     S )zsCheck whether all quad corners are on the same line.

        This is the case if width or height is zero.
        )r[  rV  r  r-   s    r(   r  zQuad.is_empty8  s     zG#<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     y$$r)   c                 t   t          | j        | j        | j                  }t	          |dz
            t
          k    rdS t          | j        | j        | j                  }t	          |dz
            t
          k    rdS t          | j        | j        | j                  }t	          |dz
            t
          k    rdS dS )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  rN  rM  r  rV  rL  )r'   sines     r(   is_rectangularzQuad.is_rectangular8  s     !$'47;;tax==7""5 $'47;;tax==7""5 $'47;;tax==7""5tr)   c                     | j         rt                      S t          dd                              |j        |j                  }| | z  |z  |z  }|S )zSMorph the quad with matrix-like 'm' and point-like 'p'.

        Return a new quad.r   )r  INFINITE_QUADrt  re  r$  r%  )r'   r  r  deltarW  s        r(   r  z
Quad.morph8  sT      	# ??"q!))!#qs33E6MA%r)   c                    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$  rN  rM  rL  r	  r%  r  r  r  r
  r'   r  s     r(   r   z	Quad.rect8  s    FF479dgiDGI>>479dgiDGI>>479dgiDGI>>479dgiDGI>>r)   c                     t          |d          rn"t          |          dk    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.rh  r  r  )r:   r6   r   r  rN  rL  rM  r)  s     r(   r  zQuad.transform8  sv    1k"" 	4VVq[[23331111r)   c                     t          t          | j        | j        z
            t          | j        | j        z
                      S r+   )r  r  r  rN  rL  rM  r-   s    r(   rr	  zQuad.<lambda>8  2    3s47TW+<'='=s47TWCT?U?U#V#V r)   c                     t          t          | j        | j        z
            t          | j        | j        z
                      S r+   )r  r  r  rL  rN  rM  r-   s    r(   rr	  zQuad.<lambda>8  rg  r)   )r.   r/   r0   r  r   r$  r  r(  r_  rm  r   r'  r;  r=  r?  rA  r   rG  rI  rO  r2  r  r  r  r_  r  r   r  rg  r[  r  r,   r)   r(   r  r  7  s       ? ? ?
T T T! ! !  *
 
 
7 7 7! ! ! "&$4D !0 !0 !0 !0 !0F    
< < <! ! !  ) ) )  T T T	 	 	   X* = = X= % % X%   X0     X
 
 
 GXVVWWEXVVWWFFFr)   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ef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Z0 ee(          Z1e)Z2e*Z3d	S )-r#  c                 `    | j         s| j        rdS | j        | j        z
  | j        | j        z
  z  S r4  )r  r  r  r	  r
  r  r-   s    r(   r  zRect.__abs__8  s8    = 	D, 	3$'!dg&788r)   c                 ^   t          |d          r2t          | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z             S Nrh  rI  Rect: bad seq lenr   r   r   r   r:   r#  r	  r  r  r
  r6   r   r  s     r(   r   zRect.__add__8  r:  r)   c                     t          |d          st          d          t          |          }t          |           }|                    |          S )Nr'  bad operand 2)r:   r   r#  	intersect)r'   r$  r'  r  s       r(   __and__zRect.__and__8  sH    q)$$ 	._---!WWJJ{{2r)   c                 X    t          |           t          |           cxk    odk    n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          |          }n=# t          $ r0 t          dk    rt                       t          |          j
        }Y nw xY w| j        |j        cxk    o|j        cxk    o
| j        k    nc o*| j        |j        cxk    o|j        cxk    o
| j        k    nc S dS )Nrh  r   rI  r   F)r:   r   r6   util_is_point_in_rectINFINITE_RECTr#  rf   r	  ru   r  r   r	  r  r  r
  )r'   r$  r  r  s       r(   r  zRect.__contains__8  s*   1k"" 	$d##FF66(D11166A!GG ! ! !'!++0@0@0@GGL! Gqt6666qt6666tw6666 7Gqt6666qt6666tw66668us   A, ,7B&%B&c                 X    t          |d          sdS t          |          dk    o| |z
   S )Nr'  FrI  r'  r  s     r(   r(  zRect.__eq__9  s5    tY'' 	54yyA~3td{"33r)   c                 B    | j         | j        | j        | j        f|         S r+   r	  r  r  r
  r  s     r(   r_  zRect.__getitem__9  rF  r)   c                 :    t          t          |                     S r+   r  r-   s    r(   rm  zRect.__hash__9  r  r)   Nru  r  r	  r  r  r
  c          
          t          |||||||d\  }}}}t          |          | _        t          |          | _        t          |          | _        t          |          | _        dS )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.
        r{  N)util_make_rectrm  r	  r  r  r
  r'   ru  r  r	  r  r  r
  r  s           r(   r   zRect.__init__9  sa     ($2"rVXYYYBB********r)   c                     dS rK  r,   r-   s    r(   r'  zRect.__len__*9  r8  r)   c                     t          |d          r2t          | j        |z  | j        |z  | j        |z  | j        |z            S t          |           }|                    |          }|S )Nrh  )r:   r#  r	  r  r  r
  r  )r'   r  r  s      r(   r;  zRect.__mul__-9  s`    1k"" 	L!TWq[$'A+tw{KKKJJKKNNr)   c                 V    t          | j         | j         | j         | j                   S r+   )r#  r	  r  r  r
  r-   s    r(   r=  zRect.__neg__49  rN  r)   c                 X    t          |           t          |           cxk    odk    nc  S r   r#  r-   s    r(   r?  zRect.__nonzero__79  r%  r)   c                    t          |d          st          d          t          |           }t          |          dk    r|                    |          S t          |          dk    r|                    |          S t          d          )Nr'  rp  r   rI  )r:   r   r#  r6   include_pointinclude_rect)r'   r$  r  s      r(   __or__zRect.__or__:9  s}    q)$$ 	._---JJq66Q;;??1%%%q66Q;;>>!$$$)))r)   c                      t          |           S r+   r
  r-   s    r(   rA  zRect.__pos__D9  rQ  r)   c                 @    dt          t          |                     z   S )Nr#  rC  r-   s    r(   r   zRect.__repr__G9  rS  r)   c                     t          |          }|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S rU  )rm  r	  r  r  r
  r  rF  s      r(   rG  zRect.__setitem__J9  se    !HH!VVqTWW!VVqTWW!VVqTWW!VVqTWW1222tr)   c                 ^   t          |d          r2t          | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
            S rl  rn  r  s     r(   rI  zRect.__sub__T9  r:  r)   c                 <   t          |d          r>t          | j        dz  |z  | j        dz  |z  | j        dz  |z  | j        dz  |z            S t          |          d         }|st          d|           t          |           }|                    |          }|S )Nrh  r  r   zMatrix not invertible: )	r:   r#  r	  r  r  r
  rL  rM  r  )r'   r  r  r  s       r(   rO  zRect.__truediv__[9  s    1k"" 	X"Q"Q"QRTUVWWW""1% 	C#$Aa$A$ABBBJJKKOOr)   c                 6    t          | j        | j                  S zBottom-left corner.r  r	  r
  r-   s    r(   r,  zRect.bottom_lefte9       TWdg&&&r)   c                 6    t          | j        | j                  S zBottom-right corner.r  r  r
  r-   s    r(   r)  zRect.bottom_rightj9  r  r)   c                 ,    |                      |          S )z.Check if containing point-like or rect-like x.r  r  s     r(   containszRect.containso9        ###r)   c                 <    t          d| j        | j        z
            S r   r  r
  r  r-   s    r(   r  zRect.heights9      1dg'(((r)   r  c                 8    t          | j        | j        |          S zUCalculate area of rectangle.
parameter is one of 'px' (default), 'in', 'cm', or 'mm'.
_rect_arear[  r  r>  s     r(   get_areazRect.get_areaw9      $*dk4888r)   c                     t          |          dk    rt          d          t          | |          \  | _        | _        | _        | _        | S )zExtend to include point-like p.r   r  )r6   r   util_include_point_in_rectr	  r  r  r
  r  s     r(   r  zRect.include_point{9  sE    q66Q;;1222-Ga-P-P*$'47r)   c                    t          |          dk    rt          d          t          |          }|j        s| j        r4t          t          t
          t
          f\  | _        | _        | _        | _	        nm|j
        r| S | j
        r4|j        |j        |j        |j	        f\  | _        | _        | _        | _	        n)t          | |          \  | _        | _        | _        | _	        | S )zExtend to include rect-like r.rI  rm  )r6   r   r#  r  r5  r6  r	  r  r  r
  r  util_union_rectrd  s     r(   r  zRect.include_rect9  s    q66Q;;0111GG= 	JD, 	J1@/Sbds1s.DGTWdgtwwZ 	JK] 	J12qtQT141G.DGTWdgtww1@q1I1I.DGTWdgtwr)   c                    t          |          dk    st          d          t          |          }|j        r| S | j        r4|j        |j        |j        |j        f\  | _        | _        | _        | _        nm|j        r4|j        |j        |j        |j        f\  | _        | _        | _        | _        n2| j        r| S t          | |          \  | _        | _        | _        | _        | S )z)Restrict to common rect with rect-like r.rI  rm  )
r6   r   r#  r  r	  r  r  r
  r  util_intersect_rectrd  s     r(   rq  zRect.intersect9  s    1vv{{0111GG= 		NK 	N12qtQT141G.DGTWdgtwwZ 	N12qtQT141G.DGTWdgtww] 	NK1DT11M1M.DGTWdgtwr)   c                     t          |          }	 | j         oW| j         oO|j         oG|j         o?| j        |j        k     o/|j        | j        k     o| j        |j        k     o|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'%'((' &' ))	'
 Geh&' Htw&' Geh&' Htw&		r)   c                 B    | j         | j        k    p| j        | j        k    S z True if rectangle area is empty.r5  r-   s    r(   r  zRect.is_empty9  !     w$'!7TW%77r)   c                 ~    | j         | j        cxk    o
t          k    nc o| j        | j        cxk    o
t
          k    nc S )z'True if this is the infinite rectangle.r	  r  r5  r  r
  r6  r-   s    r(   r  zRect.is_infinite9  O     w$'4444_4444^DG9^9^9^9^9^9^9^9^^r)   c                 B    | j         | j        k    o| j        | j        k    S zTrue if rectangle is valid.r5  r-   s    r(   is_validzRect.is_valid9  !     w$'!8dg&88r)   c                 b    | j         rt                      S | j                            ||          S zGMorph with matrix-like m and point-like p.

        Returns a new quad.r  ra  r  r  r'   r  r  s      r(   r  z
Rect.morph9  /      	# ??"yq!$$$r)   c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r,   r,   r  s     r(   r   zRect.norm.<locals>.<listcomp>9  r  r)   r  r-   s    r(   rh  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  M    7TW#wDGTW7TW#wDGTWr)   c                 N    t          | j        | j        | j        | j                  S z!Return Quad version of rectangle.r  r  r  rX  r  r-   s    r(   r  z	Rect.quad9        DGTWdgtw777r)   c                 :    t          t          |                     S )zReturn the IRect.)r   util_round_rectr-   s    r(   r-  z
Rect.round9  s    _T**+++r)   c                 6    t          | j        | j                  S zTop-left corner.r  r	  r  r-   s    r(   r(  zRect.top_left9  r  r)   c                 6    t          | j        | j                  S zTop-right corner.r  r  r  r-   s    r(   r+  zRect.top_right9  r  r)   c           	      J   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   rt  r	  r  r[  r  rd  s     r(   torectzRect.torect9  s     GG 	Ht} 	H 	H 	HFGGG1aAx$'22QWtz)18dk+ABBCQ1aqt,,-	
r)   c                     t          |          dk    st          d          t          | |          \  | _        | _        | _        | _        | S )z1Replace with the transformation by matrix-like m.r  r  )r6   r   util_transform_rectr	  r  r  r
  r)  s     r(   r  zRect.transform9  sE    1vv{{2333-@q-I-I*$'47r)   c                 <    t          d| j        | j        z
            S r   r  r  r	  r-   s    r(   r[  z
Rect.width9  r  r)   )4r.   r/   r0   r  r   rr  r$  r  r(  r_  rm  r   r'  r;  r=  r?  r  rA  r   rG  rI  rO  r2  r,  r)  r  r  rm  r  r  r  rq  r  r  r  r  r  rh  r  r  r-  r(  r+  r  r  r[  rg  rX  r  rO  r  r  r,   r)   r(   r#  r#  8  sC       9 9 9
T T T  1 1 1  "4 4 4
7 7 7! ! ! "&$4DTd     &    < < <1 1 1* * *  ) ) )  T T T   ' ' X' ' ' X'$ $ $ ) ) X)9 9 9 9 9      "   8 8 X8 _ _ X_ 9 9 X9% % %3 3 3   8 8 X8, , , ' ' X' ' ' X'

 

 

   ) ) X) G	B	BHUOOE	B	BBBr)   r#  c            +          e Zd ZdZed             ZdefdZd Zde	de	de
fd	Zd
ede
fdZde	de	de	de	de
f
dZdej        eef         de
fdZde	dede
fdZde	de	de	de
fdZ	 dKde	de	dedede
f
dZdddede
fdZdede
fdZ	 dLde	de	d!ede
fd"Z	 dLde	de	de
fd#Zd$dd%dd&d&ddd&d'd(d&dd(d(d&d)de	d*ej        eef         d+ed,ed-ed.ed/ed0e d1e!d2e!d3e d4ed5ed6e d7e!d8ed9ed:e de f&d;Z"d%dd$dd&d&ddd(d'd(d&d&d&dd(d(d&d<ded*ej        eef         d-ed.ed+ed,ed/ed0e d1e!d2e!d=e d4ed5ed>e d3e d6e d7e!d8ed9ed:e def*d?Z#	 	 	 	 	 	 	 	 	 	 	 	 dMdBed1e!d2e!dCe dDe dEedFed7e!dGed9ed8ed:e ddfdHZ$dKdIeddfdJZ%dS )Nr  zCreate a new shape.c                    t          || z
            j        }t          j        t	          |j                            }|j        dk     r,|j        dk    rt          j        |z
   }nt          j        |z
  }n|j        dk    rn| }|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_angle:  sz     !a%LLyQS""377saxx4(w~saxxur)   r   c                    t          |           || _        |j        | _        | j        j        st          d          |j        j        | _        |j        j	        | _
        |j        j	        | _	        |j        j        | _        |j        | _        | j         | _        d| _        d| _        d| _        d | _        d | _        d S )Nr  r[   )re  r   r   r)  r  r   r  r%  r  r$  r[  r  rj  pctmipctmr  	text_cont	totalcontr  r   rE  s     r(   r   zShape.__init__:  s    D	;x 	*[)))(*')
&(&(.	iZ
			r)   c                    | j         @t          |          dk    rt          ||          | _         d S t          |          | _         d S t          |          dk    rt          |          }t	          | j         j        |j                  | j         _        t	          | j         j        |j                  | j         _        t          | j         j
        |j                  | j         _
        t          | j         j        |j                  | j         _        d S t          |          }t	          | j         j        |j                  | j         _        t	          | j         j        |j                  | j         _        t          | j         j
        |j
                  | j         _
        t          | j         j        |j                  | j         _        d S r  )r   r6   r#  r  r  r	  r$  r  r%  r  r  r
  r  s     r(   
updateRectzShape.updateRect0:  s4   91vv{{ AJJ			 GG			 1vv{{!HH"49<55	"49<55	"49<55	"49<55	GG"49<66	"49<66	"49<66	"49<66	r)   r  r	  r  c                    t          |          }t          |          }| j        |k    sQ| xj        t          t	          || j        z                      dz   z  c_        || _        |                     |           | xj        t          t	          || j        z                      dz   z  c_        |                     |           || _        | 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_lineE:  s    2YY2YY2%%NNidj(A(ABBVKKNN DOOOB)HR$*_$=$=>>GGr)   r  c           
         t          |          D ]\  }}|dk    ro| j        t          |          k    sV| xj        t	          t          t          |          | j        z                      dz   z  c_        t          |          | _        nB| xj        t	          t          t          |          | j        z                      dz   z  c_        |                     |           t          |d                   | _        | j        S )z%Draw several connected line segments.r   r  r  r0  )r  r  r  r  r   r  r  r  )r'   r  r   r  s       r(   r  zShape.draw_polylineS:  s    f%% 	 	DAqAvv58833NNiqDJ9N0O0O&P&PSY&YYNN&+AhhDO)HU1XX
5J,K,K"L"Lv"UUOOAr
++r)   r  r  c                    t          |          }t          |          }t          |          }t          |          }| j        |k    s5| 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        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_beziera:  s    2YY2YY2YY2YY2%%NNidj(A(ABBVKKNNR$*_--R$*_0E0EERRVR\_H]H]]^^)D//F22r)   tetrac                 H   t          |          dk    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
        S )z"Draw an ellipse inside a tetrapod.rI  zinvalid arg lengthr   rh  rT  r  )r6   r   r:   r#  r  r  r  rN  rM  rL  r  r  r   r  r  r  r  r   )r'   r  rW  mtmrr  mls          r(   r  zShape.draw_ovalx:  sw   u::??122258[)) 	U AAUATQTAD[C''TQTAD[C''TQTAD[C''TQTAD[C''2%%NNidj(A(ABBVKKNN DOAD"%%%AD"%%%AD"%%%AD"%%%r)   r>  r  c                     |t           k    st          d          t          |          }||dfz
  }|                     ||dd          S )r  radius must be positiver   r  Fr  )rV  r   r  r  )r'   r>  r  r  s       r(   r  zShape.draw_circle:  sR    6777vvqk!CEBBBr)   c                     d}t          |          }t          |          }t          |          }|||z
  |z  z   }|||z
  |z  z   }|                     ||||          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:  sj     2YY2YY2YY27e##27e##BB///r)   Tr)  r  r  c                 *   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  k    r%||	z  }t	          |          dt          j        z  k    %| j        |k    s/| xj         |t          || j	        z             z  c_        || _        t          dd          }|}|}||z
  }t	          |          }|t          k    st          d	          |                     ||          }t	          |          t	          |
          k    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	          |
          k    t	          |          dk    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_        |rx| 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(   rr	  z#Shape.draw_sector.<locals>.<lambda>:      )QF++f4 r)   c                 2    t          | |||||f          dz   S )Nr  r  r*  s         r(   rr	  z#Shape.draw_sector.<locals>.<lambda>:  s     iAq!Q0B&C&Cf&L r)   c                 *    t          | |f          dz   S )Nr  r  r  s     r(   rr	  z#Shape.draw_sector.<locals>.<lambda>:  r  r)   r  r0  r  r   r   r  r   rI  r   MbP?)r  r  r,  copysignr  r  r  r  r  r  rV  r   r  r$  r.  r%  r/  r   )r'   r>  r)  r  r  l3l4l5betarw360w90w45r   r  r  r#	  rY  r  q1q2r'  r(  r  kappahr  cp1cp2beta2s                               r(   r  zShape.draw_sector:  s5    ve44LL44dU##|DM#u5566"=l4=U3344Ag%jj1tw;&&TME %jj1tw;&&5((NNbb(54:+=">">??NN#DO!QKKE!ffW}}6777$$VU33%jj3s88##txs
++c11Btxs
++c11Bb"Atxs
++c1DHSMMAABtxs
++c1DHSMMAABb"A$(3--'1,q03q1u::=FSQZZ'Eq1uo%Cq1uo%CNNbb(S4:%&&cDJ.>)?)??$q4:~BVBVV# #  NN SLECKDA# %jj3s88##& u::AIEtxu--33Btxu--33Bb"Atxu--3dhuooEEBtxu--3dhuooEEBb"A$(5//)Q.2SQZZ?FSQZZ'1tx+>?Eq1uo%Cq1uo%CNNbb(S4:%&&cDJ.>)?)??$q4:~BVBVV# #  NN  	<NNbb(54:+=">">??NNNNbb(6DJ+>"?"?@@NNNNbb(1tz>":":;;NNr)   Nr  r   c          
      J   t          |          }|~| xj        t          t          t	          |j        | j        z            |j        |j        gz                       dz   z  c_        | 	                    |           |j
        | _        | j        S t          |d          rE|dk    s|dk    rt          d| d          t          |j        |j                  |z  }|df}d|f}nt          |d          rlt          |          d	k    rY|\  }}||j        z  df}d||j        z  f}t          ||          dk    st!          ||          dk    rt          d| d          nt          d| d          |                     |j
        |z   |j        |z
            }	|                     |	|j        |j        |z             }	|                     |	|j        |z
            }	|                     |	|j        |j        |z
            }	|                     |	|j        |z             }	|                     |	|j        |j        |z
            }	|                     |	|j
        |z             }	|                     |	|j
        |j
        |z             | _        | 	                    |           | 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.
        Nz re
rh  r   rT  zbad radius value r   r'  r   )r#  r  r   r  r   rX  r  r[  r  r  r  r  r:   r   r  r6   r  r  r  r  r  )
r'   r   r  r  r  r[  pyrxryrv  s
             r(   r_  zShape.draw_rect:  s    JJ>NNiQTDJ&''17AH*==) )   NN OOAdDO?" 6;'' 	<{{fsll !>V!>!>!>???AGQX&&/AQBQBBVY'' 	<CKK1,<,<FBqw,"BR!(]#B2r{{a3r2;;#4#4 !>V!>!>!>??? $5 ::::;;;^^AD2Iqtby11__Rqtby11^^Br	**__Rqtby11^^Br	**__Rqtby11^^Br	**//"adAD2I>>r)   r  c                     t          |          }|                     |j        |j        |j        |j        |j        g          S )zDraw a Quad.)r  r  r  rL  rM  rN  )r'   r  rW  s      r(   r  zShape.draw_quad$;  s6    JJ!!14qtQT14"@AAAr)   r   r  c                 4   t          |          }t          |          }||z
  }t          |          }dt          t          |d|z  z  d                    z  }|dk     rt	          d          ||z  }t          t          ||                    }| }	g }
t          d|          D ]U}|dz  dk    rt          |d          |z  }n|dz  dk    rt          |d          |z  }n=|
                    ||	z             V| 	                    |g|
z   |gz              |S )z%Draw a zig-zagged line from p1 to p2.rI  r   points too closer   r0  r   )
r  r  r3   r-  r   rt  rK  rK  rj   r  )r'   r  r	  r  r#	  rY  ro  r  r  i_matr  r   r  s                r(   r  zShape.draw_zigzag);  s2    2YY2YYG!ff#eC1w;/3344477/0003YB//00q# 	% 	%A1uzz!RLL2%Q!!QKK"$MM!e)$$$$B4&=B4/000	r)   c                    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 ]h}|dz  dk    rt          ||
           |z  }n0|dz  dk    rt          ||
          |z  }nt          |d          |z  }|                    ||	z             i|g|z   |gz   }t          |          }d}|dz   |k     r=| 
                    ||         ||dz            ||dz                       |dz  }|dz   |k     =|S )z#Draw a squiggly line from p1 to p2.rI  r   r  gh?3OP@r   r   r   )r  r  r3   r-  r   rt  rK  rK  rj   r6   r  )r'   r  r	  r  r#	  rY  ro  r  r  r  r  r  r   r  s                 r(   r  zShape.draw_squiggleF;  s    2YY2YYG!ff#eC1w;/3344477/0003YB//00q# 	% 	%A1uzz!aRLL2%Q!!QKK"$!QKK"$MM!e)$$$$"%&kk!eckkOOF1Iva!e}fQUmDDDFA !eckk 	r)   r  r  r   r  r   )r   rl  r   rL  r  r  r  r   r  r  r  rX  r  r  r  r  r  r   rl  r   rL  r  r  r  r   r  r  r  rX  r  r  r  r  c          
      	   t          |          sdS t          |          t          t          fvr|                                }n|}t          |          dk    sdS t          |          }	 t          d d                    |          D                       }n# t          $ r t                       Y dS w xY w|}|                    d          r
|dd          }| j                            ||||          }t          | j        |          }|d         }|d         }|d         }|d	         }|d
         }|d         }|r||z  }n||z
  dk    r|dz  }n|||z
  z  }|dk    r| j                            ||dz             }n|d         }g } |D ]2}!|r|dvrd }"n|}"|                     t%          |!|"||                     3| }t'          |	d          }#t'          |
d          }$|
s|dk    r|	}
t'          |	d          }$t)          |          }%|}&|&dz  dk    rt+          d          |&dk     r|&dz  }&|&dk     |&dz  }&d }'d }(d})d}*d}+| j        },| j        }-|%rlt1          dddd|d         j        | j        z   |,|d         j        z
  | j        z
            }.|. |d         z  |.z  }/t7          t9          |/                    dz   }0nd}0|,|j        z
  | j        z
  }1|j        | j        z   }2|1}3|&dk    r:|,|j        z
  | j        z
  }2|j         | j        z
  }1|0|)z  }0|-t;          |1          z
  }3n|&dk    r7|, |j        z   | j        z   }2|j        | j        z   }1|0|*z  }0t;          |1          }3nJ|&dk    rD|j         | j        z
  }2|, |j        z   | j        z   }1|0|+z  }0t;          |j        | j        z             }3| j                            |          }4|4d|4z  }5d}6ndx}5}6| j                            ||           }7|7d}7nd!|7z  }7 |'|5|7|0|2|1||          }8|dk    r7|8d"|z  z  }8|8t7          ||z            d#z   z  }8||8t7          |          d$z   z  }8|	|8|#z  }8|
|8|$z  }8|8|d         z  }8d}9t          |          dk    r|8 |(|          z  }8n|8d%z  }8tA          dt          |                    D ]-}:|3|k     r n$|:dk    r|8d&z  }8|8||:         d%z   z  }8|3|z  }3|9dz  }9.|8d'|6z  z  }8| xj!        |8z  c_!        |9S )(Nr   c                 ,    g | ]}t          |          S r,   r
  r  s     r(   r   z%Shape.insert_text.<locals>.<listcomp>;  s    :::a3q66:::r)   r   rD  r   r   rL  r  r  r  r3  r   r1  r2  rS  r	  rA  r@  r?  r  r  r  r  r  c                 b    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(   rr	  z#Shape.insert_text.<locals>.<lambda>;  sQ    -yQ-y-y-yq-y-y)UVXYTZJ[J[-y-ycd-y-ygpqrgsgs-y-y-y r)   c                 (    dt          |            dS )NzTJ
0 -z TD
r  r    s    r(   rr	  z#Shape.insert_text.<locals>.<lambda>;  s    8Yq\\88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  r  /OC /%s BDC
EMC
r  /%s gs
%i Tr  w  M TJz
T* z
ET
%sQ
)"r6  r   r   r   r  r6   r  r  r  rf   ru   r2   r   r  rB  r)  rL  rj   getTJstrr  
CheckMorphr   r  r[  rt  r$  r%  r   r  r  r  r  rK  r  );r'   r)  r  r   rl  r   rL  r  r  r  r   r  r  r  rX  r  r  r  r  r   maxcoder  r  rG  r/  r  r3  r  r1  r2  lheightrA  tabrE  r  	color_strfill_strmorphingrQ  templ1templ2cmp90cmm90cm180r  r[  r5  ru  r&  r	  r
  spaceoptcontbdcemcr  r  nlinesr   s;                                                              r(   r*  zShape.insert_textn;  s   0 F|| 	1<<e},,$$&&DDD4yy1}}1e	::388D>>:::;;GG 	 	 	11	
 C   	!""IEy$$XZ % 
 
 !400A;J'(#&!J'[)	 	8+GG	!Q&&nGG(Y"67GS==X--dGaK@@FFh'F 	9 	9A &(BBBJJx1fh778888eS))	T3'' 	-q((D ,,He$$8q==/000Agg3JC AggCiyy88##$
  	1aE!HJ$7%(*9Ltv9UVVB#a.2%C8C==))G3BBBuw'w"99EG#df,D7(TV#C%KBCHH$EE CZZ7UW$tv-D'DF"C%KBHHEE CZZG8df$D'EG#df,C%KB$&())E )11"55!G+CCCNC#	&&.\&JJ=EE&Evc5"dCAA??H{**DIlX566>>D&	+..66IDHD
 	Qt99q==FF7OO#DDDLDq#d))$$ 	 	Aw1uuDGdN"DWEaKFF## 	$s   +,B B43B4)r   rL  r   rl  r  r  r  r   r  r  r  r  r  rX  r  r  r  r  r  r  c          
        PQ t          |          }|j        s|j        rt          d          t	          |	d          }t	          |
d          }|
|dk    r|	}
t	          |	d          }| j                            |          }|d|z  }d}ndx}}| j                            ||	          }|d}nd
|z  }|dz  dk    rt          d          |}|dk     r|dz  }|dk     |dz  }t          |          s|dv r|j	        n|j
        S d}d}d}| j	        }|} |                     d          r
| dd         } | 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                    |          }*n|}*t'          d |*D                       }+|$r%|+dk    rd                    d |*D                       }*|*                                }*| j                            |!|+dz             P|$r|%d vrd},nP},PQfd!}-Qdk     rPd"         d         z  }.n}.d}/t-          |          rqt/          dddd|d         j        | j        z   | j	        |d         j        z
  | j        z
            }0|0 |d         z  |0z  }1t5          t7          |1                    d#z   }2nd}2d}3t9          d|&z            }4|dk    r|j        |4z   }5|j
        }6|j	        }7n|dk    r1t9          |&z  d          }4|j        |4z   }5|j	        }6|j
        }7|2|z  }2nm|d$k    r4t9          d|&z             }4|j        |4z   }5|j
        }6d%}3|j	        }7|2|z  }2n3t9          |&z  d           }4|j         |4z   }5|j	        }6d%}3|j
        }7|2|z  }2g }8tC          |*          D ]\  }9}:|:"                    |          #                    d&          };tI          |;          }<d}=|6}>tK          |<          D ]}?|;|?         }@ |-|@          }A|>|Ak    r|=|@d&z   z  }=|>|A|.z   z  }>,|=r1|=&                                dz   }=|/|=z  }/|8'                    d'           d}=|6}>|A|6k    r|@d&z   }=|6|Az
  |.z
  }>wtI          |8          dk    rd(|8d%<   |@D ]D}B |-|=          |6 |-|B          z
  k    r|=|Bz  }=#|=dz  }=|/|=z  }/|8'                    d(           |B}=E|=d&z  }=|6 |-|=          z
  }>|=r,|/|=&                                z  }/|8'                    d(           |9tI          |*          dz
  k     r|/dz  }/|/(                    d          r
|/dd%         }/|/)                    d          dz   }C|)|Cz  |'z  z
  }D|D|7z
  }E|EtT          k    rd%|Ez  S tW          |E          }E|EtT          k     rd}Ed)||d*|2z   }Fd+ }G|/                                }Hd(|8d%<   tC          |H          D ]\  }9}Id}J|6 |-|I          z
  }K|5|4|9|(z  z  z   }L|dk    r8|dv r|Lt9          |Kd,z  d          |3z  z   }Ln|Lt9          d|Kd,z            |3z  z
  }Lni|d,k    r2|dv r|Lt9          |Kd          |3z  z   }LnH|Lt9          d|K          |3z  z
  }Ln1|d-k    r+|I)                    d&          }M|Mdk    r|8|9         r|K|Mz  }Jnd}J||Lj        z
  | j        z
  }N|Lj        | j        z   }O|dk    r#||Lj        z
  | j        z
  }O|Lj         | j        z
  }NnR|d.k    r#| |Lj        z   | j        z   }O|Lj        | j        z   }Nn)|d$k    r#|Lj         | j        z
  }O| |Lj        z   | j        z   }N|F |G|O|N|           z  }F|dk    r7|Fd/|z  z  }F|Ft5          |z            d0z   z  }F||Ft5          |          d1z   z  }F|d-k    r|Ft5          |J          d2z   z  }F|	|F|z  }F|
|F|z  }F|Fd3tY          |I|,|$Q          z  z  }F|Fd4|z  z  }F| xj-        |Fz  c_-        | .                    |           |ES )5aQ  Insert text into a given rectangle.

        Args:
            rect -- the textbox to fill
            buffer -- text to be inserted
            fontname -- a Base-14 font, font name or '/name'
            fontfile -- name of a font file
            fontsize -- font size
            lineheight -- overwrite the font property
            color -- RGB stroke color triple
            fill -- RGB fill color triple
            render_mode -- text rendering control
            border_width -- thickness of glyph borders as percentage of fontsize
            expandtabs -- handles tabulators with string function
            align -- left, center, right, justified
            rotate -- 0, 90, 180, or 270 degrees
            morph -- morph box with a matrix and a fixpoint
        Returns:
            unused or deficit rectangle area (float)
        z%text box must be finite and not emptyr  r  Nr   r  r  r[   r  r   r  zrotate must be multiple of 90r  r~  r  r  r  rD  r   r  r  r3  rA  r   r1  r2  rS  r$   c                 ,    g | ]}t          |          S r,   r  r  s     r(   r   z(Shape.insert_textbox.<locals>.<listcomp><  s    ***!s1vv***r)   r	  c                 <    g | ]}t          |          d k     r|ndS )r  ?r  r  s     r(   r   z(Shape.insert_textbox.<locals>.<listcomp><  s*    AAAs1vv||!!AAAr)   r  c                 p    dk     rt          fd| D                       z  S t          |           z  S )zCalculate pixel length of x.r   c                 F    g | ]}t          |                   d          S r.  r  r   r  rA  s     r(   r   z8Shape.insert_textbox.<locals>.pixlen.<locals>.<listcomp><  s(    999!F3q66N1-999r)   )r  r6   )r$  r   rA  r  s    r(   pixlenz$Shape.insert_textbox.<locals>.pixlen<  sE    !||9999q999::XEE1vv((r)       r  r  r0  r   TFr  r  c                 R    dt          | |f           d| dt          |           dS )Nr  z Tm /r   r  r  )r    r
  r  r  s       r(   rr	  z&Shape.insert_textbox.<locals>.<lambda>4=  s5    #\iA.?.?#\#\a#\#\)TU,,#\#\#\ r)   r   r   r  r!  r"  r#  z Tw z%sTJ
zET
%sQ
)/r#  r  r  r   r  r   r  r  r6  r  r[  r2   r  rB  r)  r   r   r   r  r  r  rL  r&  rt  r$  r%  r   r  r  r  rX  r  r  r  r  r5   r6   rK  r%   rj   r  r  rV  r  r%  r  r  )Rr'   r   r  r   rL  r   rl  r  r  r  r   r  r  r  r  r  rX  r  r  r  r  r*  r+  r3  r4  r5  r  rQ  r/  r0  r1  r  r  r  rG  r/  r3  r  r1  r2  lheight_factorr(  r	  r'  	tj_glyphsr>  blenr   r5  ru  r&  progrc_pntr)  maxwidth	maxheightjust_tabr   rn   line_t	num_wordslbuffr  r  wordpl_wr  lb_counttext_heightmorer  templtext_trE  ri  plrj  spacesr	  r
  rA  r  sR        `                                                                          @@r(   ra  zShape.insert_textbox+<  sJ
   X Dzz= 	FD, 	FDEEEeS))	T3''<K1,,D ,,H)11"55!G+CCCNC# 	&&.\&JJ=EE&EB;!<===Agg3JC AggCi F|| 	B"%//4;;tzA##$C   	!""IEy$$XZ % 
 
 !400A;J'(#(#&!J'[)	 	2'NN	!Q&& NN%	1N^+ <<D%=((6""BBB**r***++ 	CgmmAAbAAABBB]]__))$!<< 	f$>>>III
	) 	) 	) 	) 	) 	) 	) a<<":a=8+DDDe 	1aE!HJ/uQxz1IDF1R B #a.2%C8C==))G3BBB
 aH,--!88GeOEzHIIBYY(X-q11EGeOE{H
I%KBBCZZ1h1222EGeOEzHE{I%KBB 8h.222EGeOE{HE
I%KB
  }} 2	 2	GAt__Z0066s;;FFIED 9%% #0 #0ayvd||4<<TCZ'ED4K'D  *!LLNNT1EEMDOOD)))8## 3JE#d?T1D x==1$$#(HRL " "Ave}}66!99(<<<
 ... !&&--/ '&&&&3r77Q; == 	9D::d##a' (9x+??Y&'>>$;4yy'>>D"%#uuu-2\\""f%% /	H /	HDAqGFF1II%B%1~#566Czz(??b1fa 0 05 88CCaa 0 05 88CC!(??b!u 44CCau 44CC!A::(1+: 6kGGG35.46)C546>Dbyy~.uftvow/edfnvgo.EE$UH555DQ;..	,"9::UBB*Ik22U::Dzz	'**V33 	! Hx9fhGGGGDDc!!$r)   r-  Fr[  r  r  r]  r  r  c           
         | j         dk    rdS |dk    rd}n|d}t          |d          }t          |d          }| j                            |          }|d|z  | j         z   | _         d}nd}| j                            ||
          }|d	|z  | j         z   | _         |d
k    r&|dk    r | xj         t          |          dz   z  c_         |dk    rd|z  | j         z   | _         |dk    rd|z  | j         z   | _         |dvrd|z  | j         z   | _         |	r| xj         dz  c_         d| _        || xj         |z  c_         |Z| xj         |z  c_         |$|s| xj         dz  c_         nE| xj         dz  c_         n4|s| xj         dz  c_         n!| xj         dz  c_         n| xj         dz  c_         | xj         |z  c_         t          |          r}t          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| _        dS )zFinish the current drawing segment.

        Notes:
            Apply colors, opacity, dashes, line style and width, or
            morphing. Also whether to close the path
            by connecting last to first point.
        r[   Nr   r  r  r  r  r  r   r    w
z%i J
z%i j
)Nr[   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
r  r  Q
)r  r  r   r  r  r   r  r&  rt  r$  r  r%  r  r  )r'   r[  r  r   r  r  r]  r  r  r  r  r  r  r*  r+  r3  r5  r  r5  ru  s                       r(   r`  zShape.finisho=  s   , >RFA::EE]E eS))	T3'')11"55,w6GDNCCC	&&.\&JJ'%/$.@DNA::%1**NNi..77NNa<<%/$.@DNq==%04>ADN+++%.?DN 	#NNe#NN"DONNi'NNNNh&NN  -NNe+NNNNNf,NNN -NNe+NNNNNf,NNNNNe#NN#e 	Q1aE!HJ/uQxz1IDF1R B #a.2%C&x}}55?$.PDN'DN2U::r)   r  c                    t          | j                   | xj        | j        z  c_        | j                                        | _        | j        r\|r| j                                         t                              | j        d|          }| j        	                    || j                   d| _
        d| _        d| _        d| _        d| _        dS )zUpdate the page's /Contents object with Shape data.

        The argument controls whether data appear in foreground (default)
        or background.
        r%  Nr[   )re  r   r  r  r  r  r
  r  r)  r+	  r  r   r  )r'   r  r  s      r(   rb  zShape.commit=  s     	DI$.(..00> 	9 *	'')))))$)T7CCDH""4888	r)   r  )r   )r   r-  Nr   r   NFNTr   r   r   )&r.   r/   r0   rw  r7  r  r   r   r  r   r  r  r   r  r  rK
  rO
  r   r   r  rm  r  r  r6  r  r_  r  r  r  r   r4  r3  r3   r5  r*  ra  r`  rb  r,   r)   r(   r  r  :  s.         \&T    (7 7 7*J J 5    D U      	
  
   .v|Iy,@A e    0C* Ce C C C C C00 0 	0
 
0 0 0 0(  H HH H 	H
 H 
H H H HT 48 1 1 1i 1E 1 1 1 1fBi BE B B B B 	   	
 
   B 	# ## #
 
# # # #Z #" !)x x xx S$Y'x
 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 S$Y'B
 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 
Y Y Y Yv d d      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dS )$r  r[   Nr  c                 x   t          j        |                    d                    }|r$t          |t                    st	          |          }|r|j        nt          j        d           }t          t           d          rt          j        ||||          | _        d S t          j	        ||||          | _        d S )Nr  FzStoryS)
r   r  r  r=   r9  r   	FzArchiver:   r\  FzStory)r'   r  r  emr  r,  archs          r(   r   zStory.__init__=  s    6G8L8LMM 	':gw77 	'g&&G&Bw||EOT,B,B5*%% 	D2tDDDIIIw"dCCDIIIr)   c                 N   | j         }d}|                    ddd          }|r|j        }t          |          dk    rM|d         dk    rA|d         dv r7|                    d          }|s d| }|                    d|           |dz  }|                    ddd          }|dS dS )	zt
        Look for `<h1..6>` items in `self` and adds unique `id`
        attributes if not already present.
        r   Nr   r  r   123456r7  h_id_)r  r   r  r6   r  r  r  )r'   domr   r$  r   attrid_s          r(   add_header_idszStory.add_header_ids=  s    
 iHHT4&& 		.9D4yyA~~$q'3,,47h3F3F,,T22 %!++COOD#...FAD$--A  		. 		. 		. 		. 		.r)   c                 x   t          | t                    r| }nt          d|           }t                      }|D ]'}|j        dz  r|j        r|j        |v r|||j        <   (|D ]U}|j        dz  rG|j        r?t                      }t          |j                  |d<   |j                            d          r|j        dd         }	 ||         }nA# t          $ r4}	t          dk    rt                       t          d| d|           |	d}	~	ww xY w	 t          |d<   |j        \  }
}}}t          |
|          |d<   |j        dz
  |d<   nK|j                            d          rt"          |d<   |j        dd         |d<   nt$          |d<   |j        |d<   ||j        dz
                               |           W|S )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`.
        rY  r   rV  r	  NzNo destination with id=z, required by position_from: r   z"add_pdf_links(): making link from:zadd_pdf_links():    zadd_pdf_links(): to:rW  rY  r   zname:r   r   r^  )r=   r   r4   
open_closer7  r  r#  r   r2   rf   r	  ru   r   r&   r_  r  page_numr  re  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3 	;)HH'9::H
 ! 	< 	<H#a' <X[ <;.003;NHK0 ' (	G (	GM(1, &G-2D &G vv#M$677V %0055 9 - 2122 6IE&4i&@$ E E E/!338H8H8H*+|Y+|+|mz+|+|}}  DE  EE
B
 $-DL%0%5NBB "'r2DJ#.#7!#;DLL %)44W== 9'1V'4'9!""'=V'/V&3&8U /!34@@FFFs   C
D/D

Dc                 R    |                                  }|                                S r+   )r   r  r'   rd  s     r(   r  z
Story.bodyW>  s    mmoo{{}}r)   c                 R    t          j        | j                  }t          |          S r+   )r   fz_story_documentr   r  rt  s     r(   r   zStory.document\>  s     %ty11Cyyr)   c                     t          |          }|r|j        nt          j        d           }t          j        | j        ||           d S r+   )r  r   r   r  fz_draw_story)r'   r  r  ctm2r  s        r(   drawz
Story.draw`>  sF     &))#>fkk)>)>TYT22222r)   c                    t                    t          u rU                                D ]?}t          |          t          u r|                                st          d| d          @ni t                    rj        j        dk    rt          d          fd}t          j
        | j        |           dS )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+
                                D ]\  }}t          |||            |           d S )Nc                       e Zd ZdS )=Story.element_positions.<locals>.function2.<locals>.Position2Nr.   r/   r0   r,   r)   r(   	Position2r~  s>  s        r)   r  )r#  headingr7  rf  r   r   ri  rectangle_numrect_numr  rA   setattr)rn  r  	position2r  rE   r  rh   s        r(   	function2z*Story.element_positions.<locals>.function2r>  s           !	I&nIO ( 0I#;IL,X];;IN%]IN#+#6I !)!7I%]IN . JJLL . .DAqY1----Hi     r)   N)r   r4   r  r   isidentifierr   r  __code__co_argcountr   fz_story_positionsr   )r'   rh   r  r  r  s    ``  r(   element_positionszStory.element_positionse>  s     ::YY[[ ; ;Q31>>+;+;$%9Q%9%9%9::: '; D!! 	aX%6%Ba%G%G_```	! 	! 	! 	! 	! 	!  	 $)Y77777r)   r   c                     t          |          }t          j                    }t          j        | j        |||          }|t          |          fS )z5
        Wrapper for fz_place_story_flags().
        )r  r   rg  fz_place_story_flagsr   rf  )r'   wherer  r  rP  s        r(   placezStory.place>  sG      '')49eVUKK_f----r)   c                 8    t          j        | j                   d S r+   )r   fz_reset_storyr   r-   s    r(   r&	  zStory.reset>  s    di(((((r)   c                 (   d }dd}t          dddd          }	  |||          \  }}	}
|dz  }|rdz  |                     |	          \  }}rfd}|                     |           |r|rK|r$|r |||d           |                                 |                    |          }|r |||d           |                     ||
           |s$|r |||d           |                                 n|                     d |
           |sd S )Nr   r   c                 ,    | _          |            d S r+   )rj  )rn  rj  
positionfns    r(   positionfn2z Story.write.<locals>.positionfn2>  s#     )1H%Jx(((((r)   )r#  r  r  ro
  rj
  rz  )r'   r  rectfnr  pagefnr  r  r  ro  r   r  rP  r  rj  s      `         @r(   r   zStory.write>  s   aAq!! 	"(&6":":HdCMH A::t,,LD& 4) ) ) ) ) )
 &&{333 % ; *! ?"F8XsA>>>))) ++X66C ;x3:::		3$$$ & <(C;;;OO%%%		$$$$ A 	r)   Tc	                    t                      d }		 |	}
 |          }	d|	|
k    rd|	}t          ||||          }|r|                                 t                      fd}|                    r| nd |||           rd S w)Nr   FTc                 X                         |            rr |            d S d S d S r+   r	  )rn  r  rl  stables    r(   r  z+Story.write_stabilized.<locals>.positionfn2>  sP      *** )j )Jx((((() ) ) )r)   )r   r  rg  r   )r  	contentfnr  r  r_  r  r  r  rg  rv  content_prevcontent2r  r  rl  r  s        `        @@r(   write_stabilizedzStory.write_stabilized>  s    FF		"Li++GF,&&H(Hb'::E '$$&&&I) ) ) ) ) ) )
 KK$.FF$	    3	r)   c                 &   t          j                    }t          |          }	g fd}
t                              |	| ||||
|||	  	         |	                                 |                    d           t                              |          S )Nc                 P                         |            r |            d S d S r+   r	  rn  r  rl  s    r(   r  z6Story.write_stabilized_with_links.<locals>.positionfn2>  ?    X&&& %
8$$$$$% %r)   r   )r8   r^  r^
  r  r  r  r  rr  )r  r  r  r_  r  r  r  rg  r   r  r  rl  s       `      @r(   write_stabilized_with_linksz!Story.write_stabilized_with_links>  s     ''		% 	% 	% 	% 	% 	%
 	vy&(BU[]dftuuuA""69555r)   c                    t          j                    }t          |          }g fd}|                     ||||           |                                 |                    d           t                              |          S )Nc                 P                         |            r |            d S d S r+   r	  r  s    r(   r  z+Story.write_with_links.<locals>.positionfn2>  r  r)   )r  r  r   )r8   r^  r^
  r   r  r  r  rr  )r'   r  r  r  r   r  r  rl  s     `    @r(   r  zStory.write_with_links>  s    ''		% 	% 	% 	% 	% 	%
 	

66k&
IIIA""69555r)   c                        e Zd ZdZddZd ZdS )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                 Z    || _         || _        || _        || _        || _        || _        d S r+   r  r  rP  numcallsr  r   )r'   r  r  rP  r  r  r   s          r(   r   zStory.FitResult.__init__?  s0    (DO DKDI$DM&DNDIIIr)   c                 f    d| j          d| j         d| j         d| j         d| j         d| j         S )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=r  r-   s    r(   r   zStory.FitResult.__repr__?  sk    )4? ) )#{) )!Y) ) "&) ) #'.	) )
 "Y) )r)   r0  )r.   r/   r0   rw  r   r   r,   r)   r(   	FitResultr  >  sA        	 	(	 	 	 		 	 	 	 	r)   r  r  Fc                     fdt          t          t          f          sJ t          t          t          f          sJ  G fdd          } |            r dj        dj        d                                             fd} fd	d
 }	j        2r d            |	j        d          }
	  |
          sn|
dz  }
n0 j                  r r dj        d            |            S j        2r d            |	j        d          }
	  |
          rn|
dz  }
n7 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  }
 |
           ;)a  
        Finds optimal rect that contains the story `self`.
        
        Returns a `Story.FitResult` instance.
            
        On success, the last call to `self.place()` will have been with the
        returned rectangle, so `self.draw()` can be used directly.
        
        Args:
        :arg fn:
            A callable taking a floating point `parameter` and returning a
            `pymupdf.Rect()`. If the rect is empty, we assume the story will
            not fit and do not call `self.place()`.

            Must guarantee that `self.place()` behaves monotonically when
            given rect `fn(parameter`) as `parameter` increases. This
            usually means that both width and height increase or stay
            unchanged as `parameter` increases.
        :arg pmin:
            Minimum parameter to consider; `None` for -infinity.
        :arg pmax:
            Maximum parameter to consider; `None` for +infinity.
        :arg delta:
            Maximum error in returned `parameter`.
        :arg verbose:
            If true we output diagnostics.
        :arg flags:
            Passed to mupdf.fz_place_story_flags(). e.g.
            zero or `mupdf.FZ_PLACE_STORY_FLAG_NO_OVERFLOW`.
        c                 4    sJ t          d|             d S )Nzfit(): rq   )r   r	  s    r(   r&   zStory.fit.<locals>.log<?  s)    NNN$d$$%%%%%r)   Nc                       e Zd Z fdZdS )Story.fit.<locals>.Statec                     | _         | _        d | _        d | _        d | _        d| _        r| _        | _        d S d S r   )pminpmaxpmin_resultpmax_resultr!  r  pmin0pmax0)r'   r  r  r	  s    r(   r   z!Story.fit.<locals>.State.__init__D?  sS     	 	#' #' " ! &!%DJ!%DJJJ& &r)   Nr   )r  r  r	  s   r(   Stater  C?  s8        	& 	& 	& 	& 	& 	& 	& 	& 	&r)   r  zstarting. state.pmin= state.pmax=r   c            
      4   j         9j        j         k    r!r d            j                   } | sJ j        }n.j        rj        nt                              j                  }r& dj        dj        dj         d|           |S )NzCCalling update() with pmax, because was overwritten by later calls.)r  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  r  r  r  r  r  )r  r!  r&   r  r  r	  s     r(   rF   zStory.fit.<locals>.retU?  s    z%<5:-- dbccc!'
!3!3J%%%%*.3.?m**U__^c^l_EmEm caaaaauzaaX^aabbbMr)   c                      |           }t          |t                    sJ dt          |          d|            |j        r1d}t                              | 
j                  }r d           nq	                    |          \  }}
xj        dz  c_        | }t                              ||
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)=r  F)r  r  z9update(): not calling self.place() because rect is empty.r   )r  rP  r  r  r   r  zupdate(): called self.place(): z>2dz: more=r  r   )r=   r#  r   r  r  r  r  r  r  r  r  r  r  )r  r   r  r!  rP  r  r  fnr&   r'   r  r	  s         r(   r  zStory.fit.<locals>.updatec?  s`    2i==DdD))CC+Cd4jj+C+CD+C+CCCC} o"
9u~VV VCTUUU#zz$66f!#!%X
%!!&"+!#- )    oCm%.mmmPTmmXammeimmmnnn +&
$*!!&
$*!$ELr)   c                 8    | | dk    r|S || z  dk    rd| z  S |  S )z
            Returns same sign as `direction`, larger or smaller than `p` if
            direction is positive or negative respectively.
            Nr   r   r,   )r  	directions     r(   oppositezStory.fit.<locals>.opposite?  s6    
 yAqDD  1}q  1u2Ir)   zfinding pmin.r0  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=   r3   rm  r  r  r&	  )r'   r  r  r  rb  r	  r  r  rF   r  r  r&   r  r  s   ```` ``    @@@r(   r  z	Story.fit?  s   >	& 	& 	& 	& 	& $e--=$e--=
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	&  	;C9UZ995:999:::

	 	 	 	 	 	 	 	#	 #	 #	 #	 #	 #	 #	 #	 #	 #	J		 		 		 :-,--- R00Ivi(( Q	 vej!! @CC ?5: ? ? ?@@@suu:-,--- R00I6)$$ Q	 6%*%% !
GCC F
 F F FGGGsuu QCCPEJPP%*PPPQQQ	zEJ&..suuej0A5IF9		r)   c                 p   
 |\  }}|z
  |z
  

fd}	|                      |	|||||          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                 @    t          | z  z   | z  z             S r+   r
  )rq  r  r[  r	  r  s    r(   r  zStory.fit_scale.<locals>.fn?  s)    BU5[ 0"uV|2CDDDr)   r  )r'   r   r  r  rb  r	  r  r  r
  r  r  r[  r	  r  s             @@@@r(   r  zStory.fit_scale?  ss    . BBRb	E 	E 	E 	E 	E 	E 	E 	ExxIy%%HHHr)   r  c                 \   	
 |\  
|z   		
fd}|                      |||||          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+   r
  )r  r	  r  r  s    r(   r  zStory.fit_height.<locals>.fn?  s    BBvI...r)   r  )r'   r[  
height_min
height_maxoriginrb  r	  r  r	  r  r  s           @@@r(   
fit_heightzStory.fit_height?  sV    , B%Z	/ 	/ 	/ 	/ 	/ 	/ 	/xxJ
E7CCCr)   c                 \   	
 |\  		|z   
	
fd}|                      |||||          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+   r
  )r[  r	  r  r
  s    r(   r  zStory.fit_width.<locals>.fn	@  s    B5"---r)   r  )r'   r  	width_min	width_maxr  rb  r	  r  r	  r  r
  s           @@@r(   	fit_widthzStory.fit_width?  sV    , B&[	. 	. 	. 	. 	. 	. 	.xxIy%AAAr)   )r[   Nr  Nr+   r-  r	  )Nr  NNNT)NNr  Fr   )r   Nr  Fr   )r   Nr  r  F)r.   r/   r0   r   rg  r7  rr  r2  r  r   rz  r  r  r&	  r   r  r  r  r  r  r  r  r  r,   r)   r(   r  r  =  s       D D D D. . .& R R \Rh   X  3 3 3 3
8 8 8 8>. . . .) ) )% % % %N    \> 6 6 6 \66 6 6 6% % % % % % % %NX X X XtI I I I<D D D D8B B B B B Br)   r  c                       e Zd Zd Zd Zd ZddZd Zddefd	Z	de
fd
ZddZdde
fdZddefdZdde
fdZd Zdde
fdZd ZddZde
fdZde
fdZd Zed             ZddZeZdS )r  c                    t          |t          j                  r"|d         }t          j        |          | _        n:t          |t          j                  r|d         | _        nt          d|           d| _        d | _        d S )Nr   Unrecognised args: T)r  r   rg  r  r   rf   r   r   )r'   r  ro  s      r(   r   zTextPage.__init__@  s~    dEL)) 	:AwH)844DIIe/00 	:QDII8$88999r)   c                 x   | j         }t          j        d          }t          j        |          }|dk    rt          j        ||d           nJ|dk    rt          j        ||d           n-|dk    rt          j        ||d           nt          ||           |                                 t          |          }|S )Nr[  r   r   r   rI  )
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'   rX  
this_tpager  r  r   s         r(   _extractTextzTextPage._extractText@  s    Y
!$''nc"" a<<-c:qAAAA\\,S*a@@@@\\.sJBBBB'Z888%c**r)   c                 2    t          | j        ||           d S r+   )JM_make_textpage_dictr   )r'   	page_dictr  s      r(   _getNewBlockListzTextPage._getNewBlockList0@  s    diC88888r)   Fc                 d    | j         j        | j         j        d}|                     ||           |S )NrY  )r   r[  r  r  )r'   r  r  s      r(   _textpage_dictzTextPage._textpage_dict3@  s4    "io9IJJ	i---r)   c                 6    	 t          j        | j                  S )z*Return a list with text block information.)"r  r   extractBLOCKSr   r   rg  r   ro  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
  rj   )r'   block_nr  tp_rectr  r  block	blockrectline_n	last_charrn   linerectr
  cbboxr   r  r  litems                     r(   r  zTextPage.extractBLOCKS8@  s    	2&ty111r)   Nr  c                     |                      d          }||j        |d<   |j        |d<   |r$|d         }|                    d            ||d<   |S )	z>Return page content as a Python dict of images and text spans.Fr  Nr[  r  blocksc                 :    | d         d         | d         d         fS Nr.  r   r   r,   r
  s    r(   rr	  z&TextPage.extractDICT.<locals>.<lambda>w@      qy|QvYq\&B r)   r	  r  r[  r  r  r'   r  r  r  r  s        r(   extractDICTzTextPage.extractDICTo@  sj    !!e!,,>8CLICM 	#]FKKBBKCCC"CM
r)   c                 ,    |                      d          S )z%Return page content as a HTML string.r   r  r-   s    r(   extractHTMLzTextPage.extractHTML{@  r  r)   r   c           	      <   d}| j         }g }|D ]}|dz  }|j        j        t          j        k    r#|                                }d}|                                }|j        rd}	nd}	t          j        |          }
|
j        r|
                                }d}
|rt          j	        t          t          t          t                    }t          j        |          sJ t          j        |                                dd|                                dd          }t          j        |||          \  }}}t          j        |          }t%          |          }|dk    r>|                                |                                z  |                                z  }t          j        t          j        |j        j                            }t/                      }||t0          <   t3          |j        j                  |t6          <   t9          |                                          |t<          <   |                                |t>          <   |                                |t@          <   t          j!        |          |tD          <   t          j#        |          |tH          <   |%                                |tL          <   |'                                |tP          <   |)                                |tT          <   ||tV          <   |r||d<   |	|d<   |,                    |           |S )	z*Return a list with image meta information.r0  r   r   TFNr  zhas-mask)-r   r   r   r   r  r  r  r  fz_compressed_buffer_sizer  r5  r6  r  rq  r   r  r4  r  r  rD   r  ll_fz_keep_colorspacer  r4   dictkey_numberrf  r.  dictkey_bboxrp  i_transformdictkey_matrixdictkey_widthdictkey_heightr  dictkey_colorspacer  r  r  dictkey_xresr  dictkey_yresr  dictkey_bpcr  rj   )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.extractIMGINFO@  s   Y
 (	" (	"EqLG$(AAA--//CH88::D ! 9#>>J$ "%??AA!
 ;M/?OUdee1!44444N35577Aq#%%''1a@@!:31EE	Q-c22vq=="uuww035577:H#E$?@Y$Z$Z[[BJ)0J~&'6u7G7L'M'MJ|$):5;L;L;N;N)O)OJ~&(+J}%),J~&-2-B2-F-FJ)**/*B2*F*FJ''*xxzzJ|$'*xxzzJ|$&)ggiiJ{#'/J|$ .'-
8$%-Jz"IIj!!!!	r)   c                    ddl ddl}|                     d          } G fdd|j                  }||j        |d<   |j        |d<   |r$|d	         }|                    d
            ||d	<   |                    |d|d          }|S )z.Return 'extractDICT' converted to JSON format.r   NFr  c                       e Zd Z fdZdS )'TextPage.extractJSON.<locals>.b64encodec                     t          |          t          t          fv r'                    |                                          S d S r+   r   r  r]  	b64encoder  r'   rp  base64s     r(   r   z/TextPage.extractJSON.<locals>.b64encode.default@  A    77ui000!++A..55777 10r)   Nr.   r/   r0   r   r  s   r(   r  r  @  .        8 8 8 8 8 8 8r)   r  r[  r  r  c                 :    | d         d         | d         d         fS r  r,   r  s    r(   rr	  z&TextPage.extractJSON.<locals>.<lambda>@  r  r)   r	  r   r^   r   
separatorsr  rz  r  rr  r  JSONEncoderr[  r  r  dumpsr'   r  r  rr  r  r  r  r  s          @r(   extractJSONzTextPage.extractJSON@  s    !!e!,,	8 	8 	8 	8 	8 	8 	8( 	8 	8 	8
 >8CLICM 	#]FKKBBKCCC"CMjj1jMM
r)   c                     |                      d          }||j        |d<   |j        |d<   |r$|d         }|                    d            ||d<   |S )	zCReturn page content as a Python dict of images and text characters.Tr  Nr[  r  r  c                 :    | d         d         | d         d         fS r  r,   r  s    r(   rr	  z)TextPage.extractRAWDICT.<locals>.<lambda>@  r  r)   r	  r  r  s        r(   extractRAWDICTzTextPage.extractRAWDICT@  sj    !!d!++>8CLICM 	#]FKKBBKCCC"CM
r)   c                    ddl ddl}|                     d          } G fdd|j                  }||j        |d<   |j        |d<   |r$|d	         }|                    d
            ||d	<   |                    |d|d          }|S )z1Return 'extractRAWDICT' converted to JSON format.r   NTr  c                       e Zd Z fdZdS )*TextPage.extractRAWJSON.<locals>.b64encodec                     t          |          t          t          fv r'                    |                                          S d S r+   r  r  s     r(   r   z2TextPage.extractRAWJSON.<locals>.b64encode.default@  r  r)   Nr  r  s   r(   r  r.  @  r  r)   r  r[  r  r  c                 :    | d         d         | d         d         fS r  r,   r  s    r(   rr	  z)TextPage.extractRAWJSON.<locals>.<lambda>@  r  r)   r	  r!  r   r"  r$  r'  s          @r(   extractRAWJSONzTextPage.extractRAWJSON@  s    !!d!++	8 	8 	8 	8 	8 	8 	8( 	8 	8 	8
 >8CLICM 	#]FKKBBKCCC"CMjj1jMM
r)   c                 z    t          |          }t          |          }t          j        | j        ||d          }|S r   )r$  r   fz_copy_selectionr   )r'   pointapointbr    r
  r  s         r(   extractSelectionzTextPage.extractSelection@  s9    V$$V$$'	1a;;r)   c                     |s|                      d          S |                                 dd         }|                    d            d                    d |D                       S )z%Return simple, bare text on the page.r   Nc                 "    | d         | d         fS )Nr   r   r,   r  s    r(   rr	  z&TextPage.extractText.<locals>.<lambda>@  s    1Q41, r)   r	  r[   c                     g | ]
}|d          S r  r,   )r   r
  s     r(   r   z(TextPage.extractText.<locals>.<listcomp>@  s    ---!---r)   )r  r  r  r  )r'   r  r  s      r(   extractTextzTextPage.extractText@  sq     	($$Q'''##%%aaa(..///ww--f---...r)   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(   re  zTextPage.extractTextbox@  sP    Y
*e&788888t$$!*d33-e44	r)   c                 8    	 t          j        | j        |          S )z)Return a list with text word information.)r  r   extractWORDSr   r   rg  r  r   ro  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  rN  r  r  rn   word_nr
  r  word_delimiterthis_char_rtls                     r(   r?  zTextPage.extractWORDS@  s    	=%di<<<r)   c                 ,    |                      d          S )z&Return page content as a XHTML string.rI  r  r-   s    r(   extractXHTMLzTextPage.extractXHTML4A  r  r)   c                 ,    |                      d          S )z$Return page content as a XML string.r   r  r-   s    r(   
extractXMLzTextPage.extractXML8A  r  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  rP  r  s       r(   poolsizezTextPage.poolsize<A  s:    	z%*/00!4((r)   c                 h    | j         }|j        j        }t          |          }t	          |          }|S )zPage rectangle.)r   r   ro  rf  r#  )r'   r  ro  r  s       r(   r   zTextPage.rectDA  s3     Y
(1h''3ii
r)   r   c                    t          | j        |          }|s|S t          |          }t          |          D ])}t	          ||                   }|r|||<   |j        ||<   *|r|S d}||dz
  k     rO||         }||dz            }	|j        |	j        k    s
||	z  j        r|dz  }<||	z  ||<   ||dz   = |dz  }||dz
  k     O|S )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r6   rK  r  r   r
  r  )
r'   needlehit_maxr/	  r  rA   r   rW  v1v2s
             r(   r  zTextPage.searchNA  s    "49f55 	JCu 	  	 ASVA  AA 	J%!)mmQBQUBu~~"r'!3~Q"WCFAE
QJE %!)mm 
r)   r  r  r-  r+   )r   r   )r.   r/   r0   r   r  r  r  r  r4   r  r   r  r  r(  r+  r1  r6  r:  re  r?  rK  rM  rR  r2  r   r  extractTEXTr,   r)   r(   r  r  @  s       	 	 	  *9 9 9   
5 5 5n
 
$ 
 
 
 
$S $ $ $ $. . . .` #    ,
 
T 
 
 
 
 S    *  / / / / / /  6 6 6 6p$c $ $ $ $$C $ $ $ $     X   4 KKKr)   r  c                       e Zd ZddZed             ZddZdd	Zd
 Z	 	 	 	 	 	 	 	 ddd de	de
j        eef         dede
j        e         dededededededefdZddZdS )r  r   Nc                    t          j                    | _        || _        || _        t          |          | _        t          ddddd| j        j                  | _	        | j	         | _
        t                      | _        d| j        _        t                      | _        d| j        _        t                      | _        d| _        dS )z;Stores text spans for later output on compatible PDF pages.r   r   r0  z'Position following last text insertion.zAccumulated area of text spans.TN)r   fz_new_textr   rU  r  r#  r   rt  r  r  ictmr  r  rw  r  r  
used_fontsr   )r'   	page_rectrU  r  s       r(   r   zTextWriter.__init__mA  s    %''	
OO	!Q2q$)*:;;XI	''"K!B%%r)   c                     t          t          j        | j        t          j        d           t          j                                        }t          |          }|S r+   )rf  r   fz_bound_textr   FzStrokeStaterq  r#  r  s     r(   _bboxzTextWriter._bbox~A  sF    u2DIu?RSW?X?XZ_ZhZjZjkkll3ii
r)   r  r   c           
      6   t          |          | j        z  }|t          d          }|j        s	 t          d|j        z            |r9|                     |          }d                    t          |                    }d}t!          j        |          }	t%          |          }
t!          j        |dd||
j        |
j                  }d}d}|dk    r&t!          j        | j	        |j	        ||||||	          }n t/          | j	        |j	        ||||||	          }t1          |          }t          |dd                   | j        z  | _        | j        | j        z  | _        | j        | j        f}|j        d         dk    r| j                            |           |S )z8Store 'text' at point 'pos' using 'font' and 'fontsize'.Nr  r   z{font.this.m_internal.name=}z {font.this.m_internal.t3matrix=}z{font.this.m_internal.bbox=}z#{font.this.m_internal.glyph_count=}z&{font.this.m_internal.use_glyph_bbox=}z#{font.this.m_internal.width_count=}z%{font.this.m_internal.width_default=}z"{font.this.m_internal.has_digest=}zUnsupported font {font.name=}zAUnsupported font cppyy.gbl.mupdf_font_name(font.this.m_internal)=zUnsupported font '%s'.r[   r  r
  r   ) r  r^  r0  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_csrp  r  r  rd  r  r  r_  r=  )r'   rd  r   rX  r   r)  right_to_leftr
  r
  r(  r  trm
markup_dirr
  r  s                  r(   rj   zTextWriter.appendA  s   Cjj49$<<<D 	Ca 5	ABBB 	>>$''D778D>>**DM1(;;S!!"8Q8QS!#FF
??&	49c4P]_ikoppCC#TY	3e]\fhlmmC$$BCC//DH4dh.ndo-:f""O%%%
r)   Fc           	          |dz  }|D ]-}|                      ||||||           |xj        |z  c_        .| j        | j        fS )NrS  )rX  r   r)  r
  )rj   r%  r  r  )	r'   rd  r   rX  r   r)  r
  r(  r  s	            r(   appendvzTextWriter.appendvA  sc    S. 	 	AKKQTH!j  : : :EEWEEE~t..r)   c                 F   |s|S |                     d          }g }t          t          |                    D ]t}||         }t          |          dk     sWt          d |D                       dk    s:d                    t          |                    ||<   |                    |           ug }t          t          |                    D ]}|g k    r|                    ||                    $||         |d         dz   k    rWt          |          dk    r:t          ||d         |d         dz                      ||d         |d         dz   <   ||         g}||         |d         dz   k    r|                    ||                    d                    |          }|S )	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   c                 ,    g | ]}t          |          S r,   r  r  s     r(   r   z(TextWriter.clean_rtl.<locals>.<listcomp>A  s    &9&9&9!s1vv&9&9&9r)   r	  r[   r0  r   r   )r5   rK  r6   r  r  r  rj   )r'   r   wordsr6  r   r   idx2s          r(   rg  zTextWriter.clean_rtlA  s     	K

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

1 s3xx 	$ 	$ArzzCF####Q$r(Q,&&t99q==4<d1gR1455 5E$q'DHqL01 AxQ48a<''CF###xxr)   r  r   r   rd  rX  r   rl  r  warnrk  r
  r  c                 x	   
%&'( 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|                                }n.g }|D ])}|                    |                                           *t!          |j        |j        z
  |z            d
z   }g }g }t'          |          D ]\  }}|dv rG|                    ||f           |j        |z
  }|                    t+          |          d
z
             Q|dk    r|j        |j        z
  }n
|j        |z
  }|	r                     |          } (|          }||k    r=|                    ||f           |                    t+          |          d
z
             |                    d          } |||          \  }}t+          |          }	 d                    |d|                   } t7          |d|                   ||d
z
  z  z   }!|!|k    r=|                    | |!f           ||d         }||d         }t+          |          }d} n|d
z  }t+          |          dk    rn|sJ t+          |          }"|"|k    r.d||"fz  }#|n$|rt9          d|#z              nt          |#          t                      }$|t+          |          d
z
  gz  }t;          |          D ]}	 |                    d          \  }}n*# t>          $ r t@          dk    rtC                       Y  nw xY w|	r"d                    tE          |                    }|dk    r|}$|tF          k    r.||vr*|'k     r$ ||$|           ||$_        |$xj        |z  c_        |dk    s|j        |k    r|$xj        ||z
  |z  z  c_         %|$|           ||$_        |$xj        |z  c_        |S )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.r  c                 4                         |           S )zReturn length of a string.r   r
  )r
  r$  rX  r   r
  s    r(   rt  z(TextWriter.fill_textbox.<locals>.textlenB  s'    ##H $   r)   c                 4                         |           S )z5Return list of single character lengths for a string.rw  )r
  rx  s    r(   r
  z-TextWriter.fill_textbox.<locals>.char_lengthsB  s    $$Qj$QQQr)   c                 <                         | |          }|S )N)rX  r   r
  r	  )rd  r   rF   rX  r   r
  r  s      r(   append_thisz,TextWriter.fill_textbox.<locals>.append_thisB  s-    --D8
    C Jr)   皙?r   c                    g }g }|D ]} |          }t          |          }|| k    r+|                    |           |                    |           Mt          |          }|dk    r~t          |d|                   }|| k    rV|                    |d|                    |                    |           ||d         }||d         }t          |          }n|dz  }|dk    ~||fS )z.Cut any word in pieces no longer than 'width'.r   Nr   )r  rj   r6   )	r[  rr  nwordsword_lengthsr   wl_lstwlrD   r
  s	           r(   
norm_wordsz+TextWriter.fill_textbox.<locals>.norm_wordsB  s   FL  %a[[;;MM!$$$ ''+++ KK!eeVBQBZBU{{ae,,,$++B///abbE!'KKQ !ee <''r)   c                 >   d |                     d          D             }t          |          }|dk    rdS |dk    r 
| |d                    dS t          fd|D                       }|dz
  }|z
  |z  }|D ] } 
| |          \  }}	|	j        |z   | _        !dS )zJustified output of a line.c                     g | ]
}|d k    |S rp
  r,   )r   r   s     r(   r   zCTextWriter.fill_textbox.<locals>.output_justify.<locals>.<listcomp>9B  s    ;;;1177Q777r)   r   r   Nr   c                 &    g | ]} |          S r,   r,   )r   r   rt  s     r(   r   zCTextWriter.fill_textbox.<locals>.output_justify.<locals>.<listcomp>@B  s!    000Qggajj000r)   )r5   r6   r  r$  )r  rn   rr  r~  r  gapsgaplr   r  rv  r{  	std_widthrt  s             r(   output_justifyz/TextWriter.fill_textbox.<locals>.output_justify6B  s     <;

3;;;EZZF{{{{E58,,,0000%00011BA:DNd*D & &#E1--2$+Fr)   r   rS  NzText must start in rectangle.rT  r  r   )r[   r   TzOnly fitting %i of %i lines.z	Warning: r   r[   )$r#  r  r   r   r0  r[  r	  r1  r2  r  r  rB  rC  r   r  rd  r3   r
  r%  r  rj   r6   r  r$  rg  r5   r  r  rq   rK  r	  r  r	  ru   r  rD  ))r  r   r   rd  rX  r   rl  r  rt  rk  r
  	tolerance	space_len	std_startr  r  rI  rJ  r(  
LINEHEIGHTr[  r  	textlinesrn   	max_lines	new_lines
no_justifyr   r  rr  r  rD   line0r  r6  r   r  r{  r
  r  rt  s)   `   ``    `                          @@@@r(   fill_textboxzTextWriter.fill_textboxA  s   6 Dzz= 	:8999::T!!<<D	 	 	 	 	 	 		R 	R 	R 	R 	R 	R 	R	 	 	 	 	 	 	 	 sN	GCLL	J*	Gi'		( 	( 	( 	( 	(4	 	 	 	 	 	 	$ mn 	!SyA~~) G'
 ?**CC'Y377Cd??<=== %%%FF&&&FFF ::))III 4 4  !2!2333335J677!;		
 ++ (	 (	GAty    $	!2333
Y.!!3y>>A#5777Avv#%
Y. .''--BU{{  $,,,!!3y>>A#5777 JJsOOE #-*UE":":E<E

Arr++bqb)**Y!a%-@@;;$$eR[111!!""IE#/#3LE

A EEFAu::??  YI0Iv3FFC| &c)**** oo%s9~~)**
y!! 	" 	"A$==++bb   '1,,0@0@0@  /wwx~~..Avv***q
/B/BrI~~ud+++#:%1uu**EBJ&00Kt$$$EGGGz!GGGs   O  #PPr0  c	                    t          |           t          | j        |j        z
            dk    rt          d          |dt	          |          t
          t          fvs8t	          |d                   t          ust	          |d                   t          urt          d          ||t          d          t          |dd          |d	k    r| 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        |	                                d          }t          j        d          }t          j        |	                                t          j                    ||          }t          j        || j        t          j                    |||
t          j        t          j                             t          j        |           t9          |	|          }t;          |          }||f}|}|d         }|d         }|\  }}|                                }|                    |          }|d|z  }d}ndx}}dg}|r|                     |           |j!        }|j"        dv r|j        j#        |j        j$        z
  }nd}|j%        }tM          |          s|j'        dk    s|dk    r=|                     dtQ          |j)        |j*        |j'        z   |z
  f           d           |rM|d         | j+        z  } t          dd          ,                    | j)        | j*                  }| |d         z  |z  }|s|r2|                     tQ          t[          |                    dz              |D ]"}!|!.                    d          r|!dk    r.|                     |!           |                     d|z             M|!.                    d          r9t_          |!0                                d         dd                   |z   }"d|"z  }!nr|!.                    d          r|!0                                }#tc          |#d                   }$|dk    r|$dz  }%nd}%|                     tQ          |%          dz              t_          |#d         dd                   |z   }&d2                    d|&z  g|#dd         z             }!n|!.                    d           r*|                     |!3                    d!d"                     n}|!.                    d#          r*|                     |!3                    d#d$                     n>|!.                    d%          r)|                     |!3                    d%d&                     |                     |!           $|r|                     |           |                     d'           d(2                    |          4                    d)          }tj          6                    |||*           d}| j7        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 allowedrh  r0  r  r   rI  r   r[  z/OC /%s BDCEMCr[   rW  r  r  z cmBTz%i Trz gsz	/Alp%i gs Tfr  z wr   r   z/F%iz rgr  RGz gz Gz kz KrX  r$   r  )r  )9re  r  r   r   r   r   r   r  rt  r   rU  r  r%  r:  r   r  fz_device_cmykfz_device_grayrR  r)  r  pdf_new_pdf_devicerq  fz_fill_textr   r  fz_default_color_paramsr  JM_merge_resourcesr;
  r  r  rj   r  rN  r  r[  ro  r6  r  r   r$  r%  r^  re  r  r  r3   r5   rm  r  r  r  r
  r  r_  repair_mono_font)'r'   r   r  rU  r  r  r  r  r  r  r  ncol	dev_colorr  r`  rp  r  max_numscont_stringr!  r  rv  max_alpmax_fontold_cont_linesr3  r4  r5  new_cont_linesr  rb  r  r  rn   alpr  r  r   rX  s'                                          r(   r  zTextWriter.write_textB  s    	Dty49$%%,,5666UE4=00E!H~~U22E!H~~V33 !HIII%"3CDDD7K..6'R--lG=JE#	nn&&GE!||!D$I ?"7">">iqyy"022

"133

"133
*7;;==!<<I*400H*GKKMM5>;K;KYX`aaCIN$$'(EFF   !3''' *7I>>H0(;;K,FCq6a&$ ++--,,R00')CCCNC# 	'!!#&&&"=I%%I$ty6EEE]88 	[ruzzUaZZ!!"YYbdRUlU>R7S-T-T"Y"Y"YZZZ 	/a49$A1aLL--ac1377EVeAh&.F 	GF 	G!!)HV,<,<"="="EFFF" 	( 	(D}}U## t||%%d+++%%g&;<<<}}U## @$**,,q/!""-..8"S(u%% @zz||d1g!##AAA%%illT&9:::47122;''(2xx$$qrr( :;;u%% @%%dll4&>&>????t$$ @%%dll4&>&>????t$$ @%%dll4&>&>???!!$'''' 	'!!#&&&e$$$))N++227;;tWg>>>O 	) 	)DT4((((
r)   r  )Nr  Nr   r   )Nr  NF)NNr  Nr   NFF)Nr0  r   NNr   r   )r.   r/   r0   r   r2  rd  rj   ro  rg  r   rK
  rO
  r   r   r   Optionalr0  rm  r4  r3   r6  r   r  r  r,   r)   r(   r  r  kA  sa          "   X
* * * *X/ / / /, , ,d #*. #'"'$` ` `` ,sDy)` 	`
 /$'` ` !` ` `  ` ` ` ` ` `DD D D 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ef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/dS )+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                 \    t                               | |                                          S r+   )r#  r   r-  r  s     r(   r   zIRect.__add__YC  "    ||D!$$**,,,r)   c                 \    t                               | |                                          S r+   )r#  rr  r-  r  s     r(   rr  zIRect.__and__\C  r  r)   c                 8    t                               | |          S r+   )r#  r  r  s     r(   r  zIRect.__contains___C  s      q)))r)   c                     t          |d          sdS t          |          dk    oC| j        |d         k    o2| j        |d         k    o!| j        |d         k    o| j        |d         k    S rC  )r:   r6   r	  r  r  r
  rd  s     r(   r(  zIRect.__eq__bC  sn    q)$$ 	51vv{jtw!A$j47ad?jtwRSTURVj[_[bfghifj[jjr)   c                 B    | j         | j        | j        | j        f|         S r+   ry  r  s     r(   r_  zIRect.__getitem__gC  rF  r)   c                 :    t          t          |                     S r+   r  r-   s    r(   rm  zIRect.__hash__jC  r  r)   Nr{  c          
      Z    t          |||||||d\  | _        | _        | _        | _        d S )Nr{  )util_make_irectr	  r  r  r
  r~  s           r(   r   zIRect.__init__mC  s7    -<trVX]_dfkm-n-n-n*$'4777r)   c                     dS rK  r,   r-   s    r(   r'  zIRect.__len__pC  r8  r)   c                 \    t                               | |                                          S r+   )r#  r;  r-  r)  s     r(   r;  zIRect.__mul__sC  r  r)   c                 V    t          | j         | j         | j         | j                   S r+   )r   r	  r  r  r
  r-   s    r(   r=  zIRect.__neg__vC  s&    dgXx$'DG8<<<r)   c                 \    t                               | |                                          S r+   )r#  r  r-  r  s     r(   r  zIRect.__or__yC  s"    {{4##))+++r)   c                      t          |           S r+   )r   r-   s    r(   rA  zIRect.__pos__|C  r  r)   c                 @    dt          t          |                     z   S )Nr   rC  r-   s    r(   r   zIRect.__repr__C  r  r)   c                     t          |          }|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S rU  )r3   r	  r  r  r
  r  rF  s      r(   rG  zIRect.__setitem__C  se    FF!VVqTWW!VVqTWW!VVqTWW!VVqTWW1222tr)   c                 \    t                               | |                                          S r+   )r#  rI  r-  r  s     r(   rI  zIRect.__sub__C  r  r)   c                 \    t                               | |                                          S r+   )r#  rO  r-  r)  s     r(   rO  zIRect.__truediv__C  s$    a((..000r)   c                 6    t          | j        | j                  S r  r  r-   s    r(   r,  zIRect.bottom_leftC  r  r)   c                 6    t          | j        | j                  S r  r  r-   s    r(   r)  zIRect.bottom_rightC  r  r)   c                 <    t          d| j        | j        z
            S r   r  r-   s    r(   r  zIRect.heightC  r  r)   c                 ,    |                      |          S )zCheck if x is in the rectangle.r  r  s     r(   r  zIRect.containsC  r  r)   r  c                 8    t          | j        | j        |          S r  r  r>  s     r(   r  zIRect.get_areaC  r  r)   c                 D    | j                             |          }|j        S )z$Extend rectangle to include point p.)r   r  rO  )r'   r  r   s      r(   r  zIRect.include_pointC  s    y&&q))zr)   c                 D    | j                             |          }|j        S )z(Extend rectangle to include rectangle r.)r   r  rO  )r'   r  r   s      r(   r  zIRect.include_rectC  s    y%%a((zr)   c                 \    t                               | |                                          S )z4Restrict rectangle to intersection with rectangle r.)r#  rq  r-  rd  s     r(   rq  zIRect.intersectC  s"    ~~dA&&,,...r)   c                 8    t                               | |          S r+   )r#  r  r  s     r(   r  zIRect.intersectsC  s    tQ'''r)   c                 B    | j         | j        k    p| j        | j        k    S r  r5  r-   s    r(   r  zIRect.is_emptyC  r  r)   c                 ~    | j         | j        cxk    o
t          k    nc o| j        | j        cxk    o
t
          k    nc S )zTrue if rectangle is infinite.r  r-   s    r(   r  zIRect.is_infiniteC  r  r)   c                 B    | j         | j        k    o| j        | j        k    S r  r5  r-   s    r(   r  zIRect.is_validC  r  r)   c                 b    | j         rt                      S | j                            ||          S r  r  r  s      r(   r  zIRect.morphC  r  r)   c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r,   r,   r  s     r(   r   zIRect.norm.<locals>.<listcomp>C  r  r)   r  r-   s    r(   rh  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+   r
  r-   s    r(   r   z
IRect.rectC  s    Dzzr)   c                 6    t          | j        | j                  S r  r  r-   s    r(   r(  zIRect.top_leftC  r  r)   c                 6    t          | j        | j                  S r  r  r-   s    r(   r+  zIRect.top_rightC  r  r)   c           	      J   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  rd  s     r(   r  zIRect.torectC  s    GG 	Ht} 	H 	H 	HFGGGq!QDG8dgX664:-qx$+/EFFGAq!QT14001	r)   c                 \    t                               | |                                          S r+   )r#  r  r-  r)  s     r(   r  zIRect.transformC  s"    ~~dA&&,,...r)   c                 <    t          d| j        | j        z
            S r   r  r-   s    r(   r[  zIRect.widthC  r  r)   )0r.   r/   r0   rw  r   rr  r  r(  r_  rm  r   r'  r;  r=  r  rA  r   rG  rI  rO  r2  r,  r)  r  r  rm  r  r  r  rq  r  r  r  r  r  rh  r  r  r   r(  r+  r  r  r[  r  rX  r  r  r,   r)   r(   r   r   OC  s        - - -- - -* * *k k k
7 7 7! ! ! "&$4DTd o o o o o  - - -= = =, , ,  * * *  - - -1 1 1 ' ' X' ' ' X' ) ) X)$ $ $9 9 9 9 9  
  
/ / /( ( ( 8 8 X8 _ _ X_ 9 9 X9% % %3 3 3   8 8 X8   X ' ' X' ' ' X'	 	 	/ / / ) ) X) 
B	B	B	BBBr)   r   )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr@  r?  r  r  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibir@  symbr?  zadbr  i   ifitzr   r   rI  r   r   r	  r?  @   r  r  r  
   r  r     )r   rb  Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenr  MultiplyNormalOverlay
SaturationScreen	Softlightc                 :    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(   rr	  rr	  +E  sM      (D!  (D  (DiQRTUWXPYFZFZ  (D  (Def  (D  (D  (D r)   c                     d|  d| dS )Nz<</A<</S/GoTo/Dz>>/Rect[r  r,   r  s     r(   rr	  rr	  ,E  s    YYY1YYY r)   c                 F    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(   rr	  rr	  -E  so      /l!  /l  /l9VWYZ\]U^K_K_  /l  /lij  /l  /lqr  /l  /l  NO  /l  /l  /l r)   c                     d|  d| d| dS )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[r  r,   r    r
  r  s      r(   rr	  rr	  .E  s"    "eQ"e"e1"e"eq"e"e"e r)   c                     d|  d| d| dS )Nz<</A<</S/Launch/F<</F(r  r  r  r,   r  s      r(   rr	  rr	  /E  s#    "}1"}"}1"}"}_`"}"}"} r)   c                     d|  d| dS )Nz<</A<</S/URI/URI(r
  r  r,   r  s     r(   rr	  rr	  0E  s    ZZZAZZZ r)   c                     d|  d| dS )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[r  r,   r  s     r(   rr	  rr	  1E  s    gggggg r)   )rX  goto2r[  r\  r]  r^  r  c                       e Zd ZdZdS )r  z0Raised for documents with file structure issues.Nr.   r/   r0   rw  r,   r)   r(   r  r  4E  s        ::Dr)   r  c                       e Zd ZdZdS )r  zRaised if file does not exist.Nr  r,   r)   r(   r  r  8E  s        ((Dr)   r  c                       e Zd ZdZdS )r  z5Raised when creating documents from zero-length data.Nr  r,   r)   r(   r  r  <E  s        ??Dr)   r  r  r1  bidir.  r  r  r  r	  r  r  rv  rx  zcs-namedar]  descriptionr2  rh  effectr  re   r   r  
char_flagsrX  r   r  r7  r  rA   r  r  r  ry  r   rR  r  r   r  r	  spansrf  r\  rz  r   rw  r   r  r[  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`?)#   rT  )r	   rh?)%   -?)&   gL7A`?)'   jt?)r  r   ))   r   )*   rT  )+   r$  ),   r  )-   r$  ).   r  )/   n?)0   rT  )1   rT  )r  rT  )3   rT  )4   rT  )5   rT  )6   rT  )7   rT  )8   rT  )9   rT  ):   r1  );   r1  )<   r$  )=   r$  )>   r$  )?   g"~j?)r  r$  )A   v?)B   MbX?)C   rB  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  rB  )I   r   )J   x&1?)K   rB  )L   ʡE?)M   g r?)N   rB  )O   rB  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   rH  )U   Gz?)V   r)  )W   rW  )X   gp=
ף?)Y   q=
ףp?)r  rH  )[   r   )\   gV-?)]   r   )^   uV?)r  rT  )`   rT  )a   rO  )b   r$  )r  r$  )r  V-?)e   r)  )f   y&1?)g   M?)h   rL  )i   uV?)j   rL  )k   r$  )l   r$  )m   ;On?)n   rn  )o   r$  )p   r$  )q   rn  )r   r$  )s   rL  )t   r)  )u   rx  )v   r"  )w   rR  )x   gZd;O?)y   rR  )z   rk  ){   Q?)|   r|  )}   r  )~   r$  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )   r  )   gףp=
?)   gV-?)   r$  )   gK7A`?)   r"  )   rT  )   jt?)   r  )   r  )   r  )   y&1?)   r"  )   rL  )   /$?)   rL  )   g?)   r$  )   rp  )   r$  )r  r$  )   rx  )   rk  r  )   r$  )   r$  )   r$  )   r$  )   r   )r	  rL  )   r   )   rg  )   tV?)   rR  )   rb  )   r  )   rW  )   rW  )   r  )   rW  )   rW  )   r"  )   r"  )   r"  )   r"  )   r"  )   r"  )   r"  )   rW  )   r"  )   HzG?)   r  )   g{Gz?)   r  )   r$  )   r$  )   r"  )   rL  )   rL  )   r  )   r  )   rL  )   r  )   rL  )   rk  )   rs  )   r  )   r  )   x&?)   r"  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   rk  )   rk  )   rk  )   rk  r  )   rs  )   gK7?)   rR  )   rR  )   rR  )   r  )   r$  )   r  )   r  )   r  )   r  )   rk  )   rk  )   rk  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?  r1  )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&?)r0  gB`"?)r2  r  )r3  g=
ףp=?)r  r  )r4  g)\(?)r5  gOn?)r6  Mb?)r7  '1Z?)r8  gʡE?)r9  gDl?)r:  rJ  )r;  RQ?)r<  }?5^I?)r=  gT㥛 ?)r>  rk  )r?  gDl?)r@  gv/?)r  gX9v?)rA  g/$?)rC  r  )rE  r  )rF  r  )rG  r  )rI  gK7A`?)rK  g rh?)r  &1?)rM  r  )rN  r  )rP  gx?)rQ  r  )rS  r&  )rT  r  )rU  d;O?)rV  gK7?)rX  g+?)rY  gA`"?)rZ  g+?)r[  r  )r\  MbX?)r^  g=
ףp=?)r_  E?)r`  rW  )ra  r  )r  r  )rc  9v?)rd  g-?)re  gm?)rf  g;On?)r  g;On?)rh  gGz?)ri  r  )rj  r  )r  r  )r  gCl?)rl  ʡE?)rm  g?5^I?)ro  r  )rq  gv/?)rr  r"  )rt  r  )ru  gQ?)rv  r  )rw  V-?)ry  r  )rz  r  )r{  r  )r|  r  )r}  r  )r~  %C?)r  r  )r  r  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  r  )r  K7A`?)r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  gCl?)r   rh?)r  r  )r  gQ?)r  rD  )r  r  )r  r  )r  r  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r	  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )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                 x    |r|d         nd}ddddd}||         d         ||         d         z  d	z  }|| z  |z  S )
Nr   r[  )r   r   r   r"  r#  r$  r   r   r,   )r[  r  r  r-  r.  r  s         r(   r  r  G  sS    $477D[LQQA	
4agaj	 Q&Au9vr)   c                     g }|                                  s|S t          |          D ]-}|                    t          j        | ||z                        .t          |          S r+   )rI  rK  rj   r   r1  r  )r  r  rD   rF   r   s        r(   _read_samplesr  G  sg     C>> 
AYY ? ?

E(&&1*==>>>>#;;r)   c                     || k    o| |k    S r+   r,   )rE   lowhighs      r(   r  r  G  s    !8!T	!r)   c           
         t          j        |           }t          |          D ]:}|}||v r
t          j        | |          }t          j        |t          d                    }|j        sIt          j        |          }t          |dz
  dd          D ]}t          j        ||          }	t          j	        t          j        |	t          d                    t          d                    s[t          j        |	t          d                    }
t          j        |	t          d                    }|
j        ret          j	        t          j        |
t          d                    t          d	                    st          j        |
t          d
                    }d}t          j
        |          r+t          j        |d          }t          j        | |          }nXt          j        |          rDt          j        |                                 t          j        |                    \  }}}|j        }|dk     r|}||v rt          j        ||           ɐ<d S )Nr  r   r0  r  r
  r  r  r#	  GoTor  r   )r   r;  rK  r>  r  r  r   r  r  r  r  pdf_lookup_page_numberr+
  r  r   r  r   r  )rY  rt  	pagecountr   rH  rD  r  r  r  r  r  r  r  r"
  r"  r  s                   r(   rs  rs  G  s8   %c**I9 3 3==+S!44#Whx.@.@AA  	"6**taxR(( 	3 	3A#VQ//A$e&8!Xi=P=P&Q&QS[\bScScdd 'HSMM::F%q(6*:*:;;D  B(%*<fhsmm*T*TV^_eVfVfgg )68C==AAC!4(( $,dA662C@@$d++ $!&!6		UE]_cEdEd!e!e!QmQwwBW}}&222+	33 3r)   c                     t          | t          j        t          j        f          sJ dt	          |           d|             | j        st          t                    d S )Nztype(cond)=z cond=)r=   r   r   r   r   r   rf   MSG_IS_NO_PDF)conds    r(   
ASSERT_PDFr  G  sd    dU]E,=>??YYAYDJJAYAYRVAYAYYYY? '&&&' 'r)   c                  N    t          t          t          t          t                    S r+   )r   r6  r5  r,   r)   r(   EMPTY_IRECTr  G      /?OTTTr)   c                  (    t                      j        S r+   )
EMPTY_RECTr  r,   r)   r(   
EMPTY_QUADr  G  s    <<r)   c                  N    t          t          t          t          t                    S r+   )r#  r6  r5  r,   r)   r(   r  r  G      /?SSSr)   c                 B    t          |           st          d          d S )Nz No journalling operation started)JM_have_operationrf   rY  s    r(   rX  rX  G  s+    S!! <:;;;< <r)   c                  N    t          t          t          t          t                    S r+   )r   r5  r6  r,   r)   r(   INFINITE_IRECTr%  G  r  r)   c                  (    t                      j        S r+   )rv  r  r,   r)   r(   ra  ra  G  s    ??r)   c                  N    t          t          t          t          t                    S r+   )r#  r5  r6  r,   r)   r(   rv  rv  G  r   r)   c                 f    t          | t          j                  sJ t          j        |           }|S )z3
    Turn fz_buffer into a Python bytes object
    )r=   r   rk  r
  )r,  rF   s     r(   r  r  G  s1     gu~.....

&w
/
/CJr)   c                     | dS t          | t                    sJ dt          |                       |                     dd          }d}|D ]}|t	          |          z  }|S )Nr[   ztype(c)=r	  surrogateescape)r=   r   r   r  r	  )r  r
  rF   bbs       r(   r  r  G  sv    & 	yra,,}$q''}},,,	*++A
C  s2wwJr)   c                    t          | t          t          f          r| }nt          | d          rz|                                 }t          |t
                    r|                    d          }t          |t          t          f          st          dt          |                     n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.
    rv  r  z&.getvalue() returned unexpected type: )r=   r  r]  r:   rv  r   r  rf   r   r   rk  r  )r   r}  s     r(   r&  r&  H  s    
 &5),-- 	 		$	$    dC   	(;;w''D$	 233 	SQT$ZZQQRRR	S ~/555r)   c                 N    t          |           sd S t          | |                   S r+   )r@  rm  )r  r6  s     r(   JM_FLOAT_ITEMr.  ,H  s'    C   tS??r)   c                 |    |t          |           k     r(| |         }t          |t          t          f          rd|fS dS )Nr   r  )r6   r=   r3   rm  )r  r6  r  s      r(   r@  r@  1H  s>    
SXX~~3xdS%L)) 	d7N7r)   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
        |          }||k    r	t          j        |          }|j        rt          j        |          }||	k    r3t          |          D ]"}t          j        ||t          j                   #nt          |          D ]"}t          j        ||t          j                   #nnt          j        |          rt          j        d          }nE|j        r>t          j	        |          t          j	        |          k    rt          j        d          }t          j        ||||          }|rt          j        |           nt          j        |d           t          j        ||          }|r:t          j        ||t          j                    t          j                               n9t          j        ||t          j                    t          j                               t          j        |           |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_separationsrK  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsr!  rg  rh  r  r  rq  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.  oirD   r   r  r  s                          r(   r  r  9H  s   
 JJ# #DJs##Ft$$DD!!E"4//D"400Dt$$D 
	(	-	-B	} 6 $$(=b(A(AAA1"55J 
(..? 	/*400A
""q X XA4T1e>VWWWWX q ] ]A4T1e>[\\\\])$// 		/ +A..DD] 	/u4R88E<QR\<]<]]]
 +A..D

'
D$
F
FC 4c""""(d333

"63
/
/C R$U^%5%5u~7G7GHHHH"4en.>.>@P@PQQQ	#Jr)   c                     | S r+   r,   r_  s    r(   rz  rz  H  s    Hr)   r  r  c                 >    t          t          d |                     S )Nc                 L    t          |           dk    rt          | d          ndS )Ng-C6?r   r   r  r-  r_  s    r(   rr	  zJM_TUPLE.<locals>.<lambda>H       c!ffnnuQ{{{! r)   r   r  r  s    r(   r  r  H      CCQGGHHHr)   c                 >    t          t          d |                     S )Nc                 L    t          |           dk    rt          | d          ndS )Nr  r   r   rG  r_  s    r(   rr	  zJM_TUPLE3.<locals>.<lambda>H  rH  r)   rI  rJ  s    r(   	JM_TUPLE3rN  H  rK  r)   c                     | dS t          | t                    r|                     d          } t          | t                    sJ dt	          |           d|             | S )Nr[   r	  ztype(s)=z s=)r=   r  r  r   r   rp  s    r(   r  r  H  si    yr!U HHVa111$q''11Q111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        _        dS )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   rD  JM_annot_id_stemrz  pdf_new_stringr6   r  r)  r   rP  )	r   stemr   r  r  r   stem_idresponser   s	            r(   r(  r(  H  s    
 eU^,,,,,5!!D#U++I &&E	A%111a11%	Q	
 G$$H3x==99D		4...-.DHHJJ***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          |           dS t          t          t
                     dS )z1
    Add OC object reference to a dictionary
    r   r/  r  OCMDr  N)
r   r  ry  r  MSG_BAD_OC_REFr]  r  r  r}  rM  )rY  r  r  indobjrZ  s        r(   r  r  H  s     #Cq11FV$$ 2 0111vx'7'788E00A55x'7'788A==377777 011111r)   c                    t                      }d }d}d}d }t          j        | t          d                    }t          j        |          rt          j        t          j        |d                    }t          j        |          dk    rut          j        |d          }t          t          j        |                    D ]>}t          j	        t          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        ||                    }|
                    |           ?t          j        | t          d                    }|j        r4t          j	        t          j        |t          d                              }t                      }
||
t          <   t          |          |
t           <   ||
t"          <   ||
d<   |
S )Nr0  Borderr   rI  r   BSr	  r#	  r[   r  BEIr^  )r   r   r  r  r  r  r  r  rK  r  rj   r   rx  r4   r
  r   dictkey_dashesdictkey_style)r  dash_pyr\  r[  r^  r  dashr   r  bs_or  s              r(   r  r  H  sR   ffGEEF
C

i(););
<
<C3 %!5#6Q#?#?@@$$))&Q//DE/6677 % %&(;T1(E(EFF$$$$y(4..99D 	%!5#5tXc]]#K#KLL!5#5tXc]]#K#KLLB;;E $66> 	%E/5566 % %&(;S!(D(DEE$$$$

i$
8
8C
~ L!5#5sHSMM#J#JKK
&&CC '??CCCNJr)   c                    t                      }t                      }t                      }t          j        | t          j                  }t          j        |          rbt          j        |          }t          |          D ]>}t          j        t          j	        ||                    }|
                    |           ?||t          <   t          j        | d          }t          j        |          rbt          j        |          }t          |          D ]>}t          j        t          j	        ||                    }|
                    |           ?||t          <   |S )Nr2  )r4   r   r   r  PDF_ENUM_NAME_Cr  r  rK  r  r  rj   dictkey_stroker   dictkey_fill)r  r  bcfcr  rD   r   r^  s           r(   r  r  H  s)   
&&C	BB9e&;<<A! ""q 	 	A#U%8A%>%>??CIIcNNNNCIt,,A! ""q 	 	A#U%8A%>%>??CIIcNNNNCJr)   c                 v   t          | t                    sJ d }d}|                     t                    }|                     t                    }|                     t
                    }|                     dd          }t          |          }	t          j        |t          d                     t          j        |t          d                     t          j        |t          d                     |dk     r|	                    t                    }||	                    t                    }||	                    t
                    }|dk     r|	                    dd          }t          |t                    rt          |          dk    rot          |          }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k    rt          j        |t          d          d
           t          j        |t          d                    }t          j        |t          d	          t          d                     t          j        |t          d          |           d S d S )Nr   r^  r0  r^  r_  r]  r  r	  r#	  r   r  r`  )r=   r4   r7   r
  ra  rb  r  r   r@  r  r   r6   rJ  pdf_array_push_intr  pdf_new_realJM_get_border_stylerQ  r  rM  rH  )r  r)  r  r  dashlennwidthndashesnstylencloudsoborderdarrr  s               r(   ra  ra  H  s   fd#####
CGZZ''Fjj.))GZZ''Fzz8R((G y))G 
	8D>>222		8D>>222		8H#5#5666 zzm,,++~..~++}--{{;;"--7E"" MsG}}q'8'8w--"C11 	/ 	/A$dA....YhtnnhsmmLLL	''TNNSMM	   !||!6**smm	C$#GGG{{HTNNA>>> )Xd^^<<C#>>>Xc]]G<<<<<	 {r)   c                     | dk    rdS d| cxk    rdk    sn | dk    rt          |           S d| cxk    rdk    rn ndS | d	k    rd
| z  S d| z  S )Nrd  z\u005cr?     r  i   i  z\ufffd  z\u%04xz\U%08xr	  r
  s    r(   make_escaper|  0I  s~    	Rxxy	rSB"HH2ww	2									y	v2~2~r)   c                 J    t          j        | t          |                     dS )zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)r   r  r|  )rN  r
  s     r(   r  r  =I  s#     
4R11111r)   c                     t          |          }|j        |j        |j        |j        ||||f}|                     |           |dz   t          j        t          j        j                  fS )z'
    Functions for wordlist output
    r   )	r;
  r	  r  r  r
  rj   r   rg  r  )r  rN  rF  r  r  rG  rp  r  s           r(   rB  rB  DI  sj     	t$$AHHHH	E 
LLA:u|EL$<====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        ||          rt          j        ||           _t          j        ||           dS )z1
    Add OC configuration to the PDF catalog
    r  r   r   r  Nr  	BaseStater  r  r  r   )r  r   r  r  r  r  rR  r~  rM  r6   rK  r@  r  pdf_array_containsr  )rY  r   r  r  r  configsr  onarrayrf  rD   r   r  r_  inds                 r(   r  r  WI  s    !#
&
&C #x	':':;;Gw'' I*C)1D1DaHHC##A	"Ax'7'7>>>&8I+>+>HHH	8K00(5//BBB&8D>>1==G 4!3(8(899GGq 	4 	4AD!"a((GAtAvv(#tQ77C's33 4$gs333	'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   rT  r   r
  r
  r  r  )rn   r
  rW  r  s       r(   r  r  uI  sf     	T2A""A?  tadR]''''tbm((Hr)   c                 0   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)rX  rn   r
  r  s       r(   JM_char_font_flagsr  I  s    E / /$T2...	U$T**-===E	U#D)),===E	U(..1EEEE	U"4((>99ELr)   c                 H   t           r1t          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        j        j        }	| j        j        j        }
t          j        |	|
 |
|	dd          }t          j        |	|
|
 |	dd          }|	dk    rd|_        d|_        t          j        dddd|j        j        j         |j        j        j                   }t          j        dddd|j        j        j        |j        j        j                  }t          j        t          j        |j        j                  |          }t          j        ||          }|	dk    rA|j        j        dk    r1||j        _        ||j         _        ||j!        _        ||j"        _        n4| |j        _        | |j         _        | |j!        _        | |j"        _        |j!        j        dk     rd|j!        _        d|j        _        |j"        j        |j!        j        z
  }|t&          k     rst          j#        ||j        j$                  }|rRt          j%        ||| j        j                  }|j!        j        ||z  z   |j"        _        |j"        j        |j         _        t          j        ||          }t          j        ||          }|S )zI
    re-compute char quad if ascender/descender values make no sense
    r   r   r  皙?r  r0  )&r  r   rI  r   r  r   r=   FzStextLineFzStextCharr  r   r  r
  FzFontll_fz_keep_fontrX  JM_font_ascenderJM_font_descenderr  FLT_EPSILONr   r
  r  r	  rh  r$  r%  rh  r  r  fz_transform_quadr  rN  rL  rM  r  r  r  )rn   r
  rX  rI  rJ  r  asc_dscr.  fwidthr  rp  trm1trm2xlate1xlate2r  cwidthr   s                     r(   r  r  I  s     Q |E.OOPPPdE-.....b%+,,,,,% w w<-bm.@AABBD
4
 
 C
D
!
!CMECi+%G!||499|BM.///
 MEd##DWtwF
Tzz# w{{GmGmCiG
+
C
+
C
 	AAA2q!Q22D1qb!Q22D	R!!Q1r}/C/E.EH\H^G^__F!!Q1bm.B.DbmFZF\]]F"5<0B#C#CVLLD"4..D 	Avv$')a--					D	D	D	D	
 wy1}}		WY"F)4AA 	"+T5$/:OPPF	FUN2DGI	DGI"4..D"400DKr)   c           
         t          j        | j                  }t          j        | d          }t	          |          }|dk    rdS 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}|                    |           t          j
        t          j	        ||                    }|                    |           |S )z8
    return list of choices for list or combo boxes
    r   NOptr   r   )r   r   r   pdf_choice_widget_options2r6   r  r  rK  r  r  r  rj   )	r   r  r  rD   optarrrF  r   r  r  s	            r(   JM_choice_optionsr  I  sD    #UZ00I+UA66DT

AAvvHUOO<<FEAYY 
 
!4fa!@!@AA66,e.A5CVX^`aCbCbde.f.fgg,e.A5CVX^`aCbCbde.f.fggC LL#*E,?,K,KLLCLL#Lr)   c                    t          j        |t          j        |                     }|j        |j        z
  }|j        |j        z
  }|dk    s|dk    rdS |                                 }||j        |                                 z
  z  | 	                                |j        | 
                                z
  z  z   }t          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  }|                                 rt          j        | |d           |dz  }||z  }|dk    rn|dz  }dS 	 |}t          |          D ]}t          | 	                                dz
            D ]}	t          j        | ||           |dz  }|                                 rt          j        | |d           |dz  }tt          j        | ||           |dz  }||z  }|dk    rn|dz  }dS )zO
    Clear a pixmap rectangle - my version also supports non-alpha pixmaps
    r   rI  r	  r   )r   fz_intersect_irectr  r  r	  r
  r  r/  r%  rD   r$  r  r  rK  r0  r  )
r  r   r
  r   r%  destspandestprp  r$  r  s
             r(   ri  ri  J  s    	 E$8$>$>??A	qtA	qtAAvvaq{{}}Htvvxx(46688qtdffhh+GGE T__..//144e	A1a[[  $T1a000Q$T1a000Q$T1a000Q$T1e444Q::<< (q#666FAXEAvvFA#	$ qq 		 		A46688A:&&  $T1e444Qzz|| $T1c222Q$T1e444Q66	Q  1r)   c                 X   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k    rd||<    t          |          |fS )Nr0  )r   r   r   rI  r   r   )r=   r3   rm  r   r   r6   rK  )r  rF   r   s      r(   r:  r:  9J  s    %#u&& utUm,, 2v
5zz%%2v
(C3s88__  q6A::Q!CFs88S=r)   c                 8    	 t          j        | j        |          S r+   )r  r   ll_JM_color_countr   r4   r   r  r  r2  r  r/  r  r	  r
  r  rD   r%  r$  r  fz_is_empty_irectrK  r7   )r  r   r   ro  rO  r/  r[  r  rD   	substriderp  oldpixr   r  newpixrp  r  s                    r(   rk  rk  KJ  s    <&r}d;;;r)   c                     t          j        | t           j                  \  }}|r|dk    rdS 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_BESTrk  fz_new_buffer_from_datafz_resize_buffer)inbufferr}  compressed_lengthr  s       r(   JM_compress_bufferr  sJ  su     $D! D

  $))t
.6t=NOO
P
PC	3 1222Jr)   c                    d}t          j                    }| D ]}|j        j        t          j        k    r|D ]t}d}|D ]i}t          ||          }t          ||          rGd}|r|                    d           d}|                    t          |j        j
                             j|rd}u|                                }	|	S )Nr   r   r$   )r8   StringIOr   r   r   r  r  r  r   r|  r  rv  )
r   r  need_new_liner  r  rn   line_had_textr
  r  rp  s
             r(   r<  r<  J  s    M[]]F " " E$=== 	" 	"DM ? ? r**#D!,, ?$%M$ *T***()LLR]_!=!=>>> " !	" 	AHr)   c                    t          j                    }d}|}|}||k    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          j        d          }t          j        |          }t          j        |||           |                                 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   r0  NrI  r   i    ) r   r   r  r  r-  r  pdf_page_writer  rq  r  r  rm  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r
  r=   r  )r)  ru  r  rX  r  rq  rp  r_  rQ  r   r   ro  r  r`  rp  rq  r  r  r  r  s                       r(   r  r  J  s   
   FD
A
A	Bww
6
"
"C
A1a   	!#q))&t,,#(#7#I#I Y$U^%5%5u~7G7GHHHc"""%fhYQQfb(33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    ru|t          t          z  z  }t          j        t          j        |           t          j        |          t          d          t          d          t          d                     t          j        t          j        |           d          }|j        sft          j        | d          }t          j        t          j        |           |t          d          t          d          t          d                     t          j        ||           n# t$          $ r t&          rt)                       t          j        ||           |t           j
        k    rct          j        t          j        |           t          j        |          t          d          t          d          t          d                      w xY w|S )	NzRoot/AcroForm/SigFlagsr  r-  r.  r  zRoot/AcroForm/Fieldsr   r  )r   r  r  r1  pdf_create_annot_rawr2  r   JM_set_field_typer~  r  PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyr  r  r   rJ  r  rf   r	  ru   r  )	r)  r   r   	fieldnameold_sigflagsr   r  r  rS  s	            r(   r  r  J  s;   #E$78I#8N8NPh$i$ijjL
 &tU-CDDE#E**I&#y$///&y(3--KKK5222#'>AS'STH%c**%h//V$$Z((Z((   "5#4S#9#9;QRR 	&sA..D%c**V$$Z((X&&   	T9----   4N$4$4$4tU+++5222%c**%l33V$$Z((Z((   	 Ls   .E"G B)I:c                 n   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   re  r  r   r  r?  r  r  r  r
  r  )rq  ro  rf  r  r
  s        r(   re  re  K  s      *)))8$$H.x)9L9LMM G  )) U-CG-L-L 	wz	!B	wz	!BGJGJNr)   c                     t          |           }t          |j        |j        z
            }t          |j        |j        z
            }t          j        ||          }|S r+   )re  r  r  r	  r
  r  r   fz_make_point)rq  r   r   r  r  s        r(   JM_cropbox_sizer  K  sR    hDDGdgADGdgAq!$$DKr)   c                 H    t          |           }t          j        |          S )z&
    just the inverse of rotation
    )r  r   rB  )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  rI  r  r  r  r  r/  Filespecs     r  r  r  r  )r   rR  rQ  r  r~  rM  r)  r  r*  r(  r  rH  )rY  r  re   r  r  r
  r  r  efbsr  r  paramss                r(   r  r  %K  s    D

S!
$
$C	C$333		 htnna	8	8B	"3x@@@	"3	BBB	"3(8(8$???	sHV,,hz.B.BCCC	B044LNN	 	A 
r8C==!,,,S!S(+++%c**GD!	1htnnd333	1hx00$777$Q(:(:A>>F	68F#3#3T:::Jr)   c                    t          j        t          j        |           t          d                    }t          j        |t          d                    }|j        r:t          j        |          dk    r"t          j        |t          d                     t          j        |t          d          t          d          t          d                    }|j        r%t          j        |t          d          d           dS dS )	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  rt  r	  N)	r   r  r1  r  r   rz  r@  r  rT  )rY  r<  collefiless       r(   r  r  JK  s     u0#668H8HIID dH\$:$:;;D 95-d33q884,!7!7888 W_%%W	 F  Nhz&:&:<LMMMMMN Nr)   c                 b    | j         sdS t          j        |           }t          |d          }|S )Nr[   r  errors)r   r   r
  r=  )rN  rp  r  s      r(   r;
  r;
  bK  s8    ? r$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          |                               dS dS )z!
    Store ID in PDF trailer
    r3  r	  r[   r   N)r   r  r1  r  r   
fz_memrnd2r	  r  r  rT  r6   )rY  rf  rnd0rndr   s        r(   r 	  r 	  jK  s     
e/44htnn
E
EC> 	I##  	 	A3q66MCC&(93(?(?$QRSSc5#7c#hh#G#GHHHc5#7c#hh#G#GHHHHH	I 	I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-  rN  r   r  r   r  r   r  r  r  RBGroups)r   r  r1  r  r   rQ  r  )rY  r  r<  r  s       r(   r  r  zK  s=    
U/0A#0F0FQWHXHXYY[cdr[s[s
t
tC
~ 
e/44hv6F6FGGD

!$(@(@!
D
DC	S(6"2"2A666Xc]]A66A	Q222	Q333	Q 1 11555	Q 4 4a888Jr)   c                 ~   | sdS |                      d          rdS |                      d          rdS |                      d          rdS |                      d          rdS |                      d          rd	S |                      d
          rd	S |                      d          rdS |                      d          rdS dS )z'
    Make /DA string of annotation
    r  Cor  coTir  tiSySymbr^  Zar  zar2   r
  s    r(   JM_expand_fnamer  K  s     !66t-vvt-vvt-vvt-vvt-vvt-vvt-vvt-vv6r)   c                    | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )	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     ,,,x...z111}***v---y...z///{9r)   c                    t          | t          j                  sJ t          j        |t          j        |                     }|j        |j        z
  }|j        |j        z
  }|dk    s|dk    rdS | 	                                }||j        | 
                                z
  z  |                                 |j        |                                 z
  z  z   }	 |}t          |          D ]G}t          |                                           D ]#}	t          j        | |||	                    |dz  }$H||z  }|dz  }|dk    rnkdS r  )r=   r   r"  r  r  r  r	  r
  r  r/  r%  rD   r$  rK  r0  )
r  r^  r
  r   r%  r  r  rp  r$  r   s
             r(   r  r  K  s@   dEN+++++ E$8$$?$?@@A	qtA	qtAAvvaq{{}}Htvvxx(46688qtdffhh+GGE	q 	 	ADFFHH%%  $T1c!f555Q 		Q66	 1r)   c                    t          | t          j                  sJ d}t          j        |           }d}t	          |           }t          j        |          }	 t          |t          j                  sJ |j        sn]t          j        |          }t          j        |d          }|j        rt          j        ||          sd}nt          j	        |          }|r|S dS )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   r}  r3  )r   r  r  r  r   irt_annot_objr  s          r(   r  r  K  s    
 eU^,,,,,I#E**IE5!!D%d++I
4)U^44444# 	+I66u55< 	#Ay11 (33	
4   r)   c                 ~    t          | t          j                  sJ t          j        rdS t          j        |           S )3
    need own versions of ascender / descender
    rw  )r=   r   r  r  r   r
  )rX  s    r(   r  r  K  s=     dEL)))))% s!$'''r)   c                     t          | t          j                  sJ t          j        rdS t          j        |           }|S )r  gɿ)r=   r   r  r  r   r
  )rX  rF   s     r(   r  r  K  sA     dEL)))))% t

!$
'
'CJr)   c                     	 | dk    s| dk    sd| cxk    rdk    rn ndS |sdS t          |           }|D ]}||k    r dS dS )z7Check if ch is an extra word delimiting character.
    r   r?  r  i*   i.   TFrz  )r
  rC  r
  r  s       r(   r@  r@  K  s    8899R!!!!6!!!!! t ur77D  9944 5r)   c                 "    | dk     s| dk    rdS dS )Ni  i 	  FTr,   r{  s    r(   rA  rA  L  s    	EzzR%ZZu4r)   c                     t          | t          j                  sJ t          j        |           }|                    d          }t
          j        s|dk    s|dk    r|S ||dz   d          S )Nr	  r0  r  r   )r=   r   r  r
  r   r  r   )rX  r   rp  s      r(   JM_font_namer  L  sk    dEL)))))d##D		#A  AGGqAvvA<r)   c           	      &   d}t          j        |          }t          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          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}|                    |           |S )Nr   r   z' is no font dict ( 0 R)r  )r   rz  rK  r|  r{  ry  fz_warnrx  r   r  PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   r  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingr  r  rj   )rY  dict_fontliststream_xrefr   rD   r   refnamer/  r  r  r   r  r  r  r  s                   r(   JM_gather_fontsr  L  s   	
B5!!A1XX  (22)%33 ** 	Mou099ooeN^_gNhNhoooppp$Xu/JKK%h0LMM" 	e&7&A&A 	%h0HIIDDD%h0LMMX&& 	V)(E4TUUH)) 	2&sD11C!'**#E$5d$;$;<<!'**!(++ 	Ir)   r  r	  c           	      >   t          | t          j                  sJ d}t          j        |          }t	          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          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}|                    |           |S )	z6
    Store info of a /Form xobject in Python list
    r   r   z' is no form dict (r   r  Formr$  rt  )r=   r   r   rz  rK  r|  r{  ry  r  rx  r   r  r  r  r   pdf_to_matrixrq  r  r  rg  rh  rf  rj   )r)  r  	imagelistr	  r   rD   r   r
  	imagedictrZ  r  r  ru  r.  r  r  s                   r(   JM_gather_formsr  @L  s    c5,-----	
B5!!A1XX    (%33*5!44	 ++ 	Mpu099ppeN^_hNiNipppqqq"9hy.A.ABB (8(899 	y(6*:*:;;y(8*<*<==< 	#%a((CC.""C< 	=*E,=a,@,@#FFDD< ;<<D	** !7++%%	 	Ir)   r)  c                    d}t          j        |          }t          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          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                    r>t          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
}|                    |           |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  r9  BitsPerComponentBPC)r   rz  rK  r|  r{  ry  r  rx  r   r  r  r  r  r   r  r  r*  r  r  rj   )r)  r  r  r	  r   rD   r   r
  r  rZ  r  genr	  r  altcsr  csesr[  r  r  r  s                        r(   JM_gather_imagesr  hL  s^    
BE""A1XX 0  0 (22*5!44	 ++ 	Mpe/88ppeN^_hNiNipppqqq"9hy.A.ABB (9(9:: 		**#Ix/@/@(6BRBRSS 	*"5))C%i(1C1CXc]]SSg&& 	6)'155GQ H\,B,BHTNNSSb!! 	:D$T1--B!"hy&9&9:: :(Xl-C-CDD: +D!44%e,, :!/q99E#Ix/@/@(3--PP$Y0B0BHSMMRR!)X6H-I-I8TY??[[  '' (( %%#E$5b$9$9::#E$5e$<$<==#E$5g$>$>??#E$5g$>$>?? 	Ir)   c                 (   t          | t          j                  sJ d}t          j        |           }	 |j        snB|t          j        t          j        |                    k    rd}nt          j        |          }J|st          d|z            |S )z$
    retrieve annot by its xref
    r   r   z$xref %d is not an annot of this page)	r=   r   r   r  r   r   r   r3  rf   )r   r  r  r   s       r(   r  r  L  s     dEM*****E!$''E- 	5#E$7$>$>????E$e,,-  G>EFFFLr)   c                 `   t          | t          j                  sJ |sdS d}t          j        |           }	 |j        snZt          j        t          j        t          j        |          d                    \  }}||k    rd}nt          j        |          }b|st          d|z            |S )z*
    retrieve annot by name (/NM key)
    Nr   r   r  z!'%s' is not an annot of this page)
r=   r   r   r  r   pdf_to_stringr   r   r3  rf   )r   r   r  r   rW  r  s         r(   r  r  L  s     dEM***** E!$''E, 	,U-@ATUZA[A[]a-b-bcc$8E$U++,  D;dBCCCLr)   c                 v   g }t          j        |                                 t           j                  }|j        s|S t          t          j        |                    D ]Z}t          j        ||          }t          j        |d          }|j        r'|	                    t          j
        |                     [|S )Nr  )r   r  r  PDF_ENUM_NAME_Annotsr   rK  r  r  r   rj   r  )r   r  r  r   r  r   s         r(   rD  rD  L  s    EU-GHHF E'//00  '22	"9d33? 	LL(..   Lr)   c                 f   t           rt          j        |           }|S g }t          j        | t          d                    }t          j        |          }t          |          D ]}t          j        ||          }t          j	        |          }t          j        |t          d                    }|j
        sUt          j        t          j        |                    }|t          j        k    rt          j        |d          }	|                    ||t          j        |	          f           |S )zK
    return the xrefs and /NM ids of a page's annots, links and fields
    r  r  r  )r  r   rb  r   r  r  r  rK  r  r   r   r  rx  PDF_ANNOT_UNKNOWNr   rj   r  )
rq  r  r  rD   r   r  r  r  rZ  rf  s
             r(   rb  rb  L  s     ,h77E8H+=+=>>FV$$AAYY 
E 
E'33	++$i)1D1DEE! 	0%2CW2M2MNNE+++!9d33tUE$<c$B$BCDDDDLr)   c                     |                      d          } | j        st                      S t          |                                           S r  )r%  r   r   rb  r  r   s    r(   rH  rH  L  s>    >>5>))D? vv!488::...r)   c                 N   t           j        }| |S | }|                    d          s|                    d          rt           j        }n|                    d          s|                    d          rt           j        }n|                    d          s|                    d          rt           j        }nm|                    d          s|                    d	          rt           j        }n6|                    d
          s|                    d          rt           j        }|S )z7
    return pdf_obj "border style" from Python str
    Nr
  r  r  r  r   r`  r.  Urp  r#	  )r   PDF_ENUM_NAME_Sr2   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r\  r  rp  s      r(   ro  ro  L  s    
C}
A	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		Oall3//O%:OCJr)   c
                 t  	 	fd}
d}d}|r"t          j        d||d          } |
|          S |r1t          |          }t          j        d||d          } |
|          S |dk    rt          j        |          } |
|          S | rGt          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)rX  r
  s    r(   fertigzJM_get_font.<locals>.fertigM  sC     	0///$0 	5'e444r)   r   Nr0  )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   rL  rM  r
  r(  r  r
  r
  r
  r
  r1  ra  rX  r  r}  r  s            `      r(   r
  r
  M  s        ED *D(E1EEvd||  ,,,dCBBvd||"}}$X..vd||  '11? 	 6$<<(7IFFvd|| 164@@D$D J,dD$qII vd||&hSSD6$<<r)   c                 z   |dk     rdS t          j        | |          }t          j        |t          d                    }|j        rJt          j        t          j        |d                    }t          j        |t          d                    }n"t          j        |t          d                    }|j        st          d           dS |}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           dS t          j	        |t          d                    rnUt          j	        |t          d                    rn2t          j	        |t          d                    rnt          d           |st          d           dS 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  rq   r  r  r  )r)  r  r  desftr  r   s         r(   r  r  JM  s-    axxc4((Aq(+<"="=>>E @()<UA)F)FGG h/?&@&@AA H-=$>$>??> 8999AF

Q 4 4
5
5C
~ 

Q 5 5
6
6C
~ 

Q 5 5
6
6C
~ N hy&9&9::> 	%"3C"8"8 	5666FS(8"4"455 	NsH_$=$=>> 	NsHZ$8$899 	NLMMM ./// (((r)   c                    t          j        | t          d          t          d                    }|j        sdS t          j        |          }|dk     rdS g }t          |          D ]k}t          j        ||          }t          j        ||          }t          j        |          }t          j	        |          }|
                    ||f           l|S )z
    Return the items of Resources/Properties (used for Marked Content)
    Argument may be e.g. a page object or a Form XObject
    r4  
Propertiesr,   r   )r   r  r  r   rz  rK  r|  r{  rx  r   rj   )	r  
propertiesrD   r   r   r  r  r  r  s	            r(   r  r  M  s    
 $S(;*?*?,AWAWXXJ  !rz**q552q 	! 	!A(Q77C(Q77C!#&&A#C((DIIq$i    Ir)   c                    d}t          j        |           }|j        rJt          j        |          }|t          j        |          k    rd}nt          j        |          }|j        J|st          d| d          t          |          S )z%
    retrieve widget by its xref
    FTzxref z is not a widget of this page)r   r  r   r   r   r4  rf   r   )r   r  r  r   r  s        r(   r  r  M  s     E"D))E

 .'//	5#Y////E%u-- 
 .  FDDDDEEE%==r)   c                    t          j        | j                  }t          | 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        |          rct          j        |          }dg|z  }t3          |          D ],}t          j        t          j        ||                    ||<   - |d|            |dt          j        |j                              |dt          j        |j                             t          j        |t          d          t          d                    }t          j        |          rct          j        |          }dg|z  }t3          |          D ],}t          j        t          j        ||                    ||<   - |d|           t          j        |t          d          t          d                    }t          j        |          rct          j        |          }dg|z  }t3          |          D ],}t          j        t          j        ||                    ||<   - |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          j!        |                     "                                 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          j$        d2                                          |d3tG          t          j        |t          d)          t          j$        d4                                         dS )5z
    Populate a Python Widget object with the values from a PDF form field.
    Called by "Page.first_widget" and "Widget.next".
    c                 *    t          | |           d S r+   r  )r  r   r8  s     r(   SETATTRz)JM_get_widget_properties.<locals>.SETATTRM  s    U#####r)   c                 (    t          | ||           d S r+   rG  )modr  r   s      r(   SETATTR_DROPz.JM_get_widget_properties.<locals>.SETATTR_DROPM  s     	S%     r)   r  TFNr  r  r  c                 h   | }d}	 | j         sdS 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  rf   )r  r  slowhalfbeatr  r  s         r(   'pdf_dict_get_inheritable_nonempty_labelzIJM_get_widget_properties.<locals>.pdf_dict_get_inheritable_nonempty_labelM  s     	? $T3//C~ !055 ! L%dHX,>,>??D$/11 4555MH1}})$0B0BCC	r)   TUr  r  r  r  r  r  r^  r	  r   r   r  r  r  r  r  MKBGrW  BCr  r  rR  r  r5  r  r  r  r
  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   rx  pdf_field_valuepdf_field_displayr  r  r  r  rK  r  r  pdf_text_widget_max_lenpdf_text_widget_formatr  r  r?  pdf_field_flagsr  JM_get_scriptr2  )r   r8  r  r   rY  twrH  rK  r  r  rO  r  fvaluer  r  rD   r  r   r^  r  rp  sss    `                    r(   JM_get_widget_propertiesre  M  s    #EJ//I5:&&D
((**C	B$ $ $ $ $! ! ! &rw//J"FU444(i88 	'GK&&&&GK&&&&T"""L):5;WXa;b;b)c)cdddL,.?@RS]@^@^._._```*955JLz222  8 43Ix~~NNEV]E222FU666 )Xh-?-?@@> 	FLe.>.D.DEEE HTNN;;> 	,&s++F 2&y11L(9&(A(ABBBL%*A)*L*LMMM$U%8HTNNT\]`TaTa%b%bccLqL666

i$#
G
GC# 1$$C!Gq 	A 	AA#E$7Q$?$?@@AaDDV_a000L(Ebg(N(NOOOL(DRW(M(MNNN

i$$
H
HC# 0$$cAgq 	D 	DA&u':3'B'BCCCFFV\3///

i$$
H
HC# 2$$cAgq 	D 	DA&u':3'B'BCCCFFV^S111L*;E*B*BCCC		!%"@HUYNN"["[	\	\BL%6r%:%:;;;

i$$
H
HC
~ aV-/@AYZ]A^A^/_/_```L(=i(H(HIII  	9hsmm44A	q		BL2&&&L%-i$RUWWXX   L%-i$RUWWXX   L%-i$RUWWXX   L%-i$RUWWXX   L%-i$I[\`IaIabbcc   L%-i$I[\`IaIabbcc    r)   c                 6   |dk     rdS t          j        | |          }t          j        |t          d                    }|j        rJt          j        t          j        |d                    }t          j        |t          d                    }n"t          j        |t          d                    }|j        sdS |}t          j        |t          d                    }|j        rdS t          j        |t          d                    }|j        rd	S t          j        |t          d
                    }|j        rt          j        |t          d                    }|j        r%t          j        |          st          d           dS t          j	        |t          d                    rdS t          j	        |t          d                    rdS t          j	        |t          d                    rdS t          dt          j
        |                     dS )zF
    Return the file extension of a font file, identified by xref
    r   r  r	  r   r	  r9  pfar:  r	  r;  r  r<  r=  cffr>  cidr?  r	  zunhandled font type '%s')r   r  r  r  r   r&  r  r  rq   r  rx  )r)  r  r  r@  r  s        r(   r  r  IN  s    axxuc4((Aq(+<"="=>>E @()<UA)F)FGG h/?&@&@AA H-=$>$>??> uA

Q 4 4
5
5C
~ u

Q 5 5
6
6C
~ u

Q 5 5
6
6C
~ H hy&9&9::> 	%"3C"8"8 	56665S(8"4"455 	H5sH_$=$=>> 	H5sHZ$8$899 	H5.0A#0F0FGGG5r)   c                    t                      }t          j        |           rht          j        |           }t	          |          D ]D}t          j        | |          }t          j        |          }||vr|                    |           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  rK  r  r   rj   )rJ  list_rD   r   r  rB   s         r(   JM_get_ocg_arrays_imprl  uN  s    
 FFE3 #%%q 	# 	#A%sA..C#S))D5  T"""Lr)   c                 J   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        |          r_t          j        |          }t          |          D ];}t          j	        ||          }t	          |          }|
                    |           <|r||d<   t          j        | t          d	                    }|j        rt          j        |          }||d
<   |S )Nr  r  r  rG	  Lockedr$  r  rH	  r  rF	  )r4   r   r  r  rl  r   r  r  rK  r  rj   r   rx  )	confr   rJ  rk  rD   r   r  list1r  s	            r(   rO  rO  N  s   	B

dHTNN
3
3C!3''E 4

dHUOO
4
4C!3''E 5	

dHX$6$6
7
7C!3''E 8FFE

dHZ$8$8
9
9C3  %%q 	  	 A%sA..C)3//ELL :

dH[$9$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 |
                    d          }|                     ||f           d S )Nr   r   r   r  )r   r  rK  r&  r  r  r,
  fz_buffer_extractr=   r  r  rj   )	rF  r)  rD   r   r  r  r  r  r  s	            r(   r'  r'  N  s    D!!A1a^^    (%*=dA*F*FGGs##(%*=dAE*J*JKK!#q!,,#C((!U#####HHWsAh   r)   c                    | j         sdS t          j        | t          d                    }t          j        |          }|dk    r,t          j        | t          d                    }|j         sdS ndS t          j        |          r"t          t          j        |                    }n:t          j        |          r$t          j	        |          }t          |          }ndS |r|S dS )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  rx  r+
  r  r  r  r  r;
  )r  r  jjjsr
  r  s         r(   ra  ra  N  s     > 3..A		1		B	\Xd^^44} 	F	 	2 "5#;B#?#?@@		R	 	  #B''',, 
Fr)   c                 L    | j         j        rt          j        | d          sdS dS )z(
    Ensure valid journalling state
    r   r   )r   r  r   r  r#  s    r(   r"  r"  N  s/     ~ e&=c1&E&E q1r)   c                    | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j	        k    rd	S | t           j
        k    rd
S | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )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)rZ  s    r(   JM_image_extensionr  N  s    """uu"""uu$$$ww"""uu"""uu"""uu"""uu$$$uu###vv"""uu"""uu"""uu"""uu###vv5r)   c                 \   t          |t          j                  sJ t          j        t          j        j                  }t          j        t          j        |          |          }t          j        |t                    }|t          |          f}t          
                    |           d S r+   )r=   r   rq  rg  rj  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_inforj   )r  r  r   r  r  rW  r  s          r(   JM_image_filterr  N  s    c5>*****U\,--A!8!;!;SAAA$566A###Ddr)   c                    | sdS t          |           }|dk     rt          d           dS | }t          j        |          }|t          j        k    rdS |rt          j        ||          }nt          j        ||          }t          j        |          }t          j        |          }t          j	        |          \  }}	t          j
        |          }
t          j        |                                          }t                      }|                                |t          <   |                                |t"          <   |
|d<   t%          |          |t&          <   ||t(          <   |	|t*          <   |                                |t.          <   |                                |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)r6   rq   r   fz_recognize_image_formatFZ_IMAGE_UNKNOWNr  fz_new_buffer_from_shared_datarl  fz_image_orientation_matrixr  fz_image_orientationr  r  r4   r   r
  r  r  rp  r	  r  r  rD   r  r  r  r  r  r  dictkey_image)rK  
keep_imager  r  rZ  r  r  r  r  r  r  cs_namer!  s                r(   JM_image_profiler  N  s   
  t	??Daxx!"""tA+Q//E&&&t =2At<<2At<<*C00E

+U
3
3C*511JD$,e44K&(8(8(:(:;;GVVF"WWYYFM#ggiiFN(FM/44FN FL FL"'''))F 99;;FK-e44FK&FO '!&Mr)   c                 x   |                                  }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                 p    t                                                       |                                  d S r+   r   r   use_virtual_image_filterr'   r  s    r(   r   z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__2O  s1    GG))+++++r)   c                 N    t          d t          j        |          ||           d S r+   )r  r   rq  )r'   r  r  r   r  r  s         r(   image_filterz=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filter5O  s&    D%."5"5tUCCCCCr)   r.   r/   r0   r   r  r  r  s   @r(   SanitizeFilterOptionsr  1O  sN        	, 	, 	, 	, 	,	D 	D 	D 	D 	D 	D 	Dr)   r  r   )r  r  r  r  r  )r)  r   rq  r  rg  r  PdfSanitizeFilterOptions2r  r  r  r   )r   r)  ro  r  sanitize_filter_optionsfilter_optionsr   s          r(   rJ  rJ  *O  s    
((**C((|~~H	T8->???D D D D D ? D D D 4355+)  N J	"C~>>>	z		BJIr)   c                  F   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  r  rw  rY  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   r4   r6  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_SYMBOLrF   s
             r(   JM_fitz_configr  LO  s9   %eV444I%e];;;%eZ888M%e^<<<%e_===%e\:::O%e_===%eZ888M%e];;;
&&C.CM"5#677CJ"5#788CK"5#788CK"5#677CJ"5#677CJ"5#677CJ"5#566CI"5#677CJ"5#9::C"5#677C"5#677C"5#899C"9ooC"5#677CJ'CK+C
O/C0C-C0C+C
O.C"5#677CJJr)   c                    t          j        |t          d                    }t          j        | |t          j                    d          }t          j        |          }t          j        |          r/|rt          j        ||           nt          j        ||d           nt          j	        | d          }|r2|j
        rt          j        ||           t          j        ||           n1t          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  rW  rJ  r   rM  )rY  rD  newcontr  rp  newcontsr  carrs           r(   r  r  sO  s5    !'8J+?+?@@H#C%,..!DDHH%%D(## @ 	: 84444"8Xq9999"3** 	5" 5$T8444 x0000 x000" 5$T84447HZ$8$8$???Kr)   c
           
         d}
d}d}d}d}d}d}d}d}d}t          |            |	dk    rt          j        |	          \  }}}|r5t          j        d|||d          }
t          j        | |
|	||          }d}d}n|rt          j        |          \  }}|r3t          j        |||dd          }
t          j        | |
|          }d}d}n|rt          j        d||d          }
nGt          |          }|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   r0  r  r   r   r  r  )r   r   r  r3  r  r1  r2  )rX  r   r  r  pdf_add_cjk_fontr  pdf_add_simple_fontr2  r&  r   r  rJ  r]  r  pdf_add_cid_fontr   r  rx  r  r  r  r  r
  r
  r6  )rY  r  rL  rM  r  r6  r
  r
  r  r  rX  r  r}  ixrefra  r3  r   r   r  extor  r  rI  rJ  s                           r(   rK  rK  O  s    D
CDEEF
E	D	DDS"}}!4X>>dE  ,T4uaHH)#tXueLL
  	=4V<<JD$ 	0tQJJD0dHEEHDFF  H243JJ(44~ B.0@AAA4T3QGG  1#t<< 4S$IIX&&E 153EhPXYcPdPd3e3e f fggDe/1CXxXaObOb1c1cddeeD C !5c5!A!ABB

 
&
&C

!$
'
'Cv,,$  E Lr)   c                    t          | t          j                  r| S t          | t                    r-t          j        | j        | j        | j        | j                  } | S t          | t                    rAt          j	        | j        | j        | j        | j                  }t          j        |          }|S t          | t          j	                  rt          j        |           }|S | r"t          |           rt          |           dk    rt          j        t          j                  S g d}t          d          D ]k}| |         ||<   ||          t          j        t          j                  c S ||         t          k     r
t          ||<   ||         t          k    r
t          ||<   lt          j        |d         |d         |d         |d                   S )z>
    PySequence to mupdf.FzIrect. Default: infinite irect
    rI  r  Nr   r   r   r   )r=   r   r  r   r	  r  r  r
  r#  rg  r@  rC  r'  rK  r5  r6  fz_make_irect)r  rF   r  r   s       r(   r  r  O  s    !U]## !U M14qtQT22!T l14qtQT22mC  
!U\"" mA
 6$Q'' 6?1+=+=+B+B}U4555A1XX # #t!Q4<=!899999Q4/!!"AaDQ4/!!"AaDqtQqT1Q41666r)   c                    t          j        |           }t          j        |t          d                    }t          j        |          rt          j        |          S t          j        |          }g }t          |          D ]t}t          j        ||          }t          j	        |          rt          j        |d          }|
                    t          t          j        |                               u|S )z 
    ListBox retrieve value
    rU  r   )r   r   r  r  r+
  r  r  rK  r  r  rj   r  )r   r  r  rD   rF  r   elems          r(   JM_listbox_valuer  O  s    
 #U++IHSMM::FF## 1'000 	V$$AE AYY K K"FA..t$$ 	1&a00D')A4)H)HIIJJJJLr)   c           	         d}|dk     r|dz  }nu|dk    r||d         ddz  }n_|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        |           d S )Nr[   r   z0 g r   r  z g r   r   r   z rg z k rD  r  )r  r   r~  r   PDF_ENUM_NAME_DA)r   r  r^  r   r   r  s         r(   r  r  P  s*   
 Caxxw	#a&		#a&666SV666A66666#a&@@@SV@@@A@@@3q6@@@@@8x((8888888C	"5#6u#=#=u?UWZ[[[[[r)   c                 4    	 t          j        | ||||          S r+   )5r  r   JM_make_spanlistr   r  rg  r  r  r  r  r  r  r  r   rX  r"  r  r  r  rc  FZ_STEXT_SYNTHETICr  r  argbr  rI  r  r  r  dictkey_charsr;
  r  JM_py_from_pointdictkey_originrf  r  r  rj   r4   r  dictkey_flagsdictkey_bididictkey_char_flagsr  dictkey_fontr  r	  r  	dictkey_cr6  r  r  dictkey_spans)	line_dictrn   r  rN  r  	char_list	span_list	span_rect	line_rect
char_style	old_styler\  r  span_originr
  r  r  r  rI  r  	char_dicts                        r(   r  r  'P  s!    K%isD'JJJr)   c                    |                                  }t          |          }t          j        | j                  }	 |r*|t          j        t          j        fv s|t          j        k     r4t          j        | t          j	        t          j
                            }d}n}|dk    rL|                                 dk    r4t          j        | t          j	        t          j
                  dd          }n+t          j        t          j        |j                            }t!          |          }|                                 |t$          <   |                                 |t(          <   ||t*          <   |                                 |t,          <   |                                 |t0          <   |                                 |t4          <   |                                 |t8          <   t;          |          |t<          <   ||t>          <   dS )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  r  rI  r  r   N) fz_compressed_image_typer  r   ll_fz_compressed_image_bufferr   r  r  r  fz_new_buffer_from_image_as_pngr  r  rD    fz_new_buffer_from_image_as_jpegrk  r
  r  r  r   r
  r  r  r  r  r  r  r  r  r  r  r6   r  r  )r  img_dictimg_typer  ll_cbufr  r  s          r(   r  r  P  s    ++--H
X
&
&C 1#.AAGFF,e.DEEEe((( 3'(EFF  	35577a<<4,U-JKKRQRT T nU4W^DDEEc""F!eeggH]"uuwwH^H[#&5577H  XXZZH\ XXZZH\GGIIH[ [[H\$H]r)   c                 r   |                                  }t          ||           |                                }|j        rI|                    t          j        t
          j                            }|                                |d<   nd |d<   t          | 
                                          |t          <   d S )Nr  )r  r  r  r   r  r   r  r  rr  rp  r  r	  )r  r  r  r  rN  s        r(   JM_make_image_blockr  P  s    
--//CS*%%%88::D "33E4GHe4f4fgg!3355
6!
6!253D3D3F3F!G!GJ~r)   c                 R    	 t          j        | j        |||j        |j                  S r+   )r  r   JM_make_text_blockr   r   rg  r  r  r1  r.  r  r4   r  r  r
  dictkey_wmoder  rh  dictkey_dirrf  r  rj   dictkey_lines)
r  r  r  rN  r  	line_list
block_rectrn   r  r  s
             r(   r  r  P  s*    p'(8*c4?\c\nooor)   c                 :    	 t          j        | j        ||          S r+   )r  r   r  r   r   r  rg  ro  fz_contains_rectr.  r  r   FZ_STEXT_BLOCK_IMAGEr  r1  r4   r  r  rf  r  r  r  rj   dictkey_blocks)	r  r  r  text_buffer
block_listr  r  r  r  s	            r(   r  r  Q  s    J*2=)SIIIr)   c           	      F   g d}t          | t          j                  r| S t          | t                    r7t          j        | j        | j        | j        | j        | j        | j	                  S | r"t          |           rt          |           dk    rt          j                    S t          d          D ]2}t          | |          ||<   ||         t          j                    c S 3t          j        |d         |d         |d         |d         |d         |d                   S )	N)r   r   r   r   r   r   r  r   r   r   r   rI  r   )r=   r   rq  rt  r    r
  r  r  r_  r  r@  rC  rK  r.  rg  )r  r    r   s      r(   r  r  4Q  s   A!U^$$ !V <~ac13QS!#qs;;;  $Q''  ?1+=+=+B+B~1XX " "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   rg  rj  r  r?  r  r  r  r	  r  r  r
  fz_minfz_max)rq  page_mediaboxro  s      r(   r  r  CQ  s*    L!899M *8Xj5I5IJJ H h'' 5+DX+N+N LLhk22Lhk22Lhk22Lhk22	 M 	=++a//-"22Q66U\%<==r)   c
                    t           rt          j        | |||||||||	
  
        S |}
d}t          j        ||z
            dz   }||k     r\|}||k    rRt          | |||
||||	           |dz  }|dk    r||z  dk    rt          d| d| d           |dz  }|
dz  }
||k    PdS dS |}||k    rRt          | |||
||||	           |dz  }|dk    r||z  dk    rt          d| d| d           |dz  }|
dz  }
||k    PdS dS )z
    Copy a range of pages (spage, epage) from a source PDF to a specified
    location (apage) of the target PDF.
    If spage > epage, the sequence of source pages is reversed.
    r   r   z	Inserted r  z pages.N)r  r   r  r   fz_absi
page_mergerq   )doc_desdoc_srcspageepageapagerX  ry  r  r  	graft_map	afterpagecounterr  r   s                 r(   r  r  `Q  s   "  #  	 IGM%%-((1,Eu}}emmwy&%QZ[[[qLGq  W}%<%A%A?G?????@@@AIDNI emmmmmm emmwy&%QZ[[[qLGq  W}%<%A%A?G?????@@@AIDNI emmmmmmr)   c                    t          j        |                                 t          d                    }|j        s5t          j        |                                 t          d          d          }t          j        |t          d                    }t          j        |t          d                    }t          j        |t          d                    }t          j        |t          d                    }d}d}t          j        |          r^t          j        |          }	t          j        |          rt          t          j        |                    D ]c}
t          j	        t          j
        ||
                    }|                    d          s?t          j        |dd                   }||k    r|}dn#t          j        |t          d          |	          }|d	z  }t          |	          D ]x}
t          j	        t          j
        ||
                    }t          j        |dd                   |z   }d| }t          j        ||
          }t          j        |||           yt          j        |          rt          t          j        |                    D ]c}
t          j	        t          j
        ||
                    }|                    d
          s?t          j        |d	d                   }||k    r|}dn#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        |||           y||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>.
    r4  r   r8  r0  r0  Alpr   Nr   r  r   )r   r  r  r  r   rQ  ry  rz  rK  rx  r|  r2   fz_atoir{  r  )r   temp_resr`  	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsrD   r   r  r  r   r  rX  s                   r(   r  r  Q  s    "488::x/D/DEEI R+DHHJJ8M8MqQQ	"9h{.C.CDDI#Ix/?/?@@J "8Xk-B-BCCI#Hhv.>.>??JGI ## 6y))Y'' 
	U5-i8899    ')?	1)M)MNN~~e,, M#abb'**w;;G  /	8K;P;PRSTTI1q 	6 	6A#U%;Y%J%JKKCc!""g&&0A99D()Q77C	45555$$ 	Mu)*5566 	 	A$e&<j!&L&LMMD??3'' d122h''A9}}		 ,Y8H8H!LL
NI5%j1122 3 3 %"8*a"H"HIIM$qrr(##i/1ww$Z33Jc2222Yr)   c                 p    t                               |            t          rt          d|             dS dS )z!
    redirect MuPDF warnings
    zMuPDF warning: N)r  rj   JM_mupdf_show_warningsrq   rp   s    r(   JM_mupdf_warningr7  Q  sG     ""4((( *($(()))))* *r)   c                 r    t                               |            t          rt          d|  d           d S d S )NzMuPDF error: r$   )r  rj   r  rq   rp   s    r(   JM_mupdf_errorr9  Q  sH    ""4((( *(((()))))* *r)   c                 P    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55r)   c           
          t          | t          j                  sJ t          j        | j        j                  }t          j        d          }| D ]}|j        j        t          j        k    r|D ]{}|D ]T}t          |t          ||                    st          j        |          s5t          j        ||j        j                   Ut          j        |t          d                     |t          j        |t          d                     |S )z1
    make a buffer from an stext_page's text
    r  r$   )r=   r   r  rg  r   ro  r  r   r  r  r  r  fz_append_runer  r  r
  )r   r   r  r  rn   r
  s         r(   JM_new_buffer_from_stext_pager>  Q  s    dE-.....<011D

c
"
"C 
1 
1 E$=== 5 5 ? ?B,T<b3I3IJJ !$)$=d$C$C! !(bmo>>>>$S#d))4444 c$ii000Jr)   c                    |dS t          |          }|dS t          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   rI  r#	  rt  ru  )
rz  r   r  r  r)  r*  rl  rM  r  r2  )rY  r   r}  r  r!
  	newactions         r(   JM_new_javascriptrA  R  s     }D|

.t{{6/B/B
C
CC!#sELNNA>>F&sA..I	y(3--1CL1Q1QRRR	y(4..&999r)   c                      t          |           S r+   )JM_new_output_fileptr_Output)r
  s    r(   r  r  R  s    '---r)   c                 `    | dk     r| dz  } | dk     | dk    r| dz  } | dk    | dz  dk    rdS | S )zB
    # return normalized /Rotate value:one of 0, 90, 180, 270
    r   r  r  r,   )rX  s    r(   r  r  R  sW     1**# 1**
C--# C--{aqMr)   c                     t          j        d          }t          j        |          }t          j        || ||           |                                 t          j        |           |S )Nr  )r   r  r  r  r  fz_terminate_buffer)rB  r
  r  r  r  s        r(   r,
  r,
  (R  s`    

c
"
"C
.

C	T8U333	c"""Jr)   c                 "   | j         s|S | }|j         rt          j        |          }||v s't          j        |t	          d                    j         rn|                    |           t          j        |t	          d                    }t          j        |          rt          ||          }t          j        |t	          d                    }t          j        |t	          d                    }t          j        |          s|}|j         |S )z
    Return list of outline xref numbers. Recursive function. Arguments:
    'obj' first OL item
    'xrefs' empty Python list
    r/  r=  Nextr  )r   r   r   r  r  rj   ry  r>  )r  rA  thisobjnewxrefrC  r   s         r(   r>  r>  1R  s    > G

 "G,,eu17HV<L<LMMXg"GXg->->??e$$ 	4$eU33E$gx/?/?@@#Whx.@.@AA '** 	G 
  Lr)   c                     d}t          j        |                                 t           j                  }t          j        |          }t          |          }|S )zE
    return a PDF page's /Rotate value: one of (0, 90, 180, 270)
    r   )r   r?  r  rM  r  r  )r   rX  r  s      r(   r  r  JR  sH     F

($((**e6P
Q
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  rW  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r)  r  r,  r   lexbufr!  s         r(   r3  r3  VR  sY     25f3E3EFFG!'**F_U344F$S&&99FMr)   c                 f   t          | t          j                  sJ |t          j                    }|7t          |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        |          sQt          j        ||
|	          }t          j        | |t          j                    |t          j                               npt          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
    Nztype(seps)=rz   r	  r  )r=   r   r  r  r   r  r  r  r1  r  r2  r  r!  rg  rh  r  r  r  rq  r  r  rg  rh  r  r  )rk  r  r  r  r   r<  r   r  rB  rO  r  r  s               r(   r  r  dR  s    eU011111|"$$<:dE,?@@<<BZT$ZZBZBZTXBZBZ<<<&u--Ds##FD!!E"4//D"400D%%Er5-.....

'E4
?
?C 4c""""(d333$U++ }0eDD!%en.>.>u~GWGWXXXX&vs33!%en.>.>U\Mh@i@ikpkyk{k{|||	#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  r5  r  r6  )r  ru  r$  r%  s       r(   r$  r$  R  s     !U]## !U '}QS!#&&& *%q)))	q!		BaAaAyAI	Q  AQ  AQ  AQ  A=Ar)   c                    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 ]X\  }}|j        j        t          j        k    r4t          |          D ]\  }	}
t          |
          D ]\  }}||z  } ||	z  }||z  }Y|D ]}|j        j        t          j        k    r}|D ]z}
d}|
D ]R}t          |
|          }t	          j        |          st          ||          r|j        j        }t#          | |           S|dk    r|dk    rt	          j        | d           {dS )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  r$   N)r  r   r  r=   r   rk  r  rg  r   ro  r  r   r  r  r  r  r  r  r  )r  r   r   r  n_blocksn_linesn_chars	n_blocks2r  n_lines2rn   n_chars2r
  chbboxs                 r(   r  r  R  s     <0d;;;c5>*****dE-.....<011DIHGG%t,,  	5 E$==="+U"3"3 $ $$$-t$4$4  LHb8#xGI 6 6 E$=== 6 6	 7 7B)$33F1$77 7/f==7 %'MO	&sI666??y1}}*35556 6r)   c                    t          j        | |          }t          j        |           }|s=||j        st          j        | |           n|j        rt          j        ||           dS |j        r|j        st          |          }n"t          t          j        ||                    }||k    rHt          ||          }|j        st          j        | ||           dS t          j        | |||           dS dS )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@  ra  rA  rM  r  )r  key1key2r   key1_objrY  r
  r@  s           r(   JM_put_scriptr_  R  s    !)T22H

&y
1
1C  <t<y$////  	/x... ? C("5 Cx((u1(DAABB %c511	 	By$	:::::	9dDAAAAA r)   c                 6    | j         | j        | j        | j        fS r+   ry  r:  s    r(   r  r  R      4qtQT!!r)   c                 N    | j         | j        | j        | j        | j        | j        fS r+   r*  )r  s    r(   rp  rp  R  s!    3QS!#qsAC''r)   c                     | j         | j        fS r+   r  )r  s    r(   r  r  R  s    3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%  rN  rL  rM  )rW  s    r(   r  r   S  sN    
 TVQTVTVQTVTVQTVTVQTV	 r)   c                 6    | j         | j        | j        | j        fS r+   ry  r:  s    r(   rf  rf  S  ra  r)   c           
      b   t          | t          j                  r| S t          | d          rDt	          |           dk    r1t          | d         d          rt          j        t          |            } t          | t          j                  rt          j        |           S t          | t                    rkt          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k    r|S t#          | d          !t          j        t%          |                     S t'          d          D ]H}|t	          |           k    r|c S | |         }t)          |          rt+          |          dk    r|c S t#          |d          ||         _        t#          |d          ||         _        ||         j        ||         j        |c S t-          ||         j        t.                    ||         _        t-          ||         j        t.                    ||         _        t1          ||         j        t2                    ||         _        t1          ||         j        t2                    ||         _        J|d         |_
        |d         |_        |d         |_        |d         |_        |S )	Nr_  rI  r   rh  r  r   r   r   )r=   r   rI  r:   r6   rg  r   r  r  fz_make_quadr  r$  r%  rN  rL  rM  r   r.  r  rK  r@  rC  r  r5  r  r6  )r  rW  r  r   r  s        r(   rS  rS  S  s   !U\"" q-   $SVVq[[WQqT;5O5O[L%((#1el## +&***1d !	  	 	1aAq!Q22A		A Jq5$-00 CFFaKKQ"&q'9'9:::1XX / /A;;HHHd$$ 	(<(<(A(AHHHsA&&!sA&&!Q46>QqTV^HHHadfo..!adfo..!adfo..!adfo..!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 ]o}|dk    rt          j
        |d           t          j        ||          }t          j        |          r)t          j        |          }t          j        ||           pn0|j        rt          j        |          }nt          j        d          }|S )zK
    Read and concatenate a PDF page's /Contents object(s) in a buffer
    r[  r   r?  )r=   r   r*  r   r  r  r  rk  rK  r  r  r  r  r  fz_append_bufferr   )rD  rp  r  r   r  r  s         r(   r(  r(  =S  s#    gu|,,@@g.@@@@!'5+GHHH(##  nT""u*84455 	2 	2A1uu$S"---%h22C"3'' 2,S11&sD111	2 
	  #H--nQ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k    r#t          j        t          j        j                  S g d}t          d          D ]x}t          | |          ||<   ||         %t          j        t          j        j                  c S ||         t           k     r
t           ||<   ||         t"          k    r
t"          ||<   yt          j        |d         |d         |d         |d                   S )NrI  r  r   r   r   r   )r=   r   rg  r  r#  r*  r	  r  r  r
  r   r@  rC  rh  rK  r.  r5  r6  )r  r  r   s      r(   r  r  SS  s   !U\"" !U]## |A!T :!!$adAD999!U :!!$adAD999 9$Q'' 9?1+=+=+B+B|EL7888A1XX # #Q""!Q4<< ;<<<<<Q4/!!"AaDQ4/!!"AaDadAaD!A$!555r)   c                     	 | j         |j        k    s0| j        |j        k    s | j        |j         k    s| j        |j        k    rdS dS r  r5  r  s     r(   r  r  jS  sE    tqt||tqt||tqt||tqt||q1r)   c                    | | j         sdS t          j        |                                 t	          d                    }|j         r|                                 }t          j        ||                                           }t          j                    }t          j                    }t          j	        | ||           t          j
        || |||          }t          j        |j                   | j         _        dS dS )z<
    refreshes the link and annotation tables of a page
    Nr  )r   r   r  r  r  r)  r  rg  rq  r  pdf_load_link_annotsll_fz_keep_linkry  )r   r  rY  rR  r   r&  r  s          r(   r
  r
  uS  s     |4?|

dhhjj(8*<*<
=
=C
~ Hhhjj-sDHHJJ??>## $x@@@)3c68LL % 5t G GH Hr)   c                    | j         st          j                    S t          |           }|dk    rt          j                    S t	          |                                           }|j        }|j        }|dk    rt          j        dddd|d          }n9|dk    rt          j        dddd||          }nt          j        ddddd|          }|S )z*
    calculate page rotation matrices
    r   r  r   r0  r  )	r   r   rq  r  r  r  r$  r%  rh  )r   rN  cb_sizer   r  r  s         r(   r  r  S  s     ?  ~%%H1}}~dhhjj))G	A	A2~~ Ar1a33	S Q2q!44 B1a33Hr)   c                 8    	 t          j        | j        |          S r+   )r  r   rU  r   r   rg  ro  r6   r/	  hfuzzvfuzzr>  fz_string_from_bufferfind_stringr   r  r  r  r  on_highlight_char)r   rV  r   r/	  Hitshitsr,  haystack_stringhaystackbeginr  insider   r  rn   r
  r  s                    r(   rU  rU  S  s    C)$/6BBBr)   c           	         t          j        |          rt          j        d           dS 	 t          j        |t           j                  }|dk    r2t          j        |t           j                  }t          | |||           nI|dk    rt          | |||           n0|dk    rt          | |||           n	 t          j	        |           dS t          j
        |          }t          |          D ]}	t          j        ||	          }
t          j        |
          rt          j        |
          }nd}t          j        |
t           j                  }|j        r[|}||vr*|                    |           t%          | |||||           t          j        d            t          j	        |           dS 	 t          j	        |           dS # 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_objrz  rK  r{  r  r   r@  r   rj   rA  )rY  rE  rF  rB  r	  rG  xobjrX  rD   r   r  sxrefsubrsrcsxref_ts                 r(   rA  rA  S  s    $ FGGG#!$(CDD199%dE,DEEDCuk::::QYYS${;;;;QYYCuk::::( 	T"""""# t$$q 	 	A(q11C"3'' (--(e.KLLG! &((MM'***%sGUD%PPPPM"RSSST"""""	  	T"""""T""""s   B	G
 CG
 2G
 
G c                    |sdS t          |t          t          f          sJ t          |          }|dk    rdS t	          j        |           }t	          j        |          }t	          j        ||          }t          |          D ]}||         }|}t          |t                    rt	          j
        ||           7t          |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          |           dS )z'
    set ListBox / ComboBox values
    Nr   r   zbad choice field listr  )r=   r   r   r6   r   r   r  rJ  rK  r   pdf_array_push_text_stringpdf_array_push_arrayrM  r  )r   rF  rD   r  rY  r  r   r  optopt1opt2	optarrsubs               r(   JM_set_choice_optionsr  T  sm     uudm,,,,,UAAvv#U++I

&	
2
2C #q))F1XX ? ?Ahc3 	?,fc::::sUDM22^sCyyA~~~G^~~~JD$9D99"9999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          }nw|t           j        k    rt          d          }t           j	        }nK|t           j
        k    rt          d          }t           j	        }n|t           j        k    rt          d          }|*|j        r#t          j        |t          d          |           |dk    s|dk    rRt          j        |t          d                    }|| z  }||z  }t          j        |t          d          |           dS dS )	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   rM  rX  rH  )r)  r  r   setbits	clearbitstypenamer
  s          r(   r  r  ,T  s    GIHu+++E??3	2	2	2E??5	.	/	/	/E??69UU			+	+	+D>>	.	.	.D>>/			/	/	/D>>-	0	0	0E?? 33999!||yA~~%c8D>>::
sHTNND99999	 &~r)   c                    d}t          j        |           }|                    d          }t          |          }|dz
  }||         }||= t          |          }t          j        | |          }	|	j        s|dk    rd                    |          }
t          j        t          j        | t          |
                              rt          dt          |                    ||dz
  = t          |          }|dk    t          j
        | |t          j        |                     t          j        | |          }	t          j        |	          st          d|          t          j        |	          }||k    rt          d|          t          | dd          }t          |          }d|d|d}d|d	|}|                    ||d          }t#          ||          }|S )
z*
    Set a PDF dict key to some value
    zfitz: replace me!rD  r   r   zpath to '%s' has indirectszcannot insert value for '%s'r  r  r   )r   r  r5   r6   r  r   r  r  rz  rf   pdf_dict_putpr  r+
  r  r,
  r;
  r  r3  )r  r  r   
eyecatcherrY  rk  r  r   skeytestkeyrE  r  r  objstrnullvalnewvalnewstrr  s                     r(   r?
  r?
  RT  s    %J

&s
+
+CIIcNNEu::DqA8Dau::D!#s++G 	 QhhA$U%8l1oo%N%NOO R <l4>P>PQQQdQhu::D Qhh 
S%";J"G"GHHH!#s++Gw'' =6<<<#G,,Dz6<<<
c1a
(
(C#C((FF !DD***-GGuu%F^^GVQ//F "#v..GNr)   c                    |r#t          j        | t          d          |           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |t          j        | t          d                     |rst          j        | t          d          d          }t          |          }t          |          D ]3}||         }	t          j        |d          }
t          |
|	           0d S d S d S )Nr  r  r   r  rn  r  )	r   rT  r  r@  r  JM_set_ocg_arrays_impr6   rK  r  )ro  rF	  r  rG	  rH	  r$  rJ  rD   r   item0r  s              r(   rE	  rE	  T  s    Ix'<'<iHHH	~D(4..111 	,*D(4..!DDC!3+++
D(5//222 	-*D(5//1EEC!3,,,D(8"4"4555 	0*D(82D2DaHHC!3///D(:"6"6777 	3*D(:2F2FJJC8}}A1XX 3 3 0#q99%sE2222 	3 	33 3r)   c                     t          j        |           }|D ]-}t          j        ||d          }t          j        | |           .dS )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  )rJ  rk  rY  r  r  s        r(   r  r  T  sW    
 
&s
+
+C ' '$S$2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        |          |           dS )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   r4  r   rB  N)r   r  r  r   r  r  r]  r  r  rQ  rM  r2  )r  r   r  rY  r  r`  rC  s          r(   r  r  T  s     
&s
+
+C

 dA
.
.C> 0.///"3(=(=>>I K+C+1F1FJJ	#Ix/E/EFFJ  S,Y8N8NPQRR
	z5#5d#;#;SAAAAAr)   c                    t          | t                    r| j        } t          | t          j                  s"J dt          |           dt
                      t          |           }|j        s
J d            t          j        |           }|	                                }fd} |d          }|} |d          }t          |          }t          |          }	t          j        ||	          }t          j        | |            |d          }|ryt          |          rjt          |          }
t          j        ||
          }d}t#          |
          D ]}||         }t          j        ||            t          j        ||            |d	          }|rt          |          rt          |          }
t          j        ||
          }t#          |
          D ]}t          j        |||                    t          j        ||t-          d
          t-          d                      |d          }|rt          |          rt          |          }
t          j        ||
          }d}t#          |
          D ]}||         }t          j        ||            t          j        ||t-          d          t-          d                      |d          }|2t/          |          }t          j        |t-          d          |            |d          }|Lt/          |          }t          j        |          }||k    r#t          j        |t-          d          |           |t          j        k    r2 |d          }|}|r#t          j        |t-          d          |            |d          }|}t          j        ||           |t          j        t          j        fv r |d          }t?          | |            |d          }tA          |          }t          j        ||t-          d
          t-          d                      |d          }|}t          j        |t          j!        |          t-          d
          t-          d                      |d          }t/          |          }t          j        |t-          d          |           t          j"        |t-          d                     t          j"        |t-          d                      |d           }||t          j        k    r|t          j#        z  }n?|t          j$        k    r|t          j%        z  }n|t          j&        k    r|t          j'        z  }t          j        |t-          d!          |            |d"          }t/          |          }|rt          j(        ||            |d#          }tS          |t-          d$          t          j*                    |            |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          j+        d/          |            |d0          }tS          |t-          d&          t          j+        d1          |            |d2          }t/          |          }|t          j$        k    r|s<t          j,        ||d3d4           t          j-        |t-          d5          d3           nt          j.        |          }|j        rPt          j/        |          }t          j,        |||d4           t          j-        |t-          d5          |           ne|r#t          j-        |t-          d5          |           n>|t          j0        k    rt          j.        |          }|/                                }|d6|fv s|d7k    r^t          j,        |||d4           t          j-        |t-          d5          |           t          j-        |t-          d+          |           nt          j-        |t-          d5          d3           t          j-        |t-          d+          d3           nU|rSt          j,        |||d4           |t          j        t          j        fv r"t          j"        |t-          d8                     t          j1        |            t          j2        | d4           t          j3        | d4           t          j4        |            dS )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   r8  s    r(   GETATTRz)JM_set_widget_properties.<locals>.GETATTRT  s    vtT***r)   r  r   rW  r   r  r^  r  r  rQ  rS  r  NrP  r  r  r  MaxLenr  r  r  r#	  r  r	  r  rR  r2  r  r  r  r  r
  r  r  r  rT  r  r  r  rU  r  r  r  rV  r  rW  r  r  r   r  TYesr`  )5r=   r   r   r   r   r   r   r   r   r)  r  r  r  r  r@  r6   rJ  rK  rL  pdf_field_set_fill_colorrm  r  r  rz  r~  r[  r  rH  pdf_field_set_displayr  r  r  ro  rn  r@  r  r  r  r  r  pdf_field_set_button_captionr_  r*  r2  pdf_set_field_valuerT  pdf_button_field_on_staterx  r  rN  pdf_set_annot_hotpdf_set_annot_activerO  )r   r8  r   r  rY  r  r   r  r   rot_matrD   fill_colr^  r   r]  
border_colr  r   old_namer  r  r  r  r  r  r6  r   onstater  s    `                           r(   JM_set_widget_propertiesr  T  s	   
 5%   
uen--HH/H$u++/H/H/H/HHHH5!!D?::::::#E**I
((**C+ + + + + GL!!EJ GFOOE5!!D#D))G"411D	UD))) GL!!E <!%(( <JJ&sA..q 	5 	5A(C%h4444&y(;;; GO$$E N!%(( NJJ$S!,,q 	7 	7A$VU1X6666Ivx~~x}}MMM GN##E S!%(( SJJ(a00
q 	7 	7A(C%j#6666Iz8D>>8D>>RRR GM""EU##&y(4..%HHH GL!!EE"",Y778*9hsmmTJJJ U///&& 	O"9hx.@.@+NNNGO$$EA		1--- e3U5STTT((eU+++ GN##E
e
$
$C		3FFF GN##EL	|,,TNNSMM	   GJE	e		B	"9htnnbAAA	y(4..111	y(4..111 '-((K777566KK5<<<577KK57775<<K	8D>>;GGG G$%%E	e		B	 :*9b999 GHE)Xc]]ELNNEBBB GO$$E)Xd^^Xc]]EBBB GO$$E)Xd^^Xc]]EBBB GO$$E)Xd^^Xc]]EBBB GM""E)Xd^^Xc]]EBBB GM""E)Xd^^U-?-E-EuMMM GN##E)Xd^^U-?-E-EuMMM GM""EDU666 	I%c9eQ???#Ix~~uEEEE 5i@@G! I&w//)#y"a@@@'	8D>>2FFFF I'	8D>>4HHH	u5	5	51)<<  ""T2J$%--%c9b!<<<#Ix~~rBBB#Ix}}bAAAA#YFFF#YuEEEE 	=%c9dA>>>e<e>[\\\"9hsmm<<<	%   	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     |S r   )r6   r   fz_chartoruner
  r
  fz_show_glyphr  fz_pre_translate)r   	user_fontrl  rp  r
  
bidi_levelrm  r)  r   r  r
  r
  rX  r!  s                 r(   rj  rj  U  s     	
A
c!ff**$QqrrU++3	Q*9c::!88?	3PQS[\\ICDD$S#uj*V^___$T366A::(c155CC(a#66C c!ff** Jr)   c                     t          j        |           }|                    d          }|                    t	          d                    }|dk    r
|d |         }|S )Nr  r  r   )r   r
  r  r   r	  )rN  
buff_bytesr  r  s       r(   r  r  U  sZ    -d33J


9

-
-CQAAvv"1"gJr)   c                 *    t          d|             dS )z
    Generate a warning.
    z	warning: Nr  rp   s    r(   r   r   U  s!     r)   c                    |rt          j        |          \  }}|dk    rt          |          }t          |t           j                  sJ |j        r`t          j        |          \  }}||k     rCt          j        |t           j        t           j                   t          j	        | ||d           dS t          j	        | ||d           dS )zD
    update a stream object
    compress stream when beneficial
       r   Nr   )
r   r  r  r=   rk  r   rM  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4	B;; 27 ; ;/@@@@@ + 	','>?P'Q'Q$!1$v--&!6!;  
 +C6GKKKF	Cgq11111r)   c                    t          |t          j                  sJ dt          |                      |dk    rt          j        | |d          }n/t          |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  r4  r   )r=   r   PdfGraftMapr   r  r   r   r  r  r?  r  r   r  pdf_graft_objectr(  r  rq  r*  r(  rM  )r  fsrcpager  r  r  srcpagespagerefro  r  r`  r  s              r(   r  r  U  sR   
 dE-..@@0@4::0@0@@@@axx&vtQ77x}--;;==$U%CHhWaNbNb%c%cdd*8Xk5J5JKK? 	:5dA>>II.vq99I x((
 %fh8H8H%,WX//[^__Q/// 	5(;"7"7CCCLr)   c                 :    t          | t          t          f          S r+   )r=   r   r   rP  s    r(   r@  r@  U  s    a%'''r)   c                      t          |           S r+   )r6   rP  s    r(   rC  rC  U  s    q66Mr)   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'rk  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+   )rf   )r   excs     r(   r  r  V  s     S//r)   strictc                     | sdS t          | t                    r|                     d|          }nt          | t                    r
| d d          }|                    d|          }|S )Nr[   r	  r  raw_unicode_escape)r=   r   r  r  r  )rp  r  r   rF   s       r(   r=  r=  V  sr     r!S XXfVX,,	Au		 qqqT
))()
8
8CJr)   c                     | rct          |           t          t          fvs7t          |           dvs&t	          |           dk     st          |           dk    rt          d          d S d S )Nri  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   r   r   r6   r  r  r   r  s    r(   rn  rn  %V  sq     PGGD%=((1vvY&&1vvzz1vvzzNOOOP P
 zr)   r   r   c                 T    |                                  D ]}|d         |k    r|c S dS )zGReturn an entry in the page's font list if reference name matches.
    rI  N)rF  )r   r   r  s      r(   ry  ry  0V  sD     ^^  Q48HHH  r)   c                 :    | j         D ]}||d         k    r|c S dS )z3Return a font info if present in the document.
    r   N)r  )r)  r  r  s      r(   rB  rB  8V  s:     ]  1Q4<<HHH  r)   r/	  c                     t          |           rt          |           }|j        fS t          |           r| fS | D ]/}t          |          st          |          st	          d          0| S )Nzbad quads entry)r@  r#  r  rA  r   )r/	  r  rW  s      r(   r  r  @V  s}     KKy x 0 0! 	0	! 	0.///Lr)   c                    t          |           sdS 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n t          d
          dS )NFr   z$morph must be a sequence of length 2r   r   r  zinvalid morph param 0rI  r   zinvalid morph param 1T)r6  r   r   r   r6   r   rJ  s    r(   r&  r&  LV  s    77 uGGe}$$Q1?@@@!IINNs1Q4yyA~~0111Q47ad1g""""""""01114r)   c                     d S r+   )r:   r   r   r   rJ  s    r(   re  re  XV  s    
Fr)   rW  c                     	 t          |           }n*# t          $ r t          dk    rt                       Y dS w xY w|j        S )zkCheck whether an object is convex, not empty  quad-like.

    It must be a sequence of 4 number pairs.
    r   F)r  rf   r	  ru   r  )rW  q0s     r(   rA  rA  ^V  sV    
!WW   !##(8(8(8uu <    #99r  c                     	 t          |           } n*# t          $ r t          dk    rt                       Y dS w xY w| j        p| j         S )zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    r   F)r#  rf   r	  ru   r  r  r:  s    r(   r@  r@  kV  s`    
GG   !##(8(8(8uu 
+am,,r  r  c                    | sdS t          | d          r| f} t          |            t          |           dk    r(t          | d                   dz   }|dk    r|dz   n|dz   S t          |           d	k    r/t          t	          |                     dz   }|dk    r|d
z   n|dz   S t          t	          |                     dz   }|dk    r|dz   n|dz   S )Nr[   rh  r   r   r   r  zG zg r   zRG zrg zK zk )r:   rn  r6   r   r   )r  r  rp  s      r(   r  r  xV  s     rq+ DqMMM
1vv{{adOOc!88q4xxT1
1vv{{eAhh#%HHq5yy!e)3%((c!ACxx1t88QX-r)   c                 (   |                                  t                    fd}	 dk    r5t          j                                        t          d          d           t          j        |          }|D ]&}t          |          }t          j        ||           't          j	        |           t          |d            |             n0# t          $ r# t          rt                        |             Y d S w xY wt          |          S )Nc                      dk    r7t          j                                         t          d                     d S d S )Nr   r3  )r   rH  r  r  )r  rN  s   r(   r  z$Page__add_text_marker.<locals>.finalV  s>    q=="7;;==(82D2DhOOOOO =r)   r   r3  r  )r%  r  r   rH  r  r  r&  rS  pdf_add_annot_quad_pointrO  r(  rf   r	  ru   r   )	r'   r/	  r  r  r   rB   rW  r  rN  s	          @@r(   rv  rv  V  s5   nnG((HP P P P P Pq=="7;;==(82D2DaHHH&w
;; 	5 	5D%%A*5!4444u%%%s###   4N$4$4$4 <<s   B'C )DDc                 d    t          | t                    sJ t          t          d|            }|S )Nr  )r=   r   r   r   )r$  rF   s     r(   r  r  V  s7    a
%-!--
.
.C Jr)   r  c                     |d         }d}t          | j                  D ]\  }}|d         |k    rd} n|r|| j        |<   d S | j                            |           d S )Nr   FT)r  r  rj   )r)  r  r  r  r   fis         r(   rF  rF  V  s    7DE3=))  2a5D==EE   #aT"""""r)   c                 "   d}t          t          |                    D ]Z}||         }|t          |           k    rt          |t                    rd|v r7 dS |t          | |         |          s dS |dz  }[|t          |           k    rdS dS )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)rK  r6   r=   r   )r  rM  r  r   rZ  s        r(   r  r  V  s     	
A3u:: 
 
aD		>>%'' DEMMuuZQ%?%?55	QCII~~u4r)   c                     t          |          }t          j        |          }|j        |j        z
  }|j        |j        z
  }|}	|}
|rt          | |          }| |z  }||z  }ndx}}t          ||          }|dk    r|dk    r|}|}|}|dk     r||z  ||z  k    r||z  }	|}
n.|}	||z  }
n&||k    r||z  ||z  k    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   r  r   g      )r  r   	fz_rotater  r	  r
  r  r  r  r  rh  r!  fz_scalefz_translater$  r%  )r[  r  r  rX  r 
  rf  rQ  trwtrhr   r  larger  r  smallr  r  ru  s                     r(   r  r  V  s    BE
/&
!
!C
(UX
C
(UX
CAA E6""U]e^RBKKE{{v}}	Avv8cBheAAAAeAA	r8cBheAAAAeAA

X A%X A% C 
q!Q4
6
6C
/#s
#
#C
/#u~a33
4
4C
/#u1#%??
@
@CJr)   c                     | j         j        dk    rc| j         j        j        dk    rN| j         j        j        dk    r9|j         j        j        | j         j        j        j        |j         j        dz  z
  k     S dS )Nr   r   皙?)r   r
  rh  r$  r%  r  
first_charr  )rn   r
  s     r(   r  r  W  sj    !!do&9&;q&@&@T_EXEZ^_E_E_}#%(B(I(KbmN`cfNf(fff1r)   c           	          |  dt          |            dt          t          |                      d}t          |           D ]}|d| dz  }|S )Nr    (z):
r  r$   )r   r6   rh  )r$  rF   r   s      r(   dir_strr  W  s`    
-
-a
-
-CAKK
-
-
-CVV  |a|||Jr)   rA  r3  r  c                    |                      d          r|                     d          r| S t          |           sdS |rK d                    d | D                       }n!d                    fd| D                       }d|z   dz   S |dk     r"d                    fd	| D                       }nd                    d
 | D                       }d|z   dz   S )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[<>]Nr[   c                 \    g | ])}t          |          d k     rdt          |          z  nd*S )r  %02xb7r  r  s     r(   r   zgetTJstr.<locals>.<listcomp>(W  s4    TTT!s1vv||FSVVOOTTTr)   c                 v    g | ]5}t          |          d k     rdt          |                   d         z  nd6S )r  r  r   r  r  r=  s     r(   r   zgetTJstr.<locals>.<listcomp>+W  s@    TTT!s1vv||&Q.+++TTTr)   r   c                 L    g | ] }d t          |                   d         z  !S )%04xr   r  r=  s     r(   r   zgetTJstr.<locals>.<listcomp>1W  s-    AAAqA!22AAAr)   c                 2    g | ]}d t          |          z  S )r  r  r  s     r(   r   zgetTJstr.<locals>.<listcomp>3W  s"    666AQ666r)   )r2   r  r6  r  )r   rA  r3  r  otxts    `   r(   r%  r%  W  s    t t!4!4 :: v ">77TTtTTTUUDD77TTTTtTTT D d{T!! !||wwAAAADAAABBww6666677$;r)   rp  c                 b   t          |           sdS d }d}| D ]}t          |          }|dk    r ||           c S |dk    r|dk     r|dv r|dz  }||z  }?|dk    r	|d	|z  z  }N|d
k    r|dz  }Z|dk    r|dz  }f|dk    r|dz  }r|dk    r|dz  }~|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                 z    t          ddg          t          | d          z   }d|                                z   dz   S )Nr  r	  zUTF-16BE<>)r]  hex)rp  r  s     r(   make_utf16bez!get_pdf_str.<locals>.make_utf16beEW  s9    sCj!!Ia$<$<<QUUWW}s""r)   r[   r	     rx  )r  r  rt
  rt
  z\%03or   z\br  z\tr  r  r  z\fr  z\rz\267r  r  )r6  r
  )rp  r  r  r  r  s        r(   rc  rc  8W  s/    77 t# # # 	A  VV88<??"""77rCxx$$$T	FA88BA 77JAA1WWJAA2XXJAA2XXJAA2XXJAALAA7S=r)   c                    | r| S t          j        d          } | r| S ddl}|                    ddddd          }|j        dk    r3t          j        d|j                  }|r|                    d          } | S t          j
        d	k    r|                    d
dddd          }|j                                        }|j        s|st          d          t           j                            |          }t           j                            |d          } t           j                            |           r| S t          d          t#                      }dD ]}|                    d| dddd          }|j        dk    r|j                                                                        }t'          |          dk    rV|d         }| d}|                    |           t+          j        |          }	|	                                 |	r
|	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_outputr  r   z%List of available languages in "(.+)"win32zwhere tesseractz4No tessdata specified and Tesseract is not installedr  zINo tessdata specified and Tesseract installation has no {tessdata} folder)ztesseract-ocr	tesseractzwhereis r   z/*/tessdatar0  z(No tessdata specified and no match for:
r  )rc   r   
subprocessr  
returncoder  r  stdoutr  rM
  platformr  r   r	   dirnamer  r  r   r5   r6   rj   globr  )r  r  cpr  rW  r  attemptsr	   pattern	tessdatasr   attempts               r(   r  r  mW  su      y*++H  	0!ST[_	`	`B	}I=ryII 	wwqzzHO |w^^-QqPQX\^]]9??$$= 	W 	WUVVV'//(++7<<447>>(## 	lOjkkk vvH, ) )^^-t--QqPQX\^]]=Ay((..00H8}}!!"1+$111((( Ig..	    )$R=((( S: 	% 	%G$7$$$DD4   QRRRr)   )CSSr  r   fontcoder  r  c                    d}t          |          t          urt          d          |d} fdt                                          D             }|g k    rt          d  d          t          |          dk    rt          d	          | }|D ]]}t          |         }|d
         }|d         }	 |d                     }
|                    |
|           |rdnd}|	rdnd}||||||fz  z  }^|S )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 ArchiveNr[   c                 >    g | ]}|                               |S r,   r  )r   r  r  s     r(   r   z(css_for_pymupdf_font.<locals>.<listcomp>W  s*    RRRq1<<;Q;QRRRRr)   zNo font code 'z' found in pymupdf-fonts.rI  zfontcode too shortrM  ra  r  zfont-weight: bold;zfont-style: italic;)r   r9  r   r{
  r  r6   r=  )r  r  r  r   CSSFONT	font_keysfkeyrX  rM  ra  fbuff	bold_textitalic_texts   `            r(   css_for_pymupdf_fontr"  W  s;   R DG==G##7888
{ SRRR05577RRRIBM(MMMNNN
9~~-...| > >#D)F|hX  E4   ,08((b	/5=++2w$i===Jr)   r   r  c                    |                                 }t                              |d          }d|dk    rt          |dk    rt           t          fd| D                       }||z  S |t                                          v rt          | t          |         ||          S |dv rt          |           |z  S t          d|z            )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?  c                     g | ]>}t          |          d k     rt          |                   d         nd         d         ?S )r  r   r  r  r=  s     r(   r   z#get_text_length.<locals>.<listcomp>X  sC    UUU1c!ffsllA""sAUUUr)   )rv
  rx
  rw
  rv  rz
  rw  ry
  rx  zFont '%s' is unsupported)
r  r~
  r7   rE  rD  r  r  util_measure_stringr6   r   )r   r   r   r  r  r   rA  s         @r(   rU  rU  W  s     ~~H""8T22HF8>!!UUUUPTUUUVV8|?''))))"/(+Xx
 
 	
  	 	 	 4yy8##
/(:
;
;;r)   r  c                 >   t          |           t          j        u r|                                 }nTt	          | d          r|                                 }n/t          |           t          t          fv r| }nt          d          t          
                    |          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.
    rr  zbad argument 'img')r   r8   r^  rv  r:   rr  r  r]  r   r
  image_profile)r  r   s     r(   r'  r'  "X  s     CyyBJ	f		 /	cui(	(	(-...v&&&r)   c                     t           j        t                    sJ t           j                  s j        rK j        J  t           j         j                   j                  }|st          d           d _        dS  fd}t           j        t                    sJ t           j                  }|dk    r
 |            S  j        t                   }|dk    r
 |            S  j        |dz
           }|t                   }|dk    r
 |            S |t                   } j        t                   }||k    r
 |            S 	  j                                        D ]\  }	}
|	|vr|
||	<   d}n'# t          $ r t          rt                       d}Y nw xY w|dk    r%d	|t          <    j                                         dS t          d
            |             dS )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                                         d S r+   )r  rj   pathdictr\  r{  )r  s   r(   rj   zjm_append_merge.<locals>.appendSX  s?    s|((**+++r)   rp  r   r  r0  r  z$could not merge stroke and fill path)r=   r  r   r  r  r   r*  rq   r6   r  dictkey_itemsrA   rf   r	  ru   r{  )r  resprj   r  thistyper  prevtype	previtems	thisitemsr  rE   r   s   `           r(   jm_append_merger1  8X  s    cgt$$$$$ 
 sz :H 0737CJ//==D 	JHIII     cgt$$$$$sw<<Dqyyvxx|\*H3vxx7DFD\"H3vxxm$Im,IIvxxL&&(( 	 	DAq}}Q   4N$4$4$4 
Qww"l6777s   *E3 3!FFc                     | j         s+| j                            |t          |          f           d S | j                            |t          |          | j        f           d S r+   )r  r!  rj   rf  
layer_name)r  r  r   r  s       r(   jm_bbox_add_rectr4  X  sc    : J
D/$"7"7899999
D/$"7"7HIIIIIr)   c                     t          j        t           j        j                  }t          j        |                                |          }t          | ||d           d S )Nz
fill-image)r   rg  rj  ll_fz_transform_rectr  r4  )r  r  r  r  r  color_paramsr  s          r(   jm_bbox_fill_imager8  X  sJ    U\,--A"AJJLL#66Ac3<00000r)   c                     	 t          | |t          j        t          j        |          d           d S # t          $ r t
          rt                        w xY w)Nzfill-imgmask)r4  r   r6  fz_unit_rectrf   r	  ru   )r  r  r  r  r  r  r  r7  s           r(   jm_bbox_fill_image_maskr;  X  sb    #sE$>u?QSV$W$WYghhhhh   4N$4$4$4s	   /3 !Ac	           	          |rdnd}	 t          | |t          j        |d |          d           d S # t          $ r t          rt                        w xY w)NTFz	fill-pathr4  r   ll_fz_bound_pathrf   r	  ru   	r  r  r	   r  r  r  r  r  r7  s	            r(   jm_bbox_fill_pathr@  X  sm    *ttUH#sE$:4s$K$K[YYYYY   4N$4$4$4s	   &0 !Ac                     	 t          | |t          j        ||          d           d S # t          $ r t          rt                        w xY w)Nz
fill-shade)r4  r   ll_fz_bound_shaderf   r	  ru   )r  r  shader  r  r7  s         r(   jm_bbox_fill_shaderD  X  s]    #sE$;UC$H$H,WWWWW   4N$4$4$4s	   %) !A
c           	          	 t          | |t          j        |||          d           d S # t          $ r t          rt                        w xY w)Nzstroke-textr4  r   ll_fz_bound_textrf   r	  ru   )r  r  r   rf  r  r  s         r(   jm_bbox_stroke_textrH  X  `    #sE$:D&#$N$NP]^^^^^   4N$4$4$4	   &* !Ac           	          	 t          | |t          j        |d |          d           d S # t          $ r t          rt                        w xY w)Nz	fill-textrF  )r  r  r   r  r  s        r(   jm_bbox_fill_textrL  X  s_    #sE$:D$$L$LkZZZZZ   4N$4$4$4rJ  c           	      R    t          | |t          j        |d |          d           d S )Nzignore-text)r4  r   rG  )r  r  r   r  s       r(   jm_bbox_ignore_textrN  X  s+    c3 6tT3 G GWWWWWr)   c	           	          	 t          | |t          j        |||          d           d S # t          $ r t          rt                        w xY w)Nzstroke-pathr=  )	r  r  r	   rf  r  r  r  r  r7  s	            r(   jm_bbox_stroke_pathrP  X  rI  rJ  c                 P   | j         t                   }t          |          }dgdz  }t          d          D ]W}||dz
  |z            }t	          |d                   }|j        ||dz  <   |j        ||dz  dz   <   t	          |d                   }X|j        |d         k    s|j        |d         k    rdS d| _        t          j	        |d         |d         |d         |d         |d         |d         |d         |d	                   }d
t          |          f}	|	||dz
  <   ||dz
  |= dS )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   rI  r   r   r  r  r   r   r  )r*  r+  r6   rK  r$  r$  r%  	linecountr   rg  r  )
r  rA   r  r  r   rn   r  rv  rW  r   s
             r(   jm_checkquadrS  X  s5    L-(Eu::D	
aAAYY ) )dQhl#a))6!a%v!a%!)tQx((	tqt||rtqt|| q CM 	1Q41qtQqT1Q41qtQqTJJA/!$$%DE4!8tax$1r)   c                    d| _         d}| j        t                   }t          |          }||dz
           }t	          |d                   }t	          |d                   }||dz
           }t	          |d                   }t	          |d                   }		 |j        |j        k    s0|j        |	j        k    s |j        |	j        k    s|j        |j        k    rdS |	j        |j        k     r.t          j        |	j        |	j        |j        |j                  }
d}n-t          j        |j        |j        |j        |j                  }
d}dt          |
          |f}|||dz
  <   ||dz
  |= dS )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   r0  r  )
rR  r*  r+  r6   r$  r%  r$  r   r*  rf  )r  r  rA   r  r  rL  rM  line2rN  r  r  r   s               r(   jm_checkrectrV  X  sU    CMKL-(Eu::D4!8E	5!9	%	%B	5!9	%	%B 4!8E	5!9	%	%B	5!9	%	%Btrt||trt||trt||trt||q 
tbd{{rtRT2466rtRT2466?1%%{3DE4!8tax$1r)   c           
      V    |j         }	 |sd S t          | |||||||           |j        }"r+   )headjm_trace_text_spanr;  )	r  r   rZ  r  r  r  r  seqnor  s	            r(   jm_trace_textr[  Y  sC    9D 	ECuc:ueUSSSy	r)   c                 X   d}t          |t          j                  sJ t          j        |          }t          |t          j                  sJ t          j        |          }t          |                                          }	t          j        |	                                |          }
t          j
        t          j        dd          |
          }t          j        |j        |j        z  |j        |j        z  z             }t          j        |          }d}t#          |                                          }t%          |                                          }|dk     rd}d}||z  ||z
  z  }||z  ||z
  z  }d}t          j        |                                          }||t(          z  z  }|t          j        |                                          t,          z  z  }|t          j        |                                          t0          z  z  }|t          j        |                                          t4          z  z  }d}t          j                    }t          j        |j        |j        |j         |j        dd          }|j        dk    rd|_        g }t=          |j        j                   D ]}d}|!                    |          j"        dk    rJt          j#        |                                |!                    |          j"        |j        j$                  }||z  }|}|!                    |          j%        dk    r|}t          j        |!                    |          j        |!                    |          j                  }t          j&        ||          }t          j        dddd|j         |j                   }t          j        ||          }t          j        |t          j        dddd|j        |j                            }|j        }||z   }|
j        dk    r|j        dk    s'|j        dk    s|
j'        dk    r&|
j'        |
j(         k    r|j        |z   }|j        |z   }n|j        |z
  }|j        |z
  }t          j)        ||||          } t          j*        | |          } |+                    |!                    |          j%        |!                    |          j"        |j        |j        f| j,        | j-        | j.        | j/        ff           |dk    rt          j0        ||           }| }tc          |          }|st|t(          z  sht          j2        |                                ddd          \  }!}t          j#        |                                |!|j        j$                  }||z  }|s|}n|}tg                      }"ti          |          |"d	<   tk          |	          |"d
<   |j        j$        |"d<   ||"d<   |j        j6        |"d<   |j        j7        |"d<   ||"d<   ||"d<   d|"d<   |rzt          j8        t          j9        t          j:        |                    |t          j;                    t          j9                    t          j<                              }#|#dd         }#nd}#| j=        dk    r| j=        }$n|dz  }$|#|"d<   ||"d<   ||"d<   |$|"d<   ||"d<   ||"d<   t}          |          |"d<   | j?        |"d<   ||"d<   ||"d<   | j@        +                    |"           dS )z
    jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
    Nr   r   r  r  r  r0  r?  rh  rX  r
  r  bidi_lvlbidi_dirr1  r2  r   r  r  r  r  r  rU  	linewidth
spacewidthr   r.  layerrZ  r	  )Ar=   r   fz_text_span
FzTextSpan	fz_matrixrq  r  rX  r!  rl  fz_transform_vectorr  r  r  r$  r%  fz_normalize_vectorr  r  r
  r  r
  r  r
  r  r
  r  rg  rh  r  rK  r   r6   rA   r
  r  r
  r
  r#  r
  r  r*  r  rj   r	  r  r  r
  r  r   r
  r4   r  r  r  rm  fz_convert_colorr  r  r  r  r_  rf  r3  r  )%r  r  rZ  r  r  r  r  rZ  out_fontr   ru  rh  r  	space_advrI  rJ  ascsizedscsizefflagsr
  last_adv	span_bboxrQ  r	  r   r!  	char_origr5  r	  r  r  r
  	char_bboxr  	span_dictr  r_  s%                                        r(   rY  rY  "Y  s    HtU/00000T""DsEO,,,,,
.#

CTYY[[))H /$((**c
*
*C

#E$71$=$=s
C
CCIcecemcecem344E

#C
(
(CI
DIIKK
(
(C
TYY[[
)
)C
Tzz EkS3Y'GEkS3Y'GF&		44D
d)))F
e%tyy{{336FFFF
e$diikk225FFFF
e#TYY[[11NBBFH I

suceceVSUAq
A
AC
u{{EDO'(( ." ."::a==!!($))++tzz!}}7H$/J_``Cu::a==""I'

1AII	,Y<<	!!Q1y{lY[LII_R%%_R1aIK!U!UVV[#X

cerkk!#%w&Bw&BBw&Bw&B&r2r266	+Ir::	JJqMM%JJqMM%!!
 "!!!		 	 	  q55+IyAAII!II%LLE !-- 	!A499;;PRTUWXYYKAx.IIKKO) I
 I %$	 I I(--Iu,X66Iv//IwIw O6Iz!_7Iz Iz!I{ I| 
$"E$?$L$LMM#%%"$$#%%  "1"g
}qM		DL	 IwIv!Iy'I{(I|Iv(33Iv.IwIwIwGNNIr)   c                 4   | r	 t          j        t           j        j                  }t          j                    }t          j        | ||j        d |                                          }n$# t          $ r t          rt                        w xY w|d d         S dS )Nr   r,   )
r   r  r  r  ll_fz_convert_colorr   r  rf   r	  ru   )r  r  r  r  r  s        r(   jm_lineart_colorrt  Y  s     	 #U%7%ABBB$&&B+MKKMM CC  	 	 	#8(8(8(8	 2A2w2s   A%A* *!Bc                 V    t          | j        t                    rg | _        g | _        d S r+   )r=   r  r   scissorsr  r  s     r(   jm_lineart_drop_devicerx  Y  s(    #'4   CLLLr)   c	                 p   |rdnd}	 t          |t          j                  sJ t          j        |          | _        t
          | _        t          | ||           | j        d S 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_        d S # t&          $ r t(          rt+                        w xY w)NTFr  r  r  r   rZ  ra  r   r   )r=   r   rd  rq  r  trace_device_FILL_PATH	path_typejm_lineart_pathr*  r  rt  rf  pathrectdictkey_rectrZ  r3  r  r#  r1  rf   r	  ru   r?  s	            r(   jm_lineart_fill_pathr  Y  s>     *ttUH300000.#&&.c4(((<F &)l#$,j!(-n% !1*e D Df&5cl&C&Cl#!$g!$g9 	/%(YCL'"		Q				   4N$4$4$4s   AD #B/D !D5c           
      ^    	 t          | |d||||| j                   | xj        dz  c_        d S )Nr   z
type(ctx)=z ctx=z
type(dev)=z dev=ztype(text)=z text=z
type(ctm)=z ctm=ztype(colorspace)=z colorspace=ztype(color)=z color=ztype(alpha)=r  ztype(color_params)=z color_params=r   )r&   r   r[  rZ  )r  r  r   r  r  r  r  r7  s           r(   jm_lineart_fill_textr  Z  s:    6 #tQZsyIIIIINIIIIr)   c           
      \    t          | |d|d d d| j                   | xj        dz  c_        d S )Nr   r   r[  rZ  )r  r   r  s      r(   jm_lineart_ignore_textr  Z  s3    #tQT4CI>>>IINIIIIr)   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )Walkerc                     t                                                       |                                  |                                  |                                  |                                  || _        d S 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  sl    !!!!!!  """""$$$r)   c                 <   	 | j         j        dk    rt          | j                   rd S d| j         _        | j         j        r| j         j        | j         j        k    rsdt          | j         j                  t          | j         j                  f}| j         j        t                   	                    |           | j         j        | j         _        d| j         j        d<   nd| j         j        d<   d| j         _        d S # t          $ r t          rt                        w xY w)Nr   r   r  Fr  T)r  rR  rV  havemove	lastpoint
firstpointr  r*  r+  rj   rf   r	  ru   )r'   r  rB   s      r(   	closepathzWalker.closepath!Z  s   	x!Q&&)) F!"DHx  
78%)<<<!1$(2D!E!E!1$(2E!F!FHDH%m4;;DAAA)-)<DH&16!+.. 37!;/ !"DH 	 	 	#8(8(8(8	s   $C: CC: :!Dc                    	 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                                       |           d S # t          $ r t          rt                        w xY w)Nr   r  )r  rR  r   r  r#  r  fz_include_point_in_rectr}  r  r  r*  r+  rj   rf   r	  ru   )r'   r  r  r
  x2y2x3y3r  r	  r  rk  s               r(   curvetozWalker.curveto=Z  s|   	!"DH$R,,B$R,,B$R,,B)"dhl;;B)"dhl;;B)"dhl;;B % >tx?PRT U UDH % >tx?PRT U UDH % >tx?PRT U UDH $TX%788$R(($R(($R((E "$DHH}-44e<<<<< 	 	 	#8(8(8(8	s   FF" "!Gc                 l   	 t          j        t          j        ||          | j        j                  }t          j        | j        j        |          | j        _        dt          | j        j                  t          |          f}|| j        _        | j        j	        t                   }|                    |           | j        xj        dz  c_        | j        j        dk    r+| j        j        t          k    rt          | j                   d S d S d S # t           $ r t"          rt%                        w xY w)Nr  r   rI  )r   r#  r  r  r  r  r}  r  r  r*  r+  rj   rR  r{  rz  rS  rf   r	  ru   )r'   r  r$  r%  r  rk  rA   s          r(   linetozWalker.linetoXZ  s$   	)5+>q!+D+DdhlSSB % >@QSU V VDH$dh&899$R((E
 "$DHH%}5ELL%   H!#x!Q&&48+=AW+W+WTX&&&&& '&+W+W  	 	 	#8(8(8(8	s   D
D !D3c                    	 	 t          j        t          j        ||          | j        j	                  | j        _
        t          j        | j        j                  r]t          j        | j        j
        j        | j        j
        j        | j        j
        j        | j        j
        j                  | j        _        | j        j
        | j        _        d| j        _        d| j        _        d S # t&          $ r t(          rt+                        w xY w)Nr   zself.dev.pathdict:z.    {type(n)=} {len(n)=} {n!r} {n}: {v!r}: {v}r   )r=   r  r*  r4   r&   rA   r   r#  r  r  r  r  r}  r*  r$  r%  r  r  rR  rf   r	  ru   )r'   r  r$  r%  rD   rE   s         r(   movetozWalker.movetomZ  s    	G	!&!9'1--HL" "DH ($(*;<< $)$6*,*,*,*,	% %! #'("4DH !DH!"DH 	 	 	#8(8(8(8	s   C%C* *!D)	r.   r/   r0   r   r  r  r  r  r  r  s   @r(   r  r  Z  st              8  6  *      r)   r  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| _        dS dS # 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   rg  rh  r}  rR  r"  r  r4   r*  r+  r  fz_walk_pathFzPathll_fz_keep_pathr   rf   r	  ru   )r  r  r	   walkers       r(   r|  r|  Z  s    |U\%@AAq!,,vv')m$  	EL)>t)D)DEEvvO`aaa|]+ 	 CLLL	  	    4N$4$4$4s   CC !C9c	                    	 t          |t          j                  sJ d| _        |j        dk    rDt          |j                  t          |j                  k    rt          |j                  | _        nN|j        dk    rCt          |j                  t          |j                  k    rt          |j                  | _        t          j	        |          | _
        t          | _        t          | ||           | j        d S 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          j        d
          }	t          j        |	d           t5          |j                  D ]I}
t          j        |j        |
          }t          j        |	t;          | j        |z             d           Jt          j        |	dt;          | j        |j        z                        |	| j        d<   n
d| j        d<   t?          | j                   | j        tB          <   | j"        | j        d<   | j#        | j        d<   | j$        r| j%        | j        d<   tM          |            | xj#        dz  c_#        d S # tN          $ r tP          rtS                        w xY w)Nr   r   rp  r  r  r  r  r  Fr  z[ r   z] r]  rW  ra  rZ  r   )*r=   r   rd  
pathfactorr    r  r  r
  r  rq  r  trace_device_STROKE_PATHr{  r|  r*  r  rt  r_  r
  	start_capdash_capend_caplinejoindash_lenr  r  rK  floats_getitem	dash_listr   
dash_phaserf  r}  r~  r3  rZ  r  r#  r1  rf   r	  ru   )r  r  r	   rf  r  r  r  r  r7  rN  r   r   s               r(   jm_lineart_stroke_pathr  Z  s   23000005A::#ce**CE

22 ZZCNNUaZZCJJ#ce**44 ZZCN.#&&0c4(((<F&)l#*/&'!1:u!E!Eg'*~8H'Hm$ $i 
 %(NV_$Dj!cl**(-CL% ? 	-&,,D"D$///FO,, W W ,f.>BB&3>E;Q1R1R.U.U.UVVVV"D*^y&J[9[/\/\*^*^___&*CL(##&,CL(#&5cl&C&Cl# #W!$g9 	/%(YCL'"		Q				   4N$4$4$4s   C=K GK !L c                    | j         sd S t          j        |          | _        t          | _        t          | ||           | j        d S 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_        d S )	Nr   r  r  Fr  r   ra  r   )r  r   rq  r  trace_device_CLIP_PATHr{  r|  r*  r  r6  rf  compute_scissorr#  r3  r1  )r  r  r	   r  r  r  s         r(   jm_lineart_clip_pathr  Z  s    9 nS!!CG*CMCd###
|"(CL, $XCL*#,&&$)[!-oc.B.BCCCLICLNCLCIINIIIIr)   c                    | j         sd S t          j        |          | _        t          | _        t          | ||           | j        d S 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_
        d S )
Nr   r  r  r  Fr  r   ra  r   )r  r   rq  r  trace_device_CLIP_STROKE_PATHr{  r|  r*  rf  r  r#  r3  r1  )r  r  r	   rf  r  r  s         r(   jm_lineart_clip_stroke_pathr  Z  s    9 nS!!CG1CMCd###
|#)CL #CL#,&&$)[!-oc.B.BCCCLICLNCLCIINIIIIr)   c                 V    | j         sd S t          |            | xj        dz  c_        d S rQ  r  r  r#  )r  r  r   rf  r  r  s         r(   jm_lineart_clip_stroke_textr  [  2    9 CIINIIIIr)   c                 V    | j         sd S t          |            | xj        dz  c_        d S rQ  r  )r  r  r   r  r  s        r(   jm_lineart_clip_textr  [  r  r)   c                 V    | j         sd S t          |            | xj        dz  c_        d S rQ  r  )r  r  r  r  r  s        r(   jm_lineart_clip_image_maskr  [  r  r)   c                     | j         r| j        sd S t          | j                  }|dk     rd S | j        d= | xj        dz  c_        d S )Nr   r0  )r  rv  r6   r#  )r  r  r  s      r(   jm_lineart_pop_clipr  #[  sT    9 CL s|DaxxRIINIIIIr)   c                 *    |r	|| _         d S d| _         d S Nr[   r3  )r  r  r   s      r(   jm_lineart_begin_layerr  -[  s      r)   c                     d| _         d S r  r  rw  s     r(   jm_lineart_end_layerr  4[  s    CNNNr)   c           	          | j         sd S dt          |          t          |          t          |          t          j        |          || j        | j        d| _        t          |            | xj        dz  c_        d S )Nr  )r   r   isolatedknockoutr  rU  r   ra  r   )	r  rf  r6  r   fz_blendmode_namer#  r3  r*  r1  )r  r  r.  r  r  r  r  r  s           r(   jm_lineart_begin_groupr  8[  s}    9 #D))XX0;;Y^	 	CL CIINIIIIr)   c                 8    | j         sd S | xj        dz  c_        d S rQ  )r  r#  rw  s     r(   jm_lineart_end_groupr  J[  s$    9 IINIIIIr)   c	           
      \    t          | |d||||| j                   | xj        dz  c_        d S rQ  r  )	r  r  r   rf  r  r  r  r  r7  s	            r(   jm_lineart_stroke_textr  Q[  s3    #tQZsyIIIIINIIIIr)   c	                 >    |j         | _         t          | |           d S r+   )r_  jm_increase_seqno)	r  r  r	   rf  r  r  r  r  r7  s	            r(   jm_dev_linewidthr  V[  s"    $CMsC     r)   c                 p    	 | xj         dz  c_         d S # t          $ r t          rt                        w xY wrQ  )rZ  rf   r	  ru   )r  r  vargss      r(   r  r  [[  sI    		Q				   4N$4$4$4s    !5r  r	  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  rt  rK  )r  r	  s     r(   rY  rY  c[  s2     
rB	rB/"b))***r)   c                   $     e Zd Z fdZd Z xZS )JM_image_reporter_Filterc                 p    t                                                       |                                  d S r+   r  r  s    r(   r   z!JM_image_reporter_Filter.__init__t[  s1    %%'''''r)   c                     t          |t          j                  sJ t          | t          j        |          ||           t
          rdS d S r   )r=   r   rd  r  rq  r   )r'   r  r  r   r  s        r(   r  z%JM_image_reporter_Filter.image_filterx[  sQ    #u/////enS114??? 	 1	 	r)   r  r  s   @r(   r  r  s[  sG        ( ( ( ( (      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| _        |                                  |                                  |                                  |                                  | 	                                 | 
                                 |                                  |                                  |                                  |                                  d S r  )r   r   r!  r  r3  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__[  s    ""$$$$$&&&""$$$$$&&&$$&&&##%%%##%%%((***$$&&&""$$$$$r)   )r.   r/   r0   r   r  begin_layerr  	end_layerr@  	fill_pathrP  stroke_pathrL  	fill_textrH  stroke_textrN  ignore_textrD  
fill_shader8  
fill_imager;  fill_image_maskr  r  s   @r(   r;  r;  [  s`        % % % % %" )K$I!I%K!I%K%K#J#J-OOOOOr)   r;  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )rC  c                     t                                                       || _        |                                  |                                  |                                  |                                  d S 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__[  sn       !!#####r)   c                 8    | j                             ||          S r+   )r
  r  )r'   r  r  whences       r(   r  z!JM_new_output_fileptr_Output.seek[  s    x}}ff---r)   c                 8    | j                                         }|S r+   )r
  tell)r'   r  rF   s      r(   r  z!JM_new_output_fileptr_Output.tell[  s    hmmoo
r)   c                 4    | j                                         S r+   )r
  truncate)r'   r  s     r(   r  z%JM_new_output_fileptr_Output.truncate[  s    x  """r)   c                 `    t          j        ||          }| j                            |          S r+   )r   raw_to_python_bytesr
  r   )r'   r  data_rawdata_lengthr}  s        r(   r   z"JM_new_output_fileptr_Output.write[  s(    (;??x~~d###r)   )	r.   r/   r0   r   r  r  r  r   r  r  s   @r(   rC  rC  [  st        $ $ $ $ $. . .  # # #$ $ $ $ $ $ $r)   rC  c                 >   | j         t                      | _         t          | j                   }|dk    r:| j         |dz
           }t          |          }t	          j        || j                  }n| 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.
    Nr   r   )	rv  r   r6   r  r   r1  r}  rj   rf  )r  num_scissorslast_scissorr  s       r(   r  r  [  s    
 |vvs|$$La|LN3!,//)'3<@@,L0011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         |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  || _        d| _        d| _        || _        || _        d | _        d| _        d | _        d| _        t;          j                    | _        t;          j                    | _         t;          j                    | _!        t;          j"                    | _#        t;          j"                    | _$        d| _%        t;          j&                    | _        d| _'        d| _(        d| _)        d S 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  rZ  r#  r  r  rv  r3  r}  r_  r   rq  r  r  rQ  r"  r  r  r  rg  r  rR  r{  )r'   r  r  r  r  s       r(   r   z%JM_new_lineart_device_Device.__init__[  s    	""$$$$$&&&""$$$((***))+++))+++""$$$""$$$$##%%%##%%%((***!!###$$&&&""$$$$$&&&""$$$


>##>##>##-//r)   )%r.   r/   r0   rw  r   r  r  r  r  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr  clip_stroke_textr  r  r  r  r  r  r  r  pop_clipr  begin_groupr  	end_groupr  r  r  r  r  r  s   @r(   r  r  [  s         1 1 1 1 1j /I0K4O.I5.I5+I+K+K+J+J+O-H0K.I0K.IIIIIr)   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 )rr  zB
    Trace TEXT device for Python method Page.get_texttrace()
    c                    t                                                       |                                  |                                  |                                  |                                  |                                  |                                  |                                  | 	                                 | 
                                 |                                  || _        d| _        d| _        d| _        d | _        d| _        t#                      | _        t'                      | _        d| _        t-          j                    | _        t-          j                    | _        t-          j                    | _        t-          j                    | _        t-          j                    | _        d| _        d| _         d| _!        d| _"        d S r  )#r   r   r  r  r  r  r  r  r  r  r  r  r  rZ  r#  r  r  r4   r*  r   rv  r_  r   rq  r  r  rQ  r"  r  rg  r}  r  rR  r{  r3  )r'   r  r  s     r(   r   z JM_new_texttrace_device.__init__"\  s{   ""$$$$$&&&""$$$$$&&&$$&&&##%%%##%%%((***$$&&&""$$$



>##>##>##r)   )r.   r/   r0   rw  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s   @r(   rr  rr  \  sk         " " " " "H "I"K$I(K(K"J"J'O(K$IIIIIr)   rr  r(
  r   c                    |                                  }dd l}|                    d          }|                    d|z            }|                    d          }d}d|z  }|dk    r|}	n|dk    r|}	n|d	k    r|}	n|d
k    r|}	n|}	|	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>
            zP
            <?xml version="1.0"?>
            <document name="%s">
            a  
            <?xml version="1.0"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <style>
            body{background-color:gray}
            div{background-color:white;margin:1em;padding:1em}
            p{white-space:pre-wrap}
            </style>
            </head>
            <body>
            r[   z{"document": "%s", "pages": [
r  rr  r  xhtml)r  textwrapdedent)
r   re   rE  r  r  r  r  r   rr  r  s
             r(   ConversionHeaderr  S\  s    			AOOO??   D //  	  C OO   E D,x7DF{{	
f	
e	
gHr)   c                     |                                  }d}d}d}d}|}|dk    r|}n|dk    r|}n|dk    r|}n|dk    r|}n|}|S )	Nr[   z]
}z</body>
</html>
z</document>
r  rr  r  r  )r  )r   rE  r   rr  r  r  r  r  s           r(   ConversionTrailerr  \  sr    			ADDD
CEF{{	
f	
e	
gHr)   c                     t          |            | j        j        st          d          | j        }|dk    r|                     d           |S )zPrepare for annotation insertion on the page.

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

    Set ownership flag and store annotation in page annotation dictionary.
    TN)r=   r   r   r   r6  r7  r   )r   r   s     r(   r  r  \  sU     tT"""""ue$$$$$EL"'DRYYEMMMr)   c                    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    r5| t          d	          k    r"| t          d          z
  t          d
          z   S | S )Nr  i(   i)   r   r$   	r  Zr    )r=   r3   r
  r  s    r(   canonr"  \  s    a 	DyyAKK1;;3xxCII~~c$ii1D		>>3xxCHH}}c#hh3s88|c#hh&&Hr)   c                     t          | t                    sJ t          j        |           \  }}t	          |          }||fS r+   )r=   r   r   r  r"  )rp  rD   r  s      r(   chartocanonr$  \  s@    aq!!DAqaAa4Kr)   c                    t          j        | t          d                    }t          j        t          j        |t          d                    t          d                    r2t	          t          j        |t          d                    |          sdS t          j        | t          d                    }|j        snJt          j        |          rt	          ||          S t          t          j        |d          ||          sdS dS )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5   

 )"Ax}}55 
 qAx//00A< 			a	 	  #Q
333A&&  
 q1r)   c                     t          j        |           }|dk    rdS t          |          D ]}||         |k    r dS dS r  )r   r   rK  )r  r(  r  numr   s        r(   r'  r'  \  sX    

3

C
axxq9  A#%%11 &1r)   c                     t          | t                    sJ t          t          |                     D ]'}t	          | |d          |          }|||z  }||fc S (dS )Nr	  )r=   r   rK  r6   match_string)rp  rV  r   r  s       r(   ru  ru  \  sq    a3q66]]  1QRR5&))?1HCc6MMM  :r)   c                     ddl } t          t          | j        dz                                          dd          dt          t          | j        dz            dz                                dd          d} | j        d | j                              }| j        dk    r	|d	|z   z  }n| j        dk     r	|d
|z   z  }n	 |S )z'
    "Now" timestamp in PDF Format
    r   Ni  r   ry   r   r=  zD:%Y%m%d%H%M%SrR  r	  )timer   r  altzonerjuststrftime	localtime)r0  tztstamps      r(   r  r  \  s     KKKC$%%&&,,Q4444S#$$r)++11!S9999
B T]+^T^-=-=>>F|a#(			#(Mr)   c                       e Zd ZdZd ZdS )ElementPositionzDConvert a dictionary with element position information to an object.c                     d S r+   r,   r-   s    r(   r   zElementPosition.__init__]  r  r)   Nr  r,   r)   r(   r8  r8  ]  s)        NN    r)   r8  c                      t                      S r+   )r8  r,   r)   r(   make_story_elposr;  ]  s    r)   r  r  r   c                 8   || j         }t          |          }||j        }||j        }|j        |_        |j        |_        |j        s|j        rg S | 	                    dd|          d         }g }|D ]j}t          |d                   }|j        s|j        r&|d         D ];}t          |d                   }|j        s|j        r&|
                    |           <k|g k    r|S |                    d 	           |                    d          }	|	j        |j        z
  d
|	j        z  k    rEt          |j        |	j        |	j                  }
|
j        s|
j        s|                    d|
           n|                    d|	           |g k    r|S |                                }|j        |j        z
  d
|j        z  k    rDt          |j        |j        |j                  }
|
j        s|
j        s|
                    |
           n|
                    |           |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.
    Nr4   r   )r  r   r  r.  r  c                     | j         S r+   )r
  )r.  s    r(   rr	  z)get_highlight_selection.<locals>.<lambda>L]  s     r)   r	  r  )r   r#  r  r  r%  r  r
  r  r  r  rj   r  r	  r  r$  insert)r   r  r  r   r  r  r
  r.  rn   bboxfr  bboxls               r(   r  r  ]  sH     |y::D}|wgDGfDG} ( 	 ]]ad   F E  AfI 	t} 	gJ 	 	DV%%D 4= LL		 {{	JJ''J((( IIaLLEx%'S5<///%(EH--
 	am 	LLAQ{{ IIKKEvC%,...4658,,
 	am 	LLOOOULr)   c                 z    ddl }	 t          |                    |                     }n# t          $ r d}Y nw xY w|S )z+Convenience function accessing unicodedata.r   Nr	  )unicodedatar
  lookuprf   )r   rB  r	  s      r(   r
  r
  f]  sY    +$$T**++   J   ") 88c                     |j         |j         z
  }|j        |j        z
  }t          j        || j         z  || j        z  z             S r+   r$  r%  r   fz_absrh  r    r
  dxdys        r(   hdistrK  p]  =    	
qsB	
qsB<SU
R#%Z/000r)   r  rU  rowsc                    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  }|	
                    |           |	g}t          d|          D ]A}
||
dz
           }	g }|	D ]}|
                    ||z              |
                    |           B|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.
    r  r   r   )r#  r  r  r   r  r  r[  r$  r%  rK  rj   )r   rU  rM  r  r  r[  delta_hdelta_vr  rowr   rectsnrows                r(   
make_tablerT  v]  s8    ::D} >( ><===	B[4FJEa"G&!V$GRrtf}--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 ]3}	t          j        t          j        ||	                    }
||
k    rd} n4|s+t          j        |t          j        ||d                     dS dS )zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    r  r-  r.  r   r   r   N)r   r   r   r  r2  r  r1  r  r  r  r  r  r   rK  r  r  r  )r   r  rY  
PDFNAME_COr  r  rD   r  r  r   r  s              r(   r  r  ]  sU    #EJ//I

&y
1
1C#D))Jc""VZ   D 
	D*	-	-Bb!! ;%dJ::BAEI&&D1XX   !4R!;!;<<5==EE   GR!7T1!E!EFFFFFG Gr)   r{  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 dS )Nr   r   r   r	  )
r=   r   r   r6   r  r   r"  r  r$  r%  )rL  s    r(   get_xyzutil_make_rect.<locals>.get_xy]  sh    sT5M** 	"sCyyA~~q63q6>!sUEM5>BCC 	 5#%<zr)   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   rg  fz_rectr	  r  r  r
  r   r  s    r(   
make_tuplez"util_make_rect.<locals>.make_tuple]  s    q%   	Hq%   	*38OT5%,FGG 	*4qtQT))1tUm,, 	Ar)   c                  V   t                    dk    rdS t                    dk    r d         } t          | t          t          f          r6t          |           dk    r#| \  }}g ||R }t          |          dk    sJ |S t          | t          t          f          rZt          |           dk    rG| \  }}} |          } |          } |          }g |||R }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    r] d                   \  }}||fd	k    r||d         d         fS  d                   \  }	}
|	|
fd	k    rd         d         |	|
fS n1t                    dk    rd         d         d         d         fS t	          d
           )Nr   r  r   r   rI  r   zarg=z ret=r	  r  )r6   r=   r   r   rf   )rL  r  r	  rF   r    r
  r  r	  r  r  r
  r  rY  r\  s              r(   handle_argsz#util_make_rect.<locals>.handle_args]  sb   t99>>:YY!^^q'C3u.. 399>>BrhBhh3xx1}}}}
3u.. 399>>1aJqMMJqMMJqMM qj1jqjj3xx1}}}}
*c""Cs88q==="2S"2"2C"2"2===JYY!^^&$q'""VVT!W%5%55Cs88q====JYY!^^VT!W%%FBBx<''2tAwQ//VT!W%%FBBx<''AwQR// (YY!^^7DGT!Wd1g555t55666r)   r,   )ru  r  r	  r  r  r
  r  r^  ret_x0ret_y0ret_x1ret_y1rY  r\  s         `     @@r(   r}  r}  ]  s    .  	 	 	"7 "7 "7 "7 "7 "7 "7F &1[]]"FFFF	~	~	~	~	~	~666))r)   c           
          t          || |||||d\  }}}	}
d } ||d          } ||d          } ||	d          }	 ||
d          }
|||	|
fS )Nr{  c                     |r!t          t          j        |                     S t          t          j        |                     S r+   )r3   r  rW  floor)r$  rW  s     r(   convertz util_make_irect.<locals>.convert^  s6     	&ty||$$$tz!}}%%%r)   FT)r}  )ru  r  r	  r  r  r
  r  r    r
  r  r  rf  s               r(   r  r  ^  s    $2"rbQQQJAq!Q& & &
 	5A5A4A4AaA:r)   c                 ^    t          t          j        t          |                               S r+   )r  r   r2  r  r  s    r(   r  r  ^  s#    E/0E0EFFGGGr)   c                     t           rt          j        | |          S t          t	          j        t          |           t          |                              S r+   )r  r   r  rf  r   r  r  r  )r   r  s     r(   r  r  #^  sJ     8($77752?43H3HJ[\bJcJcddeeer)   c                 z    t          t          j        t          |           t          |                              S r+   )rf  r   r1  r  r'  r(  s     r(   r  r  )^  s:    #####   r)   c                 `    t          j        t          |           t          |                    S r+   )r   fz_is_point_inside_rectr$  r  )r  r  s     r(   ru  ru  2^  s-    ( ##""  r)   c                 z    t          t          j        t          |           t	          |                              S r+   )rf  r   r  r  r$  )r  r  s     r(   r  r  8^  s:    *"" ##   r)   c                 h    t          |           }t          |          }t          j        ||          S r+   )r$  rS  r   fz_is_point_inside_quad)r  r   r  rW  s       r(   r?  r?  A^  s/    AA(A...r)   c                 z    t          t          j        t          |           t	          |                              S r+   )r  r   r#  r$  r  )r)  r  s     r(   r0  r0  G^  s:    $ ''!&))   r)   c                 z    t          t          j        t          |           t          |                              S r+   )rf  r   r  r  rj  s     r(   r  r  P^  s:    ####   r)   c                 z    t          t          j        t          |           t          |                              S r+   )rp  r   r!  r  )r5  rN  s     r(   rQ  rQ  Y^  s9    O!"%%!"%%   r)   c                 H   	 t'          |           }|j        }||j
        z  |j        |j	        z  z
  }|t           j        j         k     s|t           j        j        k    rt          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 dS )Nr   ztype(matrix)=rz   r   )r   r,   )r=   r   r   r   rq  rd  rt  r    r
  r  r  r_  r  r   rB  r  rM
  
float_infoepsilonr  )r  rF   r  r    detr
  rdets          r(   rL  rL  b^  s   =( F
#
#CA
ce)cecem
#C
cn$$$$cn.D(D(Dn3wDUFSUNSUSU]*.35#%suce<<<5r)   c                     t          j        |          }d}d}|t          |           k     rt          j        | |d                    \  }}||z  }|t           j        k    rt          j        |          }n9|t           j        k    rt          j        |          }nt          j        |          }|dk     rd}t          j	        ||          }	t          j
        ||	d          }
||
z  }|t          |           k     ||z  }|S )Nr   r  )r   r4  r6   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  rX  r   rd  rE  r  r  r  rF   s               r(   r%  r%  ^  s    #H--D	A
C
D		//"4:..1qu666/22AA;;;2155AA2155Aq55A%dA..#D!Q//	R D		// h,CJr)   c                    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   rf  r  r$  r%  rh  r!  r#  )	r  r  r   r  r  rW  rp  r5  rN  s	            r(   r]  r]  ^  s    AAA!%"5acACiqs"K"KLLA		aAq13$	5	5B		acAC4ac1a	8	8B	R	 	 B B''A!!$$A3Jr)   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   rf  r  r$  r%  rh  rp  r!  )r  r  r  r  rp  r5  rN  s          r(   rK  rK  ^  s    
 	AA 	!%"5acACiqs"K"KLLA		aAq13$	5	5B		acAC4ac1a	8	8BU_R44555r)   c                 Z   d}d}|}t          | |d                    \  }}||z  }t          ||d                    \  }}||z  }||k    r|}|t          d          k    r6	 t          | |d                    \  }}||z  }|t          d          k    rn4nt          | |d                    \  }}||z  }|t          d          k    r6	 t          ||d                    \  }}||z  }|t          d          k    rn4nt          ||d                    \  }}||z  }||k    |dk    rd n|S )Nr   r   )r$  r
  )	h0rE  r  rD   r_  rO  hcdelta_nncs	            r(   r.  r.  ^  sj   	A	A	Abf%%KGRLAbf%%KGRLA
((S>>)"QRR&11WS>>	 %bf--KGRLAS>>)"QRR&11WS>>	 %bf--KGRLA' ((( 7744!r)   c                 D   | sJ t          |t          j                  sJ t          |t          j                  sJ |j        j        | j        z  }|j        j        | j        z  }t          ||          }| j	        dk    r| j
        | j	        dz
           }t          |          }	 t          |j        j        |j        |j                  |k     rt!          |j        j        |j        |j                  |k     rt          |j        j        |j        |j                  |k     rVt!          |j        j        |j        |j                  |k     r-|j        |_        |j        |_        | j
        d         |k    sJ d S | j
                            |           | xj	        dz  c_	        d S rq  )r=   r   r  r  r   r  rs  rr  r  r6   r/	  rS  rK  rh  rM  rL  vdistrN  r  rj   )rx  rn   r
  rs  rr  ch_quadr  r  s           r(   rv  rv  ^  st   KKKdE-.....b%+,,,,,M+EM+E4$$Gx!||z$(Q,'d##		$/-svwzBBUJJ$/-svwzBBUJJ$/-svwzBBUJJ$/-svwzBBUJJZCFZCF:b>S((((FJgHHMHHHHr)   c                 b   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 ]X}t	          j
        |	||                   }|j        r4t	          j        |
||         t	          j        |j        |                     Y|rt	          j        |	t          d                    }t	          j        |          }|dk    rt	          j        |
t          d          |          }t          |          D ]u}t	          j        ||          }|j        rt	          j        |          s4t	          j        |d          j        rOt	          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	          j        ||           w|dk    r#t	          j        |
t          d          |           t	          j        | |
          }t	          j        | ||           dS )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  r4  r  r  r  r  r  r3  UserUnitrI  r/  r   r  r   r  r  r
  r  r8  r  r0  N)r  r   r#  r  r   r>  rR  rM  rK  r6   r?  r   r  r   r  r  r  r  ry  r   r  r@  r  r   r  rH  r  rn  )r$  r%  	page_frompage_torX  ry  copy_annotsr)  known_page_objspage_refr  r   r  r+  rD   r,  r  r  r-  r   r  s                        r(   r#  r#  ^  sc     n'9gvuVaclmmm 	

O ()<<H "7A..I	y(6"2"2HV4D4DEEE C(()) s s,h8JKK> 	s	?1+=u?\]f]kmp?q?qrrr  9'8H3E3EFF
,,q5519hx>P>PRSTTJ1XX 9 9'Q77| 5+<Q+?+? &511< ,a)1D1DEE$gx/?/?@@ $gx/@/@AA $Whx.@.@AA "Ax'8'8999"Ax}}5556	JJ.9I69R9RTUVV$j%8888 ||	8H+=+=vFFF


3
3C 
7GS11111r)   c                 J    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#  )rp  r[  r  s      r(   
paper_rectr  <_  s'     qMMME6S%(((r)   c                 "   |                                  }d}|                    d          rd}|dd         }|                    d          r
|dd         }t                                          |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_sizesr7   )rp  r  r  r   s       r(   r  r  C_  s     7799DA}}T CRCy}}T CRCy			4	*	*BCxx	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)  r  a10)rN  rr  a2)  r  a3)rg  r  a4)rf  rg  a5)  rf  a6)*  r  a7)r  r  a8)   r  a9)rr  r  b0)  i  b1)  r  b10)r`  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  r  )r  r  b8)r  r  b9)r  r  c0)'
  i]  c1)-  r  c10)rU  r|  c2)  r  c3)  r  c4)  r  c5)  r  c6)C  r  c7)r  r  c8)r  r  c9)r|  r  zcard-4x6)i   i  )r  i  )i)  i  )i
  i  )i  r  )r  i  )r  i  )r  i  )r  r  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar,   r,   r)   r(   r  r  W_  s   -
l-
l-
 	y-
 	l	-

 	k-
 	j-
 	j-
 	j-
 	j-
 	j-
 	j-
 	l-
 	l-
 	y-
 	l-
  	l!-
" 	k#-
 -
$ 	j%-
& 	j'-
( 	j)-
* 	j+-
, 	j--
. 	l/-
0 	l1-
2 	y3-
4 	l5-
6 	k7-
8 	j9-
: 	j;-
< 	j=-
> 	j?-
@ 	jA-
B 	jC-
D 	JE-
 -
F  $Y-
 -
 -
 -
r)   c                 ,    t          j        | |          S r+   )r   rV  )r)  rV  s     r(   rV  rV  _  s    $S&111r)   c                     J d            )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    r   zuse mupdf.pdf_debug_obj() ?)r   r  r  rK  r  pdfobj_stringrM  array_get_boolry  rz  r|  r  pdf_is_embedded_fileembedded_file_namer  r)
  r  pdf_is_jpx_imager  rx  r  r*
  r  r  r+
  r   )r  r	  rF   r  r   oor  r   s           r(   r  r  _  s     ,++++r)   c                 ~   j         d         sdS | j        }|                                 }fd|D             }|g k    rdS t          |          }t	          t                              d          dz                      }|D ]7}t                              |||          st          dj
        |fz             8dS )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
  Nc                     g | ]Q}|d          j         k    |d                             d          .|d                             d          I|d         RS )r   rI  r  r   r  r   )r   r2   )r   r  rX  s     r(   r   z$repair_mono_font.<locals>.<listcomp>_  sb       aDDI!A$//#"6"61Q4??:;V;V 	
!r)   r?  i  z$Cannot set width for '%s' in xref %i)r  r   rF  r  r3   r-  r
  r
  set_font_widthr&   r   )r   rX  r)  r  rA  r[  r  s    `     r(   r  r  _  s     :f t
+C~~H     E
 {{JJEt))"--46677E L L##Cu55 	L6$)T9JJKKKL Lr)   srgbc                 `    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  )r  rE  s     r(   sRGB_to_pdfr  _  s6     	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    r dS 1dS )Nr   r   r   )r   r  r  rK  r  )r  r)  rD   str_r   s        r(   r&  r&  `  sz    ,6=Z(((AA#Q''D1a^^  #U%8*a%H%HIITQQ11 R1r)   c                 V   d}d}|}d}|j         rt          | ||||          }	t          ||||          s3|	dk    rt          j        |t          d                    }
|
j         s*|j         r"t          j        |t          d                     np|j         rGt          j        |t          d          |
           t          j        |
t          d          |           n"t          j        |
t          d                     |
}nt          j        |t          d                     t          j        |t          d                     t          j        |t          d                    }n4|r|j         s|}|}t          j        |t          d                    }|dz  }|j         |||fS )z'
    Returns (count, first, prev).
    Nr   rH  Prevr  r  r   )r   strip_outlinesr*  r   r  r  r@  rM  )r)  outlinesr  r(  r)  rC  r  currentr  r  r;  s              r(   strip_outliner  `  s    EEGD

  C*6F
SSWj2BJOO 	Qww )'8F3C3CDD ? C*4&1A1ABBB_ ?&tXf-=-=tDDD&tXf-=-=tDDDD&tXf-=-=>>> "7HV,<,<==="7HSMM:::,Whv6F6FGG    0  D((62B2BCCGQJE? 
 B %r)   c                    |j         sdS t          j        |t          d                    }|j         sd}nt	          | ||||          \  }}}|dk    rgt          j        |t          d                     t          j        |t          d                     t          j        |t          d                     nt          j        t          j        |t          d                              }t          j        |t          d          |           t          j        |t          d          |           t          j        |t          d          t          j        |dk    r|n|                      |S )Nr   r=  Lastr  )	r   r   r  r  r  r@  r  rM  r  )	r)  r  r  r(  r)  rC  r  r	  	old_counts	            r(   r  r  :`  sY    qx'):):;;E ^'UJ@PR\]]E4	Qww8Xg%6%67778Xf%5%56668Xg%6%67777$U%7(7BSBS%T%TUU	8Xg%6%6>>>8Xf%5%5t<<<8Xg%6%68IPY\]P]P]""dfcf8g8ghhhIr)   r
  c                 z    ddl }	 |                    t          |                     }n# t          $ r d}Y nw xY w|S )z5
    Convenience function accessing unicodedata.
    r   Nz.notdef)rB  r   r	  r   )r
  rB  r   s      r(   r
  r
  V`  sY     B((   KrD  c                     |j         |j         z
  }|j        |j        z
  }t          j        || j        z  || j         z  z             S r+   rF  rH  s        r(   r  r  b`  rL  r)   r,   single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsr|  r  concurrency_statsc       	            |
rt          j                     }|dk    ru|r ||i | t                      }t          |           }|t          t	          |                    }|D ]+}||         } ||g|R i |}|                    |           ,n2ddlm} ||
rt          j                     }t          |           5 }t	          |          }t          t          |                    }ddd           n# 1 swxY w Y   |
r)t          j                     |z
  }t          |dd           |
rt          j                     }|dk    r|	                    | ||||||||	|

  
        }n3|dk    r|
                    | ||||||||	|

  
        }nJ d
|d            |
r)t          j                     |z
  }t          |dd           |
r)t          j                     |z
  }t          |dd           |S )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  forkr   zUnrecognised method=r   zs: work.z	s: total.)r0  r   r   rK  r6   rj   r[   r  r&   _multiprocessing_fork)r	   r  r  r  r  r  r  r|  r  r  r  r	  rF   r   r  r   r  r  rE  	num_pagess                       r(   apply_pagesr  h`  s   p  Y[[ 	2FK1=111ffD>>=#h--((E 	 	CC=Dt;k;;;];;AJJqMMMM	 	#"""""=  IKK$ /8MM	U9--../ / / / / / / / / / / / / / /  /IKK!Oq----... 		AT>>//!! CC v$$!! CC 10f000000 	$	aA1""""### !IKK"q   Js   =,C55C9<C9)
r|  r  r  r  r   r  r  r  rC  r  c       
   	      l    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  rC  )r  r|  r  r  r  )r4   r  r   r  )r	   r|  r  r  r  r   r  r  r  rC  r  	args_dicts               r(   r  r  `  s[    X !  I M##   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d0d            Zed1d            Zed1d            Zed             Zed/d            Zed              Z ed!             Z!ed1d"            Z"ed#             Z#ed$             Z$ed0d%            Z%ed1d&            Z&ed1d'            Z'ed1d(            Z(ed)             Z)ed*             Z*ed+             Z+ed,             Z,ed1d-            Z-d.Z. e/            Z0dS )2r
  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   rp  r   rq  r   s    r(   _derotate_matrixzTOOLS._derotate_matrix/a  sC    dEM** 	7$%<T%B%BCCC$U^%5%5666r)   c                 Z   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+   )re  r#  r   r  r   r  r
  r  r  r  r  r  r  )r   r:  r  s      r(   r9  zTOOLS._fill_widget5a  s    &uf555:&&j} 	! FM# 	(#'F # 	(#'F # 	(#'F ! 	&!%F! 	&!%F" 	'"&F
r)   c                     t          | j                  } t          |                                           }t	          |          }|S r+   )r   r   r(  r  r  )r   r  r!  s      r(   r  zTOOLS._get_all_contentsMa  s8    DI&&txxzz**!3''r)   r   c                     t          | d          }t          |          }t          |                                |                                ||          }|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_contentsTa  sK     ta000$W--!'++--QQr)   c                    | j         d         }| j        d         }|sd}d                    t          t          |                    dz   }|r|}n| j        d         }|sd}d                    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)
        r[  rf  r  r   z RG
r   r/  z rg
r   r   r  r[   )r  r  r  r  r   rt  rK  rU  )r   r  r	  rW  r   scscolrk  r\  np1np2r  r  r  r  rU  s                   r(   _le_annot_parmszTOOLS._le_annot_parms]a  s    L!\(# 	BxxC%%/ 	&BBf%B 	BxxC%%/?3,,--R!G!G!!!!!!!!!GGG"aAtT722r)   c                 D   t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r|n|}|d| dz  fz   |z  }|d|dz  fz   |z  }d||j        |j        fz  }|d|j        |j        fz  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  
q
%s%f %f m
%f %f l
rV  s
Q
r
  r	  r  r$  r%  r   )r   r  r	  rM  rW  r  r  r  r  r   r  r\  rU  r  r  r  r	  botr   s                      r(   r  zTOOLS._le_butta  s     /4.C.CE2rS].^.^+2q!QdGC1IINAAAr"u:~#Aqt9}"7CE35"99
kSUCEN**
illV##
dXo	r)   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }t          ||          | | ||fz   }d|z   t                               |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   zq
rV  b
Q
)
r
  r	  r  r#  _oval_stringr  r  r  rX  r   )r   r  r	  rM  rW  r  r  r  r  r   r  r\  rU  r  r  r  r  r   s                     r(   r  zTOOLS._le_circlea  s     /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'W_u11!$)QTBYr	STSWZ\S\]]]
illV##
dTkH$$	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  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  rV  r  r  r   r  r	  rM  rW  r  r  r  r  r   r  r\  rU  r  r  r  r   s                    r(   r  zTOOLS._le_closedarrowa  sG    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m "6R2a4!*__acA2Y!4R2a4)^^rQqS!H}
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|j        |j        |j        z
  dz  z   |z  }|d|j        |j        fz  z  }|j        |j	        |j        z
  dz  z   |z  }|d|j        |j        fz  z  }|j	        |j        |j	        z
  dz  z   |z  }|d|j        |j        fz  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   rT  q
%s%f %f m
r  rV  r  )r
  r	  r  r#  r  rX  r$  r%  r  r  r   r   r  r	  rM  rW  r  r  r  r  r   r  r\  rU  r  r  r  r  r  r   s                      r(   r  zTOOLS._le_diamonda  s    /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'TQTAD[C''2-!#qs 33TQTAD[C''2-
kqsACj((TQTAD[C''2-
kqsACj((TQTAD[C''2-
kqsACj((
illV##
dTkH$$	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  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  rV  S
Q
r  r  s                    r(   r  zTOOLS._le_openarrowa  sB    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m "6R2a4!*__acA2Y!4R2a4)^^rQqS!H}
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dXo	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  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  rV  r  r  r  s                    r(   r  zTOOLS._le_rclosedarrowa  sG    /4.C.CE2rS].^.^+2q!QdGC1II1Q!A#q\\Q!A#q\!6R1Q3)^^rRTA2J 4R1Q3(]]bBqD!9n
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  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  rV  r  r  r  s                    r(   r  zTOOLS._le_ropenarrowa  sG    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m!6R1Q3)^^rRTA2J 4R1Q3(]]bBqD!9n
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r)   c                    t                               | |||          \  }}}}}	}
}}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        |j        fz  }|d|j        |j        fz  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  rV  r  )	r
  r	  r  r#  r$  r%  r  r  r   )r   r  r	  rM  rW  r  r  r  r  r   r  r\  rU  rwr  r  r	  r  r   s                      r(   r  zTOOLS._le_slashb  s     /4.C.CE2rS].^.^+2q!QdGc!Qii#%NAAr13Q;b!#A+>>dRidRi7CE35"99
kSUCEN**
illV##
dXo	r)   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }t          ||          | | ||fz   }|j        |z  }d||j        |j        fz  }|j        |z  }|d|j        |j        fz  z  }|j        |z  }|d|j        |j        fz  z  }|j	        |z  }|d|j        |j        fz  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  rV  r  )r
  r	  r  r#  r  r$  r%  r  r  rX  r   r  s                      r(   r  zTOOLS._le_squareb  s=    /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'D2I!#qs 33D2I
kqsACj((D2I
kqsACj((D2I
kqsACj((
illV##
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   }d|j         |j        fz  }| ||
||          z  }| ||||          z  }| ||||	          z  }| ||||          z  }|S )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                 X    d}|| j         | j        |j         |j        |j         |j        fz  S )Nz%f %f %f %f %f %f c
r  )r  rW  r  r  s       r(   bezierz"TOOLS._oval_string.<locals>.bezier1b  s+    'AQS!#qsAC555r)   r  rT  z%f %f m
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  so   	6 	6 	6 27c/!27c/!27c/!27c/!BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BD"$<'
ffS#r"""
ffS#r"""
ffS#r"""
ffS#r"""	r)   c                    t           rt          j        | j                  }nd } ||           }|sdS d}d}d}|                                }t          |          D ]\  }}|dk    rA||dz
           dd          }t          ||dz
                     }d	x||<   x||dz
  <   ||dz
  <   L|d
k    r't          ||dz
                     g}d	x||<   ||dz
  <   y|dk    r5d ||dz
  |         D             }d	x||<   x||dz
  <   x||dz
  <   ||dz
  <   |dk    r=d ||dz
  |         D             }d	x||<   x||dz
  <   x||dz
  <   x||dz
  <   ||dz
  <   |||f}|S )Nc                 
   | j         }t          |t          j                  sJ t          j        |          }t          j        |          }	 t          j        |t          d                    }|j        sRt          j	        |          }t          j
        |t          d          t          d          t          d                    }t          j        |          }n&# t          $ r t          rt                       Y d S w xY w|S )NrR  r-  r.  )r   r=   r   r   r   r  r?  r  r   r1  r  r  rf   r	  ru   )r   r'  this_annot_objrY  r  r  rV  s          r(   Tools__parse_daz(TOOLS._parse_da.<locals>.Tools__parse_daPb  s    "Z
!*en=====!&!4j!A!A2NCC7RVXXB= ""'"3C"8"8"0 ( 0 0 ( 4 4 (" "
 #5b99FF    +@0@0@0@FF s   BC D ?D )r-  r[   r   r  r  r  r  r   r   r[   r  r  c                 ,    g | ]}t          |          S r,   r  r  s     r(   r   z#TOOLS._parse_da.<locals>.<listcomp>vb  r  r)   r   r  c                 ,    g | ]}t          |          S r,   r  r  s     r(   r   z#TOOLS._parse_da.<locals>.<listcomp>zb  r  r)   rI  )r  r   Tools_parse_dar   r5   r  rm  )	r   r  r0  rX  r  r^  r  r   rB   s	            r(   r  zTOOLS._parse_daJb  s     	)&
33CC  & "/%((C 	! =iikk ~~ 	 	GAtt||1q5z!""~c!a%j))/11A1QqSC!Hs{{c!a%j))+$&&AQqSt||66QU1W666:<<A<QqS<C!Hs1Q3xs{{66QU1W666EGGAGQqSGC!HGs1Q3x#ac( 
 D% 
r)   c                     | }t          j        |          }t          j        |          }t          j        ||           d S r+   )r   r   r  pdf_field_reset)r   r'  r/  rY  s       r(   r  zTOOLS._reset_widgetb  s@    
,Z88*>::c>22222r)   c                     |                      d          }|j        s t          t          j                              S t          t          |                    S r  )r%  r   rp  r   rq  r  )r   r  s     r(   r  zTOOLS._rotate_matrixb  sM    ..%.00! 	7$U^%5%5666 !6w!?!?@@@r)   c                 &    t          | |           d S r+   )r  )r   r:  s     r(   r  zTOOLS._save_widgetb  s     /////r)   c                    t           rt          j        | j        |           d S 	 | j        }t	          |t
          j                  sJ t          j        t          j        |          t          d          |           t          j
        t          j        |          t          d                     t          j
        t          j        |          t          d                     n&# t          $ r t          rt                       Y d S w xY wd S )NrR  r2  r  )r  r   Tools_update_dar   r=   r   r   r~  r   r  r@  rf   r	  ru   )r   rV  r'  s      r(   
_update_dazTOOLS._update_dab  s     	!5:v66666"Z
!*en=====.u/B:/N/NPXY]P^P^`fggg"5#6z#B#BHTNNSSS"5#6z#B#BHTNNSSSS   '<N,<,<,< Fs   C C& &D	D	c                  $    t           dz  a t           S rQ  )TOOLS_JM_UNIQUE_IDr,   r)   r(   r  zTOOLS.gen_idb  s     	a!!r)   c                  ,    t          j                     dS )z(
        Empty the glyph cache.
        N)r   fz_purge_glyph_cacher,   r)   r(   glyph_cache_emptyzTOOLS.glyph_cache_emptyb  s    
 	"$$$$$r)   r   c                 "    t          | |          S )z5
        Metadata of an image binary stream.
        )r  )r   r  s     r(   r'  zTOOLS.image_profileb  s    
  
333r)   Nc                 2    | t          |           at          S )z;
        Set MuPDF error display to True or False.
        )r6  r  r  s    r(   mupdf_display_errorszTOOLS.mupdf_display_errorsb  s     >#'88 ##r)   c                 2    | t          |           at          S )z>
        Set MuPDF warnings display to True or False.
        )r6  r6  rB  s    r(   mupdf_display_warningszTOOLS.mupdf_display_warningsb  s     >%)"XX"%%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                    t                    }| rt                                           |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        r$   )r   fz_flush_warningsr  r  r
  reset_mupdf_warnings)r&	  rF   s     r(   r  zTOOLS.mupdf_warningsb  sD     	!!!ii011 	)&&(((
r)   c                  "    t                      ad S r+   )r   r  r,   r)   r(   rJ  zTOOLS.reset_mupdf_warningsb  s     #'&&r)   c                 .    t          j        |            dS )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                 j    | t           S t          |           dz   }|dk    rd}| d d         a t           S )Nr   r  )rS  r6   )rU  r  s     r(   set_annot_stemzTOOLS.set_annot_stemb  s@     <##4yy1}"99D9r)   c                    t          | d          }|j        sdS 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          |	           dS )	Nr   r,  Fr	  r   ry  r	  T)r   r   r   r  r  r  r  r  rK  r  rJ  r  r  rM  )
r)  r  r[  rY  rX  dfontsrD   r   dfontwarrays
             r(   r  zTOOLS.set_font_widthb  s,   sQ///~ 	5$S$//#D(3D*E*EFFf%% 	A#F++A1XX A A+FA66,S!44$VU->q-A-ABBB$VU->u-E-EFFF$VU->u-E-EFFF"5(3--@@@@tr)   c                 .    t          j        |            dS )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_widthc  s    
 	,^<<<<<r)   c                     | r8t           j        rt          j                     dS t          dt                     dS t           j        rt          j                     dS dS )z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)r   r  fz_enable_iccr  r]  fz_disable_iccrB  s    r(   set_icczTOOLS.set_iccc  so      	#" I#%%%%%67GHHHHH  	# """""	# 	#r)   c                 P    | t          |           t          _        t          j        S )z!Set / unset MuPDF device caching.)r6  r  r   rB  s    r(   set_low_memoryzTOOLS.set_low_memoryc  s      >)-bH&))r)   c                     | >t          |           t          _        t          rt	          j        t          j                   t          j        S )z Set / unset small glyph heights.)r6  r  r   r  r   set_small_glyph_heightsrB  s    r(   r`  zTOOLS.set_small_glyph_heightsc  s=     >+/88H( L-h.JKKK++r)   c                     | >t          |           t          _        t          rt	          j        t          j                   t          j        S )zK
        Set / unset returning fontnames with their subset prefix.
        )r6  r  r   r  r   set_subset_fontnamesrB  s    r(   rb  zTOOLS.set_subset_fontnames&c  s=    
 >(,RH% F*8+DEEE((r)   c                      t          t          j                    t          j                    t          j                              S )z,
        Show anti-aliasing values.
        )r  r   graphics_min_line_width)r4   r   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr,   r)   r(   show_aa_levelzTOOLS.show_aa_level1c  s?    
  577-//*/*J*L*L   	r)   c                      dS )z)
        MuPDF store size limit.
        Nr,   r,   r)   r(   store_maxsizezTOOLS.store_maxsize<c  	     tr)   c                 z    | dk    rt          j                     dS | dk    rt          j        d| z
             dS dS )z7
        Free 'percent' of current store size.
        r  r   N)r   fz_empty_storefz_shrink_store)percents    r(   r  zTOOLS.store_shrinkDc  sL    
 c>> """1Q;;!3=11111 ;r)   c                      dS )z+
        MuPDF current store size.
        Nr,   r,   r)   r(   
store_sizezTOOLS.store_sizePc  rk  r)   c                     | >t          |           t          _        t          rt	          j        t          j                   t          j        S )zA
        Set ascender / descender corrections on or off.
        )r6  r  r   r  r   set_skip_quad_correctionsrB  s    r(   unset_quad_correctionszTOOLS.unset_quad_correctionsXc  s=    
 >-1"XXH* P/0NOOO--r)   r  r.  r-  r+   )1r.   r/   r0   rw  r  r7  r9  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:  r  r?  r'  rC  rE  r  r  rJ  rN  rP  r  rX  r\  r^  r`  rb  rh  rj  r  rq  rt  rS  r  fitz_configr,   r)   r(   r
  r
  *a  s        7 7 7   \.   \    \ #3 #3 \#3J   \   \   \&   \*   \&   \&   \&   \   \*   \8 4 4 \4l 3 3 \3 A A \A 0 0 \0   " " \"
 % % \% 4 4 4 \4 $ $ $ \$ & & & \&     \  	 	 	 \	 ) ) \) % % \%       \    \" = = \= # # # \# * * * \* , , , \, ) ) ) \)   \   \ 2 2 \2   \ . . . \.  .""KKKr)   r
  c                  |    t          j                     t          j        d            t          j        d            d S r+   )r   rI  fz_set_warning_callbackfz_set_error_callbackr,   r)   r(   _atexitry  c  s9    		!$'''	%%%%%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_dictr~  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.
    rz  r,   r)   r(   colors_wx_listr  c  s
     r)   c                    ddl }t          dt                     t          j                            t           d          }| d}|                                dk    r| d}n|}t          d           t          d	|           t          d
|           t          j                            |          sJ d|d            t          j                            |          sJ d|d            |                                dk    rE| rBt          d|dt           d           t          	                    d          dd         }d
                    |          }d| d}t          d|d           t          j        |          D ]}t          j        ||          }|r| d|                    d           }	t          j                            |	          st          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=rD  zRemoving existing link pfrom=zCreating symlink: z -> )r  r&   r  rc   r	   normpath__file__systemro  r5   r  rp  r  r  r  islinkr  r7  symlink)

make_linksr  r  mupdf_include	mupdf_libregex_suffixmupdf_lib_regexleafr  pfroms
             r(   _mupdf_develr  c  s   . OOO=
H)))**A...MI%%***		 	$%%%}   y7==''NN)N])N)N)NNNN7==##FF%F%F%F%FFFFI%%*% 	UIUU=UUUVVV$**3//!4zz,//????""""###Jy)) 	( 	(D$//A 	($33qwwqzz33 7>>%(( %BGNN5,A,A %;%;;;<<<Ie$$$:::D::;;;
4''')##r)   )r  )find_tablesc                       e Zd ZdS )FitzDeprecationNr  r,   r)   r(   r  r  
d  s        Dr)   r  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̦           d S (   Noncecategoryc                    t          j        | ||||          }|                    d          }|dk     rt          |           d S ||d                                          d         dd          }t          |           d S )N)rn   r  r   rI  )warningsformatwarningr   r&   r  )r   catre   rg   r`   rn   r   rp  s           r(   showthisz!restore_aliases.<locals>.showthisd  s~    %c3&tLLLII'((q55IIIFABBx""$$Q'+D					r)   c                      t           j        t                    s3dd}D ],}|dk    rd}|r|                                z  d}'|z  -t	                     t	           d          rJ d  d             t                    r- fd}t           |           d	 d
j         |_        dS t                      dS )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".r  )r  rt  r  )r  r  class_legacy_namenew_name
new_objects     r(   deprecated_functionz<restore_aliases.<locals>._alias.<locals>.deprecated_function8d  sU    cKccccW_ccc!0    "zD3F333r)   z;*** Deprecated and removed in version after v1.19.0 - use "z". ***
)rM
  modulesr.   rD	  r   r  r  rw  )r  r  r  capitalise_nextr  r  r  s   ```   @r(   _aliaszrestore_aliases.<locals>._aliasd  sO    >[*F 
	%K#O % %88&*OO$ %17799,K&+OO1$KKfh//
FK66cc8c8c8cVa8c8ccccZ   	64 4 4 4 4 4 4 4 V[*=>>>,RZ , ,!), ,  '''
 V[*55555r)   r  fileGetr  r  soundGetr  r  r	  getTextPager0  rX  setBlendModerc  rq  rt  r  r  r  r  setOCr  r  r  fileUpdr  r  r  convertToPDFr  r  r  deletePageRanger  embeddedFileAddr  embeddedFileCountr  embeddedFileDelr  embeddedFileGetr  embeddedFileInfor  embeddedFileNamesr  embeddedFileUpdr  r
  r#  r.  rL  ri  getOCGsr  getPageFontListr  getPageImageListr  r  r  getPageXObjectListr  getSigFlagsr  getToCr  r  r  	insertPDFr  r  	isFormPDFr  isPDFr  r  r  r  r;  rI  r  r  r`  r  rg  pageCropBoxrn  r  
PDFCatalogr1  
PDFTrailerr  previousLocationr  r6	  r  r%	  r	  setToCr	  r  r+	  r$
  isStreamrq  r  r*	  r%
  rF
  metadataXMLr  getRectArear  r  r  r  r  rW  rZ  	preRotater_  preScalera  preShearre  preTranslater  	getPDFnowrc  	getPDFstrrU  getTextlengthr'  ImagePropertiesr  	PaperRectr  	PaperSizer  rY  r"  r  r  r  r  r   r#  r%  r)  r+  r-  r1  r5  r7  r:  r=  r@  rB  r  rf  r  r  CropBoxPositionr  r'	  r  rk  r  r  r  r  r  r  r  r_  r  r  r  r  r  r  r)	  r  getDisplayListr  rF  getFontListrS  r   getImageListro  rb  getSVGimagerh  rl  r  r  r  r*  ra  r  
_isWrappedrO  r  ro  r  r  MediaBoxSizer^  r  rP  r5	  r  
setCropBoxr  setMediaBoxr  r  showPDFpagerj  r  r  r  r  r\  
copyPixmaprz  r  invertIRectr  pillowWriter  
pillowDatar  
writeImagewritePNGr  r  setResolutionr  r  r  r  getImageData
getPNGData
getPNGdatar  r_  r  r	  r+   )r  filterwarningsr  showwarningr   r  r   r   r
  rt  rQ  r   r  r  r#  r  r  )r  r  s     r(   restore_aliasesr  d  s   Vo>>>>    $H)6 )6 )6 )6V FE:I666
FE<   
FE;J777
FE:
FE=!!!
FE>M:::
FE;
FE?N;;;
FE<   
FE<   
FE;
FE:
FE?###
FE:
FE8W%%%
FE=!!!
FE:
FE=I666
FK&&&
FKM:::
FHo&&&
FH*+++
FH&N;;;
FHk"""
FHm$$$
FHn,=>>>
FHm,=>>>
FHo,?@@@
FHm,=>>>
FHm,=>>>
FHn,>???
FHo,?@@@
FHm,=>>>
FHn%%%
FHo&&&
FHo&&&
FHo&&&
FH'(((
FHjI666
FH&,=>>>
FH',>???
FH'(((
FHo&&&
FH),@AAA
FHnM:::
FHi***
FH()))
FHm$$$
FHlK888
FHj!!!
FHmK888
FHh(((
FHo&&&
FHm$$$
FHo&&&
FHk"""
FHo&&&
FHk"""
FHl###
FHj!!!
FHo&&&
FHl###
FHnM:::
FHk"""
FHmL999
FHmL999
FHo,>???
FHn%%%
FH'(((
FHn%%%
FHn%%%
FHi***
FH()))
FHo&&&
FHo&&&
FH&J777
FHm$$$
FHm$$$
FHm$$$
FH'(((
FH)M:::
FE:
FE:M:::
FE?###
FE>"""
FE:
FE=!!!
FD-   
FD,
FD,
FF$%%%
FFKK888
FFJJ777
FFJJ777
FFNN;;;
FD-K888
FD-K888
FD#$$$
FD#O<<<
FD/,=>>>
FD,K888
FD,K888
FD-   
FD.!!!
FG]###
FGY
FD#$$$
FD$%%%
FD"###
FD&'''
FD'(((
FD/"""
FD"###
FD%&&&
FD&'''
FD"###
FD$%%%
FD&'''
FD#$$$
FD'(((
FD"###
FD'(((
FD,
FD"###
FD)I666
FD$,=>>>
FD.!!!
FD-   
FD/"""
FD%&&&
FD-   
FD-   
FD,
FD+
FD+
FD/"""
FD+
FD+
FD-   
FD/"""
FD-   
FD-   
FD,
FD.!!!
FD.!!!
FD#,<===
FD.!!!
FD+M:::
FD"###
FD,N;;;
FD+
FD,
FD/M:::
FD*
FD#$$$
FD"###
FD-   
FD.M:::
FD-   
FD.!!!
FD-   
FD-   
FD"###
FD,L999
FD,
FD,
FD*J777
FD/N;;;
FD+
FD/"""
FD#$$$
FD,
FD-L999
FD.M:::
FD.!!!
FD/M:::
FD)***
FD-   
FD/"""
FD,
FFL!!!
FFFL999
FFL!!!
FFNM:::
FFJM:::
FFML999
FFFL999
FFFJ777
FFK   
FFIO<<<
FFL!!!
FFK   
FFJ
FFK   
FFIN;;;
FFIL999
FFIL999
FD+
FD*
FD"###
FD*
FD*M:::
FD/"""
FD.!!!
FD*
FD-   
FJ'''
FJ%%%
FE=!!!
FE=!!!
FE<   
FE;
FE;
FE?###
FE;
FE;
FE=!!!
FE?###
FE=!!!
FE=!!!
FE#$$$$$r)   zPyMuPDF z : Python bindings for the MuPDF z* library (rebased implementation).
Python z running on r  l        z-bit).
)r[   r   rp
  r  )r   r   r   r   r   N)r  r+   )r  r  r   )r(
  )r   r   r   r   r  Nr/  )r  r   r   )r   r   rX  r0  r  N(  rw  atexitr4  rW
  ra   r8   r  rc   rm  r  r  r	  rM
  rx  r0  rK
  r  r  rs  r[   r   importlib.utilr   rG   r|   r7   r  rV   rY   r   rL   rO   rM   rQ   rS   rW   rZ   r&   rq   ru   r  r0  r	  r=
  r~   r   r	  r  r   r  r   r  Callable__annotations__r   r   r   r   r  	machinerySourceFileLoaderload_moduler
  r
  r   rf   r:   r   reinit_singlethreadedr   _buildr   r   r   r   r   r   r   r   rG  r  pymupdf_dater   r5   rc  FZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHrV
  VersionFitzVersionBindVersionDater   format_grP
  r  r  r]  r  rQ
  r4   rR
  rm  r4  rO
  r3   rS
  Sequencer5  r   r3  r   r  r   r   r   r   r   r   r   r   r   r  r   r9  r  r  r  r  FzDocument_insert_pdfr  r   r9   r^
  r0  r  r
  rt  rj  r  r
  r8  r  rQ  r  r  r  r#  r  r  r  r  r   r  r.   _selfrG
  rA   r  _valuer2   r  
getmembersPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCEUCDN_EAST_ASIAN_HPDF_TX_FIELD_IS_MULTILINEUCDN_SCRIPT_ADLAMrT
  AnyTypeBase14_fontnamesr~
  r  r  rV  r  r5  r6  rS  r  r  r6  FZ_RECOMPRESS_NEVERFZ_RECOMPRESS_SAMEFZ_RECOMPRESS_LOSSLESSr  FZ_RECOMPRESS_J2Kr  r  FZ_SUBSAMPLE_BICUBIC	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFr	  r_  re  rd  r  rb  r  r  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr  r  STAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_DraftrA  rB  rC  rD  TEXT_FONT_SUPERSCRIPTr  r  r  r  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLFZ_STEXT_PRESERVE_LIGATURESr2	  FZ_STEXT_PRESERVE_WHITESPACEr3	  FZ_STEXT_PRESERVE_IMAGESr  FZ_STEXT_INHIBIT_SPACESTEXT_INHIBIT_SPACESFZ_STEXT_DEHYPHENATEr1	  FZ_STEXT_PRESERVE_SPANSTEXT_PRESERVE_SPANSFZ_STEXT_MEDIABOX_CLIPr4	  $FZ_STEXT_USE_CID_FOR_UNKNOWN_UNICODE TEXT_USE_CID_FOR_UNKNOWN_UNICODEFZ_STEXT_COLLECT_STRUCTURETEXT_COLLECT_STRUCTUREFZ_STEXT_ACCURATE_BBOXESTEXT_ACCURATE_BBOXESFZ_STEXT_COLLECT_VECTORSTEXT_COLLECT_VECTORSFZ_STEXT_IGNORE_ACTUALTEXTTEXT_IGNORE_ACTUALTEXTFZ_STEXT_SEGMENTTEXT_SEGMENTFZ_STEXT_PARAGRAPH_BREAKTEXT_PARAGRAPH_BREAKFZ_STEXT_TABLE_HUNTTEXT_TABLE_HUNTFZ_STEXT_COLLECT_STYLESTEXT_COLLECT_STYLES$FZ_STEXT_USE_GID_FOR_UNKNOWN_UNICODE TEXT_USE_GID_FOR_UNKNOWN_UNICODEr  TEXT_CLIP_RECTFZ_STEXT_ACCURATE_ASCENDERSTEXT_ACCURATE_ASCENDERSFZ_STEXT_ACCURATE_SIDE_BEARINGSTEXT_ACCURATE_SIDE_BEARINGSTEXT_STEXT_SEGMENTTEXT_CID_FOR_UNKNOWN_UNICODETEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICr<  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_SoftLightr`  r   r  r  r  r  r  r  r  dictkey_ascr  r  r  r  r  r  r  r  r  r  r  
dictkey_dara  r  dictkey_descr  dictkey_effectr  r  ri  r  r  r  dictkey_glyphr  r  r  r+  r  r  r	  r  r  r  r  r~  r  r  r  rh  rb  r  r  r  r  r  r
  r  r  r  r  r|
  r  r  r\  r{
  r  r  r	  rE  rD  r  r  r  rs  r  r  r  r  rX  r%  ra  rv  r  r  r&  r.  r@  r  rz  r  rN  r  r(  r  r  r  ra  r|  r  rB  r  r  r  r  r  ri  r:  rk  r  r<  r  r  re  r  r   r  r  r;
  r 	  r  r  r  r  r  r  r  r@  rA  r  r  r*  r  r   r  r  r  rD  rb  rH  ro  r
  r  r  r  re  r  rl  rO  r'  ra  r"  r  r  r  r  rJ  r  r  rK  r  r  r  r  r  r  r  r  r  r  r  r  r7  r9  r  r>  rA  r  r  r,
  r>  r  r3  r  r$  r  r_  r  rp  r  r  rf  rS  r(  r  r  r
  r  rU  rA  r  r  r?
  rE	  r  r  r  rj  r  r   r(  r  r@  rC  r  r%  rA  rN  r'  r  MSG_BAD_DOCUMENTMSG_BAD_FILETYPEMSG_BAD_LOCATIONr  r
  rZ  r\  r=  r	  r  r
  r  MSG_COLOR_COUNT_FAILEDrJ  r/  r  r  r  r
  r%  r  r  r]  r  r=  rn  ry  rB  r  r6  r&  re  rA  r@  r  rv  r  rF  r  r  r  r  r%  rc  r  r"  rU  r'  r1  r4  r8  r;  r@  rD  rH  rL  rN  rP  rS  rV  r[  rY  rt  rx  r  r  r  FzPathWalker2r  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rY  PdfFilterOptions2r  	FzDevice2r;  	FzOutput2rC  r  r  rr  r  r  r  r  r"  r$  r*  r'  ru  r  r  r8  r;  r  r
  rK  rT  r  r}  r  r  r  r  ru  r  r?  r0  r  rQ  rL  r%  r]  rK  r.  rv  r#  r  r  r  rV  r  r  r  r  r&  r  r  rz  r  r  r  r
  r  r  r  r
  rw  rx  ry  registerr{  r}  r   r  r  r
  r~  r  r  r  recover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadtabler  DeprecationWarningr  r  __version__rN
  r  maxsizer,   r)   r(   <module>r     s,            				  				   				  



                 s s s s sl 2:>>2C#D#DcjYYY \rz~~m<<cjQQQ
 tvv   ! ! !       >     <. . . ..2 2 2 2      S*\9CCFFBCC   $    #{$@!DD  l/66' ' ' ' ' ' ' ' 8::04V_V_- 4 4 4    " " ". jnnm,,CH	Y	Y[	Y	Y	YZZZCH	>	>BJ|$<	>	>???b)::  +-- 	 !'EE   wu-.. &##%%%E!!!   # " " " " " & & & & & & $ $ $ $ $ $ # # # # # # # # # # # # ) ) ) ) ) )             & & & & & &   eKK-2E2Ec2J2JKKKLL u5u7MuOeffff 	U/B  	U  	U%J`bgbxz  {Q  JR  	U  	U gff
 M4
0
 ! 2 2 2 2 2$ 0"JJ 0 0 0"Z/JJJ0 ?:&
/$
?5!	c4i	 		)		
		4 4 4$4 4 4 4.0 0 00 0 0 0*    	
W< W< W< W< W< W< W< W<t*c' c' c' c' c' c' c' c'Lb	 b	 b	 b	 b	 b	 b	 b	J       BO O O O O O O O.+ + + + + + + +Z  >"'"=xR xR xR xR xR xR xR xRte )& )& )& )& )& )& )& )&X|" |" |" |" |" |" |" |"~       t t t t t t t tno o o o o o o od: : : : :V : : :. >e, e, e, e, e, e, e, e,NQ Q Q Q Q Q Q Qh
      O O O O O O O Of ; ; ; ;|i: i: i: i: i: i: i: i:Xuq' q' q' q' q' q' q' q'h 
x x x x x x x xveX eX eX eX eX eX eX eXP` ` ` ` ` ` ` `F	[ [ [ [ [ [ [ [|hB hB hB hB hB hB hB hBVZ Z Z Z Z Z Z Zz
a a a a a a a aHt t t t t t t tt.K!E2"^1133 	2 	2ME6 899 2##$455 2 GE5&111	22 )*-).))* +), 0	)1
 3)4 +),$ "a'''' %(GGGGG 77777uf
* " 	 # #A!"OAGGII% - * 1 # + ( / ' & ( , " ( 
      / - 5 - + + 1 1 
 	

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

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