o
    Cji]                    @   s  d dl mZ esdev rddlmZ nd dlZzd dlZW n e	y*   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ejZejZejZejZd dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZe ej!d e"d  Z#e$dZ%dZ&dZ'dZ(dZ)ej*Z+ej,e-df Z.ej/e0 Z1ej/e2 Z3ej/e4 Z5ej/ej6 Z7ej/ej8 Z9zd dl:m;Z;m<Z< e;= Z>e>? D ]
Z@e<e@ e>e@ d< q[;[<W n e	y   i Z>Y nw dZAdZBdZCeBeAdfZDdZEdZF ZGdZHdZIdZJ ZKdZLe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\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Zqdd  Zrd!d" Zsd#d$ Ztd%d& Zud'd( Zvd)d* Zwd+d, Zxd-d. Zyd/d0 Zzd1d2 Z{d3d4 Z|d5d6 Z}d7d8 Z~d9d: Zd;d< Zd=d> Zd?d@ ZdAZdBZG dCdD dDeZG dEdF dFeZe ZG dGdH dHeZG dIdJ dJeZG dKdL dLeZG dMdN dNeZdOdP ZdQdR ZdSdT ZdUdV ZdWdX ZdYdZ ZG d[d\ d\eZd ZdZd]Zd ZdZd]Zd^Zd_Zd`ZdZd]Zd_ZdaZdbZdcZddZd ZdZd]Zd^Zd ZdZd]Zd^Zd_ZdZd]Zd_ZdaZdbZdcZdd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Zd]Zd ZdZd]Zd^Zd_Zd`ZdeZdfZdaZdgZdhZdiZdjZdkZdlZi ZϐeD ]ZАeАeϐeАѡ < [Аqdmedn< doedp< dqedr< dsedt< duedv< dwedx< dyedz< d{ed|< d}ed~< ded< ded< ded< ded< ded< ddddddddZG dd deӃZG dd deӃZG dd deԃZ֐ereԃ ddddde2de3de+de3de2f
ddZאd<de2de2de0de-de0f
ddZdZdZG dd deZde2fddZde2de2fddZde2dej,eސedf dede-de2f
ddZdd Zde2defddZde2defddZdej*fddZdej*fddZde9fddZdej,eސee0df de2de2fddÄZdej8defddńZdej8defddǄZdej*defddʄZdej*defdd̈́Zdej*defddЄZdej*defdd҄Zddde2defddքZddde-defddۄZdddej8fddބZdd Zde&de&defddZdej6de4fddZd=de2de3fddZde2fddZG dd deZdd Zd>de&de&de'defddZddde-fddZd?ddZde-defd dZde-defddZd@de'de-de-defdd	ZdAddZd dl Z d dlZi Zi Zde-de2fddZde2de-fddZdefddZdefddZdefddZ	de2fddZ
G dd deZee G dd deZee G dd deZee G d d! d!eZee G d"d# d#eZee G d$d% d%eZee G d&d deZee G d'd( d(eZee G d)d* d*eZee G d+d, d,eZee G d-d. d.eZe e G d/d0 d0eZ!e"e! G d1d deZ#e$e# G d2d3 d3eZ%e&e% G d4d5 d5eZ'e(e' G d6d7 d7eZ)e*e) G d8d9 d9eZ+e,e+ G d:d; d;eZ-e.e- dS (B      )version_info.   )_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__)selfstrthis r   `/var/www/html/Resume-Parser/resume-parser-inhouse/venv/lib/python3.10/site-packages/fitz/fitz.py
_swig_repr   s   r   c                        fdd}|S )Nc                    sj   |dkr | || d S |dkr| j | d S t| |r/ttt| |tr/ | || d S td|  )Nr   thisownz(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_attr-   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   wrapper7      z$_swig_add_metaclass.<locals>.wrapperr   )r+   r,   r   r*   r   _swig_add_metaclass5   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   r/   <   s    r/   z
()<>[]{}/%TESSDATA_PREFIX
point_like	rect_likematrix_like	quad_like)fontdescriptorsfontbuffersloaderz1.23.5z1.23.6z2023-11-06 00:00:0120231106000001(fb67864f80f6104be7df0bf2d2386b90e7e5af8dz Update dates for release 1.23.6.mainc                 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   rB        rB   c                 C      t | |S r&   )r   util_hor_matrix)rC   rD   r   r   r   rH        rH   c                 C   r>   r&   )r   util_ensure_widget_calc)annotr   r   r   rJ     r@   rJ   c                 C   r>   r&   )r   util_make_rectar   r   r   rL     r@   rL   c                 C   r>   r&   )r   util_make_irectrM   r   r   r   rO     r@   rO   c                 C   r>   r&   )r   util_round_rectrectr   r   r   rP     r@   rP   c                 C   rG   r&   )r   util_transform_rect)rR   matrixr   r   r   rS     rI   rS   c                 C   rG   r&   )r   util_intersect_rectr1r2r   r   r   rU     rI   rU   c                 C   rG   r&   )r   util_is_point_in_rect)prr   r   r   rY     rI   rY   c                 C   rG   r&   )r   util_include_point_in_rect)r[   rZ   r   r   r   r\     rI   r\   c                 C   rG   r&   )r   util_point_in_quad)rD   rE   r   r   r   r]     rI   r]   c                 C   rG   r&   )r   util_transform_point)pointrT   r   r   r   r^     rI   r^   c                 C   rG   r&   )r   util_union_rectrV   r   r   r   r`     rI   r`   c                 C   rG   r&   )r   util_concat_matrix)m1m2r   r   r   ra     rI   ra   c                 C   r>   r&   )r   util_invert_matrix)rT   r   r   r   rd     r@   rd   c                 C      t | |||S r&   )r   util_measure_string)textfontnamefontsizeencodingr   r   r   rf        rf   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__               ?zMatrix: bad args)rN   bcdeflen
ValueErrormapfloatr   mathradiansroundcossin)r   argsthetarv   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   )rd   rN   ru   rv   rw   rx   ry   )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.)r}   rx   rN   rv   ry   ru   rw   )r   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.r}   rN   ru   rv   rw   )r   sx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vrN   ru   r   r   r   preshear0  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@)r}   absEPSILONrN   ru   rv   rw   r~   r   r   r   )r   r   rN   ru   radr   rv   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.rn   ro   )	rz   r{   ra   rN   ru   rv   rw   rx   ry   )r   onetwor   r   r   concatf  s   "zMatrix.concatc                 C   s    | j | j| j| j| j| jf| S r&   )rN   ru   rv   rw   rx   ry   r   ir   r   r   __getitem__m  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   rr   rs         index out of range)r}   rN   ru   rv   rw   rx   ry   
IndexErrorr   r   r   r   r   r   __setitem__p  s   zMatrix.__setitem__c                 C      dS )Nrn   r   r   r   r   r   __len__|     zMatrix.__len__c                 C      dt t|  S )Nrl   strtupler   r   r   r   r     rk   zMatrix.__repr__c                 C   s   t  }||  |S )zCalculate inverted matrix.)rl   r   )r   rb   r   r   r   
__invert__  s   
zMatrix.__invert__c                 C   sV   t |dr t| j| | j| | j| | j| | j| | j| S tdd}|| |S )Nrp   r   )	r   rl   rN   ru   rv   rw   rx   ry   r   )r   mrb   r   r   r   __mul__  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 Nrp   rt   r   zmatrix not invertible)r   rl   rN   ru   rv   rw   rx   ry   rd   ZeroDivisionErrorr   )r   r   rb   rc   r   r   r   __truediv__  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 
Nrp   rn   ro   r   r   rr   rs   r   r   
r   rl   rN   ru   rv   rw   rx   ry   rz   r{   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&   )rl   r   r   r   r   __pos__     zMatrix.__pos__c                 C   s*   t | j | j | j | j | j | j S r&   )rl   rN   ru   rv   rw   rx   ry   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   Frn   r   rz   bool)r   matr   r   r   __eq__     
zMatrix.__eq__c                 C      t tdd | D S )Nc                 S      g | ]}|| qS r   r   .0rv   r   r   r   
<listcomp>      z"Matrix.__abs__.<locals>.<listcomp>r~   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   ru   r   rv   rN   rw   r   r   r   r   is_rectilinear  s   zMatrix.is_rectilinearr&   )r   r   r0   r1   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   rl     s:    
 
+			rl   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 )Nrt   )rl   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adrt   bcefrm   )r(   r   r   r   r   r2     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   r0   r1   r   r2   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)	Nrm   rr   Point: bad seq lenr   r   r   FzPoint: bad args)xyrz   r{   r}   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.rn   ro   )rz   r{   r^   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   r~   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   r~   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 givenrr   r   z$arg1 must be point-like or rect-liker   px)rt   rt   )rt         R@)gRQ@r   )gffffff9@r   )r   incmmmrm   )rz   r{   r   Rectr   r   top_leftbottom_rightr   x1r   y1distance_toy0	top_rightx0bottom_left)r   r   r   r   ury   r[   r   r   r   r     sH   



zPoint.distance_toc                 C   s   | j | jf| S r&   r   r   r   r   r   r   r   M  rk   zPoint.__getitem__c                 C   r   )Nrr   r   r   r   r   r   r   P  r   zPoint.__len__c                 C   s4   t |}|dkr|| _d S |dkr|| _d S td)Nr   r   r   )r}   r   r   r   r   r   r   r   r   S  s   zPoint.__setitem__c                 C   r   )Nr   r   r   r   r   r   r   [  rk   zPoint.__repr__c                 C   r   r&   r   r   r   r   r   r   ^  r   zPoint.__pos__c                 C   s   t | j | j S r&   )r   r   r   r   r   r   r   r   a  r   zPoint.__neg__c                 C   r   r   r   r   r   r   r   r   d  r   zPoint.__bool__c                 C   r   r   r   r   r   r   r   r   g  r   zPoint.__nonzero__c                 C   r   )Nr   Frr   r   r   rZ   r   r   r   r   j  r   zPoint.__eq__c                 C   s   t | j| j | j| j  S r&   )r~   r   r   r   r   r   r   r   r   o     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 Nrp   rr   r   r   r   r   r   r   r   rz   r{   r   r   r   r   r   t  
   
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   {  r  zPoint.__sub__c                 C   s2   t |drt| j| | j| S t| }||S Nrp   )r   r   r   r   r   )r   r   rZ   r   r   r   r     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   rd   r   r   )r   r   rb   rZ   r   r   r   r     s   

zPoint.__truediv__c                 C      t t| S r&   r   r   r   r   r   r   r     rI   zPoint.__hash__N)r   r   r0   r1   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   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&   )rL   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  r{   rl   r   r   widthheightr   r[   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   rZ   r   r   r   r   r=       z
Rect.morphc                 C   r  )zReturn the IRect.)IRectrP   r   r   r   r   r        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   rB  r   r   r   r   r   r   r   rD    rE  c                 C   s2   t |dkr
tdt| |\| _| _| _| _| S )zExtend to include point-like p.rr   r   )rz   r{   r\   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)rz   r{   r   r  r  r  r   r   r   r   r  r`   r6  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   rI  )
rz   r{   r   r  r   r   r   r   r  rU   r6  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.rn   ro   )rz   r{   rS   r   r   r   r   r   r   r   r   r     rH  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   rr   rs   r   )r}   r   r   r   r   r   r   r   r   r   r   ,     zRect.__setitem__c                 C   r   )Nr   r   r   r   r   r   r   6  rk   zRect.__repr__c                 C   r   r&   r   r   r   r   r   r   9  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   rQ  r   r   r   r   r   ?     8zRect.__bool__c                 C   rX  r   rQ  r   r   r   r   r   B  rY  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   rr   rs   r   rz   r   r   r   r   r6  r   r   r   r   E     
DzRect.__eq__c                 C      | j s| jsdS | j| j S Nrm   r  r  r4  r5  r   r   r   r   r   J     zRect.__abs__c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r   P  r   zRect.norm.<locals>.<listcomp>r   r   r   r   r   r   O  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 Nrp   r   rI  r   r   rr   rs   r   r   r   r   r   r   rz   r{   r   r   r   r   r   R  
   
&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 rb  rc  r   r   r   r   r   Z  rd  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   r[   r   r   r   r   b  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 Nrp   rt   r   zMatrix not invertible)	r   r   r   r   r   r   rd   r   r   )r   r   imr[   r   r   r   r   i  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 )Nrp   rr   r   F)r   r   rz   rY   INFINITE_RECTr   r*  rR   r   r   r   r   )r   r   r   r[   r   r   r   rL  u  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 2rr   r   )r   r{   r   rz   rG  rJ  r   r   r[   r   r   r   __or__  s   


zRect.__or__c                 C   s0   t |drt|dkrtdt| }||S )Nr   r   rh  )r   rz   r{   r   rK  ri  r   r   r   __and__  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  rK  )r   r   rW   r[   r   r   r   
intersects  s   zRect.intersectsc                 C   r  r&   r  r   r   r   r   r     rI   zRect.__hash__N)3r   r   r0   r1   r   r  r   r  r  r  r   r   r   r   r+  r,  r-  r.  r/  r7  r=  r   irectr4  r5  rG  rJ  rK  rN  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rL  rj  rk  rl  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 )Pr@  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&   )rO   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/    r0  z
IRect.quadc                 C   r1  r2  r3  r6  r   r   r   r7    r8  zIRect.torectc                 C   r9  r:  r;  r>  r   r   r   r=    r?  zIRect.morphc                 C   r   r&   rV  r   r   r   r   rR        z
IRect.rectc                 C   rB  r   rC  r   r   r   r   rD    rE  zIRect.<lambda>c                 C   rB  r   rF  r   r   r   r   rD    rE  c                 C      | j |}|jS )z$Extend rectangle to include point p.)rR   rG  rm  )r   rZ   rR   r   r   r   rG       zIRect.include_pointc                 C   ro  )z(Extend rectangle to include rectangle r.)rR   rJ  rm  r   r[   rR   r   r   r   rJ    rp  zIRect.include_rectc                 C   ro  )z4Restrict rectangle to intersection with rectangle r.)rR   rK  rm  rq  r   r   r   rK    rp  zIRect.intersectc                 C   rP  r&   rQ  r   r   r   r   r     r   zIRect.__getitem__c                 C   r   rR  r   r   r   r   r   r     r   zIRect.__len__c                 C   rS  rT  )intr   r   r   r   r   r   r   r   r   r     rU  zIRect.__setitem__c                 C   r   )Nr@  r   r   r   r   r   r      rk   zIRect.__repr__c                 C   r   r&   )r@  r   r   r   r   r   #  r   zIRect.__pos__c                 C   rW  r&   )r@  r   r   r   r   r   r   r   r   r   &  r   zIRect.__neg__c                 C   rX  r   rQ  r   r   r   r   r   )  rY  zIRect.__bool__c                 C   rX  r   rQ  r   r   r   r   r   ,  rY  zIRect.__nonzero__c                 C   rZ  r[  r\  r6  r   r   r   r   /  r]  zIRect.__eq__c                 C   r^  r   r`  r   r   r   r   r   4  ra  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   9  r   z
IRect.normc                 C      t | | S r&   )r   r   r   r   r   r   r   r   <  rk   zIRect.__add__c                 C   rs  r&   )r   r   r   r   r   r   r   r   ?  rk   zIRect.__sub__c                 C   rs  r&   )r   r   r   r   r   r   r   r   B  rk   zIRect.transformc                 C   rs  r&   )r   r   r   r   r   r   r   r   E  rk   zIRect.__mul__c                 C   rs  r&   )r   r   r   r   r   r   r   r   H  rk   zIRect.__truediv__c                 C   rG   r&   )r   rL  rM  r   r   r   rL  N  rI   zIRect.__contains__c                 C   rs  r&   )r   rj  r   rM  r   r   r   rj  R  rk   zIRect.__or__c                 C   rs  r&   )r   rk  r   rM  r   r   r   rk  U  rk   zIRect.__and__c                 C   rG   r&   )r   rl  rM  r   r   r   rl  X  rI   zIRect.intersectsc                 C   r  r&   r  r   r   r   r   r   [  rI   zIRect.__hash__N)1r   r   r0   r1   r   r  r   r  r  r  r   r   r   r   r+  r,  r-  r.  r/  r7  r=  rR   r4  r5  rG  rJ  rK  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rL  rj  rk  rl  r   r   r   r   r   r@    sn    









r@  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lrrz   r{   r|   r   r   r   r   r   r   a  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)rB   ru  rv  rx  r   r   rw  )r   siner   r   r   is_rectangularu  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_lineru  rx  rw  rv  r   )r   r   p1p2r   r   r   	is_convex  s   




zQuad.is_convexc                 C   "   t t| j| j t| j| j S r&   )r   r   ru  rv  rw  rx  r   r   r   r   rD       " zQuad.<lambda>c                 C   r  r&   )r   r   ru  rw  rv  rx  r   r   r   r   rD    r  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.
        )r4  r   r5  r   r   r   r   r    s   zQuad.is_emptyc                 C      | j jS )z(Check whether this is the infinite quad.)rR   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   ru  r   rv  rx  rw  r   r   r   r   r   r   r6  r   r   r   rR     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 )NFrr   r   T)r   r]   	CheckRectr   r  	CheckQuadrange)r   r   r   r   r   r   r   rL    s&   

$zQuad.__contains__c                 C   rP  r&   )ru  rv  rw  rx  r   r   r   r   r     r   zQuad.__getitem__c                 C   r   rR  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rT  )r   ru  rv  rw  rx  r   r   r   r   r   r     s   zQuad.__setitem__c                 C   r   )Nr*  r   r   r   r   r   r     rk   zQuad.__repr__c                 C   r   r&   )r*  r   r   r   r   r     r   zQuad.__pos__c                 C   rW  r&   )r*  ru  rv  rw  rx  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   r  r&   r  r   r   r   r   r     r   zQuad.__nonzero__c                 C   rZ  r[  )r   rz   ru  rv  rw  rx  )r   r/  r   r   r   r     s   
zQuad.__eq__c                 C   s*   | j rdS t| j| j t| j| j  S r_  )r  r   ru  rv  rw  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  r<  rl   r   r   r   )r   rZ   r   deltaqr   r   r   r=    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.rp   rn   ro   )r   rz   r{   ru  rv  rw  rx  r   r   r   r   r     s   
zQuad.transformc                 C   s   t | }||}|S r&   )r*  r   )r   r   r  r   r   r   r        
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 Nrp   r   rt  r   r   rr   rs   	r   r*  ru  rv  rw  rx  rz   rZ   r{   r   r  r   r   r   r     rd  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   '  rd  zQuad.__sub__c                 C   sB   t |dr
d| }nt|d }|stdt| }||}|S re  )r   rd   r   r*  r   )r   r   rf  r  r   r   r   r   /  s   


zQuad.__truediv__c                 C   r  r&   r  r   r   r   r   r   =  rI   zQuad.__hash__N)!r   r   r0   r1   r   r   r   r{  r  r4  r5  r  r  rR   rL  r   r   r   r   r   r   r   r   r   r   r=  r   r   r   r   r   r   r   r   r   r   r   r*  _  sD    


		
r*  c                   C      t ttttS r&   )r   r  r  r   r   r   r   
EMPTY_RECTB  rF   r  c                   C   r  r&   )r   r  r  r   r   r   r   rg  F  rF   rg  c                   C   r  r&   )r@  r  r  r   r   r   r   EMPTY_IRECTJ  rF   r  c                   C   r  r&   )r@  r  r  r   r   r   r   INFINITE_IRECTN  rF   r  c                   C      t  jS r&   )rg  r/  r   r   r   r   r<  R  r   r<  c                   C   r  r&   )r  r/  r   r   r   r   
EMPTY_QUADV  r   r  c                   @   sp   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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 | _d | _d | _d| _d S )NTSr   r   r   r   Helvr   ) r   border_colorborder_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_string
fill_colorbutton_caption	is_signed
text_color	text_fonttext_fontsizetext_maxlentext_format_text_dascriptscript_strokescript_formatscript_changescript_calcscript_blurscript_focusrR   xrefr   r   r   r   r   `  s@   
zWidget.__init__c                 C   s  | 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|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 missingUnnamedNr  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)rR   r  r  r{   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  r  r  _checker)r   btn_typer   r   r   	_validate  sh   









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)CourTiRor  ZaDb)r  parent	FormFontslowerr   docry   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  Tfrr   r   r   grgc                 S      g | ]}t |qS r   r}   r   ry   r   r   r   r     r   z$Widget._parse_da.<locals>.<listcomp>rs   )r  split	enumerater}   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| j tkrN| jdvrPt| drR| jj}|| jd\}}|dkrTt	t
t|dd d	d
 }|D ]}|| jkrM||dd q?dS dS dS dS dS )z Any widget type checks.
        r      zbad field type)FOffr  zParent/Kidsarray0 Rr   ASz/OffN)r  r  r{   r  r  r   r  xref_get_keyr  r   r|   rr  replacer  xref_set_key)r   r  	kids_type
kids_valuexrefsr  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| _| j	rJt
| j t| j|  d| _d	S )
z*Reflect Python object in the PDF.
        r   rs   !{: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ry   r   N)r  r  r  r  rz   r  formatr  r  r  rJ   _annotTOOLS_save_widget)r   r  fmtr   r   r   update  s"   



zWidget.updatec                 C   s   | j dvrdS t| dr| jj}ndS | j}ddd}||d}|d dkrLg }|d d	d
 }|ddd }|D ]}|| d  q<||d< ||d}|d dkr}g }	|d d	d
 }|ddd }
|
D ]}|	| d  qm|	|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.
        rr   r   Nr  )normaldownzAP/Nr   dictr   rr   /r  zAP/Dr  )r  r   r  r  r  r  append)r   r  r  statesAPNnstatesapntr   APDdstatesapdtr   r   r   button_states5  s0   



zWidget.button_statesc                 C   sl   | j dvrdS | j dkrdS |  }|dkri }| D ]}|| D ]}|dkr.|    S q"qtd dS )a  Return the "On" value for button widgets.

        This is useful for radio buttons mainly. Checkboxes will always return
        "Yes". Radio buttons will return the string that is unequal to "Off"
        as returned by method button_states().
        If the radio button is new / being created, it does not yet have an
        "On" value. In this case, a warning is shown and True is returned.
        r  Nrr   Yesr  z(warning: radio button has no 'On' value.T)r  r  keysprint)r   bstatekr   r   r   r   on_stateV  s   
	
zWidget.on_statec                 C   s   t | j dS )z.Reset the field value to its default.
        N)r  _reset_widgetr  r   r   r   r   resetm     zWidget.resetc                 C   s   d| j t| jf S )Nz'%s' widget on %s)r  r   r  r   r   r   r   r   r     zWidget.__repr__c                 C   s   t | dr	| `d S d S )Nr  )r   r  r   r   r   r   __del__u  s   
