o
    ez                    @   s
  d dl mZ edk redesdev rddlmZ nd dlZzd dlZ	W n e
y2   d dl	Z	Y nw dd	 Zd
d Zdd Zdd ZG dd de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ejdZdZdZdZdZej Z!ej"e#df Z$ej%e& Z'ej%e( Z)ej%e* Z+ej%ej, Z-ej%ej. Z/zd dl0m1Z1 e12 Z3[1W n e
y   i Z3Y nw dZ4dZ5dZ6e5e4dfZ7ej8Z8ej9Z9ej:Z:ej;Z;ej<Z<ej=Z=ej>Z>ej?Z?ej@Z@ejAZAejBZBejCZCejDZDejEZEejFZFejGZGejHZHejIZIejJZJejKZKejLZLejMZMejNZNejOZOejPZPejQZQejRZRejSZSejTZTejUZUejVZVejWZWejXZXejYZYejZZZej[Z[ej\Z\ej]Z]ej^Z^ej_Z_ej`Z`ejaZaejbZbejcZcejdZdejeZeejfZfejgZgejhZhejiZiejjZjejkZkejlZlejmZmejnZnejoZoejpZpejqZqejrZrejsZsejtZtejuZuejvZvejwZwejxZxejyZyejzZzej{Z{ej|Z|ej}Z}ej~Z~ejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZej Z ejZejZejZejZejZejZejZejZej	Z	ej
Z
ejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZejZej Z ej!Z!ej"Z"ej#Z#ej$Z$ej%Z%ej&Z&ej'Z'ej(Z(ej)Z)ej*Z*ej+Z+ej,Z,ej-Z-ej.Z.ej/Z/ej0Z0ej1Z1ej2Z2ej3Z3ej4Z4ej5Z5ej6Z6ej7Z7ej8Z8ej9Z9ej:Z:ej;Z;ej<Z<ej=Z=ej>Z>ej?Z?ej@Z@ejAZAejBZBejCZCejDZDejEZEejFZFejGZGejHZHejIZIejJZJejKZKejLZLejMZMejNZNejOZOejPZPejQZQejRZRejSZSejTZTejUZUejVZVejWZWejXZXejYZYejZZZej[Z[ej\Z\dd Z]dd Z^d d! Z_d"d# Z`d$d% Zad&d' Zbd(d) Zcd*d+ Zdd,d- Zed.d/ Zfd0d1 Zgd2d3 Zhd4d5 Zid6d7 Zjd8d9 Zkd:d; Zld<Zmd=ZnG d>d? d?eoZpG d@dA dAepZqeq ZrG dBdC dCeoZsG dDdE dEeoZtG dFdG dGeoZuG dHdI dIeoZvdJdK ZwdLdM ZxdNdO ZydPdQ ZzdRdS Z{dTdU Z|G dVdW dWeoZ}d Z~dZdXZdYZdZZd[ZdZdXZdZZd\Zd]Zd^Zd_Zd ZdZdXZdYZd ZdZdXZdYZdZZdZdXZdZZd\Zd]Zd^Zd_ZeeB eB ZeeB eB ZeeB eB eB ZeZeeB eB eB ZeeB eB eB ZeeB eB eB ZeeB eB ZeeB eB Zd ZdZdXZd ZdZdXZdYZdZZd[Zd`ZdaZd\ZdbZdcZddZdeZdfZdgZi ZeD ]Zeee < [qdhedi< djedk< dledm< dnedo< dpedq< dreds< dtedu< dvedw< dxedy< dzed{< d|ed}< d~ed< ded< ded< ddddddddZG dd deZG dd deZG dd deZe]e d#de(de(de&de#de&f
ddZdZdZG dd deoZde(fddZde(de(fddZde(dej"eÐedf dede#de(f
ddZdd Zde(defddZde(detfddZdej fddZdej fddZde/fddZdej"eÐee&df de(de(fddZdej.defddZdej.defddZdej defddZdej defddZdej defddĄZdej defddƄZddde(defddʄZddde#defddτZdddej.fdd҄ZddԄ Zdededepfdd؄Zdej,de*fddۄZِd$de(de)fddZde(fddZېd%dedededefddZddde#fddZݐd&ddZde#defddZde#defddZd'dede#de#defddZd(ddZd dlZd dlZi Zi Zde#de(fdd Zde(de#fddZdefddZdefddZdefdd	ZG d
d deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZee G dd deoZe e G dd deoZee G dd deoZee G d d deoZee G d!d" d"eoZee dS ()      )version_info)      r   zPython 2.7 or later required.   )_fitzNc                 C   sB   z	d| j   }W n tjy   d}Y nw d| jj| jj|f S )Nz	proxy of  z<%s.%s; %s >)this__repr____builtin__	Exception	__class__
__module____name__)selfZstrthis r   9D:\Projects\ConvertPro\env\Lib\site-packages\fitz/fitz.py
_swig_repr   s   r   c                        fdd}|S )Nc                    sj   |dkr| j | d S |dkr | || d S t| |r/ttt| |tr/ | || d S td|  )Nthisownr	   z(You cannot add instance attributes to %s)r	   ownhasattr
isinstancegetattrtypepropertyAttributeErrorr   namevaluesetr   r   set_instance_attr#   s   zE_swig_setattr_nondynamic_instance_variable.<locals>.set_instance_attrr   )r!   r"   r   r    r   *_swig_setattr_nondynamic_instance_variable"   s   	r#   c                    r   )Nc                    s6   t | |rtt| |ts | || d S td|  )Nz%You cannot add class attributes to %s)r   r   r   r   r   )clsr   r   r    r   r   set_class_attr0   s   z?_swig_setattr_nondynamic_class_variable.<locals>.set_class_attrr   )r!   r%   r   r    r   '_swig_setattr_nondynamic_class_variable/   s   r&   c                    r   )zlClass decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclassc                    s    | j | j| j S N)r   	__bases____dict__copy)r$   	metaclassr   r   wrapper:      z$_swig_add_metaclass.<locals>.wrapperr   )r,   r-   r   r+   r   _swig_add_metaclass8   s   r/   c                   @   s   e Zd ZdZeejZdS )_SwigNonDynamicMetazKMeta class to enforce nondynamic attributes (no new attributes) for a classN)r   r   __qualname____doc__r&   r   __setattr__r   r   r   r   r0   ?   s    r0   TESSDATA_PREFIX
point_like	rect_likematrix_like	quad_like)fontdescriptorsz1.20.3z1.20.2z2022-08-13 00:00:01Z20220813000001c                 C   
   t | S r'   )r   _set_FileDataError)r   r   r   r   r;        
r;   c                 C      t | ||S r'   )r   util_sine_between)CPQr   r   r   r>        r>   c                 C      t | |S r'   )r   util_hor_matrix)r?   r@   r   r   r   rD        rD   c                 C   r:   r'   )r   util_make_rectar   r   r   rF     r<   rF   c                 C   r:   r'   )r   util_make_irectrG   r   r   r   rI     r<   rI   c                 C   r:   r'   )r   util_round_rectrectr   r   r   rJ     r<   rJ   c                 C   rC   r'   )r   util_transform_rect)rL   matrixr   r   r   rM     rE   rM   c                 C   rC   r'   )r   util_intersect_rectr1r2r   r   r   rO     rE   rO   c                 C   rC   r'   )r   util_is_point_in_rect)prr   r   r   rS     rE   rS   c                 C   rC   r'   )r   util_include_point_in_rect)rU   rT   r   r   r   rV     rE   rV   c                 C   rC   r'   )r   util_point_in_quad)r@   rA   r   r   r   rW     rE   rW   c                 C   rC   r'   )r   util_transform_point)pointrN   r   r   r   rX     rE   rX   c                 C   rC   r'   )r   util_union_rectrP   r   r   r   rZ     rE   rZ   c                 C   rC   r'   )r   util_concat_matrix)m1m2r   r   r   r[     rE   r[   c                 C   r:   r'   )r   util_invert_matrix)rN   r   r   r   r^     r<   r^   c                 C      t | |||S r'   )r   util_measure_string)textfontnamefontsizeencodingr   r   r   r`        r`   i   ic                   @   s   e Zd ZdZdd Zd1ddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZeZdd Zdd ZeZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. ZeZed/d0 ZdS )2MatrixzMatrix() - 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'c                 G   s  |sd | _  | _ | _ | _ | _| _d S t|dkr tdt|dkr9tt	|\| _ | _| _| _| _| _d S t|dkrt
|d drrt|d }tt|d}tt|d}| | _ | _|| _| | _d | _| _d S tt	|d \| _ | _| _| _| _| _d S t|dkst|d	kr|d dkrt	|d ddt	|d ddf\| _ | _| _| _| _| _d S t|d	kr|d dkrd
t	|d t	|d d
ddf\| _ | _| _| _| _| _d S td)N           Matrix: bad seq lenr   r   	__float__   r            ?zMatrix: bad args)rH   bcdeflen
ValueErrormapfloatr   mathradiansroundcossin)r   argsthetaro   sr   r   r   __init__  s>   $"&$
zMatrix.__init__Nc                 C   sN   |du r	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   )r^   rH   rn   ro   rp   rq   rr   )r   srcdstr   r   r   invert  s   
 zMatrix.invertc                 C   sP   t |}t |}|  j|| j || j  7  _|  j|| j || j  7  _| S )z5Calculate pre translation and replace current matrix.)rv   rq   rH   ro   rr   rn   rp   )r   Ztxtyr   r   r   pretranslate  s
   zMatrix.pretranslatec                 C   sL   t |}t |}|  j|9  _|  j|9  _|  j|9  _|  j|9  _| S )z1Calculate pre scaling and replace current matrix.rv   rH   rn   ro   rp   )r   sxZsyr   r   r   prescale  s   zMatrix.prescalec                 C   sn   t |}t |}| j| j}}|  j|| j 7  _|  j|| j 7  _|  j|| 7  _|  j|| 7  _| S )z2Calculate pre shearing and replace current matrix.r   )r   hvrH   rn   r   r   r   preshear  s   zMatrix.preshearc                 C   s  t |}|dk r|d7 }|dk s|dkr|d8 }|dkstd| tk r'	 | S td| tk rG| j}| j}| j| _| j| _| | _| | _| S td| tk re| j | _| j | _| j | _| j | _| S td| tk r| j}| j}| j | _| j | _|| _|| _| S t|}t	|}t
|}| j}| j}|| || j  | _|| || j  | _| | || j  | _| | || j  | _| S )z2Calculate pre rotation and replace current matrix.r   h  g     V@g     f@g     p@)rv   absEPSILONrH   rn   ro   rp   rw   rx   r{   rz   )r   r}   rH   rn   Zradr~   ro   r   r   r   	prerotate!  sL   #








zMatrix.prerotatec                 C   sR   t |t |  krdkstd tdt||\| _| _| _| _| _| _| S )z.Multiply two matrices and replace current one.rh   ri   )	rs   rt   r[   rH   rn   ro   rp   rq   rr   )r   onetwor   r   r   concatL  s   "zMatrix.concatc                 C   s    | j | j| j| j| j| jf| S r'   )rH   rn   ro   rp   rq   rr   r   ir   r   r   __getitem__S  s    zMatrix.__getitem__c                 C   s|   t |}|dkr|| _d S |dkr|| _d S |dkr|| _d S |dkr(|| _d S |dkr1|| _d S |dkr:|| _d S td)Nr   r   r   rl         index out of range)rv   rH   rn   ro   rp   rq   rr   
IndexErrorr   r   r   r   r   r   __setitem__V  s   zMatrix.__setitem__c                 C      dS )Nrh   r   r   r   r   r   __len__b     zMatrix.__len__c                 C      dt t|  S )Nrf   strtupler   r   r   r   r
   e  re   zMatrix.__repr__c                 C   s   t  }||  |S )zCalculate inverted matrix.)rf   r   )r   r\   r   r   r   
__invert__h  s   
zMatrix.__invert__c                 C   sV   t |dr t| j| | j| | j| | j| | j| | j| S tdd}|| |S )Nrj   r   )	r   rf   rH   rn   ro   rp   rq   rr   r   )r   mr\   r   r   r   __mul__o  s   

zMatrix.__mul__c                 C   s   t |dr,t| jd | | jd | | jd | | jd | | jd | | jd | S t|d }|s8t	dtdd}|
| |S Nrj   rm   r   zmatrix not invertible)r   rf   rH   rn   ro   rp   rq   rr   r^   ZeroDivisionErrorr   )r   r   r\   r]   r   r   r   __truediv__v  s   
&$
zMatrix.__truediv__c              	   C   s   t |dr t| j| | j| | j| | j| | j| | j| S t|dkr*t	dt| j|d  | j|d  | j|d  | j|d  | j|d  | j|d	  S 
Nrj   rh   ri   r   r   r   rl   r   r   
r   rf   rH   rn   ro   rp   rq   rr   rs   rt   r   r   r   r   r   __add__     
&$zMatrix.__add__c              	   C   s   t |dr t| j| | j| | j| | j| | j| | j| S t|dkr*t	dt| j|d  | j|d  | j|d  | j|d  | j|d  | j|d	  S r   r   r   r   r   r   __sub__  r   zMatrix.__sub__c                 C      t | S r'   )rf   r   r   r   r   __pos__     zMatrix.__pos__c                 C   s*   t | j | j | j | j | j | j S r'   )rf   rH   rn   ro   rp   rq   rr   r   r   r   r   __neg__  s   *zMatrix.__neg__c                 C   $   t | t|   kodk S    S Nr   maxminr   r   r   r   __bool__     $zMatrix.__bool__c                 C   r   r   r   r   r   r   r   __nonzero__  r   zMatrix.__nonzero__c                 C   *   t |dsdS t|dkot| | du S )Nr   Frh   r   rs   bool)r   matr   r   r   __eq__     
zMatrix.__eq__c                 C      t tdd | D S )Nc                 S      g | ]}|| qS r   r   .0ro   r   r   r   
<listcomp>      z"Matrix.__abs__.<locals>.<listcomp>rw   sqrtsumr   r   r   r   __abs__     zMatrix.__abs__c                 C   s8   t | jtk rt | jtk pt | jtk ot | jtk S )z,True if rectangles are mapped to rectangles.)r   rn   r   ro   rH   rp   r   r   r   r   is_rectilinear  s   zMatrix.is_rectilinearr'   )r   r   r1   r2   r   r   r   r   r   r   r   r   r   r   r
   r   __inv__r   r   __div__r   r   r   r   r   r   r   r   normr   r   r   r   r   r   rf     s:    
 
+			rf   c                   @   sP   e Zd ZdZdd Zdd Zdd ZeZeZeZ	eZ
eZeZdd	 Zd
d ZdS )IdentityMatrixz"Identity matrix [1, 0, 0, 1, 0, 0]c                 C   s   t | dd d S )Nrm   )rf   r   r   r   r   r   r        zIdentityMatrix.__init__c                 C   s:   |dv rd| j |< d S |dv rd| j |< d S || j |< d S )Nadrm   Zbcefrg   )r)   r   r   r   r   r3     s
   zIdentityMatrix.__setattr__c                  G      t d)NzIdentity is readonly)NotImplementedError)r|   r   r   r   	checkargs  r   zIdentityMatrix.checkargsc                 C   r   )Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r   r   r   r   r   r
     r   zIdentityMatrix.__repr__c                 C   s   t dS )N)r   r   r   r   r   r   )hashr   r   r   r   __hash__  r   zIdentityMatrix.__hash__N)r   r   r1   r2   r   r3   r   r   r   r   r   r   r   r
   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZdZdd Zdd Zedd Zedd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeZd d! Zd"d# Zd$d% Zd&d' ZeZd(d) Zd*S )+PointzYPoint() - all zeros
Point(x, y)
Point(Point) - new copy
Point(sequence) - from 'sequence'c                 G   s   |s
d| _ d| _d S t|dkrtdt|dkr*t|d | _ t|d | _d S t|dkrY|d }t|ddu r?tdt|dkrItdt|d | _ t|d | _d S td)	Nrg   r   Point: bad seq lenr   r   r   FzPoint: bad args)xyrs   rt   rv   r   r   r|   lr   r   r   r     s(   zPoint.__init__c                 C   s*   t |dkr
tdt| |\| _| _| S )z7Replace point by its transformation with matrix-like m.rh   ri   )rs   rt   rX   r   r   r   r   r   r   	transform  s   zPoint.transformc                 C   sJ   | j | j  | j| j  }|tk rtddS t|}t| j | | j| S )zUnit vector of the point.r   )r   r   r   r   rw   r   r   r~   r   r   r   unit  s
   

z
Point.unitc                 C   sR   | j | j  | j| j  }|tk rtddS t|}tt| j | t| j| S )z&Unit vector with positive coordinates.r   )r   r   r   r   rw   r   r   r   r   r   r   abs_unit  s
   

zPoint.abs_unitc                 G   s  t |dks
td|d }t |dkrt|}nt |dkr$t|}ntdt |dkr3|d }nd}dd	d
dd}|| d || d  }t|tu rVt| | | S t|j|j}||jB }| |v rhdS | j|j	kr| j
|jkr{| |j|S | j
|jkr| |j|S | j|j	 | S |j| j  kr|j	krn n| j
|jkr| j
|j | S |j| j
 | S | j
|jkr| |j|S | j
|jkr| |j|S |j| j | S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenr   r   z$arg1 must be point-like or rect-liker   px)rm   rm   )rm         R@)gRQ@r   )gffffff9@r   )r   incmmmrg   )rs   rt   r   Rectr   r   top_leftbottom_rightr   x1r   y1distance_toy0	top_rightx0bottom_left)r   r|   r   r   urr   rU   r   r   r   r     sH   



zPoint.distance_toc                 C   s   | j | jf| S r'   r   r   r   r   r   r   r   3  re   zPoint.__getitem__c                 C   r   )Nr   r   r   r   r   r   r   6  r   zPoint.__len__c                 C   s4   t |}|dkr|| _d S |dkr|| _d S td)Nr   r   r   )rv   r   r   r   r   r   r   r   r   9  s   zPoint.__setitem__c                 C   r   )Nr   r   r   r   r   r   r
   A  re   zPoint.__repr__c                 C   r   r'   r   r   r   r   r   r   D  r   zPoint.__pos__c                 C   s   t | j | j S r'   )r   r   r   r   r   r   r   r   G  r   zPoint.__neg__c                 C   r   r   r   r   r   r   r   r   J  r   zPoint.__bool__c                 C   r   r   r   r   r   r   r   r   M  r   zPoint.__nonzero__c                 C   r   )Nr   Fr   r   r   rT   r   r   r   r   P  r   zPoint.__eq__c                 C   s   t | j| j | j| j  S r'   )rw   r   r   r   r   r   r   r   r   U     zPoint.__abs__c                 C   sR   t |drt| j| | j| S t|dkrtdt| j|d  | j|d  S Nrj   r   r   r   r   r   r   r   r   rs   rt   r   r   r   r   r   Z  
   
zPoint.__add__c                 C   sR   t |drt| j| | j| S t|dkrtdt| j|d  | j|d  S r   r   r   r   r   r   r   a  r   zPoint.__sub__c                 C   s2   t |drt| j| | j| S t| }||S Nrj   )r   r   r   r   r   )r   r   rT   r   r   r   r   h  s   

zPoint.__mul__c                 C   sR   t |drt| jd | | jd | S t|d }|s tdt| }||S r   )r   r   r   r   r^   r   r   )r   r   r\   rT   r   r   r   r   n  s   

zPoint.__truediv__c                 C      t t| S r'   r   r   r   r   r   r   r   y  rE   zPoint.__hash__N)r   r   r1   r2   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s4    

2	r   c                   @   s  e Zd ZdZdd Zdd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Ze
ZeZeZeZedd Zdd Zdd Zdd ZeeZedd Zedd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Z d/d0 Z!d1d2 Z"d3d4 Z#d5d6 Z$d7d8 Z%d9d: Z&d;d< Z'd=d> Z(d?d@ Z)dAdB Z*dCdD Z+dEdF Z,e,Z-dGdH Z.dIdJ Z/dKdL Z0dMdN Z1dOdP Z2dQS )Rr   a
  Rect() - all zeros
    Rect(x0, y0, x1, y1) - 4 coordinates
    Rect(top-left, x1, y1) - point and 2 coordinates
    Rect(x0, y0, bottom-right) - 2 coordinates and point
    Rect(top-left, bottom-right) - 2 points
    Rect(sequ) - new from sequence or rect-like
    c                 G      t |\| _| _| _| _d S r'   )rF   r   r   r   r   r   r|   r   r   r   r        zRect.__init__c                 C   @   | j | jk r| j | j| _| _ | j| jk r| j| j| _| _| S z)Replace rectangle with its valid version.r   r   r   r   r   r   r   r   	normalize  
   zRect.normalizec                 C      | j | jkp| j| jkS z True if rectangle area is empty.r   r   r   r   r   r   r   r   is_empty     zRect.is_emptyc                 C      | j | jko| j| jkS zTrue if rectangle is valid.r  r   r   r   r   is_valid  r  zRect.is_validc                 C   8   | j | j  kotkn  o| j| j  kotkS   S )z'True if this is the infinite rectangle.r   r   FZ_MIN_INF_RECTr   r   FZ_MAX_INF_RECTr   r   r   r   is_infinite     8zRect.is_infinitec                 C      t | j| jS zTop-left corner.r   r   r   r   r   r   r   r        zRect.top_leftc                 C   r  zTop-right corner.r   r   r   r   r   r   r   r     r  zRect.top_rightc                 C   r  zBottom-left corner.r   r   r   r   r   r   r   r     r  zRect.bottom_leftc                 C   r  zBottom-right corner.r   r   r   r   r   r   r   r     r  zRect.bottom_rightc                 C      t | j| j| j| jS z!Return Quad version of rectangle.Quadtltrblbrr   r   r   r   quad     z	Rect.quadc                 C   r   t |}| js| js|js|jrtdtdddd| j | j t|j| j |j| j  tdddd|j|j S z+Return matrix that converts to target rect.z'rectangles must be finite and not emptyr   r   	r   r  r  rt   rf   r   r   widthheightr   rU   r   r   r   torect     zRect.torectc                 C      | j rt S | j||S zGMorph with matrix-like m and point-like p.

        Returns a new quad.r  INFINITE_QUADr$  morphr   rT   r   r   r   r   r2       z
Rect.morphc                 C   r   )zReturn the IRect.)IRectrJ   r   r   r   r   ry        z
Rect.roundc                 C      | j | jkr| j | j S dS r   r   r   r   r   r   r   <lambda>      zRect.<lambda>c                 C   r7  r   r   r   r   r   r   r   r9    r:  c                 C   s2   t |dkr
tdt| |\| _| _| _| _| S )zExtend to include point-like p.r   r   )rs   rt   rV   r   r   r   r   r   r   r   r   include_point     zRect.include_pointc                 C   s   t |dkr
tdt|}|js| jr$ttttf\| _| _| _| _	| S |j
r)| S | j
r@|j|j|j|j	f\| _| _| _| _	| S t| |\| _| _| _| _	| S )zExtend to include rect-like r.r   Rect: bad seq len)rs   rt   r   r  r  r  r   r   r   r   r  rZ   r+  r   r   r   include_rect  s   $zRect.include_rectc                 C   s   t |dks
tdt|}|jr| S | jr*|j|j|j|jf\| _| _| _| _| S |jrA|j|j|j|jf\| _| _| _| _| S | jrF| S t	| |\| _| _| _| _| S )z)Restrict to common rect with rect-like r.r   r>  )
rs   rt   r   r  r   r   r   r   r  rO   r+  r   r   r   	intersect  s   $$zRect.intersectc                 C   s
   |  |S )z.Check if containing point-like or rect-like x.)__contains__r   r   r   r   r   contains     
zRect.containsc                 C   s2   t |dks
tdt| |\| _| _| _| _| S )z1Replace with the transformation by matrix-like m.rh   ri   )rs   rt   rM   r   r   r   r   r   r   r   r   r     r=  zRect.transformc                 C      | j | j| j| jf| S r'   r   r   r   r   r   r   r   r   r     r   zRect.__getitem__c                 C   r   Nr   r   r   r   r   r   r     r   zRect.__len__c                 C   X   t |}|dkr|| _d S |dkr|| _d S |dkr|| _d S |dkr(|| _d S tdNr   r   r   rl   r   )rv   r   r   r   r   r   r   r   r   r   r        zRect.__setitem__c                 C   r   )Nr   r   r   r   r   r   r
     re   zRect.__repr__c                 C   r   r'   r   r   r   r   r   r     r   zRect.__pos__c                 C      t | j | j | j | j S r'   )r   r   r   r   r   r   r   r   r   r   "  r   zRect.__neg__c                 C   8   | j | j  ko| j  ko| j  kodk S    S r   rF  r   r   r   r   r   %     8zRect.__bool__c                 C   rM  r   rF  r   r   r   r   r   (  rN  zRect.__nonzero__c                 C   R   t |dsdS t|dko(| j|d ko(| j|d ko(| j|d ko(| j|d kS Nr   Fr   r   r   r   rl   r   rs   r   r   r   r   r+  r   r   r   r   +     
DzRect.__eq__c                 C      | j s| jsdS | j| j S Nrg   r  r  r)  r*  r   r   r   r   r   0     zRect.__abs__c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r   6  r   zRect.norm.<locals>.<listcomp>r   r   r   r   r   r   5  r   z	Rect.normc                 C   sz   t |drt| j| | j| | j| | j| S t|dkr"tdt| j|d  | j|d  | j|d  | j|d  S Nrj   r   r>  r   r   r   rl   r   r   r   r   r   r   rs   rt   r   r   r   r   r   8  
   
&6zRect.__add__c                 C   sz   t |drt| j| | j| | j| | j| S t|dkr"tdt| j|d  | j|d  | j|d  | j|d  S rW  rX  r   r   r   r   r   @  rY  zRect.__sub__c                 C   sF   t |drt| j| | j| | j| | j| S t| }||}|S r   )r   r   r   r   r   r   r   )r   r   rU   r   r   r   r   H  s
   