zWidget.__del__c                 C   r  r&   )r  nextr   r   r   r   r  y  rn  zWidget.nextN)r   r   r0   r   r  r  r  r  r  r  r   r  r   r  r   r  r   r   r   r   r  _  s    'H !r  rr   rs   r   r   r         @   rn      	   
      rq      )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  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibir  symbr  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>>)goto1goto2gotor1gotor2launchurinamedc                   @      e Zd ZdZdS )FileDataErrorz0Raised for documents with file structure issues.Nr   r   r0   r1   r   r   r   r   r3  ,      r3  c                   @   r2  )FileNotFoundErrorzRaised if file does not exist.Nr4  r   r   r   r   r6  0  r5  r6  c                   @   r2  )EmptyFileErrorz5Raised when creating documents from zero-length data.Nr4  r   r   r   r   r7  4  r5  r7  )CSSarchiver   fontcoder8  r9  r   ry  c                   s   d}t |turtd|dkrd} fddt D }|g kr)td  dt|d	kr3td
|dkr9 }|D ]/}t| }|d }|d }	|d  }
||
| |rXdnd}|	r^dnd}||||||f 7 }q;|S )a  Create @font-face items for the given fontcode of pymupdf-fonts.

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

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

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

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

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

    Args:
        fontcode: (str) font code for naming the font variants to include.
                  E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
                  A maximum of 4 font variants is accepted.
        CSS: (str) CSS string to add @font-face definitions to.
        archive: (Archive, mandatory) where to place the font buffers.
        name: (str) use this as family-name instead of 'fontcode'.
    Returns:
        Modified CSS, with appended @font-face statements for each font variant
        of fontcode.
        Fontbuffers associated with "fontcode" will be added to 'archive'.
    z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an ArchiveNr   c                    s   g | ]	}|  r|qS r   )
startswith)r   r  r:  r   r   r   l      z(css_for_pymupdf_font.<locals>.<listcomp>zNo font code 'z' found in pymupdf-fonts.r   zfontcode too shortbolditalicr:   zfont-weight: bold;zfont-style: italic;)r   Archiver{   fitz_fontdescriptorsr  rz   add)r:  r8  r9  r   CSSFONT	font_keysfkeyr  r>  r?  fbuff	bold_textitalic_textr   r<  r   css_for_pymupdf_font;  s,   )
rI  rg   rh   ri   rj   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   r  rf   rz   r{   )rg   rh   ri   rj   basenamewr   rN  r   get_text_length  s"   

r^  (   rK  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?)#   rc  )$   g\(\?)%   g5^I?)&   sh|??)'   HzG?)(   Zd;O?))   Gz?)*   gQ?)+   g?5^I?),    rh?)-   g\(\?).   x&?)/   gB`"?)0   rv  )1   g=
ףp=?)2   rc  )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   rk  )F   gK7A`?)G   g rh?)H   &1?)I   tV?)J   ri  )K   gx?)L   r  )M   -?)N   r  )O   d;O?)P   gK7?)Q   g+?)R   gA`"?)S   g+?)T   rk  )U   MbX?)V   g=
ףp=?)W   E?)X   ~jt?)Y   r  )Z   r  )[   9v?)\   g-?)]   gm?)^   g;On?)_   g;On?)`   gGz?)a   ri  )b   ri  )c   r  )d   gCl?)e   ʡE?)f   g?5^I?)g   r  )h   gv/?)i   7A`?)j   rm  )k   gQ?)l   rm  )m   V-?)n   r  )o   r~  )p   r~  )q   r  )r   r  )s   %C?)t   r  )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?)   r  )   r  )   r  )   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㥛 ?)   r  )   g"~?)   r  )   r  )   gMbX?)   g(\?)   gn?)   goʡ?)   gK7A?)   獗n?)   r)  )   X9v?)   r,  )   r  )   r  )   +?r_  )   r1  )   r  )   gʡE?)   y&1?)   gGz?)   r6  )   "~j?)   gl?)   r:  )   r  )   r  )   r  )   g
ףp=
?r_  r_  (   rK  gq=
ףp?rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  )r        ?)rb  Zd;O?)rd  r  )re        ?)rf  rs  )rg  r  )rh  gL7A`?)rj  jt?)rl  rC  )rn  rC  )rp  rD  )rq  rs  )rr  rB  )rt  rs  )ru  rB  )rw  ra  )rx  rD  )ry  rD  )rz  rD  )r{  rD  )r|  rD  )r}  rD  )r  rD  )r  rD  )r  rD  )r  rD  )r  ra  )r  ra  )r  rs  )r  rs  )r  rs  )r  g"~j?)r	  rs  )r  v?)r  r  )r  rF  )r  g/$?)r  Zd;O?)r  r  )r  粝K?)r  rF  )r  rC  )r  x&1?)r  rF  )r  ʡE?)r  g r?)r  rF  )r  rF  )r  r  )r  gʡE?)r  gn?)r  gl?)r  rG  )r  ro  )r  rE  )r  r  )r  gp=
ף?)r  q=
ףp?)r  rG  )r  rC  )r  gV-?)r  rC  )r  uV?)r  rD  )r  rD  )r  rI  )r  rs  )r  rs  )r  r  )r  rE  )r  y&1?)r  M?)r  rH  )r  uV?)r  rH  )r  rs  )r  rs  )r  ;On?)r  rM  )r  rs  )r  rs  )r  rM  )r  rs  )r  rH  )r  rE  )r  rP  )r  r  )r  rJ  )r  gZd;O?)r  rJ  )r  r  )r  Q?)r  g?)r  rQ  )r  rs  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  )   rB  )r  gףp=
?)r  gV-?)r  rs  )r  gK7A`?)r  r  )r  rD  )r  jt?)r  rS  )r  rS  )r  rS  )r  y&1?)r  r  )r  rH  )r  /$?)r  rH  )r  g?)r  rs  )r  rN  )r  rs  )r  rs  )r  rP  )r  r  rA  )r  rs  )r  rs  )r  rs  )r  rs  )r  r   )r  rH  )r  r   )r  rL  )r  r  )r  rJ  )r  rK  )r  rU  )r  r  )r   r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r	  r  )r
  r  )r  r  )r  r  )r  rk  )r  rk  )r  g{Gz?)r  r  )r  rs  )r  rs  )r  r  )r  rH  )r  rH  )r  rT  )r  rU  )r  rH  )r  rU  )r  rH  )r  r  )r   rO  )r!  rk  )r"  rk  )r#  r  )r$  r  )r%  ~jt?)r&  rV  )r'  rV  )r(  rV  )r*  rV  )r+  rV  )r-  r  )r.  r  )r/  r  )r0  r  rA  )r2  rO  )r3  gK7?)r4  rJ  )r5  rJ  )r7  rJ  )r8  rV  )r9  rs  )r;  rV  )r<  rV  )r=  rV  )r>  rV  )r?  r  )r@  r  )   r  rA  c                   @      e Zd ZdZdd ZdS )linkDestz#link or outline destination detailsc                 C   sX  |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	d
| _| 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   rr   r  z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$rs   r   z^#page=([0-9]+)$)zhttp://zhttps://zmailto:zftp://Tzfile://r
  zpage=r   )is_externaldestfileSpecflagsisMapisUri	LINK_NONEkindr   ltr1  	newWindowpagerbr0  r;  LINK_URIr  	LINK_GOTOrematchrr  groupr}   LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDLINK_LAUNCHr  rz   
LINK_GOTOR)r   objrlinkisExtisIntr   ftabr   r   r   r   
  sv    
 


zlinkDest.__init__Nr   r   r0   r1   r   r   r   r   r   rY  
  s    rY  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  rr   0r  zD:%Y%m%d%H%M%S-+)timer   r   altzonerjuststrftime	localtime)rz  tztstampr   r   r   get_pdf_now
  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 )NrW     zUTF-16BE<>)	bytearrayhex)r   r[   r   r   r   make_utf16be  s   z!get_pdf_str.<locals>.make_utf16ber   r        )()\r  z\%03or  z\br  z\tr  \nrq   z\fr  z\rz\267r  r  )r   rM  )r   r  r[   rv   ocr   r   r   get_pdf_str  s8   






r  rO  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 )rJ  %02xb7rL  r   r   r   r   r   W  s   ( zgetTJstr.<locals>.<listcomp>c                    s0   g | ]}t |d k rd t | d  ndqS )rJ  r  r   r  rL  r   rN  r   r   r   Z  s   0 r   c                    s    g | ]}d  t | d  qS )%04xr   rL  r   rN  r   r   r   `       c                 S   s   g | ]}d t | qS )r  rL  r   r   r   r   r   b      )r;  endswithr   join)rg   rO  r  r  otxtr   rN  r   getTJstrB  s   r  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
    a0)P	  i*  a1)  r  a10)r  r  a2)  r  a3)J  r  a4)S  r  a5)  r  a6)*  r  a7)r  r  a8)   r  a9)r  r  b0)  i  b1)  r  b10)r  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  r  )r<  r  b8)r  r<  b9)r  r  c0)'
  i]  c1)-  r  c10)r  r  c2)  r  c3)  r  c4)  r  c5)  r  c6)C  r  c7)r%  r  c8)r  r%  c9)r  r  zcard-4x6)i   i  )r   i  )i)  i  )i
  i  )i  d  )  i  )r  i  )r  i  )r  r  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar   r   r   r   r   paper_sizesg  s   		
 !"#r  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.
    rZ   z-lr   Nr  z-p)r  r  r   r   )r  r  r  rY  )r   sizery   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.
    rm   )r  r   )r   r4  r5  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   r{   r  r   r   r   CheckParent  s   r  c                 C   s   t | dds
tdd S )Nr   Fzobject destroyed)r   RuntimeErrorr  r   r   r   EnsureOwnership  s   r  rv   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   rs   r   r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   listr   rz   r   r   r{   )rv   r   r   r   r    s   r  ry   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   rp   r   z%g r   rv   zG zg rs   z	%g %g %g zRG zrg z%g %g %g %g zK zk )r   r  rz   r   )rv   ry   r   r   r   r   	ColorCode  s   
r  c                 C      t tdd | S )Nc                 S      t | dkrt| dS dS )Ng-C6?r   r   r   r   r   r   r   r   rD    r=  zJM_TUPLE.<locals>.<lambda>r   r|   r  r   r   r   JM_TUPLE  r   r  c                 C   r  )Nc                 S   r  )NMbP?rs   r   r  r  r   r   r   rD    r=  zJM_TUPLE3.<locals>.<lambda>r  r  r   r   r   	JM_TUPLE3  r   r  r[   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  )r[   r   r   r   r    s
   r  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*  r  )r  q0r   r   r   r    s
   
r  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)r  r   r/  r  r{   )r  r[   r  r   r   r   CheckMarkerArg  s   r  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 )NFrr   z$morph must be a sequence of length 2r   r   rn   zinvalid morph parm 0r   r   zinvalid morph parm 1T)r   r   r  r   rz   r{   r  r   r   r   
CheckMorph  s    "r  re  struct Page *c                 C   s&   |   D ]}|d |kr|  S qdS )zGReturn an entry in the page's font list if reference name matches.
    r   N)	get_fonts)re  rh   ry   r   r   r   	CheckFont  s
   r  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  ry   r   r   r   CheckFontInfo"  s
   
r  infoc                 C   sV   |d }d}t | jD ]\}}|d |krd} nq|r#|| j|< d S | j| d S )Nr   FT)r  r  r  )r  r  r  foundr   fir   r   r   UpdateFontInfo*  s   r  c                  O      d S r&   r   )r   kwr   r   r   DUMMY7  r   r  r}  r~  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   rl   rH   )r}  r~  r   r   r   r|  ;  s   r|  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  r{   r  image_profile)r  streamr   r   r   r  K  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  rg   r
  r[   r   r   r   ConversionHeadera  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  rg   r
  r	  r  r  r[   r   r   r   ConversionTrailer  s(   
r  c                   @   s    e Zd ZdZdd Zdd ZdS )ElementPositionzDConvert a dictionary with element position information to an object.c                 C   r  r&   r   r   r   r   r   r     r   zElementPosition.__init__c                 C   s0   d}| j  D ]\}}|d| d|7 }q|S )Nr    =)r(   items)r   retnr   r   r   r   __str__  s   zElementPosition.__str__N)r   r   r0   r1   r   r  r   r   r   r   r    s    r  c                   C   s   t  S r&   )r  r   r   r   r   make_story_elpos     r  startstopclipc                 C   s  |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 ](}t|d }|jsE|jrFq7|d D ]}t|d }|jsX|jrYqJ|
| qJq7|g krf|S |jdd	 d
 |d}	|	j|j d|	j krt|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bboxlinesc                 S      | j S r&   )r   )r  r   r   r   rD        z)get_highlight_selection.<locals>.<lambda>keyg?)rR   r   r+  r.  r   r   r   r  r  get_textr  sortpopr5  r   insert)re  r  r  r  r  r  ru   r  linebboxfr[   bboxlr   r   r   get_highlight_selection  s^   


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   )r  r  is_pdfr{   rotationset_rotation)re  old_rotationr   r   r   annot_preprocess  s   
r2  rK   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   )re  rK   r   r   r   annot_postprocess  s   
r8  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   )r9  r[   r  ru   r   r   r   sRGB_to_rgb  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   rr   )r:  )r9  r  r   r   r   sRGB_to_pdf%  s   
"r;  r   r   r   r   rR   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  r{   r+  r5  r4  r   r   r  r  )rR   r=  r>  r+  r5  r4  delta_hdelta_vr[   rowr   rectsnrowr   r   r   
make_table3  s*   

rD  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 )NDescendantFontsr   r  Fr   r  r  r   WnullDWT)r  rr  r  r  r   )r  r  r4  dfdf_xrefrG  r   r   r   set_font_widthl  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 )rs   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   cprP  r   r   r     s    rs   i  z$Cannot set width for '%s' in xref %i)
r^  r  r  r    r   valid_codepointsrr  r   r  r   )	re  r  rL  r  fontlistr  maxadvr4  r  r   rP  r   repair_mono_font^  s$   

"rV  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 )NrZ  ;r   r  basez.notdef)_adobe_glyphs_get_glyph_textr;  r  rr  rY  )rW  r(  r   uncunclrv   r   r   r   unicode_to_glyph_name  s   


r_  c                 C   sV   t i kr%t D ]}|drq|d\}}t|d d dd}|t |< qt | dS )NrZ  rX  r   r  rY  i  )_adobe_unicodesr\  r;  r  rr  rY  )r   r(  gnamer]  rv   r   r   r   glyph_name_to_unicode  s   


rb  c                  C   Z   t i kr't D ]} | drq| d\}}td|d d  dd}|t |< qtt  S NrZ  rX  0xr   r  rY  )r`  r\  r;  r  rr  r   r  r(  ra  r]  rv   r   r   r   adobe_glyph_names     


rg  c                  C   rc  rd  )r`  r\  r;  r  rr  r   valuesrf  r   r   r   adobe_glyph_unicodes  rh  rj  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                  C   sJ  t d} | dkr| S tjdkrd}nd}t j|r|S 	 tjdkr[zt d  }W n   d}Y |s=t	d d	S t j
|}t j|d
}t j|rR|S t	dtjd d	S zt d   }W n   d}Y t|dkr{t	d d	S d}| D ]}| D ]}t|d
r|} nqq|dkr|S t	dtjd d	S )a  Detect Tesseract-OCR and return its language support folder.

    This function can be used to enable OCR via Tesseract even if the
    environment variable TESSDATA_PREFIX has not been set.
    If the value of TESSDATA_PREFIX is None, the function tries to locate
    Tesseract-OCR and fills the required variable.

    Returns:
        Folder name of tessdata if Tesseract-OCR is available, otherwise False.
    r3   Nwin32z'C:\Program Files\Tesseract-OCR\tessdataz&/usr/share/tesseract-ocr/4.00/tessdatazwhere tesseractr   zTesseract-OCR is not installedFtessdataz2unexpected: Tesseract-OCR has no 'tessdata' folderfilezwhereis tesseract-ocrrr   z2unexpected: tesseract-ocr has no 'tessdata' folder)osgetenvsysplatformpathexistspopenr   stripr  dirnamer  stderrr  rz   iterdirr   r  )r3   rr  responser}  sub_responsesub_subr   r   r   get_tessdata  sZ   


r  c                   @   s  e Zd Zedd dd ddZeZejZ	dTd	d
Z
dd Zdd Zdd Zdd ZdUd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dVd%d&Zd'd( ZdWd)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'				dVd.ejee f d9e(d:e)d;e)d<e)d+dfd=d>Z*			dWd?e d9ej+d:e)d;e)d<e)d+dfd@dAZ,dXdCdDZ-edEdF Z.edGdH Z/edIdJ Z0dKdL Z1dMdN Z2dOdP Z3dQdR Z4dSdT Z5dUdV Z6edWdX Z7edYdZ Z8dYd[d\Z9dZd]d^Z:d[d_d`Z;dadb Z<dcdd Z=ededf Z>dgdh Z?didj Z@dkdl ZAedmdn ZBedodp ZCedqdr ZDdsdt ZEedudv ZFedwdx ZGdydz ZHd{d| ZId\ddZJ				~	d]ddZKd^ddZLd_ddZMd`ddZNdd ZOdd ZPedd ZQdd ZRdYddZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\daddZ]dd Z^dd Z_dd Z`dd ZadbddZbdd Zcdd ZddaddZedYddZfdd Zgedd Zhedd ZiddĄ ZjddƄ ZkddȄ Zlddʄ Zmdd̄ Zndd΄ ZoddЄ Zpdd҄ ZqdcddԄZrdddesdesd+e fdd؄Ztddڄ Zudd܄ ZvdYddބZwdeddZxdd ZydfddZzdd Z{dd Z|dgddZ}dd Z~dd Zdd ZdaddZdfddZdhddZdUddZdd ZdaddZdd Zdidd Zdd Zdd Zedd Zdjdedesd+efdd	Zdjdedesd+efd
dZded+efddZdd Zdd Zdd ZdfdedefddZdfdedefddZdfdefddZdd Zdd Z				~	dkd d!Zdld$d%Zed+e fd&d'Zd(e fd)d*Zed+e fd+d,Zd-e fd.d/Zed+e$fd0d1Zd2e$d+esfd3d4Zd+e fd5d6Zd+esfd7d8Zdad9ed+d:fd;d<Zd9ed+dfd=d>ZdWd?ed@edAefdBdCZd+efdDdEZdmdFdGZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdS (n  Documentc                 C   
   | j  S r&   r   r   r  r   r   r   rD       
 zDocument.<lambda>c                 C      | j |S r&   r  r   r   r   r   r   rD        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'pdfTr   zno such file: ''z' is no filer   zcannot open empty documentsvgzcannot open broken document)+	is_closedis_encryptedisEncryptedmetadatar  	Graftmaps