&
zRect.__mul__c                 C   sn   t |dr t| jd | | jd | | jd | | jd | S t|d }|s,tdt| }||}|S Nrj   rm   r   zMatrix not invertible)	r   r   r   r   r   r   r^   r   r   )r   r   imrU   r   r   r   r   O  s   
6
zRect.__truediv__c                 C   s   t |dr|t| v S t|}|dkrt|| S |dkrYt }zt|}W n	   t|j}Y | j|j  koA|j	  koA| j	kn  oX| j
|j
  koV|j  koV| jkS   S dS )Nrj   r   r   F)r   r   rs   rS   INFINITE_RECTr   r  rL   r   r   r   r   )r   r   r   rU   r   r   r   rA  [  s"   

*"zRect.__contains__c                 C   sN   t |ds	tdt| }t|dkr||S t|dkr#||S td)Nr   bad type op 2r   r   )r   rt   r   rs   r<  r?  r   r   rU   r   r   r   __or__l  s   


zRect.__or__c                 C   s0   t |drt|dkrtdt| }||S )Nr   r   r]  )r   rs   rt   r   r@  r^  r   r   r   __and__w  s   
zRect.__and__c                 C   s@   t |}| js| js|js|jrdS t | }||jrdS dS )z4Check if intersection with rectangle x is not empty.FT)r   r  r  r@  )r   r   rQ   rU   r   r   r   
intersects}  s   zRect.intersectsc                 C   r   r'   r   r   r   r   r   r     rE   zRect.__hash__N)3r   r   r1   r2   r   r  r   r  r  r  r   r   r   r   r   r!  r"  r#  r$  r,  r2  ry   irectr)  r*  r<  r?  r@  rC  r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   rA  r_  r`  ra  r   r   r   r   r   r   |  sp    










r   c                   @   s  e Zd ZdZdd Zdd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Ze
ZeZeZeZedd Zdd Zdd Zedd Zedd Zedd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCdD Z*e*Z+dEdF Z,dGdH Z-dIdJ Z.dKdL Z/dMdN Z0dOS )Pr5  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                 G   r   r'   )rI   r   r   r   r   r   r   r   r   r     r   zIRect.__init__c                 C   r   r   r  r   r   r   r   r    r  zIRect.normalizec                 C   r  r  r  r   r   r   r   r    r  zIRect.is_emptyc                 C   r	  r
  r  r   r   r   r   r    r  zIRect.is_validc                 C   r  )zTrue if rectangle is infinite.r  r   r   r   r   r    r  zIRect.is_infinitec                 C   r  r  r  r   r   r   r   r     r  zIRect.top_leftc                 C   r  r  r  r   r   r   r   r     r  zIRect.top_rightc                 C   r  r  r  r   r   r   r   r     r  zIRect.bottom_leftc                 C   r  r  r  r   r   r   r   r     r  zIRect.bottom_rightc                 C   r  r  r  r   r   r   r   r$    r%  z
IRect.quadc                 C   r&  r'  r(  r+  r   r   r   r,    r-  zIRect.torectc                 C   r.  r/  r0  r3  r   r   r   r2    r4  zIRect.morphc                 C   r   r'   rK  r   r   r   r   rL        z
IRect.rectc                 C   r7  r   r8  r   r   r   r   r9    r:  zIRect.<lambda>c                 C   r7  r   r;  r   r   r   r   r9    r:  c                 C      | j |}|jS )z$Extend rectangle to include point p.)rL   r<  rb  )r   rT   rL   r   r   r   r<       zIRect.include_pointc                 C   rd  )z(Extend rectangle to include rectangle r.)rL   r?  rb  r   rU   rL   r   r   r   r?    re  zIRect.include_rectc                 C   rd  )z4Restrict rectangle to intersection with rectangle r.)rL   r@  rb  rf  r   r   r   r@    re  zIRect.intersectc                 C   rE  r'   rF  r   r   r   r   r     r   zIRect.__getitem__c                 C   r   rG  r   r   r   r   r   r     r   zIRect.__len__c                 C   rH  rI  )intr   r   r   r   r   r   r   r   r   r     rJ  zIRect.__setitem__c                 C   r   )Nr5  r   r   r   r   r   r
     re   zIRect.__repr__c                 C   r   r'   )r5  r   r   r   r   r   	  r   zIRect.__pos__c                 C   rL  r'   )r5  r   r   r   r   r   r   r   r   r     r   zIRect.__neg__c                 C   rM  r   rF  r   r   r   r   r     rN  zIRect.__bool__c                 C   rM  r   rF  r   r   r   r   r     rN  zIRect.__nonzero__c                 C   rO  rP  rQ  r+  r   r   r   r     rR  zIRect.__eq__c                 C   rS  r   rU  r   r   r   r   r     rV  zIRect.__abs__c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r      r   zIRect.norm.<locals>.<listcomp>r   r   r   r   r   r     r   z
IRect.normc                 C      t | | S r'   )r   r   ry   r   r   r   r   r   "  re   zIRect.__add__c                 C   rh  r'   )r   r   ry   r   r   r   r   r   %  re   zIRect.__sub__c                 C   rh  r'   )r   r   ry   r   r   r   r   r   (  re   zIRect.transformc                 C   rh  r'   )r   r   ry   r   r   r   r   r   +  re   zIRect.__mul__c                 C   rh  r'   )r   r   ry   r   r   r   r   r   .  re   zIRect.__truediv__c                 C   rC   r'   )r   rA  rB  r   r   r   rA  4  rE   zIRect.__contains__c                 C   rh  r'   )r   r_  ry   rB  r   r   r   r_  8  re   zIRect.__or__c                 C   rh  r'   )r   r`  ry   rB  r   r   r   r`  ;  re   zIRect.__and__c                 C   rC   r'   )r   ra  rB  r   r   r   ra  >  rE   zIRect.intersectsc                 C   r   r'   r   r   r   r   r   r   A  rE   zIRect.__hash__N)1r   r   r1   r2   r   r  r   r  r  r  r   r   r   r   r   r!  r"  r#  r$  r,  r2  rL   r)  r*  r<  r?  r@  r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rA  r_  r`  ra  r   r   r   r   r   r5    sn    









r5  c                   @   s  e Zd ZdZdd ZedefddZedefddZed	d
 Z	edd
 Z
edd Zedd Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZeZd4d5 Z d6S )7r  zdQuad() - all zero points
Quad(ul, ur, ll, lr)
Quad(quad) - new copy
Quad(sequence) - from 'sequence'c                 G   s   |st   | _ | _ | _| _d S t|dkrtdt|dkr0tt |\| _| _| _| _d S t|dkr^|d }t|ddu rEtdt|dkrOtdtt |\| _| _| _| _d S td)Nr   Quad: bad seq lenr   r   r   FzQuad: bad args)	r   ulurlllrrs   rt   ru   r   r   r   r   r   r   G  s"   zQuad.__init__returnc                 C   sv   t | j| j| j}t|d tkrdS t | j| j| j}t|d tkr&dS t | j| j| j}t|d tkr9d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)r>   rj  rk  rm  r   r   rl  )r   Zsiner   r   r   is_rectangular[  s   zQuad.is_rectangularc                 C   sp   t | j| j}| j| }| j| }|j|j dkrdS t | j| j}| j| }| j| }|j|j dkr6d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_linerj  rm  rl  rk  r   )r   r   p1p2r   r   r   	is_convexu  s   




zQuad.is_convexc                 C   "   t t| j| j t| j| j S r'   )r   r   rj  rk  rl  rm  r   r   r   r   r9       " zQuad.<lambda>c                 C   rt  r'   )r   r   rj  rl  rk  rm  r   r   r   r   r9    ru  c                 C   s   | 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)  r   r*  r   r   r   r   r    s   zQuad.is_emptyc                 C      | j jS )z(Check whether this is the infinite quad.)rL   r  r   r   r   r   r    s   zQuad.is_infinitec                 C   s   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   rj  r   rk  rm  rl  r   r   r   r   r   r   r+  r   r   r   rL     s       z	Quad.rectc                 C   s   z|  }W n   Y dS |dkrt|| S |dkrdS t|r9t|jr'dS t|d d | o8t|dd  | S t|rPtdD ]}t|| | sM dS qAdS dS )NFr   r   T)r   rW   	CheckRectr   r  	CheckQuadrange)r   r   r   r   r   r   r   rA    s&   

$zQuad.__contains__c                 C   rE  r'   )rj  rk  rl  rm  r   r   r   r   r     r   zQuad.__getitem__c                 C   r   rG  r   r   r   r   r   r     r   zQuad.__len__c                 C   s`   |dkrt || _d S |dkrt || _d S |dkr!t || _d S |dkr,t || _d S tdrI  )r   rj  rk  rl  rm  r   r   r   r   r   r     s   zQuad.__setitem__c                 C   r   )Nr  r   r   r   r   r   r
     re   zQuad.__repr__c                 C   r   r'   )r  r   r   r   r   r     r   zQuad.__pos__c                 C   rL  r'   )r  rj  rk  rl  rm  r   r   r   r   r     r   zQuad.__neg__c                 C      | j  S r'   r  r   r   r   r   r     r   zQuad.__bool__c                 C   rz  r'   r{  r   r   r   r   r     r   zQuad.__nonzero__c                 C   rO  rP  )r   rs   rj  rk  rl  rm  )r   r$  r   r   r   r     s   
zQuad.__eq__c                 C   s*   | j rdS t| j| j t| j| j  S rT  )r  r   rj  rk  rl  r   r   r   r   r     s    zQuad.__abs__c                 C   s8   | j rt S tdd|j|j}| |  | | }|S )zSMorph the quad with matrix-like 'm' and point-like 'p'.

        Return a new quad.r   )r  r1  rf   r   r   r   )r   rT   r   deltaqr   r   r   r2    s
   z
Quad.morphc                 C   s\   t |drn
t|dkrtd|  j|9  _|  j|9  _|  j|9  _|  j|9  _| S )z1Replace quad by its transformation with matrix m.rj   rh   ri   )r   rs   rt   rj  rk  rl  rm  r   r   r   r   r     s   
zQuad.transformc                 C   s   t | }||}|S r'   )r  r   )r   r   r}  r   r   r   r      s   
zQuad.__mul__c                 C   sz   t |drt| j| | j| | j| | j| S ttdkr"tdt| j|d  | j|d  | j|d  | j|d  S Nrj   r   ri  r   r   r   rl   	r   r  rj  rk  rl  rm  rs   rT   rt   r   r}  r   r   r   r     rY  zQuad.__add__c                 C   sz   t |drt| j| | j| | j| | j| S ttdkr"tdt| j|d  | j|d  | j|d  | j|d  S r~  r  r  r   r   r   r     rY  zQuad.__sub__c                 C   sB   t |dr
d| }nt|d }|stdt| }||}|S rZ  )r   r^   r   r  r   )r   r   r[  r}  r   r   r   r     s   


zQuad.__truediv__c                 C   r   r'   r   r   r   r   r   r   #  rE   zQuad.__hash__N)!r   r   r1   r2   r   r   r   ro  rs  r)  r*  r  r  rL   rA  r   r   r   r
   r   r   r   r   r   r   r2  r   r   r   r   r   r   r   r   r   r   r   r  E  sD    


		
r  c                   C      t ttttS r'   )r   r  r  r   r   r   r   
EMPTY_RECT(  rB   r  c                   C   r  r'   )r   r  r  r   r   r   r   r\  ,  rB   r\  c                   C   r  r'   )r5  r  r  r   r   r   r   EMPTY_IRECT0  rB   r  c                   C   r  r'   )r5  r  r  r   r   r   r   INFINITE_IRECT4  rB   r  c                   C      t  jS r'   )r\  r$  r   r   r   r   r1  8  r   r1  c                   C   r  r'   )r  r$  r   r   r   r   
EMPTY_QUAD<  r   r  c                   @   sh   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zedd ZdS )Widgetc                 C   s   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 )NSr   r   r   r   Helvr   )border_colorborder_styleborder_widthZborder_dashesZchoice_values
field_namefield_labelZfield_valueZfield_flagsZfield_display
field_typefield_type_string
fill_colorZbutton_caption	is_signed
text_color	text_fonttext_fontsizeZtext_maxlentext_format_text_dascriptscript_strokescript_formatscript_changescript_calcrL   xrefr   r   r   r   r   F  s8   
zWidget.__init__c                 C   sl  | 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
s6d| _
| js<d| _| j dd | _| jtttfv }| jsUd| _nt| jtur`td|se| jsid| _nt| jturttd	|sy| js}d| _nt| jturtd
|s| jsd| _nt| jturtd|s| jsd| _nt| jturtd|   dS )z$Validate the class entries.
        zbad rectzfield name missingZUnnamedNr  r   r   zscript content must be stringz"script_calc content must be stringz$script_change content must be stringz$script_format content must be stringz$script_stroke content must be string)rL   r  r  rt   r  r  
CheckColorr  r  r  r  r  r  upperr  PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXPDF_WIDGET_TYPE_RADIOBUTTONr  r   r   r  r  r  r  _checker)r   Zbtn_typer   r   r   	_validatei  sX   







zWidget._validatec                 C   sT   | j sd| _ dS | jj}|jg d D ]}| j  | kr$|| _  dS qd| _ dS )zEnsure text_font is correctly spelled if empty or from our list.

        Otherwise assume the font is in an existing field.
        r  N)ZCourZTiRor  ZZaDb)r  parent	FormFontslowerr   docrr   r   r   r   _adjust_font  s   zWidget._adjust_fontc                 C   s  | j sdS d}d}d}| j  }t|D ]k\}}|dkr?||d  dd }t||d  }d ||<  ||d < ||d < q|d	krWt||d  g}d ||< ||d < q|d
krdd ||d | D }d ||<  ||d <  ||d < ||d < qq|| _|| _|| _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                 S      g | ]}t |qS r   rv   r   rr   r   r   r   r     r   z$Widget._parse_da.<locals>.<listcomp>rl   )r  split	enumeraterv   r  r  r  )r   fontfsizecoldatr   itemr   r   r   	_parse_da  s4   
 ,zWidget._parse_dac                 C   s   | j tddvrtddS )z Any widget type checks.
        r      zbad field typeN)r  ry  rt   r   r   r   r   r    s   zWidget._checkerc                 C   s   | j j }|   |   d| _t| jdkrd| j }nt| jdkr)d| j }nt| jdkr5d| j }|j| j| j| jd| _t	
| j|  d| _d	S )
z*Reflect Python object in the PDF.
        r   rl   !{:g} {:g} {:g} rg /{f:s} {s:g} Tfr   {:g} g /{f:s} {s:g} Tfr   %{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tfrr   r~   N)r  r  r  r  rs   r  formatr  r  TOOLS_save_widget_annot)r   r  fmtr   r   r   update  s   


zWidget.updatec                 C   s   | j dvrdS | jj}| j}ddd}||d}|d dkrDg }|d dd	 }|d
dd }|D ]}|| d  q4||d< ||d}|d dkrug }	|d dd	 }|d
dd }
|
D ]}|	| d  qe|	|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   rl   r   N)normaldownzAP/Nr   dictr   r   /r  zAP/Dr  )r  r  r  xref_get_keyr  append)r   r  r  ZstatesZAPNZnstatesZapntr   ZAPDZdstatesZapdtr   r   r   button_states  s,   

zWidget.button_statesc                 C   s   t | j dS )z.Reset the field value to its default.
        N)r  _reset_widgetr  r   r   r   r   reset     zWidget.resetc                 C   s   d| j t| jf S )Nz'%s' widget on %s)r  r   r  r   r   r   r   r
        zWidget.__repr__c                 C   s    t | d}|r| j  d S d S )Nr  )r   r  __del__r   annotr   r   r   r    s   
zWidget.__del__c                 C   rv  r'   )r  nextr   r   r   r   r  #  rc  zWidget.nextN)r   r   r1   r   r  r  r  r  r  r  r  r
   r  r   r  r   r   r   r   r  E  s    #> r  r   rl   r   r   r         @   rh   r   	   
      rk      )CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicSymbolZapfDingbatsr  helvr  Zheitr  Zhebor  Zhebir  Zcourr  Zcoitr  Zcobor  Zcobir  Ztiror  Ztibor  Ztiitr  Ztibir  Zsymbr  ZzadbzI<</A<</S/GoTo/D[%i 0 R/XYZ %g %g %g]>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>z6<</A<</S/GoTo/D%s>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>zh<</A<</S/GoToR/D[%i /XYZ %g %g %g]/F<</F(%s)/UF(%s)/Type/Filespec>>>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>z=<</A<</S/GoToR/D%s/F(%s)>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>zU<</A<</S/Launch/F<</F(%s)/UF(%s)/Type/Filespec>>>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>z9<</A<</S/URI/URI(%s)>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>zD<</A<</S/Named/N/%s/Type/Action>>/Rect[%s]/BS<</W 0>>/Subtype/Link>>)Zgoto1Zgoto2Zgotor1Zgotor2Zlaunchurinamedc                   @      e Zd ZdZdS )FileDataErrorz0Raised for documents with file structure issues.Nr   r   r1   r2   r   r   r   r   r        r  c                   @   r  )FileNotFoundErrorzRaised if file does not exist.Nr  r   r   r   r   r    r  r  c                   @   r  )EmptyFileErrorz5Raised when creating documents from zero-length data.Nr  r   r   r   r   r    r  r  ra   rb   rc   rd   rn  c                    s   |  }t|d}d |dkrt |dkrt  dur+t fdd| D }|| S |t v r:t| t| ||S |dv rDt| | S t	d| )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                    s4   g | ]}t |d k r t | d n d d qS )   r      ordr   glyphsr   r   r     s   4 z#get_text_length.<locals>.<listcomp>)china-tchina-schina-tschina-ssjapanjapan-skoreakorea-szFont '%s' is unsupported)
r  Base14_fontdictgetsymbol_glyphszapf_glyphsr   keysr`   rs   rt   )ra   rb   rc   rd   basenamewr   r  r   get_text_length  s"   

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  n?)!   ^I+?)"   gn?)#   r  )$   g\(\?)%   g5^I?)&   sh|??)'   HzG?)(   Zd;O?))   Gz?)*   gQ?)+   g?5^I?),    rh?)-   g\(\?).   x&?)/   gB`"?)0   r   )1   g=
ףp=?)2   r  )3   g)\(?)4   gOn?)5   Mb?)6   '1Z?)7   gʡE?)8   gDl?)9   "~j?):   RQ?);   }?5^I?)<   gT㥛 ?)=   V-?)>   gDl?)?   gv/?)r  gX9v?)A   g/$?)B   x&?)C   r
  )D   r
  )E   r  )F   gK7A`?)G   g rh?)H   &1?)I   tV?)J   r  )K   gx?)L   rC  )M   -?)N   rA  )O   d;O?)P   gK7?)Q   g+?)R   gA`"?)S   g+?)T   r  )U   MbX?)V   g=
ףp=?)W   E?)X   ~jt?)Y   rR  )Z   r2  )[   9v?)\   g-?)]   gm?)^   g;On?)_   g;On?)`   gGz?)a   r  )b   r  )c   r[  )d   gCl?)e   ʡE?)f   g?5^I?)g   r:  )h   gv/?)i   7A`?)j   r  )k   gQ?)l   r  )m   V-?)n   r*  )o   r(  )p   r(  )q   r2  )r   r2  )s   %C?)t   rw  )u   r
  )v   gJ+?)w   gx&1?)x   gDl?)y   g|?5^?)z   g(\?){   J+?)|   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	  )   gCl?)    rh?)   r  )   gQ?)   MbX?)   r0  )   r0  )   rU  )   g
ףp=
?)   gh|?5?)   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
  )   gS㥛?)   g7A`?)   gK7A?)   gZd;O?)   V-?)    rh?)   r  )   gK7A`?)   Dl?)   V-?)   r  )   g㥛 ?)   rp  )   g"~?)   r  )   r  )   gMbX?)   g(\?)   gn?)   goʡ?)   gK7A?)   獗n?)   r  )   X9v?)   r  )   rf  )   rf  )   +?r	  )   r  )   r0  )   gʡE?)   y&1?)   gGz?)   r  )   "~j?)   gl?)   r  )   rK  )   rp  )   r  )   g
ףp=
?r	  r	  (   r  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?)r  rk  )r        ?)r  r  )r  rH  )r  gL7A`?)r  jt?)r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )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  )r3  r  )r4  r  )r6  r  )r7  g"~j?)r  r  )r8  v?)r9  r  )r;  r  )r<  g/$?)r=  Zd;O?)r>  r.  )r?  粝K?)r@  r  )rB  r  )rD  x&1?)rE  r  )rF  ʡE?)rG  g r?)rI  r  )rJ  r  )rL  rW  )rM  gʡE?)rN  gn?)rO  gl?)rP  r  )rQ  r  )rS  r  )rT  rW  )rV  gp=
ף?)rX  q=
ףp?)rY  r  )rZ  r  )r\  gV-?)r]  r  )r^  uV?)r_  r  )r`  r  )ra  r  )rb  r  )rc  r  )rd  r5  )re  r  )rg  y&1?)rh  M?)ri  r  )rj  uV?)rl  r  )rm  r  )rn  r  )ro  ;On?)rq  r  )rr  r  )rs  r  )rt  r  )ru  r  )rv  r  )rx  r  )ry  r  )rz  rk  )r{  r  )r|  gZd;O?)r}  r  )r~  r5  )r  Q?)r  g?)r  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  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=
?)r  gV-?)r  r  )r  gK7A`?)r  rk  )r  r  )r  jt?)r  r  )r  r  )r  r  )r  y&1?)r  rk  )r  r  )r  /$?)r  r  )r  g?)r  r  )r  r  )r  r  )r  r  )r  r  )r  r5  r  )r  r  )r  r  )r  r  )r  r  )r  r   )r  r  )r  r   )r  r  )r  rC  )r  r  )r  r  )r  r  )r  rW  )r  rW  )r  rC  )r  rW  )r  rW  )r  rk  )r  rk  )r  rk  )r  rk  )r  rk  )r  rk  )r  rk  )r  rW  )r  rk  )r  r  )r  r  )r  g{Gz?)r  rC  )r  r  )r  r  )r  rk  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r5  )r  r  )r  r  )r  r  )r  r:  )r  rk  )r  ~jt?)r  r   )r  r   )r  r   )r  r   )r  r   )r  r5  )r  r5  )r  r5  )r  r5  r  )r  r  )r  gK7?)r  r  )r  r  )r  r  )r  r   )r  r  )r  r   )r  r   )r  r   )r  r   )r  r5  )r  r5  )   r5  r  c                   @   s   e Zd ZdZdd ZdS )linkDestz#link or outline destination detailsc                 C   sH  |j }| }d| _d| _d| _d| _d| _t| _tdd| _	d| _
d| _|j| _tdd| _|j| _|rJ| jdsJd|d d |d |d f | _|j rSd| _t| _| js\d| _t| _|r| jr| jdrd| _
t| _td	| j}|rt|dd | _tt|d
t|d| _	| jtB tB | _n'td| j}|rt|dd | _nt| _| jdd  | _
nt| _| j| _
|j r"| jdrd| _t| _d S | jdr| jdd  | _d| _d| _t| _| jd}t|dkr|d drt| _|d | _t|d dd  d | _d S d S d S d| _t| _d S d S )Nr   r   F#z#page=%i&zoom=0,%g,%gr   r   z3^#page=([0-9]+)&zoom=([0-9.]+),([0-9.]+),([0-9.]+)$rl   r   z^#page=([0-9]+)$)zhttp://zhttps://zmailto:zftp://Tzfile://r   zpage=r   )is_externaldestZfileSpecflagsZisMapZisUri	LINK_NONEkindr   ltr  Z	newWindowpagerbr  
startswithLINK_URI	LINK_GOTOrematchrg  grouprv   LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDLINK_LAUNCHr  rs   
LINK_GOTOR)r   objZrlinkZisExtZisIntr   Zftabr   r   r   r   
  st    
 


zlinkDest.__init__N)r   r   r1   r2   r   r   r   r   r   r  
  s    r  c                  C   s   dd l } dtt| jd ddtt| jd d ddf }| d|  }| jdkr7|d| 7 }|S | jdk rD|d	| 7 }|S 	 |S )
Nr   z%s'%s'i  r   0r3  zD:%Y%m%d%H%M%S-+)timer   r   altzonerjuststrftime	localtime)r  tzZtstampr   r   r   get_pdf_nowY
  s   

r"  r~   c                 C   s   t | sdS dd }d}| D ]a}t|}|dkr||   S |dkr3|dk r3|dv r.|d	7 }||7 }q|dkr>|d
| 7 }q|dkrG|d7 }q|dkrP|d7 }q|dkrY|d7 }q|dkrb|d7 }q|dkrk|d7 }q|d7 }qd| d 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                 S   s&   t ddgt | d }d|  d S )Nr     zUTF-16BE<>)	bytearrayhex)r~   rU   r   r   r   make_utf16bew
  s   z!get_pdf_str.<locals>.make_utf16ber   r#        )()\r-  z\%03or  z\br  z\tr  z\nrk   z\fr  z\rz\267r+  r,  )r   r  )r~   r(  rU   ro   ocr   r   r   get_pdf_strj
  s8   






r/  r  simpleorderingc                    s   |  dr| dr| S t| sdS |r5 du r#ddd | D }nd fdd| D }d| d S |d	k rFd fd
d| D }n
ddd | D }d| d 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                 S   s(   g | ]}t |d k rdt | ndqS )r  %02xb7r  r   r   r   r   r   
  s   ( zgetTJstr.<locals>.<listcomp>c                    s0   g | ]}t |d k rd t | d  ndqS )r  r2  r   r3  r  r   r  r   r   r   
  s   0 r   c                    s    g | ]}d  t | d  qS )%04xr   r  r   r  r   r   r   
       c                 S   s   g | ]}d t | qS )r4  r  r   r   r   r   r   
      )r  endswithr   join)ra   r  r0  r1  Zotxtr   r  r   getTJstr
  s   r9  c                   C   s   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
    Za0)P	  i*  Za1)  r:  Za10)rD  rj  Za2)  r;  a3)J  r<  Za4)S  r>  Za5)  r?  Za6)*  r@  Za7)r  rA  Za8)   r  Za9)rj  rB  Zb0)  i  b1)  rC  Zb10)rV  r  b2)  rE  Zb3)  rG  Zb4)  rH  Zb5)  rI  Zb6)b  rJ  r3  )r  rK  Zb8)r  r  Zb9)r  r  Zc0)'
  i]  c1)-  rL  Zc10)rJ  rt  c2)  rN  c3)  rP  Zc4)  rR  Zc5)  rS  Zc6)C  rT  Zc7)r  rU  Zc8)r  r  Zc9)rt  r  zcard-4x6)i   i  )r   i  )i)  i  )i
  i  )i  d  )  i  )rV  i  )rV  i  )rV  rW  )i  i  )i`  i  )
zcard-5x7Z
commercialZ	executiveZinvoiceledgerZlegalzlegal-13letterZmonarchztabloid-extrar   r   r   r   r   paper_sizes
  s   		
 !"#rZ  c                 C   sf   |   }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.
    rT   z-lr   Nr  z-p)r  r  r   r   )r  r7  rZ  r  )r~   sizerr   rcr   r   r   
paper_size
  s   

r]  c                 C   s   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.
    rg   )r]  r   )r~   r)  r*  r   r   r   
paper_rect  s   r^  oc                 C   s   t | dd d krtdd S )Nr  orphaned object: parent is None)r   rt   r_  r   r   r   CheckParent  s   rb  c                 C   s   t | dds
tdd S )Nr   Fzobject destroyed)r   RuntimeErrorra  r   r   r   EnsureOwnership  s   rd  ro   c                 C   sH   | r t | ttfvst| dvst| dk st| dkr"tdd S d S )N)r   rl   r   r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   listr   rs   r   r   rt   )ro   r   r   r   r  "  s   r  rr   c                 C   s   | sdS t | dr| f} t|  t| dkr(d| d  }|dkr$|d S |d S t| d	kr@d
t|  }|dkr<|d S |d S dt|  }|dkrN|d S |d S )Nr   rj   r   z%g r   ro   zG zg rl   z	%g %g %g zRG zrg z%g %g %g %g zK zk )r   r  rs   r   )ro   rr   r~   r   r   r   	ColorCode-  s   
rf  c                 C      t tdd | S )Nc                 S      t | dkrt| dS dS )Ng-C6?r   r   r   ry   r   r   r   r   r9  @      zJM_TUPLE.<locals>.<lambda>r   ru   ra  r   r   r   JM_TUPLE?  r   rm  c                 C   rg  )Nc                 S   rh  )NMbP?rl   r   ri  rj  r   r   r   r9  D  rk  zJM_TUPLE3.<locals>.<lambda>rl  ra  r   r   r   	JM_TUPLE3C  r   ro  rU   c                 C   s(   zt | } W n   Y dS | jp| j S )zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    F)r   r  r  )rU   r   r   r   rw  G  s
   rw  r}  c                 C   s   zt | }W |jS    Y dS )zjCheck whether an object is convex, not empty quad-like.

    It must be a sequence of 4 number pairs.
    F)r  rs  )r}  q0r   r   r   rx  S  s
   
rx  quadsc                 C   sL   t | rt| }|jfS t| r| fS | D ]}t |s#t|s#tdq| S )Nzbad quads entry)rw  r   r$  rx  rt   )rq  rU   r}  r   r   r   CheckMarkerArg_  s   rr  c                 C   s   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	   krAdksFtd
 td
dS )NFr   z$morph must be a sequence of length 2r   r   rh   zinvalid morph parm 0r   r   zinvalid morph parm 1T)r   r   re  r   rs   rt   ra  r   r   r   
CheckMorphk  s    "rs  r  struct Page *c                 C   sB   |   D ]}|d |kr|  S |d  | kr|  S qdS )zGReturn an entry in the page's font list if reference name matches.
    r   rl   N)	get_fontsr  )r  rb   rr   r   r   r   	CheckFontw  s   rv  r  zstruct Document *r  c                 C   s$   | j D ]}||d kr|  S qdS )z3Return a font info if present in the document.
    r   N)	FontInfos)r  r  rr   r   r   r   CheckFontInfo  s
   
rx  infoc                 C   sV   |d }d}t | jD ]\}}|d |krd} nq|r#|| j|< d S | j| d S )Nr   FT)r  rw  r  )r  ry  r  foundr   fir   r   r   UpdateFontInfo  s   r|  c                  O   s   d S r'   r   )r|   kwr   r   r   DUMMY  r   r~  rq  rr  c                 C   s   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   rf   rD   )rq  rr  r   r   r   rp    s   rp  imgc                 C   sT   t | tju r|  }nt| 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.
    readzbad argument 'img')r   ioBytesIOgetvaluer   r  bytesr&  rt   r  image_profile)r  streamr   r   r   r    s   




r  unknownr   filenamec           	      C   sl   |   }d}d| }d}d}d| }|dkr|}|S |dkr"|}|S |dkr*|}|S |d	kr2|}|S |}|S )
Nz<!DOCTYPE html>
<html>
<head>
<style>
body{background-color:gray}
div{position:relative;background-color:white;margin:1em auto}
p{position:absolute;margin:0}
img{position:absolute}
</style>
</head>
<body>
z+<?xml version="1.0"?>
<document name="%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": [
htmljsonxmlxhtmlr  )	r   r  tr  r  r  ra   r  rU   r   r   r   ConversionHeader  s.   
r  c                 C   sd   |   }d}d}d}d}|}|dkr|}|S |dkr|}|S |dkr&|}|S |dkr.|}|S |}|S )	Nr   z]
}z</body>
</html>
z</document>
r  r  r  r  r  )r   r  ra   r  r  r  r  rU   r   r   r   ConversionTrailer  s(   
r  startstopclipc                 C   sl  |du r| j }t|}|du r|j}|du r|j}|j|_|j|_|js'|jr)g S | j	dd|dd }g }|D ]}|d D ]}|
t|d  q=q7|g krP|S |jdd	 d
 |d}|j|j d|j kr~t|j|j|j}	|	js}|	js}|d|	 n|d| |g kr|S | }
|j|
j d|
j krt|
j|j|
j}	|	js|	js|
|	 |S |
|
 |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.
    Nr  r   )r  r  blockslinesbboxc                 S      | j S r'   )r   )r  r   r   r   r9  .      z)get_highlight_selection.<locals>.<lambda>keyg?)rL   r   r   r#  r   r   r   r  r  Zget_textr  sortpopr*  r   insert)r  r  r  r  r  r  rn   lineZbboxfrU   Zbboxlr   r   r   get_highlight_selection  sR   


r  Pagec                 C   s4   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.
    	is no PDFr   )rb  r  is_pdfrt   rotationset_rotation)r  old_rotationr   r   r   annot_preprocessH  s   
r  r  Annotc                 C   s$   t | |_|| jt|< d|_dS )ztClean up after annotation inertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)weakrefproxyr  _annot_refsidr   )r  r  r   r   r   annot_postprocessW  s   
r  srgbc                 C   s6   | d? }| |d>  d? }| |d>  |d>  }|||fS )a  Convert sRGB color code to an RGB 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 intervall 0 <= item <= 255.
    r  r  r   )r  rU   r  rn   r   r   r   sRGB_to_rgba  s   

r  c                 C   s*   t | }|d d |d d |d d 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 intervall 0 <= item <= 1.
    r   g     o@r   r   )r  )r  r  r   r   r   sRGB_to_pdfq  s   
"r  r   r   r   r   rL   colsrowsc                 C   s   t | } | js
| jrtd| j}| j| }| j| }|d|df}d|d|f}t ||j| |j| }|g}	t	d|D ]}
||7 }|	
| q;|	g}t	d|D ]}
||
d  }	g }|	D ]	}|
||  q[|
| qO|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.
    z!rect must be finite and not emptyr   r   )r   r  r  rt   r   r*  r)  r   r   ry  r  )rL   r  r  r   r*  r)  Zdelta_hZdelta_vrU   rowr   ZrectsZnrowr   r   r   
make_table  s*   

r  r  Fontc           	         s   dd } j d sdS | j}|  } fdd|D }|g kr!dS t|}t fdd  dd D }tt|d	 }|D ]}||||sQtd
 j	|f  q@dS )a  Repair character spacing for mono fonts.

    Notes:
        Some mono-spaced fonts are displayed with a too large character
        width, e.g. "a b c" instead of "abc". This utility adds an entry
        "/DW w" to the descendent font of font. The int w is
        taken to be the first width > 0 of the font's unicodes.
        This should enforce viewers to use 'w' as the character width.

    Args:
        page: fitz.Page object.
        font: fitz.Font object.
    c                 S   st   |  |d}|d dkrdS t|d dd dd}|  |d	}|d d
kr/| |d	d
 | |dt| dS )NZDescendantFontsr   arrayFr   r  z0 Rr   WnullZDWT)r  rg  replacexref_set_keyr   )r  r  r)  ZdfZdf_xrefr  r   r   r   set_font_width  s   z(repair_mono_font.<locals>.set_font_widthmonoNc                    s>   g | ]}|d   j kr|d dr|d dr|d qS )rl   r   Fr   Identityr   )r   r  r  r  r   r   r     s
    *z$repair_mono_font.<locals>.<listcomp>c                    s   g | ]}  |qS r   )glyph_advance)r   cpr  r   r   r     s    rl   i  z$Cannot set width for '%s' in xref %i)
r  r  ru  r!   r   valid_codepointsrg  ry   printr   )	r  r  r  r  ZfontlistZxrefsZmaxadvr)  r  r   r  r   repair_mono_font  s$   

"r  chc                 C   sh   t i kr.t D ]&}|drq|d\}}| }|D ]}t|d d dd}|t |< qqt | dS )Nr  ;r   r  basez.notdef)_adobe_glyphs_get_glyph_textr  r  rg  r  )r  r  r   uncZunclro   r   r   r   unicode_to_glyph_name  s   


r  r   c                 C   sV   t i kr%t D ]}|drq|d\}}t|d d dd}|t |< qt | dS )Nr  r  r   r  r  i  )_adobe_unicodesr  r  r  rg  r  )r   r  gnamer  ro   r   r   r   glyph_name_to_unicode  s   


r  c                  C   Z   t i kr't D ]} | drq| d\}}td|d d  dd}|t |< qtt  S Nr  r  0xr   r  r  )r  r  r  r  rg  r   r  r  r  r  ro   r   r   r   adobe_glyph_names     


r  c                  C   r  r  )r  r  r  r  rg  r   valuesr  r   r   r   adobe_glyph_unicodes  r  r  c                   C   s   t td  S )Ns~  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)gzip
decompressbase64	b64decodedecode
splitlinesr   r   r   r   r    s      S   r  c                   @   sN  e Zd Zedd dd ddZeZejZ	dAd	d
Z
dd Zdd Zdd Zdd ZdBddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdCd%d&Zd'd( ZdDd)d*Zd+efd,d-Zd.ejee f d+efd/d0Z!d+efd1d2Z"d.ejee f fd3d4Z#d.ejee f d+e$fd5d6Z%d.ejee f d+e&fd7d8Z'				dCd.ejee f d9e(d:e)d;e)d<e)d+dfd=d>Z*			dDd?e d9ej+d:e)d;e)d<e)d+dfd@dAZ,dEdCdDZ-edEdF Z.edGdH Z/edIdJ Z0dKdL Z1dMdN Z2dOdP Z3dQdR Z4dSdT Z5dUdV Z6edWdX Z7edYdZ Z8dFd[d\Z9dGd]d^Z:dHd_d`Z;dadb Z<dcdd Z=ededf Z>dgdh Z?didj Z@dkdl ZAedmdn ZBedodp ZCedqdr ZDedsdt ZEdudv ZFedwdx ZGdydz ZHd{d| ZIdIddZJ				~	dJddZKdKddZLdLddZMdd ZNdd ZOedd ZPdd ZQdFddZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dMddZ\dd Z]dd Z^dd Z_dd Z`dNddZadd Zbdd ZcdMddZddFddZedd Zfedd Zgedd Zhdd ZiddÄ Zjddń ZkddǄ ZlddɄ Zmdd˄ Zndd̈́ Zoddτ ZpdOddфZqdPderderd+e fddՄZsddׄ Ztddل ZudFddۄZvdQdd݄Zwdd߄ ZxdRddZydd Zzdd Z{dSddZ|dd Z}dd Z~dd ZdMddZdRddZdCddZdBddZdd ZdMddZdd ZdTddZdd Zed d ZdUdederd+efddZdUdederd+efddZded+efddZd	d
 Zdd Zdd ZdRdedefddZdRdedefddZdRdefddZdd Zdd Z				~	dVddZdWd d!Zd+e fd"d#Zd+erfd$d%ZdMd&ed+d'fd(d)Zd&ed+dfd*d+ZdDd,ed-ed.efd/d0Zd+efd1d2ZdXd3d4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdS (Y  Documentc                 C   
   | j  S r'   r	   r   rj  r   r   r   r9       
 zDocument.<lambda>c                 C      | j |S r'   r  r   r   r   r   r   r9        The membership flagr  Nr   r  c                 C   s:  d| _ d| _d| _d| _g | _i | _i | _i | _t	 | _
|r%t|tu r&nt|dr0t|}nt|dr9|j}nd}t||dkrvt|tu rM|| _nt|tu rYt|| _nt|tju rf| | _nd}t|| j}|su|sud}nd| _|r| jdkr|| _d}	nd}	d	| _|	rtj|sd
| d}t|tj|sd| d}t||	rtj|dkst| jtu rt| jdkrd}t|t | t!||||||| | j"rt#$ | _%| j&du rd| _d| _n| '  |r|( )ds|rd|( v rz| * }
W dS    tdddS dS dS )a.  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string, pathlib.Path, or file object.
            open(filename, fileype=type) - overwrite filename extension.
            open(type, buffer) - type: extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            Parameters rect, width, height, fontsize: layout reflowable
                 document on open (e.g. EPUB). Ignored if n/a.
        FNabsoluter   zbad filenamezbad type: 'stream'ZpdfTr   zno such file: ''z' is no filer   zcannot open empty documentsvgzcannot open broken document)+	is_closedis_encryptedisEncryptedmetadatarw  	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsr   r   r   r   	TypeErrorr  r  r&  r  r  r  ospathexistsr  isfiler  getsizers   r  r   ZDocument_swiginitZnew_Documentr   r  gen_id	_graft_id
needs_passinit_docr  r7  convert_to_pdf)r   r  r  ZfiletyperL   r)  r*  rc   msg	from_file_r   r   r   r     sx   



0

(
	zDocument.__init__c                 C   s   | j s| jr
td|du rd}|| vrtdt|tu r1|dk r1| j}|dk r1||7 }|dk s)t| |}d|_t	
| |_|| jt|< t	 |_||_|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.
        document closed or encryptedNr   page not in documentT)r  r  rt   r   rg  
page_countr   ZDocument_load_pager   r  r  r  r  r  r  r  number)r   page_idnpvalr   r   r   	load_page8  s$   
zDocument.load_pagec                 C   rC   r'   )r   ZDocument__remove_links_to)r   numbersr   r   r   _remove_links_toX  rE   zDocument._remove_links_toc                 C      | j rtdt| S )zLoad first outline.document closed)r  rt   r   ZDocument__loadOutliner   r   r   r   _loadOutline[     
zDocument._loadOutlinec                 C   rC   r'   )r   ZDocument__dropOutline)r   Zolr   r   r   _dropOutlinec  rE   zDocument._dropOutlinec                 C      | j rtdt| ||S )z)Utility: insert font from file or binary.r  )r  rt   r   ZDocument__insert_font)r   fontfile
fontbufferr   r   r   _insert_fontf     zDocument._insert_fontc                 C   r  )z!Get list of outline xref numbers.r  )r  rt   r   ZDocument_get_outline_xrefsr   r   r   r   get_outline_xrefsn  r  zDocument.get_outline_xrefsc                 C      | j rtdt| |S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r  )r  rt   r   ZDocument_xref_get_keysr   r  r   r   r   xref_get_keysv     zDocument.xref_get_keysc                 C   r  )z+Get PDF dict key value of object at 'xref'.r  )r  rt   r   ZDocument_xref_get_key)r   r  r  r   r   r   r  ~  r  zDocument.xref_get_keyc                 C      | j rtdt| |||S )z&Set the value of a PDF dictionary key.r  )r  rt   r   ZDocument_xref_set_key)r   r  r  r   r   r   r   r       zDocument.xref_set_keyc                 C   r  )z4Add color info to all items of an extended TOC list.r  )r  rt   r   ZDocument__extend_toc_items)r   itemsr   r   r   _extend_toc_items  r  zDocument._extend_toc_itemsc                 C   r  )z Get list of embedded file names.r  )r  rt   r   ZDocument__embfile_names)r   namelistr   r   r   _embfile_names  r  zDocument._embfile_namesc                 C   rC   r'   )r   ZDocument__embfile_delr   idxr   r   r   _embfile_del  rE   zDocument._embfile_delc                 C   r=   r'   )r   ZDocument__embfile_info)r   r!  infodictr   r   r   _embfile_info  rB   zDocument._embfile_infoc                 C      t | |||||S r'   )r   ZDocument__embfile_upd)r   r!  bufferr  	ufilenamedescr   r   r   _embfile_upd  r  zDocument._embfile_updc                 C   rC   r'   )r   ZDocument__embeddedFileGetr   r   r   r   _embeddedFileGet  rE   zDocument._embeddedFileGetc                 C   r%  r'   )r   ZDocument__embfile_add)r   r   r&  r  r'  r(  r   r   r   _embfile_add  r  zDocument._embfile_addrn  c                 C   s   g }|  | |S )z#Get list of names of EmbeddedFiles.)r  )r   	filenamesr   r   r   embfile_names  s   
zDocument.embfile_namesr  c                 C   sJ   |   }dt| }||v r||}|S |tt|v r!|}|S t|)Nz '%s' not in EmbeddedFiles array.)r-  r   indexry  rs   rt   )r   r  r,  r  r!  r   r   r   _embeddedFileIndex  s   
zDocument._embeddedFileIndexc                 C   s   t |  S )zGet number of EmbeddedFiles.)rs   r-  r   r   r   r   embfile_count  r6  zDocument.embfile_countc                 C      |  |}| |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   r  r!  r   r   r   embfile_del  s   

zDocument.embfile_delc                 C   s   |  |}d|  | i}| ||}| |d\}}|dkr#||d< | |d\}}|dkr3||d< | |d\}}|dkrJt|  |d< |S )	zGet information of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            Information dictionary.
        r   Params/CreationDater  creationDateParams/ModDatemodDatezParams/CheckSumZchecksum)r/  r-  r$  r  binasciihexlifyencoder  )r   r  r!  r#  r  r  datemd5r   r   r   embfile_info  s   
zDocument.embfile_infoc                 C   r1  )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )r/  r*  r2  r   r   r   embfile_get  s   

zDocument.embfile_getr&  r  r'  r(  c           	      C   s:   |  |}| j|||||d}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(  r6  )r/  r)  r"  r  r/  )	r   r  r&  r  r'  r(  r!  r  r;  r   r   r   embfile_upd  s   
zDocument.embfile_updr   c           
      C   s   |   }dt| }||v rt||du r|}|du r'ttu r%t|dn|}|du r-|}| j|||||d}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utf8r?  Typez/EmbeddedFiler4  r6  )	r-  r   rt   r  unicoder+  r"  r  r/  )
r   r   r&  r  r'  r(  r,  r  r  r;  r   r   r   embfile_add  s(   zDocument.embfile_addr  c                 C   $   | j s| jr
tdt| |||S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r  )r  r  rt   r   ZDocument_convert_to_pdf)r   	from_pageto_pagerotater   r   r   r  /  s   zDocument.convert_to_pdfc                 C   r  )zNumber of pages.r  )r  rt   r   ZDocument_page_countr   r   r   r   r  8     
zDocument.page_countc                 C   r  )zNumber of chapters.r  )r  rt   r   ZDocument_chapter_countr   r   r   r   chapter_countA  rI  zDocument.chapter_countc                 C   r  )z Id (chapter, page) of last page.r  )r  rt   r   ZDocument_last_locationr   r   r   r   last_locationJ  rI  zDocument.last_locationc                 C   r  )zPage count of chapter.r  )r  rt   r   ZDocument_chapter_page_count)r   chapterr   r   r   chapter_page_countT  r  zDocument.chapter_page_countc                 C   sP   | j s| jr
tdt|tu rd|f}|| vrtd|dkr"dS t| |S )z%Get (chapter, page) of previous page.r  r   page id not in documentr   r   r   )r  r  rt   r   rg  r   ZDocument_prev_locationr   r  r   r   r   prev_location\  s   zDocument.prev_locationc                 C   sV   | j s| jr
tdt|tu rd|f}|| vrtdt|| jkr%dS t| |S )z!Get (chapter, page) of next page.r  r   rN  r   )	r  r  rt   r   rg  r   rK  r   ZDocument_next_locationrP  r   r   r   next_locationl  s   zDocument.next_locationc                 C   r  )zConvert pno to (chapter, page).r  )r  rt   r   Z"Document_location_from_page_numberr   pnor   r   r   location_from_page_number|  r  z"Document.location_from_page_numberc                 C   sN   t |tu r| j}|dk r||7 }|dk sd|f}|| vr!tdt| |S )z&Convert (chapter, pno) to page number.r   rN  )r   rg  r  rt   r   Z"Document_page_number_from_location)r   r  r  r   r   r   page_number_from_location  s   z"Document.page_number_from_locationc                 C   r  )zGet metadata.r  )r  rt   r   ZDocument__getMetadata)r   r  r   r   r   _getMetadata  r  zDocument._getMetadatac                 C   r  )zIndicate password required.r  )r  rt   r   ZDocument_needs_passr   r   r   r   r    rI  zDocument.needs_passc                 C   r  )zDocument language.r  )r  rt   r   ZDocument_languager   r   r   r   language  rI  zDocument.languagec                 C   rC   r'   )r   ZDocument_set_languager   rX  r   r   r   set_language  rE   zDocument.set_languagec                 C   r=   )aM  Calculate internal link destination.

        Args:
            uri: (str) some Link.uri
            chapters: (bool) whether to use (chapter, page) format
        Returns:
            (page_id, x, y) where x, y are point coordinates on the page.
            page_id is either page number (if chapters=0), or (chapter, pno).
        )r   ZDocument_resolve_link)r   r  Zchaptersr   r   r   resolve_link  s   zDocument.resolve_linkc                 C   s:   | j s| jr
tdt| ||||}|   |   |S )z Re-layout a reflowable document.r  )r  r  rt   r   ZDocument_layout_reset_page_refsr  )r   rL   r)  r*  rc   r  r   r   r   layout  s   zDocument.layoutc                 C       | j s| jr
tdt| |S )z.Make a page pointer before layouting document.r  )r  r  rt   r   ZDocument_make_bookmark)r   locr   r   r   make_bookmark     zDocument.make_bookmarkc                 C   r^  )z-Find new location after layouting a document.r  )r  r  rt   r   ZDocument_find_bookmark)r   Zbmr   r   r   find_bookmark  ra  zDocument.find_bookmarkc                 C   r  )z Check if document is layoutable.r  )r  rt   r   ZDocument_is_reflowabler   r   r   r   is_reflowable  rI  zDocument.is_reflowablec                 C   r  )zDelete object.r  )r  rt   r   ZDocument__deleteObjectr  r   r   r   _deleteObject  r  zDocument._deleteObjectc                 C   r  )zGet xref of PDF catalog.r  )r  rt   r   ZDocument_pdf_catalogr   r   r   r   pdf_catalog  r  zDocument.pdf_catalogc                 C   r  )zGet PDF file id.r  )r  rt   r   ZDocument__getPDFfileidr   r   r   r   _getPDFfileid  r  zDocument._getPDFfileidc                 C   r  )zCheck for PDF.r  )r  rt   r   ZDocument_is_pdfr   r   r   r   r    rI  zDocument.is_pdfc                 C   r  )z Check if xref table is a stream.r  )r  rt   r   ZDocument_has_xref_streamsr   r   r   r   has_xref_streams  rI  zDocument.has_xref_streamsc                 C   r  )z!Check if xref table is old style.r  )r  rt   r   ZDocument_has_old_style_xrefsr   r   r   r   has_old_style_xrefs  rI  zDocument.has_old_style_xrefsc                 C   r  )z True if PDF has unsaved changes.r  )r  rt   r   ZDocument_is_dirtyr   r   r   r   is_dirty  rI  zDocument.is_dirtyc                 C   r  )z-Check whether incremental saves are possible.r  )r  rt   r   ZDocument_can_save_incrementallyr   r   r   r   can_save_incrementally"  r  zDocument.can_save_incrementallyc                 C   r  )zCheck whether PDF was repaired.r  )r  rt   r   ZDocument_is_repairedr   r   r   r   is_repaired)  rI  zDocument.is_repairedc                 C   sh   | j rtdt|tkrnt|drt|}nt|dr!|j}ntd|| jkr.tdt| |S )z.Save a file snapshot suitable for journalling.zdoc is closedopenr   )filename must be str, Path or file objectzcannot snapshot to original)r  rt   r   r   r   r   r   ZDocument_save_snapshotr   r  r   r   r   save_snapshot3  s   



zDocument.save_snapshotc                 C   s<   | j rtdt| |}|rd| _d| _|   d| _|S )zDecrypt document.r  FT)r  rt   r   ZDocument_authenticater  r  r  r   )r   passwordr  r   r   r   authenticateG  s   zDocument.authenticater     c                 C   s   | j s| jr
tdt|tkrnt|drt|}nt|dr$|j}n	t|ds-td|| jkr8|s8td| jdk rAtd|rO| j|ksK| jrOtd	t	
| |||||||||	|
|||||||S )
z/Save PDF to file, pathlib.Path or file pointer.r  rl  r   seekrm  z$save to original must be incrementalr   zcannot save with zero pageszincremental needs original file)r  r  rt   r   r   r   r   r  r  r   ZDocument_save)r   r  garbagecleandeflatedeflate_imagesdeflate_fontsincrementalasciiexpandlinear	no_new_id
appearancepretty
encryptionpermissionsowner_pwuser_pwr   r   r   saveX  s$   