ShownPagesInsertedImagesr4  WeakValueDictionary
_page_refsr   r   r   r   	TypeErrorr  r  r  r  r  r  ru  ry  rz  r6  isfiler3  getsizerz   r7  r   Document_swiginitnew_Documentr   r  gen_id	_graft_id
needs_passinit_docr  r  convert_to_pdf)r   r  r  filetyperR   r4  r5  ri   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  r{   r   rr  
page_countr   Document_load_pager   r4  r5  r  r  r7  r  r6  number)r   page_idnpvalr   r   r   	load_page2  s$   
zDocument.load_pagec                 C   rG   r&   )r   Document__remove_links_to)r   numbersr   r   r   _remove_links_toR  rI   zDocument._remove_links_toc                 C      | j rtdt| S )zLoad first outline.document closed)r  r{   r   Document__loadOutliner   r   r   r   _loadOutlineU     
zDocument._loadOutlinec                 C   rG   r&   )r   Document__dropOutline)r   olr   r   r   _dropOutline]  rI   zDocument._dropOutlinec                 C      | j rtdt| ||S )z)Utility: insert font from file or binary.r  )r  r{   r   Document__insert_font)r   fontfile
fontbufferr   r   r   _insert_font`     zDocument._insert_fontc                 C   r  )z!Get list of outline xref numbers.r  )r  r{   r   Document_get_outline_xrefsr   r   r   r   get_outline_xrefsh  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  r{   r   Document_xref_get_keysr   r  r   r   r   xref_get_keysp     zDocument.xref_get_keysc                 C   r  )z+Get PDF dict key value of object at 'xref'.r  )r  r{   r   Document_xref_get_key)r   r  r#  r   r   r   r  x  r  zDocument.xref_get_keyc                 C   s   | j s| jr
td|rt|trt|t dhfvr tdt|tr9|r9|d dkr=t|dd t kr=tdt	| |||S )z&Set the value of a PDF dictionary key.r  r  z	bad 'key'r   r   Nzbad 'value')
r  r  r{   r   r   INVALID_NAME_CHARSintersectionr    r   Document_xref_set_key)r   r  r#  r   r   r   r   r    s   $2zDocument.xref_set_keyc                 C   r  )z4Add color info to all items of an extended TOC list.r  )r  r{   r   Document__extend_toc_items)r   r  r   r   r   _extend_toc_items  r  zDocument._extend_toc_itemsc                 C   r  )z Get list of embedded file names.r  )r  r{   r   Document__embfile_names)r   namelistr   r   r   _embfile_names  r  zDocument._embfile_namesc                 C   rG   r&   )r   Document__embfile_delr   idxr   r   r   _embfile_del  rI   zDocument._embfile_delc                 C   rA   r&   )r   Document__embfile_info)r   r  infodictr   r   r   _embfile_info  rF   zDocument._embfile_infoc                 C      t | |||||S r&   )r   Document__embfile_upd)r   r  bufferr  	ufilenamedescr   r   r   _embfile_upd  r  zDocument._embfile_updc                 C   rG   r&   )r   Document__embeddedFileGetr  r   r   r   _embeddedFileGet  rI   zDocument._embeddedFileGetc                 C   r  r&   )r   Document__embfile_add)r   r   r  r  r  r  r   r   r   _embfile_add  r  zDocument._embfile_addry  c                 C   s   g }|  | |S )z#Get list of names of EmbeddedFiles.)r  )r   	filenamesr   r   r   embfile_names     
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   indexr  rz   r{   )r   r  r  r  r  r   r   r   _embeddedFileIndex  s   
zDocument._embeddedFileIndexc                 C   s   t |  S )zGet number of EmbeddedFiles.)rz   r  r   r   r   r   embfile_count  rA  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/CreationDaterH  creationDateParams/ModDatemodDatezParams/CheckSumchecksum)r  r  r  r  binasciihexlifyencodero  )r   r  r  r  r  r  datemd5r   r   r   embfile_info  s   
zDocument.embfile_infoc                 C   r  )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )r  r  r  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  r  )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/EmbeddedFiler  r  )	r  r   r{   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  r{   r   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  r{   r   Document_page_countr   r   r   r   r  8     
zDocument.page_countc                 C   r  )zNumber of chapters.r  )r  r{   r   Document_chapter_countr   r   r   r   chapter_countA  r  zDocument.chapter_countc                 C   r  )z Id (chapter, page) of last page.r  )r  r{   r   Document_last_locationr   r   r   r   last_locationJ  r  zDocument.last_locationc                 C   r  )zPage count of chapter.r  )r  r{   r   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  r{   r   rr  r   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   r  r   )	r  r  r{   r   rr  r   r  r   Document_next_locationr  r   r   r   next_locationl  s   zDocument.next_locationc                 C   r  )zConvert pno to (chapter, page).r  )r  r{   r   "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   r  )r   rr  r  r{   r   "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  r{   r   Document__getMetadatar   r#  r   r   r   _getMetadata  r  zDocument._getMetadatac                 C   r  )zIndicate password required.r  )r  r{   r   Document_needs_passr   r   r   r   r    r  zDocument.needs_passc                 C   r  )zDocument language.r  )r  r{   r   Document_languager   r   r   r   language  r  zDocument.languagec                 C   rG   r&   )r   Document_set_languager   r  r   r   r   set_language  rI   zDocument.set_languagec                 C   rA   )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   Document_resolve_link)r   r0  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  r{   r   Document_layout_reset_page_refsr  )r   rR   r4  r5  ri   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  r{   r   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  r{   r   Document_find_bookmark)r   bmr   r   r   find_bookmark  r,  zDocument.find_bookmarkc                 C   r  )z Check if document is layoutable.r  )r  r{   r   Document_is_reflowabler   r   r   r   is_reflowable  r  zDocument.is_reflowablec                 C   r  )zDelete object.r  )r  r{   r   Document__deleteObjectr  r   r   r   _deleteObject  r  zDocument._deleteObjectc                 C   r  )zGet xref of PDF catalog.r  )r  r{   r   Document_pdf_catalogr   r   r   r   pdf_catalog  r  zDocument.pdf_catalogc                 C   r  )zGet PDF file id.r  )r  r{   r   Document__getPDFfileidr   r   r   r   _getPDFfileid  r  zDocument._getPDFfileidc                 C   r  )zCount versions of PDF document.r  )r  r{   r   Document_version_countr   r   r   r   version_count  r  zDocument.version_countc                 C   r  )zCheck for PDF.r  )r  r{   r   Document_is_pdfr   r   r   r   r.    r  zDocument.is_pdfc                 C   r  )z True if PDF has unsaved changes.r  )r  r{   r   Document_is_dirtyr   r   r   r   is_dirty  r  zDocument.is_dirtyc                 C   r  )z-Check whether incremental saves are possible.r  )r  r{   r   Document_can_save_incrementallyr   r   r   r   can_save_incrementally  r  zDocument.can_save_incrementallyc                 C   r  )z'Check whether we have a linearized PDF.r  )r  r{   r   Document_is_fast_webaccessr   r   r   r   is_fast_webaccess   r  zDocument.is_fast_webaccessc                 C   r  )zCheck whether PDF was repaired.r  )r  r{   r   Document_is_repairedr   r   r   r   is_repaired)  r  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  r{   r   r   r   r   r   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  r{   r   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	|rWt	|d
ks_|rct	|d
krctdt
| |||||||||	|
|||||||S )z/Save PDF to file, pathlib.Path or file pointer.r  rC  r   seekrD  z$save to original must be incrementalr   zcannot save with zero pageszincremental needs original filerl  z"password length must not exceed 40)r  r  r{   r   r   r   r   r  r  rz   r   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  rN  rO  rW  rX  rP  rQ  rR  rS  rT  rU  rV  rY  rZ  r[  r\  r]  )r  r  r^  r  )r   rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r  bior   r   r   writes  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)r   r  start_atr   )r  r  r{   r  r  rz   ru  ry  r\  r   r  r  rY  Graftmapr   Document_insert_pdfr&  	_do_links)r   docsrcr   r  rb  r  linksannotsshow_progressfinal_gmapsainnameoutnameisrtr  r   r   r   
insert_pdf  s:   


zDocument.insert_pdfTc
                 C   s   d}
t |tr|jjdkrtt|}td| }
nt |tr"|}
nt|}
|
s,td|
js8|
	 }td|}
| j
|
||||||||	d	S )zInsert an arbitrary supported document to an existing PDF.

        The infile may be given as a filename, a Document or a Pixmap.
        Other paramters - where applicable - equal those of insert_pdf().
        Nrs   pngzbad infile parameterr  )r   r  rb  r  rg  rh  ri  rj  )r   Pixmap
colorspacer  csRGBr  tobytesr{   r.  r  rp  )r   infiler   r  rb  r  rg  rh  ri  rj  r   pdfbytesr   r   r   insert_file  s   



zDocument.insert_filer  r  c                 C   s0   | j s| jr
tdt| |||}|   |S )zMake a new PDF page.r  )r  r  r{   r   Document__newPager&  )r   r  r4  r5  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  r{   r.  r   rz   r   r  r   r   Document_selectr&  )r   pylister  r   r   r   select  s   
4zDocument.selectc                 C   rG   r&   )r   Document__delete_pager  r   r   r   _delete_page  rI   zDocument._delete_pagec                 C   s   | j rdS t| S )zDocument permissions.r   )r  r   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  r{   r   Document_journal_enabler   r   r   r   journal_enable     
zDocument.journal_enablec                 C   r(  )zBegin a journalling operation.r  )r  r  r{   r   Document_journal_start_opr   r   r   r   r   journal_start_op  r,  zDocument.journal_start_opc                 C   r  )zEnd a journalling operation.r  )r  r  r{   r   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  r{   r   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  r{   r   Document_journal_op_name)r   stepr   r   r   journal_op_name  r,  zDocument.journal_op_namec                 C   r  )z(Show if undo and / or redo are possible.r  )r  r  r{   r   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  r{   r   Document_journal_undor   r   r   r   journal_undo+  r  zDocument.journal_undoc                 C   r  )zMove forward in the journal.r  )r  r  r{   r   Document_journal_redor   r   r   r   journal_redo3  r  zDocument.journal_redoc                 C   r(  )zSave journal to a file.r  )r  r  r{   r   Document_journal_saverF  r   r   r   journal_save;  r,  zDocument.journal_savec                 C   r(  )zLoad a journal from a file.r  )r  r  r{   r   Document_journal_loadrF  r   r   r   journal_loadC  r,  zDocument.journal_loadc                 C   r  )z Check if journalling is enabled.r  )r  r  r{   r   Document_journal_is_enabledr   r   r   r   journal_is_enabledK  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  r{   r   Document__get_char_widths)r   r  bfnameextr  limitr  r   r   r   _get_char_widthsS  s   zDocument._get_char_widthsc                 C   r  )zGet xref of page number.r  )r  r{   r   Document_page_xrefr  r   r   r   	page_xref[  r  zDocument.page_xrefc                 C   r  )z$Get list annotations of page number.r  )r  r{   r   Document_page_annot_xrefsr  r   r   r   page_annot_xrefsc  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  r{   r   Document_page_cropboxr   r  )r   r  r  r   r   r   page_cropboxk  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  r{   r   Document__getPageInfo)r   r  whatr   r   r   _getPageInfov     zDocument._getPageInfoc                 C   r  )z2Get a font by xref. Returns a tuple or dictionary.r  )r  r  r{   r   Document_extract_font)r   r  	info_onlyr1  r   r   r   extract_font~     zDocument.extract_fontc                 C   r(  )z(Get image by xref. Returns a dictionary.r  )r  r  r{   r   Document_extract_imager  r   r   r   extract_image  r,  zDocument.extract_imagec                 C   s*   | j s| jr
tdt| }|   |S )zDelete the TOC.r  )r  r  r{   r   Document__delToCr  r   r  r   r   r   _delToC  s
   
zDocument._delToCc                 C   r  )z!Check if xref is a stream object.r  )r  r{   r   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  r{   is_form_pdfr   Document_need_appearances)r   r   r   r   r   need_appearances  s
   zDocument.need_appearancesc                 C   r  )zGet the /SigFlags value.r  )r  r{   r   Document_get_sigflagsr   r   r   r   get_sigflags  r  zDocument.get_sigflagsc                 C   r  )z Either False or PDF field count.r  )r  r{   r   Document_is_form_pdfr   r   r   r   r    r  zDocument.is_form_pdfc                 C   r  )z&Get list of field font resource names.r  )r  r{   r   Document_FormFontsr   r   r   r   r    r  zDocument.FormFontsc                 C   r  )zAdd new form font.r  )r  r  r{   r   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  r{   r   Document__getOLRootNumberr   r   r   r   _getOLRootNumber  r  zDocument._getOLRootNumberc                 C   r  )zMake a new xref.r  )r  r  r{   r   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  r{   r   Document_xref_lengthr   r   r   r   xref_length  r  zDocument.xref_lengthc                 C   r  )zGet document XML metadata.r  )r  r{   r   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  r{   r   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  r{   r   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  r{   r   Document_set_xml_metadata)r   r  r   r   r   set_xml_metadata  r,  zDocument.set_xml_metadatac                 C      | j rtdt| |||S )z#Get xref object source as a string.r  )r  r{   r   Document_xref_object)r   r  
compressedrT  r   r   r   xref_object     zDocument.xref_objectr  rT  c                 C   s   | j d||dS )zGet PDF trailer as a string.r  )r  rT  )r  )r   r  rT  r   r   r   pdf_trailer  s   zDocument.pdf_trailerc                 C   r(  )z&Get xref stream without decompression.r  )r  r  r{   r   Document_xref_stream_rawr  r   r   r   xref_stream_raw  r,  zDocument.xref_stream_rawc                 C   r(  )zGet decompressed xref stream.r  )r  r  r{   r   Document_xref_streamr  r   r   r   xref_stream  r,  zDocument.xref_streamc                 C   r  )z!Replace object definition source.r  )r  r  r{   r   Document_update_object)r   r  rg   re  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  r{   r   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  r{   r   Document__make_page_mapr   r   r   r   _make_page_map2  r  zDocument._make_page_mapc                 C   s(   | j rtdt| ||}|   |S )zMake a full page duplicate.r  )r  r{   r   Document_fullcopy_pager&  )r   r  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  r{   r   Document__move_copy_pager&  )r   r  nbbeforer)   r  r   r   r   _move_copy_pageE  s
   zDocument._move_copy_pagec                 C   rG   r&   )r   Document__remove_toc_itemr  r   r   r   _remove_toc_itemP  rI   zDocument._remove_toc_itemc              	   C      t | ||||||S r&   )r   Document__update_toc_item)r   r  actiontitler^  collapsecolorr   r   r   _update_toc_itemS  r-   zDocument._update_toc_itemc                 C   r>   r&   )r   Document__get_page_labelsr   r   r   r   _get_page_labelsV  r@   zDocument._get_page_labelsc                 C   sB   t | |}|  }| j|dd}|dd| }| || |S )NTr  z/Nums[]z	/Nums[%s])r   Document__set_page_labelsr5  r  r  r  )r   labelsr  r  rg   r   r   r   _set_page_labelsY  s   zDocument._set_page_labelsc                 C   r  )zShow optional OC layers.r  )r  r{   r   Document_get_layersr   r   r   r   
get_layersd  r  zDocument.get_layersc                 C   r  )zActivate an OC layer.r  )r  r{   r   Document_switch_layer)r   config
as_defaultr   r   r   switch_layerl  r  zDocument.switch_layerc                 C   r  )z,Content of ON, OFF, RBGroups of an OC layer.r  )r  r{   r   Document_get_layer)r   r  r   r   r   	get_layert  r  zDocument.get_layerc           
   	   C   s  | 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| |rxt|ttfvrftdt||}|t krxtd| |rt|ttfvrtd	|D ]"}	t|	ttfvrtd
|	 t|	|}|t krtd| q|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: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)ONOFFr  zbad 'basestate')r  r{   r    get_ocgsr  r   r  r   
differencer   r  r   Document_set_layer)
r   r  	basestateonoffrbgroupslockedocgsr   r   r   r   r   	set_layer|  sP   




zDocument.set_layerc                 C   r  )zAdd a new OC layer.r  )r  r{   r   Document_add_layer)r   r   creatorr  r   r   r   	add_layer  r  zDocument.add_layerc                 C   r  )z-Show OC visibility status modifiable by user.r  )r  r{   r   Document_layer_ui_configsr   r   r   r   layer_ui_configs  r  zDocument.layer_ui_configsc                    sN   t  tr  fdd|  D }|g krtd  d|d  t|  |S )z$Set / unset OC intent configuration.c                    s    g | ]}|d   kr|d qS )rg   r  r   )r   uir  r   r   r     r  z0Document.set_layer_ui_config.<locals>.<listcomp>z	bad OCG ''.r   )r   r   r  r{   r   Document_set_layer_ui_config)r   r  r  r~  r   r  r   set_layer_ui_config  s   
zDocument.set_layer_ui_configc                 C   r  )z&Show existing optional content groups.r  )r  r{   r   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  r{   r   Document_add_ocg)r   r   r  r  intentusager   r   r   add_ocg  s   zDocument.add_ocgc                 C   rG   r&   )r   Document_internal_keep_annotr   rK   r   r   r   internal_keep_annot  rI   zDocument.internal_keep_annotc                    s~    j rtd   _ jrd j_t fddddddd	d
ddddd
 D  _ ddkr5d n d jd< d S )Nz,cannot initialize - document still encryptedTc                    s   g | ]\}}|  |fqS r   )r  )r   r  r   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  producerr  r  trappedrZ  None)	r  r{   r  _outliner   r  r  r  r  r   r   r   r   r    s   
2&zDocument.init_docc                 C   r   r&   )r$  r   r   r   r   rD    r!  r  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     r  z+Document.get_page_fonts.<locals>.<listcomp>r  r  r{   r.  r   rr  r  r  r   r  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'  rr   Fc                 S   r(  r)  r   r*  r   r   r   r     r  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'  rs   c                 S   s,   g | ]}|d  |d |d t |d fqS )r   r   rr   rs   rV  r*  r   r   r   r        , z.Document.get_page_xobjects.<locals>.<listcomp>r+  )r   r  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  r{   r  r  r   r   r   xref_is_image!  
   zDocument.xref_is_imagec                 C   r2  )zCheck if xref is a font object.r  r  r   z/FontTFr4  r  r   r   r   xref_is_font)  r6  zDocument.xref_is_fontc                 C   r2  )z Check if xref is a form xobject.r  r3  r   z/FormTFr4  r  r   r   r   xref_is_xobject1  r6  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  r{   rz   r  r  r   r  r  r  r  r)   r   r   r   	copy_page9  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   r9  r:  r   r   r   	move_pageR  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{  rr   r   N)r.  r{   r  r  get_tocr  r  r  r  	frozensetr  r&  )r   r  r  tocol_xrefsr   r  r   r   r   delete_pagej  s&   
zDocument.delete_pagec                 O   sD  | j std| jrtd| j}d }}|r]|rtd|dd}|dd}|dk r5||7 }|dk s-|dk rA||7 }|dk s9||  krN|k sStd tdtt||d	 }nct|d
ksg|g krkt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 argumentr   r  r   r{  r   rr   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r.  r{   r  r  rY  r   r  rz   r   rr  r  r|   r    r  r%  r>  r=  r  r  r  r  reversedr  r&  )r   r   r  r  ry   r  r  r[   frozen_numbersr?  r   r  r   r   r   delete_pages  sp   	


zDocument.delete_pagesc                 C   s   | j | jdtdS )z Save PDF incrementallyT)rS  rZ  )r^  r   PDF_ENCRYPT_KEEPr   r   r   r   saveIncr     zDocument.saveIncrrs   c                 C   s.   | j |f||||||||	|
||||||dS )z' Save PDF using some different defaults)rN  rO  rP  rQ  rR  rS  rT  rU  rV  rY  rZ  r[  r\  r]  rW  )r^  )r   r  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rY  rZ  r[  r\  r]  rW  r   r   r   ez_save  s    
zDocument.ez_savere  r  c                 C   s   i }|j }|j D ]\}}| | |||< q
|  d}td | |}t	|}| D ]\}}|| }||_
||j|< q1|S )zMake a fresh copy of a page.Nr  )r  r6  r  r  _eraser  store_shrinkr  r4  r5  r  )r   re  
old_annotsr  r  r   
page_proxyrK   r   r   r   reload_page  s   




zDocument.reload_pagec                 C   P   |   }|dkr
dS | |d}|d dkrdS |d dkr&|d dd S dS )z'Return the PDF PageMode value.
        r   NPageModerH  UseNoner   r   r5  r  r   r  r  r   r   r   pagemode     zDocument.pagemoderS  c                 C   |   d}|   }|dkrtd|std|d dkr |dd }|D ]}| | kr9| |dd|   d	S q"td)
zSet the PDF PageMode value.)rP  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   	not a PDFzbad PageMode valuer  r   NrO  Tr5  r{   r  r  )r   rS  validr  r   r   r   r   set_pagemode     zDocument.set_pagemodec                 C   rN  )z)Return the PDF PageLayout value.
        r   N
PageLayoutrH  
SinglePager   r   rQ  rR  r   r   r   
pagelayout  rT  zDocument.pagelayoutrb  c                 C   rU  )
zSet the PDF PageLayout value.)ra  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r[  zbad PageLayout valuer  r   Nr`  Tr\  )r   rb  r]  r  r   r   r   r   set_pagelayout+  r_  zDocument.set_pagelayoutc                 C   s  |   }|dkr
dS | |d}|d dkri S |d dkr0t|d  d }| j|dd}n|d d	kr;|d }nd}|dksQ|dd
 dkrQ|dd dksSi S dddd}|d
d d}|dd D ]}z| \}}W n	   | Y   S |dkrd||< qh|S )zReturn the PDF MarkInfo value.r   NMarkInforH  r  r   Tr  r  rr   <<r  >>FMarkedUserPropertiesSuspectsr  true)r5  r  rr  r  r  )r   r  r  r  r]  r   r#  r   r   r   r   markinfo<  s2   
(zDocument.markinforq  c                 C   s   |   }|dkrtd|rt|tsdS dddd}t| | s8dt| |  }t|d}|| |	 D ]#\}}t
| }|dvr\td| d	| d
|d| d| 7 }qC|d7 }| |d| dS )zSet the PDF MarkInfo values.r   r[  Frl  zbad MarkInfo key(s): rj  )rp  falsezbad key value 'z': 'r  r  r  rk  ri  T)r5  r{   r   r  r    r  
issupersetr  r  r  r   r  r  )r   rq  r  r]  badkeyspdfdictr#  r   r   r   r   set_markinfoZ  s&   
zDocument.set_markinfoc                 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   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 )NTFrr   r   )r   rr  r  r   r  rz   r  r  )r   r*  r
  r  r   r   r   rL  {  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.  r{   r   rr  rA  r  r   r  rD  slicer  r  r  r  )r   r   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  r  r{   r  )r   r  r  r  r  r   r   r   pages  s"   
zDocument.pagesc                 C   r   r&   )r  r   r   r   r   r     r  zDocument.__len__c                 C   s$   t |}|| jv rd| j|< dS dS )z&Remove a page from document page dict.N)r7  r  )r   re  pidr   r   r   _forget_page  s   
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  ri  rI  clearr   re  r   r   r   r&    s   zDocument._reset_page_refsc                 C   sP   |    | j D ]}d | j|< q	i | _i | _i | _g | _d | _d | _d| _d S NT)	r&  r  r  r  r  r  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   r{   r  __swig_destroy__r  r   r   r   r   close  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    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__  rI   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   rK  NN)FFFFFFFFFFFFr   rK  NN)	r  r  r  r  r   r   r   r   N)r  r  r  r  TTr   r   )r  r  r  r   )r   r   Nr  )FF)r   Nr   r   )r  NNr   NN)NNNNN)r  r   NNF)rs   FTTTFFFFFr   rK  NNT)re  r  ry  r  )re  r  )r   r   r0   r   r   r   r   r   delete_Documentr  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  typingUnionrr  r   r  r  r  r  r  r  r  OptBytesOptStrr  
ByteStringr  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r'  r+  r/  r1  r3  r5  r7  r9  r.  r<  r>  r@  rB  rG  rJ  r^  ra  rp  rx  rz  r~  r  r[  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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/  r1  r5  r7  r8  r;  r<  rA  rD  rF  rH  rM  rS  r^  rb  rh  rq  rv  rL  r   AnyTypery  OptIntrz  r   r|  r&  r  r  r  r  r  r   r   r   r   r    s   Y 

#	










6