,zDocument.saveFc                 C   s   ddl m} | }| j|fi d|d|d|
d|d|d|d	|d
|d|d|d|	d|d|d|d|d| | S )Nr   r  rt  ru  r}  r~  rv  rw  rx  ry  rz  r{  r|  r  r  r  r  r  )r  r  r  r  )r   rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  bior   r   r   writeq  s@   zDocument.writec                 C   s  | j s| jr
td| j|jkrtd|}|dk r| j}t||  kr)dkrIn ntj|j	}|s6d}tj| j	}|sAd}t
d||f  |j}| j|d}
|
du r`t| }
|
| j|< t| |||||||||	|
}|   |r~| j||||d |	dkrd| j|< |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.
            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   z
memory PDFzInserting '%s' at '%s'N)rF  rG  start_atr   )r  r  rt   r  r  rs   r  r  r  r   r  r  r  Graftmapr   ZDocument_insert_pdfr\  Z	_do_links)r   ZdocsrcrF  rG  r  rH  linksannotsshow_progressfinalZ_gmapsaZinnameoutnameZisrtr  r   r   r   
insert_pdf  s:   


zDocument.insert_pdfr?  r>  c                 C   s0   | j s| jr
tdt| |||}|   |S )zMake a new PDF page.r  )r  r  rt   r   ZDocument__newPager\  )r   rT  r)  r*  r  r   r   r   _newPage  s
   zDocument._newPagec                 C   s   | j s| jr
td| jstdt|dstdt|dks4t|tt| vs4t|tt| vr8tdt	
| |}|   |S )z,Build sub-pdf with page numbers in the list.r  r  r   zsequence requiredr   bad page number(s))r  r  rt   r  r   rs   r   ry  r   r   ZDocument_selectr\  )r   Zpylister  r   r   r   select  s   
4zDocument.selectc                 C   rC   r'   )r   ZDocument__delete_pagerS  r   r   r   _delete_page  rE   zDocument._delete_pagec                 C   s   | j rdS t| S )zDocument permissions.r   )r  r   ZDocument_permissionsr   r   r   r   r    s   
zDocument.permissionsc                 C      | j s| jr
tdt| S )zActivate document journalling.r  )r  r  rt   r   ZDocument_journal_enabler   r   r   r   journal_enable     
zDocument.journal_enablec                 C   r^  )zBegin a journalling operation.r  )r  r  rt   r   ZDocument_journal_start_opr   r   r   r   r   journal_start_op  ra  zDocument.journal_start_opc                 C   r  )zEnd a journalling operation.r  )r  r  rt   r   ZDocument_journal_stop_opr   r   r   r   journal_stop_op  r  zDocument.journal_stop_opc                 C   r  )zShow journalling state.r  )r  r  rt   r   ZDocument_journal_positionr   r   r   r   journal_position  r  zDocument.journal_positionc                 C   r^  )z#Show operation name for given step.r  )r  r  rt   r   ZDocument_journal_op_name)r   stepr   r   r   journal_op_name  ra  zDocument.journal_op_namec                 C   r  )z(Show if undo and / or redo are possible.r  )r  r  rt   r   ZDocument_journal_can_dor   r   r   r   journal_can_do
  r  zDocument.journal_can_doc                 C   r  )zMove backwards in the journal.r  )r  r  rt   r   ZDocument_journal_undor   r   r   r   journal_undo  r  zDocument.journal_undoc                 C   r  )zMove forward in the journal.r  )r  r  rt   r   ZDocument_journal_redor   r   r   r   journal_redo  r  zDocument.journal_redoc                 C   r^  )zSave journal to a file.r  )r  r  rt   r   ZDocument_journal_savern  r   r   r   journal_save"  ra  zDocument.journal_savec                 C   r^  )zLoad a journal from a file.r  )r  r  rt   r   ZDocument_journal_loadrn  r   r   r   journal_load*  ra  zDocument.journal_loadc                 C   r  )z Check if journalling is enabled.r  )r  r  rt   r   ZDocument_journal_is_enabledr   r   r   r   journal_is_enabled2  r  zDocument.journal_is_enabledc              	   C   s*   | j s| jr
tdt| ||||||S )z1Return list of glyphs and glyph widths of a font.r  )r  r  rt   r   ZDocument__get_char_widths)r   r  bfnameextr1  limitr!  r   r   r   _get_char_widths:  s   zDocument._get_char_widthsc                 C   r  )zGet xref of page number.r  )r  rt   r   ZDocument_page_xrefrS  r   r   r   	page_xrefB  r  zDocument.page_xrefc                 C   r  )z$Get list annotations of page number.r  )r  rt   r   ZDocument_page_annot_xrefsrS  r   r   r   page_annot_xrefsJ  r  zDocument.page_annot_xrefsc                 C   s*   | j rtdt| |}tt|}|S )z2Get CropBox of page number (without loading page).r  )r  rt   r   ZDocument_page_cropboxr   ro  )r   rT  r  r   r   r   page_cropboxR  s
   zDocument.page_cropboxc                 C   "   | j s| jr
tdt| ||S )z,List fonts, images, XObjects used on a page.r  )r  r  rt   r   ZDocument__getPageInfo)r   rT  whatr   r   r   _getPageInfo]     zDocument._getPageInfoc                 C   rE  )z2Get a font by xref. Returns a tuple or dictionary.r  )r  r  rt   r   ZDocument_extract_font)r   r  Z	info_onlyr  r   r   r   extract_fonte     zDocument.extract_fontc                 C   r^  )z(Get image by xref. Returns a dictionary.r  )r  r  rt   r   ZDocument_extract_imager  r   r   r   extract_imagem  ra  zDocument.extract_imagec                 C   s*   | j s| jr
tdt| }|   |S )zDelete the TOC.r  )r  r  rt   r   ZDocument__delToCr  r   r  r   r   r   _delToCu  s
   
zDocument._delToCc                 C   r  )z!Check if xref is a stream object.r  )r  rt   r   ZDocument_xref_is_streamr  r   r   r   xref_is_stream  r  zDocument.xref_is_streamc                 C   s$   | j rtd| jsdS t| |S )z"Get/set the NeedAppearances value.r  N)r  rt   is_form_pdfr   ZDocument_need_appearances)r   r   r   r   r   need_appearances  s
   zDocument.need_appearancesc                 C   r  )zGet the /SigFlags value.r  )r  rt   r   ZDocument_get_sigflagsr   r   r   r   get_sigflags  r  zDocument.get_sigflagsc                 C   r  )z Either False or PDF field count.r  )r  rt   r   ZDocument_is_form_pdfr   r   r   r   r    rI  zDocument.is_form_pdfc                 C   r  )z&Get list of field font resource names.r  )r  rt   r   ZDocument_FormFontsr   r   r   r   r    rI  zDocument.FormFontsc                 C   r  )zAdd new form font.r  )r  r  rt   r   ZDocument__addFormFont)r   r   r  r   r   r   _addFormFont  r  zDocument._addFormFontc                 C   r  )z/Get xref of Outline Root, create it if missing.r  )r  r  rt   r   ZDocument__getOLRootNumberr   r   r   r   _getOLRootNumber  r  zDocument._getOLRootNumberc                 C   r  )zMake a new xref.r  )r  r  rt   r   ZDocument_get_new_xrefr   r   r   r   get_new_xref  r  zDocument.get_new_xrefc                 C   r  )zGet length of xref table.r  )r  rt   r   ZDocument_xref_lengthr   r   r   r   xref_length  r  zDocument.xref_lengthc                 C   r  )zGet document XML metadata.r  )r  rt   r   ZDocument_get_xml_metadatar   r   r   r   get_xml_metadata  r  zDocument.get_xml_metadatac                 C   r  )z"Get xref of document XML metadata.r  )r  rt   r   ZDocument_xref_xml_metadatar   r   r   r   xref_xml_metadata  r  zDocument.xref_xml_metadatac                 C   r  )zDelete XML metadata.r  )r  r  rt   r   ZDocument_del_xml_metadatar   r   r   r   del_xml_metadata  r  zDocument.del_xml_metadatac                 C   r^  )z"Store XML document level metadata.r  )r  r  rt   r   ZDocument_set_xml_metadata)r   r  r   r   r   set_xml_metadata  ra  zDocument.set_xml_metadatac                 C   r  )z#Get xref object source as a string.r  )r  rt   r   ZDocument_xref_object)r   r  
compressedrz  r   r   r   xref_object  r  zDocument.xref_objectr  rz  c                 C   s   | j d||dS )zGet PDF trailer as a string.r  )r  rz  )r  )r   r  rz  r   r   r   pdf_trailer  s   zDocument.pdf_trailerc                 C   r^  )z&Get xref stream without decompression.r  )r  r  rt   r   ZDocument_xref_stream_rawr  r   r   r   xref_stream_raw  ra  zDocument.xref_stream_rawc                 C   r^  )zGet decompressed xref stream.r  )r  r  rt   r   ZDocument_xref_streamr  r   r   r   xref_stream  ra  zDocument.xref_streamc                 C   rE  )z!Replace object definition source.r  )r  r  rt   r   ZDocument_update_object)r   r  ra   r  r   r   r   update_object	  r  zDocument.update_objectc                 C   s&   | j s| jr
tdt| ||||S )zReplace xref stream part.r  )r  r  rt   r   ZDocument_update_stream)r   r  r  newcompressr   r   r   update_stream  s   zDocument.update_streamc                 C   r  )z)Make an array page number -> page object.r  )r  rt   r   ZDocument__make_page_mapr   r   r   r   _make_page_map  r  zDocument._make_page_mapc                 C   s(   | j rtdt| ||}|   |S )zMake a full page duplicate.r  )r  rt   r   ZDocument_fullcopy_pager\  )r   rT  tor  r   r   r   fullcopy_page!  s
   zDocument.fullcopy_pagec                 C   s,   | j rtdt| ||||}|   |S )z"Move or copy a PDF page reference.r  )r  rt   r   ZDocument__move_copy_pager\  )r   rT  nbbeforer*   r  r   r   r   _move_copy_page,  s
   zDocument._move_copy_pagec                 C   rC   r'   )r   ZDocument__remove_toc_itemr  r   r   r   _remove_toc_item7  rE   zDocument._remove_toc_itemc              	   C      t | ||||||S r'   )r   ZDocument__update_toc_item)r   r  actiontitler  Zcollapsecolorr   r   r   _update_toc_item:  r.   zDocument._update_toc_itemc                 C   r:   r'   )r   ZDocument__get_page_labelsr   r   r   r   _get_page_labels=  r<   zDocument._get_page_labelsc                 C   sB   t | |}|  }| j|dd}|dd| }| || |S )NTr  z/Nums[]z	/Nums[%s])r   ZDocument__set_page_labelsre  r  r  r  )r   labelsr  r  ra   r   r   r   _set_page_labels@  s   zDocument._set_page_labelsc                 C   r  )zShow optional OC layers.r  )r  rt   r   ZDocument_get_layersr   r   r   r   
get_layersK  r  zDocument.get_layersc                 C   r  )zActivate an OC layer.r  )r  rt   r   ZDocument_switch_layer)r   configZ
as_defaultr   r   r   switch_layerS  r  zDocument.switch_layerc                 C   r  )z,Content of ON, OFF, RBGroups of an OC layer.r  )r  rt   r   ZDocument_get_layer)r   r  r   r   r   	get_layer[  r  zDocument.get_layerc           	      C   sV  | j rtdt|   }|t krtd|r8t|ttfvr&tdt||}|t kr8td| |rXt|ttfvrFtdt||}|t krXtd| |rt|ttfvrftd|D ]"}t|ttfvrxtd| t||}t	t krtd	| qh|rt
| }|d
krd}|dvrtdt| |||||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: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %sZ	UNCHANGED	Unchanged)ONZOFFr  zbad 'basestate')r  rt   r!   get_ocgsr  r   re  r   
differencerr   r   r  r   ZDocument_set_layer)	r   r  Z	basestateonoffZrbgroupsZocgsr~   r   r   r   r   	set_layerc  sD   



zDocument.set_layerc                 C   r  )zAdd a new OC layer.r  )r  rt   r   ZDocument_add_layer)r   r   creatorr  r   r   r   	add_layer  r  zDocument.add_layerc                 C   r  )z-Show OC visibility status modifyable by user.r  )r  rt   r   ZDocument_layer_ui_configsr   r   r   r   layer_ui_configs  r  zDocument.layer_ui_configsc                 C   r  )z$Set / unset OC intent configuration.r  )r  rt   r   ZDocument_set_layer_ui_config)r   r  r  r   r   r   set_layer_ui_config  r  zDocument.set_layer_ui_configc                 C   r  )z&Show existing optional content groups.r  )r  rt   r   ZDocument_get_ocgsr   r   r   r   r    r  zDocument.get_ocgsc                 C   s"   | j rtdt| |||||S )zAdd new optional content group.r  )r  rt   r   ZDocument_add_ocg)r   r   r  r  Zintentusager   r   r   add_ocg  s   zDocument.add_ocgc                    sp    j rtd   _t fd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                    s   g | ]\}}|  |fqS r   )rW  )r   kr   r   r   r   r     s    z%Document.init_doc.<locals>.<listcomp>r  z
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
r  r  authorsubjectkeywordsr  Zproducerr5  r7  Ztrappedr  None)r  rt   r  _outliner  r  r  rW  r   r   r   r   r    s
   
2&zDocument.init_docc                 C   r  r'   )r  r   r   r   r   r9    r  rT  fullc                 C   j   | j s| jr
td| jsdS t|tur"z|j}W n   td| |d}|du r3dd |D S |S )z1Retrieve a list of fonts used on a page.
        r  r   need a Page or page numberr   Fc                 S      g | ]}|d d qS Nr  r   r   r   r   r   r   r     r6  z+Document.get_page_fonts.<locals>.<listcomp>r  r  rt   r  r   rg  r  r  r   rT  r  r  r   r   r   get_page_fonts     
zDocument.get_page_fontsc                 C   r  )z2Retrieve a list of images used on a page.
        r  r   r  r   Fc                 S   r  r  r   r  r   r   r   r     r6  z,Document.get_page_images.<locals>.<listcomp>r  r  r   r   r   get_page_images  r  zDocument.get_page_imagesc                 C   sb   | j s| jr
td| jsdS t|tur"z|j}W n   td| |d}dd |D }|S )z4Retrieve a list of XObjects used on a page.
        r  r   r  rl   c                 S   s,   g | ]}|d  |d |d t |d fqS )r   r   r   rl   rK  r  r   r   r   r        , z.Document.get_page_xobjects.<locals>.<listcomp>r  )r   rT  r  r\  r   r   r   get_page_xobjects  s   
zDocument.get_page_xobjectsc                 C   0   | j s| jr
td| |dd dkrdS dS )z!Check if xref is an image object.r  Subtyper   z/ImageTFr  r  rt   r  r  r   r   r   xref_is_image  
   zDocument.xref_is_imagec                 C   r  )zCheck if xref is a font object.r  rB  r   z/FontTFr  r  r   r   r   xref_is_font  r  zDocument.xref_is_fontc                 C   r  )z Check if xref is a form xobject.r  r  r   z/FormTFr  r  r   r   r   xref_is_xobject  r  zDocument.xref_is_xobjectr  c                 C   sd   | j rtdt| }|t|vs|td|vrtdd}d}|dkr*|d }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  r  r  r   r   r  rt   rs   ry  r  r   rT  r  r  r  r*   r   r   r   	copy_page  s   zDocument.copy_pagec                 C   sd   | j rtdt| }|t|vs|td|vrtdd}d}|dkr*|d }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  r  r  r   r   r  r  r   r   r   	move_page&  s   zDocument.move_pagec                 C   s   | j std| jrtd| j}|dk r||7 }|dk s||kr%td|  }|  }t|D ]\}}|d |d krD| ||  q1| t	|f | 
| |   dS )z% Delete one page from a PDF.
        r  r  r   r  r   r   N)r  rt   r  r  get_tocr  r  r  r
  	frozensetr  r\  )r   rT  r  tocZol_xrefsr   r  r   r   r   delete_page>  s&   
zDocument.delete_pagec                 O   sH  | j std| jrtd| j}d }}|r_|g krtd|dd}|dd}|dk r7||7 }|dk s/|dk rC||7 }|dk s;||  krP|k sUtd tdtt||d	 }nct|d
ksi|g krmtdt|d
kr|\}}t|t	u rt|t	u std||kr||}}||  kr|k std tdtt||d	 }n|d }t|t	tt
tfvrtdt|}t
tt	t|}|g krtd dS |  |d dk s|d |krtdt|}|  }	t|  D ]\}
}|	|
 d
 d	 |v r| | q| | t|D ]}
| |
 q|   dS )a	  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.
        r  r  r  z*cannot mix keyword and positional argumentrF  rG  r   r  r   r   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r  rt   r  r  r  r   ry  rs   r   rg  re  ru   r!   r  r  r	  r  r  r  r  r
  reversedr  r\  )r   r|   r}  r  rr   r  r	  rU   Zfrozen_numbersr
  r   r  r   r   r   delete_pagesY  sp   	


zDocument.delete_pagesc                 C   s   | j | jdtdS )z Save PDF incrementallyT)ry  r  )r  r   PDF_ENCRYPT_KEEPr   r   r   r   saveIncr     zDocument.saveIncrrl   Tc                 C   s.   | j |f||||||||	|
||||||dS )z' Save PDF using some different defaults)rt  ru  rv  rw  rx  ry  rz  r{  r|  r  r  r  r  r  r}  )r  )r   r  rt  ru  rv  rw  rx  ry  rz  r{  r|  r  r  r  r  r  r}  r   r   r   ez_save  s    
zDocument.ez_saver  rt  c                 C   st   i }|j }|j D ]\}}|||< q
|  d}| |}t|}| D ]\}}|| }||_||j|< q'|S )zMake a fresh copy of a page.N)r  r  r  _eraser  r  r  r  )r   r  Z
old_annotsrT  r  r   Z
page_proxyr  r   r   r   reload_page  s   


zDocument.reload_pagec                 C   sT   | j rdnd}| jd u r | jdkr|d| j  S |d| jf  S |d| j| jf  S )Nzclosed r   zDocument(<new PDF, doc# %i>)zDocument('%s')z!Document('%s', <memory, doc# %i>))r  r  r   r  r   r   r   r   r
     s   

zDocument.__repr__c                 C   s   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ks2|dk s2|| jkr4dS t |tksE|dk sE|| |krGdS dS )NTFr   r   )r   rg  r  r   re  rs   rJ  rM  )r   r_  rL  rT  r   r   r   rA    s    

zDocument.__contains__r   r  c                 C   s   || vrt d| |S )Nr  )r   r  r   r   r   r   r     s   
zDocument.__getitem__c                 C   s   | 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r3|jnd}|jr;|jn|}|jrC|jnd}|dk rQ||7 }|dk sI||krYtd|dk re||7 }|dk s]||krmtd| t|||S )Nr  zbad argument typer   r   r  )r  rt   r   rg  r  re  r   ry  r  slicer  r  r  r  )r   r   Zpcr  r  r  r   r   r   __delitem__  s.   

zDocument.__delitem__r  r  r  c                 c   s    |pd}|dk r|| j 7 }|dk s	|t| j vrtd|dur(|| j kr(|n| j }|dkr3td|du r@||kr>d}nd}t|||D ]}| |V  qFdS )z}Return a generator iterator over a page range.

        Arguments have the same meaning as for the range() built-in.
        r   zbad start page numberNzarg 3 must not be zeror  r   )r  ry  rt   r  )r   r  r  r  rT  r   r   r   pages	  s"   
zDocument.pagesc                 C   r  r'   )r  r   r   r   r   r   %     zDocument.__len__c                 C   $   t |}|| jv rd| j|< dS dS )z&Remove a page from document page dict.N)r  r  )r   r  pidr   r   r   _forget_page(     
zDocument._forget_pagec                 C   s>   t | ddrdS | j D ]
}|r|  d}q| j  dS )z,Invalidate all pages in document dictionary.r  TN)r   r  r  r  clearr   r  r   r   r   r\  .  s   zDocument._reset_page_refsc                 C   sn   t | dd r| | j d | _|   | j D ]}d | j|< qi | _i | _i | _g | _d | _	d | _
d| _d S )Nr  T)r   r  r  r\  r  r  r  r  rw  r  r  r  )r   r  r   r   r   _cleanup:  s   
zDocument._cleanupc                 C   s>   t | ddr
td|   t | ddr| |  dS td)zClose the document.r  Fr  r   Nzdocument object unavailable)r   rt   r  __swig_destroy__rc  r   r   r   r   closeJ  s   
zDocument.closec                 C   s6   t | turd S |   t| ddr| |  d S d S Nr   F)r   r  r  r   r  r   r   r   r   r  U  s   zDocument.__del__c                 C      | S r'   r   r   r   r   r   	__enter__\  r   zDocument.__enter__c                 G      |    d S r'   )r   r   r   r   r   __exit___  rE   zDocument.__exit__)NNNNr   r   r  )NNNNNNNNN)r   r  r   r'   r   )Nr   r   r  )r   r   r   r   r   r   r   r   r   r   r   r   r   rr  NN)FFFFFFFFFFFFr   rr  NN)	r  r  r  r  r   r   r   r   N)r  r?  r>  r   )r   r   NrO  )FF)r   Nr   r   )r  NNr   NN)r  r   NNF)rl   FTTTFFFFFr   rr  NNT)r  rt  rn  rt  )r  rt  )r   r   r1   r   r   r   r
   r   Zdelete_Documentr  r   r  r
  r  r  r  r  r  r  r  r  r  r"  r$  r)  r*  r+  re  r-  typingUnionrg  r   r/  r0  r3  r  r=  r  r>  OptBytesOptStrr@  
ByteStringrD  r  r  rJ  rK  rM  rQ  rR  rU  rV  rW  r  rX  rZ  r[  r]  r`  rb  rc  rd  re  rf  r  rg  rh  ri  rj  rk  ro  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  outliner  r  r  r   r  r  r  r  r  r  r  r  r  rA  r   AnyTyper  OptIntr  r   r  r\  r  r   r  r#  r%  r   r   r   r   r    s   Y 

#	










6


+""C	$r  c                   @   s  e Zd Zedd dd ddZdd ZeZej	Z
dd	 Zeed
dZdddZdd ZdddZdddZddededdfddZedd ZdddZdd d!Zdd"d#Zd$d% Zdd&d'Zd(d) Zdd*d+Zd,d- Zdd.d/Zd	d0d1Zd2d3 Zd4d5 Z d6d7 Z!d
d9d:Z"ede#fd;d<Z$ede#fd=d>Z%d?e&dd@fdAdBZ'dddCdDZ(dddEdFZ)		d	@ddGdHZ*		d	@ddIdJZ+dKedd@fdLdMZ,dKedd@fdNdOZ-dd?e&dQe.dRe.dd@fdSdTZ/dUe&dVe&dd@fdWdXZ0dYe1dd@fdZd[Z2dYe1dd@fd\d]Z3ddKed^edd@fd_d`Z4dae1dd@fdbdcZ5			d	d?e&dde6j7dee.dfe8dge8dRe8dd@fdhdiZ9	8			d
dKedQe.dje:dke8dle;dme;dne;doedpedd@fdqdrZ<			sddQe8dke8dje:doedte;dme;due=dd@fdvdwZ>dxdy Z?dzd{ Z@d|d} ZAd~d ZBdeCde8fddZDde1fddZEdd ZFdd ZGde6jHe.ef dd@fddZIdeJdd@fddZKdd ZLdddZMdd ZNdd ZOdd ZPdd ZQdd ZRdddZSdd ZTdd ZUeeUddZVedd ZWedd ZXdd ZYdd ZZedd Z[edd Z\dd Z]edd Z^edd Z_edd Z`edd Zadd Zbdd Zcdd Zddd ZeddÄ Zfeddń ZgddǄ ZhddɄ Ziddd˄Zjddd̈́ZkdddЄZldd҄ Zm		dddքZndd؄ Zoeddڄ Zpdd܄ Zqdeddfdd߄Zredd Zsdd ZtdddZudddZvdddZwdd Zxdd Zdd Zydd Zzedd Z{dd Z|dd Z}dddZ~dddZdd Zdd Zed d ZdS (  r  c                 C   r  r'   r  rj  r   r   r   r9  g  r  zPage.<lambda>c                 C   r  r'   r  r  r   r   r   r9  g  r  r  r  c                 O   r   NzNo constructor definedr   r   r|   kwargsr   r   r   r   i  r   zPage.__init__c                 C      t |  t| }t|}|S )zGet page rectangle.)rb  r   Z
Page_boundr   r  r   r   r   boundn  s   
z
Page.boundzpage rectangler   c                    s  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r8td }n' fdd|| jdD }t|dkrT|d }n|g kr\td	td
  |d }	|	dksn|dkrz
| j||dd W S    | Y S t|  |}
t|
s|S |
D ]R}|d |d krqt|d }|j}|dkr|} |}
|
S tt|j|j}t|j|j }t|j|j }td| ddd| dd}||  }||f} |}
|
S |}
|
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   r  z!need item of full page image listc                    s   g | ]
} |d  kr|qS )r   r   r   r   r   r   r   r     r:  z'Page.get_image_bbox.<locals>.<listcomp>Tr   zbad image namez!found multiple images named '%s'.)r   )rb  r  r  r  rt   r   rf   r   re  r   rg  r  r  rs   Zget_image_rectsr   ZPage_get_image_bboxr   r  rL   rD   rl  rm  r   rj  rk  )r   r   r   r  Zinf_rectZnull_matr\  r  Zimglistr  r  r   r}  r  Zhmr   r  Zm0r   r   r:  r   get_image_bboxy  sb   

	
zPage.get_image_bboxc                 C      t |  t| ||S )zRun page through a device.)rb  r   ZPage_run)r   dwr   r   r   r   run     zPage.runNc                 C   r_   r'   )r   ZPage_extend_textpage)r   Ztpager  rN   r   r   r   extend_textpage  re   zPage.extend_textpagec                 C   s   t | |||}d|_|S NT)r   ZPage__get_textpager   )r   r  r  rN   r  r   r   r   _get_textpage  s   zPage._get_textpager  r  rn  TextPagec              	   C   s   t |  |d u rtdd}| j}|dkr| d z| j|||d}W |dkr,| | n|dkr7| | w w t| |_|S )Nr   r   )r  rN   )rb  rf   r  r  rC  r  r  r  )r   r  r  rN   r  Ztextpager   r   r   get_textpage  s    


zPage.get_textpagec                 C   r:   )zPage language.)r   ZPage_languager   r   r   r   rX       
zPage.languagec                 C      t |  t| |S )zSet PDF page default language.)rb  r   ZPage_set_languagerY  r   r   r   rZ       zPage.set_languager   c                 C   r=  )zMake SVG image from page.)rb  r   ZPage_get_svg_image)r   rN   Ztext_as_pathr   r   r   get_svg_image  r@  zPage.get_svg_imagec                 C   s~   |dkr|dkr|d krd S t tt|dd }|dkrd}t tt|dd }|dkr0d}d||f }t| ||||S )Nr   r   rd  rc  zfitzca%02i%02i)rg  ry   r   r   ZPage__set_opacity)r   ZgstateCAca	blendmodeZtCAZtcar   r   r   _set_opacity  s   zPage._set_opacityc                 C   rC   r'   )r   ZPage__add_caret_annot)r   rY   r   r   r   _add_caret_annot  rE   zPage._add_caret_annotc              	   C   r  r'   )r   ZPage__add_redact_annot)r   r$  ra   da_stralignfillr  r   r   r   _add_redact_annot  r.   zPage._add_redact_annotc                 C   r=   r'   )r   ZPage__add_line_annot)r   rq  rr  r   r   r   _add_line_annot  rB   zPage._add_line_annotc                 C   r_   r'   )r   ZPage__add_text_annot)r   rY   ra   iconr   r   r   _add_text_annot
  re   zPage._add_text_annotc                 C   rC   r'   )r   ZPage__add_ink_annot)r   re  r   r   r   _add_ink_annot  rE   zPage._add_ink_annotc                 C   r=   r'   )r   ZPage__add_stamp_annot)r   rL   stampr   r   r   _add_stamp_annot  rB   zPage._add_stamp_annotc              	   C   r  r'   )r   ZPage__add_file_annot)r   rY   r&  r  r'  r(  rT  r   r   r   _add_file_annot  r.   zPage._add_file_annotc                 C   sL   t |  | jjstdt| ||}|sd S t| |_|| jt	|< |S )Nr  )
rb  r  r  rt   r   ZPage__add_text_markerr  r  r  r  )r   rq  
annot_typer  r   r   r   _add_text_marker  s   zPage._add_text_markerc                 C   r=   r'   )r   ZPage__add_square_or_circle)r   rL   rZ  r   r   r   _add_square_or_circle&  rB   zPage._add_square_or_circlec                 C   r=   r'   )r   ZPage__add_multiline)r   pointsrZ  r   r   r   _add_multiline)  rB   zPage._add_multiliner  c
                 C   s  t | |||||||||	
}
|
 }|d}|dd }||| }|d |d  }|d |d  }|	dv r=||}}d||f }|d	 | }d }d
}t|d }|r\|d7 }d}t|d }|rm|d7 }d}d}|rs|rsd}|d kr|| | | d | d | }|
| |
S )N   BT   ETr   r   rl   r   )rY  i     0 0 %g %g re   
W
n
    rr      
   fro   s   1 w
   S   B)r   ZPage__add_freetext_annot_getAPfindrf  r:  _setAP)r   rL   ra   rc   rb   r  r  r  rP  rH  r  apBTETr  r   r  opebwidthfill_stringstroke_stringr   r   r   _add_freetext_annot,  s8   

 
zPage._add_freetext_annotc                 C      t t| S )zReflects page rotation.)rf   r  _rotate_matrixr   r   r   r   rotation_matrixN  r  zPage.rotation_matrixc                 C   rt  )zReflects page de-rotation.)rf   r  _derotate_matrixr   r   r   r   derotation_matrixS  r  zPage.derotation_matrixrY   struct Annot *c              	   C   N   t | }z| |}W |dkr| | n|dkr| | w w t| | |S )zAdd a 'Caret' annotation.r   )r  rN  r  r  )r   rY   r  r  r   r   r   add_caret_annotX  s   

zPage.add_caret_annotc                 C   .   |du rt | |||d}nt|}| |tS )zAdd a 'StrikeOut' annotation.Nr  r  r  )r  rr  r[  PDF_ANNOT_STRIKE_OUTr   rq  r  r  r  r}  r   r   r   add_strikeout_annotd     zPage.add_strikeout_annotc                 C   r|  )zAdd a 'Underline' annotation.Nr}  )r  rr  r[  PDF_ANNOT_UNDERLINEr  r   r   r   add_underline_annotm  r  zPage.add_underline_annotc                 C   r|  )zAdd a 'Squiggly' annotation.Nr}  )r  rr  r[  PDF_ANNOT_SQUIGGLYr  r   r   r   add_squiggly_annotv     zPage.add_squiggly_annotc                 C   r|  )zAdd a 'Highlight' annotation.Nr}  )r  rr  r[  PDF_ANNOT_HIGHLIGHTr  r   r   r   add_highlight_annot  r  zPage.add_highlight_annotrL   c              	   C   P   t | }z| |t}W |dkr| | n|dkr | | w w t| | |S )z&Add a 'Square' (rectangle) annotation.r   )r  r\  PDF_ANNOT_SQUAREr  r  r   rL   r  r  r   r   r   add_rect_annot     

zPage.add_rect_annotc              	   C   r  )z*Add a 'Circle' (ellipse, oval) annotation.r   )r  r\  PDF_ANNOT_CIRCLEr  r  r  r   r   r   add_circle_annot  r  zPage.add_circle_annotNotera   rT  c              	   C   sT   t | }z| j|||d}W |dkr| | n|dkr"| | w w t| | |S )z&Add a 'Text' (sticky note) annotation.)rT  r   )r  rU  r  r  )r   rY   ra   rT  r  r  r   r   r   add_text_annot  s   

zPage.add_text_annotrq  rr  c              	   C   P   t | }z| ||}W |dkr| | n|dkr | | w w t| | |S )zAdd a 'Line' annotation.r   )r  rS  r  r  )r   rq  rr  r  r  r   r   r   add_line_annot  r  zPage.add_line_annotr]  c              	   C   r  )zAdd a 'PolyLine' annotation.r   )r  r^  PDF_ANNOT_POLY_LINEr  r  r   r]  r  r  r   r   r   add_polyline_annot  r  zPage.add_polyline_annotc              	   C   r  )zAdd a 'Polygon' annotation.r   )r  r^  PDF_ANNOT_POLYGONr  r  r  r   r   r   add_polygon_annot  r  zPage.add_polygon_annotrW  c              	   C   r  )z$Add a ('rubber') 'Stamp' annotation.r   )r  rX  r  r  )r   rL   rW  r  r  r   r   r   add_stamp_annot  r  zPage.add_stamp_annothandwritingc              	   C   rz  )znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )r  rV  r  r  )r   r  r  r  r   r   r   add_ink_annot  s   

zPage.add_ink_annotr&  r  r'  r(  c           	   	   C   sZ   t | }z| j||||||d}W |dkr| | n|dkr%| | w w t| | |S )z"Add a 'FileAttachment' annotation.)r'  r(  rT  r   )r  rY  r  r  )	r   rY   r&  r  r'  r(  rT  r  r  r   r   r   add_file_annot  s"   

zPage.add_file_annotrc   rb   r  r  r  rP  rH  c
                 C   s`   t | }
z| j|||||||||	d	}W |
dkr| |
 n|
dkr(| |
 w w t| | |S )zAdd a 'FreeText' annotation.)rc   rb   r  r  r  rP  rH  r   )r  rs  r  r  )r   rL   ra   rc   rb   r  r  r  rP  rH  r  r  r   r   r   add_freetext_annot  s   


zPage.add_freetext_annotTrQ  	cross_outc	              	   C   s~  d}	|rWt | t | |sd}|sd}|sd}t|dr"|||f}t|dkr.|dd }d}
|
j|||d}	|du r?d	}|rWt|drK|||f}t|dkrW|dd }t| }z| j|||	||d
}W |dkrp| | n|dkr{| | w w t| | |r| 	 dd }|\}}}}}|
| |
| |
| |
| |
| |
d d|}||d |S )zAdd a 'Redact' annotation.Nr  r  r  rj   rl   r  r  r   r   r   )ra   rO  rP  rQ  r   r  rg  re  )r  r   rs   r  r  rR  r  r  ri  r  r  r8  rk  )r   r$  ra   rb   rc   rP  rQ  r  r  rO  r  r  r  ap_tabr   LLLRURULrl  r   r   r   add_redact_annot  s^   













zPage.add_redact_annotc                 C   r=   r'   )r   ZPage__load_annotr   r   r  r   r   r   _load_annotK  rB   zPage._load_annotc                 C   sV   t |  t| |}|s|S d|_t| |_|| jt|< t	 }t
|| |}|S )zLoad a widget by its xref.T)rb  r   ZPage_load_widgetr   r  r  r  r  r  r  r  _fill_widget)r   r  r  widgetr   r   r   load_widgetN  s   zPage.load_widgetc                 C   r:   r'   )r   ZPage__get_resource_propertiesr   r   r   r   _get_resource_propertiesc  r<   zPage._get_resource_propertiesc                 C   r=   r'   )r   ZPage__set_resource_propertyr  r   r   r   _set_resource_propertyf  rB   zPage._set_resource_propertyr.  c           	      C   s   |d ks|dkr
d S | j }|j|dd}d|v s d|v s tdi }|  D ]\}}|||< q&|| v r9|| S d}d| }|| v rS|d7 }d| }|| v sE| || |S )	Nr   Tr  	/Type/OCG
/Type/OCMDzbad optional content: 'oc'zMC%ir   )r  r  rt   r  r  r  r  )	r   r.  r  checkpropsrT   r   r   Zmcr   r   r   _get_optional_contenti  s&   
zPage._get_optional_contentc                 C   sX   g }|   D ]#\}}| jj|dd}d|v rd}nd|v r d}nq||||f q|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  Zocgr  Zocmd)r  r  Z
xrefObjectr  )r   r\  Zpnamer  ra   Zoctyper   r   r   get_oc_items}  s   zPage.get_oc_itemsc                 C      t |  t| S )z/List of names of annotations, fields and links.)rb  r   ZPage_annot_namesr   r   r   r   annot_names     
zPage.annot_namesc                 C   r  )z6List of xref numbers of annotations, fields and links.)rb  r   ZPage_annot_xrefsr   r   r   r   annot_xrefs  r  zPage.annot_xrefsidentc                 C   st   t |  t|tu rd}|}nt|tu r|}d}ntd| ||}|s(|S d|_t| |_	|| 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 string or integerT)rb  r   r   rg  rt   r  r   r  r  r  r  r  )r   r  r  r   r  r   r   r   
load_annot  s   zPage.load_annotr  c                 C   sv   t |  | j}|jstd|  | |j|j}|sdS d|_t	
| |_|| jt|< |j|_||_|  |S )zAdd a 'Widget' (form field).r  NT)rb  r  r  rt   r  
_addWidgetr  r  r   r  r  r  r  r  r  )r   r  r  r  r   r   r   
add_widget  s   zPage.add_widgetc                 C   r=   r'   )r   ZPage__addWidget)r   r  r  r   r   r   r    rB   zPage._addWidgetc                 C   s   t |  t| |}d|_|S )zjMake a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.T)rb  r   ZPage_get_displaylistr   )r   r  r  r   r   r   get_displaylist  s   zPage.get_displaylistc              
   C   s
  ddddddgfddd	d
df
}|   }g }|D ]i}| }t|d |d< |d }g }|D ]:}|d }	|dd }
|	dkrIdt|
d |
d f}n|	dkrVdt|
d f}nt|	gdd |
D  }|| q-||d< |D ]\}}|||||< qn|| qd}|S )a  Get page drawings paths.

        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.
        )Z	closePathF)rQ  N)r  N)r)  r   ZlineCapr   )ZlineJoinr   )dashesz[] 0)Zstroke_opacityr   )Zfill_opacityr   )Zeven_oddTrL   r  r   Nr  Zquc                 S   r  r   r   r9  r   r   r   r     r   z%Page.get_drawings.<locals>.<listcomp>)get_cdrawingsr*   r   r  r   r  r  )r   Zallkeysr  pathsr  npathr  Znewitemsr  cmdrestr  r   r   r   r   get_drawings  s6   	zPage.get_drawingsc                 C   @   t |  | j}|dkr| d t| }|dkr| | |S )z$Extract drawing paths from the page.r   )rb  r  r  r   ZPage_get_cdrawingsr   r  r  r   r   r   r    s   


zPage.get_cdrawingsc                 C   r  r   )rb  r  r  r   ZPage_get_bboxlogr  r   r   r   get_bboxlog     


zPage.get_bboxlogc                 C   r  r   )rb  r  r  r   ZPage_get_texttracer  r   r   r   get_texttrace*  r  zPage.get_texttracec                 G   s   t j| g|R  S r'   )r   ZPage__apply_redactionsr   r   r   r   _apply_redactions;  r   zPage._apply_redactionsc              	   C   r  r'   )r   ZPage__makePixmap)r   r  ctmcsalphar  r  r   r   r   _makePixmap>  r.   zPage._makePixmapc                 C   rG  )zSet the MediaBox.)rb  r   ZPage_set_mediaboxr   rL   r   r   r   set_mediaboxA  rH  zPage.set_mediaboxc                 C   s|   t |  t| }|r<d|_t| |_|| jt|< | jj	r6dd | 
 D d }|d |_|d |_|S d|_d|_|S )zGet first Link.Tc                 S   s   g | ]
}|d  t kr|qS r   PDF_ANNOT_LINKr   r   r   r   r   r   S  r:  z#Page.load_links.<locals>.<listcomp>r   r   r   )rb  r   ZPage_load_linksr   r  r  r  r  r  r  r  r  )r   r  link_idr   r   r   
load_linksH  s   


zPage.load_linkszFirst link on pagec                 C   s:   t |  t| }|rd|_t| |_|| jt|< |S )zFirst annotation.T)	rb  r   ZPage_first_annotr   r  r  r  r  r  r  r   r   r   first_annot^  s   
zPage.first_annotc                 C   sP   t |  t| }|r&d|_t| |_|| jt|< t	 }t
|| |}|S )zFirst widget/field.T)rb  r   ZPage_first_widgetr   r  r  r  r  r  r  r  r  r   r  r  r   r   r   first_widgetn  s   
zPage.first_widgetc                 C   sR   t |  t| |}|d dkrdS z|d }| j| }|  W |S    Y |S )zDelete a Link.r  r   Nr  )rb  r   ZPage_delete_linkr  r  )r   Zlinkdictr  ZlinkidZlinkobjr   r   r   delete_link  s   

zPage.delete_linkc                 C   sN   t |  t | t| |}|r!d|_t| |_||jjt|< |	  |S )z!Delete annot and return next one.T)
rb  r   ZPage_delete_annotr   r  r  r  r  r  r  )r   r  r  r   r   r   delete_annot  s   zPage.delete_annotc                 C   "   t |  t| }tt|}|S )zThe MediaBox.)rb  r   ZPage_mediaboxr   ro  r  r   r   r   mediabox     
zPage.mediaboxc                 C   r  )zThe CropBox.)rb  r   ZPage_cropboxr   ro  r  r   r   r   cropbox  r  zPage.cropboxc                 C   rC   r'   )r   ZPage__other_box)r   boxtyper   r   r   
_other_box  rE   zPage._other_boxc                 C   rv  r'   )r  r   r   r   r   r   cropbox_position  rc  zPage.cropbox_positionc                 C   H   |  d}|dkr| jS | j}t|d |j|d  |d |j|d  S )z
The ArtBoxArtBoxNr   rl   r   r   r  r  r  r   r   r   rL   mbr   r   r   artbox  
   
*zPage.artboxc                 C   r  )zThe TrimBoxTrimBoxNr   rl   r   r   r  r  r   r   r   trimbox  r  zPage.trimboxc                 C   r  )zThe BleedBoxBleedBoxNr   rl   r   r   r  r  r   r   r   bleedbox  r  zPage.bleedboxc                 C   s   | j }|d krtd|jstdd}||vrtd| j}t|d |j|d  |d |j|d  }tt|}|js@|jrDtd	||vrLtd
|	| j
|dt|  d S )Nr`  r  )CropBoxr  r  r  zbad boxtyper   rl   r   r   zrect is infinite or emptyzrect not in mediabox[%g %g %g %g])r  rt   r  r  r   r   ro  r  r  r  r  r   )r   r  rL   r  Zvalid_boxesr  r   r   r   _set_pagebox  s    *zPage._set_pageboxc                 C      |  d|S )z,Set the CropBox. Will also change Page.rect.r  r  r  r   r   r   set_cropbox  r6  zPage.set_cropboxc                 C   r  )zSet the ArtBox.r  r  r  r   r   r   
set_artbox  r6  zPage.set_artboxc                 C   r  )zSet the BleedBox.r  r  r  r   r   r   set_bleedbox  r6  zPage.set_bleedboxc                 C   r  )zSet the TrimBox.r  r  r  r   r   r   set_trimbox  r6  zPage.set_trimboxc                 C   r  )zPage rotation.)rb  r   ZPage_rotationr   r   r   r   r        
zPage.rotationc                 C   rG  )zSet page rotation.)rb  r   ZPage_set_rotation)r   r  r   r   r   r  	  rH  zPage.set_rotationc                 C   rG  )z&Add links from list of object sources.)rb  r   ZPage__addAnnot_FromString)r   Zlinklistr   r   r   _addAnnot_FromString  rH  zPage._addAnnot_FromStringc                 C   s&   t |  |s| js|   t| |S )z%Clean page /Contents into one object.)rb  
is_wrappedwrap_contentsr   ZPage_clean_contentsr   sanitizer   r   r   clean_contents  s   
zPage.clean_contentsc	           	      C   s   t | ||||||||	S r'   )r   ZPage__show_pdf_page)	r   Z
fz_srcpageoverlayrN   r  r.  r  Zgraftmap_imgnamer   r   r   _show_pdf_page   s   zPage._show_pdf_pager  c                 C   s(   t | |||||||||	|
|||||S r'   )r   ZPage__insert_image)r   r  Zpixmapr  Zimaskr  r  rH  Zkeep_proportionr.  r)  r*  r  r  r  digestsr   r   r   _insert_image#  s   (zPage._insert_imagec                 C   s   | j }|| }|} d S r'   )r  r  )r   r  r  r   r   r   refresh&  s   
zPage.refreshr  Fc                 C   s  | j }|d u rtdd}|dr|dd  }t| |}	|	d ur3|	d }
t||
r,|
S ||
 |
S t| d }d}d}g d}g d}z	|	|}d}W n   Y |dk rgz	|	|}d}W n   Y | t
 v rydd l}||}~|d krt|tu r|}nt|drt|}nt|d	r|j}ntd
d }| ||||||||||
}|s|S |d }
|d }t||
r|
S |j|
|d |
S )Nr`  r   r  r   r  )r  r  r  r  )r  r  r  r   r  r   zbad fontfile)fontdict)r  rt   r  rv  rx  Zget_char_widthsr  r  r  r.  fitz_fontdescriptorsr  pymupdf_fontsmyfontr   r   r   r   _insertFont)r   rb   r  r  
set_simplewmoderd   r  r!  r  r  r  serifZ
CJK_numberZ
CJK_list_nZ
CJK_list_sr  Zfontfile_strr  r  r   r   r   insert_font,  sj   










zPage.insert_fontc                 C   s   t | |||||||||	|
S r'   )r   ZPage__insertFont)r   rb   r  r  r  r  r!  r  r	  rd   r1  r   r   r   r  z  r   zPage._insertFontc                 C   sF   t |  t| }| jd dkrt|}|S tddddd| jj}|S )zPage transformation matrix.r   r   r   r  )rb  r   ZPage_transformation_matrixr  rf   r  r*  r  r   r   r   transformation_matrix|  s   
zPage.transformation_matrixc                 C   r  )zGet xrefs of /Contents objects.)rb  r   ZPage_get_contentsr   r   r   r   get_contents  r  zPage.get_contentsr  c                 C   sn   t |  | j}|jrtd|jstd|td| vr"td||s+td|| j	dd|  dS )	z-Set object at 'xref' as the page's /Contents.r  r  r   zbad xrefzxref is no streamZContentsz%i 0 RN)
rb  r  r  rt   r  ry  r  r  r  r  )r   r  r  r   r   r   set_contents  s   
zPage.set_contentsc                 C   sT   t | ddrdS |   }|g krd| _dS |d dks#|d dkr%dS d| _dS )z9Check if /Contents is wrapped with string pair "q" / "Q".was_wrappedFTr      qr     Q)r   read_contentsr  r  )r   contr   r   r   r    s   zPage.is_wrappedc                 C   s0   | j rd S t| dd t| dd d| _d S )N   q
Fs   
QT)r  r  _insert_contentsr  r   r   r   r   r    s
   
zPage.wrap_contentsc                 c   s2    |   }|D ]}|du s|d |v r|V  q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.
        Nr	  )Z	get_links)r   kindsZ	all_linkslinkr   r   r   r    s   z
Page.linksc                 #   sj    t ttf tds fdd|  D }n fdd|  D }|D ]}| |}d|_|V  q%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                    s    g | ]}|d   vr|d qS r   r   r   r   rH   )
skip_typesr   r   r     r5  zPage.annots.<locals>.<listcomp>c                    s,   g | ]}|d  v r|d   vr|d qS r  r   r  r  typesr   r   r     r  TN)r  PDF_ANNOT_POPUPPDF_ANNOT_WIDGETr   r  r  Z_yielded)r   r  r  r  r  r   r  r   r    s   


zPage.annotsc                 c   sD    dd |   D }|D ]}| |}|dks|j|v r|V  q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                 S       g | ]}|d  t kr|d qS r  )r  r  r   r   r   r     r5  z Page.widgets.<locals>.<listcomp>N)r  r  r  )r   r  Zwidget_xrefsr  r  r   r   r   widgets  s   
zPage.widgetsc                 C   L   t |  | jj}| jjd urd| jjf }|dkrd| jj }d| j|f S Nz<memory, doc# %i>r   z<new PDF, doc# %i>zpage %s of %srb  r  r   r  r  r  rB  r   r   r   __str__     zPage.__str__c                 C   r   r!  r"  rB  r   r   r   r
     r$  zPage.__repr__c                 C   r  )z*Remove an annot from reference dictionary.N)r  r  )r   r  Zaidr   r   r   _forget_annot  r  zPage._forget_annotc                 C   s*   | j  D ]}|r|  q| j   dS )z,Invalidate / delete all annots of this page.N)r  r  r  r  r  r   r   r   _reset_annot_refs  s
   zPage._reset_annot_refsc                 C      t |  | j| jS )zPDF xref number of page.)rb  r  r  r  r   r   r   r   r  	  s   z	Page.xrefc                 C   sN   |    d | _z| j|  W n   Y t| ddr| |  d | _d | _d S r!  )r&  Z_image_infosr  r  r   r  r  r   r   r   r   r    s   

zPage._erasec                 C   r$  r'   r  r   r   r   r   r    rE   zPage.__del__c                 C      t |  | jj| j|dS )z)List of fonts defined in the page object.r  )rb  r  r  r  r   r  r   r   r   ru        zPage.get_fontsc                 C   r)  )z*List of images defined in the page object.r*  )rb  r  r  r  r+  r   r   r   
get_images&  r,  zPage.get_imagesc                 C   r'  )z,List of xobjects defined in the page object.)rb  r  r  r  r   r   r   r   get_xobjects,  s   zPage.get_xobjectsc                 C   r:   )z7All /Contents streams concatenated to one bytes object.)r  _get_all_contentsr   r   r   r   r  2  rD  zPage.read_contentsc                 C   s   t | jj| jjS r'   )r   r  r   r   r   r   r   r   mediabox_size7  r  zPage.mediabox_sizer(  r   N)Nr   Nr'   )Nr   )Nr   r   Nr)  r'  )r  NNNNr   r   r&  )rn  ry  )r  )NNr  r   NNTr  )r   r   N)r   Nr   r   NNN)NNNNNr   r   r   r   r   r   r   r  NN)r  NNFr   r   r*  )r   r   r1   r   r   r   r   r
   r   Zdelete_Pager  r8  rL   r<  r?  rA  rC  r6   rg  rE  rX  rZ  rI  rM  rN  rR  rS  rU  rV  rX  rY  r[  r\  r^  rs  rf   rv  rx  r5   r{  r  r  r  r  r  r  r   r  r  re  r  r  r  r  r+  r/  r.  r  rv   OptSeqr  r   r  r  r  r  r  r2  r  r  r  r  r,  r  r  r  r  r  r  r  r  r  r  r  r  r  Z
first_linkr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r
  r  r  r  r  r  r  r  r  r  r#  r%  r&  r  r  r  ru  r-  r.  r  r0  r   r   r   r   r  f  sr   	B
"		





5'


	






	N

		
c                   @   s
  e Zd Zedd dd ddZeZejZ	dd Z
dd	 Zd
d Zdd Zdd Zdd Zdd ZdkddZdd ZdlddZdmddZdnd!d"Zd#d$ Zdod%d&Zd'd( Zd)d* Zdod+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zed7d8 Z ed9d: Z!dpd<d=Z"dod>d?Z#ed@dA Z$edBdC Z%edDdE Z&edFdG Z'edHdI Z(edJdK Z)edLdM Z*edNdO Z+edPdQ Z,edRdS Z-edTdU Z.edVdW Z/edXdY Z0edZd[ Z1ed\d] Z2ed^e3fd_d`Z4e(Z5e)Z6dadb Z7dcdd Zdedf Z8dgdh Z9didj Z:dS )qPixmapc                 C   r  r'   r  rj  r   r   r   r9  @  r  zPixmap.<lambda>c                 C   r  r'   r  r  r   r   r   r9  @  r  r  r  c                 G   s   t | t j|  dS )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=True) - copy adding / dropping alpha.
        Pixmap(source, mask) - from a non-alpha and a mask pixmap.
        Pixmap(file) - from an image file.
        Pixmap(memory) - from an image in memory (bytes).
        Pixmap(colorspace, width, height, samples, alpha) - from samples data.
        Pixmap(PDFdoc, xref) - from an image xref in a PDF document.
        N)r   ZPixmap_swiginitZ
new_Pixmapr   r   r   r   r   D  s   zPixmap.__init__c                 C   s&   t |  |jstdt| |||S )z!Return pixmap from a warped quad.zquad must be convex)rd  rs  rt   r   ZPixmap_warp)r   r$  r)  r*  r   r   r   warpR  s   zPixmap.warpc                 C   rG  )zoDivide width and height by 2**factor.
                E.g. factor=1 shrinks to 25% of original size (in place).)rd  r   ZPixmap_shrink)r   factorr   r   r   shrink[     zPixmap.shrinkc                 C   rG  )z=Apply correction with some float.
        gamma=1 is a no-op.)rd  r   ZPixmap_gamma_with)r   gammar   r   r   
gamma_withc  r7  zPixmap.gamma_withc                 C   s4   t |  | jr| jjdkrtd dS t| ||S )z/Tint colors with modifiers for black and white.rl   z(warning: colorspace invalid for functionN)rd  
colorspacenr  r   ZPixmap_tint_with)r   blackwhiter   r   r   	tint_withk  s
   zPixmap.tint_withc                 G   s   t |  tj| g|R  S )z*Fill all color components with same value.)rd  r   ZPixmap_clear_withr   r   r   r   
clear_withu     zPixmap.clear_withc                 C   r=  )zCopy bbox from another Pixmap.)rd  r   ZPixmap_copy)r   r   r  r   r   r   r*   |  r@  zPixmap.copyNr   c                 C      t |  t| ||||S )a  Set alpha channel to values contained in a byte array.
        If None, all alphas are 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.
        )rd  r   ZPixmap_set_alpha)r   ZalphavaluesZpremultiplyopaqueZmatter   r   r   	set_alpha  s   
zPixmap.set_alphac                 C   rC   r'   )r   ZPixmap__tobytesr   r  r   r   r   _tobytes  rE   zPixmap._tobytespngc                 C   s   t |  ddddddddddd
}|| d}| jr&|dv r&td	| | jr9| jjdkr9|d
v r9td| | |}|S )a%  Convert to binary image stream of desired type.

        Can be used as input to GUI packages like tkinter.

        Args:
            output: (str) image type, default is PNG. Others are PNM, PGM, PPM,
                    PBM, PAM, PSD, PS.
        Returns:
            Bytes object.
        r   r   rl   r   r   rh   