2	""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ZMdde=de1fddZNG dd deOZPG dd deOZQdeOfddZRdddZSd
ddZTdd ZUdd ZVdddZWdd ZXdd ZYeeYddZZedd Z[edd Z\dd Z]dd Z^edd Z_edd Z`dd Zaedd Zbedd Zcedd Zdedd ZeddÄ Zfddń ZgddǄ ZhddɄ Zidd˄ Zjedd̈́ Zkddτ Zlddф ZmdddӄZndddՄZoddd؄Zpddڄ Zq		ddd݄Zrdd߄ Zsedd Ztdd ZudeddfddZvedd Zwdd Zxd
ddZyd
ddZzd
ddZ{dd Z|dd Zdd Z}edd Z~dd Zdd ZdddZddd Zdd Zdd Zedd ZdS (  r,  c                 C   r  r&   r  r  r   r   r   rD  
  r  zPage.<lambda>c                 C   r  r&   r  r  r   r   r   rD  
  r  r  r  c                 O   r   NzNo constructor definedr   r   r   kwargsr   r   r   r     r   zPage.__init__c                 C   s   t |  t| }t|}|jr@| jjr@| j}|j|j	}}| j
dvr(||}}tdd||}tjdd d }t|tjd |S )zGet page rectangle.)r   r  r   F)r  r  rs  )r  r   
Page_boundr   r  r  r.  cropboxr4  r5  r/  r  mupdf_warningsrp  r  rw  r~  )r   r  cbr]  r   r  r   r   r   bound  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   ?  rE  z'Page.get_image_bbox.<locals>.<listcomp>Tr   zbad image namez!found multiple images named '%s'.)r   )r  r  r  r  r{   r   rl   r   r  r   rr  r/  r  rz   get_image_rectsr   Page_get_image_bboxr   r*  rR   rH   rw  rx  r   ru  rv  )r   r   r   r  inf_rectnull_matr  r  imglistr  r  r   r  r  hmr   r]  m0r   r   r  r   get_image_bbox&  sb   

	
zPage.get_image_bboxc                 C      t |  t| ||S )zRun page through a device.)r  r   Page_run)r   dwr   r   r   r   runh     zPage.runNc                 C   re   r&   )r   Page_extend_textpage)r   tpager^  rT   r   r   r   extend_textpageo  rk   zPage.extend_textpagec                 C   s   t | |||}d|_|S r  )r   Page__get_textpager   )r   r  r^  rT   r  r   r   r   _get_textpager  s   zPage._get_textpager  r^  ry  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^  rT   )r  rl   r/  r0  r  r4  r5  r  )r   r  r^  rT   r1  textpager   r   r   get_textpagey  s    


zPage.get_textpagec                 C   r>   )zPage language.)r   Page_languager   r   r   r   r       
zPage.languagec                 C      t |  t| |S )zSet PDF page default language.)r  r   Page_set_languager   r   r   r   r!       zPage.set_languager   c                 C   r  )zMake SVG image from page.)r  r   Page_get_svg_image)r   rT   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   r  r  zfitzca%02i%02i)rr  r   r   r   Page__set_opacity)r   gstateCAca	blendmodetCAtcar   r   r   _set_opacity  s   zPage._set_opacityc                 C   rG   r&   )r   Page__add_caret_annot)r   r_   r   r   r   _add_caret_annot  rI   zPage._add_caret_annotc              	   C   r  r&   )r   Page__add_redact_annot)r   r/  rg   da_stralignfillr  r   r   r   _add_redact_annot  r-   zPage._add_redact_annotc                 C   rA   r&   )r   Page__add_line_annot)r   r}  r~  r   r   r   _add_line_annot  rF   zPage._add_line_annotc                 C   re   r&   )r   Page__add_text_annot)r   r_   rg   iconr   r   r   _add_text_annot  rk   zPage._add_text_annotc                 C   rG   r&   )r   Page__add_ink_annot)r   r  r   r   r   _add_ink_annot  rI   zPage._add_ink_annotc                 C   rA   r&   )r   Page__add_stamp_annot)r   rR   stampr   r   r   _add_stamp_annot  rF   zPage._add_stamp_annotc              	   C   r  r&   )r   Page__add_file_annot)r   r_   r  r  r  r  r  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-  )
r  r  r.  r{   r   Page__add_text_markerr4  r5  r6  r7  )r   r  
annot_typer  r   r   r   _add_text_marker  s   zPage._add_text_markerc                 C   rA   r&   )r   Page__add_square_or_circle)r   rR   r  r   r   r   _add_square_or_circle  rF   zPage._add_square_or_circlec                 C   rA   r&   )r   Page__add_multiline)r   pointsr  r   r   r   _add_multiline  rF   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   ETrr   r   rs   r   )r  i     0 0 %g %g re   
W
n
    ry      
   frv   s   1 w
   S   B)r   Page__add_freetext_annot_getAPfindr  r  _setAP)r   rR   rg   ri   rh   r  r  r  r  r  r  apBTETr]  r   ri  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.)rl   r  _rotate_matrixr   r   r   r   rotation_matrix  r   zPage.rotation_matrixc                 C   r  )zReflects page de-rotation.)rl   r  _derotate_matrixr   r   r   r   derotation_matrix   r   zPage.derotation_matrixr_   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   )r2  r  r0  r8  )r   r_   r1  rK   r   r   r   add_caret_annot  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+  r  r  PDF_ANNOT_STRIKE_OUTr   r  r  r  r  r  r   r   r   add_strikeout_annot     zPage.add_strikeout_annotc                 C   r  )zAdd a 'Underline' annotation.Nr  )r+  r  r  PDF_ANNOT_UNDERLINEr  r   r   r   add_underline_annot  r  zPage.add_underline_annotc                 C   r  )zAdd a 'Squiggly' annotation.Nr  )r+  r  r  PDF_ANNOT_SQUIGGLYr  r   r   r   add_squiggly_annot#     zPage.add_squiggly_annotc                 C   r  )zAdd a 'Highlight' annotation.Nr  )r+  r  r  PDF_ANNOT_HIGHLIGHTr  r   r   r   add_highlight_annot-  r  zPage.add_highlight_annotrR   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   )r2  r  PDF_ANNOT_SQUAREr0  r8  r   rR   r1  rK   r   r   r   add_rect_annot7     

zPage.add_rect_annotc              	   C   r  )z*Add a 'Circle' (ellipse, oval) annotation.r   )r2  r  PDF_ANNOT_CIRCLEr0  r8  r  r   r   r   add_circle_annotC  r  zPage.add_circle_annotNoterg   r  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.)r  r   )r2  r  r0  r8  )r   r_   rg   r  r1  rK   r   r   r   add_text_annotO  s   

zPage.add_text_annotr}  r~  c              	   C   P   t | }z| ||}W |dkr| | n|dkr | | w w t| | |S )zAdd a 'Line' annotation.r   )r2  r  r0  r8  )r   r}  r~  r1  rK   r   r   r   add_line_annot[  r  zPage.add_line_annotr  c              	   C   r  )zAdd a 'PolyLine' annotation.r   )r2  r  PDF_ANNOT_POLY_LINEr0  r8  r   r  r1  rK   r   r   r   add_polyline_annotg  r  zPage.add_polyline_annotc              	   C   r  )zAdd a 'Polygon' annotation.r   )r2  r  PDF_ANNOT_POLYGONr0  r8  r  r   r   r   add_polygon_annots  r  zPage.add_polygon_annotr  c              	   C   r  )z$Add a ('rubber') 'Stamp' annotation.r   )r2  r  r0  r8  )r   rR   r  r1  rK   r   r   r   add_stamp_annot  r  zPage.add_stamp_annothandwritingc              	   C   r   )znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )r2  r  r0  r8  )r   r   r1  rK   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  r  r   )r2  r  r0  r8  )	r   r_   r  r  r  r  r  r1  rK   r   r   r   add_file_annot  s"   

zPage.add_file_annotri   rh   r  r  r  r  r  c
                 C   s`   t | }
z| j|||||||||	d	}W |
dkr| |
 n|
dkr(| |
 w w t| | |S )zAdd a 'FreeText' annotation.)ri   rh   r  r  r  r  r  r   )r2  r  r0  r8  )r   rR   rg   ri   rh   r  r  r  r  r  r1  rK   r   r   r   add_freetext_annot  s   


zPage.add_freetext_annotTr  	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  rp   rs   r  r  r   r   r   )rg   r  r  r  r   r  r  r  )r  r   rz   r  r2  r  r0  r8  r  rp  r  r  r  )r   r/  rg   rh   ri   r  r  r  r$  r  r  r1  rK   ap_tabr  LLLRURULr  r   r   r   add_redact_annot  s^   













zPage.add_redact_annotc                 C   rA   r&   )r   Page__load_annotr   r   r  r   r   r   _load_annot  rF   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)r  r   Page_load_widgetr   r4  r5  r  r6  r7  r  r  _fill_widget)r   r  r  widgetr   r   r   load_widget  s   zPage.load_widgetc                 C   r>   r&   )r   Page__get_resource_propertiesr   r   r   r   _get_resource_properties  r@   zPage._get_resource_propertiesc                 C   rA   r&   )r   Page__set_resource_propertyr-  r   r   r   _set_resource_property  rF   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  r{   r4  r  ri  r6  )	r   r  r  checkpropsrZ   r   r   mcr   r   r   _get_optional_content  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  r7  ocgr8  ocmd)r4  r  r  r  )r   r  pnamer  rg   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.)r  r   Page_annot_namesr   r   r   r   annot_names>     
zPage.annot_namesc                 C   rB  )z6List of xref numbers of annotations, fields and links.)r  r   Page_annot_xrefsr   r   r   r   annot_xrefsE  rE  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)r  r   r   rr  r{   r.  r   r4  r5  r  r6  r7  )r   rH  r  r   r  r   r   r   
load_annotL  s   zPage.load_annotr1  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)r  r  r.  r{   r  
_addWidgetr  r  r   r4  r5  r6  r7  r  r  )r   r1  r  rK   r   r   r   
add_widgeth  s   zPage.add_widgetc                 C   rA   r&   )r   Page__addWidget)r   r  r  r   r   r   rJ  {  rF   zPage._addWidgetc                 C   s   t |  t| |}d|_|S )zjMake a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.T)r  r   Page_get_displaylistr   )r   rh  r  r   r   r   get_displaylist~  s   zPage.get_displaylistFextendedc                 C   s$  d}| j |d}tt|D ]}|| }|d ds$t|d |d< nt|d |d< |d dkry|d }g }|D ]:}|d	 }	|d
d }
|	dkrVdt|
d	 |
d
 f}n|	dkrcdt|
d	 f}nt|	gdd |
D  }|| q:||d< |d dv r|D ]	}||||< q|||< q|S )a@  Retrieve vector graphics. The extended version includes clips.

        Note:
        For greater comfort, this method converts point-like, rect-like, quad-like
        tuples of the C version to respective Point / Rect / Quad objects.
        It also adds default items that are missing in original path types.
        )
	closePathr  r  r4  lineCaplineJoindashesstroke_opacityfill_opacityeven_oddrO  r   r  rR   scissorrk  r  r   r   Nri  quc                 S   r  r   r   r  r   r   r   r     r   z%Page.get_drawings.<locals>.<listcomp>r  )	get_cdrawingsr  rz   r;  r   r*  r   r  rY  )r   rO  allkeysr  r   npathr  newitemsr  cmdrestr  r   r   r   get_drawings  s2   
zPage.get_drawingsc                   @   rX  )zPage.Drawpathz0Reflects a path dictionary from get_cdrawings().c                 K   s   | j | d S r&   )r(   r  r  r   r   r   r     rk   zPage.Drawpath.__init__Nrv  r   r   r   r   Drawpath  s    ra  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )zPage.Drawpathlistz9List of Path objects representing get_cdrawings() output.c                 C   s.   g | _ d| _d| _d| _d| _d| _d| _d S r   )paths
path_countgroup_count
clip_count
fill_countstroke_countfillstroke_countr   r   r   r   r     s   
zPage.Drawpathlist.__init__c                 C   s   | j | |  jd7  _|jdkr|  jd7  _d S |jdkr)|  jd7  _d S |jdkr7|  jd7  _d S |jdkrE|  jd7  _d S |jdkrS|  jd7  _d S d S )Nr   r  rk  ry   r   fs)	rb  r  rc  r   re  rd  rf  rg  rh  )r   ry  r   r   r   r    s   




zPage.Drawpathlist.appendc                       || j kr	td|dk r|| j 7 }|dk s| j| j tt fdd| jd| D }|g kr4g S |d g}|dd D ]}|j|d jkrJq?|| q?|S )zReturn list of parent clip paths.

            Args:
                i: (int) return parents of this path.
            Returns:
                List of the clip parents.bad path indexr   c                    $   g | ]}|j d kr|j k r|qS )r  r   levelr   rZ   lvlr   r   r     
    z2Page.Drawpathlist.clip_parents.<locals>.<listcomp>Nr   r  rc  r   rb  rn  r  rB  r  )r   r   clipsnclipsrZ   r   rp  r   clip_parents  *   


	
zPage.Drawpathlist.clip_parentsc                    rj  )zReturn list of parent group paths.

            Args:
                i: (int) return parents of this path.
            Returns:
                List of the group parents.rk  r   c                    rl  )rk  rm  ro  rp  r   r   r     rr  z3Page.Drawpathlist.group_parents.<locals>.<listcomp>Nr   r  rs  )r   r   groupsngroupsrZ   r   rp  r   group_parents  rw  zPage.Drawpathlist.group_parentsc                 C   r  r&   )rb  r   )r   r  r   r   r   r     rI   zPage.Drawpathlist.__getitem__c                 C   r  r&   )rb  r   r   r   r   r   r     r@   zPage.Drawpathlist.__len__N)
r   r   r0   r1   r   r  rv  rz  r   r   r   r   r   r   Drawpathlist  s    	r{  c           
      C   s,  | j dd}|  }|D ]}| jdi |}|jdkr#t|d |_nt|d |_|jdkru|d }g }|D ]:}|d }|d	d
 }	|dkrSdt|	d |	d	 f}n|dkr`dt|	d f}nt|gdd |	D  }|	| q7||_
|jdkrd
|_d
|_d
|_d
|_d
|_d
|_|	| qd
}|S )aX  Get page drawings paths.

        Note:
        For greater comfort, this method converts point-like, rect-like, quad-like
        tuples of the C version to respective Point / Rect / Quad objects.
        Also adds default items that are missing in original path types.
        In contrast to get_drawings(), this output is an object.
        TrW  r  rR   rX  rk  r  r   r   Nri  rY  c                 S   r  r   r   r  r   r   r   r   2  r   z$Page.get_lineart.<locals>.<listcomp>ry   r   )rZ  r{  ra  r   r   rR   rX  r*  r   r  r  rT  rS  rR  rQ  r  r4  )
r   r  rb  ry  r\  r  r]  r  r^  r_  r   r   r   get_lineart  s<   



zPage.get_lineartc                 C   sF   t |  | j}|dkr| d t| |||}|dkr!| | |S )z3Extract vector graphics ("line art") from the page.r   )r  r/  r0  r   Page_get_cdrawings)r   rO  callbackmethodr1  r  r   r   r   rZ  D  s   

zPage.get_cdrawingsc                 C   sB   t |  | j}|dkr| d t| |}|dkr| | |S r   )r  r/  r0  r   Page_get_bboxlog)r   layersr1  r  r   r   r   get_bboxlogV  s   

zPage.get_bboxlogc                 C   s@   t |  | j}|dkr| d t| }|dkr| | |S r   )r  r/  r0  r   Page_get_texttrace)r   r1  r  r   r   r   get_texttraceg  s   


zPage.get_texttracec                 G   s   t j| g|R  S r&   )r   Page__apply_redactionsr  r   r   r   _apply_redactionsx  r   zPage._apply_redactionsc              	   C   r  r&   )r   Page__makePixmap)r   r  ctmcsalpharh  r  r   r   r   _makePixmap{  r-   zPage._makePixmapc                 C   r  )zSet the MediaBox.)r  r   Page_set_mediaboxr   rR   r   r   r   set_mediabox~  r  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     rE  z#Page.load_links.<locals>.<listcomp>r   rr   r   )r  r   Page_load_linksr   r4  r5  r  r6  r7  r.  rG  r  )r   r  link_idr   r   r   
load_links  s   


zPage.load_linkszFirst link on pagec                 C   s:   t |  t| }|rd|_t| |_|| jt|< |S )zFirst annotation.T)	r  r   Page_first_annotr   r4  r5  r  r6  r7  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)r  r   Page_first_widgetr   r4  r5  r  r6  r7  r  r  r0  r   r  r1  r   r   r   first_widget  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   Nr7  )r  r   Page_delete_linkr6  rI  )r   linkdictr  linkidlinkobjr   r   r   delete_link  s   

zPage.delete_linkc                 C   sF   t |  t | t| |}|r!d|_t| |_||jjt|< |S )z!Delete annot and return next one.T)	r  r   Page_delete_annotr   r4  r5  r  r6  r7  )r   rK   r  r   r   r   delete_annot  s   zPage.delete_annotc                 C   "   t |  t| }tt|}|S )zThe MediaBox.)r  r   Page_mediaboxr   r  r  r   r   r   mediabox     
zPage.mediaboxc                 C   r  )zThe CropBox.)r  r   Page_cropboxr   r  r  r   r   r   r    r  zPage.cropboxc                 C   rG   r&   )r   Page__other_box)r   boxtyper   r   r   
_other_box  rI   zPage._other_boxc                 C   r  r&   )r  r+  r   r   r   r   cropbox_position  rn  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   rs   rr   r   r  r  r  r   r   r   rR   mbr   r   r   artbox  
   
*zPage.artboxc                 C   r  )zThe TrimBoxTrimBoxNr   rs   rr   r   r  r  r   r   r   trimbox  r  zPage.trimboxc                 C   r  )zThe BleedBoxBleedBoxNr   rs   rr   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   rs   rr   r   zrect is infinite or emptyzrect not in mediabox[%g %g %g %g])r  r{   r.  r  r   r   r  r  r  r  r  r   )r   r  rR   r  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,  rA  zPage.set_cropboxc                 C   r  )zSet the ArtBox.r  r  r  r   r   r   
set_artbox0  rA  zPage.set_artboxc                 C   r  )zSet the BleedBox.r  r  r  r   r   r   set_bleedbox4  rA  zPage.set_bleedboxc                 C   r  )zSet the TrimBox.r  r  r  r   r   r   set_trimbox8  rA  zPage.set_trimboxc                 C   rB  )zPage rotation.)r  r   Page_rotationr   r   r   r   r/  <     
zPage.rotationc                 C   r  )zSet page rotation.)r  r   Page_set_rotation)r   r/  r   r   r   r0  E  r  zPage.set_rotationc                 C   r  )z&Add links from list of object sources.)r  r   Page__addAnnot_FromString)r   linklistr   r   r   _addAnnot_FromStringL  r  zPage._addAnnot_FromStringc                 C   s&   t |  |s| js|   t| |S )z%Clean page /Contents into one object.)r  
is_wrappedwrap_contentsr   Page_clean_contentsr   sanitizer   r   r   clean_contentsS  s   
zPage.clean_contentsc	           	      C   s   t | ||||||||	S r&   )r   Page__show_pdf_page)	r   
fz_srcpageoverlayrT   r  r  r  graftmap_imgnamer   r   r   _show_pdf_page\  s   zPage._show_pdf_pager  c                 C   s(   t | |||||||||	|
|||||S r&   )r   Page__insert_image)r   r  pixmapr  imaskr  r  r  keep_proportionr  r4  r5  r  r  r  digestsr   r   r   _insert_image_  s   (zPage._insert_imagec                 C   s   | j }|| }|} d S r&   )r  rM  )r   r  re  r   r   r   refreshb  s   
zPage.refreshr  c                 C   s  | j }|d u rtdd}|dr|dd  }t|}	|	t kr)td|	 t| |}
|
d urD|
d }t||r=|S || |S t	
| d }d}d}g d}g d}z	||}d}W n   Y |dk rxz	||}d}W n   Y | t v rd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   zbad fontname chars r  )rP  rQ  rT  rV  )rR  rS  rU  rW  r  r   zbad fontfile)fontdict)r  r{   r;  r  r  r    r  r  get_char_widthsrX  rY  r  r  rA  r  pymupdf_fontsmyfontr   r   r   r   _insertFont)r   rh   r  r  
set_simplewmoderj   r  r  	inv_charsr  r  r  serif
CJK_number
CJK_list_n
CJK_list_sr  fontfile_strr  r  r   r   r   insert_fonth  sp   












zPage.insert_fontc                 C   s   t | |||||||||	|
S r&   )r   Page__insertFont)r   rh   r  r  r  r  r  r  r  rj   r  r   r   r   r    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  )r  r   Page_transformation_matrixr/  rl   r  r5  r  r   r   r   transformation_matrix  s   
zPage.transformation_matrixc                 C   rB  )zGet xrefs of /Contents objects.)r  r   Page_get_contentsr   r   r   r   get_contents  rE  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 streamContentsz%i 0 RN)
r  r  r  r{   r.  r  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.
        Nrb  )	get_links)r   kinds	all_linkslinkr   r   r   rg    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   rN   )
skip_typesr   r   r     r  zPage.annots.<locals>.<listcomp>c                    s,   g | ]}|d  v r|d   vr|d qS r  r   r  r  typesr   r   r     r0  TN)r  PDF_ANNOT_POPUPPDF_ANNOT_WIDGETr   rG  rI  _yielded)r   r  rG  r  rK   r   r  r   rh    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   "  r  z Page.widgets.<locals>.<listcomp>N)rG  r2  r  )r   r  widget_xrefsr  r1  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r  r  r   r  r  r  rM  r   r   r   r  )     zPage.__str__c                 C   r  r  r  rM  r   r   r   r   2  r  zPage.__repr__c                 C   s*   | j  D ]}|r|  q| j   dS )z,Invalidate / delete all annots of this page.N)r6  ri  rI  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.)r  r  r  r  r   r   r   r   r  B  s   z	Page.xrefc                 C   sN   |    d | _z| j|  W n   Y t| ddr| |  d | _d | _d S r  )r  _image_infosr  r|  r   r  r  r   r   r   r   rI  H  s   

zPage._erasec                 C   r  r&   rI  r   r   r   r   r  U  rI   zPage.__del__c                 C   s   t |  | jj| j|dS )z)List of fonts defined in the page object.r%  )r  r  r-  r  )r   r%  r   r   r   r  Y  s   zPage.get_fontsc                 C   s   t |  | jj| j|d}|S )z*List of images defined in the page object.r  )r  r  r/  r  )r   r%  r  r   r   r   
get_images_  s   zPage.get_imagesc                 C   r	  )z,List of xobjects defined in the page object.)r  r  r1  r  r   r   r   r   get_xobjectsf  s   zPage.get_xobjectsc                 C   r>   )z7All /Contents streams concatenated to one bytes object.)r  _get_all_contentsr   r   r   r   r  l  rO  zPage.read_contentsc                 C   s   t | jj| jjS r&   )r   r  r   r   r   r   r   r   mediabox_sizeq  rG  zPage.mediabox_sizer  r   N)Nr   Nr&   )Nr   )Nr   r   Nr  r  )r  NNNNr   r   r  )ry  r  )r  )NNr  r   NNTr  r  )r   r   N)r   Nr   r   NNN)NNNNNr   r   r   r   r   r   r   r  NN)r  NNFr   r   )r   r   r0   r   r   r   r   r   r   delete_Pager  r  rR   r  r  r  r  r5   rr  r  r  r!  r  r  r  r  r  r  r  r  r  r  r  r  r  rl   r  r  r4   r  r  r	  r  r  r  r  r   r  r  r  r  r  r  r!  r  r  r  r"  r}   OptSeqr#  r   r+  r.  r2  r4  r6  r  r<  rA  rD  rG  r  rI  r  rK  rJ  rN  r`  objectra  r{  r|  rZ  r  r  r  r  r  r  
first_linkr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/  r0  r  r  r  r  r  r  r  r  r  r  r  r  rg  rh  r  r  r  r  rI  r  r  r  r  r  r  r   r   r   r   r,  	  sv   B
"		





5'\/


	






	Q

		
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dnddZdd ZdoddZdpddZdqd"d#Zd$d% Zdrd&d'Zd(d)d*d+Zd(d)d,d-Zdsd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zed:d; Z ed<d= Z!dtd?d@Z"dsdAdBZ#edCdD Z$edEdF Z%edGdH Z&edIdJ Z'edKdL Z(edMdN Z)edOdP Z*edQdR Z+edSdT Z,edUdV Z-edWdX Z.edYdZ Z/ed[d\ Z0ed]d^ Z1ed_d` Z2edae3fdbdcZ4e(Z5e)Z6ddde Z7dfdg Zdhdi Z8djdk Z9dldm Z:dS )urr  c                 C   r  r&   r  r  r   r   r   rD  y  r  zPixmap.<lambda>c                 C   r  r&   r  r  r   r   r   rD  y  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   Pixmap_swiginit
new_Pixmapr  r   r   r   r   }  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)r  r  r{   r   Pixmap_warp)r   r/  r4  r5  r   r   r   warp  s   zPixmap.warpc                 C   r  )zoDivide width and height by 2**factor.
                E.g. factor=1 shrinks to 25% of original size (in place).)r  r   Pixmap_shrink)r   factorr   r   r   shrink     zPixmap.shrinkc                 C   r  )z=Apply correction with some float.
        gamma=1 is a no-op.)r  r   Pixmap_gamma_with)r   gammar   r   r   