rF  ZpnmZpgmppmZpbmZpamZtgaZtpicZpsdZpsr   rh   '%s' cannot have alphar   r   r   unsupported colorspace for '%s')rd  r  r  r  rt   r:  r;  rE  )r   outputvalid_formatsr!  Zbarrayr   r   r   tobytes  s   

zPixmap.tobytesc                 C      t |  t| |||S r'   )rd  r   ZPixmap_pdfocr_save)r   r  r  rX  r   r   r   pdfocr_save     zPixmap.pdfocr_saveTengc                 C   s>   t stdt|  ddlm} | }| j|||d | 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.
        Notes:
            On failure, make sure Tesseract is installed and you have set the
            environment variable "TESSDATA_PREFIX" to the folder containing your
            Tesseract's language support data.
        z'No OCR support: TESSDATA_PREFIX not setr   r  )r  rX  )r4   rc  rd  r  r  rQ  r  )r   r  rX  r  r  r   r   r   pdfocr_tobytes  s   zPixmap.pdfocr_tobytesc                 C   r=   r'   )r   ZPixmap__writeIMG)r   r  r  r   r   r   	_writeIMG  rB   zPixmap._writeIMGc                 C   s   t |  ddddddddddd
}t|tu rnt|dr"t|}nt|d	r*|j}|d
u r<tj|\}}|dd
 }||	 d}| j
rQ|dv rQtd| | jrd| jjdkrd|dv rdtd| | ||S )zOutput as image in format determined by filename extension.

        Args:
            output: (str) only use to overrule filename extension. Default is PNG.
                    Others are PNM, PGM, PPM, PBM, PAM, PSD, PS.
        r   r   rl   r   r   rh   rG  r  r   NrI  rJ  rK  rL  )rd  r   r   r   r   r  r  splitextr  r  r  rt   r:  r;  rU  )r   r  rM  rN  r   r  r!  r   r   r   r    s(   



zPixmap.savec                 O   s   t |  zddlm} W n ty   td  w | j}|du r#d}n |jdkr2| jdkr/dnd}n|jdkrA| jdkr>d	nd
}nd}||| j	| j
f| j}d| vr]| j| jf|d< |j|i | dS )zWrite to image file using Pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of save when other output formats are desired.
        r   )ImagezPIL/Pillow not instralledNLr   ZLArl   RGBZRGBACMYKdpi)rd  ZPILrW  ImportErrorr  r:  r;  r  	frombytesr)  r*  samplesr  xresyresr  )r   r|   r6  rW  Zcspacemoder  r   r   r   pil_save  s&   

zPixmap.pil_savec                 O   s:   t |  ddlm} | }| j|g|R i | | S )zConvert to binary image stream using pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of 'tobytes' when other output formats are needed.
        r   r  )rd  r  r  rb  r  )r   r|   r6  r  Z	bytes_outr   r   r   pil_tobytes  s
   zPixmap.pil_tobytesc                 C   rC   )z Invert the colors inside a bbox.)r   ZPixmap_invert_irect)r   r  r   r   r   invert_irect     zPixmap.invert_irectc                 C   r=  )zKGet color tuple of pixel (x, y).
        Includes alpha byte if applicable.)rd  r   ZPixmap_pixelr   r   r   r   r   r   pixel  s   zPixmap.pixelc                 C   rP  )zSet color of pixel (x, y).)rd  r   ZPixmap_set_pixel)r   r   r   r  r   r   r   	set_pixel$  rR  zPixmap.set_pixelc                 C   r=  )zSet top-left coordinates.)rd  r   ZPixmap_set_originrf  r   r   r   
set_origin+  r@  zPixmap.set_originc                 C   r=  )z"Set resolution in both dimensions.)rd  r   ZPixmap_set_dpi)r   r_  r`  r   r   r   set_dpi2  r@  zPixmap.set_dpic                 C   r=  )z Set color of all pixels in bbox.)rd  r   ZPixmap_set_rect)r   r  r  r   r   r   set_rect9  r@  zPixmap.set_rectc                 C   r  )zCheck if pixmap is monochrome.)rd  r   ZPixmap_is_monochromer   r   r   r   is_monochrome?  r  zPixmap.is_monochromec                 C   r  )z#Check if pixmap has only one color.)rd  r   ZPixmap_is_unicolorr   r   r   r   is_unicolorG  r  zPixmap.is_unicolorr   c                 C   r=  )zReturn count of each color.)rd  r   ZPixmap_color_count)r   colorsr  r   r   r   color_countP  r@  zPixmap.color_countc                 C   sP   t |  d}d}| jd|d D ]\}}||7 }||kr!|}|}q|| |fS )z/Return most frequent color and its usage ratio.r   T)rn  r  )rd  ro  r  )r   r  Z	allpixelsZcntrg  countZmaxpixelr   r   r   color_topusageW  s   zPixmap.color_topusagec                 C   r  )zMD5 digest of pixmap (bytes).)rd  r   ZPixmap_digestr   r   r   r   digestd  r  zPixmap.digestc                 C   r  )z%Length of one image line (width * n).)rd  r   ZPixmap_strider   r   r   r   stridel  r  zPixmap.stridec                 C   r  )zResolution in x direction.)rd  r   ZPixmap_xresr   r   r   r   r_  t  r  zPixmap.xresc                 C   r  )zResolution in y direction.)rd  r   ZPixmap_yresr   r   r   r   r`  |  r  zPixmap.yresc                 C   r  )z
The width.)rd  r   ZPixmap_wr   r   r   r   r    r  zPixmap.wc                 C   r  )zThe height.)rd  r   ZPixmap_hr   r   r   r   r     r  zPixmap.hc                 C   r  )zx component of Pixmap origin.)rd  r   ZPixmap_xr   r   r   r   r     r  zPixmap.xc                 C   r  )zy component of Pixmap origin.)rd  r   ZPixmap_yr   r   r   r   r     r  zPixmap.yc                 C   r  )zThe size of one pixel.)rd  r   ZPixmap_nr   r   r   r   r;    r  zPixmap.nc                 C   r  )z$Indicates presence of alpha channel.)rd  r   ZPixmap_alphar   r   r   r   r    r  zPixmap.alphac                 C   r  )zPixmap Colorspace.)rd  r   ZPixmap_colorspacer   r   r   r   r:    r  zPixmap.colorspacec                 C   r7  )zPixmap bbox - an IRect object.)rd  r   ZPixmap_irectr5  r  r   r   r   rb       
zPixmap.irectc                 C   r  )zPixmap size.)rd  r   ZPixmap_sizer   r   r   r   r[    r  zPixmap.sizec                 C   r  )zPixmap samples memoryview.)rd  r   ZPixmap_samples_mvr   r   r   r   
samples_mv  r  zPixmap.samples_mvc                 C   r  )zPixmap samples pointer.)rd  r   ZPixmap_samples_ptrr   r   r   r   samples_ptr  r  zPixmap.samples_ptrrn  c                 C   s
   t | jS r'   )r  ru  r   r   r   r   r^    rD  zPixmap.samplesc                 C   r  r'   )r[  r   r   r   r   r     r  zPixmap.__len__c                 C   sF   t |  t| turd S | jrd| jj| j| jf S dd| j| jf S )NzPixmap(%s, %s, %s)r  )rd  r   r3  r:  r   rb  r  r   r   r   r   r
     s
   zPixmap.__repr__c                 C   r"  r'   r   r   r   r   r   r#    r   zPixmap.__enter__c                 G   s   t | ddr| |  d S d S r!  )r   r  r   r   r   r   r%    s   zPixmap.__exit__c                 C   .   t | turd S t| ddr| |  d S d S r!  )r   r3  r   r  r   r   r   r   r    
   zPixmap.__del__)Nr   NN)rF  r   N)TrS  r'   r1  );r   r   r1   r   r   r   r
   r   Zdelete_Pixmapr  r   r4  r6  r9  r>  r?  r*   rC  rE  rO  rQ  rT  rU  r  rb  rc  rd  rg  rh  ri  rj  rk  rl  rm  ro  rq  rr  rs  r_  r`  r  r   r   r   r;  r  r:  rb  r[  ru  rv  r  r^  r)  r*  r   r#  r%  r  r   r   r   r   r3  ?  s    	






















	


r3  c                   @   s\   e Zd Zedd dd ddZeZejZ	dd Z
edd	 Zd
d Zedd Zdd ZdS )
Colorspacec                 C   r  r'   r  rj  r   r   r   r9    r  zColorspace.<lambda>c                 C   r  r'   r  r  r   r   r   r9    r  r  r  c                 C   s   t | t | dS )z!Supported are GRAY, RGB and CMYK.N)r   ZColorspace_swiginitZnew_Colorspace)r   r   r   r   r   r   	  r%  zColorspace.__init__c                 C   r:   )zSize of one pixel.)r   ZColorspace_nr   r   r   r   r;    rF  zColorspace.nc                 C   r:   r'   )r   ZColorspace__namer   r   r   r   _name  r<   zColorspace._namec                 C   s>   | j dkr	t S | j dkrt S | j dkrt S |  S )zName of the Colorspace.r   rl   r   )r;  csGRAYr{  csRGBcsCMYKr   r   r   r   r     s   


zColorspace.namec                 C   s   d| j  }d|| jf S )N)r   ZGRAYr   rY  rZ  zColorspace(CS_%s) - %s)r;  r   rB  r   r   r   r
   $  s   
zColorspace.__repr__N)r   r   r1   r   r   r   r
   r   Zdelete_Colorspacer  r   r;  r{  r   r   r   r   r   rz    s    

rz  c                   @   s4   e Zd Zedd dd ddZeZdd Zej	Z
dS )	Devicec                 C   r  r'   r  rj  r   r   r   r9  -  r  zDevice.<lambda>c                 C   r  r'   r  r  r   r   r   r9  -  r  r  r  c                 G   s   t | t j|  d S r'   )r   ZDevice_swiginitZ
new_Devicer   r   r   r   r   0  r.   zDevice.__init__N)r   r   r1   r   r   r   r
   r   r   Zdelete_Devicer  r   r   r   r   r  ,  s
    
r  c                   @   s   e Zd Zedd dd ddZdd ZeZedd	 Zed
d Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd ZejZdS )Outlinec                 C   r  r'   r  rj  r   r   r   r9  8  r  zOutline.<lambda>c                 C   r  r'   r  r  r   r   r   r9  8  r  r  r  c                 O   r   r3  r4  r5  r   r   r   r   :  r   zOutline.__init__c                 C   r:   r'   )r   ZOutline_urir   r   r   r   r  =     
zOutline.uric                 C   r:   r'   )r   ZOutline_nextr   r   r   r   r  A  r  zOutline.nextc                 C   r:   r'   )r   ZOutline_downr   r   r   r   r  E  r  zOutline.downc                 C   r:   r'   )r   ZOutline_is_externalr   r   r   r   r  I  r  zOutline.is_externalc                 C   r:   r'   )r   ZOutline_pager   r   r   r   r  M  r  zOutline.pagec                 C   r:   r'   )r   Z	Outline_xr   r   r   r   r   Q  r  z	Outline.xc                 C   r:   r'   )r   Z	Outline_yr   r   r   r   r   U  r  z	Outline.yc                 C   r:   r'   )r   ZOutline_titler   r   r   r   r  Y  r  zOutline.titlec                 C   r:   r'   )r   ZOutline_is_openr   r   r   r   is_open]  r  zOutline.is_openc                 C   s
   t | dS )zoutline destination detailsN)r  r   r   r   r   r  b  r  zOutline.destN)r   r   r1   r   r   r   r   r
   r  r  r  r  r  r   r   r  r  r  r   Zdelete_Outliner  r   r   r   r   r  7  s2    










r  c                   @   s  e Zd Zedd dd ddZdd ZeZej	Z
edd	 Zed
d Zedd Zdd Zedd Zedd Zdd Zdd Zedd Zdd Zdd Zdd Zed d! Zed"d# Zd$d% Zed&d' Zed(d) Zdd+d,Zed-d. Zdd0d1Zd2d3 Zdd4d5Z d6d7 Z!dd8d9Z"d:d; Z#d<d= Z$dd>d?Z%ed@dA Z&edBdC Z'edDdE Z(ddGdHZ)	/	/	*	/	/	/	/	I	FddJe*dKe+dLe,dMe*dNe-dOe-dPe-dQe.dRe/fdSdTZ0ddUdVZ1edWdX Z2dYdZ Z3ed[d\ Z4ed]d^ Z5d_d` Z6edadb Z7dcdd Z8dedf Z9ddgdhZ:edidj Z;ddkdlZ<edmdn Z=ddodpZ>edqdr Z?ddtduZ@dvdw ZAdxdy ZBedzd{ ZCdd|d}ZDd~d ZEdd ZFdd Zdd ZGd/S )r  c                 C   r  r'   r  rj  r   r   r   r9  m  r  zAnnot.<lambda>c                 C   r  r'   r  r  r   r   r   r9  m  r  r  r  c                 O   r   r3  r4  r5  r   r   r   r   o  r   zAnnot.__init__c                 C   s*   t |  t| }t|}|| jj9 }|S )zannotation rectangle)rb  r   Z
Annot_rectr   r  rx  r  r   r   r   rL   s  s
   
z
Annot.rectc                 C   r  )zannotation xref)rb  r   Z
Annot_xrefr   r   r   r   r    r  z
Annot.xrefc                 C   r  )zannotation IRT xref)rb  r   ZAnnot_irt_xrefr   r   r   r   irt_xref  r  zAnnot.irt_xrefc                 C   rG  )zSet annotation IRT xref)rb  r   ZAnnot_set_irt_xrefr  r   r   r   set_irt_xref  rH  zAnnot.set_irt_xrefc                 C   r7  )zannotation appearance matrix)rb  r   ZAnnot_apn_matrixrf   r  r   r   r   
apn_matrix  rt  zAnnot.apn_matrixc                 C   2   t |  t| }t|| jj }|| jj9 }|S )zannotation appearance bbox)rb  r   ZAnnot_apn_bboxr   r  r  rx  r  r   r   r   apn_bbox  
   
zAnnot.apn_bboxc                 C   rG  )z!Set annotation appearance matrix.)rb  r   ZAnnot_set_apn_matrix)r   rN   r   r   r   set_apn_matrix  rH  zAnnot.set_apn_matrixc                 C   s4   t |  | j}|j}|j}|||  9 }t| |S )zSet annotation appearance bbox.)rb  r  rv  r  r   ZAnnot_set_apn_bbox)r   r  r  rotr   r   r   r   set_apn_bbox  s   zAnnot.set_apn_bboxc                 C   r  )zannotation BlendMode)rb  r   ZAnnot_blendmoder   r   r   r   rL    r  zAnnot.blendmodec                 C   rG  )zSet annotation BlendMode.)rb  r   ZAnnot_set_blendmode)r   
blend_moder   r   r   set_blendmode  rH  zAnnot.set_blendmodec                 C   r  )z*Get annotation optional content reference.)rb  r   ZAnnot_get_ocr   r   r   r   get_oc  r  zAnnot.get_occ                 C   rG  )z-Set 'open' status of annotation or its Popup.)rb  r   ZAnnot_set_open)r   r  r   r   r   set_open  rH  zAnnot.set_openc                 C   r  )z-Get 'open' status of annotation or its Popup.)rb  r   ZAnnot_is_openr   r   r   r   r    r  zAnnot.is_openc                 C   r  )z Check if annotation has a Popup.)rb  r   ZAnnot_has_popupr   r   r   r   	has_popup  r  zAnnot.has_popupc                 C   rG  )z.Create annotation 'Popup' or update rectangle.)rb  r   ZAnnot_set_popupr  r   r   r   	set_popup  rH  zAnnot.set_popupc                 C   r  )zannotation 'Popup' rectangle)rb  r   ZAnnot_popup_rectr   r  r  rx  r  r   r   r   
popup_rect  r  zAnnot.popup_rectc                 C   r  )zannotation 'Popup' xref)rb  r   ZAnnot_popup_xrefr   r   r   r   
popup_xref  r  zAnnot.popup_xrefr   c                 C   rG  )z Set / remove annotation OC xref.)rb  r   ZAnnot_set_oc)r   r.  r   r   r   set_oc  rH  zAnnot.set_occ                 C   r:   )zannotation language)r   ZAnnot_languager   r   r   r   rX    rF  zAnnot.languageNc                 C   rG  )zSet annotation language.)rb  r   ZAnnot_set_languagerY  r   r   r   rZ    rH  zAnnot.set_languagec                 C   r:   r'   )r   ZAnnot__getAPr   r   r   r   ri  $  r<   zAnnot._getAPc                 C   r=   r'   )r   ZAnnot__setAP)r   r&  rL   r   r   r   rk  '  rB   zAnnot._setAPc                 C   sZ   t | }|s	|S | j|d< t| \}}}||d< ||d< ||d< | jd }||d< |S )NrL   r  rb   rc   rQ  )r   ZAnnot__get_redact_valuesrL   r  r  rn  )r   r  r  rb   rc   rQ  r   r   r   _get_redact_values*  s   


zAnnot._get_redact_valuesc                 C   r=  )zMake annotation TextPage.)rb  r   ZAnnot_get_textpage)r   r  r  r   r   r   rE  <  r@  zAnnot.get_textpagec                 C   rG  )zSet /Name (icon) of annotation.)rb  r   ZAnnot_set_namer  r   r   r   set_nameC  rH  zAnnot.set_namec                 C   rG  )zSet annotation rectangle.)rb  r   ZAnnot_set_rectr  r   r   r   rk  J  rH  zAnnot.set_rectc                 C   rG  )zSet annotation rotation.)rb  r   ZAnnot_set_rotation)r   rH  r   r   r   r  Q  rH  zAnnot.set_rotationc                 C   r  )zannotation rotation)rb  r   ZAnnot_rotationr   r   r   r   r  W  r  zAnnot.rotationc                 C   r  )zannotation vertex points)rb  r   ZAnnot_verticesr   r   r   r   vertices_  r  zAnnot.verticesc                 C   r  )zColor definitions.)rb  r   ZAnnot_colorsr   r   r   r   rn  g  r  zAnnot.colorsr  c                 C   s   t | ||||S r'   )r   ZAnnot__update_appearance)r   opacityr  r  rH  r   r   r   _update_appearancep  r   zAnnot._update_appearanceTr  r  rc   rb   r  r  r  r  rH  c
           >      C   sj  t |  dd }
| jd }| jd }| jd }| jd }|dkr#|}n| jd }d}| j}|	d	krU|	dk r=|	d
7 }	|	dk s5|	d
krI|	d
8 }	|	d
ksA|tkrU|	d dkrUd}	|du r\| j}t|dsd| j}d|  krndk ssn |durvd}nd}|tkrt	| t	| t	| t
| \}}}d}|dkrd}d}|dur|}d}|dur|}d}|dkr|}d}|rd}t|dkrd}nt|dkrd}nt|dkrd}|j|||d}t
| | | j||||	d}|dkrtd|
|d}|
|d}| jj}| }|rddtt| d }|d }nd}| jr"| j\}} nd!\}} |  }!|! }"d}#|tkr|red}#|"dd	 }"|"\}$}%}&}'}(|"|& |"|% |"|' |"|% |"|( |"d" |dkso|d#krd}#|dkr{d$| gng })|"D ]!}*|*d%rq|*d&r|d#kr|dd	 }*|)|* q|)}"d'|"}!|tkr=|!d(}+|!d)d* },|!|+|, }!| jj| jj }-}.|	d+v s|j!|j"  krdksn |.|-}-}.d,|-|.f }/|/d- |! }!d}0|
|d}1|1rd.}0|
|d}2|2r|dkrd"}0d/| }nd# }}2|1r|2rd0}0|0dkr.||1 |2 |/ d' |0 d' |! }!|dkr;|d' |! }!d}d}#|t#t$fv rd'|"dd	 d' }!d}#|d#krl|t#krb|!| d1 }!n|t$krk|!d" }!n|t#krv|!d2 }!n	|t$kr|!d" }!|dur||! }!|!%d3d4d}!d}#|r|d |! }!d}#d5|! d6 }!||  dkr1|t#t$fv r1dt
j&t
j't
j(t
j)t
j*t
j+t
j,t
j-t
j.f
}3t/dt|3}4d*t0d| jd  }5| j|5 |5 |5|5f }d}#| j1}6||4v rt2|6d | }7t2|6d | }8|3| | |7|8d|}9|!|9 7 }!| |4v r1t2|6d7 | }7t2|6d	 | }8|3|  | |7|8d|}9|!|9 7 }!|#rK|rD| 3| | j4|!dd8 n| j4|!dd8 |t5t6t7t8t9t$t#t:t;t<f
vr\dS | j=}:|:d	krfdS | jj>| jj? d* };|:dkrt@|tAdd d9k rdS | jB|;| }<| 3|<j | CtAdd dS tA|:}=| jB|;|=}<| 3|<j | C||=  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.
        c                 S   s   t | |}|s	dS |d  S )zHReturn valid PDF color operator for a given color sequence.
            rd  
)rf  r:  )r  codeccr   r   r   color_string  s   
z"Annot.update.<locals>.color_stringr   r  r)  strokeNrQ  r  r   rY  rj   r   /H gs
r   Frk   Trl   r  r  r   r  r  )r  r  r  rH  zError updating annotation.rr   ro   [ z] 0 d
utf-8rO  rg  rd  s   %g w   ws   RGre  r_  r`  r   )rY  ra  rb  rc  rf  s   %g w
rh     b   ss   
S
s
   
S
[] 0 d
r  s   
Q
r  rK   gh㈵>)Drb  r   borderrn  r  PDF_ANNOT_FREE_TEXTrL  r   r  r  r  r  rs   r  
_update_dar  rc  r  r  r8  ru   r   r:  	line_endsri  r  PDF_ANNOT_REDACTr  r7  rj  rL   r)  r*  rn   ro   r  r  r  
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashry  r   r  r   rk  rk  PDF_ANNOT_CARETr  PDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_LINEr  PDF_ANNOT_STAMPPDF_ANNOT_TEXTr  r   r#  r   rf   r2  r  )>r   r  r  rc   rb   r  r  r  r  rH  r  rZ  dtrp  r  rQ  rL   ZapnmatZopa_codeZtcolfnamer  Zupdate_default_appearancerO  r  r  ZbfillZbstrokeZp_ctmZimatr  Zline_end_leZline_end_rirl  r  Z
ap_updatedr   r  r  r  r  Zntabr  rm  rn  r  r   r  ro  rq  rr  Zle_funcsZle_funcs_rangerp   r]  rq  rr  leftr  Mr$  r   r   r   r   r  s  s  

















(




 













zAnnot.updatec                 C   s  t |  | jj}t|tur||d}|d}|d}ttttt	t
f}|g dfv r4|| jdd n:|durnt|drBt|g}t| t|d	krSd
|d  }nt|dkr`dt| }ndt| }|| jd| |r| jd |vrtd| jd	   dS |g dfv r|| jdd dS |durt|drt|g}t| t|d	krd
|d  }nt|dkrdt| }ndt| }|| jd| dS dS )z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        rQ  r  rQ  r  r   r?   []Nrj   r   [%g]r   rl   
[%g %g %g]r  z0Warning: fill color ignored for annot type '%s'.ZIC)rb  r  r   r  r  r  r  r  r  r  r  r  r  r   rv   r  rs   r   r  )r   rn  r  rQ  r  Zfill_annotsr~   r   r   r   
set_colors  sJ   







zAnnot.set_colorsc                 C   r  )zLine end codes.)rb  r   ZAnnot_line_endsr   r   r   r   r    r  zAnnot.line_endsc                 C   r=  )zSet line end codes.)rb  r   ZAnnot_set_line_ends)r   r  endr   r   r   set_line_ends  r@  zAnnot.set_line_endsc                 C   r  )zannotation type)rb  r   Z
Annot_typer   r   r   r   r     r  z
Annot.typec                 C   r  )zOpacity.)rb  r   ZAnnot_opacityr   r   r   r   r    r  zAnnot.opacityc                 C   rG  )zSet opacity.)rb  r   ZAnnot_set_opacity)r   r  r   r   r   set_opacity  rH  zAnnot.set_opacityc                 C   r  )zAttached file information.)rb  r   ZAnnot_file_infor   r   r   r   	file_info  r  zAnnot.file_infoc                 C   r  )zRetrieve attached file content.)rb  r   ZAnnot_get_filer   r   r   r   get_file  r  zAnnot.get_filec                 C   r  )zRetrieve sound stream.)rb  r   ZAnnot_get_soundr   r   r   r   	get_sound  r  zAnnot.get_soundc                 C   rA  )zUpdate attached file.)rb  r   ZAnnot_update_file)r   r&  r  r'  r(  r   r   r   update_file  r@  zAnnot.update_filec                 C   r  )zVarious information details.)rb  r   Z
Annot_infor   r   r   r   ry     r  z
Annot.infoc              	   C   sj   t |  t|tu r*|dd}|dd}|dd}|dd}|dd}d}t| ||||||S )zSet various properties.contentNr  r5  r7  r  )rb  r   r  r  r   ZAnnot_set_info)r   ry  r  r  r5  r7  r  r   r   r   set_info	  s   zAnnot.set_infoc                 C   r  )zBorder information.)rb  r   ZAnnot_borderr   r   r   r   r    r  zAnnot.borderc                 C   s2   t |  t|tur|||d}t| ||||S )z[Set border properties.

        Either a dict, or direct arguments width, style and dashes.r)  styler  )rb  r   r  r   ZAnnot_set_border)r   r  r)  r  r  r   r   r   