gamma_with  r  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.rs   z(warning: colorspace invalid for functionN)r  rs  r  r  r   Pixmap_tint_with)r   blackwhiter   r   r   	tint_with  s
   zPixmap.tint_withc                 G   s   t |  tj| g|R  S )z*Fill all color components with same value.)r  r   Pixmap_clear_withr  r   r   r   
clear_with     zPixmap.clear_withc                 C   r  )zCopy bbox from another Pixmap.)r  r   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.
        )r  r   Pixmap_set_alpha)r   alphavaluespremultiplyopaquematter   r   r   	set_alpha  s   
zPixmap.set_alphac                 C   rA   r&   )r   Pixmap__tobytes)r   r  jpg_qualityr   r   r   _tobytes  rF   zPixmap._tobytesrq  r  c                 C   s   t |  ddddddddddd
}|| d}|dkr+td	| d
t|  | jr8|dv r8td| | jrK| jjdkrK|dv rKtd| |dkrW| 	| j
| j | ||}|S )a0  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 JPG, JPEG, PNM, PGM, PPM,
                    PBM, PAM, PSD, PS.
        Returns:
            Bytes object.
        r   rr   rs   r   rn   r
  
rq  pnmpgmppmpbmpampsdpsjpgjpegNImage format  not in rr   rn   r
  '%s' cannot have alphar   rr   r   unsupported colorspace for '%s')r  rY  r  r{   r   r  r  rs  r  set_dpixresyresr2  )r   outputr1  valid_formatsr  barrayr   r   r   ru    s   

zPixmap.tobytesc                 C   r)  r&   )r  r   Pixmap_pdfocr_save)r   r  r  r  rr  r   r   r   pdfocr_save  r'  zPixmap.pdfocr_saveTengc                 C   sJ   t ds|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.
            tessdata: (str) folder name of Tesseract's language support. Must be
                    given if environment variable TESSDATA_PREFIX is not set.
        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.
        r3   z'No OCR support: TESSDATA_PREFIX not setr   r_  )r  r  rr  )ru  rv  r  r  r  r  rJ  r  )r   r  r  rr  r  r`  r   r   r   pdfocr_tobytes  s   zPixmap.pdfocr_tobytesc                 C   re   r&   )r   Pixmap__writeIMG)r   r  r  r1  r   r   r   	_writeIMG  rk   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
}|d
krVt
d| dt|  | jrc|dv rct
d| | jrv| jjdkrv|dv rvt
d| |dkr| | j| j | |||S )zOutput as image in format determined by filename extension.

        Args:
            output: (str) only use to overrule filename extension. Default is PNG.
                    Others are JPEG, JPG, PNM, PGM, PPM, PBM, PAM, PSD, PS.
        r   rr   rs   r   rn   r
  r3  r  r   Nr=  r>  r?  r@  rA  rB  )r  r   r   r   r   ru  ry  splitextrY  r  r{   r   r  r  rs  r  rC  rD  rE  rN  )r   r  rF  r1  rG  r  r  r  r   r   r   r^    s.   




zPixmap.saveF)
unmultiplyc                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rI| jdkr>d	nd
}|d
krH|rHd}nd}||| j	| j
f| j}d| vre| j| jf|d< |j|i | dS )aF  Write 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.

        :arg bool unmultiply: generates Pillow mode "RGBa" instead of "RGBA".
            Relevant for colorspace RGB with alpha only.
        r   )ImagezPillow not installedNLr   LArs   RGBRGBARGBaCMYKdpi)r  PILrQ  ImportErrorr  rs  r  r  	frombytesr4  r5  samplesr  rD  rE  r^  )r   rP  r   r  rQ  cspacemoder  r   r   r   pil_save+  s,   	

zPixmap.pil_savec                O   s>   t |  ddlm} | }| j|g|R d|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_  rP  )r  r  r  r_  r  )r   rP  r   r  r  	bytes_outr   r   r   pil_tobytesN  s
   zPixmap.pil_tobytesc                 C   rG   )z Invert the colors inside a bbox.)r   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.)r  r   Pixmap_pixelr   r   r   r   r   r   pixelb  s   zPixmap.pixelc                 C   s   t |  t| |||S )zSet color of pixel (x, y).)r  r   Pixmap_set_pixel)r   r   r   r  r   r   r   	set_pixelj  s   zPixmap.set_pixelc                 C   r  )zSet top-left coordinates.)r  r   Pixmap_set_originrf  r   r   r   
set_originq  r  zPixmap.set_originc                 C   r  )z"Set resolution in both dimensions.)r  r   Pixmap_set_dpi)r   rD  rE  r   r   r   rC  x  r  zPixmap.set_dpic                 C   r  )z Set color of all pixels in bbox.)r  r   Pixmap_set_rect)r   r  r  r   r   r   set_rect  r  zPixmap.set_rectc                 C   rB  )zCheck if pixmap is monochrome.)r  r   Pixmap_is_monochromer   r   r   r   is_monochrome  r  zPixmap.is_monochromec                 C   rB  )z#Check if pixmap has only one color.)r  r   Pixmap_is_unicolorr   r   r   r   is_unicolor  r  zPixmap.is_unicolorr   c                 C   r  )zReturn count of each color.)r  r   Pixmap_color_count)r   colorsr  r   r   r   color_count  r  zPixmap.color_countc                 C   s   t |  d}d}|dkr| jt|v r| j}| jd|d D ]\}}||7 }||kr/|}|}q|s<dtdg| j fS || |fS )z/Return most frequent color and its usage ratio.r   NT)rt  r  r   r  )r  rm  r   ru  r  r  r  )r   r  	allpixelscntrg  countmaxpixelr   r   r   color_topusage  s   zPixmap.color_topusagec                 C   rB  )zMD5 digest of pixmap (bytes).)r  r   Pixmap_digestr   r   r   r   digest  r  zPixmap.digestc                 C   rB  )z%Length of one image line (width * n).)r  r   Pixmap_strider   r   r   r   stride  r  zPixmap.stridec                 C   rB  )zResolution in x direction.)r  r   Pixmap_xresr   r   r   r   rD    r  zPixmap.xresc                 C   rB  )zResolution in y direction.)r  r   Pixmap_yresr   r   r   r   rE    r  zPixmap.yresc                 C   rB  )z
The width.)r  r   Pixmap_wr   r   r   r   r]    r  zPixmap.wc                 C   rB  )zThe height.)r  r   Pixmap_hr   r   r   r   r     r  zPixmap.hc                 C   rB  )zx component of Pixmap origin.)r  r   Pixmap_xr   r   r   r   r     r  zPixmap.xc                 C   rB  )zy component of Pixmap origin.)r  r   Pixmap_yr   r   r   r   r     r  zPixmap.yc                 C   rB  )zThe size of one pixel.)r  r   Pixmap_nr   r   r   r   r    r  zPixmap.nc                 C   rB  )z$Indicates presence of alpha channel.)r  r   Pixmap_alphar   r   r   r   r    r  zPixmap.alphac                 C   rB  )zPixmap Colorspace.)r  r   Pixmap_colorspacer   r   r   r   rs    r  zPixmap.colorspacec                 C      t |  t| }t|}|S )zPixmap bbox - an IRect object.)r  r   Pixmap_irectr@  r  r   r   r   rm       
zPixmap.irectc                 C   rB  )zPixmap size.)r  r   Pixmap_sizer   r   r   r   r    r  zPixmap.sizec                 C   rB  )zPixmap samples memoryview.)r  r   Pixmap_samples_mvr   r   r   r   
samples_mv  r  zPixmap.samples_mvc                 C   rB  )zPixmap samples pointer.)r  r   Pixmap_samples_ptrr   r   r   r   samples_ptr!  r  zPixmap.samples_ptrry  c                 C   s
   t | jS r&   )r  r  r   r   r   r   r\  *  rO  zPixmap.samplesc                 C   r   r&   )r  r   r   r   r   r   1  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#  )r  r   rr  rs  r   rm  r  r   r   r   r   r   4  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   rr  r   r  r   r   r   r   r  C  
   zPixmap.__del__)Nr   NN)rq  r  )r   NN)TrK  N)Nr  r&   r  );r   r   r0   r   r   r   r   r   delete_Pixmapr  r   r  r  r   r$  r&  r)   r/  r2  ru  rJ  rL  rN  r^  r_  ra  rc  rg  ri  rk  rC  rn  rp  rr  ru  rz  r|  r~  rD  rE  r]  r   r   r   r  r  rs  rm  r  r  r  r  r\  r4  r5  r   r  r  r  r   r   r   r   rr  x  s    	





 #
















	


rr  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  r  r   r   r   rD  N  r  zColorspace.<lambda>c                 C   r  r&   r  r  r   r   r   rD  N  r  r  r  c                 C   s   t | t | dS )z!Supported are GRAY, RGB and CMYK.N)r   Colorspace_swiginitnew_Colorspace)r   r   r   r   r   r   R  r0  zColorspace.__init__c                 C   r>   )zSize of one pixel.)r   Colorspace_nr   r   r   r   r  V  r  zColorspace.nc                 C   r>   r&   )r   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   rs   r   )r  csGRAYr  rt  csCMYKr   r   r   r   r   a  s   


zColorspace.namec                 C   s   d| j  }d|| jf S )N)r   GRAYr   rT  rW  zColorspace(CS_%s) - %s)r  r   rM  r   r   r   r   m  s   
zColorspace.__repr__N)r   r   r0   r   r   r   r   r   delete_Colorspacer  r   r  r  r   r   r   r   r   r  M  s    

r  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  r  r   r   r   rD  u  r  zDevice.<lambda>c                 C   r  r&   r  r  r   r   r   rD  u  r  r  r  c                 G      t | t j|  d S r&   )r   Device_swiginit
new_Devicer  r   r   r   r   x  r-   zDevice.__init__N)r   r   r0   r   r   r   r   r   r   delete_Devicer  r   r   r   r   r  t  s
    
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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dd ZdS )Outlinec                 C   r  r&   r  r  r   r   r   rD    r  zOutline.<lambda>c                 C   r  r&   r  r  r   r   r   rD    r  r  r  c                 O   r   r  r  r  r   r   r   r     r   zOutline.__init__c                 C   r>   r&   )r   Outline_urir   r   r   r   r0       
zOutline.uric                 C   r>   r&   )r   Outline_nextr   r   r   r   r    r  zOutline.nextc                 C   r>   r&   )r   Outline_downr   r   r   r   r    r  zOutline.downc                 C   r>   r&   )r   Outline_is_externalr   r   r   r   r[    r  zOutline.is_externalc                 C   r>   r&   )r   Outline_pager   r   r   r   re    r  zOutline.pagec                 C   r>   r&   )r   	Outline_xr   r   r   r   r     r  z	Outline.xc                 C   r>   r&   )r   	Outline_yr   r   r   r   r     r  z	Outline.yc                 C   r>   r&   )r   Outline_titler   r   r   r   r    r  zOutline.titlec                 C   r>   r&   )r   Outline_is_openr   r   r   r   is_open  r  zOutline.is_openc                 C   s
   t | dS )zoutline destination detailsN)rY  r   r   r   r   r\    r  zOutline.destc                 C   s,   t | tsd S t| ddr| |  d S d S r  )r   r  r   r  r   r   r   r   r    s
   
zOutline.__del__N)r   r   r0   r   r   r   r   r   r   delete_Outliner  r0  r  r  r[  re  r   r   r  r  r\  r  r   r   r   r   r  ~  s4    









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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/d0 Zdd2d3Zd4d5 Z dd6d7Z!d8d9 Z"dd:d;Z#d<d= Z$d>d? Z%dd@dAZ&edBdC Z'edDdE Z(edFdG Z)ddIdJZ*	1	1	,	1	1	1	1	K	HddLe+dMe,dNe-dOe+dPe.dQe.dRe.dSe/dTe0fdUdVZ1ddWdXZ2edYdZ Z3d[d\ Z4ed]d^ Z5ed_d` Z6dadb Z7edcdd Z8dedf Z9dgdh Z:ddidjZ;edkdl Z<ddmdnZ=edodp Z>ddqdrZ?edsdt Z@ddvdwZAdxdy ZBdzd{ ZCed|d} ZDdd~dZEdd ZFdd ZGdd Zdd ZHd1S )r3  c                 C   r  r&   r  r  r   r   r   rD    r  zAnnot.<lambda>c                 C   r  r&   r  r  r   r   r   rD    r  r  r  c                 O   r   r  r  r  r   r   r   r     r   zAnnot.__init__c                 C   s*   t |  t| }t|}|| jj9 }|S )zannotation rectangle)r  r   
Annot_rectr   r  r  r  r   r   r   rR     s
   
z
Annot.rectc                 C   rB  )z$annotation delta values to rectangle)r  r   Annot_rect_deltar   r   r   r   
rect_delta  r  zAnnot.rect_deltac                 C   rB  )zannotation xref)r  r   
Annot_xrefr   r   r   r   r    r  z
Annot.xrefc                 C   rB  )zannotation IRT xref)r  r   Annot_irt_xrefr   r   r   r   irt_xref  r  zAnnot.irt_xrefc                 C   r  )zSet annotation IRT xref)r  r   Annot_set_irt_xrefr  r   r   r   set_irt_xref  r  zAnnot.set_irt_xrefc                 C   r  )zannotation appearance matrix)r  r   Annot_apn_matrixrl   r  r   r   r   
apn_matrix  r  zAnnot.apn_matrixc                 C   2   t |  t| }t|| jj }|| jj9 }|S )zannotation appearance bbox)r  r   Annot_apn_bboxr   r  r  r  r  r   r   r   apn_bbox  
   
zAnnot.apn_bboxc                 C   r  )z!Set annotation appearance matrix.)r  r   Annot_set_apn_matrix)r   rT   r   r   r   set_apn_matrix  r  zAnnot.set_apn_matrixc                 C   s4   t |  | j}|j}|j}|||  9 }t| |S )zSet annotation appearance bbox.)r  r  r  r  r   Annot_set_apn_bbox)r   r  re  rotr   r   r   r   set_apn_bbox  s   zAnnot.set_apn_bboxc                 C   rB  )zannotation BlendMode)r  r   Annot_blendmoder   r   r   r   r    r  zAnnot.blendmodec                 C   r  )zSet annotation BlendMode.)r  r   Annot_set_blendmode)r   
blend_moder   r   r   set_blendmode"  r  zAnnot.set_blendmodec                 C   rB  )z*Get annotation optional content reference.)r  r   Annot_get_ocr   r   r   r   get_oc)  rE  zAnnot.get_occ                 C   r  )z-Set 'open' status of annotation or its Popup.)r  r   Annot_set_open)r   r  r   r   r   set_open0  r  zAnnot.set_openc                 C   rB  )z-Get 'open' status of annotation or its Popup.)r  r   Annot_is_openr   r   r   r   r  6  r  zAnnot.is_openc                 C   rB  )z Check if annotation has a Popup.)r  r   Annot_has_popupr   r   r   r   	has_popup>  r  zAnnot.has_popupc                 C   r  )z.Create annotation 'Popup' or update rectangle.)r  r   Annot_set_popupr  r   r   r   	set_popupG  r  zAnnot.set_popupc                 C   r  )zannotation 'Popup' rectangle)r  r   Annot_popup_rectr   r  r  r  r  r   r   r   
popup_rectM  r  zAnnot.popup_rectc                 C   rB  )zannotation 'Popup' xref)r  r   Annot_popup_xrefr   r   r   r   
popup_xrefZ  r  zAnnot.popup_xrefr   c                 C   r  )z Set / remove annotation OC xref.)r  r   Annot_set_oc)r   r  r   r   r   set_occ  r  zAnnot.set_occ                 C   r>   )zannotation language)r   Annot_languager   r   r   r   r  i  r  zAnnot.languageNc                 C   r  )zSet annotation language.)r  r   Annot_set_languager   r   r   r   r!  q  r  zAnnot.set_languagec                 C   r>   r&   )r   Annot__getAPr   r   r   r   r  x  r@   zAnnot._getAPc                 C   rA   r&   )r   Annot__setAP)r   r  rR   r   r   r   r  {  rF   zAnnot._setAPc                 C   sZ   t | }|s	|S | j|d< t| \}}}||d< ||d< ||d< | jd }||d< |S )NrR   r  rh   ri   r  )r   Annot__get_redact_valuesrR   r  r  rt  )r   r  r  rh   ri   r  r   r   r   _get_redact_values~  s   


zAnnot._get_redact_valuesc                 C   s$   t |  t| ||}|rd|_|S )zMake annotation TextPage.T)r  r   Annot_get_textpager   )r   r  r^  r  r   r   r   r    s
   zAnnot.get_textpagec                 C   r  )zSet /Name (icon) of annotation.)r  r   Annot_set_namer  r   r   r   set_name  r  zAnnot.set_namec                 C   r  )zSet annotation rectangle.)r  r   Annot_set_rectr  r   r   r   rn    r  zAnnot.set_rectc                 C   r  )zSet annotation rotation.)r  r   Annot_set_rotation)r   r  r   r   r   r0    r  zAnnot.set_rotationc                 C   rB  )zannotation rotation)r  r   Annot_rotationr   r   r   r   r/    r  zAnnot.rotationc                 C   rB  )zannotation vertex points)r  r   Annot_verticesr   r   r   r   vertices  r  zAnnot.verticesc                 C   rB  )zColor definitions.)r  r   Annot_colorsr   r   r   r   rt    r  zAnnot.colorsr  c                 C   s   t | ||||S r&   )r   Annot__update_appearance)r   opacityr  r  r  r   r   r   _update_appearance  r   zAnnot._update_appearanceTr  r  ri   rh   r  r  r  r$  r  c
           >      C   sr  t |  dd }
| jd }| jdd}| jdd}| jd }|dkr'|}n| jd	 }d}| j}|	dkrY|	dk rA|	d
7 }	|	dk s9|	d
krM|	d
8 }	|	d
ksE|tkrY|	d dkrYd}	|du r`| j}t|dsh| j	}d|  krrdk swn |durzd}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|rid}#|"dd }"|"\}$}%}&}'}(|"|& |"|% |"|' |"|% |"|( |"d" |dkss|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rA|!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r2||1 |2 |/ d' |0 d' |! }!|dkr?|d' |! }!d}d}#|t$t%fv rd'|"dd d' }!d}#|d#krp|t$krf|!| d1 }!n|t%kro|!d" }!n|t$krz|!d2 }!n	|t%kr|!d" }!|dur||! }!|!&d3d4d}!d}#|r|d |! }!d}#d5|! d6 }!||  dkr5|t$t%fv r5dtj'tj(tj)tj*tj+tj,tj-tj.tj/f
}3t0dt|3}4d*t1d| jd  }5| j|5 |5 |5|5f }d}#| j2}6||4v rt3|6d | }7t3|6d | }8|3| | |7|8d|}9|!|9 7 }!| |4v r5t3|6d7 | }7t3|6d | }8|3|  | |7|8d|}9|!|9 7 }!|#rO|rH| 4| | j5|!dd8 n| j5|!dd8 |t6t7t8t9t:t%t$t;t<t=f
vr`dS | j>}:|:dkrjdS | jj?| jj@ d* };|:dkrtA|tBdd d9k rdS | jC|;| }<| 4|<j | DtBdd dS tB|:}=| jC|;|=}<| 4|<j | D||=  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.
            r  
)r  r  )r  codeccr   r   r   color_string  s   
z"Annot.update.<locals>.color_stringr   rS  Nr4  r  stroker  r   r  rp   r   /H gs
r   Frq   Trs   r  r  r   r  r  )r  r  r  r  zError updating annotation.ry   rv   [r  z] 0 d
utf-8r  r  r  s   %g w   ws   RGr  r  r  rr   r  r  r  r  r  s   %g w
r     b   ss   
S
s
   
S
[] 0 d
r  s   
Q
r  rQ   gh㈵>)Er  r   borderrY  rt  r  PDF_ANNOT_FREE_TEXTr  r   r  r  r  r  rz   r  
_update_dar  r  r  r  r  r|   r   r  	line_endsr  rp  PDF_ANNOT_REDACTr  r  r  rR   r4  r5  ru   rv   r  r  r  
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashr  r   r  r   rn  r  PDF_ANNOT_CARETr  PDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_LINEr  PDF_ANNOT_STAMPPDF_ANNOT_TEXTr/  r+  r.  r   rl   r=  r  )>r   r  r  ri   rh   r  r  r  r$  r  r  r  dtr  r  r  rR   apnmatopa_codetcolfnamer  update_default_appearancer  r  r  bfillbstrokep_ctmimatrS  line_end_leline_end_rir  r&  
ap_updatedr  r'  r(  r)  r*  ntabr(  r  r  r]  r   ri  r  r  r  le_funcsle_funcs_rangerw   r  r}  r~  leftr  Mr/  r   r   r   r   r    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.
        r  r  r  r  r   rC   []Nrp   r   [%g]r   rs   
[%g %g %g]r  z0Warning: fill color ignored for annot type '%s'.IC)r  r  r   r  rY  r  r  r	  r  r  r  r  r  r   r}   r  rz   r   r  )r   rt  r  r  r  fill_annotsr   r   r   r   
set_colors   sJ   







zAnnot.set_colorsc                 C   rB  )zLine end codes.)r  r   Annot_line_endsr   r   r   r   r  !  r  zAnnot.line_endsc                 C   r  )zSet line end codes.)r  r   Annot_set_line_ends)r   r  endr   r   r   set_line_ends !  r  zAnnot.set_line_endsc                 C   rB  )zannotation type)r  r   
Annot_typer   r   r   r   r   &!  r  z
Annot.typec                 C   rB  )zOpacity.)r  r   Annot_opacityr   r   r   r   r  .!  r  zAnnot.opacityc                 C   r  )zSet opacity.)r  r   Annot_set_opacity)r   r  r   r   r   set_opacity7!  r  zAnnot.set_opacityc                 C   rB  )zAttached file information.)r  r   Annot_file_infor   r   r   r   	file_info=!  r  zAnnot.file_infoc                 C   rB  )zRetrieve attached file content.)r  r   Annot_get_filer   r   r   r   get_fileF!  rE  zAnnot.get_filec                 C   rB  )zRetrieve sound stream.)r  r   Annot_get_soundr   r   r   r   	get_soundM!  rE  zAnnot.get_soundc                 C   r)  )zUpdate attached file.)r  r   Annot_update_file)r   r  r  r  r  r   r   r   update_fileT!  r'  zAnnot.update_filec                 C   rB  )zVarious information details.)r  r   
Annot_infor   r   r   r   r  Z!  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  r  r  r  )r  r   r  rY  r   Annot_set_info)r   r  r1	  r  r  r  r  r   r   r   set_infoc!  s   zAnnot.set_infoc                 C   s6   t |  | jd }|tttttttfvri S t	
| S )zBorder information.r   )r  r   r  r  r	  r	  r  r  r  r   Annot_border)r   atyper   r   r   r  r!  s
   

zAnnot.borderc           	      C   s8  t |  | jdd \}}|tttttttfvr"t	d| d dS |ttttfvr8|dkr8t	d| d d}t|t
urE||||d}|d	d |d
d |dd |dd |d	 dkrgd|d	< |d dkrqd|d< t|d drt|d |d< |d D ]}t|tsd|d<  nqt| |||||S )zbSet border properties.

        Either a dict, or direct arguments width, style, dashes or clouds.Nrr   zCannot set border for 'r  r   zCannot set cloudy border for 'r  )r4  stylerS  cloudsr4  r6	  rS  r7	  r   )r  r   r  r  r	  r	  r  r  r  r  r  
setdefaultr   r   r   rr  r   Annot_set_border)	r   r  r4  r6	  rS  r7	  r5	  atnamer  r   r   r   
set_border!  s6   
zAnnot.set_borderc                 C   rB  )zFlags field.)r  r   Annot_flagsr   r   r   r   r^  !  r  zAnnot.flagsr   c                 C   r  )z!Clean appearance contents stream.)r  r   Annot_clean_contentsr  r   r   r   r  !  r  zAnnot.clean_contentsc                 C   r  )zSet annotation flags.)r  r   Annot_set_flags)r   r^  r   r   r   	set_flags!  r  zAnnot.set_flagsc                 C   rB  )z*Delete 'Popup' and responding annotations.)r  r   Annot_delete_responsesr   r   r   r   delete_responses!  rE  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   )r  r   
Annot_nextr   r  r6  r7  r   r  r  r  r0  r  r   r   r   r  !  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rgbcmykNr  T)r  r  rt  r  r   r   rY  r  rl   r   Annot_get_pixmapr   rC  )r   rT   rX  rs  r  cspacesr  r   r   r   
get_pixmap!  s   zAnnot.get_pixmapc                 C      |  |  d | _d S r&   r  r  r   r   r   r   rI  !     

zAnnot._erasec                 C       t |  d| jd t| jf S Nz'%s' annotation on %sr   r  r   r   r  r   r   r   r   r  !     zAnnot.__str__c                 C   rL	  rM	  rN	  r   r   r   r   r   !  rO	  zAnnot.__repr__c                 C   s   | j d u rd S |   d S r&   )r  rI  r   r   r   r   r  !  s   
zAnnot.__del__r  r&   r   )r  NNr  )	NNr   NNNNTr  r  r  )NNNNNN)Nr  NNr  r  )NNNr   )Ir   r   r0   r   r   r   r   r   r   delete_Annotr  rR   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r  r  r  r  r  rn  r0  r/  r  rt  r  r  OptFloatr}   r  r   rr  r  r	  r  r#	  r   r  r'	  r)	  r+	  r-	  r/	  r  r3	  r  r;	  r^  r  r?	  rA	  r  rH	  rI  r  r  r   r   r   r   r3    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  r  r   r   r   rD   "  r  zLink.<lambda>c                 C   r  r&   r  r  r   r   r   rD   "  r  r  r  c                 O   r   r  r  r  r   r   r   r   "  r   zLink.__init__c                 C   rA   r&   )r   Link__borderr   r  r  r   r   r   _border"  rF   zLink._borderc                 C   re   r&   )r   Link__setBorder)r   r  r  r  r   r   r   
_setBorder
"  rk   zLink._setBorderc                 C   rA   r&   )r   Link__colorsrT	  r   r   r   _colors"  rF   zLink._colorsc                 C      |  | jjj| jS r&   )rU	  r  r   r  r   r   r   r   r  "     zLink.borderry  c                 C   sD   t |  | jj}|jsdS || jd}|d dkr t|d S dS )Nr   rN  r   rH  )r  r  r.  r  r  rr  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' valuerN  )	r  r  r.  r{   r   rr  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 )N)r4  r6	  rS  )r   r  rW	  r  r   r  )r   r  r4  rS  r6	  r   r   r   r;	  )"  s   zLink.set_borderc                 C   rZ	  r&   )rY	  r  r   r  r   r   r   r   rt  ."  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	  r  r  Nz!warning: links have no fill colorr   rC   r	  rp   r   r	  r   rs   r	  r  )r  r  r   r  rY  r  r  r  r   r}   r  rz   r   )r   rt  r  r  r  r   r   r   r   r	  2"  s(   




zLink.set_colorsc                 C   rB  )zUri string.)r  r   Link_urir   r   r   r   r0  J"  r  zLink.uric                 C   rB  )zFlag the link as external.)r  r   Link_is_externalr   r   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  rZ  )
r   r  r{   r  r  r[  r0  r;  r$  rY  )r   r  r0  r   r   r   r\  \"  s   
z	Link.destc                 C   r  )zRectangle ('hot area').)r  r   	Link_rectr   r  r   r   r   rR   l"  r  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   "  r  zLink.next.<locals>.<listcomp>c                 S   r  )r   rr   r  r  r   r   r   r   "  r  r   r   )
r  r   	Link_nextr   r  r6  r7  r  rG  r  )r   r  
link_xrefslink_idsr  r   r   r   r  w"  s    

z	Link.nextc                 C   rI	  r&   rJ	  r   r   r   r   rI  "  rK	  zLink._erasec                 C      t |  dt| j S Nzlink on r  r   r  r   r   r   r   r  "     zLink.__str__c                 C   rb	  rc	  rd	  r   r   r   r   r   "  re	  zLink.__repr__c                 C   r  r&   r  r   r   r   r   r  "  rI   zLink.__del__)Nr   NNr  )r   r   r0   r   r   r   r   r   r   delete_Linkr  rU	  rW	  rY	  r  rr  r^  r?	  r;	  rt  r	  r0  r[  re  r\  rR   r  rI  r  r  r   r   r   r   rR	  !  s@    









	
rR	  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  r  r   r   r   rD  "  r  zDisplayList.<lambda>c                 C   r  r&   r  r  r   r   r   rD  "  r  r  r  c                 C      t | t | d S r&   )r   DisplayList_swiginitnew_DisplayListr   r  r   r   r   r   "  r-   zDisplayList.__init__c                 C   re   r&   )r   DisplayList_run)r   r  r   arear   r   r   r  "  rk   zDisplayList.runc                 C      t | }t|}|S r&   )r   DisplayList_rectr   r  r   r   r   rR   "     
zDisplayList.rectNr   c                 C   s   t | ||||}d|_|S r  )r   DisplayList_get_pixmapr   )r   rT   rs  r  r  r  r   r   r   rH	  "  s   zDisplayList.get_pixmaprs   c                 C   s   t | |}d|_|S r  )r   DisplayList_get_textpager   )r   r^  r  r   r   r   r  "  s   zDisplayList.get_textpagec                 C   r  r  )r   rg	  r   r  r   r   r   r   r  "  r  zDisplayList.__del__)NNr   N)rs   )r   r   r0   r   r   r   r   r   delete_DisplayListr  r   r  rR   rH	  r  r  r   r   r   r   rg	  "  s    


rg	  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d8d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d9d"efd'd(Zd9d"efd)d*Zd"efd+d,Zd"efd-d.Zd9d"efd/d0Zd9d"efd1d2Zd3d4 Z dS ):r  c                 C   r  r&   r  r  r   r   r   rD  "  r  zTextPage.<lambda>c                 C   r  r&   r  r  r   r   r   rD  "  r  r  r  c                 C   s   t | t | d| _d S r  )r   TextPage_swiginitnew_TextPager   rk	  r   r   r   r   "  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   TextPage_searchrz   r  r*  rR   r   r  )
r   needlehit_maxr  r  r  r   r  v1v2r   r   r   search"  s.   

zTextPage.searchc                 C   rA   r&   )r   TextPage__getNewBlockList)r   	page_dictrawr   r   r   _getNewBlockList"  rF   zTextPage._getNewBlockListFc                 C   s"   | j j| j jd}| || |S )N)r4  r5  )rR   r4  r5  r	  )r   r~	  r}	  r   r   r   _textpage_dict"  s   zTextPage._textpage_dictc                 C   rG   )z*Return a list with image meta information.)r   TextPage_extractIMGINFO)r   hashesr   r   r   extractIMGINFO"  rd  zTextPage.extractIMGINFOc                 C   r>   )z*Return a list with text block information.)r   TextPage_extractBLOCKSr   r   r   r   extractBLOCKS#  r  zTextPage.extractBLOCKSNc                 C   rG   )z)Return a list with text word information.)r   TextPage_extractWORDS)r   
delimitersr   r   r   extractWORDS#  rd  zTextPage.extractWORDSc                 C   r>   )zTextPage current poolsize.)r   TextPage_poolsizer   r   r   r   poolsize#  r  zTextPage.poolsizec                 C   rn	  )zTextPage rectangle.)r   TextPage_rectr   r  r   r   r   rR   #  s   
zTextPage.rectc                 C   rG   r&   )r   TextPage__extractText)r   r  r   r   r   _extractText!#  rI   zTextPage._extractTextc                 C   rG   r&   )r   TextPage_extractTextboxr  r   r   r   extractTextbox$#  rI   zTextPage.extractTextboxc                 C   rA   r&   )r   TextPage_extractSelection)r   pointapointbr   r   r   extractSelection'#  rF   zTextPage.extractSelectionry  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 )Nrs   r   r   ru   r   r   r   rD  /#  s    z&TextPage.extractText.<locals>.<lambda>r"  r   c                 S   s   g | ]}|d  qS )r   r   )r   ru   r   r   r   r   0#  r   z(TextPage.extractText.<locals>.<listcomp>)r	  r	  r%  r  )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   extractHTML2#  rO  zTextPage.extractHTMLc                    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  	b64encodero  r   rm  r   r   default<#     z/TextPage.extractJSON.<locals>.b64encode.defaultNr   r   r0   r	  r   r	  r   r   r	  ;#      r	  r4  r5  Tr  c                 S      | d d | d d fS Nr  rs   r   r   r	  r   r   r   rD  E#  r  z&TextPage.extractJSON.<locals>.<lambda>r"  ,:r   
separatorsr#   indentrm  r
  r	  JSONEncoderr4  r5  r%  dumpsr   r  r%  r
  r  r	  r  r   r	  r   extractJSON6#     

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	  P#  r	  z2TextPage.extractRAWJSON.<locals>.b64encode.defaultNr	  r   r	  r   r   r	  O#  r	  r	  r4  r5  r  c                 S   r	  r	  r   r	  r   r   r   rD  Y#  r  z)TextPage.extractRAWJSON.<locals>.<lambda>r"  r	  r   r	  r	  r	  r   r	  r   extractRAWJSONJ#  r	  zTextPage.extractRAWJSONc                 C   r	  )z$Return page content as a XML string.rs   r	  r   r   r   r   
extractXML^#  rO  zTextPage.extractXMLc                 C   r	  )z&Return page content as a XHTML string.r   r	  r   r   r   r   extractXHTMLb#  rO  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	  Nr4  r5  Tr  c                 S   r	  r	  r   r	  r   r   r   rD  n#  r  z&TextPage.extractDICT.<locals>.<lambda>r"  r	  r4  r5  r%  r   r  r%  r  r  r   r   r   extractDICTf#     

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	  Nr4  r5  r  c                 S   r	  r	  r   r	  r   r   r   rD  z#  r  z)TextPage.extractRAWDICT.<locals>.<lambda>r"  r	  r	  r   r   r   extractRAWDICTr#  r	  zTextPage.extractRAWDICTc                 C   r  r  )r   r  r   r  r   r   r   r   r  ~#  r  zTextPage.__del__)r   r   r  r  r&   NF)!r   r   r0   r   r   r   r   r   delete_TextPager  r   r{	  r	  r	  r	  r	  r	  r	  rR   r	  r	  r	  r   r	  r	  r	  r	  r	  r	  r  r	  r	  r  r   r   r   r   r  "  s4    




	r  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 )rc  c                 C   r  r&   r  r  r   r   r   rD  #  r  zGraftmap.<lambda>c                 C   r  r&   r  r  r   r   r   rD  #  r  r  r  c                 C   rh	  r&   )r   Graftmap_swiginitnew_Graftmap)r   r  r   r   r   r   #  r-   zGraftmap.__init__c                 C   r  r  )r   rc  r   r  r   r   r   r   r  #  r  zGraftmap.__del__N)r   r   r0   r   r   r   r   r   delete_Graftmapr  r   r  r   r   r   r   rc  #  s    rc  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  r  r   r   r   rD  #  r  zTextWriter.<lambda>c                 C   r  r&   r  r  r   r   r   rD  #  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   TextWriter_swiginitnew_TextWriterr  r  r   rR   rl   r5  r  ictmr   
last_pointr1   	text_rectr    
used_fontsr   )r   	page_rectr  r  r   r   r   r   #  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  rM  r   )r   r	  rE  is_writabler{   r   	clean_rtlr  rB  r   TextWriter_appendr  r	  _bboxr	  r^  r	  rB  )	r   posrg   r  ri   r  right_to_left
small_capsr  r   r   r   r  #  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  ri   r  r	  )r  r   r	  r	  )	r   r	  rg   r  ri   r  r	  lheightrv   r   r   r   appendv#  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  rr   c                 S   r  r   rL  r   r   r   r   r   #  r   z(TextWriter.clean_rtl.<locals>.<listcomp>r  r   r  r   r   )r  r  rz   r   r  rB  r  )r   rg   wordsr  r   r]  idx2r   r   r   r	  #  s2   
"

zTextWriter.clean_rtlc                 C   rn	  r&   )r   TextWriter__bboxr   r  r   r   r   r	  $  rp	  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}|jdv r|jj|jj }nd}|j}t|s|jdks|dkr|d|j|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r!t| 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ro||"dd n|d r||"d d! n|d"r||"d"d# || q|r|| |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'.
        r  zincompatible page rectNr   r   z%morph must be (Point, Matrix) or Nonez$only one of matrix, morph is allowedrp   r  z/OC /%s BDCEMCr   r  r  z1 0 0 1 %g %g cmz%g %g %g %g %g %g cmz cmr  z%i Trz gsr   z	/Alp%i gsz Tfg?z%g wrr   r  z/F%iz rgr  RGz gz Gz kz KzQ
r  r  )r  )(r  r   rR   r{   r   r   r  r   rl   r   r  r  r   TextWriter_write_textrp  r<  r  r  r/  r5  r4  r  r   r   r   r   r	  r   r  r  rr  r  r}   r  r  r  r  r  r	  rV  )r   re  r  r  r  r=  rT   render_moder  r  max_numsr1	  max_alpmax_fontold_cont_linesoptcontbdcemcnew_cont_linesr  r  r  rZ   r(  alptempr  r]  r  r   r   r   
write_text$  s   


 








zTextWriter.write_textc                 C   r  r  )r   r	  r   r  r   r   r   r   r  x$  r  zTextWriter.__del__r   N)Nr  Nr   r   )Nr  NF)Nr  r   NNr   r   )r   r   r0   r   r   r   r   r   delete_TextWriterr  r   r  r	  r	  r	  r	  r  r   r   r   r   r	  #  s    


.

ir	  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/d0 Zed1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z dS )?rE  c                 C   r  r&   r  r  r   r   r   rD  $  r  zFont.<lambda>c                 C   r  r&   r  r  r   r   r   rD  $  r  r  r  Nr   r  r   c                 C   s  |rt |dr| }n	t|trt|}t|tstdt|trs| }d|v s3d|v s3d|v r7td |dv r>d}n5|	d	rFd
}n-|	drNd}n%|	drVd}n|t
 v ridd l}||}d }~n
|dk rst||}t| t|||||||||	|

 d| _d S )Nr  zbad type: 'fontbuffer'r  r  r   z!Warning: did you mean a fontfile?)cjkrP  rR  r   rQ  r   rV  rs   rT  rr   T)r   r  r   r  r  r{   r   r  r  r;  rA  r  r  r  rX  rY  r   Font_swiginitnew_Fontr   )r   rh   r  r  r  r  r  is_bold	is_italicis_serifembedfname_lowerr  r   r   r   r   $  s8   








$
zFont.__init__c                 C   r  )z2Return the glyph width of a unicode (font size 1).)r   Font_glyph_advance)r   chrr  r  r  r	  r   r   r   rQ  $     zFont.glyph_advancer  c              	   C   r  )z1Return length of unicode 'text' under a fontsize.)r   Font_text_lengthr   rg   ri   r  r  r  r	  r   r   r   text_length$  r0  zFont.text_lengthc              	   C   r  )z@Return tuple of char lengths of unicode 'text' under a fontsize.)r   Font_char_lengthsr	  r   r   r   char_lengths$  r0  zFont.char_lengthsc                 C   s   t | ||||}t|}|S )z1Return the glyph bbox of a unicode (font size 1).)r   Font_glyph_bboxr   )r   r	  r  r  r	  r  r   r   r   
glyph_bbox$  s   zFont.glyph_bboxc                 C   r  )z0Check whether font has a glyph for this unicode.)r   Font_has_glyph)r   r	  r  r  fallbackr	  r   r   r   	has_glyph$  r	  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  gcrR  arrr   r   r   rS  $  s   
zFont.valid_codepointsc                 C   rG   r&   )r   Font__valid_unicodes)r   r	  r   r   r   r	  $  rI   zFont._valid_unicodesc                 C   r>   r&   )r   
Font_flagsr   r   r   r   r^  $  r  z
Font.flagsc                 C   r>   r&   )r   Font_is_boldr   r   r   r   r	  $  r  zFont.is_boldc                 C   r>   r&   )r   Font_is_serifr   r   r   r   r	  $  r  zFont.is_serifc                 C   r>   r&   )r   Font_is_italicr   r   r   r   r	  $  r  zFont.is_italicc                 C   r>   r&   )r   Font_is_monospacedr   r   r   r   is_monospaced$  r  zFont.is_monospacedc                 C   r>   r&   )r   	Font_namer   r   r   r   r   $  r  z	Font.namec                 C   r>   r&   )r   Font_glyph_countr   r   r   r   r	  $  r  zFont.glyph_countc                 C   r>   r&   )r   Font_bufferr   r   r   r   r  $  r  zFont.bufferc                 C   rn	  r&   )r   	Font_bboxr   r  r   r   r   r  $  rp	  z	Font.bboxc                 C   r>   )z Return the glyph ascender value.)r   Font_ascenderr   r   r   r   ascender %  r  zFont.ascenderc                 C   r>   )z!Return the glyph descender value.)r   Font_descenderr   r   r   r   	descender%  r  zFont.descenderc                 C   r   r  r   r   r   r   r   r	  %  s   zFont.is_writablec                 C      t |S )z$Return the unicode for a glyph name.)rb  r  r   r   r   rb  %  rn  zFont.glyph_name_to_unicodec                 C   r
  )z$Return the glyph name for a unicode.)r_  )r   rW  r   r   r   r_  %  rn  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   r  r  )r   rE  r   r  r   r   r   r   r  %  r  zFont.__del__)
NNNr   Nr  r   r   r   r   )Nr   r   r   )r  Nr   r   r   )Nr   r   )!r   r   r0   r   r   r   r   r   delete_Fontr  r   rQ  r	  r	  r	  r	  rS  r	  r^  r	  r	  r	  r
  r   r	  r  r  r

  r
  r	  rb  r_  r  r   r   r   r   rE  $  sP    

&



		











c                   @   sf   e Zd Zedd dd ddZeZejZ	dddZ
d	d
 Zdd Zdd Zdd Zdd Zdd ZdS )DocumentWriterc                 C   r  r&   r  r  r   r   r   rD  )%  r  zDocumentWriter.<lambda>c                 C   r  r&   r  r  r   r   r   rD  )%  r  r  r  Nc                 C   sV   t |tu rnt|drt|}nt|dr|j}|d krd}t| t|| d S )Nr  r   r   )r   r   r   r   r   DocumentWriter_swiginitnew_DocumentWriter)r   ry  optionsr   r   r   r   -%  s   


zDocumentWriter.__init__c                 C   rG   r&   )r   DocumentWriter_begin_pagerk	  r   r   r   
begin_page?%  rI   zDocumentWriter.begin_pagec                 C   r>   r&   )r   DocumentWriter_end_pager   r   r   r   end_pageB%  r@   zDocumentWriter.end_pagec                 C   r>   r&   )r   DocumentWriter_closer   r   r   r   r  E%  r@   zDocumentWriter.closec                 C   r  r  )r   r
  r   r  r   r   r   r   r  H%  r  zDocumentWriter.__del__c                 C   r  r&   r   r   r   r   r   r  N%  r   zDocumentWriter.__enter__c                 G   r  r&   r  r  r   r   r   r  Q%  rI   zDocumentWriter.__exit__r&   )r   r   r0   r   r   r   r   r   delete_DocumentWriterr  r   r
  r
  r  r  r  r  r   r   r   r   r
  (%  s    
r
  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dZd ddZd ddZd ddZd ddZd ddZdZedd Zdd Zdd ZdS )!r@  c                 C   r  r&   r  r  r   r   r   rD  X%  r  zArchive.<lambda>c                 C   r  r&   r  r  r   r   r   rD  X%  r  r  r  c                 G   s8   g | _ t| tj|  d| _|dkr| j|  d S d S )NTr   )_subarchivesr   Archive_swiginitnew_Archiver   rB  r  r   r   r   r   \%  s   zArchive.__init__c                 C   rG   r&   )r   Archive_has_entryr  r   r   r   	has_entryj%  rI   zArchive.has_entryc                 C   rG   r&   )r   Archive_read_entryr  r   r   r   
read_entrym%  rI   zArchive.read_entryNc                 C   rA   r&   )r   Archive__add_dir)r   folderry  r   r   r   _add_dirp%  rF   zArchive._add_dirc                 C   rA   r&   )r   Archive__add_arch)r   subarchry  r   r   r   	_add_archs%  rF   zArchive._add_archc                 C   re   r&   )r   Archive__add_ziptarfile)r   filepathr   ry  r   r   r   _add_ziptarfilev%  rk   zArchive._add_ziptarfilec                 C   re   r&   )r   Archive__add_ziptarmemory)r   memoryr   ry  r   r   r   _add_ziptarmemoryy%  rk   zArchive._add_ziptarmemoryc                 C   re   r&   )r   Archive__add_treeitem)r   r*
  r   ry  r   r   r   _add_treeitem|%  rk   zArchive._add_treeitemc                    s  dd }g  dd fdd}t |tjrEd|  |t|dd}t|dd}|r9|d	| | S | d	| | S t |tj	rd
|
  |t|jdd}|j}t |tjsh|sh|j}|rt|d| | S | d| | S t |trd||| | S ||r|rt|tu stddd|g || | S t|dr|j}n
t |tjrt|}tjt|rt|}d|t| || | S tjt|r|rt|tu stdt|}t|d}| }	|   dd|g |	| | S t|tu s't|dds+tdt!|dkr|\}
}||
sDtjt|
rt|turRtd| |d||
rdj|
|d ntt|
d}| }	|   t"j|	|d |g | S |D ]	}#|| qdS )a  Add a sub-archive.

        Args:
            content: content to be added. May be one of Archive, folder
                 name, file name, raw bytes (bytes, bytearray), zipfile,
                 tarfile, or a sequence of any of these types.
            path: (str) a "virtual" path name, under which the elements
                of content can be retrieved. Use it to e.g. cope with
                duplicate element names.
        c                 S   s   t | tttjfS r&   )r   r  r  r  r  r  r   r   r   rD  %  s    zArchive.add.<locals>.<lambda>Nc                     s    d} dksj g krj |  d S j d }|d dks*|d | d kr2j |  d S |d | d  |j d< d S )N)r  entriesry  treer  r  ry  r.
  )r
  r  extend)r$
  ltreer.
  r  mountr   r   r   make_subarch%  s   