set_border!  s   zAnnot.set_borderc                 C   r  )zFlags field.)rb  r   ZAnnot_flagsr   r   r   r   r  -  r  zAnnot.flagsr   c                 C   rG  )z!Clean appearance contents stream.)rb  r   ZAnnot_clean_contentsr  r   r   r   r  6  rH  zAnnot.clean_contentsc                 C   rG  )zSet annotation flags.)rb  r   ZAnnot_set_flags)r   r  r   r   r   	set_flags=  rH  zAnnot.set_flagsc                 C   r  )z*Delete 'Popup' and responding annotations.)rb  r   ZAnnot_delete_responsesr   r   r   r   delete_responsesD  r  zAnnot.delete_responsesc                 C   s`   t |  t| }|sdS d|_| j|_||jjt|< |jd tkr.t	 }t
|| |}|S )zNext annotation.NTr   )rb  r   Z
Annot_nextr   r  r  r  r   r  r  r  r  r  r   r   r   r  J  s   
z
Annot.nextc                 C   sr   t |  tttd}t|tu r|| d}|r#t|d |d }t	
| ||||}d|_|r7||| |S )zannotation Pixmap)grayrgbZcmykNr@  T)rb  r|  r}  r~  r   r   r  r  rf   r   ZAnnot_get_pixmapr   rj  )r   rN   r[  r:  r  Zcspacesr  r   r   r   
get_pixmapa  s   zAnnot.get_pixmapc                 C   s2   z| j |  W n   Y d S | |  d | _ d S r'   r  r%  r  r   r   r   r   r  v  s   

zAnnot._erasec                 C       t |  d| jd t| jf S Nz'%s' annotation on %sr   rb  r   r   r  r   r   r   r   r#  ~     zAnnot.__str__c                 C   r  r  r  r   r   r   r   r
     r  zAnnot.__repr__c                 C   s   | j d u rd S |   d S r'   )r  r  r   r   r   r   r    s   
zAnnot.__del__r(  r'   r   )r  NNr  )	NNr   NNNNTr  r'  r&  )NNNNNNNr   NNr  )NNNr   )Hr   r   r1   r   r   r   r   r
   r   Zdelete_Annotr  rL   r  r  r  r  r  r  r  rL  r  r  r  r  r  r  r  r  r  rX  rZ  ri  rk  r  rE  r  rk  r  r  r  rn  r  r.  OptFloatrv   r2  r   rg  r  r  r  r  r   r  r  r  r  r  r  ry  r  r  r  r  r  r  r  r  r  r  r#  r  r   r   r   r   r  l  s    



	















	
  
 ,












c                   @   s   e Zd Zedd dd ddZdd ZeZej	Z
dd	 Zd
d Zdd Zedd ZedefddZdd Zd0ddZedd Zd1ddZedd Zedd  Zd!Zed"d# Zed$d% Zed&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZdS )2Linkc                 C   r  r'   r  rj  r   r   r   r9    r  zLink.<lambda>c                 C   r  r'   r  r  r   r   r   r9    r  r  r  c                 O   r   r3  r4  r5  r   r   r   r     r   zLink.__init__c                 C   r=   r'   )r   ZLink__borderr   r  r  r   r   r   _border  rB   zLink._borderc                 C   r_   r'   )r   ZLink__setBorder)r   r  r  r  r   r   r   
_setBorder  re   zLink._setBorderc                 C   r=   r'   )r   ZLink__colorsr  r   r   r   _colors  rB   zLink._colorsc                 C      |  | jjj| jS r'   )r  r  r	   r  r   r   r   r   r       zLink.borderrn  c                 C   sD   t |  | jj}|jsdS || jd}|d dkr t|d S dS )Nr   r  r   r  )rb  r  r  r  r  rg  r  r   r   r   r    s   z
Link.flagsc                 C   sJ   t |  | jj}|jstdt|turtd|| jdt| d S )Nr  zbad 'flags' valuer  )	rb  r  r  rt   r   rg  r  r  r   )r   r  r  r   r   r   r    s   zLink.set_flagsNr   c                 C   s.   t |tur|||d}| || jjj| jS )Nr  )r   r  r  r  r	   r  )r   r  r)  r  r  r   r   r   r    s   zLink.set_borderc                 C   r  r'   )r  r  r	   r  r   r   r   r   rn    r  zLink.colorsc                 C   s   t |  | jj}t|tur||d}|d}|d}|dur%td |g dfv r5|| jdd dS t|d	r?t	|g}t
| t|d
krPd|d  }nt|dkr]dt| }ndt| }|| jd| dS )zSet border colors.r  rQ  r  Nz!warning: links have no fill colorr   r?   r  rj   r   r  r   rl   r  r  )rb  r  r   r  r  r  r  r  r   rv   r  rs   r   )r   rn  r  rQ  r  r~   r   r   r   r    s(   




zLink.set_colorsc                 C   r  )zUri string.)rb  r   ZLink_urir   r   r   r   r    r  zLink.uric                 C   r  )zFlag the link as external.)rb  r   ZLink_is_externalr   r   r   r   r    r  zLink.is_externalr  c                 C   sn   t | dr| jdu r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  Nr`  r  r  )
r   r  rt   r  r  r  r  r  r[  r  )r   r  r  r   r   r   r    s   
z	Link.destc                 C   r7  )zRectangle ('hot area').)rb  r   Z	Link_rectr   r  r   r   r   rL     rt  z	Link.rectc                 C   s   t |  t| }|rOd|_| j|_||jjt|< | jdkrIdd | j D }dd | j D }|	| j}||d  |_||d  |_|S d|_d|_|S )z
Next link.Tr   c                 S   r  r  r  r  r   r   r   r      r5  zLink.next.<locals>.<listcomp>c                 S   r  )r   r   r  r  r   r   r   r      r5  r   r   )
rb  r   Z	Link_nextr   r  r  r  r  r  r.  )r   r  Z
link_xrefsZlink_idsr!  r   r   r   r     s    

z	Link.nextc                 C   s.   z| j |  W n   Y | |  d | _ d S r'   r  r   r   r   r   r      s   

zLink._erasec                 C      t |  dt| j S Nzlink on rb  r   r  r   r   r   r   r#  (      zLink.__str__c                 C   r  r  r  r   r   r   r   r
   ,   r  zLink.__repr__c                 C   r$  r'   r(  r   r   r   r   r  0   rE   zLink.__del__r  r'  )r   r   r1   r   r   r   r   r
   r   Zdelete_Linkr  r  r  r  r  rg  r  r  r  rn  r  r  r  r  r  rL   r  r  r#  r  r   r   r   r   r    s@    









	
r  c                   @   sd   e Zd Zedd dd ddZeZejZ	dd Z
dd	 Zed
d ZdddZdddZdd ZdS )DisplayListc                 C   r  r'   r  rj  r   r   r   r9  7   r  zDisplayList.<lambda>c                 C   r  r'   r  r  r   r   r   r9  7   r  r  r  c                 C      t | t | d S r'   )r   ZDisplayList_swiginitZnew_DisplayListr   r  r   r   r   r   ;   r.   zDisplayList.__init__c                 C   r_   r'   )r   ZDisplayList_run)r   r>  r   Zarear   r   r   r?  >   re   zDisplayList.runc                 C      t | }t|}|S r'   )r   ZDisplayList_rectr   r  r   r   r   rL   @      
zDisplayList.rectNr   c                 C   s   t | ||||}d|_|S rB  )r   ZDisplayList_get_pixmapr   )r   rN   r:  r  r  r  r   r   r   r  I   s   zDisplayList.get_pixmaprl   c                 C   s   t | |}d|_|S rB  )r   ZDisplayList_get_textpager   )r   r  r  r   r   r   rE  P   s   zDisplayList.get_textpagec                 C   rw  r!  )r   r  r   r  r   r   r   r   r  W   rx  zDisplayList.__del__)NNr   N)rl   )r   r   r1   r   r   r   r
   r   Zdelete_DisplayListr  r   r?  rL   r  rE  r  r   r   r   r   r  6   s    


r  c                   @   s  e Zd Zedd dd ddZeZejZ	dd Z
d5d
dZdd Zd6ddZd7ddZdd Zdd Zdd Zedd Zdd Zdd Zdd  Zd6d!efd"d#Zd!efd$d%Zd8d!efd'd(Zd8d!efd)d*Zd!efd+d,Zd!efd-d.Zd8d!efd/d0Zd8d!efd1d2Zd3d4 Z d&S )9rD  c                 C   r  r'   r  rj  r   r   r   r9  b   r  zTextPage.<lambda>c                 C   r  r'   r  r  r   r   r   r9  b   r  r  r  c                 C   s   t | t | d| _d S rB  )r   ZTextPage_swiginitZnew_TextPager   r  r   r   r   r   f   s   
zTextPage.__init__r   r   c           
      C   s   t | |||}|s|S t|}t|D ]}t|| }|r#|||< q|j||< q|r-|S d}||d k rd|| }||d  }	|j|	jksJ||	@ jrO|d7 }q/||	B ||< ||d = |d8 }||d k s5|S )z)Locate 'needle' returning rects or quads.r   r   )r   ZTextPage_searchrs   ry  r  rL   r   r  )
r   needleZhit_maxrq  r  r  r   r}  v1v2r   r   r   searchl   s.   

zTextPage.searchc                 C   r=   r'   )r   ZTextPage__getNewBlockList)r   	page_dictrawr   r   r   _getNewBlockList   rB   zTextPage._getNewBlockListFc                 C   s"   | j j| j jd}| || |S )N)r)  r*  )rL   r)  r*  r  )r   r  r  r   r   r   _textpage_dict   s   zTextPage._textpage_dictc                 C   rC   )z*Return a list with image meta information.)r   ZTextPage_extractIMGINFO)r   hashesr   r   r   extractIMGINFO   re  zTextPage.extractIMGINFOc                 C   r:   )z*Return a list with text block information.)r   ZTextPage_extractBLOCKSr   r   r   r   extractBLOCKS   r  zTextPage.extractBLOCKSc                 C   r:   )z)Return a list with text word information.)r   ZTextPage_extractWORDSr   r   r   r   extractWORDS   r  zTextPage.extractWORDSc                 C   r:   )zTextPage current poolsize.)r   ZTextPage_poolsizer   r   r   r   poolsize   r  zTextPage.poolsizec                 C   r  )zTextPage rectangle.)r   ZTextPage_rectr   r  r   r   r   rL      s   
zTextPage.rectc                 C   rC   r'   )r   ZTextPage__extractTextrD  r   r   r   _extractText   rE   zTextPage._extractTextc                 C   rC   r'   )r   ZTextPage_extractTextboxr  r   r   r   extractTextbox   rE   zTextPage.extractTextboxc                 C   r=   r'   )r   ZTextPage_extractSelection)r   ZpointaZpointbr   r   r   extractSelection   rB   zTextPage.extractSelectionrn  c                 C   sF   |du r	|  dS |  dd }|jdd d ddd	 |D S )
z%Return simple, bare text on the page.Fr   Nc                 S   s   | d | d fS )Nrl   r   r   rn   r   r   r   r9     s    z&TextPage.extractText.<locals>.<lambda>r  r   c                 S   s   g | ]}|d  qS )r   r   )r   rn   r   r   r   r      r   z(TextPage.extractText.<locals>.<listcomp>)r  r  r  r8  )r   r  r  r   r   r   extractText   s
   
zTextPage.extractTextc                 C   
   |  dS )z%Return page content as a HTML string.r   r  r   r   r   r   extractHTML   rD  zTextPage.extractHTMLNc                    s   ddl  ddl}| jdd}G  fddd|j}|dur'|j|d< |j|d< |d	u r;|d
 }|jdd d ||d
< |j|d|dd}|S )z.Return 'extractDICT' converted to JSON format.r   NFr  c                          e Zd Z fddZdS )z'TextPage.extractJSON.<locals>.b64encodec                    "   t |ttfv r | S d S r'   r   r  r&  	b64encoder  r   r  r   r   default      z/TextPage.extractJSON.<locals>.b64encode.defaultNr   r   r1   r  r   r  r   r   r         r  r)  r*  Tr  c                 S      | d d | d d fS Nr  rl   r   r   r  r   r   r   r9     r6  z&TextPage.extractJSON.<locals>.<lambda>r  ,:r   
separatorsr$   indentr  r  r  JSONEncoderr)  r*  r  dumpsr   cbr  r  r  r  r  r   r  r   extractJSON      

zTextPage.extractJSONc                    s   ddl  ddl}| jdd}G  fddd|j}|dur'|j|d< |j|d< |du r;|d	 }|jd
d d ||d	< |j|d|dd}|S )z1Return 'extractRAWDICT' converted to JSON format.r   NTr   c                       r  )z*TextPage.extractRAWJSON.<locals>.b64encodec                    r  r'   r  r   r  r   r   r     r  z2TextPage.extractRAWJSON.<locals>.b64encode.defaultNr  r   r  r   r   r     r	  r  r)  r*  r  c                 S   r
  r  r   r  r   r   r   r9     r6  z)TextPage.extractRAWJSON.<locals>.<lambda>r  r  r   r  r  r  r   r  r   extractRAWJSON   r  zTextPage.extractRAWJSONc                 C   r  )z$Return page content as a XML string.rl   r  r   r   r   r   
extractXML   rD  zTextPage.extractXMLc                 C   r  )z&Return page content as a XHTML string.r   r  r   r   r   r   extractXHTML   rD  zTextPage.extractXHTMLc                 C   sT   | j dd}|dur|j|d< |j|d< |du r(|d }|jdd	 d
 ||d< |S )z>Return page content as a Python dict of images and text spans.Fr   Nr)  r*  Tr  c                 S   r
  r  r   r  r   r   r   r9  !  r6  z&TextPage.extractDICT.<locals>.<lambda>r  r  r)  r*  r  r   r  r  r  r  r   r   r   extractDICT      

zTextPage.extractDICTc                 C   sT   | j dd}|dur|j|d< |j|d< |du r(|d }|jdd d	 ||d< |S )
zCReturn page content as a Python dict of images and text characters.Tr   Nr)  r*  r  c                 S   r
  r  r   r  r   r   r   r9  !  r6  z)TextPage.extractRAWDICT.<locals>.<lambda>r  r  r  r   r   r   extractRAWDICT!  r  zTextPage.extractRAWDICTc                 C   rw  r!  )r   rD  r   r  r   r   r   r   r  !  rx  zTextPage.__del__)r   r   r*  r(  )NF)!r   r   r1   r   r   r   r
   r   Zdelete_TextPager  r   r  r  r  r  r  r  r  rL   r  r  r  r   r  r  r  r  r  r  r  r  r   r  r   r   r   r   rD  a   s4    



	rD  c                   @   s<   e Zd Zedd dd ddZeZejZ	dd Z
dd	 Zd
S )r  c                 C   r  r'   r  rj  r   r   r   r9  !  r  zGraftmap.<lambda>c                 C   r  r'   r  r  r   r   r   r9  !  r  r  r  c                 C   r  r'   )r   ZGraftmap_swiginitZnew_Graftmap)r   r  r   r   r   r   "!  r.   zGraftmap.__init__c                 C   rw  r!  )r   r  r   r  r   r   r   r   r  %!  rx  zGraftmap.__del__N)r   r   r1   r   r   r   r
   r   Zdelete_Graftmapr  r   r  r   r   r   r   r  !  s    r  c                   @   st   e Zd Zedd dd ddZeZejZ	ddd	Z
dddZ	
	dddZdd Zedd ZdddZdd ZdS )
TextWriterc                 C   r  r'   r  rj  r   r   r   r9  0!  r  zTextWriter.<lambda>c                 C   r  r'   r  r  r   r   r   r9  0!  r  r  r  r   Nc                 C   s   t | t ||| || _|| _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   r  z'Position following last text insertion.zAccumulated area of text spans.TN)r   ZTextWriter_swiginitZnew_TextWriterr  r  r   rL   rf   r*  r  ictmr   
last_pointr2   	text_rectr!   
used_fontsr   )r   Z	page_rectr  r  r   r   r   r   4!  s   


zTextWriter.__init__r  r   c           	   
   C   s   t || j }|du rtd}|jstd|j |r)| |}dt|}d}t	
| |||||||}t |dd | j | _| j| j | _| j| jf}|jd dkr[| j| |S )	z8Store 'text' at point 'pos' using 'font' and 'fontsize'.Nr  zUnsupported font '%s'.r   r   r  r  r   )r   r"  r  is_writablert   r   	clean_rtlr8  r  r   ZTextWriter_appendr  r#  _bboxr$  r  r%  add)	r   posra   r  rc   rX  right_to_left
small_capsr  r   r   r   r  I!  s    
zTextWriter.appendFc           	   	   C   sB   |d }|D ]}| j ||||||d | j|7  _q| j| jfS )z#Append text in vertical write mode.g333333?)r  rc   rX  r,  )r  r   r$  r#  )	r   r*  ra   r  rc   rX  r,  Zlheightro   r   r   r   appendvd!  s   zTextWriter.appendvc                 C   s(  |s|S | d}g }tt|D ]%}|| }t|dk s6tdd |D dks6dt|||< || qg }tt|D ]M}|g krM|||  q?|| |d d kr{t|dkrut||d	 |d d  ||d	 |d d < || g}q?|| |d d kr|||  q?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                 S   r  r   r  r   r   r   r   r   !  r   z(TextWriter.clean_rtl.<locals>.<listcomp>r#  r   r  r   r   )r  ry  rs   r   r8  r  r  )r   ra   wordsr!  r   r  Zidx2r   r   r   r'  o!  s2   
"

zTextWriter.clean_rtlc                 C   r  r'   )r   ZTextWriter__bboxr   r  r   r   r   r(  !  r  zTextWriter._bboxr  c	                 C   s<  t | t| j|j dkrtd|dkr2t|ttfvs.t|d tus.t|d tur2td|dkr>|dkr>tdt	|dddu sJ|d	krM| j
}|du rT| j}t| ||||||||	}	|	d }
|	d }|
\}}| }||}|dkrd
| }d}nd }}dg}|r|| |j}t|r|d|j|jf  |r|d | j }tdd|j|j}| |d  | }|s|r|dt|  |D ]}|drq|dkr|| |d|  q|drt| d dd | }d| }nm|dr<| }t|d }|dkr|d }nd}|d|  t|d dd | }dd| g|dd  }n/|drL||dd n|dr\||dd  n|d!rk||d!d" || q|ry|| |d# d$|d%}tj |||d& d}	| j!D ]}t"|| q|	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'.
        rn  zincompatible page rectNr   r   z%morph must be (Point, Matrix) or Nonez$only one of matrix, morph is allowedrj   r  z/OC /%s BDCZEMCr   r}  z1 0 0 1 %g %g cmz%g %g %g %g %g %g cmz cmrm  z%i Trz gsr   z	/Alp%i gsz Tfg?z%g wr   r  z/F%iz rgr  ZRGz gz Gz kz KzQ
r  r  )r  )#rb  r   rL   rt   r   r   re  r   rf   r   r  r  r   ZTextWriter_write_textr  r  r  r  r   r   r   r"  r   rm  r7  rg  r  rv   r8  r  r:  r  r  r%  r  )r   r  r  r  r  r2  rN   Zrender_moder.  r  Zmax_numsr  Zmax_alpZmax_fontZold_cont_linesZoptcontZbdcZemcZnew_cont_linesr  rT   r|  r  Zalptempr  r  r  r   r   r   
write_text!  s   










zTextWriter.write_textc                 C   rw  r!  )r   r!  r   r  r   r   r   r   r  
"  rx  zTextWriter.__del__ry  )Nr  Nr   r   )Nr  NF)Nr  r   NNr   r   )r   r   r1   r   r   r   r
   r   Zdelete_TextWriterr  r   r  r-  r'  r(  r0  r  r   r   r   r   r!  /!  s    


.

dr!  c                   @   s(  e Zd Zedd dd ddZeZejZ	d:d	d
Z
d;ddZd<ddZd<ddZd=ddZd;ddZdd Zdd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z dS )>r  c                 C   r  r'   r  rj  r   r   r   r9  "  r  zFont.<lambda>c                 C   r  r'   r  r  r   r   r   r9  "  r  r  r  Nr   r  c
                 C   s   |r t |dr| }n
t|tu rt|}t|tur td|r\d|v s.d|v s.d|v r2td | dv r;d}n!| t	 v rPdd l
}
|
|}d }~
n|dk r\t| |}t| t|||||||||		 d	| _d S )
Nr  zbad type: 'fontbuffer'r  r-  r   z!Warning: did you mean a fontfile?)	r  r  r  r  r  r  r  r   Zcjkr   T)r   r  r   r&  r  rt   r  r  r  r  r  r  r  r  r   ZFont_swiginitZnew_Fontr   )r   rb   r  r  r  rX  r1  is_bold	is_italicis_serifr  r   r   r   r   "  s*   


"
zFont.__init__c                 C   r%  )z2Return the glyph width of a unicode (font size 1).)r   ZFont_glyph_advance)r   chrrX  r  r  r,  r   r   r   r  9"     zFont.glyph_advancer  c              	   C   r  )z1Return length of unicode 'text' under a fontsize.)r   ZFont_text_lengthr   ra   rc   rX  r  r  r,  r   r   r   text_length?"  r%  zFont.text_lengthc              	   C   r  )z@Return tuple of char lengths of unicode 'text' under a fontsize.)r   ZFont_char_lengthsr6  r   r   r   char_lengthsE"  r%  zFont.char_lengthsc                 C   s   t | ||||}t|}|S )z1Return the glyph bbox of a unicode (font size 1).)r   ZFont_glyph_bboxr   )r   r4  rX  r  r,  r  r   r   r   
glyph_bboxK"  s   zFont.glyph_bboxc                 C   r%  )z0Check whether font has a glyph for this unicode.)r   ZFont_has_glyph)r   r4  rX  r  fallbackr,  r   r   r   	has_glyphT"  r5  zFont.has_glyphc                 C   sL   ddl m } | j}|dd| }| }| | |dtt|dd  S )Nr   )r  r   r(  r   )r  glyph_countbuffer_info_valid_unicodessortedr!   )r   r  gcr  arrr   r   r   r  Z"  s   
zFont.valid_codepointsc                 C   rC   r'   )r   ZFont__valid_unicodes)r   rA  r   r   r   r>  c"  rE   zFont._valid_unicodesc                 C   r:   r'   )r   Z
Font_flagsr   r   r   r   r  e"  r  z
Font.flagsc                 C   r:   r'   )r   ZFont_is_boldr   r   r   r   r1  i"  r  zFont.is_boldc                 C   r:   r'   )r   ZFont_is_serifr   r   r   r   r3  m"  r  zFont.is_serifc                 C   r:   r'   )r   ZFont_is_italicr   r   r   r   r2  q"  r  zFont.is_italicc                 C   r:   r'   )r   ZFont_is_monospacedr   r   r   r   is_monospacedu"  r  zFont.is_monospacedc                 C   r:   r'   )r   ZFont_is_writabler   r   r   r   r&  y"  r  zFont.is_writablec                 C   r:   r'   )r   Z	Font_namer   r   r   r   r   }"  r  z	Font.namec                 C   r:   r'   )r   ZFont_glyph_countr   r   r   r   r<  "  r  zFont.glyph_countc                 C   r:   r'   )r   ZFont_bufferr   r   r   r   r&  "  r  zFont.bufferc                 C   r  r'   )r   Z	Font_bboxr   r  r   r   r   r  "  r  z	Font.bboxc                 C   r:   )z Return the glyph ascender value.)r   ZFont_ascenderr   r   r   r   ascender"  rF  zFont.ascenderc                 C   r:   )z!Return the glyph descender value.)r   ZFont_descenderr   r   r   r   	descender"  rF  zFont.descenderc                 C      t |S )z$Return the unicode for a glyph name.)r  r  r   r   r   r  "  rc  zFont.glyph_name_to_unicodec                 C   rE  )z$Return the glyph name for a unicode.)r  )r   r  r   r   r   r  "  rc  zFont.unicode_to_glyph_namec                 C   s
   d| j  S )Nz
Font('%s')r:  r   r   r   r   r
   "  r<   zFont.__repr__c                 C   rw  r!  )r   r  r   r  r   r   r   r   r  "  rx  zFont.__del__)	NNNr   Nr  r   r   r   )Nr   r   r   )r  Nr   r   r   )Nr   r   )!r   r   r1   r   r   r   r
   r   Zdelete_Fontr  r   r  r7  r8  r9  r;  r  r>  r  r1  r3  r2  rB  r&  r   r<  r&  r  rC  rD  r  r  r  r   r   r   r   r  "  sP    

 



		











c                   @   s  e Zd Zedd dd ddZeZdd Zdad	d
ZdbddZ	dbddZ
dbddZdbddZdbddZdd Zedd Zedd Zdd Zdd Zd d! Zdad"d#Zd$d% Zd&d' Zed(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zdcd9d:Zd;d< Z dcd=d>Z!d?d@ Z"dAdB Z#dbdCdDZ$dbdEdFZ%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2e3j4Z5dS )dToolsc                 C   r  r'   r  rj  r   r   r   r9  "  r  zTools.<lambda>c                 C   r  r'   r  r  r   r   r   r9  "  r  r  r  c                 C   r:   )z!Return a unique positive integer.)r   ZTools_gen_idr   r   r   r   r  "  r  zTools.gen_idr   c                 C   rC   )z!Set ICC color handling on or off.)r   ZTools_set_iccr   r  r   r   r   set_icc"  re  zTools.set_iccNc                 C   rC   )z$Get / set id prefix for annotations.)r   ZTools_set_annot_stem)r   stemr   r   r   set_annot_stem"  re  zTools.set_annot_stemc                 C   rC   )z Set / unset small glyph heights.)r   ZTools_set_small_glyph_heightsrG  r   r   r   set_small_glyph_heights"  re  zTools.set_small_glyph_heightsc                 C   rC   )z9Set / unset returning fontnames with their subset prefix.)r   ZTools_set_subset_fontnamesrG  r   r   r   set_subset_fontnames"  re  zTools.set_subset_fontnamesc                 C   rC   )z!Set / unset MuPDF device caching.)r   ZTools_set_low_memoryrG  r   r   r   set_low_memory"  re  zTools.set_low_memoryc                 C   rC   )z/Set ascender / descender corrections on or off.)r   ZTools_unset_quad_correctionsrG  r   r   r   unset_quad_corrections"  re  zTools.unset_quad_correctionsc                 C   rC   )z%Free 'percent' of current store size.)r   ZTools_store_shrink)r   percentr   r   r   store_shrink"  re  zTools.store_shrinkc                 C   r:   )zMuPDF current store size.)r   ZTools_store_sizer   r   r   r   
store_size"  rF  zTools.store_sizec                 C   r:   )zMuPDF store size limit.)r   ZTools_store_maxsizer   r   r   r   store_maxsize"  rF  zTools.store_maxsizec                 C   s*   t | }|d |d |d d}|}|S )zShow anti-aliasing values.r   r   r   )Zgraphicsra   Zgraphics_min_line_width)r   ZTools_show_aa_level)r   r  r/  r   r   r   show_aa_level"  s   
zTools.show_aa_levelc                 C   rC   )zSet anti-aliasing level.)r   ZTools_set_aa_level)r   levelr   r   r   set_aa_level#  re  zTools.set_aa_levelc                 C   rC   )z$Set the graphics minimum line width.)r   Z!Tools_set_graphics_min_line_width)r   Zmin_line_widthr   r   r   set_graphics_min_line_width#  re  z!Tools.set_graphics_min_line_widthc                 C   r=   )z#Metadata of an image binary stream.)r   ZTools_image_profile)r   r  Z
keep_imager   r   r   r  #  r  zTools.image_profilec                 C   rC   r'   )r   ZTools__rotate_matrixr  r   r   r   ru  #  rE   zTools._rotate_matrixc                 C   rC   r'   )r   ZTools__derotate_matrixr  r   r   r   rw  #  rE   zTools._derotate_matrixc                 C   r:   )z!PyMuPDF configuration parameters.)r   ZTools_fitz_configr   r   r   r   fitz_config#  rF  zTools.fitz_configc                 C   r:   )zEmpty the glyph cache.)r   ZTools_glyph_cache_emptyr   r   r   r   glyph_cache_empty!#  r  zTools.glyph_cache_emptyc                 C   sp   t | ||}t|j|_|j|_|j|_||_|jsd |_|js$d |_|j	s*d |_	|j
s0d |_
|js6d |_|S r'   )r   ZTools__fill_widgetr   rL   r  r  r  r  r  r  r  r  )r   r  r  r  r   r   r   r  '#  s    zTools._fill_widgetc                 C   r=   r'   )r   ZTools__save_widget)r   r  r  r   r   r   r  =#  rB   zTools._save_widgetc                 C   rC   r'   )r   ZTools__reset_widgetr  r   r   r   r  @#  rE   zTools._reset_widgetc           	      C   sr  t | |}|s
dS d}d}d}| }t|D ]\}}|dkrC||d  dd  }t||d  }d ||<  ||d < ||d < q|d	kr[t||d  g}d ||< ||d < q|d
krdd ||d | D }d ||<  ||d <  ||d < ||d < q|dkrdd ||d | D }d ||<  ||d <  ||d <  ||d < ||d < qq|||f}|S )N)r(  r   r   r  rk   r  r  r   r   r   r  r  c                 S   r  r   r  r  r   r   r   r   W#  r   z#Tools._parse_da.<locals>.<listcomp>rl   r  c                 S   r  r   r  r  r   r   r   r   [#  r   r   )r   ZTools__parse_dar  r  rv   )	r   r  r  r  r  r  r  r   r  r   r   r   r  C#  s8    ,8
zTools._parse_dac                 C   r=   r'   )r   ZTools__update_da)r   r  rO  r   r   r   r  e#  rB   zTools._update_dac                 C   rC   )z@Concatenate all /Contents objects of a page into a bytes object.)r   ZTools__get_all_contents)r   Zfzpager   r   r   r/  h#  re  zTools._get_all_contentsr   c                 C   r_   )zDAdd bytes as a new /Contents object for a page, and return its xref.)r   ZTools__insert_contents)r   r  Znewcontr  r   r   r   r  n#  r  zTools._insert_contentsc                 C   r:   )z"Get version of MuPDF binary build.)r   ZTools_mupdf_versionr   r   r   r   mupdf_versiont#  r  zTools.mupdf_versionc                 C   s&   t | |}d|}|r|   |S )z<Get the MuPDF warnings/errors with optional reset (default).r  )r   ZTools_mupdf_warningsr8  reset_mupdf_warnings)r   r  r  r   r   r   mupdf_warningsz#  s
   
zTools.mupdf_warningsc                 C   rC   r'   )r   ZTools__int_from_languagerY  r   r   r   _int_from_language#  rE   zTools._int_from_languagec                 C   r:   )z&Empty the MuPDF warnings/errors store.)r   ZTools_reset_mupdf_warningsr   r   r   r   rZ  #  r  zTools.reset_mupdf_warningsc                 C   rC   )z)Set MuPDF error display to True or False.)r   ZTools_mupdf_display_errorsrG  r   r   r   mupdf_display_errors#  re  zTools.mupdf_display_errorsc                 C   rC   )z,Set MuPDF warnings display to True or False.)r   ZTools_mupdf_display_warningsrG  r   r   r   mupdf_display_warnings#  re  zTools.mupdf_display_warningsc                 C   s   |j d }|jd }|sd}dtt|d }|r|}n|jd }|s&d}dtt|d }	|}
|}tt|
|}| }|
| }|| }d	|j  krQd
k rVn 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)  r  r  r  z RG
rQ  r  z rg
r   r   r  r   )r  rn  r8  ru   r   rf   rD   r  )r   r  rq  rr  r  r  scscolZfcfcolZnp1Znp2r   r[  rX  Rr  r   r   r   _le_annot_parms#  s*   


zTools._le_annot_parmsc                 C   s   dd }d}||| d  }||| d  }||| d  }	||| d  }
||| |  }||| |  }||| |  }|	||	 |  }|	||	 |  }|
||
 |  }|
||
 |  }||| |  }d|j |jf }|||||7 }|||||	7 }|||||
7 }|||||7 }|S )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                 S   s$   d}|| j | j|j |j|j |jf S )Nz%f %f %f %f %f %f c
r   )rT   r}  rU   rr   r   r   r   bezier#  s    z"Tools._oval_string.<locals>.bezierg7.SQ?r  z%f %f m
r   )r   rq  rr  p3Zp4rd  kappamlmomrmuZol1Zol2Zor1Zor2Zur1Zur2Zul1Zul2rl  r   r   r   _oval_string#  s(   zTools._oval_stringc                 C   sF  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }t||| | ||f }|j|j|j d  | }d||j|jf }|j|j|j d  | }|d|j|jf 7 }|j|j|j d  | }|d|j|jf 7 }|j|j|j d  | }|d|j|jf 7 }|d|
 7 }||| d	 7 }|S )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
              @r          @r   r  q
%s%f %f m
%f %f l
%g w
b
Q
)	rc  r   r   r   r"  r   r   r!  r#  r   r  rq  rr  rm  r  r   r[  rX  rb  r  r`  ra  r  shiftrp   r  rU   rT   rl  r   r   r   r  #  s     $zTools._le_diamondc                 C   s  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }t||| | ||f }|j| }d||j|jf }|j| }|d|j|jf 7 }|j| }|d|j|jf 7 }|j| }|d|j|jf 7 }|d|
 7 }||| d 7 }|S )	zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        rl  r   rm  r   rn  ro  rp  rq  )	rc  r   r   r   r   r   r!  r#  r"  rr  r   r   r   r  #  s     $



zTools._le_squarec                 C   s   |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }t||| | ||f }d| | |j| |j| |j| |j|  }|d|
 7 }||| d 7 }|S )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
        rl  r   rm  r   zq
rp  rq  )rc  r   r   rk  r   r!  r#  r"  )r   r  rq  rr  rm  r  r   r[  rX  rb  r  r`  ra  r  rs  rp   r  rU   rl  r   r   r   r  $  s    $0zTools._le_circlec                 C   s   |  ||||\}}}}	}
}}}d}|td|
 }|r|	n|}|d| d f | }|d|d f | }d||j|jf }|d|j|jf 7 }|d|
 7 }||d 7 }|S )	zaMake stream commands for butt line end symbol. "lr" denotes left (False) or right point.
        rl   r   r   rm  
q
%s%f %f m
ro  rp  s
Q
rc  r   r   r   )r   r  rq  rr  rm  r  r   r[  rX  rb  r  r`  ra  r  rs  rp   r  topbotrl  r   r   r   r  $  s    zTools._le_buttc                 C   s   |  ||||\}}}}	}
}}}dtd|
 d }|r|	n|}t|j| |jd|
  |j| |jd|
  }|j| }|j| }d||j|jf }|d|j|jf 7 }|d|
 7 }||d 7 }|S )	zbMake stream commands for slash line end symbol. "lr" denotes left (False) or right point.
        g(y?r   rm   r   rt  ro  rp  ru  )rc  r   r   r   r   r   r#  )r   r  rq  rr  rm  r  r   r[  rX  rb  r  r`  ra  r  rwr  rU   rw  rx  rl  r   r   r   r  "$  s    .

zTools._le_slashc                 C   s  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }|r6|d| | f n|d| | f }|rI|d| |f n|d| |f }||9 }||9 }||9 }d||j|jf }|d|j|jf 7 }|d|j|jf 7 }|d	|
 7 }||d
 7 }|S )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        rl  r   rm  r   r  r   rt  ro  rp  S
Q
rv  r   r  rq  rr  rm  r  r   r[  rX  rb  r  r`  ra  r  rs  rp   re  rl  r   r   r   r  1$  s    $($zTools._le_openarrowc                 C   s  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }|r6|d| | f n|d| | f }|rI|d| |f n|d| |f }||9 }||9 }||9 }d||j|jf }|d|j|jf 7 }|d|j|jf 7 }|d	|
 7 }||| d
 7 }|S )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        rl  r   rm  r   r  r   rt  ro  rp  rq  rv  r{  r   r   r   r  D$      $($zTools._le_closedarrowc                 C   s  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	|d df n||d df }|r6|d| | f n|d| | f }|rI|d| |f n|d| |f }||9 }||9 }||9 }d||j|jf }|d|j|jf 7 }|d|j|jf 7 }|d	|
 7 }||| d
 7 }|S )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        rl  r   g      @r   r   r  rt  ro  rp  rz  rv  r{  r   r   r   r  W$  r|  zTools._le_ropenarrowc                 C   s  |  ||||\}}}}	}
}}}d}|td|
 }|r#|	d| df n|d| df }|r6|d| | f n|d| | f }|rI|d| |f n|d| |f }||9 }||9 }||9 }d||j|jf }|d|j|jf 7 }|d|j|jf 7 }|d|
 7 }||| d	 7 }|S )
zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        rl  r   r   r   r  rt  ro  rp  rq  rv  r{  r   r   r   r  j$  r|  zTools._le_rclosedarrowc                 C   rw  r!  )r   rF  r   r  r   r   r   r   r  }$  rx  zTools.__del__c                 C   s   t | t   d S r'   )r   ZTools_swiginitZ	new_Toolsr   r   r   r   r   $  r  zTools.__init__r(  r'   r  )6r   r   r1   r   r   r   r
   r  rH  rJ  rK  rL  rM  rN  rP  rQ  rR  rS  rU  rV  r  ru  rw  rW  rX  r  r  r  r  r  r/  r  rY  r[  r\  rZ  r]  r^  rc  rk  r  r  r  r  r  r  r  r  r  r  r   r   Zdelete_Toolsr  r   r   r   r   rF  "  sf    









"



%
rF  )r  r  r   )r  r'  )r  r  r  r  rn  N)r  r   r   )r  r  r  r  rn  N(	  sysr   Z_swig_python_version_inforc  __package__r   r   r   builtinsr   r\  r   r#   r&   r/   r   r0   r  rw   r  r  hashlibr+  r8  r  environr  r4   r5   r6   r7   r8   Anyr1  r,  rg  r2  Optionalrv   r  r   r.  r  ZOptDictr/  r-  Sequencer2  r  r9   r*   r  ZVersionFitzZVersionBindZVersionDateversionr   r  r  r  r  r  r  r  r  r  r  r  r~  r  r  r  r  r  r  ZPDF_ANNOT_SOUNDZPDF_ANNOT_MOVIEZPDF_ANNOT_RICH_MEDIAr  ZPDF_ANNOT_SCREENZPDF_ANNOT_PRINTER_MARKZPDF_ANNOT_TRAP_NETZPDF_ANNOT_WATERMARKZPDF_ANNOT_3DZPDF_ANNOT_PROJECTIONZPDF_ANNOT_UNKNOWNZPDF_REDACT_IMAGE_NONEZPDF_REDACT_IMAGE_REMOVEZPDF_REDACT_IMAGE_PIXELSZPDF_ANNOT_IS_INVISIBLEZPDF_ANNOT_IS_HIDDENZPDF_ANNOT_IS_PRINTZPDF_ANNOT_IS_NO_ZOOMZPDF_ANNOT_IS_NO_ROTATEZPDF_ANNOT_IS_NO_VIEWZPDF_ANNOT_IS_READ_ONLYZPDF_ANNOT_IS_LOCKEDZPDF_ANNOT_IS_TOGGLE_NO_VIEWZPDF_ANNOT_IS_LOCKED_CONTENTSZPDF_ANNOT_LE_NONEZPDF_ANNOT_LE_SQUAREZPDF_ANNOT_LE_CIRCLEZPDF_ANNOT_LE_DIAMONDZPDF_ANNOT_LE_OPEN_ARROWZPDF_ANNOT_LE_CLOSED_ARROWZPDF_ANNOT_LE_BUTTZPDF_ANNOT_LE_R_OPEN_ARROWZPDF_ANNOT_LE_R_CLOSED_ARROWZPDF_ANNOT_LE_SLASHZPDF_WIDGET_TYPE_UNKNOWNr  r  ZPDF_WIDGET_TYPE_COMBOBOXZPDF_WIDGET_TYPE_LISTBOXr  ZPDF_WIDGET_TYPE_SIGNATUREZPDF_WIDGET_TYPE_TEXTZPDF_WIDGET_TX_FORMAT_NONEZPDF_WIDGET_TX_FORMAT_NUMBERZPDF_WIDGET_TX_FORMAT_SPECIALZPDF_WIDGET_TX_FORMAT_DATEZPDF_WIDGET_TX_FORMAT_TIMEZPDF_FIELD_IS_READ_ONLYZPDF_FIELD_IS_REQUIREDZPDF_FIELD_IS_NO_EXPORTZPDF_TX_FIELD_IS_MULTILINEZPDF_TX_FIELD_IS_PASSWORDZPDF_TX_FIELD_IS_FILE_SELECTZ"PDF_TX_FIELD_IS_DO_NOT_SPELL_CHECKZPDF_TX_FIELD_IS_DO_NOT_SCROLLZPDF_TX_FIELD_IS_COMBZPDF_TX_FIELD_IS_RICH_TEXTZ!PDF_BTN_FIELD_IS_NO_TOGGLE_TO_OFFZPDF_BTN_FIELD_IS_RADIOZPDF_BTN_FIELD_IS_PUSHBUTTONZ!PDF_BTN_FIELD_IS_RADIOS_IN_UNISONZPDF_CH_FIELD_IS_COMBOZPDF_CH_FIELD_IS_EDITZPDF_CH_FIELD_IS_SORTZPDF_CH_FIELD_IS_MULTI_SELECTZ"PDF_CH_FIELD_IS_DO_NOT_SPELL_CHECKZ$PDF_CH_FIELD_IS_COMMIT_ON_SEL_CHANGEZPDF_SIGNATURE_ERROR_OKAYZ!PDF_SIGNATURE_ERROR_NO_SIGNATURESZ"PDF_SIGNATURE_ERROR_NO_CERTIFICATEZ"PDF_SIGNATURE_ERROR_DIGEST_FAILUREZPDF_SIGNATURE_ERROR_SELF_SIGNEDZ(PDF_SIGNATURE_ERROR_SELF_SIGNED_IN_CHAINZPDF_SIGNATURE_ERROR_NOT_TRUSTEDZPDF_SIGNATURE_ERROR_UNKNOWNZPDF_SIGNATURE_SHOW_LABELSZPDF_SIGNATURE_SHOW_DNZPDF_SIGNATURE_SHOW_DATEZPDF_SIGNATURE_SHOW_TEXT_NAMEZPDF_SIGNATURE_SHOW_GRAPHIC_NAMEZPDF_SIGNATURE_SHOW_LOGOZ PDF_SIGNATURE_DEFAULT_APPEARANCEZCS_RGBZCS_GRAYZCS_CMYKr  ZPDF_ENCRYPT_NONEZPDF_ENCRYPT_RC4_40ZPDF_ENCRYPT_RC4_128ZPDF_ENCRYPT_AES_128ZPDF_ENCRYPT_AES_256ZPDF_ENCRYPT_UNKNOWNZPDF_PERM_PRINTZPDF_PERM_MODIFYZPDF_PERM_COPYZPDF_PERM_ANNOTATEZPDF_PERM_FORMZPDF_PERM_ACCESSIBILITYZPDF_PERM_ASSEMBLEZPDF_PERM_PRINT_HQZPDF_BM_ColorZPDF_BM_ColorBurnZPDF_BM_ColorDodgeZPDF_BM_DarkenZPDF_BM_DifferenceZPDF_BM_ExclusionZPDF_BM_HardLightZ
PDF_BM_HueZPDF_BM_LightenZPDF_BM_LuminosityZPDF_BM_MultiplyZPDF_BM_NormalZPDF_BM_OverlayZPDF_BM_SaturationZPDF_BM_ScreenZPDF_BM_SoftLightZTEXT_FONT_SUPERSCRIPTZTEXT_FONT_ITALICZTEXT_FONT_SERIFEDZTEXT_FONT_MONOSPACEDZTEXT_FONT_BOLDZUCDN_SCRIPT_COMMONZUCDN_SCRIPT_LATINZUCDN_SCRIPT_GREEKZUCDN_SCRIPT_CYRILLICZUCDN_SCRIPT_ARMENIANZUCDN_SCRIPT_HEBREWZUCDN_SCRIPT_ARABICZUCDN_SCRIPT_SYRIACZUCDN_SCRIPT_THAANAZUCDN_SCRIPT_DEVANAGARIZUCDN_SCRIPT_BENGALIZUCDN_SCRIPT_GURMUKHIZUCDN_SCRIPT_GUJARATIZUCDN_SCRIPT_ORIYAZUCDN_SCRIPT_TAMILZUCDN_SCRIPT_TELUGUZUCDN_SCRIPT_KANNADAZUCDN_SCRIPT_MALAYALAMZUCDN_SCRIPT_SINHALAZUCDN_SCRIPT_THAIZUCDN_SCRIPT_LAOZUCDN_SCRIPT_TIBETANZUCDN_SCRIPT_MYANMARZUCDN_SCRIPT_GEORGIANZUCDN_SCRIPT_HANGULZUCDN_SCRIPT_ETHIOPICZUCDN_SCRIPT_CHEROKEEZUCDN_SCRIPT_CANADIAN_ABORIGINALZUCDN_SCRIPT_OGHAMZUCDN_SCRIPT_RUNICZUCDN_SCRIPT_KHMERZUCDN_SCRIPT_MONGOLIANZUCDN_SCRIPT_HIRAGANAZUCDN_SCRIPT_KATAKANAZUCDN_SCRIPT_BOPOMOFOZUCDN_SCRIPT_HANZUCDN_SCRIPT_YIZUCDN_SCRIPT_OLD_ITALICZUCDN_SCRIPT_GOTHICZUCDN_SCRIPT_DESERETZUCDN_SCRIPT_INHERITEDZUCDN_SCRIPT_TAGALOGZUCDN_SCRIPT_HANUNOOZUCDN_SCRIPT_BUHIDZUCDN_SCRIPT_TAGBANWAZUCDN_SCRIPT_LIMBUZUCDN_SCRIPT_TAI_LEZUCDN_SCRIPT_LINEAR_BZUCDN_SCRIPT_UGARITICZUCDN_SCRIPT_SHAVIANZUCDN_SCRIPT_OSMANYAZUCDN_SCRIPT_CYPRIOTZUCDN_SCRIPT_BRAILLEZUCDN_SCRIPT_BUGINESEZUCDN_SCRIPT_COPTICZUCDN_SCRIPT_NEW_TAI_LUEZUCDN_SCRIPT_GLAGOLITICZUCDN_SCRIPT_TIFINAGHZUCDN_SCRIPT_SYLOTI_NAGRIZUCDN_SCRIPT_OLD_PERSIANZUCDN_SCRIPT_KHAROSHTHIZUCDN_SCRIPT_BALINESEZUCDN_SCRIPT_CUNEIFORMZUCDN_SCRIPT_PHOENICIANZUCDN_SCRIPT_PHAGS_PAZUCDN_SCRIPT_NKOZUCDN_SCRIPT_SUNDANESEZUCDN_SCRIPT_LEPCHAZUCDN_SCRIPT_OL_CHIKIZUCDN_SCRIPT_VAIZUCDN_SCRIPT_SAURASHTRAZUCDN_SCRIPT_KAYAH_LIZUCDN_SCRIPT_REJANGZUCDN_SCRIPT_LYCIANZUCDN_SCRIPT_CARIANZUCDN_SCRIPT_LYDIANZUCDN_SCRIPT_CHAMZUCDN_SCRIPT_TAI_THAMZUCDN_SCRIPT_TAI_VIETZUCDN_SCRIPT_AVESTANZ UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHSZUCDN_SCRIPT_SAMARITANZUCDN_SCRIPT_LISUZUCDN_SCRIPT_BAMUMZUCDN_SCRIPT_JAVANESEZUCDN_SCRIPT_MEETEI_MAYEKZUCDN_SCRIPT_IMPERIAL_ARAMAICZUCDN_SCRIPT_OLD_SOUTH_ARABIANZ"UCDN_SCRIPT_INSCRIPTIONAL_PARTHIANZ!UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVIZUCDN_SCRIPT_OLD_TURKICZUCDN_SCRIPT_KAITHIZUCDN_SCRIPT_BATAKZUCDN_SCRIPT_BRAHMIZUCDN_SCRIPT_MANDAICZUCDN_SCRIPT_CHAKMAZUCDN_SCRIPT_MEROITIC_CURSIVEZ UCDN_SCRIPT_MEROITIC_HIEROGLYPHSZUCDN_SCRIPT_MIAOZUCDN_SCRIPT_SHARADAZUCDN_SCRIPT_SORA_SOMPENGZUCDN_SCRIPT_TAKRIZUCDN_SCRIPT_UNKNOWNZUCDN_SCRIPT_BASSA_VAHZUCDN_SCRIPT_CAUCASIAN_ALBANIANZUCDN_SCRIPT_DUPLOYANZUCDN_SCRIPT_ELBASANZUCDN_SCRIPT_GRANTHAZUCDN_SCRIPT_KHOJKIZUCDN_SCRIPT_KHUDAWADIZUCDN_SCRIPT_LINEAR_AZUCDN_SCRIPT_MAHAJANIZUCDN_SCRIPT_MANICHAEANZUCDN_SCRIPT_MENDE_KIKAKUIZUCDN_SCRIPT_MODIZUCDN_SCRIPT_MROZUCDN_SCRIPT_NABATAEANZUCDN_SCRIPT_OLD_NORTH_ARABIANZUCDN_SCRIPT_OLD_PERMICZUCDN_SCRIPT_PAHAWH_HMONGZUCDN_SCRIPT_PALMYRENEZUCDN_SCRIPT_PAU_CIN_HAUZUCDN_SCRIPT_PSALTER_PAHLAVIZUCDN_SCRIPT_SIDDHAMZUCDN_SCRIPT_TIRHUTAZUCDN_SCRIPT_WARANG_CITIZUCDN_SCRIPT_AHOMZ!UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHSZUCDN_SCRIPT_HATRANZUCDN_SCRIPT_MULTANIZUCDN_SCRIPT_OLD_HUNGARIANZUCDN_SCRIPT_SIGNWRITINGZUCDN_SCRIPT_ADLAMZUCDN_SCRIPT_BHAIKSUKIZUCDN_SCRIPT_MARCHENZUCDN_SCRIPT_NEWAZUCDN_SCRIPT_OSAGEZUCDN_SCRIPT_TANGUTZUCDN_SCRIPT_MASARAM_GONDIZUCDN_SCRIPT_NUSHUZUCDN_SCRIPT_SOYOMBOZUCDN_SCRIPT_ZANABAZAR_SQUAREZUCDN_SCRIPT_DOGRAZUCDN_SCRIPT_GUNJALA_GONDIZUCDN_SCRIPT_HANIFI_ROHINGYAZUCDN_SCRIPT_MAKASARZUCDN_SCRIPT_MEDEFAIDRINZUCDN_SCRIPT_OLD_SOGDIANZUCDN_SCRIPT_SOGDIANZUCDN_SCRIPT_ELYMAICZUCDN_SCRIPT_NANDINAGARIZ"UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONGZUCDN_SCRIPT_WANCHOr;   r>   rD   rF   rI   rJ   rM   rO   rS   rV   rW   rX   rZ   r[   r^   r`   r  r  objectrf   r   r  r   r   r5  r  r  r\  r  r  r1  r  r  r  r  r  r  r  r  r  r  ZLINK_FLAG_R_VALIDZLINK_FLAG_B_VALIDZLINK_FLAG_FIT_HZLINK_FLAG_FIT_VZLINK_FLAG_R_IS_ZOOMZTEXT_ALIGN_LEFTZTEXT_ALIGN_CENTERZTEXT_ALIGN_RIGHTZTEXT_ALIGN_JUSTIFYZTEXT_OUTPUT_TEXTZTEXT_OUTPUT_HTMLZTEXT_OUTPUT_JSONZTEXT_OUTPUT_XMLZTEXT_OUTPUT_XHTMLZTEXT_PRESERVE_LIGATURESZTEXT_PRESERVE_WHITESPACEZTEXT_PRESERVE_IMAGESZTEXT_INHIBIT_SPACESZTEXT_DEHYPHENATEZTEXT_PRESERVE_SPANSZTEXT_MEDIABOX_CLIPZTEXTFLAGS_WORDSZTEXTFLAGS_BLOCKSZTEXTFLAGS_DICTZTEXTFLAGS_RAWDICTZTEXTFLAGS_SEARCHZTEXTFLAGS_HTMLZTEXTFLAGS_XHTMLZTEXTFLAGS_XMLZTEXTFLAGS_TEXTZTEXT_ENCODING_LATINZTEXT_ENCODING_GREEKZTEXT_ENCODING_CYRILLICZSTAMP_ApprovedZ
STAMP_AsIsZSTAMP_ConfidentialZSTAMP_DepartmentalZSTAMP_ExperimentalZSTAMP_ExpiredZSTAMP_FinalZSTAMP_ForCommentZSTAMP_ForPublicReleaseZSTAMP_NotApprovedZSTAMP_NotForPublicReleaseZ
STAMP_SoldZSTAMP_TopSecretZSTAMP_DraftZBase14_fontnamesr  rr   r  Z
annot_skelr  r  r  r  r  r  r  r"  r/  re  r   r   r9  rZ  r]  r^  rb  rd  r  rf  rm  ro  rw  rx  rr  rs  rv  rx  r|  r~  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ZDocument_swigregisterr  ZPage_swigregisterr3  ZPixmap_swigregisterrz  ZColorspace_swigregisterr  ZDevice_swigregisterr  ZOutline_swigregisterr  ZAnnot_swigregisterr  ZLink_swigregisterr  ZDisplayList_swigregisterrD  ZTextPage_swigregisterr  ZGraftmap_swigregisterr!  ZTextWriter_swigregisterr  ZFont_swigregisterrF  ZTools_swigregisterr   r   r   r   <module>   s  
	
















































































































 b
 .   < 
d




	 p	














$-    D25
%9*

0"C
"+-


   W                      `   F&	3      & ') ; d     W