z!Archive.add.<locals>.make_subarchzipr  fpr   tarr   r   multizneed name for binary contentr/
  dirrf  r   zbad archive contentrr   zbad item name )ry  )$r   zipfileZipFiler  r   r(
  r+
  r  tarfileTarFilegetnamesfileobjr  r  r@  r%
  r   r   r{   r-
  r   r   pathlibPathru  ry  isdirlistdirr"
  r  rC  r   r  rz   seldrB  )r   r1	  ry  bin_okr4
  r  r6
  r  r  ffdatar   r  r   r2
  r   rB  %  s   




zArchive.addzArchive(dirname [, path]) - from folder
    Archive(file [, path]) - from file name or object
    Archive(data, name) - from memory item
    Archive() - empty archive
    Archive(archive [, path]) - from archive
    c                 C   r   )zList of sub archives.)r
  r   r   r   r   
entry_list&  s   zArchive.entry_listc                 C   s   dt | j S )NzArchive, sub-archives: )rz   r
  r   r   r   r   r   &  rk   zArchive.__repr__c                 C   r  r  )r   r@  r   r  r   r   r   r   r  &  r  zArchive.__del__r&   )r   r   r0   r   r   r   r   r   delete_Archiver  r   r
  r
  r"
  r%
  r(
  r+
  r-
  rB  r1   rH
  r  r   r   r   r   r@  W%  s$    





}
r@  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dd Zdd Zd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ed(d) Zed*d+ Zd,d- Zed.d/ Zed0d1 Zd2d3 Z d4d5 Z!ed6d7 Z"ed8d9 Z#e$d:d; Z%dd>d?Z&d@dA Z'ddBdCZ(dDdE Z)dFdG Z*dHdI Z+dJdK Z,ddLdMZ-dNdO Z.dPdQ Z/ddRdSZ0ddTdUZ1e1Z2e1Z3e1Z4ddVdWZ5ddXdYZ6dZd[ Z7d\d] Z8d^d_ Z9d`da Z:dbdc Z;ddde Z<dfdg Z=dhdi Z>djdk Z?dldm Z@ddodpZAdqdr ZBdsdt ZCdudv ZDdwdx ZEdydz ZFd{d| ZGd}d~ ZHdd ZIdddZJdddZK	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=dddZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTd=S )Xmlc                 C   r  r&   r  r  r   r   r   rD  &  r  zXml.<lambda>c                 C   r  r&   r  r  r   r   r   rD  &  r  r  r  c                 G   r  r&   )r   Xml_swiginitnew_Xmlr  r   r   r   r   &  r-   zXml.__init__c                 C   r>   r&   )r   Xml_rootr   r   r   r   root&  r  zXml.rootc                 C   r>   r&   )r   Xml_bodytagr   r   r   r   bodytag &  r@   zXml.bodytagc                 C   rG   r&   )r   Xml_append_childr   childr   r   r   append_child#&  rI   zXml.append_childc                 C   rG   r&   )r   Xml_create_text_noder   rg   r   r   r   create_text_node&&  rI   zXml.create_text_nodec                 C   rG   r&   )r   Xml_create_element)r   tagr   r   r   create_element)&  rI   zXml.create_elementc                 C   re   r&   )r   Xml_findr   rY
  attrj  r   r   r   r  ,&  rk   zXml.findc                 C   re   r&   )r   Xml_find_nextr\
  r   r   r   	find_next/&  rk   zXml.find_nextc                 C   r>   r&   )r   Xml_nextr   r   r   r   r  1&  r  zXml.nextc                 C   r>   r&   )r   Xml_previousr   r   r   r   previous5&  r  zXml.previousc                 C   rA   r&   )r   Xml_set_attribute)r   r#  r   r   r   r   set_attribute:&  rF   zXml.set_attributec                 C   rG   r&   )r   Xml_remove_attributer  r   r   r   remove_attribute=&  rI   zXml.remove_attributec                 C   rG   r&   )r   Xml_get_attribute_valuer  r   r   r   get_attribute_value@&  rI   zXml.get_attribute_valuec                 C   r>   r&   )r   Xml_get_attributesr   r   r   r   get_attributesC&  r@   zXml.get_attributesc                 C   rG   r&   )r   Xml_insert_beforer   noder   r   r   insert_beforeF&  rI   zXml.insert_beforec                 C   rG   r&   )r   Xml_insert_afterrl
  r   r   r   insert_afterI&  rI   zXml.insert_afterc                 C   r>   r&   )r   	Xml_cloner   r   r   r   cloneL&  r@   z	Xml.clonec                 C   r>   r&   )r   
Xml_parentr   r   r   r   r  N&  r  z
Xml.parentc                 C   r>   r&   )r   Xml_first_childr   r   r   r   first_childR&  r  zXml.first_childc                 C   r>   r&   )r   
Xml_remover   r   r   r   removeW&  r@   z
Xml.removec                 C   r>   r&   )r   Xml_textr   r   r   r   rg   Y&  r  zXml.textc                 C   r>   r&   )r   Xml_tagnamer   r   r   r   tagname]&  r  zXml.tagnamec                    s$    fdd d}g } | ||}|S )Nc              	      s   | d krZ| j r||d| j df | j} q ||d| j f |   D ]\}}||d| d| df q(| j}|rH |||d }||d| j f | j} | d ks|S )N"r  r  z 'r  r   r  )is_textr  rg   r  rz
  rj
  r  ru
  )rm
  r  shiftr  r   rS
  	show_noder   r   r
  c&  s   z%Xml._get_node_tree.<locals>.show_noder   r   )r   r}
  r  r   r~
  r   _get_node_treeb&  s
   zXml._get_node_treec                 C   s6   |   }|D ]}td|d  |d dd  qdS )z)Print a list of the node tree below self.z  r   r   r  r  N)r
  r  r  )r   r  r  r   r   r   debugx&  s   "z	Xml.debugc                 C   s
   | j dkS )zCheck if this is a text node.N)rg   r   r   r   r   r|
  ~&  r  zXml.is_textc                 C   s*   | j }|dkr	dS 	 |jdkr|S |j}q
)zReturn last child node.N)ru
  r  rR
  r   r   r   
last_child&  s   
zXml.last_childc                 C   sN   t | tu r| S t | tu rdt|  dS t | ttfv r%dt|  S | S )Nzrgb(r  rD	  )r   r   rr  r:  r   r  )r  r   r   r   
color_text&  s   zXml.color_textr   Nc                 C   sD   |  d}|dkr|dt| |dkr|d| | | |S )zAdd numbered list ("ol" tag)r  r   r  Nr   )rZ
  rd
  r   rT
  )r   r  numtyperS
  r   r   r   add_number_list&  s   

zXml.add_number_listc                 C      |  d}| | |S )zAdd description list ("dl" tag)dlrZ
  rT
  rR
  r   r   r   add_description_list&     

zXml.add_description_listc                 C   s   |  d}|dkr|d|  |dkr|d|  |dkr(|dd|  |dkr3|d|  |d|  | | |S )	zAdd image node (tag "img").r  Nr4  r5  r6	  zfloat: r  r   )rZ
  rd
  rT
  )r   r   r4  r5  imgfloatr  rS
  r   r   r   	add_image&  s   

zXml.add_imagec                 C   r
  )zAdd bulleted list ("ul" tag)ru  r
  rR
  r   r   r   add_bullet_list&  r
  zXml.add_bullet_listc                 C   s.   | j dvrtd| j | d}| | |S )z8Add item ("li" tag) under a (numbered or bulleted) list.)r  ru  zcannot add list item toli)rz
  r{   rZ
  rT
  rR
  r   r   r   add_list_item&  s
   


zXml.add_list_itemc                 C   r
  Nspanr
  rR
  r   r   r   add_span&  s   

zXml.add_spanc                 C   s2   |  d}| jdkr| | |S | j| |S )zAdd "p" tagrZ   )rZ
  rz
  rT
  r  rR
  r   r   r   add_paragraph&  s   


zXml.add_paragraphc                 C   sZ   |t ddvrtd| j}d| }| |}| }|dvr%| | |S | j| |S )zAdd header tagr   r
  zHeader level must be in [1, 6]r   )h1h2h3h4h5h6rZ   )r  r{   rz
  rZ
  rT
  r  )r   rn  this_tagnew_tagrS
  prevr   r   r   
add_header&  s   


zXml.add_headerc                 C   r
  )zAdd "div" tagdivr
  rR
  r   r   r   add_division&  r
  zXml.add_divisionc                 C   r
  )zAdd horizontal line ("hr" tag)hrr
  rR
  r   r   r   add_horizontal_line&  r
  zXml.add_horizontal_linec                 C   sV   |  d}t|ts|}|d| || | |  }|dkr$| }|| | S )zAdd a hyperlink ("a" tag)rN   hrefN)rZ
  r   r   rd
  rT
  rW
  span_bottom)r   r
  rg   rS
  r
  r   r   r   add_link&  s   


zXml.add_linkc                 C   H   |  d}t|tu r|| | |  }|dkr| }|| | S )zAdd a "code" tagr  NrZ
  r   r   rT
  rW
  r
  r   rg   rS
  r
  r   r   r   add_code&     

zXml.add_codec                 C   r
  )zAdd a superscript ("sup" tag)supNr
  r
  r   r   r   add_superscript	'  r
  zXml.add_superscriptc                 C   r
  )zAdd a subscript ("sub" tag)subNr
  r
  r   r   r   add_subscript'  r
  zXml.add_subscriptc                 C   r
  )z!Add monospaced lines ("pre" node)prer
  rR
  r   r   r   add_codeblock'  r
  zXml.add_codeblockc                 C   s   | }| j }|dkrdS |jr|j}|dkrn|js|dks"|jdkr$dS 	 |dkr+|S |jdv s3|jr7|j}q$|jdkrB|}|j}n|S q%)z$Find deepest level in stacked spans.Nr
  T)rN   r
  r
  body)r
  r|
  rb
  rz
  r  ru
  )r   r  rS
  r   r   r   r
  %'  s,   
zXml.span_bottomc                 C   s6   |  d}|| |  }|d kr| }|| |S r
  )rZ
  	add_styler
  rT
  )r   r6	  r
  r
  r   r   r   append_styled_span>'  s   


zXml.append_styled_spanc                 C      d| }|  | | S )zSet margin values via CSS stylezmargins: %sr
  r   r  rg   r   r   r   set_marginsG'     
zXml.set_marginsc                 C   r
  )z"Set font-family name via CSS stylezfont-family: %sr
  )r   r  rg   r   r   r   set_fontM'  r
  zXml.set_fontc                 C      d|  | }| | | S )zSet text color via CSS stylez	color: %s)r
  r
  r   r  rg   r   r   r   	set_colorS'     
zXml.set_colorc                 C      d| }|  | | S )z(Set number of text columns via CSS stylez	columns: r
  )r   r=  rg   r   r   r   set_columnsY'  r
  zXml.set_columnsc                 C   r
  )z"Set background color via CSS stylezbackground-color: %s)r
  r
  r
  r   r   r   set_bgcolor_'  r
  zXml.set_bgcolorc                 C   r
  )zSet opacity via CSS stylez	opacity: r
  )r   r  rg   r   r   r   r'	  e'  r
  zXml.set_opacityc                 C   sp   d}t |tr
|}n#|tkrd}n|tkrd}n|tkrd}n|tkr&d}ntd| || }| | | S )z Set text alignment via CSS styleztext-align: %sr	  centerrightjustifyzUnrecognised align=)r   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr{   r
  )r   r  rg   r  r   r   r   	set_alignk'  s   

zXml.set_align	underlinec                 C   r
  )Nztext-decoration: %sr
  r
  r   r   r   set_underline~'  r  zXml.set_underlinec                 C      d}|  | | S )z%Insert a page break before this node.zpage-break-before: alwaysr
  rV
  r   r   r   set_pagebreak_before'  r  zXml.set_pagebreak_beforec                 C   r
  )z$Insert a page break after this node.zpage-break-after: alwaysr
  rV
  r   r   r   set_pagebreak_after'  r  zXml.set_pagebreak_afterc                 C   s2   t |tu r	d}nd}d| | }| | | S )z Set font size name via CSS styler   r   zfont-size: )r   r   r
  )r   ri   r   rg   r   r   r   set_fontsize'  s   
zXml.set_fontsizec                 C   r
  )z6Set line height name via CSS style - block-level only.zline-height: r
  )r   
lineheightrg   r   r   r   set_lineheight'  r
  zXml.set_lineheightc                 C   r
  )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r
  )r   leadingrg   r   r   r   set_leading'  r
  zXml.set_leadingc                 C   r
  )z*Set inter-word spacing value via CSS stylezword-spacing: r
  r   spacingrg   r   r   r   set_word_spacing'  r
  zXml.set_word_spacingc                 C   r
  )z,Set inter-letter spacing value via CSS stylezletter-spacing: r
  r
  r   r   r   set_letter_spacing'  r
  zXml.set_letter_spacingc                 C   r
  )z;Set text indentation name via CSS style - block-level only.ztext-indent: r
  )r   r	  rg   r   r   r   set_text_indent'  r
  zXml.set_text_indentTc                 C   $   |rd}nd}d| }|  | | S )zSet bold on / off via CSS styler>  r  zfont-weight: %sr
  r
  r   r   r   set_bold'     
zXml.set_boldc                 C   r
  )z!Set italic on / off via CSS styler?  r  zfont-style: %sr
  r
  r   r   r   
set_italic'  r
  zXml.set_italicc                 C   s  | j }| }|dur|| |dur|| |dur"|| |dur+|| |dur4|| |dur=|| |durF|| |durO|	| |	durX|
|	 |
dura||
 |durj|| |durs|| |dur||| |dur|  |dur|  |dur|| |dur| | |dur| | g }|d}|dur|| |j}|r||d |j}|s| dd| |  | S )zaSet any or all properties of a node.

        To be used for existing nodes preferrably.
        Nr6	  rX  )rN
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  set_id	add_classrh
  r  ru
  rd
  r  rw
  )r   r  bgcolorr>  r  columnsr  ri   r	  r?  r
  letter_spacingr
  marginspagebreak_afterpagebreak_beforeword_spacingunqidr#   rN
  r	  styles	top_stylerS
  r   r   r   set_properties'  sd   

















zXml.set_propertiesc                 C   s:   | j }| j}|dd|rtd| d| d| | S )zSet a unique id.Nr7  zid 'z' already exists)rz
  rN
  r  r{   rd
  )r   uniquerz
  rN
  r   r   r   r
  (  s   z
Xml.set_idc                 C   sf   |  }t|}|  }|dkr| }t|D ]\}}|| | ||d k r0|| d q| S )z"Add text. Line breaks are honored.Nr   r.  )rp  rz   r
  r  rT
  rW
  rZ
  )r   rg   r  
line_countr
  r   r(  r   r   r   add_text!(  s   zXml.add_textc                 C   R   |  d}|dkr||v r| S | d |dkr|}n|d| 7 }| d| | S )z;Set some style via CSS style. Replaces complete style spec.r6	  NrX  rh
  rf
  rd
  )r   rg   r6	  r   r   r   r
  /(     

zXml.add_stylec                 C   r
  )z5Set some class via CSS. Replaces complete class spec.classNr  r
  )r   rg   r#   r   r   r   r
  <(  r
  zXml.add_classc                 C   sR   |  }t|}t|D ]\}}| | | ||d k r&| | d q| S )Nr   r.  )rp  rz   r  rT
  rW
  rZ
  )r   rg   r  r
  r   r(  r   r   r   insert_textI(  s   zXml.insert_textc                 C   r  r&   r   r   r   r   r   r  R(  r   zXml.__enter__c                 G   r  r&   r   r  r   r   r   r  U(  r   zXml.__exit__c                 C   r  r  )r   rJ
  r   r  r   r   r   r   r  X(  r  zXml.__del__r	  r  r  r&   )r
  )T)NNNNNNNNNNNNNNNNNN)Ur   r   r0   r   r   r   r   r   
delete_Xmlr  r   rN
  rP
  rT
  rW
  rZ
  r  r_
  r  rb
  rd
  rf
  rh
  rj
  rn
  rp
  rr
  r  ru
  rw
  rg   rz
  r
  r
  r|
  r
  staticmethodr
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  add_varadd_sampadd_kbdr
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r'	  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r  r  r  r   r   r   r   rJ
  &  s    











	


	



	





L
	rJ
  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 Zdd Zd&ddZdd Zdd Zd'ddZed(ddZdd Zd'ddZed(ddZedd  Zed!d" Zd#d$ ZdS ))Storyc                 C   r  r&   r  r  r   r   r   rD  b(  r  zStory.<lambda>c                 C   r  r&   r  r  r   r   r   rD  b(  r  r  r  Nrq   c              	   C   s:   |d krt |tdkrt|}t| t|||| d S r	  )r   r@  r   Story_swiginit	new_Story)r   r	  user_cssemr9  r   r   r   r   f(  s   zStory.__init__c                 C   r>   r&   )r   Story_resetr   r   r   r   r  n(  r@   zStory.resetc                 C   rG   r&   )r   Story_place)r   wherer   r   r   placeq(  rI   zStory.placec                 C   rA   r&   )r   
Story_draw)r   devicerT   r   r   r   drawt(  rF   z
Story.drawc                 C   r>   r&   )r   Story_documentr   r   r   r   documentw(  r@   zStory.documentc                 C   sn   t |tu r | D ]}t |tu r| std| dq
ni }t|r,|jjdkr0tdt	
| ||S )zTrigger a callback function to record where items have been placed.

        Args:
            function: a function accepting exactly one argument.
            args: an optional dictionary for passing additional data.
        zinvalid key 'r  r   z@callback 'function' must be a callable with exactly one argument)r   r  r  r   isidentifierr{   callable__code__co_argcountr   Story_element_positions)r   functionr   r  r   r   r   element_positionsz(  s   zStory.element_positionsc                    s   d }d d}t dddd}	 |||\}}	}
|d7 }|r  d7  | |	\}}r6 fdd}| |i  |rm|rW|rI|rE| t|d |  ||}|rW| ||d | ||
 |sl|rh| ||d |  n| d |
 |swd S q)Nr   r   c                    s    | _ |  d S r&   )page_numpositionr  
positionfnr   r   positionfn2(  s   z Story.write.<locals>.positionfn2)r   r
  r
  mediboxr
  r
  r  )r   writerrectfnr  pagefndevrect_numfilledr  rR   r  morer  r   r  r   ra  (  s@   
zStory.writeTc	                    s~   t  d }		 |	}
|}	d|	|
krd|	}t||||}|r#|  t   fdd}|r4| nd ||| r>d S q)Nr   FTc                    s&    |  r r |  d S d S d S r&   r  r  r  	positionsstabler   r   r  (  s   
z+Story.write_stabilized.<locals>.positionfn2)r  r
  add_header_idsra  )r  	contentfnr  r
  r
  r  r  r9  r  r1	  content_prevcontent2storyr  r   r  r   write_stabilized(  s.   
zStory.write_stabilizedc                 C   s   | j }d}|ddd}|rD|j}t|dkr9|d dkr9|d dv r9|d}|s9d| }|d| |d7 }|ddd}|sdS dS )	zt
        Look for `<h1..6>` items in `self` and adds unique `id`
        attributes if not already present.
        r   Nrr   r   r   123456r7  h_id_)r
  r  rz
  rz   rh
  rd
  r_
  )r   domr   r   r   attrid_r   r   r   r  (  s   $

zStory.add_header_idsc                    sR   t  }t|}g  fdd}| j||||d |  |d t|S )Nc                        |   r |  d S d S r&   r  r  r  r  r   r   r  (     
z+Story.write_with_links.<locals>.positionfn2)r  r  r   )r  r  r
  ra  r  rL  r
  add_pdf_links)r   r  r  r  r  r  r  r   r)  r   write_with_links(  s   
zStory.write_with_linksc                    sZ   t  }t|}	g  fdd}
t|	| ||||
|||	 |	  |d t|S )Nc                    r(  r&   r  r  r)  r   r   r   )  r*  z6Story.write_stabilized_with_links.<locals>.positionfn2r   )r  r  r
  r
  r"  r  rL  r+  )r  r  r
  r
  r  r  r9  r  r  r  r  r   r)  r   write_stabilized_with_links(  s   
z!Story.write_stabilized_with_linksc                 C   s  t | tr| }ntd| }t }|D ]}|jd@ r'|jr'|j|v r"q|||j< q|D ]b}|jd@ r|jr|jdr|jdd }z|| }W n ty] } z
td| d| d}~ww 	 t }	t
|	d< t|j|	d< |j\}
}}}t|
||	d< |jd |	d< ||jd  |	 q*|S )a  
        Adds links to PDF document.
        Args:
            document_or_stream:
                A PDF `Document` or raw PDF content, for example an
                `io.BytesIO` instance.
            positions:
                List of `ElementPosition`'s for `document_or_stream`,
                typically from Story.element_positions(). We raise an
                exception if two or more positions have same id.
        Returns:
            `document_or_stream` if a `Document` instance, otherwise a
            new `Document` instance.
        We raise an exception if an `href` in `positions` refers to an
        internal position `#<name>` but no item in `postions` has `id =
        name`.
        r  r   rZ  NzNo destination with id=z, required by position_from: r   z"add_pdf_links(): making link from:zadd_pdf_links():    zadd_pdf_links(): to:rb  fromr  re  )r   r  r  
open_closer7  r
  r;  r
   r  r  rh  r   rR   r   r  insert_link)document_or_streamr  r  id_to_positionr  position_from	target_idposition_torx   r  r   r   r   r   r   r   r   r+  
)  sB   





zStory.add_pdf_linksc                 C   s   |   }| S r&   )r  rP
  )r   r%  r   r   r   r
  R)  s   z
Story.bodyc                 C   r  r  )r   r
  r   r  r   r   r   r   r  W)  r  zStory.__del__)NNrq   Nr&   r  )Nrq   NNNT)r   r   r0   r   r   r   r   r   delete_Storyr  r   r  r
  r  r  r
  ra  r
  r"  r  r,  r-  r+  r
  r  r   r   r   r   r
  a(  s,    


)

G
r
  c                   @   s  e Zd Zedd dd ddZeZdd Zej	Z
dd	 ZdcddZddddZddddZddddZddddZddddZdd Zedd Zedd Zdd Zd d! Zd"d# Zdcd$d%Zd&d' Zd(d) Zed*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#ded=d>Z$d?d@ Z%dedAdBZ&dCdD Z'dEdF Z(dddGdHZ)dddIdJZ*dKdL Z+dMdN Z,dOdP Z-dQdR Z.dSdT Z/dUdV Z0dWdX Z1dYdZ Z2d[d\ Z3d]d^ Z4d_d` Z5dadb Z6dS )fToolsc                 C   r  r&   r  r  r   r   r   rD  a)  r  zTools.<lambda>c                 C   r  r&   r  r  r   r   r   rD  a)  r  r  r  c                 C   s   t | t   d S r&   )r   Tools_swiginit	new_Toolsr   r   r   r   r   d)  r  zTools.__init__c                 C   r>   )z!Return a unique positive integer.)r   Tools_gen_idr   r   r   r   r  h)  r  zTools.gen_idr   c                 C   rG   )z!Set ICC color handling on or off.)r   Tools_set_iccr   r  r   r   r   set_iccn)  rd  zTools.set_iccNc                 C   rG   )z$Get / set id prefix for annotations.)r   Tools_set_annot_stem)r   stemr   r   r   set_annot_stemt)  rd  zTools.set_annot_stemc                 C   rG   )z Set / unset small glyph heights.)r   Tools_set_small_glyph_heightsr<  r   r   r   set_small_glyph_heightsz)  rd  zTools.set_small_glyph_heightsc                 C   rG   )z9Set / unset returning fontnames with their subset prefix.)r   Tools_set_subset_fontnamesr<  r   r   r   set_subset_fontnames)  rd  zTools.set_subset_fontnamesc                 C   rG   )z!Set / unset MuPDF device caching.)r   Tools_set_low_memoryr<  r   r   r   set_low_memory)  rd  zTools.set_low_memoryc                 C   rG   )z/Set ascender / descender corrections on or off.)r   Tools_unset_quad_correctionsr<  r   r   r   unset_quad_corrections)  rd  zTools.unset_quad_correctionsc                 C   rG   )z%Free 'percent' of current store size.)r   Tools_store_shrink)r   percentr   r   r   rJ  )  rd  zTools.store_shrinkc                 C   r>   )zMuPDF current store size.)r   Tools_store_sizer   r   r   r   
store_size)  r  zTools.store_sizec                 C   r>   )zMuPDF store size limit.)r   Tools_store_maxsizer   r   r   r   store_maxsize)  r  zTools.store_maxsizec                 C   s*   t | }|d |d |d d}|}|S )zShow anti-aliasing values.r   r   rr   )graphicsrg   graphics_min_line_width)r   Tools_show_aa_level)r   r  r	  r   r   r   show_aa_level)  s   
zTools.show_aa_levelc                 C   rG   )zSet anti-aliasing level.)r   Tools_set_aa_level)r   rn  r   r   r   set_aa_level)  rd  zTools.set_aa_levelc                 C   rG   )z$Set the graphics minimum line width.)r   !Tools_set_graphics_min_line_width)r   min_line_widthr   r   r   set_graphics_min_line_width)  rd  z!Tools.set_graphics_min_line_widthc                 C   rA   )z#Metadata of an image binary stream.)r   Tools_image_profile)r   r  
keep_imager   r   r   r  )  r   zTools.image_profilec                 C   rG   r&   )r   Tools__rotate_matrixr~  r   r   r   r  )  rI   zTools._rotate_matrixc                 C   rG   r&   )r   Tools__derotate_matrixr~  r   r   r   r  )  rI   zTools._derotate_matrixc                 C   r>   )z!PyMuPDF configuration parameters.)r   Tools_fitz_configr   r   r   r   fitz_config)  r  zTools.fitz_configc                 C   r>   )zEmpty the glyph cache.)r   Tools_glyph_cache_emptyr   r   r   r   glyph_cache_empty)  r  zTools.glyph_cache_emptyc                 C   s   t | ||}t|j|_|j|_|j|_||_|jsd |_|js$d |_|j	s*d |_	|j
s0d |_
|js6d |_|js<d |_|jsBd |_|S r&   )r   Tools__fill_widgetr   rR   r  r  r  r  r  r  r  r  r  r  )r   rK   r1  r  r   r   r   r0  )  s(   zTools._fill_widgetc                 C   rA   r&   )r   Tools__save_widget)r   rK   r1  r   r   r   r  )  rF   zTools._save_widgetc                 C   rG   r&   )r   Tools__reset_widgetr  r   r   r   r  )  rI   zTools._reset_widgetc                 C   rG   r&   )r   Tools__ensure_widget_calcr  r   r   r   _ensure_widget_calc)  rI   zTools._ensure_widget_calcc           	      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  rq   r  r  rr   r   r   r  r  c                 S   r  r   r  r  r   r   r   r   *  r   z#Tools._parse_da.<locals>.<listcomp>rs   r  c                 S   r  r   r  r  r   r   r   r   *  r   r   )r   Tools__parse_dar  r  r}   )	r   rK   r  r  r  r  r  r   r  r   r   r   r  )  s8    ,8
zTools._parse_dac                 C   rA   r&   )r   Tools__update_da)r   rK   r  r   r   r   r  *  rF   zTools._update_dac                 C   rG   )z@Concatenate all /Contents objects of a page into a bytes object.)r   Tools__get_all_contents)r   fzpager   r   r   r  *  rd  zTools._get_all_contentsr   c                 C   re   )zDAdd bytes as a new /Contents object for a page, and return its xref.)r   Tools__insert_contents)r   re  newcontr  r   r   r   r  $*  r  zTools._insert_contentsc                 C   r>   )z"Get version of MuPDF binary build.)r   Tools_mupdf_versionr   r   r   r   mupdf_version**  r  zTools.mupdf_versionc                 C   s&   t | |}d|}|r|   |S )z<Get the MuPDF warnings/errors with optional reset (default).r  )r   Tools_mupdf_warningsr  reset_mupdf_warnings)r   r  r  r   r   r   r  0*  s
   
zTools.mupdf_warningsc                 C   rG   r&   )r   Tools__int_from_languager   r   r   r   _int_from_language<*  rI   zTools._int_from_languagec                 C   r>   )z&Empty the MuPDF warnings/errors store.)r   Tools_reset_mupdf_warningsr   r   r   r   rn  ?*  r  zTools.reset_mupdf_warningsc                 C   rG   )z)Set MuPDF error display to True or False.)r   Tools_mupdf_display_errorsr<  r   r   r   mupdf_display_errorsE*  rd  zTools.mupdf_display_errorsc                 C   rG   )z,Set MuPDF warnings display to True or False.)r   Tools_mupdf_display_warningsr<  r   r   r   mupdf_display_warningsK*  rd  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)
        r4  r  r  r  z RG
r  r%  z rg
r   r   r  r   )r  rt  r  r|   r   rl   rH   r  )r   rK   r}  r~  r  r]  scscolfcfcolnp1np2r   rf  rR  Rr  r   r   r   _le_annot_parmsQ*  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   )rZ   r  r[   ry   r   r   r   beziery*  s    z"Tools._oval_string.<locals>.bezierg7.SQ?rD  z%f %f m
r   )r   r}  r~  p3p4r~  kappamlmomrmuol1ol2or1or2ur1ur2ul1ul2r  r   r   r   _oval_stringv*  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   rD  q
%s%f %f m
%f %f l
%g w
b
Q
)	r}  r   r   r+  r-  r   r   r,  r.  r   rK   r}  r~  rx  r  r   rf  rR  r|  r]  rw  ry  r  r}
  rw   r	  r[   rZ   r  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.
        r  r   r  r   r  r  r  r  )	r}  r   r   r+  r   r   r,  r.  r-  r  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.
        r  r   r  r   zq
r  r  )r}  r   r   r  r+  r,  r.  r-  )r   rK   r}  r~  rx  r  r   rf  rR  r|  r]  rw  ry  r  r}
  rw   r	  r[   r  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.
        rs   r   r   r  
q
%s%f %f m
r  r  s
Q
r}  r   r   r   )r   rK   r}  r~  rx  r  r   rf  rR  r|  r]  rw  ry  r  r}
  rw   r	  topbotr  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   rt   rr   r  r  r  r  )r}  r   r   r   r   r+  r.  )r   rK   r}  r~  rx  r  r   rf  rR  r|  r]  rw  ry  r  rwr	  r[   r  r  r  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.
        r  r   r  r   r  rr   r  r  r  S
Q
r  r   rK   r}  r~  rx  r  r   rf  rR  r|  r]  rw  ry  r  r}
  rw   r  r  r   r   r   r  *  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.
        r  r   r  r   r  rr   r  r  r  r  r  r  r   r   r   r  *      $($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.
        r  r   g      @r   rr   r  r  r  r  r  r  r  r   r   r   r  +  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.
        r  r   rr   r   r  r  r  r  r  r  r  r   r   r   r   +  r  zTools._le_rclosedarrowc                 C   r  r  )r   r7  r   r  r   r   r   r   r  3+  r  zTools.__del__r  r&   r  )7r   r   r0   r   r   r   r   r   r   delete_Toolsr  r  r=  r@  rB  rD  rF  rH  rJ  rL  rN  rR  rT  rW  r  r  r  r]  r_  r0  r  r  rd  r  r  r  r  rl  r  rp  rn  rs  ru  r}  r  r  r  r  r  r 	  r  r  r  r  r  r   r   r   r   r7  `)  sh    









"



%r7  )r  r  r   )r  r  )re  r,  rK   r3  ry  N)r<  r   r   )re  r,  r  rE  ry  N(/  rw  r   _swig_python_version_info__package__r   r   r   builtinsr	   rZ  r   r"   r%   r.   r   r/   
FZ_VERSIONFZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHr  r~   ru  r4  hashlibr  r  ri  r<
  r:
  r@
  stringr    
whitespacer	  r  rv  r3   r4   r5   r6   r7   Anyr  r  rr  r  Optionalr}   rQ	  r   r  r  OptDictr  r  Sequencer  r  r8   r9   r)   rA  r  r  VersionFitzVersionBindVersionDateversionpymupdf_git_shapymupdf_git_commentpymupdf_git_diffpymupdf_git_branchmupdf_git_shamupdf_git_commentmupdf_git_diffmupdf_git_branchr   r	  r  r  r	  r  r  r  r  r  r  r
  r  r  r	  r	  r	  r  r	  PDF_ANNOT_SOUNDPDF_ANNOT_MOVIEPDF_ANNOT_RICH_MEDIAr  PDF_ANNOT_SCREENPDF_ANNOT_PRINTER_MARKPDF_ANNOT_TRAP_NETPDF_ANNOT_WATERMARKPDF_ANNOT_3DPDF_ANNOT_PROJECTIONPDF_ANNOT_UNKNOWNPDF_REDACT_IMAGE_NONEPDF_REDACT_IMAGE_REMOVEPDF_REDACT_IMAGE_PIXELSPDF_ANNOT_IS_INVISIBLEPDF_ANNOT_IS_HIDDENPDF_ANNOT_IS_PRINTPDF_ANNOT_IS_NO_ZOOMPDF_ANNOT_IS_NO_ROTATEPDF_ANNOT_IS_NO_VIEWPDF_ANNOT_IS_READ_ONLYPDF_ANNOT_IS_LOCKEDPDF_ANNOT_IS_TOGGLE_NO_VIEWPDF_ANNOT_IS_LOCKED_CONTENTSPDF_ANNOT_LE_NONEPDF_ANNOT_LE_SQUAREPDF_ANNOT_LE_CIRCLEPDF_ANNOT_LE_DIAMONDPDF_ANNOT_LE_OPEN_ARROWPDF_ANNOT_LE_CLOSED_ARROWPDF_ANNOT_LE_BUTTPDF_ANNOT_LE_R_OPEN_ARROWPDF_ANNOT_LE_R_CLOSED_ARROWPDF_ANNOT_LE_SLASHPDF_WIDGET_TYPE_UNKNOWNr  r  PDF_WIDGET_TYPE_COMBOBOXPDF_WIDGET_TYPE_LISTBOXr  PDF_WIDGET_TYPE_SIGNATUREPDF_WIDGET_TYPE_TEXTPDF_WIDGET_TX_FORMAT_NONEPDF_WIDGET_TX_FORMAT_NUMBERPDF_WIDGET_TX_FORMAT_SPECIALPDF_WIDGET_TX_FORMAT_DATEPDF_WIDGET_TX_FORMAT_TIMEPDF_FIELD_IS_READ_ONLYPDF_FIELD_IS_REQUIREDPDF_FIELD_IS_NO_EXPORTPDF_TX_FIELD_IS_MULTILINEPDF_TX_FIELD_IS_PASSWORDPDF_TX_FIELD_IS_FILE_SELECT"PDF_TX_FIELD_IS_DO_NOT_SPELL_CHECKPDF_TX_FIELD_IS_DO_NOT_SCROLLPDF_TX_FIELD_IS_COMBPDF_TX_FIELD_IS_RICH_TEXT!PDF_BTN_FIELD_IS_NO_TOGGLE_TO_OFFPDF_BTN_FIELD_IS_RADIOPDF_BTN_FIELD_IS_PUSHBUTTON!PDF_BTN_FIELD_IS_RADIOS_IN_UNISONPDF_CH_FIELD_IS_COMBOPDF_CH_FIELD_IS_EDITPDF_CH_FIELD_IS_SORTPDF_CH_FIELD_IS_MULTI_SELECT"PDF_CH_FIELD_IS_DO_NOT_SPELL_CHECK$PDF_CH_FIELD_IS_COMMIT_ON_SEL_CHANGEPDF_SIGNATURE_ERROR_OKAY!PDF_SIGNATURE_ERROR_NO_SIGNATURES"PDF_SIGNATURE_ERROR_NO_CERTIFICATE"PDF_SIGNATURE_ERROR_DIGEST_FAILUREPDF_SIGNATURE_ERROR_SELF_SIGNED(PDF_SIGNATURE_ERROR_SELF_SIGNED_IN_CHAINPDF_SIGNATURE_ERROR_NOT_TRUSTEDPDF_SIGNATURE_ERROR_UNKNOWNPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCECS_RGBCS_GRAYCS_CMYKrE  PDF_ENCRYPT_NONEPDF_ENCRYPT_RC4_40PDF_ENCRYPT_RC4_128PDF_ENCRYPT_AES_128PDF_ENCRYPT_AES_256PDF_ENCRYPT_UNKNOWNPDF_PERM_PRINTPDF_PERM_MODIFYPDF_PERM_COPYPDF_PERM_ANNOTATEPDF_PERM_FORMPDF_PERM_ACCESSIBILITYPDF_PERM_ASSEMBLEPDF_PERM_PRINT_HQPDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLightTEXT_FONT_SUPERSCRIPTTEXT_FONT_ITALICTEXT_FONT_SERIFEDTEXT_FONT_MONOSPACEDTEXT_FONT_BOLDUCDN_SCRIPT_COMMONUCDN_SCRIPT_LATINUCDN_SCRIPT_GREEKUCDN_SCRIPT_CYRILLICUCDN_SCRIPT_ARMENIANUCDN_SCRIPT_HEBREWUCDN_SCRIPT_ARABICUCDN_SCRIPT_SYRIACUCDN_SCRIPT_THAANAUCDN_SCRIPT_DEVANAGARIUCDN_SCRIPT_BENGALIUCDN_SCRIPT_GURMUKHIUCDN_SCRIPT_GUJARATIUCDN_SCRIPT_ORIYAUCDN_SCRIPT_TAMILUCDN_SCRIPT_TELUGUUCDN_SCRIPT_KANNADAUCDN_SCRIPT_MALAYALAMUCDN_SCRIPT_SINHALAUCDN_SCRIPT_THAIUCDN_SCRIPT_LAOUCDN_SCRIPT_TIBETANUCDN_SCRIPT_MYANMARUCDN_SCRIPT_GEORGIANUCDN_SCRIPT_HANGULUCDN_SCRIPT_ETHIOPICUCDN_SCRIPT_CHEROKEEUCDN_SCRIPT_CANADIAN_ABORIGINALUCDN_SCRIPT_OGHAMUCDN_SCRIPT_RUNICUCDN_SCRIPT_KHMERUCDN_SCRIPT_MONGOLIANUCDN_SCRIPT_HIRAGANAUCDN_SCRIPT_KATAKANAUCDN_SCRIPT_BOPOMOFOUCDN_SCRIPT_HANUCDN_SCRIPT_YIUCDN_SCRIPT_OLD_ITALICUCDN_SCRIPT_GOTHICUCDN_SCRIPT_DESERETUCDN_SCRIPT_INHERITEDUCDN_SCRIPT_TAGALOGUCDN_SCRIPT_HANUNOOUCDN_SCRIPT_BUHIDUCDN_SCRIPT_TAGBANWAUCDN_SCRIPT_LIMBUUCDN_SCRIPT_TAI_LEUCDN_SCRIPT_LINEAR_BUCDN_SCRIPT_UGARITICUCDN_SCRIPT_SHAVIANUCDN_SCRIPT_OSMANYAUCDN_SCRIPT_CYPRIOTUCDN_SCRIPT_BRAILLEUCDN_SCRIPT_BUGINESEUCDN_SCRIPT_COPTICUCDN_SCRIPT_NEW_TAI_LUEUCDN_SCRIPT_GLAGOLITICUCDN_SCRIPT_TIFINAGHUCDN_SCRIPT_SYLOTI_NAGRIUCDN_SCRIPT_OLD_PERSIANUCDN_SCRIPT_KHAROSHTHIUCDN_SCRIPT_BALINESEUCDN_SCRIPT_CUNEIFORMUCDN_SCRIPT_PHOENICIANUCDN_SCRIPT_PHAGS_PAUCDN_SCRIPT_NKOUCDN_SCRIPT_SUNDANESEUCDN_SCRIPT_LEPCHAUCDN_SCRIPT_OL_CHIKIUCDN_SCRIPT_VAIUCDN_SCRIPT_SAURASHTRAUCDN_SCRIPT_KAYAH_LIUCDN_SCRIPT_REJANGUCDN_SCRIPT_LYCIANUCDN_SCRIPT_CARIANUCDN_SCRIPT_LYDIANUCDN_SCRIPT_CHAMUCDN_SCRIPT_TAI_THAMUCDN_SCRIPT_TAI_VIETUCDN_SCRIPT_AVESTAN UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHSUCDN_SCRIPT_SAMARITANUCDN_SCRIPT_LISUUCDN_SCRIPT_BAMUMUCDN_SCRIPT_JAVANESEUCDN_SCRIPT_MEETEI_MAYEKUCDN_SCRIPT_IMPERIAL_ARAMAICUCDN_SCRIPT_OLD_SOUTH_ARABIAN"UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN!UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVIUCDN_SCRIPT_OLD_TURKICUCDN_SCRIPT_KAITHIUCDN_SCRIPT_BATAKUCDN_SCRIPT_BRAHMIUCDN_SCRIPT_MANDAICUCDN_SCRIPT_CHAKMAUCDN_SCRIPT_MEROITIC_CURSIVE UCDN_SCRIPT_MEROITIC_HIEROGLYPHSUCDN_SCRIPT_MIAOUCDN_SCRIPT_SHARADAUCDN_SCRIPT_SORA_SOMPENGUCDN_SCRIPT_TAKRIUCDN_SCRIPT_UNKNOWNUCDN_SCRIPT_BASSA_VAHUCDN_SCRIPT_CAUCASIAN_ALBANIANUCDN_SCRIPT_DUPLOYANUCDN_SCRIPT_ELBASANUCDN_SCRIPT_GRANTHAUCDN_SCRIPT_KHOJKIUCDN_SCRIPT_KHUDAWADIUCDN_SCRIPT_LINEAR_AUCDN_SCRIPT_MAHAJANIUCDN_SCRIPT_MANICHAEANUCDN_SCRIPT_MENDE_KIKAKUIUCDN_SCRIPT_MODIUCDN_SCRIPT_MROUCDN_SCRIPT_NABATAEANUCDN_SCRIPT_OLD_NORTH_ARABIANUCDN_SCRIPT_OLD_PERMICUCDN_SCRIPT_PAHAWH_HMONGUCDN_SCRIPT_PALMYRENEUCDN_SCRIPT_PAU_CIN_HAUUCDN_SCRIPT_PSALTER_PAHLAVIUCDN_SCRIPT_SIDDHAMUCDN_SCRIPT_TIRHUTAUCDN_SCRIPT_WARANG_CITIUCDN_SCRIPT_AHOM!UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHSUCDN_SCRIPT_HATRANUCDN_SCRIPT_MULTANIUCDN_SCRIPT_OLD_HUNGARIANUCDN_SCRIPT_SIGNWRITINGUCDN_SCRIPT_ADLAMUCDN_SCRIPT_BHAIKSUKIUCDN_SCRIPT_MARCHENUCDN_SCRIPT_NEWAUCDN_SCRIPT_OSAGEUCDN_SCRIPT_TANGUTUCDN_SCRIPT_MASARAM_GONDIUCDN_SCRIPT_NUSHUUCDN_SCRIPT_SOYOMBOUCDN_SCRIPT_ZANABAZAR_SQUAREUCDN_SCRIPT_DOGRAUCDN_SCRIPT_GUNJALA_GONDIUCDN_SCRIPT_HANIFI_ROHINGYAUCDN_SCRIPT_MAKASARUCDN_SCRIPT_MEDEFAIDRINUCDN_SCRIPT_OLD_SOGDIANUCDN_SCRIPT_SOGDIANUCDN_SCRIPT_ELYMAICUCDN_SCRIPT_NANDINAGARI"UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONGUCDN_SCRIPT_WANCHOr?   rB   rH   rJ   rL   rO   rP   rS   rU   rY   r\   r]   r^   r`   ra   rd   rf   r  r  r  rl   r   rO  r   r   r@  r*  r  rg  r  r  r<  r  r  	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFra  rh  rg  ro  rn  rp  rl  rm  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr
  r
  r
  r
  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLTEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_PRESERVE_IMAGESTEXT_INHIBIT_SPACESTEXT_DEHYPHENATETEXT_PRESERVE_SPANSTEXT_MEDIABOX_CLIPTEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICSTAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_DraftBase14_fontnamesrX  ry   r  
annot_skelr  r3  r6  r7  rI  r^  r[  rZ  rY  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r|  r  r  r  r  r  r+  r2  r8  r:  r;  rD  rV  rm  rk  r[  r`  r_  rb  rg  rj  r  r\  r  r  Document_swigregisterr,  Page_swigregisterrr  Pixmap_swigregisterr  Colorspace_swigregisterr  Device_swigregisterr  Outline_swigregisterr3  Annot_swigregisterrR	  Link_swigregisterrg	  DisplayList_swigregisterr  TextPage_swigregisterrc  Graftmap_swigregisterr	  TextWriter_swigregisterrE  Font_swigregisterr
  DocumentWriter_swigregisterr@  Archive_swigregisterrJ
  Xml_swigregisterr
  Story_swigregisterr7  Tools_swigregisterr   r   r   r   <module>   sV  
	







































































































































 b
 .   < 
d




	  -	














$E-    E25
%9*
0

"I
,+-


   WF              B          x   W&	9      L #) ; i '. =    P    ^