o
    Cji:                    @   s!  d Z ddlZddlZddlZddlZddlZddlZdHddZej	drHedr0edsHed	 ed
 ed ed ed ed	 dd Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ eejd ed Zdd ZeddZeddZdadadada ej!"dZ#e#duree$ de#d ee$ dej!d   e#dkrddl#Z#nddl%Z%e%j&'de#( Z#e#j)j*j+Z+n#zddlm+Z+ W n e,y Z- z
ddl+Z+W Y dZ-[-ndZ-[-ww e+.  e+j/e+j0e+j1fZ2ej3ej4 Z5ej3e6 Z7ej3e8 Z9ej:e;df Z<ej3ej= Z>ej3e? Z@dZAd ZBej!"d!ZCd"ZDd#ZEd$ZFd%ZGd&d' ZHd(d) ZId*d+ ZJG d,d- d-ZKG d.d/ d/ZLG d0d1 d1ZMG d2d3 d3ZNG d4d5 d5ZOG d6d7 d7ZPerzejQZRG d8d9 d9ZSeSZTG d:d; d;ZUG d<d= d=ZVG d>d? d?ZWG d@dA dAZXG dBdC dCZYG dDdE dEeYZZeZ Z[G dFdG dGZ\G dHdI dIZ]ddJlm^Z^ G dKdL dLZ_						dIdMdNZ`G dOdP dPZAerejaeA_bG dQdR dRZcG dSdT dTZBG dUdV dVZdG dWdX dXZeG dYdZ dZZfG d[d\ d\ZgG d]d^ d^ZhG d_d` d`ZiG dadb dbZj	 ejkel Zm	 e+jno D ]\ZpZqeprdcrIeprddrCq1esemepeq q1devB ewB exB eyB ezB e{B Z|e+j}dksaJ e~e+j~ksiJ ee+jksqJ [mi Zi ZejZdeZi ZeD ]	Zeee < qdfedg< dhedi< djedk< dledm< dnedo< dpedq< dreds< dtedu< dvedw< dxedy< dzed{< d|ed}< d~ed< ded< dZdZdZdZdag adadadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdeB eB eB ZdeB eB eB ZdeB eB eB eB ZeZdeB eB eB eB ZdeB eB eB eB ZdeB eB eB eB ZdeB eB eB ZdeB eB eB ZdZdZdZdadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZddddddddZG dd deZG dd deZG dd deZeNeЃZeNeуZeNe҃ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdʐZ dːZd̐Zd͐ZdΐZdϐZdАZdѐZdҐZdӐZ	dԐZ
dՐZd֐ZdאZdؐZdِZdڐZdېZdܐZdݐZdސZdߐZdZdZdZdZdZdZz1d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Z$dZ%dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0d d Z1dd Z2dd Z3dd Z4dd	 Z5d
d	 Z5dd Z6dd Z7dd Z8dej=de9fddZ:dej=de9fddZ;dd Z<dd Z=dd Z>dd Z?dd  Z@d!d" ZAd#d$ ZBd%d& ZCd'd( ZDd)d Z=d*d+ ZEd,d- ZFd.d/ ZGd0d1 ZHd2d3 ZId4d5 ZJd6d7 ZKd8d9 ZLd:d; ZMd<d= ZNd>d? ZOd@dA ZPdBdC ZQdDdE ZRdFdG ZSdHdI ZTdJdK ZUdLdM ZVdNdO ZWdPdQ ZXdRdS ZYdTdU ZZdVdW Z[dXdY Z\dZd[ Z]d\d] Z^d^d_ Z_d`da Z`dbe+jadce;fdddeZbdfe+jcdbe+jadce;fdgdhZddidj Zedkdl Zfdmdn Zgdodp Zhdqdr Zidsdt Zjdudv Zkdwdx Zldydz Zmd{d| Znd}d~ Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudavdd Zwdd Zxe2dkr
dd Zyndd Zzdd Zy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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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dd Zdd Zdd Zdd Zdd ZdZd ZdZdZdZdZdZdZdZdZd	Zd
ZdZdZdZdZdZdZdZdZÐdZĐdZŐdZƐdZǐdZȐdZɐdZʐdd Zːdd Z)dd Z.dJdd Zde>fd!d"Z͐d#d$d%e?de9fd&d'Zΐdfd(de;defd)d*ZАd+ejde9fd,d-Zѐdejdefd.d/ZӐdejfd0d1ZԐd2ejdefd3d4ZՐd5ejdefd6d7Zdej:eϐe9e8df d8e?de?fd9d:Zאd;d< Zؐd=d> Zِdfd(d?ej=fd@dAZڐdBdC ZېdDdE ZܐdFdG ZݐdHdI Zde?dJej:eϐe9df dKeҐdLe;de?f
dMdNZߐdOe?de?fdPdQZde?fdRdSZddddTdUe?dVe@dWede@de?f
dXdYZdKde?d%e?dZe8d[e;de8f
d\d]Zd^ej4de6fd_d`Zdadb Zdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd Zdd Zdd Zdd ZG dd de+j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deEdeEdeYfddZ	G dd de+j
ZG dd de+jZG dd de+jZdd ZG dd de+jZG dd de+jZdefddZd+ejde9fdd-Zѐdejdefdd/ZӐd#d$d%e?de9fdd'Zΐdfd(de;defdd*ZАdd Z*dLde?de@fddZde?fddÄZde9fdĐdńZde9fdƐdǄZd#dPde;fdȐdɄZdMdːd̄Zd͐d΄ ZdϐdЄ Zdѐd҄ ZdӐdԄ ZdՐdք Zde?fdאd؄Z dOe?de?fdِdQZG dڐdۄ dېe!Z"dܐd݄ Z#dNdeEdeEdeGdefddZ$de?de;fddZ%dd Z&dOdeGde;de;def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 Z0dd Z1d d Z2dd Z3dd Z4dd Z5dd	 Z6d
d Z7dd Z8dd Z9dd Z:dOe?deefddZ;dOe?de9fddZ<dd Z=dd Z>dd Z?dPddZ@dQddZAd d! ZBd"d# ZCd$e;de9fd%d&ZDd$e;de9fd'd(ZEd)d* ZFd+d, ZGd-d. ZHdZIdZJdZKdZLd/e;de?fd0d1ZMd2d3 ZNG d4d5 d5ZOdd6lmPZP e6d7d8 ePQ o D ZRe#sIe+Se e+Te d9d: ZUeVeU ePjWZWePjXZXePjYZYePjZZZePj[Z[ePj\eK_\ePj]eK_]ePj^eS__ePj`eS_`ePjaeS_aePjbeS_bePjceS_cePjdeS_dePjeeS_eePjfeS_fePjgeS_gePjheS_hePjieS_iePjjeS_jePjkeS_kePjleS_lePjmeS_mePjneS_nePjoeS_oePjpeS_pePjqeS_qePjreS_rePjseS_sePjteS_tePjueS_ueSjveS_wePjxej_xePjyeA_yePjzeA_zePj{eA_{ePj|eA_|ePj}eA_}ePj~eA_~ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_ePj\eA_\ePjeA_ePjeA_ePjeA_ePj]eA_]ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_d;d< eA_ePjeA_ePjeA_ePjeA_ePjeA_ePjeA_dd=lmZ eeA_ePjxee_xePjei_G d>d? d?eZd@ZdAZdBZedCddDddEdZeeefZdFdG Z	 eZdS (R  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   c                 C   sd   dd l }|jdd| }tj|j}|j}|j}t| d| d| d|  t	j
d t	j
  d S )Nr   )context:: file)inspectstackospathrelpathfilenamelinenofunctionprintsysstdoutflush)textcallerr   frame_recordr   liner    r   h/var/www/html/Resume-Parser/resume-parser-inhouse/venv/lib/python3.10/site-packages/fitz_new/__init__.pylog   s   $r   zfitz/__init__.pyzfitz/_extra*zfitz/_mupdf*z(########################################z=# Warning: current directory appears to contain an incompletez9# fitz/ installation directory so "import fitz" may fail.z@# This can happen if current directory is a mupdfpy source tree.z4# Suggest changing to a different current directory.c                  C   s"   dd l } td | jtjd d S )Nr   zexception_info:r   )	tracebackr   	print_excr   r   )r   r   r   r   exception_info'   s   r   )extraz
()<>[]{}/%c                 C   sj   t j| }|du r|}n|dkrd}n|dkrd}n
J d|  d|||kr3td	|  d| |S )
z}
    Returns `True`, `False` or `default` depending on whether $<name> is '1',
    '0' or unset. Otherwise assert-fails.
    N1T0Fr   zUnrecognised value for r   zUsing non-default setting from )r
   environgetr   )namedefaultvretr   r   r   get_env_boolA   s   r'   PYMUPDF_EXCEPTIONS_VERBOSETPYMUPDF_USE_EXTRAMUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATH mupdf_cppyy)mupdfPage_forward_declPoint_forward_declTESSDATA_PREFIXmatrix_like
point_like	quad_like	rect_likec                 C   sJ   t | tr
t| jS t | tjr| S t | tjr|  S J dt| )zH
    Returns document as a mupdf.FzDocument, upcasting as required.
    r   Unrecognised type(document)=)	
isinstanceDocument_as_fz_documentthisr.   
FzDocumentPdfDocumentsupertypedocumentr   r   r   r9      s   

r9   c                 C   sL   t | tr
t| jS t | tjr| S t | tjrt| S J dt| )z
    Returns document as a mupdf.PdfDocument, downcasting as required. If we
    fail (i.e. document is a mupdf.FzDocument(), <ret>.m_internal will be None.
    r   r6   )r7   r8   _as_pdf_documentr:   r.   r<   r;   r>   r?   r   r   r   rA      s   


rA   c                 C   sF   t | tr| j} t | tjr|  S t | tjr| S J dt| )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    r   Unrecognised type(page)=)r7   Pager:   r.   PdfPager=   FzPager>   pager   r   r   _as_fz_page   s   
rH   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdddZ	dddZ
edd Zedd Zedd Zedd ZdddZedd  Zd!d" Zed#d$ Zed%d& Zd'd( Zd)d* Zd+d, Zdd-d.Zd/d0 Zdd1d2Zed3d4 Zed5d6 Zd7d8 Zed9d: Zed;d< Zed=d> Z ed?d@ Z!edAdB Z"edCdD Z#edEdF Z$edGdH Z%edIdJ Z&edKdL Z'dMdN Z(dOdP Z)dQdR Z*ddSdTZ+ddUdVZ,dWdX Z-ddYdZZ.d[d\ Z/dd]d^Z0d_d` Z1dadb Z2ddcddZ3dedf Z4dgdh Z5didj Z6dkdl Z7ddmdnZ8edodp Z9								q	ddre:dse;dte<due:dve=dwe=dxe=dye>dze?fd{d|Z@dd}d~ZAeBdd ZCedd ZDedd ZEdS )Annotc                 C      t |tjsJ || _d S N)r7   r.   PdfAnnotr:   selfannotr   r   r   __init__      
zAnnot.__init__c                 C   s"   t | dd}d| jd t|f S )Nparentz<>z'%s' annotation on %sr   )getattrr>   str)rN   rR   r   r   r   __repr__   s   zAnnot.__repr__c                 C      |   S rK   )rU   rN   r   r   r   __str__      zAnnot.__str__c                 C   s   t | ddrd| _d S d S )NthisownF)rS   rZ   rW   r   r   r   _erase   s   
zAnnot._erasec              
   C   sF  | j }t|tjkrd S t }zPtt|d}|jr*td t	|}||t
< tt|d}|jrBt|}t||t< nd|t< tt|td}d}|jr[t|}||t< W n tyx } ztrmt  W Y d }~d S d }~ww |}|s|S | j|d< t| \}	}
}|	|d< |
|d	< ||d
< | jd }||d< |S )NROzIgnoring redaction key '/RO'.OverlayTextr,   Qr   rect
text_colorfontnamefontsizefill)r:   r.   pdf_annot_typePDF_ANNOT_REDACTdictpdf_dict_getspdf_annot_obj
m_internal
JM_Warning
pdf_to_numdictkey_xrefpdf_to_text_stringJM_UnicodeFromStrdictkey_textpdf_dict_getPDF_NAME
pdf_to_intdictkey_align	Exceptiong_exceptions_verboser   r_   TOOLS	_parse_dacolors)rN   rO   valuesobjxrefr   alignevalr`   ra   rb   rc   r   r   r   _get_redact_values   sH   





zAnnot._get_redact_valuesc                 C   s   t rt| jtjsJ t| j}t|tsJ |S d }d }| j}t|tjs)J t|}t	|t
dt
d}t|rCt|}|rL|jrLt|}|S )NAPN)g_use_extrar7   r:   r.   rL   r   Annot_getAPbytesrh   pdf_dict_getlrq   pdf_is_streampdf_load_streamri   JM_BinFromBuffer)rN   r&   rresrO   	annot_objapr   r   r   _getAP  s    



zAnnot._getAPr   c           
   
   C   s   zU| j }t|}t|}t|tdtd}|js ttt	|s)ttt
|}|js4ttt| ||d |rSt|td}t|td| W d S W d S  tyt }	 ztrit  W Y d }	~	d S W Y d }	~	d S d }	~	ww )Nr   r   r   RectBBox)r:   r.   rh   pdf_annot_pager   rq   ri   RuntimeErrorMSG_BAD_APNr   JM_BufferFromBytes
ValueErrorMSG_BAD_BUFFERJM_update_streamdocpdf_dict_get_rectpdf_dict_put_rectrt   ru   r   )
rN   buffer_r_   rO   r   rG   apobjr   bboxr}   r   r   r   _setAP  s*   


&zAnnot._setAPNc                 C   s*  | j }|jsJ t|}t|}| }t|}	t|\}
}z|
dks4|	tjtj	tj
tjtjfvr=t|td n|
dkrKt||d |
  |dkrQdnd}|	tjtj	tjtjtjtj
tjtjtjtjtjfvrod}|rzt|td| t| t| d|_|	tjkr|
dkrt||d |
  n$|
dkrt| |
}t|
D ]
}t|||  qt|td| W n ty } zt rt!  t"d| t#j$d  d }~ww |dk s|dkr|sdS zt%t|tdtd	}|jst&t't(|td
}|jst)|td
d}t*| d}|dkrA|dk rAt+|td| t+|td| t+|td| |rVt,|td| t,|td| t(|td}|jskt)|tdd}t|td| W dS  ty } zt rt!  t"d| t#j$d  d }~ww )Nr   ICr   Rotatezcannot update annot: r   Tr   r   	Resources      CAcaBM	ExtGStateHz#cannot set opacity or blend mode
: )-r:   ri   r.   rh   r   r   rd   JM_color_FromSequencePDF_ANNOT_SQUAREPDF_ANNOT_CIRCLEPDF_ANNOT_LINEPDF_ANNOT_POLY_LINEPDF_ANNOT_POLYGONpdf_dict_delrq   pdf_set_annot_interior_colorPDF_ANNOT_CARETPDF_ANNOT_FREE_TEXTPDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_STAMPPDF_ANNOT_TEXTpdf_dict_put_intpdf_dirty_annotpdf_update_annotresynth_requiredpdf_set_annot_colorpdf_new_arrayrangepdf_array_push_realpdf_dict_putrt   ru   r   r   r   stderrr   r   r   rp   pdf_dict_put_dictpdf_new_dictpdf_dict_put_realpdf_dict_put_name)rN   opacity
blend_mode
fill_colorrotaterO   r   rG   pdftype_nfcolfcol
insert_rotcolir}   r   	resourcesalp0extgr   r   r   _update_appearance(  s   








zAnnot._update_appearancec                 C   s   t |  | j}t|}t|tdtd}|js$tttjj	}nt
|td}t|}t|| jj }|| jj9 }|S )zannotation appearance bboxr   r   r   )CheckParentr:   r.   rh   r   rq   ri   JM_py_from_rectFzRectFixed_INFINITEr   r   rR   transformation_matrixderotationMatrix)rN   rO   r   r   r~   r_   r   r   r   apn_bbox  s   
zAnnot.apn_bboxc                 C   s   z7t |  | j}t|tjsJ tt|tjtj}|j	s&t
t W S t|tj}t
|}t|}|W S  tyD   trCt   w )zannotation appearance matrix)r   r:   r7   r.   rL   r   rh   PDF_ENUM_NAME_APPDF_ENUM_NAME_Nri   JM_py_from_matrixFzMatrixpdf_dict_get_matrixPDF_ENUM_NAME_MatrixMatrixrt   ru   r   )rN   rO   r   matr~   r   r   r   
apn_matrix  s&   
zAnnot.apn_matrixc              	   C   s   t |  | j}t|}t|td}d}|jr"tt|}|S t	|tdtdtdtd}t
|r|t|}t|D ]:}t||}t
|r{t|}t|D ]#}	t||	}
t|
tddkrzttt||	}|    S qWqA|S )zannotation BlendModer   Nr   r   r   r   r   )r   r:   r.   rh   rp   rq   ri   rn   pdf_to_namer   pdf_is_dictpdf_dict_lenr   pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)rN   rO   r   rz   r   nr   obj1mjobj2r   r   r   	blendmode  s:   




zAnnot.blendmodec                 C   sF   t |  | jd }|tttttttfvrt	 S t
| j}t|}|S )zBorder information.r   )r   r>   r   r   r   r   r   r   r   rf   r.   rh   r:   JM_annot_border)rN   atypeaor&   r   r   r   border  s   
	zAnnot.borderr   c                 C   s@   t |  | j}tt|}tddd|d}t||| dS )z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)r   r:   r.   pdf_get_bound_documentrh   _make_PdfFilterOptionspdf_filter_annot_contents)rN   r   rO   r   filter_r   r   r   clean_contents  s
   zAnnot.clean_contentsc              
   C   sT   zt |  | j}t|tjsJ tt|W S  ty) } ztr$t	   d}~ww )zColor definitions.N)
r   r:   r7   r.   rL   JM_annot_colorsrh   rt   ru   r   )rN   rO   r}   r   r   r   rx     s   
zAnnot.colorsc                 C   s   t |  | j}t|}t|}	 t|}|jsnt|| qt|t	d t
| t	d}t|}d}t|d ddD ]"}t||}	t
|	t	d}
|	jsVqBt|
|sdt|| d}qB|rtt| t	d| dS dS )z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   r   ParentN)r   r:   r.   rh   r   JM_find_annot_irtri   pdf_delete_annotr   rq   rp   rz   pdf_array_lenr   pdf_array_getr   pdf_array_deleter   )rN   rO   r   rG   	irt_annotannotsr   foundr   opr   r   r   delete_responses  s4   


zAnnot.delete_responsesc                 C   sR  t |  t }d}d}| j}t|}t|}|tjkr!ttt	|t
dt
dt
d}|js7tdt t|t
d}t|t
d}	|	jrPt|	}
nt|t
d}	|	jr`t|	}
t|t
d}	|	jrpt|	}t|t
d}	|	jrt|	}t	|t
d	t
d
}	|	jrt|	}t|
|t< t||t< ||t< ||t< |S )zAttached file information.r   FSEFFbad PDF: file entry not foundUFDescLengthParamsSize)r   rf   r:   r.   rh   rd   r   	TypeErrorMSG_BAD_ANNOT_TYPEr   rq   ri   RAISEPYJM_Exc_FileDataErrorrp   rm   rr   JM_EscapeStrFromStrdictkey_filenamern   dictkey_descdictkey_lengthdictkey_size)rN   r   lengthsizerO   r   r   streamfsr	  r   descr   r   r   	file_info  sL   







zAnnot.file_infoc                 C   s   t |  | j}t|S )zFlags field.)r   r:   r.   pdf_annot_flagsrM   r   r   r   flagsF  s   
zAnnot.flagsc                 C   sv   t |  | j}t|}t|}|tjkrttt|t	dt	dt	d}|j
s0tdt t|}t|}|S )zRetrieve attached file content.r  r  r  r  )r   r:   r.   rh   rd   r   r  r  r   rq   ri   r  r  r   r   )rN   rO   r   r>   r   bufr   r   r   r   get_fileM  s   




zAnnot.get_filec                 C   @   t |  d}| j}t|}t|td}|jrt|}|S )z*Get annotation optional content reference.r   OCr   r:   r.   rh   rp   rq   ri   rk   )rN   ocrO   r   rz   r   r   r   get_oc\  s   

zAnnot.get_occ                 C   s   zt | d}W |S  tyH   t| j}t|tjsJ |jr&t|	 nd }t
||}|| _tdt| dt| dt| jd Y |S w )NrR   z!No attribute .parent: type(self)=z
 id(self)=z: have set id(self.parent)=.)rS   AttributeErrorr.   r   r:   r7   rD   ri   r8   r   rC   rR   r   r>   id)rN   r&   rG   r@   r   r   r   
get_parentj  s   

,zAnnot.get_parentc           	      C   s   t |  tttd}t|tu r|| d}|r#t|d |d }t	|}|}|s/t
 }t
| j||t
d|}|rD||| t|S )zannotation Pixmap)grayrgbcmykNH   r   )r   csGRAYcsRGBcsCMYKr>   rT   r"   lowerr   JM_matrix_from_pyr.   fz_device_rgbpdf_new_pixmap_from_annotr:   FzSeparationsset_dpiPixmap)	rN   matrixdpi
colorspacealphacspacesctmcspixr   r   r   
get_pixmapx  s   zAnnot.get_pixmapc           	      C   s8  t |  | j}t|}t|}t|td}|tjks!|js%t	t
t|ttjr2tdt t }t|td}|jrGt||d< t|td}|jrYt||d< t|td}|jrkt||d< t|td	}|jr}t||d
< t|d}|jrt||d< t|}t|}||d< |S )zRetrieve sound stream.Soundzunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionr   )r   r:   r.   rh   rd   rp   rq   PDF_ANNOT_SOUNDri   r  r  r  r  r  rf   pdf_to_realrr   r   rg   r   r   )	rN   rO   r   r>   soundr   rz   r&  r   r   r   r   	get_sound  s:   



zAnnot.get_soundc                 C   s0   t |  t }||_| j}t||}t|S )zMake annotation TextPage.)r   r.   FzStextOptionsr%  r:   FzStextPageTextPage)rN   clipr%  optionsrO   	stextpager   r   r   get_textpage  s   zAnnot.get_textpagec                 C   s2   t |  | j}tt|td}|jrdS dS )z Check if annotation has a Popup.r   TF)r   r:   r.   rp   rh   rq   ri   )rN   rO   rz   r   r   r   	has_popup  s   zAnnot.has_popupc                 C   s
  t |  | j}t }tt||t< tt|t	d}tt
||t< tt|t	d}tt||t< tt|d}tt||t< tt|t	d}tt||t< tt|d}t||t< tt|d}tt||t< |S )zVarious information details.NameTCreationDateMSubjNM)r   r:   rf   rn   r.   pdf_annot_contentsdictkey_contentrp   rh   rq   r   dictkey_namerm   dictkey_titlerg   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)rN   rO   r   r	  r   r   r   info  s"   z
Annot.infoc                  C   s4   t j} t| }t|td}|jsdS t|S )z%
        annotation IRT xref
        IRTr   )rN   r:   r.   rh   rp   rq   ri   rk   )rO   r   irtr   r   r   irt_xref  s   

zAnnot.irt_xrefc                 C   s   t |  t| jS )z-Get 'open' status of annotation or its Popup.)r   r.   pdf_annot_is_openr:   rW   r   r   r   is_open  s   zAnnot.is_openc                 C      J d)zannotation languager   zNot implemented yet)r:   r.   pdf_annot_languagefz_string_from_text_languager&  )rN   
this_annotlangr   r   r   language     zAnnot.languagec                 C   s8   t |  | j}t|sdS t|}t|}||fS )zLine end codes.N)r   r:   r.    pdf_annot_has_line_ending_stylespdf_annot_line_start_stylepdf_annot_line_end_style)rN   rO   lstartlendr   r   r   	line_ends  s   


zAnnot.line_endsc                 C   s   t |  | j}t|tjsJ |jsJ t|}|tjkr$t|}nt	|}|jr0t
|nd}|s6dS d|_|jj | jj ksGJ ||jjt|< |jd tjkrbt }t|| |}|S )zNext annotation.NTr   )r   r:   r7   r.   rL   ri   rd   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetrI   rZ   rR   m_internal_value_annot_refsr/  r>   Widgetrv   _fill_widget)rN   rv  r   rO   r~   widgetr   r   r   next  s&   



z
Annot.nextc                 C   s>   t |  | j}d}tt|tj}t|rt|}|S )zOpacity.r   )r   r:   r.   rp   rh   PDF_ENUM_NAME_CApdf_is_numberrT  )rN   rO   opyr   r   r   r   r      s   

zAnnot.opacityc                 C   st   t |  ttjj}| j}t|}t|td}|jr&t	|td}t
|}t|| jj }|| jj9 }|S )zannotation 'Popup' rectangler   r   )r   r.   r   r   r:   rh   rp   rq   ri   r   r   r   rR   r   derotation_matrix)rN   r_   rO   r   rz   r~   r   r   r   
popup_rect+  s   
zAnnot.popup_rectc                 C   r(  )zannotation 'Popup' xrefr   r   r*  )rN   r{   rO   r   rz   r   r   r   
popup_xref>  s   

zAnnot.popup_xrefc                 C   s<   t r	t| j}nt| j}t|}|  }||j9 }|S )zannotation rectangle)	r   r   Annot_rect3r:   r.   pdf_bound_annotr   r0  r  )rN   r~   r
  r   r   r   r_   J  s   
z
Annot.rectc              	   C   sv   t | j}t |td}t |dkr9t t |dt t |dt t |d t t |d fS dS )z6
        annotation delta values to rectangle
        RD   r   r   r   r   N)r.   rh   r:   rp   rq   r  rT  r  )rN   r   arrr   r   r   
rect_delta^  s   zAnnot.rect_deltac                 C   s6   t |  | j}tt|tj}|jsdS t|S )zannotation rotationr   )r   r:   r.   rp   rh   PDF_ENUM_NAME_Rotateri   rr   )rN   rO   rotationr   r   r   r  m  s   
zAnnot.rotationc           	      C   sz   t |  | j}|j}|j}|||  9 }| j}tt}t|t	dt	d}|j
s.ttt|}t|t	d| dS )z1
        Set annotation appearance bbox.
        r   r   r   N)r   rR   rotationMatrixr   r:   r.   rh   rO   r   rq   ri   r   r   JM_rect_from_pyr   )	rN   r   rG   rotr   pannotr   r   r_   r   r   r   set_apn_bboxw  s   
zAnnot.set_apn_bboxc                 C   sZ   t |  | j}t|}t|tdtd}|jsttt	|}t
|td| dS )z!Set annotation appearance matrix.r   r   r   N)r   r:   r.   rh   r   rq   ri   r   r   r9  pdf_dict_put_matrix)rN   r?  rO   r   r   r   r   r   r   set_apn_matrix  s   
zAnnot.set_apn_matrixc                 C   .   t |  | j}t|}t|td| dS )zSet annotation BlendMode.r   Nr   r:   r.   rh   r   rq   )rN   r   rO   r   r   r   r   set_blendmode     
zAnnot.set_blendmodec                 C   sJ  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q| j}	t|	}
t|
}t|||
S )zbSet border properties.

        Either a dict, or direct arguments width, style, dashes or clouds.Nr   zCannot set border for ''.r   zCannot set cloudy border for 'r   )widthstyledashescloudsr  r  r  r  __getitem__)r   r>   r   r   r   r   r   r   r   r   rf   
setdefaulthasattrtupler7   intr:   r.   rh   r   JM_annot_set_border)rN   r   r  r  r  r  r   atnameitemrO   r   r   r   r   r   
set_border  sV   	


zAnnot.set_borderc                 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.
        rc   strokerc   r  r   rK  []N	__float__r   [%g]r   r   
[%g %g %g][%g %g %g %g]z0Warning: fill color ignored for annot type '%s'.r   )r   rR   r>   rf   r"   r   r   r   r   r   re   xref_set_keyr{   r  float
CheckColorlenr  r   )rN   rx   r  rc   r   fill_annotssr   r   r   
set_colors  sJ   







zAnnot.set_colorsc                 C      t |  | j}t|| dS )zSet annotation flags.N)r   r:   r.   pdf_set_annot_flags)rN   r%  rO   r   r   r   	set_flags     zAnnot.set_flagsc           	      C   s   t |  t|tu r*|dd}|dd}|dd}|dd}|dd}d}| j}t|}|r:t|| |rq|rDt|| |rRt	t
|td| |r`t	t
|td| |rstt
|d	t| dS dS dS )
zSet various properties.contentNtitlecreationDatemodDatesubjectra  rb  rc  )r   r>   rf   r"   r:   r.   pdf_annot_has_authorpdf_set_annot_contentspdf_set_annot_authorpdf_dict_put_text_stringrh   rq   pdf_dict_putspdf_new_text_string)	rN   rm  r  r  r  r  r  rO   	is_markupr   r   r   set_info  s.   
zAnnot.set_infoc                 C   s   t j}t|}t|}| dk s| t| krttt	| | d}t
|td}tt|}|dk r?ttt|td| dS )z)
        Set annotation IRT xref
        r   r   Subtypern  N)rN   r:   r.   rh   r   pdf_xref_lenr   r   MSG_BAD_XREFpdf_new_indirectrp   rq   pdf_annot_type_from_stringr   MSG_IS_NO_ANNOTr   )r{   rO   r   rG   ro  subtirt_subtr   r   r   set_irt_xref  s   

zAnnot.set_irt_xrefc                 C   s4   t |  | j}|stj}nt|}t|| dS )zSet annotation language.N)r   r:   r.   FZ_LANG_UNSETfz_text_language_from_stringpdf_set_annot_language)rN   rx  rv  rw  r   r   r   set_language)  s   
zAnnot.set_languagec                 C   s6   t |  | j}t|rt||| dS td dS )zSet line end codes.zbad annot type for line endsN)r   r:   r.   rz   pdf_set_annot_line_ending_stylesrj   )rN   startendrO   r   r   r   set_line_ends3  s
   
zAnnot.set_line_endsc                 C   r  )zSet /Name (icon) of annotation.r_  Nr  )rN   r#   rO   r   r   r   r   set_name<  r  zAnnot.set_namec                 C   sF   t |  | j}t|}|st|td dS tt||| dS )z Set / remove annotation OC xref.r)  N)r   r:   r.   rh   r   rq   JM_add_oc_objectr   )rN   r+  rO   r   r   r   r   set_ocC  s   
zAnnot.set_occ                 C   sV   t |  | j}t|ddst|d dS t|| |dk r)t|}d|_dS dS )zSet opacity.              ?r   N)r   r:   _INRANGEr.   pdf_set_annot_opacityr   transparency)rN   r   rO   rG   r   r   r   set_opacityM  s   

zAnnot.set_opacityc                 C   r  )z-Set 'open' status of annotation or its Popup.N)r   r:   r.   pdf_set_annot_is_open)rN   rr  rO   r   r   r   set_openY  r  zAnnot.set_openc                 C   s@   t |  | j}t|}t|}tt||}t|| dS )z@
        Create annotation 'Popup' or update rectangle.
        N)r   r:   r.   r   JM_rotate_page_matrixfz_transform_rectr  pdf_set_annot_popup)rN   r_   rO   pdfpager  r   r   r   r   	set_popup_  s   
zAnnot.set_popupc              
   C   s   t |  | j}t|}t|}tt||}t|s"t|r&t	t
z	t|| W dS  tyI } ztd|  W Y d}~dS d}~ww )zSet annotation rectangle.zcannot set rect: NF)r   r:   r.   r   r  r  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectrt   r   )rN   r_   rO   r  r  r   r}   r   r   r   set_rectj  s   
zAnnot.set_rectc                 C   s   t |  | j}t|}|tjtjtjtjtjtj	tj
tjtjtjtjfvr(dS |}|dk r6|d7 }|dk s.|dkrB|d8 }|dks:|tjkrO|d dkrOd}t|}t|td| dS )zSet annotation rotation.Nr   h  Z   r   )r   r:   r.   rd   r   r   r   r   r   r   r   r   r   r   r   rh   r   rq   )rN   r   rO   r>   r  r   r   r   r   set_rotationz  s8   

zAnnot.set_rotationc                 C   sj   t |  | jjs
dS t| j}t|}tt| jd}|jr't|r+||fS t	|}|||fS )zannotation typenullIT)
r   r:   ri   r.   rd   pdf_string_from_annot_typerg   rh   pdf_is_namer   )rN   r   cr	  itr   r   r   r>     s   


z
Annot.typeTr   r   rb   ra   r`   border_colorr   	cross_outr   c
           >      C   s  t   t|  dd }
| jd }| jdd}| jdd}| jd }|dkr+|}n| jd	 }d}| j}|	dkr^|	dk rE|	d
7 }	|	dk s=|	d
krQ|	d
8 }	|	d
ksI|tj	kr^|	d dkr^d}	|du re| j
}t|dsm| j}d|  krwdk s|n |durd}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}| }|r ddtt| d }|d }nd}| jr,| j\}} nd!\}} |  }!|! }"d}#|tjkr|rpd}#|"dd }"|"\}$}%}&}'}(|"|& |"|% |"|' |"|% |"|( |"d" |dksz|d#krd}#|dkrd$| gng })|"D ]!}*|* d%rq|* d&r|d#kr|dd }*|)|* q|)}"d'|"}!|tj	krI|!!d(}+|!!d)d* },|!|+|, }!| j"j#| j"j$}-}.|	d+v s|j%|j&  krdksn |.|-}-}.d,|-|.f }/|/d- |! }!d}0|
|d}1|1rd.}0|
|d}2|2r|dkrd"}0d/| }nd# }}2|1r%|2r%d0}0|0dkr:||1 |2 |/ d' |0 d' |! }!|dkrG|d' |! }!d}d}#|tj'tj(fv rd'|"dd d' }!d}#|d#kr||tj'krq|!| d1 }!n |tj(kr{|!d" }!n|tj'kr|!d2 }!n
|tj(kr|!d" }!|dur||! }!|!)d3d4d}!d}#|r|d |! }!d}#d5|! d6 }!||  dkrE|tj'tj(fv rEdtj*tj+tj,tj-tj.tj/tj0tj1tj2f
}3t3dt|3}4d*t4d| jd  }5| j"|5 |5 |5|5f }d}#| j5}6||4v r t6|6d | }7t6|6d | }8|3| | |7|8d|}9|!|9 7 }!| |4v rEt6|6d7 | }7t6|6d | }8|3|  | |7|8d|}9|!|9 7 }!|#r_|rX| 7| | j8|!dd8 n| j8|!dd8 |tj9tj:tj;tj<tj=tj(tj'tj>tj?tj@f
vrzdS | jA}:|:dkrdS | j"jB| j"jC d* };|:dkrtD|tEdd d9k rdS | j"F|;| }<| G|<j" | HtEdd dS tE|:}=| j"F|;|=}<| 7|<j" | H||=  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.
                
)	ColorCodeencode)rE  codeccr   r   r   color_string  s   
z"Annot.update.<locals>.color_stringr   r  Nr  r   r  rc   r  r  r  r   /H gs
r,   F   Tr   !{:g} {:g} {:g} rg /{f:s} {s:g} Tf{:g} g /{f:s} {s:g} Tfr  %{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tffr  )r   r   r   r   zError updating annotation.r  r  [ z] 0 d
utf-8r   r      Sr   s   %g w   ws   RG   
   BT   ETr   r       0 0 %g %g re   
W
n
   fs   %g w
   B   b   ss   
S
s
   
S
[] 0 d
   q
s   
Q
r_   h㈵>)IrI   update_timing_testr   r>   r   r"   rx   r   r.   r   r   r  r   r  rv   rw   r  format
_update_dar   r   r0  r   joinmaprT   r  r  r   
splitlinesre   appendendswithfindr_   r  heightbr  r   r   replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashr   maxverticesPointr  r   r   r   r   r   r   r   r   r   r  tlbrabsr   morphsetRectr  )>rN   r   r   rb   ra   r`   r  r   r  r   r  
annot_typedtbwidthr  rc   r_   apnmatopa_codetcolfnamefsizeupdate_default_appearanceda_strfmtr~   bfillbstrokep_ctmimatr  line_end_leline_end_rir   ap_tab
ap_updated_LLLRURULntabr   BTETwhreopefill_stringstroke_stringle_funcsle_funcs_rangedpointsp1p2leftr  rb  quadr   r   r   r   update  s  














(




 



 





zAnnot.updatec                 C   s  t |  | j}t|}t|}t|}|tjkrttt	|t
dt
dt
d}	|	js5tdt t|t
d}
t|}|rJ|jsJtt|rut||	|d t|t\}}t|}t|	t
d| t|	|t
dt
d |rt|	t
d| t|
t
d| t|	t
d	| t|
t
d	| t|t
d
| |rt|	t
d	| t|
t
d	| |rt|	t
d| t|
t
d| dS dS )zUpdate attached file.r  r  r  bad PDF: no /EF objectr   DLr  r  r  Contentsr  N)r   r:   r.   rh   r   rd   r   r  r  r   rq   ri   r  r  rp   r   r   r   r   fz_buffer_storageNULLpdf_new_intr   pdf_dict_putlr  )rN   r   r   	ufilenamer"  rO   r   r   r>   r   r!  r   r  rS  lr   r   r   update_file  sB   






zAnnot.update_filec                  C   s   d} t dD ]}| |7 } q| S )Nr   i0u  )r   )totalr   r   r   r   r#    s   
zAnnot.update_timing_testc              	   C   s  t |  | j}t|tjsJ t }td}tt||| t	t|}t
||}tt|td}|jsHtt|td}|jsVtt|td}|jsbtt|d}|jrg }tdt|dD ]+}tt||}tt||d }	t||	}
t|
|}
||
j|
jf qp|S g }tt|D ]D}g }t||}tdt|dD ]+}tt||}tt||d }	t||	}
t|
|}
||
j|
jf q|| q|S )zannotation vertex pointsr   VerticesL
QuadPointsCLr   r   )r   r:   r7   r.   rL   r   r   pdf_page_transformr   JM_derotate_page_matrix	fz_concatrp   rh   rq   ri   rg   r   r  rT  r  FzPointfz_transform_pointr)  xy)rN   rO   page_ctmdummyderotr	  r   r   r~  r  pointres1o1r   r   r   r   r9    sB   
zAnnot.verticesc                 C   s   t |  | j}tt|S )zannotation xref number)r   r:   r.   rk   rh   rM   r   r   r   r{   (  s   z
Annot.xrefr   )r   NNr   r   )NNNr   Nr   )Nr   NNr   NNN)NNNNNNrK   )	NNr   NNNNTr   NNNN)F__name__
__module____qualname__rP   rU   rX   r[   r   r   r   r   propertyr   r   r   r   r   rx   r  r#  r%  r'  r,  r0  rG  rV  r]  r^  rm  rp  rr  rx  r  r  r   r  r  r_   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>   OptStrOptFloatr  OptSeqboolr  ri  rs  staticmethodr#  r9  r{   r   r   r   r   rI      s    '

b






0


 	

!











	

/,


	



	
  
+

3rI   c                   @   st   e Z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
edd Zdd Zdd ZdS )Archivec                 G   s(   t  | _t | _|r| j|  dS dS )z
        Archive(dirname [, path]) - from folder
        Archive(file [, path]) - from file name or object
        Archive(data, name) - from memory item
        Archive() - empty archive
        Archive(archive [, path]) - from archive
        N)list_subarchivesr.   fz_new_multi_archiver:   addrN   argsr   r   r   rP   1  s
   
zArchive.__init__c                 C   s   dt | j S )NzArchive, sub-archives: )r  r  rW   r   r   r   rU   >     zArchive.__repr__Nc                 C   s   t tjt| d S rK   )r.   fz_mount_multi_archiverN   r:   sub)subarchr   r   r   r   	_add_archB     zArchive._add_archc                 C   s   t |}t | j|| d S rK   )r.   fz_open_directoryr  r:   )rN   folderr   r  r   r   r   _add_dirE  s   
zArchive._add_dirc                 C   sT   d}t |}t| j|}|std }d}t||| |r(t| j|| d S d S NFT)r   JM_last_treer:   r.   fz_new_tree_archivefz_tree_archive_add_bufferr  )rN   memoryr#   r   drop_subbuffr  r   r   r   _add_treeitemI  s   
zArchive._add_treeitemc                 C   s2   |dkr
t |}nt |}t | j|| d S Nr   )r.   fz_open_zip_archivefz_open_tar_archiver  r:   )rN   filepathr   r   r  r   r   r   _add_ziptarfileT  s   
zArchive._add_ziptarfilec                 C   sD   t |}t|}|dkrt|}nt|}t| j|| d S r  )r   r.   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamr  r:   )rN   r  r   r   r  r   r  r   r   r   _add_ziptarmemory[  s   

zArchive._add_ziptarmemoryc                    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 rK   )r7   r   	bytearrayioBytesIOr~  r   r   r   <lambda>p  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)rJ  entriesr   treer   rJ  r   r  )r  r)  extend)r  ltreer  rJ  mountrN   r   r   make_subarchv  s   

z!Archive.add.<locals>.make_subarchzipr   fpr   tarr#   r   multizneed name for binary contentr  dirrbr  zbad archive contentr   zbad item name )r   )$r7   zipfileZipFilenamelistrS   r  r  getvaluetarfileTarFilegetnamesfileobjr  r  r  r  r>   rT   r   r  r  r#   pathlibPathr
   r   isdirlistdirr  isfileopenreadcloser  seldr  )rN   r  r   bin_okr  r   r  a0rS  ffdatar#   r  r   r  r   r  d  s   




zArchive.addc                 C      | j S )z'
        List of sub archives.
        )r  rW   r   r   r   
entry_list     zArchive.entry_listc                 C   s   t | j|S rK   )r.   fz_has_archive_entryr:   rN   r#   r   r   r   	has_entry     zArchive.has_entryc                 C   s   t t|}t|S rK   )r.   fz_read_archive_entryarchr   )rN   r#   r  r   r   r   
read_entry     zArchive.read_entryrK   )r  r  r  rP   rU   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  0  s    





	~
r  c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd Zdd ZdddZdd ZdddZdddZdd  Zdd!d"Zd#d$ Zd%d& Zd'd( Zdd)d*Zdd+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zed7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#e$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*e$dOdP Z+e$dQdR Z,e$dSdT Z-e$dUdV Z.e$dWdX Z/dYdZ Z0d[d\ Z1e$d]d^ Z2d_d` Z3dadb Z4dcdd Z5ddfdgZ6dhdi Z7djdk Z8dldm Z9dndo Z:dpdq Z;ddrdsZ<dtdu Z=dvdw Z>dxdy Z?dzd{ Z@d|d} ZAd~d ZBdd ZC																		dddZDdd ZEdddZFdd ZGdd ZHe$dd ZIe$dd ZJe	ZKe	ZLe	ZMdS )Xmlc                 C      | S rK   r   rW   r   r   r   	__enter__     zXml.__enter__c                 G      d S rK   r   r  r   r   r   __exit__  r  zXml.__exit__c                 C   sJ   t |tjr|| _d S t trt|}t|| _d S J dt| )Nr   zUnsupported type for rhs: )r7   r.   FzXmlr:   rT   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r>   )rN   rhsr  r   r   r   rP     s   

zXml.__init__c                    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"(=z ''r   ))is_textr)  r   r  tagnameget_attributesitemsfirst_child)noder  shiftkr%   child	show_noder   r   r     s   z%Xml._get_node_tree.<locals>.show_noder   r   )rN   r  r  r   r  r   _get_node_tree  s
   zXml._get_node_treec                 C      |  d}| | |S )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childrN   r  r   r   r   add_bullet_list     

zXml.add_bullet_listc                 C   R   |  d}|dkr||v r| S | d |dkr|}n|d| 7 }| d| | S )z5Set some class via CSS. Replaces complete class spec.classNr  get_attribute_valueremove_attributeset_attribute)rN   r   clsr   r   r   	add_class     

zXml.add_classNc                 C   H   |  d}t|tu r|| | |  }|dkr| }|| | S )zAdd a "code" tagr  Nr  r>   rT   r  create_text_nodespan_bottomrN   r   r  prevr   r   r   add_code+     

zXml.add_codec                 C   r  )z!Add monospaced lines ("pre" node)prer  r  r   r   r   add_codeblock6  r	  zXml.add_codeblockc                 C   r  )zAdd description list ("dl" tag)dlr  r  r   r   r   add_description_list<  r	  zXml.add_description_listc                 C   r  )zAdd "div" tagdivr  r  r   r   r   add_divisionB  r	  zXml.add_divisionr   c                 C   sZ   |t ddvrtd| j}d| }| |}| }|dvr%| | |S | j| |S )zAdd header tagr      zHeader level must be in [1, 6]r\  )h1h2h3h4h5h6r
  )r   r   r  r  r  rR   )rN   levelthis_tagnew_tagr  r  r   r   r   
add_headerH  s   


zXml.add_headerc                 C   r  )zAdd horizontal line ("hr" tag)hrr  r  r   r   r   add_horizontal_lineV  r	  zXml.add_horizontal_linec                 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").imgNr  r,  r  zfloat: r|   src)r  r  r  )rN   r#   r  r,  imgfloatr|   r  r   r   r   	add_image\  s   

zXml.add_imagec                 C   sV   |  d}t|ts|}|d| || | |  }|dkr$| }|| | S )zAdd a hyperlink ("a" tag)ahrefN)r  r7   rT   r  r  r  r  )rN   r3  r   r  r  r   r   r   add_linkk  s   


zXml.add_linkc                 C   s.   | j dvrtd| j | d}| | |S )z8Add item ("li" tag) under a (numbered or bulleted) list.)olr  zcannot add list item toli)r  r   r  r  r  r   r   r   add_list_itemx  s
   


zXml.add_list_itemc                 C   sD   |  d}|dkr|dt| |dkr|d| | | |S )zAdd numbered list ("ol" tag)r5  r   r  Nr>   )r  r  rT   r  )rN   r  numtyper  r   r   r   add_number_list  s   

zXml.add_number_listc                 C   s2   |  d}| jdkr| | |S | j| |S )zAdd "p" tagr
  )r  r  r  rR   r  r   r   r   add_paragraph  s   


zXml.add_paragraphc                 C   r  Nspanr  r  r   r   r   add_span  s   

zXml.add_spanc                 C   r
  )z;Set some style via CSS style. Replaces complete style spec.r  N;r  )rN   r   r  r   r   r   	add_style  r  zXml.add_stylec                 C   r  )zAdd a subscript ("sub" tag)r  Nr  r  r   r   r   add_subscript  r  zXml.add_subscriptc                 C   r  )zAdd a superscript ("sup" tag)supNr  r  r   r   r   add_superscript  r  zXml.add_superscriptc                 C   sf   |  }t|}|  }|dkr| }t|D ]\}}|| | ||d k r0|| d q| S )z"Add text. Line breaks are honored.Nr   r<  )r(  r  r  	enumerater  r  r  )rN   r   lines
line_countr  r   r   r   r   r   add_text  s   zXml.add_textc                 C      t | j|j d S rK   )r.   fz_dom_append_childr:   r  r   r   r   r    r  zXml.append_childc                 C   s6   |  d}|| |  }|d kr| }|| |S r;  )r  r?  r  r  )rN   r  r<  r  r   r   r   append_styled_span  s   


zXml.append_styled_spanc                 C      t t| jS rK   )r  r.   fz_dom_bodyr:   rW   r   r   r   bodytag  r  zXml.bodytagc                 C      t | j}t|S rK   )r.   fz_dom_cloner:   r  rN   r&   r   r   r   clone  r  z	Xml.clonec                 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  r2  )r>   rT   r  sRGB_to_rgbr  r  )colorr   r   r   
color_text  s   zXml.color_textc                 C      t t| j|S rK   )r  r.   fz_dom_create_elementr:   )rN   tagr   r   r   r       zXml.create_elementc                 C   rT  rK   )r  r.   fz_dom_create_text_noder:   rN   r   r   r   r   r    rW  zXml.create_text_nodec                 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  \nN)r  r   r.  )rN   r  r  r   r   r   debug  s   "z	Xml.debugc                 C   $   t | j|||}|jrt|S d S rK   )r.   fz_dom_findr:   ri   r  rN   rV  attmatchr&   r   r   r   r+       zXml.findc                 C   r\  rK   )r.   fz_dom_find_nextr:   ri   r  r^  r   r   r   	find_next  ra  zXml.find_nextc                 C   s,   t | jrd S t | }|jrt|S d S rK   )r.   fz_xml_textr:   fz_dom_first_childri   r  rO  r   r   r   r    s   
zXml.first_childc                 C   s   |sJ t | j|S rK   )r.   fz_dom_attributer:   rN   keyr   r   r   r       zXml.get_attribute_valuec                 C   sN   t | jrd S t }d}	 t | j|\}}|r|s	 |S |t|< |d7 }qNr   r   )r.   rd  r:   rf   fz_dom_get_attributer&   )rN   resultr   r~   rh  r   r   r   r  	  s   zXml.get_attributesc                 C   rG  rK   )r.   fz_dom_insert_afterr:   rN   r  r   r   r   insert_after  r  zXml.insert_afterc                 C   rG  rK   )r.   fz_dom_insert_beforer:   rn  r   r   r   insert_before  r  zXml.insert_beforec                 C   sR   |  }t|}t|D ]\}}| | | ||d k r&| | d q| S )Nr   r<  )r(  r  rC  r  r  r  )rN   r   rD  rE  r   r   r   r   r   insert_text  s   zXml.insert_textc                 C   s
   | j dkS )zCheck if this is a text node.N)r   rW   r   r   r   r  '     
zXml.is_textc                 C   s(   | j }|dkr	dS 	 |j}|s|S |}q
)zReturn last child node.N)r  r  )rN   r  r  r   r   r   
last_child,  s   zXml.last_childc                 C      t | j}|jrt|S d S rK   )r.   fz_dom_nextr:   ri   r  rO  r   r   r   r  8     zXml.nextc                 C   ru  rK   )r.   fz_dom_parentr:   ri   r  rO  r   r   r   rR   >  rw  z
Xml.parentc                 C   ru  rK   )r.   fz_dom_previousr:   ri   r  rO  r   r   r   previousD  rw  zXml.previousc                 C      t | j d S rK   )r.   fz_dom_remover:   rW   r   r   r   removeJ  r  z
Xml.removec                 C   s   |sJ t | j| d S rK   )r.   fz_dom_remove_attributer:   rg  r   r   r   r  M  s   zXml.remove_attributec                 C   rJ  rK   )r  r.   fz_xml_rootr:   rW   r   r   r   rootQ     zXml.rootc                 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: %srg  centerrightjustifyzUnrecognised align=)r7   rT   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   r?  )rN   r|   r   tr   r   r   	set_alignU  s   

zXml.set_alignc                 C   s   |sJ t | j|| d S rK   )r.   fz_dom_add_attributer:   )rN   rh  valuer   r   r   r  h  s   zXml.set_attributec                 C      d|  | }| | | S )z"Set background color via CSS stylezbackground-color: %s)rS  r?  rN   rR  r   r   r   r   set_bgcolorl     
zXml.set_bgcolorTc                 C   $   |rd}nd}d| }|  | | S )zSet bold on / off via CSS styleboldnormalzfont-weight: %srI  rN   r~   r   r   r   r   set_boldr     
zXml.set_boldc                 C   r  )zSet text color via CSS stylez	color: %s)rS  rI  r  r   r   r   	set_color|  r  zXml.set_colorc                 C      d| }|  | | S )z(Set number of text columns via CSS stylez	columns: r  )rN   colsr   r   r   r   set_columns  r	  zXml.set_columnsc                 C      d| }|  | | S )z"Set font-family name via CSS stylezfont-family: %sr  )rN   fontr   r   r   r   set_font     
zXml.set_fontc                 C   s2   t |tu r	d}nd}d| | }| | | S )z Set font size name via CSS styler,   pxzfont-size: )r>   rT   rI  )rN   rb   r  r   r   r   r   set_fontsize  s   
zXml.set_fontsizec                 C   s:   | j }| j}|dd|rtd| d| d| | S )zSet a unique id.Nr/  zid 'z' already exists)r  r  r+  r   r  )rN   uniquer  r  r   r   r   set_id  s   z
Xml.set_idc                 C   r  )z!Set italic on / off via CSS styleitalicr  zfont-style: %sr  r  r   r   r   
set_italic  r  zXml.set_italicc                 C   r  )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r?  )rN   leadingr   r   r   r   set_leading  r	  zXml.set_leadingc                 C   r  )z,Set inter-letter spacing value via CSS stylezletter-spacing: r  rN   spacingr   r   r   r   set_letter_spacing  r	  zXml.set_letter_spacingc                 C   r  )z6Set line height name via CSS style - block-level only.zline-height: r  )rN   
lineheightr   r   r   r   set_lineheight  r	  zXml.set_lineheightc                 C   r  )zSet margin values via CSS stylezmargins: %sr  r  r   r   r   set_margins  r  zXml.set_marginsc                 C   r  )zSet opacity via CSS stylez	opacity: r  )rN   r   r   r   r   r   r    r	  zXml.set_opacityc                 C      d}|  | | S )z$Insert a page break after this node.zpage-break-after: alwaysr  rY  r   r   r   set_pagebreak_after     
zXml.set_pagebreak_afterc                 C   r  )z%Insert a page break before this node.zpage-break-before: alwaysr  rY  r   r   r   set_pagebreak_before  r  zXml.set_pagebreak_beforec                 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.
        Nr  r>  )r  r   r  r  r  r  r  r  r  set_text_indentr  r  r  r  r  r  r  set_word_spacingr  r  r  r)  r  r  r&  r}  )rN   r|   bgcolorr  rR  columnsr  rb   indentr  r  letter_spacingr  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r  tempstyles	top_styler  r   r   r   set_properties  sd   

















zXml.set_propertiesc                 C   r  )z;Set text indentation name via CSS style - block-level only.ztext-indent: r  )rN   r  r   r   r   r   r  "	  r	  zXml.set_text_indent	underlinec                 C   r  )Nztext-decoration: %sr  r  r   r   r   set_underline(	     
zXml.set_underlinec                 C   r  )z*Set inter-word spacing value via CSS stylezword-spacing: r  r  r   r   r   r  -	  r	  zXml.set_word_spacingc                 C   s   t jt _| }| 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 s7|jr;|j}q(|jdkrF|}|j}n|S q))z$Find deepest level in stacked spans.Nr<  T)r2  r  rA  body)	r   r   r   rt  r  rz  r  r  r  )rN   rR   r  r   r   r   r  3	  s.   
zXml.span_bottomc                 C      t | jS rK   )r.   
fz_xml_tagr:   rW   r   r   r   r  M	     zXml.tagnamec                 C   r  rK   )r.   rd  r:   rW   r   r   r   r   Q	  r  zXml.textrK   r  r  r   NT)NNNNNNNNNNNNNNNNNN)r  )Nr  r  r  r  r  rP   r  r  r  r  r  r  r   r+  r-  r1  r4  r7  r9  r:  r=  r?  r@  rB  rF  r  rI  rL  rP  r  rS  r  r  r[  r+  rc  r  r  r  r  ro  rq  rr  r  rt  r  rR   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   add_varadd_sampadd_kbdr   r   r   r   r    s    	





	

	
	
	












L


r  c                   @   s<   e Zd Zdd Zdd Zdd Zedd Zed	d
 ZdS )
Colorspacec                 C   sh   |t krttjj| _dS |tkrttjj| _dS |tkr*ttjj| _dS ttjj| _dS )z!Supported are GRAY, RGB and CMYK.N)	CS_GRAYr.   FzColorspace
Fixed_GRAYr:   CS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)rN   r   r   r   r   rP   \	  s   zColorspace.__init__c                 C   s   d| j  }d|| jf S )N)r,   GRAYr,   RGBCMYKzColorspace(CS_%s) - %s)r   r#   rN   r~  r   r   r   rU   g	  s   
zColorspace.__repr__c                 C   r  rK   )r.   fz_colorspace_namer:   rW   r   r   r   _namek	     zColorspace._namec                 C   r  )zSize of one pixel.)r.   fz_colorspace_nr:   rW   r   r   r   r   n	     zColorspace.nc                 C   rV   )zName of the Colorspace.)r  rW   r   r   r   r#   s	  ry  zColorspace.nameN)	r  r  r  rP   rU   r  r  r   r#   r   r   r   r   r  Z	  s    
r  c                   @      e Zd Zdd ZdS )DeviceWrapperc           
      G   s   t |tjr|\}|| _d S t |tjd r9|\}}t|}t|r-tt	 || _d S t
t	 ||| _d S t |tjrJ|\}t|| _d S t |tjd rc|\}}t|}	t||	| _d S td|)Nz%Unrecognised args for DeviceWrapper: )
args_matchr.   FzDevicer:   fitzr>  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicer   fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicerX  rW  fz_new_stext_devicert   )
rN   r  devicepmrZ  r   r  tpr%  optsr   r   r   rP   z	  s"   


zDeviceWrapper.__init__N)r  r  r  rP   r   r   r   r   r  y	      r  c                   @   sD   e Zd Zdd Zdd ZdddZdd
dZedd Zdd Z	dS )DisplayListc                 C      t | turd S d| _d S NF)r>   r  rZ   rW   r   r   r   __del__	  rQ   zDisplayList.__del__c                 G   sh   t |dkrt|d tjrt|d | _d S t |dkr-t|d tjr-|d | _d S J d|)Nr   r   zUnrecognised args=)r  r7   r.   r   r  r:   r  r   r   r   rP   	  s
   zDisplayList.__init__Nr   c                 C   s0   |s	t t jj}t| j||||d }d|_|S NT)r.   r  r  JM_pixmap_from_display_listr:   rZ   )rN   r?  rA  rB  rZ  r~   r   r   r   rG  	  s
   zDisplayList.get_pixmapr   c                 C   s$   t  }||_t t|}d|_|S r  )r.   rW  r%  #fz_new_stext_page_from_display_listr:   rZ   )rN   r%  stext_optionsr~   r   r   r   r]  	  s
   zDisplayList.get_textpagec                 C   s   t t| j}t|}|S rK   )r   r.   fz_bound_display_listr:   r   rN   r~   r   r   r   r_   	  s   zDisplayList.rectc                 C   s&   t | j|jt|t|t   d S rK   )r.   fz_run_display_listr:   r  r9  r  FzCookie)rN   dwr   arear   r   r   run	  s   zDisplayList.run)NNr   N)r   )
r  r  r  r  rP   rG  r]  r  r_   r  r   r   r   r   r  	  s    


r  c                   @   sz  e Zd ZdefddZd[ddZdd Zd	d
 Zd\defddZ	d]ddZ
defddZdefddZdd Zdd Zdd Zdd Zdd Zd ejeef defd!d"Zd^d#d$Zd%d& Zd'd( Zd)d* Zd_d+d,Zd-d. Zd`d1d2Zd\d3ed4ed5ed6ed7ed8efd9d:Zd;d< Zd=d> Zd?d@ Z dAdB Z!dCdD Z"dadEdFZ#dGdH Z$dIdJ Z%dKdL Z&dbdPdQZ'dRdS Z(dTdU Z)dVdW Z*dXdY Z+dZd[ Z,d\d] Z-dcd^d_Z.e/d`da Z0dadbdcZ1dddedfZ2dgdh Z3didj Z4e/dkdl Z5dmdn Z6dodp Z7dqdr Z8dedsdtZ9dfduedvefdwdxZ:dydz Z;dfduefd{d|Z<d}d~ Z=			d^dedej>de?de?de?ddfddZ@defddZAd ejeef fddZBd ejeef deCfddZDd ejeef deEfddZFdeGfddZH				d_d ejeef deIde?de?de?ddfddZJdgddZKdd ZL											d				dhddZMdd ZNdfddZOdfddZPdd ZQdd ZRdd ZSdd ZTdiduededeGfddZUdiduededeGfddZVduedeGfddZWdd ZXdd ZYdd ZZ	M	M	M	M				ddjddZ[	M	M	M	M	d	d		d	dkddZ\e/dd Z]e/dd Z^e/dd Z_e/dd Z`e/ddĄ Zae/ddƄ ZbddȄ Zcddʄ Zddd̄ Zedd΄ ZfddЄ Zgdd҄ ZhddԄ Ziddք Zjdldd؄Zkddڄ Zldd܄ Zme/ddބ Zne/dd Zodd ZpdmddZqdd Zrdd Zsdd Zte/deEfddZudfduedvefddZvdlddZwe/dd Zxdd Zydd Zze/dd Z{dd Z|dd Z}dd Z~e/defdd Ze/defddZd^dedededd0fddZdd	 Zdgd
dZe/dd Zdd ZdnddZdoddZdd Z													d			dpddZdd Zdd Zdd ZdlddZdqd d!Zd\d"d#Zd$eEdefd%d&Zd'efd(d)Zd*efd+d,Zd-d. Zd\d/d0Zdld1d2Zdrd3d4Ze/d5d6 Z													d			dsd7d8Ze/d9d: Zd;d< Zd=d> Zd?d@ ZdAdB Zd\dCdDZdEdF ZdGdH ZdgdIdJZdKdL ZdMdN ZdOdP ZdQdR ZedSk r,e/dTdU Ze/dVdW ZdXZe/dYdZ ZeZeZdS (t  r8   returnc                 C   s   t | j}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s8|dk s8|| j	kr:dS t|tksK|dk sK|| 
|krMdS dS )NTFr   r   )r.   fz_count_pagesr:   r>   r  
page_countr  r  r  chapter_countchapter_page_count)rN   locr  chapterpnor   r   r   __contains__	  s"   

zDocument.__contains__Nc                 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 )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r>   r  delete_pager  r  r   delete_pagesslicer  r  stopstep)rN   r   pcr  r  r  r   r   r   __delitem__	  s.   

zDocument.__delitem__c                 C   r  rK   r   rW   r   r   r   r  	  r  zDocument.__enter__c                 G      |    d S rK   r  r  r   r   r   r  	  r  zDocument.__exit__r   r   c                 C   s"   || vrt d| d| |S )Npage z not in document)
IndexError	load_pagerN   r   r   r   r   r  	  s   
zDocument.__getitem__   c              
   C   s  d| _ d| _d| _d| _g | _i | _i | _i | _t	 | _
t|tjr-|}|| _d| _dS |r5t|tu r6nt|dr@t|}nt|drI|j}ntd|durt|tu r[|| _nt|tu rgt|| _nt|tju rt| | _ntd| j}|s|sd}nd| _|r| jdu rd}	|| _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$rzt%&|||||||| _W n t'y } zt|}t|t(krt)||t t*|d}~ww |}|}t+|}t,|s&|j-|j. }|j/|j0 }|rZt|ts1J |}t1rAt2|}t3|}nt4t5|t"|}|}|sS|}t6||}nk|r|szzt7|}W n] t'yy } zt#d|d}~ww t8|}|r|j9rz	t:|j9|}W n t'y } zt t*|d}~ww t;|}n|j<rt=|}t>|j<|}nt)t(t }t;|}|dkr|dkrt?|||| nt@|rt?|ddd |}|| _d| _A| jAr4tBC | _D| jErd| _d| _n| F  |r|G Hds|r4d|G v r4z| I }W n t'y3 } zt d|d}~ww t$rQt| jtj| _| jrJtJj%jK| _LdS tJj%jM| _LdS dS )aV  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string or pathlib.Path, must have supported
                    file extension.
            open(type, buffer) - type: valid extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            open(filename, fileype=type) - filename with unrecognized extension.
            rect, width, height, fontsize: layout reflowable document
            on open (e.g. EPUB). Ignored if n/a.
        FNTabsoluter#   zbad filenamezbad type: 'stream'r   r,   zno such file: 'r  z' is no filer   zcannot open empty documenti  iX  r  svgcannot open broken document)N	is_closedis_encryptedisEncryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesweakrefWeakValueDictionary
_page_refsr7   r.   r<   r:   this_is_pdfr>   rT   r  r#   r  r   r   r  r  r  r  r
   r   existsFileNotFoundErrorr  FileDataErrorgetsizer  EmptyFileErrorr   r   Document_initrt   MSG_BAD_FILETYPEr   MSG_BAD_DOCUMENTr  r  x1x0y1y0r-   r  r  fz_open_memorypython_buffer_datafz_open_document_with_streamfz_open_documentll_fz_recognize_documentr  ll_fz_document_open_fn_callr;   open_with_streamfz_open_file$fz_document_open_with_stream_fn_callfz_layout_documentfz_is_document_reflowablerZ   rv   gen_id	_graft_id
needs_passinit_docr8  r*  convert_to_pdfr  page_count_pdfpage_count2page_count_fz)rN   r   r   filetyper_   r  r,  rb   pdf_document	from_filemsgr}   e_strr[  r\  r   r  r   r  magicr   handlerr   r:   rS  r   r   r   rP   	  s   



0








*
zDocument.__init__c                 C   r  rK   )r  rW   r   r   r   __len__
     zDocument.__len__c                 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@  rN   r   r   r   r   rU   
  s   

zDocument.__repr__c                 C   s   | j s| jr
tdt| }|sdS tt|tdtdtdtd}|jr.t	|s2t
dt|}t||}t||| dS )zAdd new form font.document closed or encryptedNRootAcroFormDRFontzPDF has no form fonts yet)r  r  r   rA   r.   r   pdf_trailerrq   ri   r   r   pdf_new_nameJM_pdf_obj_from_strr   )rN   r#   r  r   fontsr  r%   r   r   r   _addFormFont
  s"   

zDocument._addFormFontc                 C   s   | j s| jr
tdg }t| }|s|S tt|td}t|td}|js,|S t|td}t	||}t
|}t|}t|| t|td t|D ]}t||\}	}
t||
 qT|| |}|   |S )zDelete the TOC.rQ  rR  OutlinesFirst)r  r  r   rA   r.   rp   rV  rq   ri   JM_outline_xrefsr  rk   pdf_delete_objectr   r   JM_INT_ITEMr)  rB  )rN   xrefsr   r  olrootfirst
xref_countolroot_xrefr   rS  r{   r~   r   r   r   _delToC
  s.   


zDocument._delToCc                 C   s0   t | }t|| |jjrt|j d S d S rK   )rA   r.   pdf_delete_pageri   rev_page_mapll_pdf_drop_page_tree)rN   r  r   r   r   r   _delete_page
  s
   zDocument._delete_pagec                 C   sL   | j rtdt| }t| t|dt|d sttt|| dS )zDelete object.document closedr   N)	r  r   rA   
ASSERT_PDFr  r.   r  r  r^  rN   r{   r   r   r   r   _deleteObject
  s   zDocument._deleteObjectc                 C   sp   t | }tt|tdtdtdtd}t|d| d }t|tdtd}t|}t|}|S )NrR  NamesEmbeddedFilesr   r   r  r  )rA   r.   r   rV  rq   r  r   r   )rN   idxr   namesentryfilespecr&  contr   r   r   _embeddedFileGet
  s   
zDocument._embeddedFileGetr  c                 C   sJ   |   }dt| }||v r||}|S |tt|v r!|}|S t|)Nz '%s' not in EmbeddedFiles array.)embfile_namesrT   indexr   r  r   )rN   r  	filenamesrJ  rp  r   r   r   _embeddedFileIndex   s   
zDocument._embeddedFileIndexc                 C   s   | j }t| }t| t|}|jstttt	|t
dt
dt
dt
d}	t|	sOtt	|t
d}
t|d}	t|
|	t
dt
dt
d t|||||d}tt|t
dt
d}t|	t| t|	| |S )NrR  rn  ro     r   r  r  )r:   rA   rk  r   ri   r  r   r.   r   rV  rq   pdf_is_arrayrp   r   rp  JM_embed_filerk   pdf_array_pushr  )rN   r#   r   r   rq  r"  r   r   r  rq  r  	fileentryr{   r   r   r   _embfile_add  s<   
zDocument._embfile_addc                 C   sP   t | }tt|tdtdtdtd}t||d  t|| d S )NrR  rn  ro  r   )rA   r.   r   rV  rq   r  )rN   rp  r   rq  r   r   r   _embfile_del,  s   zDocument._embfile_delc                 C   s  t | }d}d}t|}t|tdtdtdtd}t|d| d }t|td}	|	jr8t|	}||d< t	t|td	}
t
|
|t< t	t|td
}
t
|
|t< t	t|td}
t|
|t< d}d}t|tdtd	}t|}t|td}|jrt|}t|td}|jrt|}nt|tdtd}|jrt|}||t< ||t< |S )Nr   rR  rn  ro  r   r   CI
collectionr  r  r  r   r  r  rk  r  r  )rA   r.   rV  r   rq   r  rp   ri   rk   rm   r  r  dictkey_ufilenamern   r  rr   r  r  )rN   rp  infodictr   r{   ci_xreftrailerrq  r	  cir#   len_rk  r~  r   r   r   _embfile_info8  sL   




zDocument._embfile_infoc                 C   s   | j rtd| j}t| }t| tt|tdtdtdtd}t	|rIt
|}td|dD ]}ttt||}|| q6dS dS )z Get list of embedded file names.rj  rR  rn  ro  r   r   N)r  r   r:   rA   rk  r.   r   rV  rq   r{  r  r   r  rm   r  r)  )rN   r  r   r   rq  r   r   r~   r   r   r   _embfile_namesg  s.   


zDocument._embfile_namesc                 C   s>  t | }d}tt|tdtdtdtd}t|d| d }	t|	tdtd}
|
js7td	t t	|}|rG|jrG|jsGt
t|jrw|rw|jrwt||
|d t|\}}t|}t|
td
| t|
|tdtd t|
}|rt|	td| |rt|	td| |rt|	td| |S )Nr   rR  rn  ro  r   r   r  r  rj  rk  r  r  r  r  )rA   r.   r   rV  rq   r  ri   r  r  r   r  r   r   rm  ro  r   rp  rk   r  )rN   rp  r   r   rq  r"  r   r{   rq  rr  rs  r   r  rS  rr  r   r   r   _embfile_upd  s<   


zDocument._embfile_updc              	   C   s  | j rtdtrt| j|S t| }d}d}d}d}tt	|t
d}|js,dS t|t
d}|js9dS t|t
d	}	|	jsFdS g }
t|	|
}
t|
}t|}|sYdS ||kratd
t|D ]}t|
| }|| }|d }t|ts~td|
| |t< t||}tt|t
d}|dkrd||< n|dkrd||< n|dkrd||< d||< tt|t
d}|dk rd||< n|dkrd||< t|t
d}t|rt|dkrtt|dtt|dtt|df}||t< d}t|t
d}|jrt|s"t|t
dt
d}t|r9t|dkr9tt|d}t|||< ||d< |||< qedS )z4Add color info to all items of an extended TOC list.rj  zoomr  r  collapserR  Nr[  r\  z$internal error finding outline xrefsr   zneed non-simple TOC formatr  r   Tr   Countr   FrK  DestAD   r  )r  r   r   r   Document_extend_toc_itemsr:   rA   r.   rp   rV  rq   ri   r]  r  r  r   r  r7   rf   rl   pdf_load_objectrr   r{  r  rT  r  dictkey_colorr   r  )rN   r  r   r  r  r  r  r  ra  rb  r`  r   r   r   r{   r  itemdictbmr%  countr   rR  zrz   r   r   r   _extend_toc_items  s   





zDocument._extend_toc_itemsrG   struct Page *c                 C   s"   t |}|| jv r| j|= dS dS )z&Remove a page from document page dict.N)r/  r&  )rN   rG   pidr   r   r   _forget_page  s   
zDocument._forget_pager{   bfnameextorderinglimitrp  c                 C   s
  t | }|}|dk rd}t|d|f |dkr+t|\}	}
}td |	|
|d}n)t|\}	}
|	r>t||	|
dd}nt||}|jsLtd| t	t
||d}g }t|D ](}t||}t||d}|dkro|}|dkr{|||f qZ||df qZ|S )N   zpdf=r   z font at xref %d is not supportedr  )rA   rk  r.   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferri   rt   fz_new_font_from_bufferrn  r   fz_encode_characterfz_advance_glyphr)  )rN   r{   r  r  r  r  rp  r   mylimitr  r  rw  r  r&  wlistr   glyphadvr   r   r   _get_char_widths  s2   
zDocument._get_char_widthsc           	   	   C   s  t | }t| g }td}tt|td|}|js |S tt	|td}|jr5t
|| |S tt|tdtd}|jrMt
|| |S tt	|td}|jr`t|sb|S t|}t|D ]}tt	t||td}t
|| qk|S )N
PageLabelsrR  NumsKids)rA   rk  r.   rW  r   rV  rq   ri   pdf_resolve_indirectrp   JM_get_page_labelsr{  r  r   r  )	rN   r   rc
pagelabelsrz   numskidsr   r   r   r   r   _get_page_labels  s4   



zDocument._get_page_labelsc                 C   s&   zt | j|W S  ty   Y dS w )zGet metadata.r,   )r.   fz_lookup_metadata2r:   rt   rg  r   r   r   _getMetadata/  s
   zDocument._getMetadatac                 C   s   | j s| jr
tdt| }t| tt|td}t|td}|j	sPt
|d}t|tdtd t||}t|td| t|td}t|S )z/Get xref of Outline Root, create it if missing.rQ  rR  r[  r  Type)r  r  r   rA   rk  r.   rp   rV  rq   ri   r   r   pdf_add_objectrk   )rN   r   r  ra  ind_objr   r   r   _getOLRootNumber6  s   
zDocument._getOLRootNumberc           	      C   s   | j rtdtt}|sdS g }tt|td}|jr@t	|}t
|D ]}t||}t|}t|}|| q(|S )zGet PDF file id.rj  NID)r  r   rA   r:   r.   rp   rV  rq   ri   r  r   r  rm   binasciihexlifyr)  )	rN   r   idlistidentityr   r   r	  r   hex_r   r   r   _getPDFfileidH  s   


zDocument._getPDFfileidc                 C   s   | j s| jr
td| j}t| }t|tjrt|nt	|}|}|dk r/||7 }|dk s'||kr7tt
t||}t|tj}g }	g }
|jrTt|||	|d|
 |	S )z,List fonts, images, XObjects used on a page.rQ  r   )r  r  r   r:   rA   r7   r.   r<   pdf_count_pagesr   MSG_BAD_PAGENOpdf_lookup_page_objpdf_dict_get_inheritablePDF_ENUM_NAME_Resourcesri   JM_scan_resources)rN   r  whatr   r   	pageCountr   pagerefrsrclistetracerr   r   r   _getPageInfoZ  s$    zDocument._getPageInfoc                 C   s>   t | }t| |s|sttt|d||dddddd
}|S )z;
        Utility: insert font from file or binary.
        Nr   r   )rA   rk  r   MSG_FILE_OR_BUFFERJM_insert_font)rN   fontfile
fontbufferr   r  r   r   r   _insert_fontn  s   zDocument._insert_fontc              
   C   sT   | j }t|tjsJ z
t|}W t|S  ty) } z	 W Y d}~dS d}~ww )zLoad first outline.r   N)	r:   r7   r.   r;   fz_load_outlinert   ru   r   Outline)rN   r   r5  r}   r   r   r   _loadOutlinez  s   zDocument._loadOutlinec                 C   s   | j rtdJ d)z)Make an array page number -> page object.rj  r   z_make_page_map() is no-op)r  r   rW   r   r   r   _make_page_map  s   zDocument._make_page_mapc                 C   s  | j rtdt| }d}t| t||\}}}	t|td}
t||\}}}t|td}|r6|}n|d }t|
|}|sO|dkrOt	|td| t
||| |dkr|}|jr}t|td}t|td|d  t|td}|js_|st|
|	 |}|jrt|td}t|td|d  t|td}|jsn9|r|}|jrt|td}t|td|d  t|td}|jsn|	|k rt|
|	 nt|
|	d  |jjrt|j |   dS )z"Move or copy a PDF page reference.rj  r   r  r   r   r  N)r  r   rA   rk  pdf_lookup_page_locr.   rp   rq   r   r   pdf_array_insertri   pdf_dict_get_intr   r  rg  rh  _reset_page_refs)rN   r  nbbeforecopyr   samepage1parent1i1kids1page2parent2i2kids2posrR   r  r   r   r   _move_copy_page  s\   zDocument._move_copy_pager   S  J  c           	      C   s   | j s| jr
tdtrt| j||| n;t| }t|t	j
s"J t	t	jj}||_||_t	 }|dk r;ttt	|d}t	||d||}t	||| |   | | S )zMake a new PDF page.rQ  r   r   r   )r  r  r   r   r   _newPager:   rA   r7   r.   r<   r   
Fixed_UNITr0  r2  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager  )	rN   r  r  r,  r   mediaboxcontentsr   page_objr   r   r   r    s"   zDocument._newPagec                 C   s   t | }t|| d S rK   )rA   _remove_dest_range)rN   numbersr   r   r   r   _remove_links_to  ri  zDocument._remove_links_toc                 C   sr   t | }t||d}t|td t|td t|d}tdD ]}t|d q%t|td| d S )Nr   r  r  r   皙?rK  )	rA   r.   r  r   rq   r   r   r   r   )rN   r{   r   r  rR  r   r   r   r   _remove_toc_item  s   zDocument._remove_toc_itemc                 C   s   t | ddrdS | j  dS )z,Invalidate all pages in document dictionary.r  TN)rS   r&  clearrW   r   r   r   r    s   zDocument._reset_page_refsc                 C   s   t | }t| td}tt|td}t|| t|t	|d|td | 
 }| j|dd}|dd| }| || d S )	Nr  rR  r   r  T
compressedz/Nums[]z	/Nums[%s])rA   rk  r.   rW  rp   rV  rq   r   rp  r   pdf_catalogxref_objectr.  update_object)rN   labelsr   r  r  r{   r   r   r   r   _set_page_labels  s   
zDocument._set_page_labelsc                 C   s@   t | jtjr
| jS t | jtjr| j S J dt| j)z:
        Returns self.this as a mupdf.FzDocument.
        r   Unrecognised type(self.this)=)r7   r:   r.   r;   r<   r=   r>   rW   r   r   r   _this_as_document  s
   
zDocument._this_as_documentc                 C   sB   t | jtjr
| jS t | jtjrt| jS J dt| j)z
        Returns self.this as a mupdf.PdfDocument, downcasting as required. If
        we fail (i.e. self.this is a mupdf.FzDocument(), <ret>.m_internal will be
        None.
        r   r  )r7   r:   r.   r<   r;   r>   rW   r   r   r   _this_as_pdf_document  s
   zDocument._this_as_pdf_documentc                 C   sD  t | }t||d}|rt|td| |r.t|td t||}	t|td|	 t|td| |rZt	|d}
t
dD ]}|| }t|
| qCt|td|
 n|durft|td |durt|td	jrt|td	}|dk r|d
ks|dkr|dkr|d }t|td	| dS dS dS dS dS )zB
        "update" bookmark by letting it point to nowhere
        r   Titler  r  r  r   rK  Nr  FTr   )rA   r.   r  r  rq   r   rX  r   r   r   r   r   rp   ri   r  )rN   r{   actionr  r%  r  rR  r   r  rz   r  r   r  r   r   r   _update_toc_item  s4   
 zDocument._update_toc_itemc                 C   s   | j rtdt| }|sdS tt|tdtdtdtd}t }|jrJt	|rJt
|}t|D ]}t||}|tt| q7|S )z&Get list of field font resource names.rj  NrR  rS  rT  rU  )r  r   rA   r.   r   rV  rq   r  ri   r   r   r   r   r)  rn   r   )rN   r   rY  r  r   r   r  r   r   r   	FormFonts3  s&   
zDocument.FormFontsc                 C   s<   | j rtdt| }t| t|||| t|j dS )zAdd a new OC layer.rj  N)r  r   rA   rk  JM_add_layer_configr.   ll_pdf_read_ocgri   )rN   r#   creatoronr   r   r   r   	add_layerK  s   zDocument.add_layerr   c                 C   sT  | j rtdd}t| }t| t|d}t|tdtd t|td| t	|tdd}	|s?t
|	td	 nt|tsPJ d
t|dtt
|	t| t|tdd}
td}t|
|d}t|tdd |rt|td| n	t|tdd t||}t|}t|td}t
|| |dkrt|td}t|sttt||}|jsttnt|td}t|td}|jst	|tdd}t
|| |rt|td}|jst	|tdd}nt|td}|jst	|tdd}t
|| t|j t|}|S )zAdd new optional content group.rj  r   r   r  OCGr_  Intentr   Viewz)fixme: intent is not a str. type(intent)= type=UsageCreatorInfoCreatorPyMuPDFr  ArtworkOCGsr   Configsr  Orderr   ONOFF)r  r   rA   rk  r.   r  r   rq   r  pdf_dict_put_arrayr}  r7   rT   r>   rW  r   r   r  JM_ensure_ocpropertiesrp   r{  MSG_BAD_OC_CONFIGr  ri   r  rk   )rN   r#   configr  intentusager{   r   ocgintentsuse_forci_namecre_infoindocgocprz   cfgr   r   r   add_ocgT  sd   



zDocument.add_ocgc                 C   s>   | j rtdt| j|}|rd| _d| _|   d| _|S )zDecrypt document.rj  FT)	r  r   r.   fz_authenticate_passwordr:   r  r  rB  rZ   )rN   passwordr~   r   r   r   authenticate  s   zDocument.authenticatec                 C   s(   | j rtdt| }|sdS t|S )z-Check whether incremental saves are possible.rj  F)r  r   rA   r.   pdf_can_be_saved_incrementallyrN   r   r   r   r   can_save_incrementally  s   
zDocument.can_save_incrementallyc                 C   s   | j rtdt| jS )zNumber of chapters.rj  )r  r   r.   fz_count_chaptersr:   rW   r   r   r   r    s   zDocument.chapter_countc                 C   sD   | j rtdt| j}|dk s||krtdt| j|}|S )zPage count of chapter.rj  r   zbad chapter number)r  r   r.   r5  r:   fz_count_chapter_pages)rN   r  chapterspagesr   r   r   r    s   zDocument.chapter_page_countc                 C   s6   t | ddr
tdt| dr| jrd| _|   dS )zClose document.r  Trj  _outlineN)rS   r   r  r9  close_internalrW   r   r   r   r    s
   zDocument.closec                 C   
   d | _ d S rK   r:   rW   r   r   r   r:       
zDocument.close_internalc                 C   s   | j s| jr
td| j}|}|}t|}|dk rd}||d kr&|d }|dk r.|d }||d kr8|d }tt}t||||}	tt}
t	||
D ]}t
jt|  d qL|	S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.rQ  r   r   r  )r  r  r   r:   r.   r   r  JM_mupdf_warnings_storeJM_convert_to_pdfr   r   r   writeJM_mupdf_warnings_storep)rN   	from_pageto_pager   fz_docr  r  srcCountlen0r   len1r   r   r   r   rC    s(   
zDocument.convert_to_pdfr  toc                 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.
        rj  r   r	  r   r   r  r   r  r   r  rN   r  rH  r  r  r  r   r   r   	copy_page  s   zDocument.copy_pagec                 C   sP   | j s| jr
tdt| }tt|td}|jr&t	|td dS dS )zDelete XML metadata.rQ  rR  MetadataN)
r  r  r   rA   r.   rp   rV  rq   ri   r   )rN   r   r  r   r   r   del_xml_metadata	  s   zDocument.del_xml_metadatac                 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  rj  r   r	  r   r   N)r
  r   r  r  get_tocget_outline_xrefsrC  r  r  	frozensetri  r  )rN   r  r  tocol_xrefsr   r  r   r   r   r    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  rj  r   z*cannot mix keyword and positional argumentrB  rC  r   r	  r   r   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r
  r   r  r  r"   r  r   r  r>   r  r  r'  setr   sortrP  rN  rC  rO  r  r  reversedri  r  )rN   r  kwr  r  r  r  r   frozen_numbersrQ  r   r{   r   r   r   r  ,  sp   	


zDocument.delete_pagesr#   r   r   rq  r"  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utf8r   r   rq  r"  r  z/EmbeddedFileParams/CreationDateParams/ModDate)	rv  rT   r   r   unicoder  get_pdf_nowr  get_pdf_str)
rN   r#   r   r   rq  r"  rx  rJ  r{   dater   r   r   embfile_addn  s,   zDocument.embfile_addc                 C   s   t |  S )zGet number of EmbeddedFiles.)r  rv  rW   r   r   r   embfile_count  r  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
        )ry  r  rN   r  rp  r   r   r   embfile_del  s   

zDocument.embfile_delc                 C   rb  )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )ry  ru  rc  r   r   r   embfile_get  s   

zDocument.embfile_getc                 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#   rZ  r  r  r[  r  zParams/CheckSumchecksum)ry  rv  r  xref_get_keyr  r  r  decode)rN   r  rp  r  r{   r  r_  md5r   r   r   embfile_info  s   
zDocument.embfile_infoc                 C   s   g }|  | |S )z#Get list of names of EmbeddedFiles.)r  )rN   rx  r   r   r   rv    r  zDocument.embfile_namesc           	      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.
        rY  r[  )ry  r  r]  r  r^  )	rN   r  r   r   rq  r"  rp  r{   r_  r   r   r   embfile_upd  s   
zDocument.embfile_updc                 C   s   t | }t| d}t||}t|td}t|td}t|tdrvt|dsvt|td}|j	r@t
|rIt|td}	n|}	t||}
|
dkr`|s`t||}t|}nd	}tt|	t|
tt||f}|S d
}|S )z%
        Get a font by xref.
        r   r  r  rU  CIDFontTypeBaseFontr_  n/a)r  r,   )r,   r,   r,   r,   )rA   rk  r.   r  rp   rq   pdf_name_eqr   
startswithri   pdf_is_nullJM_get_fontextensionr  r   r  rn   )rN   r{   	info_onlyr   r  rz   r   subtypebasefontbnamer  r   bytes_tuple_r   r   r   extract_font  s4   


zDocument.extract_fontc                 C   sJ  | j s| jr
tdt| }d}d}t| t|dt|d s%ttt	||d}t
|td}t|tds@tdt|tdtd}|jrSt|}t|rbtj}t|}d	}	t|rptj}t|}d
}	t|}|tjkrt|}t|\}
}t|}t|}	|tjkrd}t||}t|j}|r|jjtjtjtj tj!tj"fvr|jj}t|}	t#t$|j%}nt&|t'tj(}d}	nt)|}t*|\}}|+ }|, }|- }|. }t/|0 }t1 }|	|t2< ||t3< ||t4< ||t5< ||t6< ||t7< ||t8< ||t9< ||t:< t;||t<< |S )z(Get image by xref. Returns a dictionary.rQ  r   r   r  Imageznot an imageSMaskMaskjpxjb2Npng)=r  r  r   rA   rk  r  r.   r  r  r  rp   rq   ro  pdf_dict_getari   rk   pdf_is_jpx_imageFZ_IMAGE_JPXr   JM_is_jbig2_imageFZ_IMAGE_JBIG2pdf_load_raw_streamFZ_IMAGE_UNKNOWNrm  fz_recognize_image_formatJM_image_extensionpdf_load_imagell_fz_compressed_image_bufferparamsr>   FZ_IMAGE_RAWFZ_IMAGE_FAXFZ_IMAGE_FLATEFZ_IMAGE_LZWFZ_IMAGE_RLDr  ll_fz_keep_bufferbufferfz_new_buffer_from_image_as_pngFzColorParamsfz_default_color_paramsfz_new_image_from_bufferfz_image_resolutionr[  r\  r   bpcr  rA  rf   dictkey_extdictkey_smaskdictkey_widthdictkey_heightdictkey_colorspacedictkey_bpcdictkey_xresdictkey_yresdictkey_cs_namer   dictkey_image)rN   r{   r   img_typesmaskrz   rt  r	  r   r  rS  r  r.  ll_cbufxresyresr  r,  rA  r  cs_namer  r   r   r   extract_image  s   










zDocument.extract_imager   FT  c                 C   s.   | j |f||||||||	|
||||||dS )z8
        Save PDF using some different defaults
        )garbagecleandeflatedeflate_imagesdeflate_fontsincrementalr   expandlinearpretty
encryptionpermissionsowner_pwuser_pw	no_new_id)save)rN   r   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r   r   r   ez_savea  s&   zDocument.ez_savec                 C   s.   | j s| jr
tdt| j|}|j|jfS )z-Find new location after layouting a document.rQ  )r  r  r   r.   fz_lookup_bookmark2r:   r  rG   )rN   r  locationr   r   r   find_bookmark  s   zDocument.find_bookmarkc              	   C   s   | j rtdt| }t|}zt| t|d|d r%t|d|d s)tttt	||}t
|}t|td}|jrt|}t||}	t|D ]R}
t||
}t|td}t|tdrjqQt|djrrqQt
t|}t|}t||| t||d}t|td t|td	 t|	| qQt|td|	 t|}|jrt|td
t d}t|||d t|td| t|}t||| t||d}t||| W t |j nt |j w | !  dS )zMake a full page duplicate.rj  r   r   r   r   r  r   rn  P    rl  N)"r  r   rA   r.   r  rk  r  r  r  r  pdf_deep_copy_objrp   rq   ri   r  r   r   r  ro  rg   pdf_create_objectpdf_update_objectr  r   r}  r   JM_read_contentspdf_add_streamr  PdfObjr   r  rh  r  )rN   r  rH  r   r  r  r  
old_annotsr   
new_annotsr   r	  rt  copy_or{   r   r  r   r   r   fullcopy_page  sT   




zDocument.fullcopy_pagec                 C   s   | j rtdt| }t| tt|tdtd}|js"dS |dkr/t	|td}nt
t	|td|}|jsBttt|}|S )z,Content of ON, OFF, RBGroups of an OC layer.rj  rR  OCPropertiesNr   r  r  )r  r   rA   rk  r.   r   rV  rq   ri   rp   r  r"  JM_get_ocg_arrays)rN   r#  r   r,  rz   r  r   r   r   	get_layer  s*   zDocument.get_layerc                 C   s   | j rtdt| }t| t|}|dkr0tt|tdtdtd}t	|s0d}g }t
 }t|D ]}t||| ||j|jd}|| q:|S )zShow optional OC layers.rj  r   rR  r  r  r   )numberr#   r  )r  r   rA   rk  r.   pdf_count_layer_configsr   rV  rq   r{  PdfLayerConfigr   pdf_layer_config_infor#   r  r)  )rN   r   r   rz   r  rm  r   r  r   r   r   
get_layers  s0   

zDocument.get_layersc                 C   s>   | j s| jr
tdt| }d}t| t| t|}|S )zMake new xref.rQ  r   )r  r  r   rA   rk  ENSURE_OPERATIONr.   r  )rN   r   r{   r   r   r   get_new_xref  s   
zDocument.get_new_xrefc                 C   s  | j rtdtd}t| }t| ttt|t	dt	dt	d}t
 }t|s2|S t|}t|D ]}t||}t|}tt|t	d}	t|t	d|t	d}
d	}|
jrit|
}t }t|t	d
}|jrt|r|t| n$t|rt|}t|D ]}t||}t|r|t| qt|t ||}|	|| |d}|}|||< q;|S )z&Show existing optional content groups.rj  r  rR  r  r  r_  r  r  Nr  )r#   r$  r  r%  )r  r   r.   rW  rA   rk  r   rp   rV  rq   rf   r{  r  r   r  rk   rm   ri   r   r  r  r)  pdf_is_ocg_hiddenr  )rN   r  r   ocgsr  r   r   r&  r{   r#   rz   r%  r'  r$  r   r   r	  hiddenr  r  r   r   r   get_ocgs  sV   









zDocument.get_ocgsc                 C   s   | j rtdg }t| }|s|S tt|td}|js!|S t|td}|js.|S t|td}|js;|S t||}|S )z!Get list of outline xref numbers.rj  rR  r[  r\  )	r  r   rA   r.   rp   rV  rq   ri   r]  )rN   r`  r   r  ra  rb  r   r   r   rO  :  s"   
zDocument.get_outline_xrefsfullc                 C   sp   | j s| jr
td| jsdS t|tur%z|j}W n
   t  td| |d}|du r6dd |D S |S )z1Retrieve a list of fonts used on a page.
        rQ  r   zneed a Page or page numberr   Fc                 S      g | ]}|d d qS Nr   r   .0r%   r   r   r   
<listcomp>]      z+Document.get_page_fonts.<locals>.<listcomp>)	r  r  r   r
  r>   r  r  r   r  rN   r  r  r~   r   r   r   get_page_fontsN  s   
zDocument.get_page_fontsc                 C   sD   | j s| jr
td| jsdS | |d}|du r dd |D S |S )z2Retrieve a list of images used on a page.
        rQ  r   r   Fc                 S   r  r  r   r  r   r   r   r  i  r  z,Document.get_page_images.<locals>.<listcomp>r  r  r   r
  r  r  r   r   r   get_page_images`  s   zDocument.get_page_imagesc                 C   s.   | j s| jr
td| jsdS | |d}|S )z4Retrieve a list of XObjects used on a page.
        rQ  r   r   r  )rN   r  r~   r   r   r   get_page_xobjectsl  s   zDocument.get_page_xobjectsc                 C   sX   | j rtdt| }|sdS tt|tdtdtd}d}|jr*t|}|S )zGet the /SigFlags value.rj  r   rR  rS  SigFlags)	r  r   rA   r.   r   rV  rq   ri   rr   )rN   r   sigflagssigflagr   r   r   get_sigflagsv  s   
zDocument.get_sigflagsc                 C   sd   | j rtdd}t| }|jrtt|tdtd}|r.|jr.t	|}t
|}|S d}|S )zGet document XML metadata.rj  NrR  rL  r,   )r  r   rA   ri   r.   r   rV  rq   internalr   JM_UnicodeFromBuffer)rN   xmlr   r  r  r   r   r   get_xml_metadata  s    

zDocument.get_xml_metadatac                    sp    j rtd   _t fdddddddd	d
dddd
 D  _ ddkr.d n d jd< d S )Nz,cannot initialize - document still encryptedc                    s   g | ]\}}|  |fqS r   )r  )r  r  r%   rW   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  authorr  keywordsr  producerr  r  trappedr  None)r  r   r  r9  rf   r  r  r  rW   r   rW   r   rB    s(   

&zDocument.init_docc
                 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 )z
        Insert 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().
        Nr   r  zbad infile parameterr   )rB  rC  start_atr   linksr  show_progressfinal)r7   r>  rA  r   r6  r8   tobytesr   r
  rC  
insert_pdf)rN   infilerB  rC  r  r   r  r  r  r  r/  pdfbytesr   r   r   insert_file  s0   



zDocument.insert_filec                 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rst| j|j||||||||	|
 nZt| }t|}t| }t|j}|}|}|}t|d}t||d }|dk r|d }t||d }|dk r|}t||}|jr|jstdt| t||||||||||

 |   |r| j||||d	 |	dkrd| j|< dS dS )
a,  Insert a page range from another PDF.

        Args:
            docsrc: PDF to copy from. Must be different object, but may be same file.
            from_page: (int) first source page to copy, 0-based, default 0.
            to_page: (int) last source page to copy, 0-based, default last page.
            start_at: (int) from_page will become this page number in target.
            rotate: (int) rotate copied pages, default -1 is no change.
            links: (int/bool) whether to also copy links.
            annots: (int/bool) whether to also copy annotations.
            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.rQ  z'source and target cannot be same objectr   z
memory PDFzInserting '%s' at '%s'Nr   zsource or target not a PDF)rB  rC  r  )r  r  r   r@  r  r  r
   r   basenamer#   r   r!  r"   Graftmapr   extra_FzDocument_insert_pdfr:   rA   r.   r   r8  minri   r  r  JM_merge_ranger  	_do_links)rN   docsrcrB  rC  r  r   r  r  r  r  _gmapsainnameoutnameisrtpdfoutpdfsrcoutCountrE  r  r  r   r   r   r    sv   !



zDocument.insert_pdfc                 C   &   t | }|sdS t|}|rdS dS r  )rA   r.   pdf_has_unsaved_changesrN   r   r   r   r   r   is_dirtyK  s
   
zDocument.is_dirtyc                 C      t | }|jrt|S dS )z9
        Check whether we have a linearized PDF.
        F)rA   ri   r.   pdf_doc_was_linearizedr3  r   r   r   is_fast_webaccessS     
zDocument.is_fast_webaccessc                 C   sx   t | }|sdS d}ztt|tjtjtj}t|r#t|}W n t	y3   t
r0t  Y dS w |dkr:|S dS )z Either False or PDF field count.Fr   r   )rA   r.   r   rV  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr{  r  rt   ru   r   )rN   r   r  fieldsr   r   r   is_form_pdf]  s*   


zDocument.is_form_pdfc                 C   s0   t | jtjr	dS t| jjrd}|S d}|S )zCheck for PDF.TF)r7   r:   r.   r<   ll_pdf_specificsri   rO  r   r   r   r
  t  s   zDocument.is_pdfc                 C   s   | j rtdt|  S )z Check if document is layoutable.rj  )r  r   r.   r>  	_documentrW   r   r   r   is_reflowable  s   zDocument.is_reflowablec                 C   r	  )zCheck whether PDF was repaired.FT)rA   r.   pdf_was_repairedr  r   r   r   is_repaired  s   
zDocument.is_repairedc                 C   sR   | j s| jr
tdd}d}t| }t| t|}t|}t|t|dS )z(Show if undo and / or redo are possible.rQ  r   )undoredo)	r  r  r   rA   rk  r.   pdf_can_undopdf_can_redor  )rN   r  r  r   r   r   r   journal_can_do  s   

zDocument.journal_can_doc                 C   2   | j s| jr
tdt| }t| t| dS )zActivate document journalling.rQ  N)r  r  r   rA   rk  r.   pdf_enable_journalr3  r   r   r   journal_enable  
   zDocument.journal_enablec                 C   s.   | j s| jr
tdt| }|jo|jj}|S )z Check if journalling is enabled.rQ  )r  r  r   rA   ri   journal)rN   r   enabledr   r   r   journal_is_enabled  s
   zDocument.journal_is_enabledc                 C   st   | j s| jr
tdt| }t| t|trt|| nt	|}t
|}t|| |jjs8tdt dS dS )zLoad a journal from a file.rQ  z!Journal and document do not matchN)r  r  r   rA   rk  r7   rT   r.   pdf_load_journalr   r  pdf_deserialise_journalri   r$  r  r  )rN   r   r   r   stmr   r   r   journal_load  s   

zDocument.journal_loadc                 C   s4   | j s| jr
tdt| }t| t||}|S )z#Show operation name for given step.rQ  )r  r  r   rA   rk  r.   pdf_undoredo_step)rN   r  r   r#   r   r   r   journal_op_name  s   zDocument.journal_op_namec                 C   s>   | j s| jr
tdd}t| }t| t|\}}||fS )zShow journalling state.rQ  r   )r  r  r   rA   rk  r.   pdf_undoredo_state)rN   stepsr   r  r   r   r   journal_position  s   zDocument.journal_positionc                 C   r   )zMove forward in the journal.rQ  T)r  r  r   rA   rk  r.   pdf_redor3  r   r   r   journal_redo     
zDocument.journal_redoc                 C   sV   | j s| jr
tdt| }t| t|trt|| dS t	|}t
|| dS )zSave journal to a file.rQ  N)r  r  r   rA   rk  r7   rT   r.   pdf_save_journalJM_new_output_fileptrpdf_write_journal)rN   r   r   outr   r   r   journal_save  s   
zDocument.journal_savec                 C   sV   | j s| jr
tdt| }t| |jjstd|r$t	|| dS t
| dS )zBegin a journalling operation.rQ  zJournalling not enabledN)r  r  r   rA   rk  ri   r$  r   r.   pdf_begin_operationpdf_begin_implicit_operation)rN   r#   r   r   r   r   journal_start_op  s   zDocument.journal_start_opc                 C   r   )zEnd a journalling operation.rQ  N)r  r  r   rA   rk  r.   pdf_end_operationr3  r   r   r   journal_stop_op  r#  zDocument.journal_stop_opc                 C   r   )zMove backwards in the journal.rQ  T)r  r  r   rA   rk  r.   pdf_undor3  r   r   r   journal_undo  r2  zDocument.journal_undoc                 C   s>   | j rtdt| }|sdS t|}|tjkrdS J d)zDocument language.rj  Nr   znot implemented yet)r  r   rA   r.   pdf_document_languager  )rN   r   rw  r   r   r   rx    s   

zDocument.languagec                 C   s&   | j rtdt| j}|j|jfS )z Id (chapter, page) of last page.rj  )r  r   r.   fz_last_pager:   r  rG   )rN   last_locr   r   r   last_location  s   zDocument.last_locationc                 C   s   | j rtdt| }t| t }t|}g }t|D ]-}t||| |j	dkr/d}n
|j	dkr7d}nd}||j
|j||j|jd}|| q|S )z-Show OC visibility status modifiable by user.rj  r   checkboxr   radioboxlabel)r  r   depthr>   r  locked)r  r   rA   rk  r.   PdfLayerConfigUipdf_count_layer_config_uir   pdf_layer_config_ui_infor>   r   rF  selectedrG  r)  )rN   r   rm  r   r  r   r   r  r   r   r   layer_ui_configs  s.   


zDocument.layer_ui_configsc           	      C   s   | j s| jr
td| j}t|sdS |}|}t|}t|s-|j|j	 }|j
|j }|dks5|dkr9tdt|||| |   |   dS )z Re-layout a reflowable document.rQ  Nr  zbad page size)r  r  r   r:   r.   r>  r  r  r0  r1  r2  r3  r=  r  rB  )	rN   r_   r  r,  rb   r   r[  r\  r   r   r   r   layout:  s    

zDocument.layoutc                 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|tr>t| j	|}n|\}}t
| j	||}t|| }d|_| |_|| 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.
        rQ  Nr   zpage not in documentT)r  r  r   r>   r  r  r7   r.   fz_load_pager:   fz_load_chapter_pagerC   rZ   rR   r&  r/  r$  r%  r  r  )rN   page_idnprG   r  pagenumr~   r   r   r   r  N  s,   


zDocument.load_pagec                 C   sj   | j rtd| j}tdd}t|}|dk r!||7 }|dk s||kr)ttt||}|j|j	fS )zConvert pno to (chapter, page).rj  r   r   )
r  r   r:   r.   fz_make_locationr   r  fz_location_from_page_numberr  rG   )rN   r  this_docr  r  r   r   r   location_from_page_numberl  s   
z"Document.location_from_page_numberc                 C   s6   | j s| jr
tdtj| }t| jj| }|S )z.Make a page pointer before layouting document.rQ  )	r  r  r   r.   
FzLocationll_fz_make_bookmark2r:   ri   r  )rN   r  markr   r   r   make_bookmarkz  s
   
zDocument.make_bookmarkc                 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MarkInfor  r{   r   Tr  rf   r   <<r   >>FMarkedUserPropertiesSuspects/true)r  rg  r  splitr  )rN   r{   r  r~   validr%   rh  r  r   r   r   markinfo  s2   
(zDocument.markinfoc                 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.
        rj  r   r	  r   r   rI  rJ  r   r   r   	move_page  s   zDocument.move_pagec                 C   s   | j rtd| jsdS t| }d}d}tt|d}t||}t|r-t	|}|r7t
||t nt
||t |du rF|dkS |S )z"Get/set the NeedAppearances value.rj  Nr   NeedAppearanceszRoot/AcroFormr   )r  r   	isFormPDFrA   r.   pdf_dict_getprV  rg   pdf_is_boolpdf_to_boolr  PDF_TRUE	PDF_FALSE)rN   r  r   oldvalappkeyformappr   r   r   need_appearances  s(   

zDocument.need_appearancesc                 C   s:   | j rtdt| jtjr| jn| j }t|}|S )zIndicate password required.rj  )r  r   r7   r:   r.   r;   r=   fz_needs_password)rN   r@   r&   r   r   r   rA    s
   
zDocument.needs_passc           	      C   s   | j s| jr
tdt|tu rd|f}|| vrtdt|| jkr%dS t| }d}|d }t|ts8t	d |}|d }|}t
||}t
||}|j|jfS )z!Get (chapter, page) of next page.rQ  r   page id not in documentr   r   bad page idr   )r  r  r   r>   r  r  rB  r9   r7   THROWMSGr.   rS  fz_next_pager  rG   )	rN   rP  rU  page_nr~   r  r  r  next_locr   r   r   next_location  s&   
zDocument.next_locationc                 C   s   t r	t| j|S t| jtjrt| j}| j}n
t| j}t	| }|dk r0||7 }|dk s(||kr8t
tt||}t|}|S r  )r   r   page_annot_xrefsr:   r7   r.   r<   r  r   rA   r   r  r  JM_get_annot_xref_list)rN   r   r  rH  r  r  r   r   r   r|    s   zDocument.page_annot_xrefsc                 C   s4   t r| | S t| jtjrt| jS t| jS )zNumber of pages.)r   rE  r7   r:   r.   r;   r   r  rW   r   r   r   r    s
   
zDocument.page_countc           	      C   s   | j rtd| j}t|}|}|dk r||7 }|dk st| }||kr)ttt| t||}t	|}t
|}t|}|S )z2Get CropBox of page number (without loading page).rj  r   )r  r   r:   r.   r   rA   r  rk  r  
JM_cropboxr   r   )	rN   r  rU  r  r   r   r  cropboxr~   r   r   r   page_cropbox  s"   
zDocument.page_cropboxc                 C   sh   t |tu r| j}|dk r||7 }|dk sd|f}|| vr!td|\}}t||}t| j|}|S )z&Convert (chapter, pno) to page number.r   ru  )r>   r  r  r   r.   rS  fz_page_number_from_locationr:   )rN   rP  rQ  r  r  r  ry  r   r   r   page_number_from_location   s   z"Document.page_number_from_locationc                 C   s   t r	t| j|S | jrtdt| j}|}|dk r$||7 }|dk st| }d}||kr2tt	t
| tt||}|S )zGet xref of page number.rj  r   )r   r   	page_xrefr:   r  r   r.   r   rA   r  rk  rk   r  )rN   r  r  r   r   r{   r   r   r   r  .  s    zDocument.page_xrefc                 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 PageLayout value.
        r   N
PageLayoutr  
SinglePager#   r   r  rg  rN   r{   r  r   r   r   
pagelayout@     zDocument.pagelayoutc                 C   r  )z'Return the PDF PageMode value.
        r   NPageModer  UseNoner#   r   r  r  r   r   r   pagemodeN  r  zDocument.pagemoder  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  )rN   r  r  r  r  r   r   r   r8  \  s"   
zDocument.pagesc                 C   sF   | j rtdt| }d}|s|S tt|td}t|}|S )zGet xref of PDF catalog.rj  r   rR  )r  r   rA   r.   rp   rV  rq   rk   )rN   r   r{   r  r   r   r   r  w  s   
zDocument.pdf_catalogc                 C   s   | j d||dS )zGet PDF trailer as a string.r   )r   r   )r  )rN   r   r   r   r   r   rV    r  zDocument.pdf_trailerc                 C   s   | j rdS | j}t|}|jrt|S d}t|tjs#|tjA }t|tj	s/|tj
A }t|tjs;|tjA }t|tjsG|tjA }|S )zDocument permissions.r   l    )r  r:   r.   pdf_document_from_fz_documentri   pdf_document_permissionsfz_has_permissionFZ_PERMISSION_PRINTPDF_PERM_PRINTFZ_PERMISSION_EDITPDF_PERM_MODIFYFZ_PERMISSION_COPYPDF_PERM_COPYFZ_PERMISSION_ANNOTATEPDF_PERM_ANNOTATE)rN   r   r   permr   r   r   r    s    





zDocument.permissionsc                 C   sr   | j s| jr
tdt|tu rd|f}|| vrtd|dkr"dS |\}}t||}t| j|}|j	|j
fS )z%Get (chapter, page) of previous page.rQ  r   ru  r  r   )r  r  r   r>   r  r.   rS  fz_previous_pager:   r  rG   )rN   rP  r  r  r  prev_locr   r   r   prev_location  s   zDocument.prev_locationc                 C   s   i }|j }|j D ]\}}|||< q
|jjjdksJ d|_|  d}td | 	|}t
|}| D ]\}}|| }||j|< q8|S )zMake a fresh copy of a page.r   Nd   )r  r  r  r:   ri   refsr[   rv   store_shrinkr  r$  proxy)rN   rG   r  r  r  r%   
page_proxyrO   r   r   r   reload_page  s   



zDocument.reload_pagec              
   C   s   |s|rdS dS zt t|\}}}W n! ty4 } ztr t  |r)W Y d}~dS W Y d}~dS d}~ww |r@|j|jf||fS t t|}|||fS )aM  Calculate internal link destination.

        Args:
            uri: (str) some Link.uri
            chapters: (bool) whether to use (chapter, page) format
        Returns:
            (page_id, x, y) where x, y are point coordinates on the page.
            page_id is either page number (if chapters=0), or (chapter, pno).
        )r   r   r   r   )r   r   r   N)	r.   fz_resolve_linkrU  rt   ru   r   r  rG   r  )rN   urir7  r  xpypr}   r  r   r   r   resolve_link  s"   


zDocument.resolve_linkc                    s   fddt jD dd fdd  fdd}tj}tjtj|d	}i }tjd
}tj||}|	 rF||| tj
||}|	 rV||| |S )a  Convert the PDF's destination names into a Python dict.

        This function must be used with PyMuPDF's new, "rebased" architecture -
        see the above import statement.

        The only parameter is the fitz.Document.
        All names found in the catalog under keys "/Dests" and "/Names/Dests" are
        being included.

        Returns:
            A dcitionary with the following layout:
            - key: (str) the name
            - value: (dict) with the following layout:
                * "page":  target page number (0-based). If no page number found -1.
                * "to": (x, y) target point on page - currently in PDF coordinates,
                        i.e. point (0,0) is the bottom-left of the page.
                * "zoom": (float) the zoom factor
                * "dest": (str) only occurs if the target location on the page has
                        not been provided as "/XYZ" or if no page number was found.
            Examples:
            {'__bookmark_1': {'page': 0, 'to': (0.0, 541.0), 'zoom': 0.0},
            '__bookmark_2': {'page': 0, 'to': (0.0, 481.45), 'zoom': 0.0}}

            or

            '21154a7c20684ceb91f9c9adc3b677c40': {'page': -1, 'dest': '/XYZ 15.75 1486 0'}, ...
        c                    s   i | ]}  ||qS r   )r  r  r   rW   r   r   
<dictcomp>	  r  z*Document.resolve_names.<locals>.<dictcomp>c                 S   s.   t d}t |}t || dd t|S )z1Return string version of a PDF object definition.   r   r   )r.   fz_new_bufferFzOutputpdf_print_objr  r  )rz   r  outputr   r   r   
obj_string  s   


z*Document.resolve_names.<locals>.obj_stringc           	         s  ddd}|   rtj| } |  r | }n|  r& tj| d}n|S |dddd }|d}|dk rA||d	< |S |d
| }||d
 }||d	< |	dru|d	= |
 dd
 }ttt|\}}}||f|d< ||d< d|v rt|
 d  |d< |S t||d< |S )z3Generate value of one item of the names dictionary.r   r,   )rG   destr  r  r    r   rb  r  Nz/XYZrH  r  0 Rr   rG   )pdf_is_indirectr  r.   r  r{  r   rg   r.  r+  rp  rd  r  r'  r  r  )	r~   
templ_dictarrayrp  subvalarr_tr~  r  r  )r  
page_xrefsr   r   	get_array  s6   



z)Document.resolve_names.<locals>.get_arrayc                    sp   t j|}t|D ]+}t j||}t j||}| r#| }n
td| d d}|r5 || |< q
dS )zyGenerate name resolution items for pdf_dict.

            This may be either "/Names/Dests" or just "/Dests"
            zkey z is no /NameN)	r  r.   r   r   r   r   r  r   r   )	dest_dictpdf_dict
name_countr   rh  r~   dict_key)r  r   r   	fill_dict:  s   
z)Document.resolve_names.<locals>.fill_dictrR  Dests)r   r  r  r.   r  rg   rV  rW  rp   r   pdf_load_name_tree)rN   r  r   catalogr  dests	old_destsr  r   )r  r  r  rN   r   resolve_names  s   (

zDocument.resolve_namesc                 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
r|t| j|||||||||	|
|||||||S t| }t }||_||_||_||_||_|	|_||_||_|
|_||_||_||_||_||_||_|dur| | n	|dur| | |dur|!| d}t"| d|j#_$t%| |dkrt&| t'|trt(||| dS t)|}t*||| dS )z/Save PDF to file, pathlib.Path or file pointer.rQ  r  r#   seek)filename must be str, Path or file objectz$save to original must be incrementalr   zcannot save with zero pageszincremental needs original file(   z"password length must not exceed 40Nr   )+r  r  r   r>   rT   r  r#   r  r   r  r   r   Document_saver:   rA   r.   PdfWriteOptionsdo_incrementaldo_asciido_compressdo_compress_imagesdo_compress_fontsdo_decompress
do_garbage	do_pretty	do_lineardo_cleando_sanitizedont_regenerate_iddo_appearance
do_encryptr  opwd_utf8_set_valueupwd_utf8_set_valuerk  ri   r   JM_embedded_cleanJM_ensure_identityr7   pdf_save_documentr4  pdf_write_document)rN   r   r  r  r  r  r  r  r   r  r  r  
appearancer  r  r  r  r  r   r  r6  r   r   r   r  g  s   




 


zDocument.savec                 C   s|   | 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| }t| t	|| dS )z.Save a file snapshot suitable for journalling.zdoc is closedr  r#   r  zcannot snapshot to originalN)
r  r   r>   rT   r  r#   rA   rk  r.   pdf_save_snapshot)rN   r   r   r   r   r   save_snapshot  s   



zDocument.save_snapshotc                 C   s   | j | jdtdS )z Save PDF incrementallyT)r  r  )r  r#   PDF_ENCRYPT_KEEPrW   r   r   r   saveIncr     zDocument.saveIncrc                 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	| }t
|| |jjrKt|j |   dS )z,Build sub-pdf with page numbers in the list.rQ  r  r  zsequence requiredr   r	  N)r  r  r   r
  r  r  r  r   r8  rA   retainpagesri   rg  r.   rh  r  )rN   pylister   r   r   r   select  s   
4
zDocument.selectc                 C   s6   t | }t| |stj}nt|}t|| dS r  )rA   rk  r.   r  r  pdf_set_document_language)rN   rx  r   rw  r   r   r   r    s   
zDocument.set_languagec                 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| }
t|
 tt|
tdtd}|jsdS |dkrt|td}ntt|td|}|jsttt|||||| t|
j dS )z5Set the PDF keys /ON, /OFF, /RBGroups of an OC layer.rj  z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)r  r  r  zbad 'basestate'rR  r  Nr   r  r  )r  r   rS  r  keysr>   r  r  
differencerT   upperrA   rk  r.   r   rV  rq   ri   rp   r  r"  JM_set_ocg_arraysr  )rN   r#  	basestater  offrbgroupsrG  r  r  r~  r   r,  rz   r   r   r   	set_layer  st   




zDocument.set_layerc                    s   t  tr  fdd|  D }|g krtd  d|d  t| }|s(J |dkr4t|  dS |dkr@t|  dS t|  dS )	z$Set / unset OC intent configuration.c                    s    g | ]}|d   kr|d qS )r   r  r   )r  uir  r   r   r  K       z0Document.set_layer_ui_config.<locals>.<listcomp>z	bad OCG 'r  r   r   r   N)	r7   rT   rL  r   rA   r.   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)rN   r  r
  r  r   r   r  r   set_layer_ui_configF  s   
zDocument.set_layer_ui_configrf  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   	not a PDFFr^  zbad MarkInfo key(s): r\  )rc  falsezbad key value 'z': 'r  rb  r  r]  r[  T)r  r   r7   rf   rS  r  
issupersetr  ri  r  rT   r8  r  )rN   rf  r{   re  badkeyspdfdictrh  r  r   r   r   set_markinfoX  s&   
zDocument.set_markinfor  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 PageLayout value.)r  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r  zbad PageLayout valuerb  r   Nr  Tr  r   r8  r  )rN   r  re  r{   r%   r   r   r   set_pagelayouto     zDocument.set_pagelayoutr  c                 C   r  )
zSet the PDF PageMode value.)r  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r  zbad PageMode valuerb  r   Nr  Tr  )rN   r  re  r{   r%   r   r   r   set_pagemode  r  zDocument.set_pagemodec                 C   s   | j s| jr
tdt| }t| tt|td}|j	s%t
tt t|d}t|td}|j	rAt|||d dS t||dd}t|tdtd t|tdtd	 t|td| dS )
z"Store XML document level metadata.rQ  rR  r  rL  r   Nr  r  XML)r  r  r   rA   rk  r.   rp   rV  rq   ri   r  MSG_BAD_PDFROOTr  r  r  r   r  r   )rN   r  r   r  r   r  r   r   r   set_xml_metadata  s   
zDocument.set_xml_metadatac                 C   s   | j rtdt| }t| tt|tdtdtd}t|r*t	|s4|dk r0dS tt
|dk r:dS t|| |rOt| t|j dS dS )zActivate an OC layer.rj  rR  r  r  r   Nr   )r  r   rA   rk  r.   r   rV  rq   r{  r  MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr  ri   )rN   r#  
as_defaultr   cfgsr   r   r   switch_layer  s*   
zDocument.switch_layerc                 C   s   | j s| jr
tdt| }t| t|}t|d|d s#td t	| t
||}t||| |r@tt|  dS dS )z!Replace object definition source.rQ  r   bad xrefN)r  r  r   rA   rk  r.   r  r  rw  r  rX  r  JM_refresh_linkspdf_page_from_fz_pager=   )rN   r{   r   rG   r   xreflennew_objr   r   r   r    s   

zDocument.update_objectc           	      C   s   | j s| jr
tdt| }t|}|dk s||krttt||d}t|s/tt	t
|}|s9ttt|||| d|_dS )zReplace xref stream part.rQ  r   r   N)r  r  r   rA   r.   r  r  r  r   MSG_IS_NO_DICTr   r  r   r   dirty)	rN   r{   r   newcompressr   r  rz   r   r   r   r   update_stream  s   


zDocument.update_streamc                 C   r  )z1
        Count versions of PDF document.
        r   )rA   ri   r.   pdf_count_versionsr3  r   r   r   version_count  r  zDocument.version_countc                 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  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  )r  r  r  r  )rN   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  bior   r   r   r@    sL   	
zDocument.writec                 C      t |  | j| jS zPDF xref number of page.r   rR   r  r  rW   r   r   r   r{        zDocument.xrefc           
      C   s  | j rtdt| }t| t|}t|d|d s$|dkr$tt|dkr/t||}nt	|}|j
s9dS t||}|j
sDdS d}t|rUd}dt| }nct|r]d	}n[t|red
}nSt|rtd}dt| }nDt|r|d}n<t|rd}d}n2t|rd}t|rd}n#d}n t|rd}dt| }nt|rd}tt|}nd}|du rt|dd}	t|	}||fS )z+Get PDF dict key value of object at 'xref'.rj  r   r   r   )r  r  Nr{   %i 0 Rr  rf   r  z%ir  r  r  rc  r  r#   z/%sstringunknown)r  r   rA   rk  r.   r  r  r  r  rV  ri   rj  r  rk   r{  r   
pdf_is_intrr   pdf_is_realrq  rk  rl  r  r   pdf_is_stringrn   rm   JM_object_to_bufferr  )
rN   r{   rh  r   r  rz   subobjr   r>   r   r   r   r   rg    s^   











zDocument.xref_get_keyc           	      C   s   | j rtdt| }t| t|}t|d|d s$|dkr$tt|dkr/t||}nt	|}t
|}g }|dkrA|S t|D ]}tt||}|| qE|S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.rj  r   r   r   )r  r   rA   rk  r.   r  r  r  r  rV  r   r   r   r   r)  )	rN   r{   r   r  rz   r   r  r   rh  r   r   r   xref_get_keysK  s$   


zDocument.xref_get_keysc                 C   0   | j s| jr
td| |dd dkrdS dS )zCheck if xref is a font object.rQ  r  r   z/FontTFr  r  r   rg  rN   r{   r   r   r   xref_is_fonta  
   zDocument.xref_is_fontc                 C   r2  )z!Check if xref is an image object.rQ  r  r   z/ImageTFr3  r4  r   r   r   xref_is_imagei  r6  zDocument.xref_is_imagec                 C   s.   | j rtdt| }|sdS tt||S )z!Check if xref is a stream object.rj  F)r  r   rA   r  r.   pdf_obj_num_is_streamrl  r   r   r   xref_is_streamq  s   zDocument.xref_is_streamc                 C   r2  )z Check if xref is a form xobject.rQ  r  r   z/FormTFr3  r4  r   r   r   xref_is_xobjectz  r6  zDocument.xref_is_xobjectc                 C   s,   | j rtdd}t| }|rt|}|S )zGet length of xref table.rj  r   )r  r   rA   r.   r  )rN   r  r   r   r   r   xref_length  s   
zDocument.xref_lengthc           
      C   s   | j rtdtrt| j|||}|S t| }t| t	|}t
|d|d s1|dkr1tt|dkr<t||}nt|}tt|||}t|}	|	S )z#Get xref object source as a string.rj  r   r   r   )r  r   r   r   r  r:   rA   rk  r.   r  r  r  r  rV  r/  r  JM_EscapeStrFromBuffer)
rN   r{   r   r   r&   r   r  rz   r   r   r   r   r   r    s    

zDocument.xref_objectc           
   	   C   s8  | j rtd|rt|trt|t dhfvrtdt|tr6|r6|d dkr:t|dd t kr:tdt| }t| t	
|}t|d|d sW|dkrWtt|dkrbt	||}nt	|}t|||}|jsrdS |dkrt	||| dS t	|}t|D ]}	t	|t	||	t	||	 qdS )	z&Set the value of a PDF dictionary key.rj  rb  z	bad 'key'r   r   Nzbad 'value'r   )r  r   r7   rT   INVALID_NAME_CHARSintersectionrS  rA   rk  r.   r  r  r  r  rV  JM_set_object_valueri   r  r   r   r   r   r   )
rN   r{   rh  r  r   r  rz   r  r   r   r   r   r   r    s6   $2




zDocument.xref_set_keyc                 C      | j s| jr
tdt| }t| t|}t|d|d s'|dkr'tt|dkr3t	||d}nt
|}d}t|rIt||}t|}|S )zGet decompressed xref stream.rQ  r   r   r   N)r  r  r   rA   rk  r.   r  r  r  r  rV  r   pdf_load_stream_numberr   rN   r{   r   r  rz   r   r   r   r   r   xref_stream     


zDocument.xref_streamc                 C   r@  )z&Get xref stream without decompression.rQ  r   r   r   N)r  r  r   rA   rk  r.   r  r  r  r  rV  r   pdf_load_raw_stream_numberr   rB  r   r   r   xref_stream_raw  rD  zDocument.xref_stream_rawc                 C   sl   | j rtdt| }t| tt|td}|js"t	t
t t|td}d}|jr4t|}|S )z"Get xref of document XML metadata.rj  rR  rL  r   )r  r   rA   rk  r.   rp   rV  rq   ri   r  r  r  rk   )rN   r   r  r  r{   r   r   r   xref_xml_metadata  s   

zDocument.xref_xml_metadatar      c                 C   ,   | j rtdt| }|jr|jjrdS dS )z;
            Check if xref table is old style.
            rj  TF)r  r   rA   ri   has_old_style_xrefsr3  r   r   r   rK       zDocument.has_old_style_xrefsc                 C   rJ  )z:
            Check if xref table is a stream.
            rj  TF)r  r   rA   ri   has_xref_streamsr3  r   r   r   rM  
  rL  zDocument.has_xref_streams)r:   rE  r'  __dict__c                 C   r  rK   )r9  rW   r   r   r   r        zDocument.<lambda>)r  Nr  )NNNNr   r   r  r  r  )rG   r  NN)r   r  r  NNr   NN)r   r   NN)r   r   r   )r   r  )r   FTTTFFFFFr   r  NNTF)r   r   r   r   TTr   r   )	r   r   r   r   r   r   r   r   NrK   )Nr   r   r  )rG   r  r  r  r  )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NN)NNNNN)r   Nr   r   )FFFFFFFFFFFFr   r  NN)r  r  r  r  r  r  r  r  r  r  rP   rN  rT   rU   rZ  re  ri  rm  ru  typingUnionry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r1  r4  r  r  r  r:  rC  rK  rM  r  r  
ByteStringr  r`  ra  rd  r   re  rf   rj  r  rv  OptBytesrk  ry  r  r  r  r  r  r  r  r  rO  r  r  r  r  r  rB  r  r  r  r  r  r
  r  r  r  r"  r&  r*  r,  r/  r1  r7  r:  r<  r>  rx  rB  rL  rM  r  rV  rZ  rf  rg  rs  rA  r{  r|  r  r  r  r  r  r  OptIntr8  r  rV  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r@  r{   rg  r1  r5  r7  r9  r:  r;  r  r  rC  rF  rG  mupdf_version_tuplerK  rM  	__slots__outliner  	is_streamr   r   r   r   r8   	  s&    , 
!/$F& ;

	I	

	E
(
#U);.
.o

	




	
		



	(!~i
B*6	'r8   c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )DocumentWriterc                 C   r  rK   r   rW   r   r   r   r  !  r  zDocumentWriter.__enter__c                 G   r  rK   r  r  r   r   r   r  $  r  zDocumentWriter.__exit__r,   c                 C   s   t |trnt|drt|}nt|dr|j}t |tr)t||tjj| _d S t|}t||tjj	| _|
 dks?J t| jdsGJ d S )Nr  r#   r   _out)r7   rT   r  r#   r.   FzDocumentWriterPathType_PDFr:   r4  OutputType_PDFr  )rN   r   r[  r6  r   r   r   rP   '  s   





zDocumentWriter.__init__c                 C   s"   t |}t| j|}t|}|S rK   )r  r.   fz_begin_pager:   r  )rN   r  	mediabox2r  device_wrapperr   r   r   
begin_page>  s   zDocumentWriter.begin_pagec                 C   r{  rK   )r.   fz_close_document_writerr:   rW   r   r   r   r  D  r  zDocumentWriter.closec                 C   r{  rK   )r.   fz_end_pager:   rW   r   r   r   end_pageG  r  zDocumentWriter.end_pageNr,   )	r  r  r  r  r  rP   rd  r  rg  r   r   r   r   r\    s    
r\  c                   @   s  e Zd Zdd Z										d4ddZd	d
 Zdd Zedd Zedd Z	d5ddZ
edd Zedd Zd6ddZd7ddZedd Zdd Zd7d 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d5d.d/Zd0d1 Zd2d3 ZdS )8rU  c                 C   s   t | turd S d S rK   )r>   rU  rW   r   r   r   r  M  s   zFont.__del__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 S )Nr  zbad type: 'fontbuffer'rb  \r-  z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanr   )r  r  r7   r  r   r   rT   r8  r   rp  fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr"   r.   r  JM_get_fontr:   )rN   ra   r  r  scriptrx  r  is_bold	is_italicis_serifembedfname_lowerrq  rw  r  r   r   r   rP   Q  s@   










zFont.__init__c                 C   s
   d| j  S )Nz
Font('%s')r#   rW   r   r   r   rU     r=  zFont.__repr__c                 C   rs  )Nr   zHNot implemented because implementation requires FT_Get_First_Char() etc.)r:   JM_valid_chars)rN   r  r  r  ptrr   r   r   _valid_unicodes     zFont._valid_unicodesc                 C   r  )z Return the glyph ascender value.)r.   fz_font_ascenderr:   rW   r   r   r   ascender  r  zFont.ascenderc                 C   s    t t | jjj}t |S rK   )r.   r  r  r:   ri   r  fz_buffer_extract_copy)rN   r   r   r   r   r    s   
zFont.bufferr  c              	   C   sr   t |}g }|D ]-}	t|	}
|rt t|
}|dkr| j}nt | j|
||\}}||t |||  q	|S )z@Return tuple of char lengths of unicode 'text' under a fontsize.r   )	r.   r  ordfz_encode_character_scthisfontr:   !fz_encode_character_with_fallbackr)  r  )rN   r   rb   rx  ru  wmode
small_capsrw  r  chr  gidr  r   r   r   char_lengths  s   
zFont.char_lengthsc                 C   r  )z!Return the glyph descender value.)r.   fz_font_descenderr:   rW   r   r   r   	descender  r  zFont.descenderc                    sX  t | jj}|sd S t|t jsJ trS|jg  fdd}|d}|d}|d}|d}|d}|d}|d}	|d}
|d}|d}|d}|d}|d}trW|n|jtr]|n|jtrc|n|j	tri|n|j
tro|n|jtru|n|jtr{|	n|jtr|
n|jtr|n|jtr|n|jtr|n|jtr|n|jtr|n|jtr|dS |jdS )Nc                    s(    d d| > d @ } d | ?  d< |S rj  r   )bitsr&   r%   r   r   r-    s   zFont.flags.<locals>.br   )monoserifr  r  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxrj  zcjk-langry  znever-embed)r.   ll_fz_font_flagsr:   ri   r7   fz_font_flags_tr-   is_monorx  rv  rw  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxrj  cjk_langry  never_embed)rN   r  r-  r  rx  rv  rw  r  r  r  r  r  r  r  ry  r  r   r  r   r%    sJ   z
Font.flagsc           	      C   sN   t |}|rt t|}|dkr| j}nt | j|||\}}t |||S )z2Return the glyph width of a unicode (font size 1).r   )r.   r  r  r  r:   r  r  )	rN   chr_rx  ru  r  r  rw  r  r  r   r   r   glyph_advance  s   
zFont.glyph_advancec                 C   sV   t |}|rt t|}|dkr| j}nt | j|||\}}tt ||t  S )z1Return the glyph bbox of a unicode (font size 1).r   )	r.   r  r  r  r:   r  r   fz_bound_glyphr   )rN   charrx  ru  r  rw  r  r  r   r   r   
glyph_bbox  s   
zFont.glyph_bboxc                 C   
   | j jjS rK   )r:   ri   glyph_countrW   r   r   r   r       
zFont.glyph_countc                 C      t |S )z$Return the unicode for a glyph name.)glyph_name_to_unicoder  r   r   r   r    r  zFont.glyph_name_to_unicodec                 C   sL   |rt |}t | j|||\}}|S trt t|}|S t t|}|S )z0Check whether font has a glyph for this unicode.)r.   r  r  r:   r  r  r  r  )rN   chrrx  ru  fallbackrw  r  r  r   r   r   	has_glyph  s   
zFont.has_glyphc                 C   r  rK   )r.   fz_font_is_boldr:   rW   r   r   r   rv    r  zFont.is_boldc                 C   r  rK   )r.   fz_font_is_italicr:   rW   r   r   r   rw    r  zFont.is_italicc                 C   r  rK   )r.   fz_font_is_monospacedr:   rW   r   r   r   is_monospaced  r  zFont.is_monospacedc                 C   r  rK   )r.   fz_font_is_serifr:   rW   r   r   r   rx    r  zFont.is_serifc                 C      dS r  )r:   r.   r  ri   r-   cppyygbl"mupdf_mfz_font_flags_ft_substituter  ll_fz_font_t3_procspdf_font_writing_supported)rN   r  r%  r  r  r   r   r   is_writable     zFont.is_writablec                 C   s   t | j}|S rK   )r.   fz_font_namer:   rO  r   r   r   r#   '  s   z	Font.namec                 C   s   | j }t|}d}	t|tsttt|}
|D ](}t|}|r.t	||}|dkr-|}n
t
||||\}}|	t|||7 }	q|	|9 }	|	S )z1Return length of unicode 'text' under a fontsize.r   )r:   r.   r  r7   rT   r  MSG_BAD_TEXTr  r  r  r  r  )rN   r   rb   rx  ru  r  r  r  rw  r  r  r  r  r  r  r   r   r   text_length-  s"   

zFont.text_lengthc                 C   r  )z$Return the glyph name for a unicode.)unicode_to_glyph_name)rN   r  r   r   r   r  A  r  zFont.unicode_to_glyph_namec                 C   s   g S )z5
        list of valid unicodes of a fz_font
        )r  r  buffer_infor~  sortedrS  )rN   r  gccpr  r   r   r   valid_codepointsE  s   zFont.valid_codepoints)
NNNr   Nr   r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r  r  r  r  rP   rU   r~  r  r  r  r  r  r%  r  r  r  r  r  rv  rw  r  rx  r  r#   r  r  r  r   r   r   r   rU  K  sZ    
3





+









rU  c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   r  r  )r>   r  rZ   rW   r   r   r   r  U  s   
zGraftmap.__del__c                 C   s*   |  }t| t|}|| _d| _d S r  )r  rk  r.   pdf_new_graft_mapr:   rZ   )rN   r   dstmap_r   r   r   rP   Z  s
   

zGraftmap.__init__N)r  r  r  r  rP   r   r   r   r   r  S  s    r  c                   @   s   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
edd Zedd Zedd ZedefddZedd Zedd Zedd Zd+d"d#Zd,d$d%Zd&d' Zed(d) Zd*Zd S )-Linkc                 C   r  rK   )r[   rW   r   r   r   r  c  r  zLink.__del__c                 C   rJ   rK   )r7   r.   FzLinkr:   )rN   r:   r   r   r   rP   f  rQ   zLink.__init__c                 C      t |  dt| j S Nzlink on r   rT   rR   rW   r   r   r   rU   j  ri  zLink.__repr__c                 C   r  r  r  rW   r   r   r   rX   n  ri  zLink.__str__c                 C   s4   t |}|sd S t||d}|jsd S t|}|S r  )rA   r.   r  ri   r   rN   r   r{   r   link_objr-  r   r   r   _borderr  s   zLink._borderc                 C   s8   t |}|sd S t||d}|jsttt|}|S r  )rA   r.   r  ri   r   r  r   r  r   r   r   _colors|  s   zLink._colorsc                 C   s   d | _ d| _d S r  )rR   rZ   rW   r   r   r   r[     s   
zLink._erasec                 C   s8   t |}|sd S t||d}|jsd S t|||}|S r  )rA   r.   r  ri   r  )rN   r   r   r{   r   r  r-  r   r   r   
_setBorder  s   zLink._setBorderc                 C      |  | jjj| jS rK   )r  rR   r:   r{   rW   r   r   r   r        zLink.borderc                 C   r  rK   )r  rR   r:   r{   rW   r   r   r   rx     r  zLink.colorsc                 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.rR   Norphaned object: parent is NonerQ  #)
r  rR   r   r  r  is_externalr  rp  r  linkDest)rN   r   r  r   r   r   r    s   
z	Link.destr  c                 C   sD   t |  | jj}|jsdS || jd}|d dkr t|d S dS )Nr   r  r   r  )r   rR   r
  rg  r{   r  )rN   r   r  r   r   r   r%    s   z
Link.flagsc                 C   sB   t |  trt| jS | j}|jr|jjsdS tt	|jjS )zFlag the link as external.F)
r   r   r   Link_is_externalr:   ri   r  r  r.   fz_is_external_linkrN   	this_linkr   r   r   r    s   zLink.is_externalc                 C   s   | j jsdS t|  	 | j  }|jsdS t|}|r_d|_| j	|_	||j	j
t|< | jdkrYdd | j	 D }dd | j	 D }|| j}||d  |_||d  |_|S d|_d|_|S )	z
Next link.Nr   Tc                 S   "   g | ]}|d  t jkr|d qS r   r   r.   PDF_ANNOT_LINKr  r~  r   r   r   r       " zLink.next.<locals>.<listcomp>c                 S   r  )r   r   r  r  r   r   r   r    r  r   r,   )r:   ri   r   r   r   	Link_nextr  r  rZ   rR   r  r/  r{   annot_xrefsrw  )rN   r~   
link_xrefslink_idsrp  r   r   r   r    s,   

z	Link.nextc                 C   sN   t |  | jr| jjstd| jsJ | jjsJ t| j }t|}|S )zRectangle ('hot area').z"self.this.m_internal not available)r   r:   ri   rt   r   r_   r   r  r   r   r   r_     s   
z	Link.rectNr   c                 C   s.   t |tur|||d}| || jjj| jS )N)r  r  r  )r>   rf   r  rR   r:   r{   )rN   r   r  r  r  r   r   r   r    s   zLink.set_borderc                 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  rc   r  Nz!warning: links have no fill colorr   rK  r  r  r   r  r   r   r  r  )r   rR   r>   rf   r"   r   r  r{   r  r  r  r  r  )rN   rx   r  rc   r   r  r   r   r   r    s(   




zLink.set_colorsc                 C   sJ   t |  | jj}|jstdt|turtd|| jdt| d S )Nr  zbad 'flags' valuer  )	r   rR   r
  r   r>   r  r  r{   rT   )rN   r%  r   r   r   r   r  	  s   zLink.set_flagsc                 C   s(   t rt| jS | j}|jr|jjS dS )zUri string.r,   )r   r   link_urir:   ri   r  r  r   r   r   r    s   zLink.urir   )Nr   NNr  )r  r  r  r  rP   rU   rX   r  r  r[   r  r  r   rx   r  r  r%  r  r  r_   r  r  r  r  rG   r   r   r   r   r  b  s:    












	
r  c                   @   s   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dd Zdd Zdd Zdd Zdd  Zd!d" Zd0d$d%Zed&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Ze	ZeZeZd#S )1r   c                 C      t tdd | D S )Nc                 S      g | ]}|| qS r   r   r  r  r   r   r   r  !      z"Matrix.__abs__.<locals>.<listcomp>mathsqrtsumrW   r   r   r   __abs__      zMatrix.__abs__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 
Nr  rz  Matrix: bad seq lenr   r   r   r   r  r  
r  r   r2  r-  r  rc  r}   r  r  r   rP  r   r   r   __add__#     
&$zMatrix.__add__c                 C   $   t | t|   kodk S    S r  r8  r  rW   r   r   r   __bool__,     $zMatrix.__bool__c                 C   *   t |dsdS t|dkot| | du S )NrN  Frz  r  r  r  )rN   r   r   r   r   __eq__/     
zMatrix.__eq__c                 C   s    | j | j| j| j| j| jf| S rK   r2  r-  r  rc  r}   r  r  r   r   r   r  4  s    zMatrix.__getitem__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)a  
        Matrix() - all zeros
        Matrix(a, b, c, d, e, f)
        Matrix(zoom-x, zoom-y) - zoom
        Matrix(shear-x, shear-y, 1) - shear
        Matrix(degree) - rotate
        Matrix(Matrix) - new copy
        Matrix(sequence) - from 'sequence'
        r  Nrz  r  r   r   r     r   r   r  zMatrix: bad args)r2  r-  r  rc  r}   r  r  r   r'  r  r  r  radiansroundcossin)rN   r  thetar  r  r   r   r   rP   7  s>   
$"&$
zMatrix.__init__c                 C   s   t  }||  |S )zCalculate inverted matrix.)r   invert)rN   m1r   r   r   
__invert__`  s   
zMatrix.__invert__c                 C   r  )Nrz  r   rW   r   r   r   rN  e  r  zMatrix.__len__c                 C   sV   t |dr t| j| | j| | j| | j| | j| | j| S tdd}|| |S )Nr  r   )	r  r   r2  r-  r  rc  r}   r  concat)rN   r   r  r   r   r   __mul__h  s   

zMatrix.__mul__c                 C   s*   t | j | j | j | j | j | j S rK   )r   r2  r-  r  rc  r}   r  rW   r   r   r   __neg__o  s   *zMatrix.__neg__c                 C   r  r  r  rW   r   r   r   __nonzero__r  r  zMatrix.__nonzero__c                 C      t | S rK   )r   rW   r   r   r   __pos__u  rY   zMatrix.__pos__c                 C      dt t|  S )Nr   rT   r  rW   r   r   r   rU   x  r  zMatrix.__repr__c                 C   s|   t |}|dkr|| _d S |dkr|| _d S |dkr|| _d S |dkr(|| _d S |dkr1|| _d S |dkr:|| _d S td)Nr   r   r   r   r  r  index out of range)r  r2  r-  r  rc  r}   r  r  rN   r   r%   r   r   r   __setitem__{  s   zMatrix.__setitem__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  rP  r   r   r   __sub__  r  zMatrix.__sub__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 Nr  r  r   zmatrix not invertible)r  r   r2  r-  r  rc  r}   r  util_invert_matrixZeroDivisionErrorr  )rN   r   r  m2r   r   r   __truediv__  s   
&$
zMatrix.__truediv__c                 C   sR   t |t |  krdkstd tdt||\| _| _| _| _| _| _| S )z.Multiply two matrices and replace current one.rz  r  )	r  r   util_concat_matrixr2  r-  r  rc  r}   r  )rN   onetwor   r   r   r    s   "zMatrix.concatNc                 C   sN   |du r	t | }nt |}|d dkrdS |d \| _| _| _| _| _| _dS )z}Calculate the inverted matrix. Return 0 if successful and replace
        current one. Else return 1 and do nothing.
        Nr   r   )r  r2  r-  r  rc  r}   r  )rN   r/  r  r   r   r   r    s   
 zMatrix.invertc                 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=  r-  EPSILONr  r2  rc  rW   r   r   r   is_rectilinear  s   zMatrix.is_rectilinearc                 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   r  g     V@g     f@g     p@)r  r=  r  r2  r-  r  rc  r  r  r  r   )rN   r  r2  r-  radr  r  r   r   r   	prerotate  sL   #








zMatrix.prerotatec                 C   sL   t |}t |}|  j|9  _|  j|9  _|  j|9  _|  j|9  _| S )z1Calculate pre scaling and replace current matrix.r  r2  r-  r  rc  )rN   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  )rN   r\  r%   r2  r-  r   r   r   preshear  s   zMatrix.preshearc                 C   sP   t |}t |}|  j|| j || j  7  _|  j|| j || j  7  _| S )z5Calculate pre translation and replace current matrix.)r  r}   r2  r  r  r-  rc  )rN   txtyr   r   r   pretranslate  s
   zMatrix.pretranslaterK   )r  r  r  r  r  r  r  r  rP   r  rN  r  r  r	  r  rU   r  r  r  r  r  r  r  r  r!  r"  r%  __inv____div__normr   r   r   r   r     s8    	)		

+
r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )IdentityMatrixz"Identity matrix [1, 0, 0, 1, 0, 0]c                 C   s   t dS )N)r   r   r   r   r   r   )hashrW   r   r   r   __hash__  rY   zIdentityMatrix.__hash__c                 C   s   t | dd d S )Nr  )r   rP   rW   r   r   r   rP     rW  zIdentityMatrix.__init__c                 C   r  )Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r   rW   r   r   r   rU   	  r  zIdentityMatrix.__repr__c                 C   s:   |dv rd| j |< d S |dv rd| j |< d S || j |< d S )Nadr  bcefr  )rN  )rN   r#   r  r   r   r   __setattr__  s
   zIdentityMatrix.__setattr__c                  G   s   t d)NzIdentity is readonly)NotImplementedError)r  r   r   r   	checkargs  rY   zIdentityMatrix.checkargsN)	r  r  r  __doc__r+  rP   rU   r.  r0  r   r   r   r   r)     s    r)  c                   @      e Zd ZdZdd ZdS )r  z#link or outline destination detailsc                 C   sb  |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sd S | 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   Fr  z#page=%i&zoom=0,%g,%gr   r   r   z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   r  z^#page=([0-9]+)$)zhttp://zhttps://zmailto:zftp://Tzfile://r!  zpage=r  )r  r  fileSpecr%  isMapisUri	LINK_NONEkindr:  ltnamed	newWindowrG   r  r  rp  LINK_URIr.  	LINK_GOTOr]  r`  r  groupr  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDLINK_LAUNCHrd  r  
LINK_GOTOR)rN   rz   rlinkisExtisIntr   ftabr   r   r   rP     sz    
 


zlinkDest.__init__Nr  r  r  r1  rP   r   r   r   r   r        r  c                   @   sl   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d Z
edd Zdd Zdd Zdd ZdS )r  z6
    Class describing a PDF form field ("widget")
    c                 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 S )NSr   r   r   r   Helvr,   )r  border_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_stringr   button_caption	is_signedr`   	text_fonttext_fontsizetext_maxlentext_format_text_daru  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr_   r{   rW   r   r   r   rP   c  s>   
zWidget.__init__c                 C   s   d| j  d| j dS )NzWidget:(field_type=z script=r  )rW  ru  rW   r   r   r   rU        zWidget.__repr__c                 C   sF   | j sd| _ dS d}|D ]}| j  | kr|| _  dS qd| _ dS )zAEnsure text_font is from our list and correctly spelled.
        rK  N)CourTiRorK  ZaDb)rZ  r8  )rN   valid_fontsr  r   r   r   _adjust_font  s   zWidget._adjust_fontc                 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   r  zbad field type)FOffrR   zParent/Kidsr  r   r  r,   ASz/OffN)rV  r   r   PDF_WIDGET_TYPE_RADIOBUTTONrS  r  rR   rg  r{   r  r'  r  r.  rd  r  )rN   r   	kids_type
kids_valuer`  r{   r   r   r   _checker  s   "
zWidget._checkerc                 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'.
        NrK  r   rJ  Tfr   r   r,   grgc                 S      g | ]}t |qS r   r  r  r  r   r   r   r    r  z$Widget._parse_da.<locals>.<listcomp>r   )r^  rd  rC  r  rZ  r[  r`   )rN   r  rG  r   datr   r  r   r   r   rw     s4   
 ,zWidget._parse_dac                 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UnnamedNrJ  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r_   is_infiniteis_emptyr   rQ  rR  r  r  r   r`   rM  r[  rL  r  rV  PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXrm  ru  r>   rT   rb  ra  r`  r_  rc  rd  rp  )rN   btn_typer   r   r   	_validate  sh   









zWidget._validatec                 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.
        r   r  NrR   )r  downzAP/Nr   rf   r   r   r   rb  r  zAP/Dr  )rV  r  rR   r{   rg  rd  r)  )rN   r   r{   statesAPNnstatesapntr~  APDdstatesapdtr   r   r   button_states  s0   



zWidget.button_statesc                 C      | j jS rK   )_annotr  rW   r   r   r   r  8  r  zWidget.nextc                 C   sn   | j dvrdS | j dkrdS |  }|dkrt }| 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  Nr   Yesrk  z(warning: radio button has no 'On' value.T)rV  r  rf   r  r   )rN   bstater  r%   r   r   r   on_state<  s   
	
zWidget.on_statec                 C   s   t | j dS )z.Reset the field value to its default.
        N)rv   _reset_widgetr  rW   r   r   r   resetS     zWidget.resetc                 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r7d| j }|j| j| j	| j
d| _| jrLt| j t| j|  d| _d	S )
z*Reflect Python object in the PDF.
        r,   r   r	  r   r
  r  r  r  N)rR   r:   r   r~  rj  r^  r  r`   r$  rZ  r[  rb  util_ensure_widget_calcr  rv   _save_widget)rN   r   rJ  r   r   r   ri  X  s"   



zWidget.updateN)r  r  r  r1  rP   rU   rj  rp  rw   r~  r  r  r  r  r  ri  r   r   r   r   r  ^  s    %G!
r  )_extrac                   @   s   e Z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dgZdS )r  c                 C   s
   || _ d S rK   r<  rN   r5  r   r   r   rP   |  r=  zOutline.__init__c                 C   s
   t | dS )zoutline destination detailsN)r  rW   r   r   r   r    rs  zOutline.destc                 C       | j }| }|jsd S t|S rK   )r:   r  ri   r  )rN   r5  down_olr   r   r   r    
   zOutline.downc                 C   s>   t rt| jS | j}|jsdS |jj}|d u rdS t|S r  )r   r  Outline_is_externalr:   ri   r  r.   r  )rN   r5  r  r   r   r   r    s   
zOutline.is_externalc                 C   s   	 | j jjS rK   )r:   ri   rr  rW   r   r   r   rr    s   
zOutline.is_openc                 C   r  rK   )r:   r  ri   r  )rN   r5  next_olr   r   r   r    r  zOutline.nextc                 C   s   	 | j jjjS rK   )r:   ri   rG   rW   r   r   r   rG     s   zOutline.pagec                 C   r  rK   )r:   ri   r  rW   r   r   r   r    r  zOutline.titlec                 C   s   | j }|jsd S |jjS rK   )r:   ri   r  r  r   r   r   r    s   zOutline.uric                 C   r  rK   )r:   ri   r~  rW   r   r   r   r~    r  z	Outline.xc                 C   r  rK   )r:   ri   r  rW   r   r   r   r    r  z	Outline.yr:   N)r  r  r  rP   r  r  r  r  rr  r  rG   r  r  r~  r  rY  r   r   r   r   r  z  s.    










r  c           	         s   t  }| |_||_||_tdkr?||_|r= r!t t js J nt   G  fdddt j	}| }|
|  ||_|S ||_|S )z4
    Returns a mupdf.PdfFilterOptions instance.
    rH  c                       s&   e Zd Z fddZdd Z  ZS )z'_make_PdfFilterOptions.<locals>.Factoryc                    s   t    |   | _d S rK   )r=   rP   use_virtual_filtersoptsrW   )	__class__r  r   r   rP     s   

z0_make_PdfFilterOptions.<locals>.Factory.__init__c              	   S   s   	 t|||||| j S rK   )r   r  r  r.   ll_pdf_new_sanitize_filter)rN   ctxr   chainstruct_parents	transformr[  r   r   r   filter  s   
z._make_PdfFilterOptions.<locals>.Factory.filter)r  r  r  rP   r  __classcell__r   r  r  r   Factory  s    r  )r.   PdfFilterOptionsr   r   r   rX  	no_updater7   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryr  _factoryr   )	r   r   r   r  r   r  r   r  factoryr   r  r   r     s"   	r   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zdd
dZ											dddZdd Z	dd Z
dd ZdddZdd ZdddZdddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(ed)efd*d+Zd,d- Zdd.d/Z					dd2d3Zd4d5 Zd6d7 Zd	d8d9Zd:d; Zd<d= Zd>d? Z d
d@dAZ!dBdC Z"dDdE Z#ddFdGZ$dHe%d)dIfdJdKZ&dLe'd)dIfdMdNZ(						ddHe%dOe)j*dPe+dQedRedSed)dIfdTdUZ,											ddLe'dVe+dWe-dXedYe.dZe.d[e.d\e/d]e/d)dIfd^d_Z0				d	Idd`daZ1dbe2d)dIfdcddZ3dee%dfe%d)dIfdgdhZ4die2d)dIfdjdkZ5die2d)dIfdldmZ6dLe'd)dIfdndoZ7											pddVedXedWe-d\e/dqe.dZe.dre8d)dIfdsdtZ9								d	IddudvZ:ddLe'dwe/d)dIfdxdyZ;dddzd{Z<ddHe%dVe+dSe+d)dIfd}d~Z=ddddZ>de?d)dIfddZ@dd ZAdd ZBdd ZCdddZDeEdd ZFeEdd ZGdd ZHdddZIeEdd ZJeEdd ZKdd ZLdd ZMeEd)eNfddZOdddZPeEdd ZQeEdd ZReEdd ZSdddZTdddZUdd ZVdddZWdde8d)e2fddZXdddZYdddZZdddZ[d)e2fddZ\dddZ]		dde^dLe'd)e+fddZ_dde'de/d)dfddÄZ`ddń ZaddǄ Zb			dddʄZceEdd̄ ZdeEdd΄ ZedddЄZfde)jge+e/f d)dIfddӄZhddՄ Ziddׄ ZjeEddل ZkeEddۄ Zldd݄ Zmdd߄ ZneEdd ZoeEd)eNfddZpdd Zqdd Zrdd Zsdd Ztdd ZudddZvdd Zwdd Zxdd ZyeEdd ZzeEdd Z{dddZ|dd Z}eEdd Z~eEeHd dZd	S (  rC   c                 C   s   t |tjtjfsJ d| || _d| _d | _d| _t | _	|| _
|jr;t |tjr4|jjj| _d S |jj| _d S d | _d S )Nz	page is: Tr,   )r7   r.   rE   rD   r:   rZ   	lastPoint	draw_contrf   r  rR   ri   r=   r  )rN   rG   r@   r   r   r   rP     s    
zPage.__init__c                 C   rV   rK   )rX   r   rR   r#   r   r@  r  r  r   r   r   rU     rY   zPage.__repr__c                 C   s   t | dd }t| jjtjr| jjjj}n| jjj}d| }|rC| jj	}| jj
d ur2d| jjf }|dkr<d| jj }|d| 7 }|S )NrR   r  z<memory, doc# %i>r,   z<new PDF, doc# %i>z of )rS   r7   r:   ri   r.   pdf_pager=   r  rR   r#   r   r@  )rN   rR   r  r&   r~  r   r   r   rX   "  s   

zPage.__str__c                 C   s   t rt| jt|}|S t r*t| jtjr| j}nt| j}t|t|}|S | 	 }t
|tj}|r^t|}t|}t|j|j|j|j |j |j|j |j }t|| t| t|d |S Nr  )r   r   _add_caret_annotr:   JM_point_from_pyr7   r.   rD   r  	_pdf_pagepdf_create_annotr   pdf_annot_rectr   r~  r  r0  r1  r2  r3  r  r   JM_add_annot_id)rN   r  rO   rG   r
  r   r   r   r   r  3  s&   
0

zPage._add_caret_annotNc                 C   s6  |   }|r|n|}|r|n|}	t|}
t| t|}|js#ttt|tj	}t
|}t|
j|
j|
j|j |j |
j|j |j }t|| tj}t|| |r^t|| t| ||||	d}tt|td| tt|td| t| t|| t|| t|d t|S )Nr   r  rl  r  )r  r  rk  r   ri   r  r   r.   r  r   r  fz_make_rectr~  r  r0  r1  r2  r3  r  PDF_ANNOT_IS_PRINTr  pdf_set_annot_icon_namer|  r   r   rh   rq   r  r   r  rI   )rN   r  r   r   rq  r"  iconrG   ufrc  r
  filebufrO   r   r%  r~   r   r   r   _add_file_annotL  s0   
0

zPage._add_file_annotr  r   c
                 C   s  |   }
t|\}}t|\}}t|}t|st|r"ttt|
tj	}t
|}t|| t|| t|td|	 t|td| |dkrZt||d |  t||||| t| t|d t|}| }|d}|dd }||| }|d |d  }|d |d	  }|	d
v r||}}d||f }|d | }d }d}t|d }|r|d7 }d}t|d }|r|d7 }d}d}|r|rd}|d kr|| | | d | d | }|| |S )Nr   r^   r   r  r  r  r   r   r   )r  ir  r  r  r   r  r  r  r  s   1 w
r  r  )r  r   r  r.   r  r  r   r  r  r   rh   r  r  r   rq   r   JM_make_annot_DAr   r  rI   r   r+  r  r  r   )rN   r_   r   rb   ra   r`   r   r  r|   r   rG   r   r   ntcolrE  r   rO   r   r~   r   rY  rZ  r[  r\  r]  r^  rB  r_  r`  r   r   r   _add_freetext_annoth  sZ   




 
zPage._add_freetext_annotc                 C   sD  t | j}t| t|sttt  }t |t 	d| t 
|}t |t j}t |}t|}t | |}t|D ]I}	||	 }
t|
}t | d| }t|D ]*}|
| }t|rit|dkrmttt t||}t ||j t ||j qYt || qAt |td| t | t|d t|S )Nr   r   InkListr  )r.   r  r:   rk  PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr   ry  r   fz_invert_matrixr  r   rh   r  r   r   r   PySequence_Sizer}  r  r   r~  r  r}  r   rq   r   r  rI   )rN   r  rG   rD  inv_ctmrO   r   n0inklistr   sublistn1r  r   r
  r  r   r   r   _add_ink_annot  s6   



zPage._add_ink_annotc                 C   sb   |   }t| t|tj}t|}t|}t||| t| t|d |j	s-J t
|S r  )r  rk  r.   r  r   r  pdf_set_annot_liner   r  ri   rI   )rN   re  rf  rG   rO   r2  r-  r   r   r   _add_line_annot  s   


zPage._add_line_annotc                 C   sv   |   }t|dk rttt||}|D ]}t|dkr"ttt|}t|| qt	| t
|d t|S )Nr   r  )r  r  r   MSG_BAD_ARG_POINTSr.   r  r  r  pdf_add_annot_vertexr   r  rI   )rN   rd  r@  rG   rO   r
  r  r   r   r   _add_multiline  s   

zPage._add_multilinec                 C   s  |   }g d}d}	t|tj}
t|}t|}t|
| |rKt|\}	}t|	 |	}t
|	D ]
}t|||  q4tt|
td| |rrtt|
dt| tt|
td| tt|
td| t|
 t|
d t|
j}
t|
}
t|
S )N)r   r   r   r   r   r   r]   DAr^   r  )r  r.   r  re   JM_quad_from_pyfz_rect_from_quadr  r   r   r   r   r   r   rh   rq   r  r  r  r   r   r  ll_pdf_keep_annotri   rL   rI   )rN   rh  r   rI  r|   rc   r`   rG   r   r   rO   qr   r  r   r   r   r   _add_redact_annot  s4   



zPage._add_redact_annotc                 C   sj   |   }t|}t|st|rttt||}t|| t	| t
|d |js1J t|S r  )r  r  r.   r  r  r   r  r  r  r   r  ri   rI   )rN   r_   r@  rG   r   rO   r   r   r   _add_square_or_circle  s   


zPage._add_square_or_circlec           
      C   sR  |   }tdtdtdtdtdtdtdtdtd	td
tdtdtdtdg}t|}|d }t| t|}t|sJt|rNtt	t
|d|d rZ|| }t|tj}t|| ztd}tt|td| W n ty }	 ztrt   d }	~	ww t|tt|td t| t|d t|S )NApprovedAsIsConfidentialDepartmentalExperimentalExpiredFinal
ForCommentForPublicReleaseNotApprovedNotForPublicReleaseSold	TopSecretDraftr   r   r_  r  )r  rq   r  rk  r  r.   r  r  r   r  r  r  r   r  r   rh   rt   ru   r   r  pdf_dict_get_namer   r  rI   )
rN   r_   stamprG   stamp_idr   r#   r   rO   r}   r   r   r   _add_stamp_annot  sR   


zPage._add_stamp_annotc                 C   s   |   }t|}t| t|tj}t|}t|j|j	|j|j
 |j |j	|j |j }t|| t|| |rDt|| t| t|d t|S r  )r  r  rk  r.   r  r   r  r  r~  r  r0  r1  r2  r3  r  r  r  r   r  rI   )rN   r  r   r  rG   r
  rO   r   r   r   r   _add_text_annot5  s   
0

zPage._add_text_annotc                 C   sJ   t |  | jjstdt| ||}|sd S t| |_|| jt|< |S )Nr  )	r   rR   r
  r   Page__add_text_markerr$  r  r  r/  )rN   quadsr@  r~   r   r   r   _add_text_markerD  s   zPage._add_text_markerc                 C   sz  t |  trtj| j_td t| j|S t	| j}t
|}|dk r&dS d}t| t|ts5tdt| tdjsKt| td| t| td}|jscJ d|d|jt|D ]S}|| }t|}|sytd	| qgz!t| t| |}t| t|d
}	t||	 W qg ty }
 ztrt  t d	| t!j"d W Y d}
~
qgd}
~
ww dS )z&Add links from list of object sources.zJPage._addAnnot_FromString() deferring to extra.Page_addAnnot_FromString().r   Nr   zbad 'linklist' argumentr   zlcount=z annots.m_internal=z#skipping bad link / annot item %i.
r   r   )#r   r   r   Page_addAnnot_FromStringr  _addAnnot_FromStringr   r:   r.   r  r  rk  r7   r  r   rp   rz   rq   ri   r   r   JM_StrAsCharPySys_WriteStderrr  r   rX  r  rk   r}  rt   ru   r   r   r   r   )rN   linklistrG   lcountr   r  txtpyr   rO   r  r}   r   r   r   r  R  sB   



zPage._addAnnot_FromStringc                 C   s>   |   }| }t||||}|jstdt|d t|S )Nzcannot create widgetW)r  r   JM_create_widgetri   r   r  rI   )rN   rV  rQ  rG   r   rO   r   r   r   
_addWidgetu  s   
zPage._addWidgetc                 C   s:   |   }t }d|_||_t| t| ||}|S r  )r  r.   PdfRedactOptionsblack_boxesimage_methodrk  pdf_redact_pager   )rN   imagesrG   r  successr   r   r   _apply_redactions~  s   zPage._apply_redactionsc                 C   s>   |    z| j|  W n   t  Y d | _d| _d | _d S r  )_reset_annot_refsrR   r  r   rZ   r  rW   r   r   r   r[     s   
zPage._eraser+  r  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   )rR   r  r   _get_resource_propertiesr  ry   _set_resource_property)	rN   r+  r   checkpropsr
  r~  r   mcr   r   r   _get_optional_content  s&   
zPage._get_optional_contentc                 C   s    |   }t| t| }|S )z/
        page list Resource/Properties
        )r  rk  JM_get_resource_propertiesrz   )rN   rG   r  r   r   r   r	    s   zPage._get_resource_propertiesc                 C   s   t rt| j|||}t|}|S | j}t|}t|}|d u r't|nt|}t	|}	t|}t
||}
trCt|
tj t|tjrJnt|tjrU| }n	J dt|t||
|	t  t|
 |S )Nr   rB   )r   r   page_get_textpager:   r.   rX  rW  r  fz_bound_pager9  r  g_no_device_cachingfz_enable_device_hintsFZ_NO_CACHEr7   rE   rD   r=   r>   fz_run_pager  fz_close_device)rN   rZ  r%  r?  ll_tpagetpagerG   r[  r_   rD  devr   r   r   _get_textpage  s*   




zPage._get_textpager   r   c           3      C   sT  t  }|  }| }|
}|}|}d}d}d}d}d}d}d}|dkrZt ||d}t t |tdtd}t t |tdtd}|| dkrQtt	d}d}d}d}n|rct
|}d}n	|rlt |}d}|r|j}| }| }t |} | }!||!d }"|"d ur|"}t | |d}d}d}d}n=| dkrt |t  }#n*t |t dt dt dt  d}$d|$_t|$_t |$t d}%t ||%}#d}d}|rat  }&trt |&| nt |&|jj|jj  |rt
|}trt |&| n
t|&|jj|jj  t !|&} t"| }!||!d }"|"d urO|"}t | |d}t t |tdtd}t t |tdtd}d}d}nt #|}#|# }|# }|sad}|rt $t %|#j}'|'jsutd|#& }(|# })t '|#\}*}+t #|}%t (|||(|)|*|+ddtt|'|%},|#}-|,}#|rt )||#}|	rt*|||	 t +|}|||!< d}|rt ,|- td	}.|.jst .|- td	d
}.t /|.td}/|/jst .|.tdd
}/t0|||||}0t 1|/|| t 2d}1||0j3|0j4|0j5|0j6|0j7|0j8|f }2t 9|1|2 t:||- |1| |r&||fS |d fS )Nr   z!
q
%g %g %g %g %g %g cm
/%s Do
Q
r   Widthr  Heightr   z#uncompressed image cannot have maskr   r   XObject2   );r.   r  r  r   r  rr   r  rq   r   MSG_IS_NO_IMAGEr   fz_read_filer:   r[  r\  fz_md5_pixmap2r"   rB  fz_new_image_from_pixmapFzImagefz_convert_pixmapr  FzDefaultColorspacesr  rn  rA  FzMd5r-   fz_md5_update_bufferfz_md5_updateri   r  r  fz_md5_final2r   r  FzCompressedBufferr  r  r  #fz_new_image_from_compressed_bufferpdf_add_imager  rk   r  rz   r   rp   calc_image_matrixr  r  r2  r-  r  rc  r}   r  fz_append_stringJM_insert_contents)3rN   r   pixmapr   imaskrZ  overlayr   keep_proportionr+  r  r,  r{   rB  _imgnamedigestsmaskbufrG   r   r[  r\  img_xref	rc_digesttemplatedo_process_pixmapdo_process_streamdo_have_imaskdo_have_imagedo_have_xrefrefimgbufarg_pixdigestmd5_pyr  imager  maskstatecbuf1r  rA  r  r  zimgfreethisr   xobjectr   nresr  r   r   r   _insert_image  s   







"zPage._insert_imagec                 C   s   |   }t| | }t|||||||||	|

}t| td}t|td}|j	sBt
|d}t| |tdtd t|d\}}|sOtdt||d}t||| |S )Nr   rU  r  r   zcannot insert font)r  rk  r   r  r.   r  rz   rq   rp   ri   r   rp  r_  r   r  r  )rN   ra   r  r  r  
set_simplerp  r  r  rP  r  rG   r   r  r   rY  rS  r{   font_objr   r   r   _insertFontt  s   zPage._insertFontc                 C   s>   |   }t| |dkrt||}nt||}|rt|S d S r  )r  rk  JM_get_annot_by_nameJM_get_annot_by_xrefrI   )rN   r#   r{   rG   rO   r   r   r   _load_annot  s   
zPage._load_annotc                 C   s   t || j|||||}t|S rK   )JM_pixmap_from_pager:   r>  )rN   r   rD  rE  rB  r  rZ  rF  r   r   r   _makePixmap  s   zPage._makePixmapc                 C   sZ   t t jj}t | j}|jr"t | |}t |r"t 	|}t 
|r)d S t|S rK   )r.   r   r   r  r:   ri   rg   rz   r{  pdf_to_rectr  r   )rN   boxtyper_   rG   rz   r   r   r   
_other_box  s   


zPage._other_boxc                 C   s    t | jtjr
| jS t| jS )zi
        Returns self.this as a mupdf.PdfPage using pdf_page_from_fz_page() if
        required.
        )r7   r:   r.   rD   r  rW   r   r   r   r    s   zPage._pdf_pagec                 C   s   | j   dS )z,Invalidate / delete all annots of this page.N)r  r  rW   r   r   r   r 	       zPage._reset_annot_refsc                 C   sd  |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 }|s:d S t| j}t| t| t	d}|j
s\t| t	dd}t|t	d}	|	j
spt|t	dd}	t|	}
ttD ]}t|	|}t|}||kr|  S qyt| d	}t|t	d
| t|t	d| t|	|| |S )Nr   r   r  c   zfitzca%02i%02ir   r   r   r   r   r   )r  r  r8  r.   r  r:   rk  rp   rz   rq   ri   r   r   r   r   r   r   r   r   r   r  )rN   gstater   r   r   tCAtcarG   r   r   r   r   r  r#   opar   r   r   _set_opacity  s>   

zPage._set_opacityc                 C   s   | j }|d krtd|jstdd}||vrtdt| j}t|d |j|d  |d |j|d  }tt|}|jsB|jrFtd	||vrNtd
|	| j
|dt|  d S )Nr  r  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   r   r   rect is infinite or emptyzrect not in mediaboxr  )rR   r   r
  r   r  r2  	JM_TUPLE3ry  rz  r  r{   r  )rN   rP	  r_   r   valid_boxesmbr   r   r   _set_pagebox  s    
*zPage._set_pageboxc                 C   s$   |   }t| t| || d S rK   )r  rk  JM_set_resource_propertyrz   )rN   r#   r{   rG   r   r   r   r	    s   zPage._set_resource_propertyc	                 C   sV  t |}	t|}
|}t| j}| }| }t| t||||j}|s+t	|}t
|d}t|d| t
|d}t|td| td}t|d t||	|
||}|dkrht|t|| t|td}t|td}|jst|tdd}t||| td}t|d	 t|| t|d
 t|||| |S )Nr  fullpager	     z/fullpage Dor   r   r	  z q /z Do Q )r  r9  r.   r  r:   rz   r   r  JM_xobject_from_pagerk   r   r  r   rq   r  r(	  pdf_new_xobjectr  r  r  rp   ri   r   r)	  )rN   
fz_srcpager,	  r?  r{   r+  rZ  graftmapr.	  r  r   rc_xrefr	  tpagerefr  xobj1subres1subresr   xobj2r   rE	  r   r   r   _show_pdf_page  s<   


zPage._show_pdf_pager  struct Annot *c              	   C   sd   t | }z| |}W |dkr| | n|dkr| | w w t|}t| | t|ds0J |S )zAdd a 'Caret' annotation.r   rR   )annot_preprocessr  r  rI   annot_postprocessr  )rN   r  old_rotationrO   r   r   r   add_caret_annot  s   

zPage.add_caret_annotr_   c              	   C   R   t | }z| |tj}W |dkr| | n|dkr!| | w w t| | |S )z*Add a 'Circle' (ellipse, oval) annotation.r   )rq	  r  r.   r   r  rr	  rN   r_   rs	  rO   r   r   r   add_circle_annot+     

zPage.add_circle_annotr   r   rq  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.)rq  r"  r  r   )rq	  r  r  rr	  )	rN   r  r   r   rq  r"  r  rs	  rO   r   r   r   add_file_annot6  s"   


zPage.add_file_annotr   rb   ra   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.)rb   ra   r  r`   r   r|   r   r   )rq	  r  r  rr	  )rN   r_   r   rb   ra   r  r`   r   r|   r   rs	  rO   r   r   r   add_freetext_annotO  s*   

zPage.add_freetext_annotc                 C   s4   |du rt | |||d}nt|}| |tj}|S )zAdd a 'Highlight' annotation.Nr  r  rZ  )get_highlight_selectionCheckMarkerArgr  r.   PDF_ANNOT_HIGHLIGHT)rN   r  r  r  rZ  r  r&   r   r   r   add_highlight_annotp  s
   zPage.add_highlight_annothandwritingc              	   C   sN   t | }z| |}W |dkr| | n|dkr| | w w t| | |S )znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )rq	  r  r  rr	  )rN   r	  rs	  rO   r   r   r   add_ink_annotz  s   

zPage.add_ink_annotre  rf  c              	   C   P   t | }z| ||}W |dkr| | n|dkr | | w w t| | |S )zAdd a 'Line' annotation.r   )rq	  r  r  rr	  )rN   re  rf  rs	  rO   r   r   r   add_line_annot     

zPage.add_line_annotrd  c              	   C   ru	  )zAdd a 'Polygon' annotation.r   )rq	  r  r.   r   r  rr	  rN   rd  rs	  rO   r   r   r   add_polygon_annot  rx	  zPage.add_polygon_annotc              	   C   ru	  )zAdd a 'PolyLine' annotation.r   )rq	  r  r.   r   r  rr	  r	  r   r   r   add_polyline_annot  rx	  zPage.add_polyline_annotc              	   C   ru	  )z&Add a 'Square' (rectangle) annotation.r   )rq	  r  r.   r   r  rr	  rv	  r   r   r   add_rect_annot  rx	  zPage.add_rect_annotTrc   r  c	              	   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.NrK  r  rJ  r  r   r	  r  r   r   r   )r   rI  r|   rc   r   r   r  r  )r  r  r  r$  rq	  r  r  rr	  r   r(  r)  r&  r   )rN   rh  r   ra   rb   r|   rc   r`   r  rI  rJ  rs	  rO   rQ  rS  rT  rU  rV  rW  r   r   r   r   add_redact_annot  s^   













zPage.add_redact_annotc                 C   0   |du rt | |||d}nt|}| |tjS )zAdd a 'Squiggly' annotation.Nr{	  )r|	  r}	  r  r.   PDF_ANNOT_SQUIGGLYrN   r  r  r  rZ  r  r   r   r   add_squiggly_annot  s   zPage.add_squiggly_annotr  c              	   C   r	  )z$Add a ('rubber') 'Stamp' annotation.r   )rq	  r  r  rr	  )rN   r_   r  rs	  rO   r   r   r   add_stamp_annot  r	  zPage.add_stamp_annotc                 C   r	  )zAdd a 'StrikeOut' annotation.Nr{	  )r|	  r}	  r  r.   PDF_ANNOT_STRIKE_OUTr	  r   r   r   add_strikeout_annot	      zPage.add_strikeout_annotNotec              	   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   )rq	  r  r  rr	  )rN   r  r   r  rs	  rO   r   r   r   add_text_annot   s   

zPage.add_text_annotc                 C   r	  )zAdd a 'Underline' annotation.Nr{	  )r|	  r}	  r  r.   PDF_ANNOT_UNDERLINEr	  r   r   r   add_underline_annot   r	  zPage.add_underline_annotr  c                 C   sv   t |  | j}|jstd|  | |j|j}|sdS d|_t	
| |_|| jt|< |j|_||_|  |S )zAdd a 'Widget' (form field).r  NT)r   rR   r
  r   r~  r  rV  rQ  rZ   r$  r  r  r/  r  ri  )rN   r  r   rO   r   r   r   
add_widget$   s   zPage.add_widgetc                 C   s$   	 t |  |  }|jsg S t|S )z.
        page get list of annot names
        )r   r  ri   JM_get_annot_id_listrN   rG   r   r   r   annot_names6   s   zPage.annot_namesc                 C   s0   t rt| jS |  }|jst S t| S )zH
        List of xref numbers of annotations, fields and links.
        )	r   r   JM_get_annot_xref_list2r:   r  ri   r  r}  rz   r	  r   r   r   r  A   s   zPage.annot_xrefsc                 C   s   J )z6List of xref numbers of annotations, fields and links.)	r   r   r   r	  r:   r  ri   r}  rz   )rN   r&   rG   r   r   r   _unused_annot_xrefsL   r  zPage._unused_annot_xrefsc                 #   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  r2  )
skip_typesr   r   r  d   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  f   s   , TN)r  PDF_ANNOT_POPUPr  r  r  
load_annot_yielded)rN   r	  r  r{   rO   r   r	  r   r  Z   s   


zPage.annotsc                 C   H   |  d}|dkr| jS | j}t|d |j|d  |d |j|d  S )z
The ArtBoxr\	  Nr   r   r   r   rQ	  r  r  r   r2  rN   r_   r`	  r   r   r   artboxl   
   
*zPage.artboxc                 C   r	  )zThe BleedBoxrZ	  Nr   r   r   r   r	  r	  r   r   r   bleedboxu   r	  zPage.bleedboxc                 C   s   t |  t| j}t|}t|}|jrE| jjrE| 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   F)r  r   r   )r   rH   r:   r.   r	  r   ry  rR   r
  r  r  r,  r  rv   mupdf_warningsr(  r   r   r   )rN   rG   r~   cbr[  r\  rJ  r   r   r   bound~   s   



z
Page.boundc                 C   sJ   |s	| j s	|   t| j}|jsd S td|d}t| || d S )Nr   )r   r   )	
is_wrappedwrap_contentsr.   r  r:   ri   r   pdf_filter_page_contentsr   )rN   r   rG   r   r   r   r   r      s   
zPage.clean_contentsc                 C   s<   t |  |  }|jst| j}nt| }t|}|S )zThe CropBox.)	r   r  ri   r.   r	  r:   r~  rz   r   )rN   rG   r~   r   r   r   r     s   zPage.cropboxc                 C   r  rK   )r  r;  rW   r   r   r   cropbox_position   r  zPage.cropbox_positionc                 C   s   t |  t | |  }	 t|j}|snt|| qt|j}t||j t|}|r>d|_t	
| |_||jjt|< |  |S )z!Delete annot and return next one.r   T)r   r  r  r:   JM_delete_annotr.   r  rI   rZ   r$  r  rR   r  r/  r[   )rN   rO   rG   r  	nextannotr~   r   r   r   delete_annot   s$   

zPage.delete_annotc           	         s  t  t tsdS  fdd}tj}|js| S  t }|dk r)| S t|	 t
d}|js9| S t|}|dkrE| S d}t|D ]}tt||}||kr\ nqK||krd| S t|| t| | t|	 t
d| t| | S )zDelete a Link.Nc                     sD    d dkrd S z d } j |  }|  W tS    t  Y tS )Nr{   r   r/  )r  r[   r   r~   )linkidlinkobjlinkdictrN   r   r   finished   s   

z"Page.delete_link.<locals>.finishedr   r   r   )r   r7   rf   r.   r  r:   ri   rl   rp   rz   rq   r  r   rk   r  r  r^  r   r   r  )	rN   r	  r	  rG   r{   r  r  oxrefr   r   r	  r   delete_link   s:   

zPage.delete_linkc                 C   s<   t rt| jS |  }|jstttjj	S tt
|S )zReflects page de-rotation.)r   r   Page_derotate_matrixr:   r  ri   r   r.   r   UNITrz  )rN   r  r   r   r   r     s   zPage.derotation_matrixc           	      C   s`   | j }|j }t|tjsJ t }||_t|}t||}t|||t	  t
| d S rK   )r:   r7   r.   rX  rW  r%  r9  r  r	  r  r	  )	rN   r	  r%  r?  rG   r  r[  rD  r	  r   r   r   extend_textpage   s   zPage.extend_textpagec                 C   sX   t |  |  }|sdS t|}|jsdS t|}d|_t| |_	|| j
t|< |S )zFirst annotation.NT)r   r  r.   pdf_first_annotri   rI   rZ   r$  r  rR   r  r/  )rN   rG   rO   r~   r   r   r   first_annot!  s   
zPage.first_annotc                 C   rV   )z$
        First link on page
        )
load_linksrW   r   r   r   
first_link!  s   zPage.first_linkc                 C   sr   t |  d}|  }|sdS t|}|jsdS t|}d|_t| |_	|| j
t|< t }t|| |}|S )zFirst widget/field.r   NT)r   r  r.   pdf_first_widgetri   rI   rZ   r$  r  rR   r  r/  r  rv   r  )rN   rO   rG   r~   r  r   r   r   first_widget!  s    
zPage.first_widgetc                 C   sx   t |  | j}|dkr| d | j}g }|rdnd}t||}t||t t  t	| |dkr:| | |S )Nr   TF)
r   r  r  r:   JM_new_bbox_devicer.   r	  r   r  r	  )rN   layersrs	  rG   r  
inc_layersr	  r   r   r   get_bboxlog.!  s   



zPage.get_bboxlogc           
      C   s  t |  | j}|dkr| d | j}t|tjrt|}t|tjs,J d| j|r0dnd}t|}t	rBt
||||}n5t }t|sM|durTt|||}	nt|||}	tddddd|j|	_t||	t t  t|	 |dkr| | t|s|durdS |S )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFNr   r   )r   r  r  r:   r7   r.   rD   rE   r	  r   r   get_cdrawingsr  callableJM_new_lineart_device_Devicer   r2  ptmr	  r  r	  )
rN   extendedcallbackmethodrs	  rG   clipsprectr  r	  r   r   r   r	  >!  s0   




zPage.get_cdrawingsc           	      C   s   t |  g }t| j}| }t|tj}t|r:t|}t	|D ]}t
||}t|}|| q%|S |jrGt|}|| |S )zGet xrefs of /Contents objects.)r   r.   r  r:   rz   rp   PDF_ENUM_NAME_Contentsr{  r  r   r  rk   r)  ri   )	rN   r&   rG   rz   r  r   r   icontr{   r   r   r   get_contents]!  s    




zPage.get_contentsc                 C   s4   t |  |rt| j}t|S t| j}t|S )z|
        Make a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.
        )r   r.   fz_new_display_list_from_pager:   &fz_new_display_list_from_page_contentsr  )rN   r  r  r   r   r   get_displaylisto!  s   zPage.get_displaylistFr	  c                 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-likes, rect-likes, quad-likes
        of the C version to respective Point / Rect / Quad objects.
        It also adds default items that are missing in original path types.
        )
	closePathrc   rR  r  lineCaplineJoinr  stroke_opacityfill_opacityeven_odd)r	  r>   rZ  r_   scissorr=  r  r   r   Nr]  quc                 S   rt  r   r:  r  r   r   r   r  !  r  z%Page.get_drawings.<locals>.<listcomp>r  )
r	  r   r  rp  r   Quadr  r)  r"   object)rN   r	  allkeysr~   r   npathr  newitemsr  cmdrestr  DrawpathDrawpathlistget_lineartr   r   r   get_drawings|!  s2   
zPage.get_drawingsc                 C      t |  | jj| j|dS )z)List of fonts defined in the page object.r  )r   rR   r  r  rN   r  r   r   r   	get_fonts9"     zPage.get_fontsc                    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    t  | 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.
        rQ  r   r   z!need item of full page image listc                    s   g | ]
} |d  kr|qS )r!  r   r  r{  r   r   r  V"      z'Page.get_image_bbox.<locals>.<listcomp>Tr   zbad image namez!found multiple images named '%s'.)r  )r   rR   r  r  r   r   r   r>   r  r  r  r  r  r  get_image_rectsr   r  JM_image_reporterr  r	  r_   util_hor_matrixlllrr=  r  ur)rN   r#   r  r   inf_rectnull_matr  r  imglistr{   r  r~   r%   r  r   hmr\  r[  m0r   r   r{  r   get_image_bbox>"  sf   

	
zPage.get_image_bboxc                 C   r	  )z*List of images defined in the page object.r	  )r   rR   r  r  r	  r   r   r   
get_images~"  r	  zPage.get_imagesc                 C   sX   g }|   D ]#\}}| jj|dd}d|v rd}nd|v r d}nq||||f q|S )zGet OCGs and OCMDs used in the page's contents.

        Returns:
            List of items (name, xref, type), where type is one of "ocg" / "ocmd",
            and name is the property name.
        Tr  r	  r&  r	  ocmd)r	  rR   r  r)  )rN   r  pnamer{   r   octyper   r   r   get_oc_items"  s   zPage.get_oc_itemsc                 C   s   t |  t| j}t|}|}|dkrtjntj}t||}td}t	|}t
||j|j |j|j |d}	t| j|	|t  t|	 t|}
|
S )zMake SVG image from page.r      )r   r.   r	  r:   r9  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr  r  r  fz_new_svg_devicer0  r1  r2  r3  r	  r  r	  r<  )rN   r?  text_as_pathr  rD  tboundstext_optionr   r6  r	  r   r   r   r   get_svg_image"  s&   




zPage.get_svg_imagerG   c                 C   sD   |}|d u r|   }nt|d| krtd||}|d u r ~|S )NrR   znot a textpage of this page)r]  rS   r   extractTextbox)rG   r_   textpager  r  r   r   r   get_textbox"  s   

zPage.get_textboxrZ  r%  rY  c              	   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| |_t|}|S )Nr   r   )r%  r?  )	r   r   r  r  r	  r$  r  rR   rY  )rN   rZ  r%  r?  rs	  r
  r   r   r   r]  "  s"   


zPage.get_textpagec                 C   s   t |  | j}|dkr| d | j}g }trt|}nt|}t|}t	||t
 t  t| |dkr@| | |S r  )r   r  r  r:   r   r   JM_new_texttrace_devicer.   r	  r	  r   r  r	  )rN   rs	  rG   r  r	  r	  r   r   r   get_texttrace"  s   



zPage.get_texttracec                 C   r%  )z,List of xobjects defined in the page object.)r   rR   r  r  rW   r   r   r   get_xobjects"  s   zPage.get_xobjectshelvc                 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	 tyj   Y nw |dk rz	||}d}W n	 ty   Y nw | 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   rb  r   zbad fontname chars r   )rk  rm  ro  rn  )rl  china-ssjapan-skorea-sr  r#   zbad fontfile)fontdict)rR   r   rp  r=  r>  rS  	CheckFontCheckFontInfoget_char_widthsrs  r"   r8  rw  rt   rp  r  rq  rr  r>   rT   r  r#   rI	  )rN   ra   r  r  rG	  r  rP  r   rp  	inv_charsr  r{   r  r  
CJK_number
CJK_list_n
CJK_list_srq  fontfile_strr~   r
  r   r   r   insert_font"  st   












zPage.insert_fontc                 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)rS   read_contentsrd  r!
  )rN   rt  r   r   r   r	  8#  s   zPage.is_wrappedc                 C   s>   t | j}|jsdS t | td}|jsdS t |S )zPage language.NLang)r.   r  r:   ri   r  rz   rq   pdf_to_str_buf)rN   r  rw  r   r   r   rx  F#  s   
zPage.languagec                 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.
        Nr7  )getLinks)rN   kinds	all_linkslinkr   r   r   r  Q#  s   z
Page.links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 a string or integerT)r   r>   rT   r  r   rL	  rZ   r$  r  rR   r  r/  )rN   r+
  r{   r#   r~   r   r   r   r	  ^#  s   zPage.load_annotc                 C   s   t |  t| j}|jsdS t|}d|_t| |_	|| j
t|< d|_d|_| j	jrJ|  }dd |D }|rH|d }|d |_|d |_|S d|_d|_|S )zGet first Link.NTr   r,   c                 S   s   g | ]}|d  t jkr|qS r  r  r  r   r   r   r  #  s    z#Page.load_links.<locals>.<listcomp>r   )r   r.   fz_load_linksr:   ri   r  rZ   r$  r  rR   r  r/  r{   r
  r  )rN   r~   r`  link_idr   r   r   r	  u#  s*   

zPage.load_linksc                 C   sl   t |  t| j}t| t||}|}|s|S d|_t| |_	|| j
t|< t }t|| |}|S )zLoad a widget by its xref.T)r   r.   r  r:   rk  JM_get_widget_by_xrefrZ   r$  r  rR   r  r/  r  rv   r  )rN   r{   rG   rO   r~   r  r   r   r   load_widget#  s   
zPage.load_widgetc                 C   s>   t |  |  }|jst| j}t|S t| }t|S )zThe MediaBox.)	r   r  ri   r.   r	  r:   JM_mediaboxrz   r   )rN   rG   r_   r   r   r   r  #  s   zPage.mediaboxc                 C   s   t | jj| jjS rK   )r:  r  r0  r2  rW   r   r   r   mediabox_size#  r  zPage.mediabox_sizec                 C   
   t | S )z7All /Contents streams concatenated to one bytes object.)rv   _get_all_contentsrW   r   r   r   r$
  #  r  zPage.read_contentsc                 C   s"   t |  | j}|| }|| _dS )z-Refresh page after link/annot/widget updates.N)r   rR   r  r:   )rN   r   rG   r   r   r   refresh#  s   

zPage.refreshc                 C   s8   t |  t| jtjr| jnt| j}|sdS t|S )zPage rotation.r   )r   r7   r:   r.   rD   r  JM_page_rotationr	  r   r   r   r  #  s
    zPage.rotationc                 C   s   t t| S )zReflects page rotation.)r   rv   _rotate_matrixrW   r   r   r   rotation_matrix#     zPage.rotation_matrixc                 C   s(   t |  t| j|jt|t  dS )z=Run page through a device.
        dw: DeviceWrapper
        N)r   r.   r	  r:   r  r9  r  )rN   r  r   r   r   r   r  #  s    zPage.runc                 C      |  d|S )zSet the ArtBox.r\	  ra	  rN   r_   r   r   r   
set_artbox#  r  zPage.set_artboxc                 C   r9
  )zSet the BleedBox.rZ	  r:
  r;
  r   r   r   set_bleedbox#  r  zPage.set_bleedboxc                 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.rj  r  r   r  zxref is no streamrl  r)  N)
r   rR   r  r   r
  r   r;  r9  r  r{   )rN   r{   r   r   r   r   set_contents#  s   
zPage.set_contentsc                 C   r9
  )z,Set the CropBox. Will also change Page.rect.rY	  r:
  r;
  r   r   r   set_cropbox#  r  zPage.set_cropboxc                 C   s`   t |  t| j}t| |st| td dS t|}t	|jtt
tt| dS )zSet PDF page default language.r%
  N)r   r.   r  r:   rk  r   rz   rq   r  r  r%
  ru  r&  )rN   rx  r  rw  r   r   r   r  #  s   

zPage.set_languagec                 C   s   t |  |  }t| t|}t|st|rttt	|
 td| t|
 td t|
 td t|
 td t|
 td dS )zSet the MediaBox.MediaBoxrY	  r\	  rZ	  r[	  N)r   r  rk  r  r.   r  r  r   r  r   rz   rq   r   )rN   r_   rG   r  r   r   r   set_mediabox$  s   
zPage.set_mediaboxc                 C   s>   t |  t| j}t| t|}t| td| dS )zSet page rotation.r   N)	r   r.   r  r:   rk  JM_norm_rotationr   rz   rq   )rN   r  rG   r  r   r   r   r  $  s
   zPage.set_rotationc                 C   r9
  )zSet the TrimBox.r[	  r:
  r;
  r   r   r   set_trimbox$  r  zPage.set_trimboxc                 C   s~   t |  t }|  }|jst|S ttjj}t||| t|}| j	d dkr2t
|}|S t
ddddd| jj}|S )zPage transformation matrix.r  r   r   r   )r   r.   r   r  ri   r   r   r  ry  r  r   r  r,  )rN   rD  rG   r  r~   r   r   r   r    $  s   zPage.transformation_matrixc                 C   r	  )zThe TrimBoxr[	  Nr   r   r   r   r	  r	  r   r   r   trimbox3$  r	  zPage.trimboxc                 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   s    g | ]}|d  t kr|d qS r  )r  r	  r   r   r   r  F$  r  z Page.widgets.<locals>.<listcomp>N)r  r/
  rV  )rN   r	  widget_xrefsr{   r  r   r   r   widgets<$  s   

zPage.widgetsc                 C   s0   | j rd S t| dd t| dd d| _d S )Nr  Fs   
QT)r	  rv   _insert_contentsr!
  rW   r   r   r   r	  M$  s
   
zPage.wrap_contentsc                 C   r%  r&  r'  rW   r   r   r   r{   T$  r(  z	Page.xrefzpage rectangle)r   r  )r  NNNNr   r   rQ  r  rK   )Nr   N)NNNNNr   r   r   r   r   r   r   r   NN)r   r   N)Nr   r   N)r   Nr   r   NNNr  )r  rp	  )NNr  r   NNT)r	  r  r   NrR  r  )r
  NNFr   r   )r  r  r  rP   rU   rX   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r[   rW  r  r	  r	  r	  rF	  rI	  rL	  rN	  rQ	  r  r 	  rX	  ra	  r	  ro	  r3   rt	  r5   rw	  rS  rU  rT   ry	  r  r  r  rz	  r	  r  r	  r	  r	  r	  r	  r  r	  r	  r	  r	  r	  r	  r  r	  r	  r  r	  r  r  r	  r	  r	  r   r  r	  r	  r	  r   r  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r 
  r
  r
  rC   r
  r]  r
  r
  r 
  r	  rx  r  rT  r	  r	  r/
  r  r1
  r$
  r4
  r  r7
  r  r<
  r=
  r>
  r?
  r  rA
  r  rC
  r   rD
  rF
  r	  r{   r_   r   r   r   r   rC     s   
>!*#			 *		"7
	

!
	

>

	

,	


 >@
S










rC   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	daddZ
dbddZdcddZedd Zdd Zedd Zdd Zedd Zdcdd Zed!d" Zed#d$ Zed%d& Zed'd( Zddd*d+Zded.d/Zd0d1 Zd2d3 Zd4d5 Zed6efd7d8Zed9d: Zed;d< Zdfd>d?Z dgd@dAZ!dhdCdDZ"dEdF Z#dGdH Z$dIdJ Z%dKdL Z&dMdN Z'edOdP Z(edQdR Z)dSdT Z*edUdV Z+dWdX Z,edYdZ Z-ed[d\ Z.ed]d^ Z/ed_d` Z0e+Z1eZ2dS )ir>  c           8      G   s:  	 t |tjtjftjtjttt	fr*|\}}d}t
|t|td|}|| _dS t |tjtjftjtjttt	fttfrU|\}}}t
|t|td|}|| _dS t |tjtjr|\}}t|jsktd|jrt|ttdtdt d| _dS t|| _| jjsttdS t |tjtjr|\}}|}|}	|jst|	}
|
jstt|
S t||	}
|
S t |ttjfttfttfdrJ d|dt |t%tjr|d dkr|\}}|| _dS t |ttjftdfrn|d }t&|dkr|d nd}t|tr|jn|}t'|ddstd	t|}|js+|s+td
t }t(|}t)|}t*|}t+|||||}|jj!|j_!|jj"|j_"|jj,|j_,|jj-|j_-	 t.|j|j| || _dS t |tjtjfttdttfr|\}}}}$}t|tjr|j}t|tjsJ t6|}|| | }%t }t+|||||}t|$t7t8frt9d t:|$}&t&|$}nt;|$}'|'jstdt<|'\}}(t:|$}&|%| |krtd|d|d|d|d|%d|t=|j|& || _dS t |dr|\})d}*t>|)dr%|)? }+|+r$t@|+},n4t>|)|*r7|)jA}+|+r6t@|+},n"t|)t%rCt@|)},nt;|)}'|'jrP|'jj&sTtdtB|'},tC|,ttDtDtEtEtF|,G dd|,H dd\}}}tI|,\}-}.|-|_,|.|_-|| _dS t |tJtjKftr|\}/}0tL|/}1tM|1 tN|1}2t'|0d|2d sttOtP|1|0d}3tQ|3tRd}4tS|4tRdstS|4tRdstS|4tRdsttTtU|1|3},tC|,ttDtDtEtEtF|,G dd|,H dd\}5}}|5| _dS d}6|D ]}7|6dtV|7 d|7 d7 }6qtW|6)a  
        Pixmap(colorspace, irect, alpha) - empty pixmap.
        Pixmap(colorspace, src) - copy changing colorspace.
        Pixmap(src, width, height,[clip]) - scaled copy, float dimensions.
        Pixmap(src, alpha=1) - copy and add or drop alpha channel.
        Pixmap(filename) - from an image in a file.
        Pixmap(image) - from an image in memory (bytes).
        Pixmap(colorspace, width, height, samples, alpha) - from samples data.
        Pixmap(PDFdoc, xref) - from an image at xref in a PDF document.
        r   z"source colorspace must not be Noner   NzCannot handle args=zY because fz_scale_pixmap() and fz_scale_pixmap_cached() are not declared in MuPDF headersrawr   zbad alpha valuez'cannot drop alpha for 'NULL' colorspace   z using mupdf.python_buffer_data()zbad samples datazbad samples length w=z h= alpha=z n=z stride=z size=r#   resolvezbad image datar  rz  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    r   r  )Xr  r  r  r.   r  r   FzIrectIRectr   r  fz_new_pixmap_with_bboxr  r<  r:   r  r  FzPixmapfz_pixmap_colorspaceri   r   r	  cspacr	  r   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskr>  r  r7   r  fz_scale_pixmap_cachedr~  r  fz_scale_pixmaprn  rT   r  r  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  ll_fz_pixmap_copyfz_pixmap_samples_memoryviewrB  strider   r   fz_samples_setfz_samples_getr  r   r  r   r5  r   rm  ll_fz_pixmap_copy_rawr  rX   fz_new_image_from_filer#   r  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTr   r[  r\  r  r8   r;   rA   rk  r  r  r  rp   rq   ro  r	  r  r>   rt   )8rN   r  rE  r_   rB  r  spixmpixspmmpmr  r[  r\  rZ  src_pixr   rS  sepsr   src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr  r~  pm_isrc_ir   src_pix_alphar   samplesra
  samples2r   r  	imagedatar#   rF  r.  r  r  r   r{   r   r  r9	  r   rF  r   argr   r   r   rP   a$  s&  





	







4 



,








zPixmap.__init__c                 C   r  rK   )r  rW   r   r   r   rN  b%  rO  zPixmap.__len__c                 C   sB   t | turd S | jrd| jjjj| j| jf S dd| j| jf S )NzPixmap(%s, %s, %s)r  )r>   r>  rA  r:   ri   r#   irectrB  rW   r   r   r   rU   e%  s   zPixmap.__repr__c                 C   s   | j }t||  }t|}t|}|dkr!t|| n>|dkr,t|| n3|dkr7t|| n(|dkrBt	|| n|dkrMt
|| n|dkrYt||| nt|| t|}|S )z!
        Pixmap._tobytes
        r   r   r   r  rz  r!  )r:   r.   fz_pixmap_strider\  r  r  fz_write_pixmap_as_pngfz_write_pixmap_as_pnmfz_write_pixmap_as_pamfz_write_pixmap_as_psdfz_write_pixmap_as_psfz_write_pixmap_as_jpegr   )rN   format_jpg_qualityr  r  r   r6  barrayr   r   r   _tobytesl%  s   

zPixmap._tobytesc                 C   s   | j }|dkrt|| d S |dkrt|| d S |dkr't|| d S |dkr3t|| d S |dkr?t|| d S |dkrLt||| d S t|| d S )Nr   r   r   r  rz  r!  )r:   r.   fz_save_pixmap_as_pngfz_save_pixmap_as_pnmfz_save_pixmap_as_pamfz_save_pixmap_as_psdfz_save_pixmap_as_psfz_save_pixmap_as_jpeg)rN   r   r
  r
  r  r   r   r   	_writeIMG%  s   zPixmap._writeIMGc                 C   r  )z$Indicates presence of alpha channel.)r.   fz_pixmap_alphar:   rW   r   r   r   rB  %  r  zPixmap.alphaNc                 C   sH   |du rt | j dS |du rt | j| dS t| j|t| dS )z*Fill all color components with same value.N)r.   fz_clear_pixmapr:   fz_clear_pixmap_with_valueJM_clear_pixmap_rect_with_valuer  )rN   r  r   r   r   r   
clear_with%  s
   zPixmap.clear_withr   c                 C   s,   | j }t||}|stt|st|S |S )z-
        Return count of each color.
        )r:   JM_color_countr   MSG_COLOR_COUNT_FAILEDr  )rN   rx   rZ  r  r  r   r   r   color_count%  s   
zPixmap.color_countc                 C   s|   d}d}|dkr| j t|v r| j }| jd|d D ]\}}||7 }||kr+|}|}q|s8dtdg| j fS || |fS )z/Return most frequent color and its usage ratio.r   NT)rx   rZ  r   rJ
  )r
  r   r
  r  r   r   )rN   rZ  	allpixelscntpixelr  maxpixelr   r   r   color_topusage%  s   zPixmap.color_topusagec                 C   rJ  )zPixmap Colorspace.)r  r.   rT
  r:   rW   r   r   r   rA  %  r  zPixmap.colorspacec                 C   sT   | j }|j }t|std| | krtdt||t|td dS )zCopy bbox from another Pixmap.z'cannot copy pixmap with NULL colorspacez%source and target alpha must be equalN)r:   r.   rT
  r   rB  fz_copy_pixmap_rectr  r	  )rN   r/  r   r  rm
  r   r   r   r  %  s   
zPixmap.copyc                 C   rM  )zMD5 digest of pixmap (bytes).)r.   r	  r:   r   rO  r   r   r   r<	  %     zPixmap.digestc                 C   s*   t | jstd dS t | j| dS )z=Apply correction with some float.
        gamma=1 is a no-op.zcolorspace invalid for functionN)r.   rT
  r:   rj   fz_gamma_pixmap)rN   gammar   r   r   
gamma_with%  s   zPixmap.gamma_withc                 C   r  )zThe height.)r.   r]
  r:   rW   r   r   r   r\  %  r  zPixmap.hc                 C   sF   | j }t|std dS t|}t|rt|}tt||S )z Invert the colors inside a bbox.zignored for stencil pixmapF)	r:   r.   rT
  rj   r  r  fz_pixmap_bboxr  JM_invert_pixmap_rect)rN   r   r  r   r   r   r   invert_irect%  s   


zPixmap.invert_irectc                 C   rM  )zPixmap bbox - an IRect object.)r.   r
  r:   JM_py_from_irectr  r   r   r   r
  %  r
  zPixmap.irectc                 C   r  )zCheck if pixmap is monochrome.)r.   fz_is_pixmap_monochromer:   rW   r   r   r   is_monochrome%  r  zPixmap.is_monochromec                 C   s^   | j }| }| |  | }t|d|}t|||D ]}t|||}||kr, dS qdS )z5
        Check if pixmap has only one color.
        r   FT)r:   r   r[  r\  _pixmap_read_samplesr   )rN   r  r   r  sample0offsetsampler   r   r   is_unicolor%  s   zPixmap.is_unicolorc                 C   s*   t rdd }t|| j_| jS t| jS )zThe size of one pixel.c                 S   r  rK   )r   pixmap_nr:   rW   r   r   r   n2&  r  zPixmap.n.<locals>.n2)r   r  r  r   r.   fz_pixmap_componentsr:   )rN   r
  r   r   r   r   %  s
   zPixmap.nr   c                 C   sx   t s|stdt }||_|r|| |r|| | j}t|t	r/t
||d| dS t|}t||| dS )z4
        Save pixmap as an OCR-ed PDF page.
        'No OCR support: TESSDATA_PREFIX not setr   N)r1   r   r.   FzPdfocrOptionsr  language_set2datadir_set2r:   r7   rT   fz_save_pixmap_as_pdfocrr4  fz_write_pixmap_as_pdfocr)rN   r   r  rx  tessdatar  rF  r6  r   r   r   pdfocr_save&  s   


zPixmap.pdfocr_saveTengc                 C   s<   t s|std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.
        r
  r   r#  )r  rx  r
  )r1   r   r  r  r
  r  )rN   r  rx  r
  r  r$  r   r   r   pdfocr_tobytes&  s   zPixmap.pdfocr_tobytesc                 O   s   zddl m} W n ty   td  w | j}|du rd}n |jdkr.| jdkr+dnd}n|jdkr=| jdkr:d	nd
}nd}||| j| j	f| j
}d| vrY| j| jf|d< |j|i | dS )zWrite to image file using Pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of save when other output formats are desired.
        r   )rz  zPIL/Pillow not installedNrv  r   LAr   r  RGBAr  r@  )PILrz  ImportErrorr   rA  r   rB  	frombytesr  r,  r{
  r  r  r  r  )rN   r  kwargsrz  cspacemoder.  r   r   r   pil_save0&  s$   

zPixmap.pil_savec                 O   s2   ddl m} | }| j|g|R i | | S )zConvert to binary image stream using pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of 'tobytes' when other output formats are needed.
        r   r#  )r  r  r
  r  )rN   r  r
  r  	bytes_outr   r   r   pil_tobytesM&  s   zPixmap.pil_tobytesc                 C   s   t rt| jj||S 	 |dk s"|| jjjks"|dk s"|| jjjkr'ttt	 | jjj
}| jjj}|| ||  }t| j|||  }|S )zXGet color tuple of pixel (x, y).
        Last item is the alpha if Pixmap.alpha is true.r   )r   r   pixmap_pixelr:   ri   r[  r\  r  MSG_PIXEL_OUTSIDEPyExc_ValueErrorr   ra
  r  
samples_mv)rN   r~  r  r   ra
  r   r&   r   r   r   r
  X&  s   


zPixmap.pixelr  c                 C   s   | j }t|S rK   )r
  r   )rN   mvr   r   r   r{
  j&  s   zPixmap.samplesc                 C   r  )z,
        Pixmap samples memoryview.
        )r.   r`
  r:   rW   r   r   r   r
  o&     zPixmap.samples_mvc                 C   r  rK   )r.   fz_pixmap_samples_intr:   rW   r   r   r   samples_ptrv&  r  zPixmap.samples_ptr_   c                 C   s
  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 r8tj|\}}|dd
 }|| d
}|d
krRt	d| dt
|  | jr_|dv r_t	d| | jrr| jjdkrr|dv rrt	d| |dkr~| | j| j | |||S )zOutput as image in format determined by filename extension.

        Args:
            output: (str) only use to overrule filename extension. Default is PNG.
                    Others are JPEG, JPG, PNM, PGM, PPM, PBM, PAM, PSD, PS.
        r   r   r   r  rz  r!  )
r  pnmpgmppmpbmpampsdpsjpgjpegr  r#   NImage format  not in r   rz  r!  z'%s' cannot have alphar   r   r  zunsupported colorspace for '%s')r>   rT   r  r#   r
   r   splitextr"   r8  r   r  r  rB  rA  r   r=  r  r  r
  )rN   r   r  r
  valid_formatsrS  r  rp  r   r   r   r  z&  s<   


zPixmap.savec                 C   sZ  | j }d}d}| dkrttt|}t|}	t|}
|	|
 |d  }g d}g d}d}d}|rRt|t	t
frRt||krRt|D ]}|| ||< qGd}|rpt|t
t	frpt||krpt|D ]}|| ||< qed}t }d}|rt|ttfr|}t|}n	J dt| ||	|
 k rtd	 t||||t||j||||
 d	S )
a  Set alpha channel to values contained in a byte array.
        If omitted, set alphas to 255.

        Args:
            alphavalues: (bytes) with length (width * height) or 'None'.
            premultiply: (bool, True) premultiply colors with alpha values.
            opaque: (tuple, length colorspace.n) this color receives opacity 0.
            matte: (tuple, length colorspace.n)) preblending background color.
        r   r   r   r   r   r   z!unexpected type for alphavalues: zbad alpha valuesrJ
  c                 S   s    | | d }||d 7 }|d S )N   r  r   )r2  r-  r~  r   r   r   	fz_mul255&  s   z#Pixmap.set_alpha.<locals>.fz_mul255N)r:   rB  r   rW
  r.   r[
  r\
  r]
  r7   r  r  r  r   r   r  r>   Pixmap_set_alpha_helperr5  ri   rc
  rb
  r  pixsamples_set)rN   alphavaluespremultiplyopaquematterF  rB  r   r   r[  r\  balenrx   r  zero_outbgroundr   r  data_lenr  r   data_fixr
  denomr   r   r   	set_alpha&  sV   




zPixmap.set_alphar  c                 C   s   ddddddddddddd}| | d	}|d	kr)td
| dt|  | jr4|dv r4td| jrE| jjdkrE|dv rEtd|dkrQ| | j	| j
 | ||}|S )zA
        Convert to binary image stream of desired type.
        r   r   r   r  r  rz  r!  )r  r
  r
  r
  r
  r
  tgatpicr
  r
  r
  r
  Nr
  r
  r
  z'{output}' cannot have alphar
  z%unsupported colorspace for '{output}')r"   r8  r   r  r  rB  rA  r   r=  r  r  r
  )rN   r  r
  r
  rp  r
  r   r   r   r  '  s0   zPixmap.tobytesc                 C      | j }||j_||j_dS )z"Set resolution in both dimensions.N)r:   ri   r  r  )rN   r  r  r  r   r   r   r=  #'     zPixmap.set_dpic                 C   r
  )zSet top-left coordinates.N)r:   ri   r~  r  )rN   r~  r  r  r   r   r   
set_origin)'  r
  zPixmap.set_originc           
      C   s   | j }t|d| d rt|d| d stt| }t }t|D ]}|| }t|dds6tt	|
t| q&t|}	|	| ||  }t|D ]}|| |jj|| < qOdS )zSet color of pixel (x, y).r   r   rJ
  N)r:   r  r[  r\  r   r
  r   r  r   MSG_BAD_COLOR_SEQr)  r  r.   r
  ri   r{
  )
rN   r~  r  rR  r  r   r  r   r   ra
  r   r   r   	set_pixel/'  s   (
zPixmap.set_pixelc           	      C   sf   | j }| }g }t|D ]}|| }t|ddstt|| qt|}t|||}t	|}|S )z Set color of all pixels in bbox.r   rJ
  )
r:   r   r   r  r   r
  r)  r  JM_fill_pixmap_rect_with_colorr  )	rN   r   rR  r  r   r  r   r   r  r   r   r   r  @'  s   zPixmap.set_rectc                 C   s&   |dk r
t d dS t| j| dS )zgDivide width and height by 2**factor.
        E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)rj   r.   fz_subsample_pixmapr:   )rN   factorr   r   r   shrinkO'  s   zPixmap.shrinkc                 C   s   | j }| |  |  S )zPixmap size.)r:   r   r[  r\  )rN   r  r   r   r   r  W'  s   zPixmap.sizec                 C   
   | j  S )z%Length of one image line (width * n).)r:   ra
  rW   r   r   r   ra
  a'  rs  zPixmap.stridec                 C   s.   | j r	| j jdkrtd dS t| j||S )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)rA  r   r   r.   fz_tint_pixmapr:   )rN   blackwhiter   r   r   	tint_withf'  s   zPixmap.tint_withc                 C   r  )z
The width.r.   r\
  r:   rW   r   r   r   r[  m'  r  zPixmap.wc                 C   sL   t |  |jstdt|}|j|j|j|jg}t	| j
|||}t|S )z!Return pixmap from a warped quad.zquad must be convex)EnsureOwnership	is_convexr   r  r  r	  r	  r	  r.   fz_warp_pixmapr:   r>  )rN   rh  r  r,  r  rd  r  r   r   r   warpr'  s   zPixmap.warpc                 C   r  )zx component of Pixmap origin.)r.   fz_pixmap_xr:   rW   r   r   r   r~  {'  r  zPixmap.xc                 C   r
  )zResolution in x direction.)r:   r  rW   r   r   r   r  '  rs  zPixmap.xresc                 C   r  )zy component of Pixmap origin.)r.   fz_pixmap_yr:   rW   r   r   r   r  '  r  zPixmap.yc                 C   r  )zResolution in y direction.r
  rW   r   r   r   r  '  r  zPixmap.yresrP  rH
  rK   )r   NN)Tr
  N)Nr
  )Nr   NN)r  r
  )3r  r  r  rP   rN  rU   r
  r
  r  rB  r
  r
  r
  rA  r  r<	  r
  r\  r
  r
  r
  r
  r   r
  r
  r
  r
  r
  r   r{
  r
  r
  r  r
  r  r=  r
  r
  r  r
  r  ra
  r
  r[  r  r~  r  r  r  r  r,  r   r   r   r   r>  _$  s      



	















)
b
	

	



r>  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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$d% Zd&d' Zed(d) ZeZeZd*S )+r:  zo
    Point() - all zeros
    Point(x, y)
    Point(Point) - new copy
    Point(sequence) - from 'sequence'
    c                 C   s   t | j| j | j| j  S rK   )r  r  r~  r  rW   r   r   r   r  '     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 Nr  r   Point: bad seq lenr   r   r  r:  r~  r  r  r   rN   r
  r   r   r   r  '  
   
zPoint.__add__c                 C   r  r  r  rW   r   r   r   r  '  r  zPoint.__bool__c                 C   r  )NrN  Fr   r  r
  r   r   r   r  '  r  zPoint.__eq__c                 C   s   | j | jf| S rK   r~  r  r  r   r   r   r  '  r  zPoint.__getitem__c                 C      t t| S rK   r*  r  rW   r   r   r   r+  '  r  zPoint.__hash__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rl|d }t|tjtjfrG|j | _ |j| _d S t	|ddu rRtdt|dkr\tdt|d | _ t|d | _d S td)	Nr  r   r  r   r   r  FzPoint: bad args)
r~  r  r  r   r  r7   r.   r|  fz_pointr  rN   r  rr  r   r   r   rP   '  s0   zPoint.__init__c                 C   r  Nr   r   rW   r   r   r   rN  '  r  zPoint.__len__c                 C   s2   t |drt| j| | j| S t| }||S Nr  )r  r:  r~  r  r  )rN   r   r
  r   r   r   r  '  s   

zPoint.__mul__c                 C   s   t | j | j S rK   )r:  r~  r  rW   r   r   r   r  '  rW  zPoint.__neg__c                 C   r  r  r  rW   r   r   r   r	  '  r  zPoint.__nonzero__c                 C   r
  rK   r	  rW   r   r   r   r  '  rY   zPoint.__pos__c                 C   r  )Nr:  r  rW   r   r   r   rU   '  r  zPoint.__repr__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   zPoint.__setitem__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   sR   t |drt| jd | | jd | S t|d }|s tdt| }||S r  )r  r:  r~  r  r  r  r  )rN   r   r  r
  r   r   r   r  '  s   

zPoint.__truediv__c                 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=  rN   r  r   r   r   abs_unit'  s
   

zPoint.abs_unitc                 G   s  t |dks
td|d }t |dkrt|}nt |dkr$t|}ntdt |dkr3|d }nd}dd	d
dd}|| d || d  }t|tu rVt| | | S t|j|j}||jB }| |v rhdS | j|j	kr| j
|jkr{| |j|S | j
|jkr| |j|S | j|j	 | S |j| j  kr|j	krn n| j
|jkr| j
|j | S |j| j
 | S | j
|jkr| |j|S | j
|jkr| |j|S |j| j | S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenr   r  z$arg1 must be point-like or rect-liker   r  )r  r  )r        R@)gRQ@r  )gffffff9@r  )r  incmmmr  )r  r   r:  r   r>   r=  top_leftbottom_rightr~  r0  r  r2  distance_tor3  	top_rightr1  bottom_left)rN   r  r~  unitur  r   r   r   r   r  (  sH   



zPoint.distance_toc                 C   s*   t |dkr
tdt| |\| _| _| S )z7Replace point by its transformation with matrix-like m.rz  r  )r  r   util_transform_pointr~  r  rP  r   r   r   r  5(  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  <(  s
   

z
Point.unitN)r  r  r  r1  r  r  r  r  r  r+  rP   rN  r  r  r	  r  rU   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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ed$d% Zed&d' Zed(d) Zed*d+ Zd,d- Zed.d/ Zd0d1 ZeZed2d3 Zed4d3 Zd5S )6r	  zz
    Quad() - all zero points
    Quad(ul, ur, ll, lr)
    Quad(quad) - new copy
    Quad(sequence) - from 'sequence'
    c                 C   s*   | j rdS t| j| j t| j| j  S Nr  )rz  r=  r  r	  r	  rW   r   r   r   r  Q(  s    zQuad.__abs__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 Nr  r  Quad: bad seq lenr   r   r   r   	r  r	  r  r	  r	  r	  r  r
  r   rN   r  r   r   r   r  V(  
   
&6zQuad.__add__c                 C      | j  S rK   rz  rW   r   r   r   r  ](  rY   zQuad.__bool__c                 C   s   z|  }W n   Y dS |dkrt|| S |dkrdS t|r9t|jr'dS t|d d | o8t|dd  | S t|rPtdD ]}t|| | sM dS qAdS dS )NFr   r  T)rN  util_point_in_quad	CheckRectr   rz  	CheckQuadr   )rN   r~  rr  r   r   r   r   r  `(  s&   

$zQuad.__contains__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 NrN  Fr  r   r   r   r   )r  r  r  r	  r	  r	  )rN   rh  r   r   r   r  t(  s   
zQuad.__eq__c                 C      | j | j| j| jf| S rK   )r  r	  r	  r	  r  r   r   r   r  ~(  r  zQuad.__getitem__c                 C   r  rK   r  rW   r   r   r   r+  (  r  zQuad.__hash__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|t	j
r_|| _t |jt |jt |jt |jf\| _| _| _| _d S t|ddu rjtdt|dkrttdtt |\| _| _| _| _d S td)Nr  r#  r   r   r  FzQuad: bad args)r:  r  r	  r	  r	  r  r   r'  r7   r.   FzQuadr:   r  r  r   r   r   rP   (  s*   4zQuad.__init__c                 C   r  Nr  r   rW   r   r   r   rN  (  r  zQuad.__len__c                 C   s   t | }||}|S rK   )r	  r  )rN   r   r  r   r   r   r  (  r  zQuad.__mul__c                 C      t | j | j | j | j S rK   )r	  r  r	  r	  r	  rW   r   r   r   r  (  r  zQuad.__neg__c                 C   r'  rK   r(  rW   r   r   r   r	  (  rY   zQuad.__nonzero__c                 C   r
  rK   )r	  rW   r   r   r   r  (  rY   zQuad.__pos__c                 C   r  )Nr	  r  rW   r   r   r   rU   (  r  zQuad.__repr__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Nr   r   r   r   r  )r:  r  r	  r	  r	  r  r  r   r   r   r  (  s   zQuad.__setitem__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  (  r&  zQuad.__sub__c                 C   sB   t |dr
d| }nt|d }|stdt| }||}|S )Nr  r  r   zMatrix not invertible)r  r  r  r	  r  )rN   r   imr  r   r   r   r  (  s   


zQuad.__truediv__c                 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_liner  r	  r	  r	  r  )rN   r   re  rf  r   r   r   r  (  s   




zQuad.is_convexc                 C   s   | j tk p	| jtk S )zsCheck whether all quad corners are on the same line.

        This is the case if width or height is zero.
        )r  r  r,  rW   r   r   r   rz  (  s   zQuad.is_emptyc                 C   r  )z(Check whether this is the infinite quad.)r_   ry  rW   r   r   r   ry  (  ry  zQuad.is_infinitec                 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)util_sine_betweenr  r	  r	  r=  r  r	  )rN   siner   r   r   is_rectangular(  s   zQuad.is_rectangularc                 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   )ry  INFINITE_QUADr   r%  r~  r  )rN   r
  r   deltar  r   r   r   r>  )  s
   z
Quad.morphc                 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 rK   )r   r  r  r~  r	  r	  r	  r1  r  r3  r8  r0  r2  rN   r   r   r   r   r_   )  s       z	Quad.rectc                 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.r  rz  r  )r  r  r   r  r	  r	  r	  rP  r   r   r   r  )  s   
zQuad.transformc                 C   "   t t| j| j t| j| j S rK   )r8  r=  r  r	  r	  r	  rW   r   r   r   r  ()  r  zQuad.<lambda>c                 C   r;  rK   )r8  r=  r  r	  r	  r	  rW   r   r   r   r  ))  r  N) r  r  r  r1  r  r  r  r  r  r  r+  rP   rN  r  r  r	  r  rU   r  r  r  r  r  rz  ry  r7  r>  r_   r  r'  r  r,  r   r   r   r   r	  I(  sD    
	





r	  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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ed(d) Zed*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zed6d7 Zed8d9 Z ed:d; Z!d<d= Z"d>d? Z#d@dA Z$edBdC Z%dDdE Z&edFdG Z'edHdI Z(dJdK Z)dLdM Z*eZ+eZ,eZ-edNdO Z.ee&Z/e'Z0e(Z1edPdO Z2dQS )Rr   z
    Rect() - all zeros
    Rect(x0, y0, x1, y1)
    Rect(top-left, x1, y1)
    Rect(x0, y0, bottom-right)
    Rect(top-left, bottom-right)
    Rect(Rect or IRect) - new copy
    Rect(sequence) - from 'sequence'
    c                 C   s(   | j s| jrdS | j| j | j| j  S r!  )rz  ry  r0  r1  r2  r3  rW   r   r   r   r  7)  s   zRect.__abs__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 Nr  r  Rect: bad seq lenr   r   r   r   r  r   r1  r3  r0  r2  r  r   r
  r   r   r   r  <)  r&  zRect.__add__c                 C   s,   t |ds	tdt|}t| }||S )NrN  bad operand 2)r  r   r   	intersectrN   r~  r1r   r   r   r   __and__C)  s
   

zRect.__and__c                 C   r  r  r  rW   r   r   r   r  K)  r  zRect.__bool__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 )Nr  r   r  F)r  r  r  util_is_point_in_rectINFINITE_RECTr   r	  r_   r1  r0  r3  r2  )rN   r~  rr  r   r   r   r   r  N)  s"   

*"zRect.__contains__c                 C   r  )NrN  Fr  r  r;
  r   r   r   r  ^)  r  zRect.__eq__c                 C   r.  rK   r1  r3  r0  r2  r  r   r   r   r  c)  r  zRect.__getitem__c                 C   r  rK   r  rW   r   r   r   r+  f)  r  zRect.__hash__c                 G   <   t | \}}}}t|| _t|| _t|| _t|| _d S rK   )util_make_rectr  r1  r3  r0  r2  rN   r  r1  r3  r0  r2  r   r   r   rP   i)  
   


zRect.__init__c                 C   r  r0  r   rW   r   r   r   rN  p)  r  zRect.__len__c                 C   sF   t |drt| j| | j| | j| | j| S t| }||}|S r  )r  r   r1  r3  r0  r2  r  )rN   r   r   r   r   r   r  s)  s
   
&
zRect.__mul__c                 C   r1  rK   )r   r1  r3  r0  r2  rW   r   r   r   r  z)  r  zRect.__neg__c                 C   r  r  r  rW   r   r   r   r	  })  r  zRect.__nonzero__c                 C   sN   t |ds	tdt| }t|dkr||S t|dkr#||S td)NrN  r?  r   r  )r  r   r   r  include_pointinclude_rect)rN   r~  r   r   r   r   __or__)  s   


zRect.__or__c                 C   r
  rK   r   rW   r   r   r   r  )  rY   zRect.__pos__c                 C   r  )Nr   r  rW   r   r   r   rU   )  r  zRect.__repr__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r2  )r  r1  r3  r0  r2  r  r  r   r   r   r  )     zRect.__setitem__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 r<  r>  r
  r   r   r   r  )  r&  zRect.__sub__c                 C   st   t |dr t| jd | | jd | | jd | | jd | S t|d }|s/td| t| }||}|S )Nr  r  r   zMatrix not invertible: )	r  r   r1  r3  r0  r2  r  r  r  )rN   r   r3  r   r   r   r   r  )  s   
6
zRect.__truediv__c                 C      t | j| jS zBottom-left corner.r:  r1  r2  rW   r   r   r   r  )  r8
  zRect.bottom_leftc                 C   rQ  zBottom-right corner.r:  r0  r2  rW   r   r   r   r  )  r8
  zRect.bottom_rightc                 C   s
   |  |S )z.Check if containing point-like or rect-like x.)r  r  r   r   r   contains)  r  zRect.containsc                 C   s2   t |dkr
tdt| |\| _| _| _| _| S )zExtend to include point-like p.r   r  )r  r   util_include_point_in_rectr1  r3  r0  r2  r
  r   r   r   rK  )     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  r=  )r  r   r   ry  rg
  rh
  r1  r3  r0  r2  rz  util_union_rectr:  r   r   r   rL  )  s   $zRect.include_rectc                 C   s   t |dks
tdt|}|jr| S | jr*|j|j|j|jf\| _| _| _| _| S |jrA|j|j|j|jf\| _| _| _| _| S | jrF| S t	| |\| _| _| _| _| S )z)Restrict to common rect with rect-like r.r  r=  )
r  r   r   ry  r1  r3  r0  r2  rz  util_intersect_rectr:  r   r   r   r@  )  s   $$zRect.intersectc                 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   rz  ry  r@  rA  r   r   r   
intersects)  s   zRect.intersectsc                 C      | j | jkp| j| jkS z True if rectangle area is empty.r1  r0  r3  r2  rW   r   r   r   rz  )     zRect.is_emptyc                 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.r1  r3  rg
  r0  r2  rh
  rW   r   r   r   ry  )     8zRect.is_infinitec                 C      | j | jko| j| jkS zTrue if rectangle is valid.r^  rW   r   r   r   is_valid)  r_  zRect.is_validc                 C      | j rt S | j||S zGMorph with matrix-like m and point-like p.

        Returns a new quad.ry  r8  rh  r>  rN   r
  r   r   r   r   r>  )     z
Rect.morphc                 C   r  )Nc                 S   r  r   r   r  r   r   r   r  *  r  zRect.norm.<locals>.<listcomp>r  rW   r   r   r   r(  *  r  z	Rect.normc                 C   @   | j | jk r| j | j| _| _ | j| jk r| j| j| _| _| S )z*Replace rectangle with its finite version.r0  r1  r2  r3  rW   r   r   r   	normalize*  
   zRect.normalizec                 C      t | j| j| j| jS z!Return Quad version of rectangle.r	  r;  trblr<  rW   r   r   r   rh  *  re  z	Rect.quadc                 C   r  )zReturn the IRect.)rQ
  util_round_rectrW   r   r   r   r  *  r  z
Rect.roundc                 C   rQ  zTop-left corner.r:  r1  r3  rW   r   r   r   r  *  r8
  zRect.top_leftc                 C   rQ  zTop-right corner.r:  r0  r3  rW   r   r   r   r  *  r8
  zRect.top_rightc                 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   ry  rz  r   r   r1  r3  r  r,  r:  r   r   r   torect *  s   zRect.torectc                 C   s2   t |dks
tdt| |\| _| _| _| _| S )z1Replace with the transformation by matrix-like m.rz  r  )r  r   util_transform_rectr1  r3  r0  r2  rP  r   r   r   r  ,*  rX  zRect.transformc                 C      t | j| j S rK   )r=  r2  r3  rW   r   r   r   r  7*      zRect.<lambda>c                 C   r~  rK   )r=  r0  r1  rW   r   r   r   r  ;*  r  N)3r  r  r  r1  r  r  rC  r  r  r  r  r+  rP   rN  r  r  r	  rM  r  rU   r  r  r  r  r  r  rV  rK  rL  r@  r[  rz  ry  re  r>  r(  rm  rh  r  r  r  r|  r  r'  rs  r<  r,  r
  r;  rr  r  r   r   r   r   r   ,)  sp    












r   c                )   @   s  e Zd ZdZdefddZdXdeddfd	d
ZdedededefddZ	dede
fddZdededefddZdedefddZdejeef fddZdefddZdefd d!Zd"efd#d$Z	dXded%ed&e
d'efd(d)Z	*dYdedefd+d,Z	*dYdeded-e
fd.d/Z	0	1		2	2		3			0	0	2dZd4e
d5ed6ed7ed8ed9ed:ed;ed<ed=e
d>e
d?eddfd@dAZedBdC Z	D		E		2	2			2	0	2		0	0	2d[d%edFeje ef dGe
dHe!dIe dJedKedLed5ed6edMedNe
dOed;ed>e
d=e
d?edef$dPdQZ"	E		D		2	2			0	0	2	2	2		0	0	2d\d"edFeje ef dIedJedGe
dHe!dKedLed5ed6edRedNe
dSedMedOed;ed>e
d=e
d?ede
f(dTdUZ#dVdW Z$dS )]ShapezCreate a new shape.rG   c                 C   s   t | || _|j| _| jjstd|jj| _|jj	| _
|jj	| _	|jj| _|j| _| j | _d| _d| _d| _d | _d | _d S )Nr  r,   )r   rG   rR   r   r
  r   r1
  r  r,  r~  r  r	  r   pctmipctmr  	text_cont	totalcontr  r_   r	  r   r   r   rP   A*  s    





zShape.__init__Tr,	  r  Nc                 C   st   t | j |  j| j7  _| j | _| jdkr)t| jd|}t| j	|| j d| _
d| _d| _d| _d| _dS )z
        Update the page's /Contents object with Shape data. The argument
        controls whether data appear in foreground (default) or background.
        r   r  Nr,   )r   rG   r  r  r  rv   rG
  r.   pdf_update_streamr   r  r_   r  )rN   r,	  r{   r   r   r   commitU*  s   

zShape.commitre  rf  p3p4c                 C   s   t |}t |}t |}t |}| j|ks#|  jdt|| j  7  _|  jdtt|| j t|| j  t|| j   7  _| | | | | | | | || _| jS )z#Draw a standard cubic Bezier curve.%g %g m
%g %g %g %g %g %g c
)r:  r  r  JM_TUPLEr  r  
updateRect)rN   re  rf  r  r  r   r   r   draw_bezierl*  s   

(




zShape.draw_bezierr  radiusc                 C   s6   |t kstdt|}||df }| j||dddS )z*Draw a circle given its center and radius.zradius must be postiver   r  F)
fullSector)r  r   r:  draw_sector)rN   r  r  re  r   r   r   draw_circle*  s
   zShape.draw_circlec                 C   sL   d}t |}t |}t |}||| |  }||| |  }| ||||S )z4Draw a curve between points using one control point.7.SQ?)r:  r  )rN   re  rf  r  kappak1k2r   r   r   
draw_curve*  s   zShape.draw_curvec                 C   sx   t |}t |}| j|ks#|  jdt|| j  7  _|| _| | |  jdt|| j  7  _| | || _| jS )zDraw a line between two points.r  %g %g l
)r:  r  r  r  r  r  )rN   re  rf  r   r   r   	draw_line*  s   


zShape.draw_linetetrac                 C   s  t |dkr
tdt|d drt|j}nt|}|j|j|j d  }|j|j|j d  }|j	|j|j	 d  }|j|j	|j d  }| j
|ks]|  jdt|| j  7  _|| _
| ||j	| | ||j| | ||j| | ||j| | |j || _
| j
S )z"Draw an ellipse inside a tetrapod.r  zinvalid arg lengthr   r        ?r  )r  r   r  r   rh  r	  r  r	  r	  r	  r  r  r  r  r  r  r_   )rN   r  r  mtmrr`	  mlr   r   r   	draw_oval*  s&   
zShape.draw_ovalrd  c                 C   s   t |D ]:\}}|dkr)| jt|ks(|  jdtt|| j  7  _t|| _n|  jdtt|| j  7  _| | qt|d | _| jS )z%Draw several connected line segments.r   r  r  r   )rC  r  r:  r  r  r  r  )rN   rd  r   r
  r   r   r   draw_polyline*  s    
 zShape.draw_polylinerh  c                 C   s&   t |}| |j|j|j|j|jgS )zDraw a Quad.)r	  r  r  r	  r	  r	  )rN   rh  r  r   r   r   	draw_quad*  s   zShape.draw_quadr_   c                 C   sN   t |}|  jdtt|j| j |j|jg  7  _| | |j	| _
| j
S )zDraw a rectangle.z%g %g %g %g re
)r   r  r  r  rs  r  r  r,  r  r;  r  )rN   r_   r   r   r   r   	draw_rect*  s   


zShape.draw_rectr  betar  c                 C   s  t |}t |}d}d}d}t| }ttd|d }	ttd|}
|
d }t|dtj krB||	7 }t|dtj ks5| j|ksX|  j|t|| j	  7  _|| _t dd}|}|}|| }t|}|t
ksqtd	| ||}t|t|
kr|jt||
 |  }|jt||
 |  }t ||}|jt|| | t|  }|jt|| | t|  }t ||}d
t| d d t||  }|t||  }||| |  }||| |  }|  j|tt|| j	 t|| j	  t|| j	   7  _||
8 }||
7 }|}t|t|
kst|dkr|d }|jt|| |  }|jt|| |  }t ||}|jt|| | t|  }|jt|| | t|  }t ||}d
t| d d t||  }|t||  d
t|  }||| |  }||| |  }|  j|tt|| j	 t|| j	  t|| j	   7  _|r|  j|t|| j	  7  _|  j|t|| j	  7  _|  j|t|| j	  7  _|| _| jS )zDraw a circle sector.r  r  r  r  r   r  r   r   zradius must be positiver   r  r   MbP?)r:  r  r  copysignr=  pir  r  r  r  r  r   horizontal_angler~  r   r  r  r  )rN   r  r  r  r  l3l4l5betarw360w90w45r^   rK  r  rI  r  alfaq1q2rB  r2rI  kappahr  cp1cp2beta2r   r   r   r  *  s|   


""
"
(

""
"
(
zShape.draw_sectorr   c                 C   s8  t |}t |}|| }t|}dtt|d|  d }|dk r%td|| }tt||}| }	d}
g }td|D ]-}|d dkrNt ||
 | }n|d dkr\t ||
| }nt |d| }|	||	  q=|g| |g }t
|}d}|d |k r| || ||d  ||d   |d7 }|d |k s|S )z#Draw a squiggly line from p1 to p2.r  r   points too closegh?3OP@r   r   r   )r:  r=  r  r  r   r   rv   _hor_matrixr   r)  r  r  )rN   re  rf  breadthrI  r  r
  r`	  r?  i_matr  rd  r   r
  r   r   r   draw_squiggle(+  s6   "zShape.draw_squiggler  c                 C   s   t |}t |}|| }t|}dtt|d|  d }|dk r%td|| }tt||}| }	g }
td|D ]&}|d dkrKt |d| }n|d dkrYt |d| }nq;|
	||	  q;| 
|g|
 |g  |S )z%Draw a zig-zagged line from p1 to p2.r  r   r  r   r   r   )r:  r=  r  r  r   r   rv   r  r   r)  r  )rN   re  rf  r  rI  r  r
  r`	  r?  r  rd  r   r
  r   r   r   draw_zigzagM+  s(   zShape.draw_zigzagr   r  r   Fr  rR  rc   r	  r	  r  r	  r>  r	  r	  r	  r+  c              	   C   s4  | j dkrdS |dkrd}n|dkrd}t|d}t|d}| j|}|dur3d| | j  | _ d}nd}| jj||
d}|dkrId	| | j  | _ |d
krZ|dkrZ|  j d| 7  _ |dkrfd| | j  | _ |dkrrd| | j  | _ |dvr~d| | j  | _ |	r|  j d7  _ d| _|dur|  j |7  _ |dur|  j |7  _ |dur|s|  j d7  _ n!|  j d7  _ n|s|  j d7  _ n|  j d7  _ n|  j d7  _ |  j |7  _ t|rtd
ddd
|d j| j | j	|d j
 | j
 }| |d
  | }dt| | j  | _ |  jd| j  d 7  _d| _ d| _dS )zFinish the current drawing segment.

        Notes:
            Apply colors, opacity, dashes, line style and width, or
            morphing. Also whether to close the path
            by connecting last to first point.
        r,   Nr   r  r  /OC /%s BDC
EMC
r   r   /%s gs
r   %g w
z%i J
z%i j
)Nr,   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
%g %g %g %g %g %g cm
z
q
Q
)r  r  rG   r	  rX	  r  
CheckMorphr   r~  r,  r  r  r  )rN   r  rR  rc   r	  r	  r  r	  r>  r	  r	  r	  r+  	color_strfill_stroptcontemcrB  r  r   r   r   r   finishj+  sd   



*zShape.finishc                 C   sj   t ||  j}tt|j}|jdk r(|jdkr!tj|  }|S tj| }|S |jdkr0	 |S | }|S )zReturn the angle to the horizontal for the connection from C to P.
        This uses the arcus sine function and resolves its inherent ambiguity by
        looking up in which quadrant vector S = P - C is located.
        r   )r:  r  r  asinr=  r  r~  r  )rK  r  rI  r  r   r   r   r  +  s   



zShape.horizontal_angler  r
  r   rb   r  ra   r  rG	  rP  render_moderM  r   c           ;   	   C   s  t |sdS t|ttfvr| }n|}t|dksdS t|}ztdd d|D }W n	   t	  Y dS |}|
drF|dd  }| jj||||d}t| j|}|d }|d }|d	 }|d
 }|d }|d }|ru|| }n|| dkr|d }n|||  }|dkr| j||d }n|d }g }|D ]} |r|dvrd }!n|}!|t| |!|| q|}t|	d}"t|
d}#|
s|dkr|	}
t|	d}#t|}$|}%|%d dkrtd|%dk r|%d7 }%|%dk s|%d }%d}&d}'d}(d})d}*| j}+| j},|$r'tdddd|d j| j |+|d j | j }-|- |d  |- }.dt|. }/nd}/|+|j | j }0|j| j }1|0}2|j| j }3|%dkrd|+|j | j }1|j | j }0|/|(7 }/|,t|0 }2|j| j }3nN|%dkr|+ |j | j }1|j| j }0|/|)7 }/t|0}2|,|j | j }3n)|%dkr|j | j }1|+ |j | j }0|/|*7 }/t|j| j }2|+|j | j }3| j|}4|4d krd|4 }5d }6nd }5}6| jj||d!}7|7d krd}7nd"|7 }7|&|5|7|/|1|0||f }8|dkr|8d#| 7 }8|dkr|8d$| 7 }8|	d ur|8|"7 }8|
d ur|8|#7 }8|8|d 7 }8d}9t|dkr%|8|'| 7 }8n|8|'d d% 7 }8tdt|D ]'}:|2|k r= n|:dkrF|8d&7 }8|8||: |'d d%  7 }8|2|8 }2|9d7 }9q4|8d'|6 7 }8|  j|87  _|9S )(Nr   c                 S   rt  r   r  r  r   r   r   r  +  r  z%Shape.insert_text.<locals>.<listcomp>r  rb  r   ra   r  rP  rG	  r  simpler#   r  r  333333?rJ
  glyphsSymbolZapfDingbatsr  r  r  zbad rotate valuer  z'
q
%s%sBT
%s1 0 0 1 %g %g Tm
/%s %g Tf zTJ
0 -%g TD
0 1 -1 0 0 0 cm
0 -1 1 0 0 0 cm
-1 0 0 -1 0 0 cm
r  r,   r  r	  r  r  r  r  %i Tr %g w r   z
T* z
ET
%sQ
) r  r>   r  r  r(  r  r:  r8  r&  r   rp  rG   r 
  r
  r   r
  r)  getTJstrr  r  r   r,  r  r   r~  r  r  r=  r	  rX	  r   r  );rN   r  r   rb   r  ra   r  rG	  rP  rR  rc   r  rM  r   r>  r	  r	  r+  r   maxcoderF  r{   fontinfor
  r  r  r  r  r  lheightr  tabr  rr  r  r  morphingr  templ1templ2cmp90cmm90cm180r,  r  r  r   r  toprg  spaceheadroomr  bdcr  rB  rE	  nlinesr   r   r   r   rr  +  s   






.










zShape.insert_text
expandtabsr|   c           L   	      s  t |}|js
|jrtdt|	d}t|
d}|
du r'|dkr'|	}
t|	d}| j|}|dkr8d| }d}nd }}| jj||d	}|dkrKd}nd
| }|d dkrYtd|}|dk rg|d7 }|dk s_|d }t|sy|dv rv|j	S |j
S d}d}d}| j	}|}|dr|dd }| jj||||d} t| j| }!|!d }"|"d |"d }#|"d |"d }$|"d }%|"d }&|r|}'n|%|& dkrd}'n|%|& }' |' }(t|ttfv rd|})n|})tdd |)D }*|#r|*dkrdd d |)D })|) })| j| |*d |#r|$d!vrd}+n}+ fd"d#},dk r*d$ d   }-n }-d}.t|r[tdddd|d j| j | j	|d j | j }/|/ |d  |/ }0d%t|0 }1nd}1d}2td |% }3|dkr|j|3 }4|4j| j }5|j
}6|j| j }7no|dkrt |% d}3|j|3 }4|4j| j }5|j	}6|j| j }7|1|7 }1nJ|d&krtd |%  }3|j |3 }4|4j| j }5|j
}6d'}2|j!| j }7|1|7 }1n"t |% d }3|j"|3 }4|4j| j }5|j	}6d'}2|j#| j }7|1|7 }1g }8t$|)D ]\}9}:|:%|&d(};d}<|6}=|;D ]}>|,|>}?|=|?kr |<|>d( 7 }<|=|?|- 8 }=qt'|<dkr>|<( d }<|.|<7 }.|5|(|2 7 }5|8)d) d}<|6}=|?|6krQ|>d( }<|6|? |- }=qt'|8dkr\d*|8d'< |>D ])}@|,|<|6|,|@ krq|<|@7 }<q^|<d7 }<|.|<7 }.|5|(|2 7 }5|8)d* |@}<q^|<d(7 }<|6|,|< }=q|<dkr|.|<( 7 }.|8)d* |9t'|)d k r|.d7 }.|5|(|2 7 }5q|5|7 |2 }A|At*krd'|A S t+|A}A|At*k rd}Ad+||f |1 }Bd,}C|. }Dd*|8d'< t$|DD ]\}9}E|6|,|E }F|4|3|9|'   }G|dkr|dv r|Gt|Fd- d|2  }GnE|Gtd|Fd- |2  }Gn9|d-kr<|dv r2|Gt|Fd|2  }Gn%|Gtd|F|2  }Gn|d.krW|E,d(}H|HdkrU|8|9 rU|F|H }Ind}I||Gj | j }J|Gj| j }K|dkrz||Gj | j }K|Gj | j }Jn*|d/kr| |Gj | j }K|Gj| j }Jn|d&kr|Gj | j }K| |Gj | j }J|B|C|K|J| f 7 }B|dkr|Bd0| 7 }B|d.kr|Bd1|I 7 }B|	dur|B|7 }B|
dur|B|7 }B|dkr|Bd2| 7 }B|Bd3t-|E|+|# 7 }Bq|Bd4| 7 }B|  j.|B7  _.| /| |AS )5a8  Insert text into a given rectangle.

        Args:
            rect -- the textbox to fill
            buffer_ -- text to be inserted
            fontname -- a Base-14 font, font name or '/name'
            fontfile -- name of a font file
            fontsize -- font size
            lineheight -- overwrite the font property
            color -- RGB stroke color triple
            fill -- RGB fill color triple
            render_mode -- text rendering control
            border_width -- thickness of glyph borders
            expandtabs -- handles tabulators with string function
            align -- left, center, right, justified
            rotate -- 0, 90, 180, or 270 degrees
            morph -- morph box with a matrix and a fixpoint
        Returns:
            unused or deficit rectangle area (float)
        z%text box must be finite and not emptyr  r  Nr   r  r  r,   r  r  r  zrotate must be multiple of 90r  r	  r  r  r  rb  r   r  r  r  r  r#   r  r  r  r  c                 S   rt  r   r  r  r   r   r   r  -  r  z(Shape.insert_textbox.<locals>.<listcomp>rJ
  c                 S   s    g | ]}t |d k r|ndqS )r  ?r  r  r   r   r   r  	-  r  r  c                    s.   dk rt fdd| D   S t|   S )zCalculate pixel length of x.r   c                    s   g | ]
} t | d  qS r  r  r  r  r   r   r  -  r	  z8Shape.insert_textbox.<locals>.pixlen.<locals>.<listcomp>)r  r  r  rb   r  r  r   r   pixlen-  s   z$Shape.insert_textbox.<locals>.pixlen    r  r	  r   r  TFz

q
%s%sBT
z1 0 0 1 %g %g Tm /%s %g Tf r   r   r  r  z%g Tw r  z%sTJ
zET
%sQ
)0r   rz  ry  r   r  rG   r	  rX	  r  r,  r  rp  r 
  r
  r   r>   r  r  r&  r8  r(  r
  r  r   r~  r  r  r:  r;  r2  rs  r0  r<  r3  rr  r1  rC  r  rd  r  rstripr)  r  r=  r  r  r  r  )LrN   r_   r   ra   r  rb   r  rG	  rP  rR  rc   r  rM  r|   r  r   r>  r	  r	  r+  r  r  r  r  r  rB  r  r  r  r  r,  rF  r{   r  r
  r  r  r  r  lheight_factorr  t0r  	tj_glyphsr  blenr   r  r   r  progrc_pntr  r  maxwidthmaxposjust_tabr   r   line_tlbuffr	  wordpl_wr  morerE	  templtext_tr  plpntspacesr  r  rg  r   r  r   insert_textbox,  s  *




	
*
































zShape.insert_textboxc                 C   s   | j d u rt|dkrt||| _ d S t|| _ d S t|dkrNt|}t| j j|j| j _t| j j|j| j _t	| j j
|j| j _
t	| j j|j| j _d S t|}t| j j|j| j _t| j j|j| j _t	| j j
|j
| j _
t	| j j|j| j _d S r  )r_   r  r   r:  r  r1  r~  r3  r  r8  r0  r2  r  r   r   r   update_rect-  s   
zShape.update_rectr  )r   )r   r  Nr   r   NFNTr   r   r   )r  Nr
  Nr   r   NNr   r   r   Nr   r   r   )r
  Nr  Nr   r   NNr   r   r   r   r   Nr   r   r   )%r  r  r  r1  rC   rP   r  r  r3   r  r  r  r  r  rS  rT  r4   r5   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rT   r  rr  r  r  r   r   r   r   r  >*  s   


N
)
	

[
	

 @	

  8r  c                   @   s   e Zd ZdddZdd Zedd	 Zed
d Zdd Z	d ddZ
d ddZdd Zdd Zd!ddZed"ddZed"ddZd!ddZdS )#Storyr,   Nr  c                 C   sZ   t |d}|r|jnt d }tt dr"t ||||| _d S t ||||| _d S )Nr  FzStoryS)r.   r  r  r:   	FzArchiver  r  FzStory)rN   htmluser_cssemarchiver   r  r   r   r   rP   -  s
   
zStory.__init__c                 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   Nr   r\  r   123456r/  h_id_)r  r+  r  r  r  r  rc  )rN   domr   r~  r#   attrid_r   r   r   add_header_ids-  s   $

zStory.add_header_idsc                 C   s   t | tr| }ntd| }t }|D ]}|jd@ r'|jr'|j|v r"q|||j< q|D ]c}|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   r  NzNo destination with id=z, required by position_from: r   z"add_pdf_links(): making link from:zadd_pdf_links():    zadd_pdf_links(): to:r7  fromrH  rG   )r7   r8   rf   
open_closer/  r3  rp  rt   r   r   r<  r   r_   r:  page_numinsert_link)document_or_stream	positionsr@   id_to_positionpositionposition_from	target_idposition_tor}   r*
  r1  r3  r0  r2  r   r   r   add_pdf_links-  sB   





zStory.add_pdf_linksc                 C   s   |   }| S rK   )r@   rL  rN   r  r   r   r   r  D.  s   z
Story.bodyc                 C   rM  rK   )r.   fz_story_documentr:   r  r  r   r   r   r@   I.  r  zStory.documentc                 C   s:   t |}|r	|jntd }tj  t| j|| d S rK   )r9  r:   r.   r  r   r   r   fz_draw_story)rN   r  r?  ctm2r	  r   r   r   drawM.  s   
z
Story.drawc                    s   t  tu r   D ]}t |tu r| std| dq
ni  tr,jjdkr0td fdd}t	
| j| dS )zU
        Trigger a callback function to record where items have been placed.
        zinvalid key 'r  r   z@callback 'function' must be a callable with exactly one argumentc                    s   G dd d}| }| j |_ | j|_| j|_t| j|_| j|_| j|_| j|_| j	|_	 r= 
 D ]
\}}t||| q2| d S )Nc                   @      e Zd ZdS )z=Story.element_positions.<locals>.function2.<locals>.Position2Nr  r  r  r   r   r   r   	Position2a.      r&  )rF  headingr/  r   r_   r   r  rectangle_numrect_numr3  r  setattr)r  r&  	position2r  r%   r  r   r   r   	function2`.  s   z*Story.element_positions.<locals>.function2N)r>   rf   r  rT   isidentifierr   r	  __code__co_argcountr.   fz_story_positionsr:   )rN   r   r  r  r.  r   r-  r   element_positionsS.  s   zStory.element_positionsc                 C   s,   t |}t }t| j||}|t|fS rK   )r  r.   r   fz_place_storyr:   r   )rN   wherefilledr  r   r   r   placer.  s   zStory.placec                 C   r{  rK   )r.   fz_reset_storyr:   rW   r   r   r   r  x.  r  zStory.resetc                    s   d }d d}t dddd}	 |||\}}	}
|d7 }|r  d7  | |	\}}r5 fdd}| | |rl|rV|rH|rD| t|d |  ||}|rV| ||d | ||
 |sk|rg| ||d |  n| d |
 |svd S q)Nr   r   c                    s    | _ |  d S rK   )r  r  r  
positionfnr   r   positionfn2.  s   z Story.write.<locals>.positionfn2)r   r7  r3  mediboxrg  rd  r#  )rN   writerrectfnr;  pagefnr	  r*  r6  r  r_   rD  r  r<  r   r:  r   r@  {.  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 rK   r)  r9  r;  r  stabler   r   r<  .  s   
z+Story.write_stabilized.<locals>.positionfn2)r  r  r  r@  )r>  	contentfnr?  r
  r  r;  r@  r  r  r  content_prevcontent2storyr<  r   rB  r   write_stabilized.  s.   
zStory.write_stabilizedc                    sZ   t  }t|}	g  fdd}
t|	| ||||
|||	 |	  |d t|S )Nc                        |   r |  d S d S rK   rA  r9  r;  r  r   r   r<  .     
z6Story.write_stabilized_with_links.<locals>.positionfn2r   )r  r  r\  r  rH  r  r  r  )rD  r?  r
  r  r;  r@  r  r  r   r>  r<  r   rJ  r   write_stabilized_with_links.  s   
z!Story.write_stabilized_with_linksc                    sR   t  }t|}g  fdd}| j||||d |  |d t|S )Nc                    rI  rK   rA  r9  rJ  r   r   r<  .  rK  z+Story.write_with_links.<locals>.positionfn2)r;  r@  r   )r  r  r\  r@  r  r  r  r  )rN   r?  r;  r@  r   r>  r<  r   rJ  r   write_with_links.  s   
zStory.write_with_links)r,   Nr  NrK   rP  )Nr  NNNT)r  r  r  rP   r  r  r  r  r  r@   r#  r3  r7  r  r@  rH  rL  rM  r   r   r   r   r  -  s$    

G



'r  c                   @   s   e Zd Zdd Zdd Zdd Zd.dd	Zd
d Zd/defddZ	de
fddZd0ddZd/de
fddZd/defddZd/de
fddZdd Zd.de
fddZdd  Zd1d!d"Zde
fd#d$Zde
fd%d&Zd'd( Zed)d* Zd2d,d-ZeZdS )3rY  c                 G   sR   t |tjr|d }t|| _nt |tjr|d | _ntd| d| _d S )Nr   Unrecognised args: T)r  r.   r   rX  r:   rt   rZ   )rN   r  r  r   r   r   rP   .  s   
zTextPage.__init__c                 C   sx   | j }td}t|}|dkrt||d n|dkr%t||d n|dkr1t||d nt|| t|}|S )Nr
  r   r   r   r  )	r:   r.   r  r  fz_print_stext_page_as_htmlfz_print_stext_page_as_xmlfz_print_stext_page_as_xhtmlJM_print_stext_page_as_textr<  )rN   r
  
this_tpager   r6  r   r   r   r   _extractText.  s   


zTextPage._extractTextc                 C   s   t | j|| d S rK   )JM_make_textpage_dictr:   )rN   	page_dictrI
  r   r   r   _getNewBlockList/  rW  zTextPage._getNewBlockListFc                 C   s"   | j j| j jd}| || |S )N)r  r,  )r_   r  r,  rW  )rN   rI
  rV  r   r   r   _textpage_dict/  s   zTextPage._textpage_dictc                 C   s  t rt| jS d}| j}t|jj}td}g }|D ]}|d7 }ttjj	}|jj
tjkrt| d}d}	d}
|D ]H}|d7 }ttjj	}|D ]#}t||}t||s_t|s_qMt||jj |jj}
t||}qM|
dkrt|st|d t||}q>t|}n0t||jjst|r| }| }dt|| | | f }t|t|jj}t|s|j|j|j|j |||jj
f}|!| q|S )z*Return a list with text block information.r   r
  r   r  r   
   z+<image: %s, width: %d, height: %d, bpc: %d>)"r   r   extractBLOCKSr:   r.   r   ri   r  r  Fixed_EMPTYr>   FZ_STEXT_BLOCK_TEXTfz_clear_bufferJM_char_bboxJM_rects_overlapr  JM_append_runer  fz_union_rectr  fz_append_byter<  r   i_imagerA  r  r[  r\  r  r1  r3  r0  r2  r)  )rN   block_nrS  tp_rectr   rD  block	blockrectline_nlast_y0	last_charr   linerectr  cbboxr   r.  rE  litemr   r   r   rZ  
/  sj   






	zTextPage.extractBLOCKSNr  c                 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.FrI
  Nr  r,  Tblocksc                 S      | d d | d d fS Nr   r   r   r   r-  r   r   r   r  J/  r  z&TextPage.extractDICT.<locals>.<lambda>rh  rX  r  r,  rT  rN   r	  rT  r~   ro  r   r   r   extractDICTB/     

zTextPage.extractDICTc                 C   
   |  dS )z%Return page content as a HTML string.r   rT  rW   r   r   r   extractHTMLN/  r  zTextPage.extractHTMLr   c              	   C   s^  d}| j }g }|D ]}|d7 }|jjtjkrq	| }|rMttttt}t	|s,J t
| dd| dd}t|||\}	}
}t|	}t|}tt|jj}t }||t< t|jj|t< t| |t< | |t< | |t< t||t< t||t < |! |t"< |! |t#< |$ |t%< t&||t'< |r||d< |(| q	|S )z*Return a list with image meta information.r   r   r   r<	  ))r:   ri   r>   r.   r\  rc  rP
  rg
  rh
  r  r   r[  r\  rf
  r	  r   r  ll_fz_keep_colorspacerA  rf   dictkey_numberr   r   dictkey_bboxr   i_transformdictkey_matrixr  r  r  r  r  r  r  r  r  r  r  fz_image_sizer  r)  )rN   hashesrd  rS  r  rf  r.  r   r   rF  r[  r\  r<	  rE  
block_dictr   r   r   extractIMGINFOR/  s@   
zTextPage.extractIMGINFOc                    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   NFrn  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 rK   r>   r   r  	b64encoderh  r  base64r   r   r$   {/     z/TextPage.extractJSON.<locals>.b64encode.defaultNr  r  r  r$   r   r  r   r   r  z/      r  r  r,  Tro  c                 S   rp  rq  r   rr  r   r   r   r  /  r  z&TextPage.extractJSON.<locals>.<lambda>rs  ,r   r   
separatorsr  r  r  jsonrX  JSONEncoderr  r,  rT  dumpsrN   r	  rT  r  r~   r  ro  r   r  r   extractJSONu/  s   

zTextPage.extractJSONc                 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.Trn  Nr  r,  ro  c                 S   rp  rq  r   rr  r   r   r   r  /  r  z)TextPage.extractRAWDICT.<locals>.<lambda>rs  rt  ru  r   r   r   extractRAWDICT/  rw  zTextPage.extractRAWDICTc                    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   NTrn  c                       r  )z*TextPage.extractRAWJSON.<locals>.b64encodec                    r  rK   r  r  r  r   r   r$   /  r  z2TextPage.extractRAWJSON.<locals>.b64encode.defaultNr  r   r  r   r   r  /  r  r  r  r,  ro  c                 S   rp  rq  r   rr  r   r   r   r  /  r  z)TextPage.extractRAWJSON.<locals>.<lambda>rs  r  r   r  r  r  r   r  r   extractRAWJSON/  s   

zTextPage.extractRAWJSONc                 C   s2   t |}t |}t| j||d}|rt|S dS )Nr   r,   )r  r.   fz_copy_selectionr:   PyUnicode_FromString)rN   pointapointbr2  r-  r  r   r   r   extractSelection/  s   zTextPage.extractSelectionc                 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 )Nr   r   r   rr  r   r   r   r  /  r  z&TextPage.extractText.<locals>.<lambda>rs  r,   c                 S   s   g | ]}|d  qS )r  r   )r  r-  r   r   r   r  /  r  z(TextPage.extractText.<locals>.<listcomp>)rT  rZ  rT  r&  )rN   rT  ro  r   r   r   extractText/  s
   
zTextPage.extractTextc                 C   s4   | j }t|tjsJ t|}t||}t|}|S rK   )r:   r7   r.   rX  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)rN   r_   rS  r  r  r  r   r   r   r
  /  s   
zTextPage.extractTextboxc              
   C   sb  t r	t| j|S d}d}ttjj}| j}t|jj}d}t	d}g }|D ]}	|d7 }|	jj
tjkr7q)d}
|	D ]r}|
d7 }
d}t| d}|D ]L}t||}t||s^t|s^qLt|jj|}|r|dkrlqLt|s|t|||||
|\}}t| d}qLt||jj |d7 }t|t||}qL|rt|st|||||
|\}}d}q;q)|S )z)Return a list with text word information.r   r   N@   r   )r   r   extractWORDSr:   r.   r   r[  ri   r  r  r>   r\  r]  r^  r_  r  JM_is_word_delimiterr  r  JM_append_wordr`  ra  )rN   
delimitersbuflenrd  wbboxrS  re  rD  r  rf  rh  r   word_nr  rl  word_delimiterr   r   r   r  /  sV   





zTextPage.extractWORDSc                 C   rx  )z&Return page content as a XHTML string.r  ry  rW   r   r   r   extractXHTML/  r  zTextPage.extractXHTMLc                 C   rx  )z$Return page content as a XML string.r   ry  rW   r   r   r   
extractXML/  r  zTextPage.extractXMLc                 C   s(   | j }t|jj}t|}d|_|S )zTextPage current poolsize.N)r:   r.   Poolri   poolfz_pool_size)rN   r	  r  r  r   r   r   poolsize/  s
   
zTextPage.poolsizec                 C   s"   | j }|jj}t|}t|}|S )zPage rectangle.)r:   ri   r  r   r   )rN   rS  r  r~   r   r   r   r_   0  s
   zTextPage.rectr   c                 C   s   t | j|}d}|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   )JM_search_stext_pager:   r  r   r	  r_   r2  rz  )rN   needlehit_maxr  r~   nlr  r   r  v1v2r   r   r   search0  s0   

	zTextPage.searchrR  r  r  rK   )r   r   )r  r  r  rP   rT  rW  rX  rZ  rf   rv  rT   rz  r  r  r  r  r  r  r
  r  r  r  r  r  r_   r  extractTEXTr   r   r   r   rY  .  s.    

8
#
0

	rY  c                   @   sL   e Zd ZdddZedd Zdd	d
Z		dddZdd ZdddZ	dS )
TextWriterr   Nc                 C   st   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.   fz_new_textr:   r   rR  r   r_   r   r,  rD  ictmr:  
last_pointr1  	text_rectrS  
used_fontsrZ   )rN   	page_rectr   rR  r   r   r   rP   ,0  s   



zTextWriter.__init__c                 C   s*   t t| jtd t }t|}|S rK   )r   r.   fz_bound_textr:   FzStrokeStater   r   r  r   r   r   _bbox=0  s   zTextWriter._bboxr  r   c              
   C   s  t || j }|du rtd}|js	 td|j |r*| 	|}d
t|}d}t|}	t|}
t|dd||
j|
j}d}d}|dkrVt| j|j||||||	}nt| j|j||||||	}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
  r   z{font.this.m_internal.name=}z {font.this.m_internal.t3matrix=}z{font.this.m_internal.bbox=}z#{font.this.m_internal.glyph_count=}z&{font.this.m_internal.use_glyph_bbox=}z#{font.this.m_internal.width_count=}z%{font.this.m_internal.width_default=}z"{font.this.m_internal.has_digest=}zUnsupported font {font.name=}zEUnsupported font {cppyy.gbl.mupdf_font_name(font.this.m_internal)!r=}zUnsupported font '%s'.r,   r   r  r   )r:  r  rU  r  r   r-   r  r   r#   	clean_rtlr&  rU  r.   r  r  fz_make_matrixr~  r  fz_show_stringr:   JM_show_string_csr   rD  r  r  r  r%  r  r  )rN   r  r   r  rb   rx  right_to_leftr  r  rw  r
  trm
markup_dirr  r~   r   r   r   r)  C0  s2   

zTextWriter.appendc                 C   s@   |d }|D ]}| j |||||d | j|7  _q| j| jfS )Nr  )r  rb   rx  )r)  r  textRectr  )rN   r  r   r  rb   rx  r  r  r   r   r   appendvo0  s   zTextWriter.appendvc                 C   s(  |s|S | d}g }tt|D ]%}|| }t|dk s6tdd |D dks6dt|||< || qg }tt|D ]M}|g krM|||  q?|| |d d kr{t|dkrut||d	 |d d  ||d	 |d d < || g}q?|| |d d kr|||  q?d|}|S )
a)  Revert the sequence of Latin text parts.

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

        Args:
            text: str
        Returns:
            Massaged string.
        r  r   c                 S   rt  r   r  r  r   r   r   r  0  r  z(TextWriter.clean_rtl.<locals>.<listcomp>rJ
  r,   r   r   r   )rd  r   r  r8  r&  rU  r)  )rN   r   wordsrp  r   r[  idx2r   r   r   r  x0  s2   
"

zTextWriter.clean_rtlr   c	           '      C   sn  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}	 | }	d}
|dkre|dk re|}
d}g d
}|rst|\}}|dkr|t }n|dkrt }nt }t|	 t|	 d}td}t|	 t ||}t|| jt |||
ttj t| t|	|}t|}||f}|}|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r1|!d|j)|j*|j( | f  |rO|d | j+ } tdd,| j)| j*}| |d  | }|sU|r^|!dt-|  |D ]}!|!.drjq`|!dkr}|!|! |!d|  q`|!.drt/|!0 d dd | }"d|" }!nm|!.dr|!0 }#t1|#d }$|dkr|$d }%nd}%|!d|%  t/|#d dd | }&d2d |& g|#dd  }!n/|!.d!r|!|!3d"d# n|!.d$r|!|!3d$d% n|!.d&r|!|!3d&d' |!|! q`|r|!| |!d( d)2|4d*}t5j6|||d+ d}| j7D ]}&t8||& 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 allowedr  r   r
  r   r  r  r
  z/OC /%s BDCEMCr,   r  r  z1 0 0 1 %g %g cmz%g %g %g %g %g %g cmz cmrY  z%i Trz gsz	/Alp%i gs Tf皙?z%g wr   r  z/F%iz rgrs  RGz gz Gz kz Kr  r  r  )r,	  )9r   r=  r_   r   r>   r  r  r:  r   rS   r   rR  r  r   r.   r:  fz_device_cmykfz_device_grayrk  r   r   r  pdf_new_pdf_devicer   fz_fill_textr:   r  r  r	  JM_merge_resourcesr<  r(  r	  r)  r	  r  r,  r  r  r  r3  r~  r  r  r%  r  r*  r  rd  r  r&  r.  r  rv   rG
  r  repair_mono_font)'rN   rG   rR  r   r,	  r>  r?  r  r+  r  rB  ncol	dev_colorrA  r   r  r	  max_numscont_stringrl  r~   r  max_alpmax_fontold_cont_linesr  r  r  new_cont_linesr	  r9  r`	  r
  r   alpr  rG  r[  r  r   r   r   
write_text0  s   




	


  







zTextWriter.write_textr  )Nr  Nr   r   )Nr  N)Nr   r   NNr   r   )
r  r  r  rP   r  r  r)  r  r  r  r   r   r   r   r  *0  s    


,
	.r  c                   @   sd  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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ed"d# Zed$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zed.d/ Zed0d1 Zed2d3 Zd4d5 Zd6d7 Zd8d9 Z ed:d; Z!ed<d= Z"ed>d? Z#ed@dA Z$dBdC Z%dDdE Z&edFdG Z'eZ(eZ)e#Z*e$Z+dHS )IrQ
  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                 C      t | | S rK   )r   r  r  r
  r   r   r   r  81  r  zIRect.__add__c                 C   r  rK   )r   rC  r  r  r   r   r   rC  ;1  r  zIRect.__and__c                 C      t | |S rK   )r   r  r  r   r   r   r  >1  r  zIRect.__contains__c                 C   r,  r-  )r  r  r1  r3  r0  r2  r:  r   r   r   r  A1  s   
DzIRect.__eq__c                 C   r.  rK   rF  r  r   r   r   r  F1  r  zIRect.__getitem__c                 G   rG  rK   )util_make_irectr  r1  r3  r0  r2  rI  r   r   r   rP   I1  rJ  zIRect.__init__c                 C   r  r0  r   rW   r   r   r   rN  P1  r  zIRect.__len__c                 C   r  rK   )r   r  r  rP  r   r   r   r  S1  r  zIRect.__mul__c                 C   r1  rK   )rQ
  r1  r3  r0  r2  rW   r   r   r   r  V1  r  zIRect.__neg__c                 C   r  rK   )r   rM  r  r  r   r   r   rM  Y1  r  zIRect.__or__c                 C   r
  rK   )rQ
  rW   r   r   r   r  \1  rY   zIRect.__pos__c                 C   r  )NrQ
  r  rW   r   r   r   rU   _1  r  zIRect.__repr__c                 C   rO  r2  )r  r1  r3  r0  r2  r  r  r   r   r   r  b1  rP  zIRect.__setitem__c                 C   r  rK   )r   r  r  r
  r   r   r   r  l1  r  zIRect.__sub__c                 C   r  rK   )r   r  r  rP  r   r   r   r  o1  r  zIRect.__truediv__c                 C   rQ  rR  rS  rW   r   r   r   r  r1  r8
  zIRect.bottom_leftc                 C   rQ  rT  rU  rW   r   r   r   r  w1  r8
  zIRect.bottom_rightc                 C      t d| j| j S r  )r8  r2  r3  rW   r   r   r   r,  |1  r  zIRect.heightc                 C      | j |}|jS )z$Extend rectangle to include point p.)r_   rK  r
  )rN   r
  r_   r   r   r   rK  1     zIRect.include_pointc                 C   r  )z(Extend rectangle to include rectangle r.)r_   rL  r
  )rN   r   r_   r   r   r   rL  1  r  zIRect.include_rectc                 C   r  )z4Restrict rectangle to intersection with rectangle r.)r   r@  r  r:  r   r   r   r@  1  r  zIRect.intersectc                 C   r  rK   )r   r[  r  r   r   r   r[  1  r  zIRect.intersectsc                 C   r\  r]  r^  rW   r   r   r   rz  1  r_  zIRect.is_emptyc                 C   r`  )zTrue if rectangle is infinite.ra  rW   r   r   r   ry  1  rb  zIRect.is_infinitec                 C   rc  rd  r^  rW   r   r   r   re  1  r_  zIRect.is_validc                 C   rf  rg  rh  ri  r   r   r   r>  1  rj  zIRect.morphc                 C   r  )Nc                 S   r  r   r   r  r   r   r   r  1  r  zIRect.norm.<locals>.<listcomp>r  rW   r   r   r   r(  1  r  z
IRect.normc                 C   rk  )z)Replace rectangle with its valid version.rl  rW   r   r   r   rm  1  rn  zIRect.normalizec                 C   ro  rp  rq  rW   r   r   r   rh  1  re  z
IRect.quadc                 C   r
  rK   rN  rW   r   r   r   r_   1  r  z
IRect.rectc                 C   rQ  ru  rv  rW   r   r   r   r  1  r8
  zIRect.top_leftc                 C   rQ  rw  rx  rW   r   r   r   r  1  r8
  zIRect.top_rightc                 C   ry  rz  r{  r:  r   r   r   r|  1  s   zIRect.torectc                 C   r  rK   )r   r  r  rP  r   r   r   r  1  r  zIRect.transformc                 C   r  r  )r8  r0  r1  rW   r   r   r   r  1  r  zIRect.widthN),r  r  r  r1  r  rC  r  r  r  rP   rN  r  r  rM  r  rU   r  r  r  r  r  r  r,  rK  rL  r@  r[  rz  ry  re  r>  r(  rm  rh  r_   r  r  r|  r  r  r<  rs  r;  rr  r   r   r   r   rQ
  .1  sh    	











rQ
  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr  r  r  r
  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibir  symbr  zadbr"  i   ir  r   r   r  r  r     r  r  rz  r!  	   rY  r  r     Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenrN
  MultiplyNormalOverlay
SaturationScreen	SoftlightzI<</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launchr  r9  c                   @      e Zd ZdZdS )r*  z0Raised for documents with file structure issues.Nr  r  r  r1  r   r   r   r   r*  2      r*  c                   @   r  )r)  zRaised if file does not exist.Nr  r   r   r   r   r)  2  r  r)  c                   @   r  )r,  z5Raised when creating documents from zero-length data.Nr  r   r   r   r   r,  2  r  r,  r|   r  r   ro  r  r  charsrR  rA  r  r  zcs-namedar  r"  r  r  effectr  r   rc   r%  r  r  r,  r/  r>	  r  r  rD  r  r  r#   r  originr_   r  r  spansr  r  r  r   r  r>   rq  r  r  r{   r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  )r        ?)!   Zd;O?)"   7A`?)#   r  )$    rh?)%   -?)&   gL7A`?)'   jt?)r  r)  ))   r)  )*   r  )+   r.  ),   r'  )-   r.  ).   r'  )/   n?)0   r  )1   r  )r	  r  )3   r  )4   r  )5   r  )6   r  )7   r  )8   r  )9   r  ):   r;  );   r;  )<   r.  )=   r.  )>   r.  )?   g"~j?)r  r.  )A   v?)B   MbX?)C   rL  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r4  rL  )I   r)  )J   x&1?)K   rL  )L   ʡE?)M   g r?)N   rL  )O   rL  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   rR  )U   Gz?)V   r3  )W   ra  )X   gp=
ף?)Y   q=
ףp?)r  rR  )[   r)  )\   gV-?)]   r)  )^   uV?)r
  r  )`   r  )a   rY  )b   r.  )rS	  r.  )r  V-?)e   r3  )f   y&1?)g   M?)h   rV  )i   uV?)j   rV  )k   r.  )l   r.  )m   ;On?)n   rx  )o   r.  )p   r.  )q   rx  )r   r.  )s   rV  )t   r3  )u   r  )v   r+  )w   r\  )x   gZd;O?)y   r\  )z   ru  ){   Q?)|   皙?)}   r  )~   r.  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  r%  )   r'  )   gףp=
?)   gV-?)   r.  )   gK7A`?)   r+  )   r  )   jt?)   r  )   r  )   r  )   y&1?)   r+  )   rV  )   /$?)   rV  )   g?)   r.  )   rz  )   r.  )r	  r.  )   r  )   ru  r%  )   r.  )   r.  )   r.  )   r.  )   r   )   rV  )   r   )   rq  )   tV?)   r\  )   rl  )   r  )   ra  )   ra  )   r  )   ra  )   ra  )   r+  )   r+  )   r+  )   r+  )   r+  )   r+  )   r+  )   ra  )   r+  )   HzG?)   r  )   g{Gz?)   r  )   r.  )   r.  )   r+  )   rV  )   rV  )   r  )   r  )   rV  )   r  )   rV  )   ru  )   r}  )   r  )   r  )   x&?)   r+  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   ru  )   ru  )   ru  )   ru  r%  )   r}  )   gK7?)   r\  )   r\  )   r\  )   r  )   r.  )   r  )   r  )   r  )   r  )   ru  )   ru  )   ru  r%  (   r&  K7?r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r;  )r(  ^I+?)r*  gn?)r,  r  )r-  g\(\?)r/  g5^I?)r1  sh|??)r2  r  )r  Zd;O?)r4  rg  )r5  gQ?)r6  g?5^I?)r7  r.  )r8  g\(\?)r9  x&?)r:  gB`"?)r<  r  )r=  g=
ףp=?)r	  r  )r>  g)\(?)r?  gOn?)r@  Mb?)rA  '1Z?)rB  gʡE?)rC  gDl?)rD  rT  )rE  RQ?)rF  }?5^I?)rG  gT㥛 ?)rH  ru  )rI  gDl?)rJ  gv/?)r  gX9v?)rK  g/$?)rM  r  )rO  r  )rP  r  )rQ  r  )rS  gK7A`?)rU  g rh?)r4  &1?)rW  r  )rX  r  )rZ  gx?)r[  r  )r]  r0  )r^  r  )r_  d;O?)r`  gK7?)rb  g+?)rc  gA`"?)rd  g+?)re  r  )rf  MbX?)rh  g=
ףp=?)ri  E?)rj  ra  )rk  r  )r  r  )rm  9v?)rn  g-?)ro  gm?)rp  g;On?)r
  g;On?)rr  gGz?)rs  r  )rt  r  )rS	  r  )r  gCl?)rv  ʡE?)rw  g?5^I?)ry  r  )r{  gv/?)r|  r+  )r~  r  )r  gQ?)r  r  )r  V-?)r  r   )r  r  )r  r  )r  r  )r  r  )r  %C?)r  r
  )r  r  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  r  )r  K7A`?)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  gCl?)r   rh?)r  r  )r  gQ?)r  rN  )r  r  )r  r  )r  r  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r	  r  )r  r  )r  r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r  V-?)r   rh?)r  r  )r  gK7A`?)r  Dl?)r  V-?)r  r  )r  g㥛 ?)r  r	  )r  g"~?)r  r  )r  r  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r  gK7A?)r  獗n?)r  r  )r  X9v?)r  r  )r  r  )r  r  )r  +?r  )r  r  )r  r  )r  gʡE?)r  y&1?)r  gGz?)r  r  )r  "~j?)r  gl?)r  r  )r  r  )r  r	  )r  r  )r  g
ףp=
?r  r  c                 C   s0   g }t |D ]}|t| ||  qt|S rK   )r   r)  r.   rc
  r   )r*	  r
  r   r&   r   r   r   r   _read_samplesL5  s   r  c                 C   s   || ko| |kS rK   r   )r%   lowhighr   r   r   r  U5  r  r  c              	   C   s\  t | }t|D ]}|}||v rq	t | |}t |td}|js$q	t |}t|d ddD ]y}t ||}	t 	t |	tdtdsHq1t |	td}
t |	td}|
jrrt 	t |
tdtd	sjq1t |
td
}d}t 
|rt |d}t | |}nt |rt |  t |\}}}|dk rq1|}||v rt || q1q	d S )Nr   r   r   r  r  r  r  rI  GoTor  r   )r.   r  r   r  rp   rq   ri   r  r  ro  r{  pdf_lookup_page_numberr.  r  r=   rm   r  )r   r  	pagecountr   r  r  r  r  r   r	  r
  r  r  targetrS  r   r   r   r  Y5  sD   



r  c                 C   s<   t | tjtjfsJ dt| d| | jstdd S )Nztype(cond)=z cond=r  )r7   r.   rD   r<   r>   ri   rt   condr   r   r   rk  |5  s   *rk  c                  O   r  rK   r   r  rV  r   r   r   DUMMY5  r  r!  c                   C      t ttttS rK   )rQ
  rh
  rg
  r   r   r   r   EMPTY_IRECT5  r  r#  c                   C      t  jS rK   )
EMPTY_RECTrh  r   r   r   r   
EMPTY_QUAD5  rY   r&  c                   C   r"  rK   )r   rh
  rg
  r   r   r   r   r%  5  r  r%  c                 C      t | stdd S Nz No journalling operation started)JM_have_operationrt   r   r   r   r   r  5     r  c                   C   r"  rK   )rQ
  rg
  rh
  r   r   r   r   INFINITE_IRECT5  r  r,  c                   C   r$  rK   )rE  rh  r   r   r   r   r8  5  rY   r8  c                   C   r"  rK   )r   rg
  rh
  r   r   r   r   rE  5  r  rE  c                 C   s   t | tjsJ t| }|S )z3
    Turn fz_buffer into a Python bytes object
    )r7   r.   r  r  )r   r&   r   r   r   r   5  s   
r   c                 C   sR   | d u rdS t | tsJ dt| | dd}d}|D ]}|t|7 }q|S )Nr,   ztype(c)=rX  surrogateescape)r7   rT   r>   r  r  )r  r-  r&   bbr   r   r   r  5  s   r  c                 C   sn   t | ttfr
| }n(t| dr.|  }t |tr|d}t |ttfs-tdt| nt	
 S t	|S )z
    Make fz_buffer from a PyBytes, PyByteArray or io.BytesIO object. If a text
    io.BytesIO, we convert to binary by encoding as utf8.
    r  r  z&.getvalue() returned unexpected type: )r7   r   r  r  r  rT   r  rt   r>   r.   r  r  )r   r  r   r   r   r   5  s   



r   c                 C   s2   |dk s
|t | krd S | | }t|tsJ |S r  )r  r7   r  )rz   rp  r&   r   r   r   JM_FLOAT_ITEM5  s
   r/  c                 C   s   t | sd S t| | S rK   )r  r  )rz   rp  r   r   r   r/  5  s   c                 C   s.   |t | k r| | }t|ttfrd|fS dS )Nr   r  )r  r7   r  r  )rz   rp  r  r   r   r   r_  5  s
   r_  c                 C   s  d}d}d}	d}
|
r|}n|}d}|}t |}t|}t|}t||}t||}t|}t| }|jrHt	|t	|krHt
|}||krt|}|jr{t|}||	krlt|D ]	}t||t qan,t|D ]	}t||t qpnt|rtd}n|jrt	|t	|krtd}t||||}|rt| nt|d t||}|rt||t t ntt||t t  t| |S )zf
    Pixmap creation directly using a short-lived displaylist, so we can support
    separations.
    r   r   r   TNrJ
  )r9  r.   r	  r  fz_intersect_rectr  fz_round_rectfz_document_output_intentri   r  fz_keep_colorspacefz_page_separationsfz_count_separationsr   fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsrR
  r
  r
  r  r	  r   rn  fz_run_page_contentsr  r  r	  )r   rG   rD  rE  rB  r  rZ  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsrn
  rA  r?  r_   rclipr   oir   r   rF  r	  r   r   r   rM	  5  sX   








rM	  c                 C   r  rK   r   r  r   r   r   r  66  r  r  r	  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   r  =6      zJM_TUPLE.<locals>.<lambda>r  r'  r	  r   r   r   r  <6  rW  r  c                 C   rC  )Nc                 S   rD  )Nr  r   r   rE  r  r   r   r   r  A6  rF  zJM_TUPLE3.<locals>.<lambda>rG  rH  r   r   r   r^	  @6  rW  r^	  c                 C   sF   | d u rdS t | tr| d} t | ts!J dt| d| | S )Nr,   rX  ztype(s)=z s=)r7   r   rh  rT   r>   r  r   r   r   rn   D6  s   

"rn   c           	      C   s   t | tjsJ t| }t| }t|}d}	 t d| | }||vr'n|d7 }q|}t|}t|d| d|	 j
_d S )Nr   r   -rd  )r7   r.   rL   r   rh   r	  JM_annot_id_stemr  r  r   ri   r   	rO   stemrG   r   rq  r   stem_idresponser#   r   r   r   r  M6  s   


r  c                 C   s   t | |d}t |stttt t |td}t 	|tddks.t 	|tddkr9t 
|td| dS tttt dS )z1
    Add OC object reference to a dictionary
    r   r  r  OCMDr)  N)r.   r  r   r  r  MSG_BAD_OC_REFr
  rp   rq   r   r   )r   r9	  r{   indobjr   r   r   r   r  _6  s   
r  c                 C   sz  t  }d }d}d}d }t| td}t|rFtt|d}t|dkrFt|d}tt|D ]}t	t||}|
| q5t| td}	|	jrtt|	td}tt|	td}|d	krmd }t|	td
}|jrtt|D ]}t	t||}|
| qt| td}|jrt	t|td}t }
||
t< t||
t< ||
t< ||
d< |
S )Nr   Borderr   r  r   BSr  rI  r,   r  BEIr  )r  r.   rp   rq   r{  rT  r  r  r   rr   r)  ri   r   rf   r  r  dictkey_dashesdictkey_style)r   dash_pyr  r  r  rz   dashr   r~   bs_or   r   r   r   r   o6  sB   
r   c                 C   s   t  }t }t }t| tj}t|r/t|}t|D ]}tt	||}|
| q||t< t| d}t|rXt|}t|D ]}tt	||}|
| qG||t< |S )Nr   )rf   r  r.   rp   PDF_ENUM_NAME_Cr{  r  r   rT  r  r)  dictkey_strokerg   dictkey_fill)r   r   bcfcr	  r   r   r   r   r   r   r   6  s$   



r   c                 C   s  t | tsJ d }d}d}| t}| t}| t}| d}	t|}
t|t	d t|t	d t|t	d |dk rF|
t}|d u rO|
t}|d u rX|
t}|	dk ra|
d}	t |t
rt|dkrt|}t||}|D ]}t|| qxt||t	dt	d t|t|t	dt	d |dkrt|}nt	d}t||t	dt	d |	dkrt|t	dd	 t|t	d}t|t	dt	d
 t|t	d|	 d S d S )Nr   r  rT  rU  rS  r  r  rI  r   rK  rV  )r7   rf   r"   r  rW  rX  r   r.   r   rq   r  r  r   pdf_array_push_intrp  pdf_new_realJM_get_border_styler   rp   r   r   )r   r   r   rz   r   dashlennwidthndashesnstylencloudsoborderdarrrc  r   r   r   r  6  sT   








r  c                 C   sb   | dkrdS d|   krdksn | dkrt | S d|   kr$dkr%dS  | d	kr-d
|  S d|  S )Nrn  z\u005cr     rY  i   i  z\ufffd  z\u%04xz\U%08xr  )r  r   r   r   make_escape6  s   rn  c                 C   s   t | t| dS )zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)r.   r(	  rn  )r  r  r   r   r   r`  6  s   r`  c                 C   sD   t |}|j|j|j|j||||f}| | |d ttjjfS )z'
    Functions for wordlist output
    r   )	r<  r1  r3  r0  r2  r)  r.   r   r[  )rD  r  r  rd  rh  r  r  rm  r   r   r   r  6  s   

r  c           	      C   sn   t | }t | }t|}d}	 dt||f }||vrn|d7 }qt|}t |t|}t |d| dS )z
    Add a unique /NM key to an annotation or widget.
    Append a number to 'stem' such that the result is a unique name.
    r   r   z%s-%s%drd  N)	r.   r   rh   r	  rK  r  pdf_new_stringr  r  rL  r   r   r   r  7  s   

c                 C   s  t | }t|td}t|st|tdd}t| d}t|td| |dur6t|td| t|tdtd t|td	d}|sMn4t|td
}t	|}	t
|	D ]#}
d}t||
\}}|dkrmq]t| |d}t||rt|| q]t|| dS )z1
    Add OC configuration to the PDF catalog
    r  r   r  r_  Nr  	BaseStater  r  r  r   )r!  r.   rp   rq   r{  r   r   r  r   r  r   r_  r  pdf_array_containsr}  )r   r#   r  r  r,  configsr  onarrayr  r   r   r{   r}   indr   r   r   r   7  s0   
r  c                 C   sH   t | |}t|}| jjs|S |j|j|jj k r"|j|jj |_|S )z"
    return rect of char quad
    )JM_char_quadr.   r  ri   r  r2  r3  r  )r   r  r  r   r   r   r   r^  >7  s   

r^  c                 C   sV   t ||}|t| t 7 }|t| t 7 }|t| t 7 }|t| t	 7 }|S rK   )
detect_super_scriptr.   r  TEXT_FONT_ITALICr  TEXT_FONT_SERIFEDr  TEXT_FONT_MONOSPACEDr  TEXT_FONT_BOLD)r  r   r  r%  r   r   r   JM_char_font_flagsK7  s   
r{  c                 C   s  t rtt| j|jS t| tjsJ t|tjsJ t	r"|j
S | jjr)|j
S tt|jj}t|}t|}|jj}|| t }|dkrTtdkrTt|jj
S |jj}t|}|j|j }|dk rmd}d}d}tss|dk r{|| }|| }|| }|| | }|| | }| jjj}	| jjj}
t|	|
 |
|	dd}t|	|
|
 |	dd}|	dkrd|_d|_tdddd|jjj |jjj }tdddd|jjj|jjj}tt|jj
|}t||}|	dkr|jjdkr||j_||j_||j _||j!_n| |j_| |j_| |j _| |j!_|j jdk r(d|j _d|j_|j!j|j j }|tk rYt"||jj#}|rYt$||| jj}|j j||  |j!_|j!j|j_t||}t||}|S )zI
    re-compute char quad if ascender/descender values make no sense
    r   r   r  皙?r  r   )%r   r.   r/  r   ru  ri   r7   FzStextLineFzStextCharg_skip_quad_correctionsrh  r  FzFontll_fz_keep_fontr  JM_font_ascenderJM_font_descenderr  FLT_EPSILONg_small_glyph_heightsfz_font_bboxr0  r1  r  r~  r  r  rc  r   fz_transform_quadr  r	  r	  r	  r  r  r  )r   r  r  ascdscrG  asc_dscr   fwidthr  r  trm1trm2xlate1xlate2rh  cwidthr  r   r   r   ru  T7  sz   


$ 





ru  c           
   
      s   t | j t  } fdd}|| d}t|}|dkr dS t  td}g }t|D ]=}t t 	||}|dkr]t 
t 	t 	||dt 
t 	t 	||df}	||	 q.t 
t 	||}	||	 q.|S )z8
    return list of choices for list or combo boxes
    c              
      s   t t | jtd}t |}g }|s|S t  td}t|D ]?}t t ||}|dkrRt 	t t ||dt 	t t ||df}|
| q#tt 	t ||}|
| q#|S )NOptr   r   r   )r.   r  rh   r:   rq   r  rp   r   r  rm   r)  rn   )rO   	exportvaloptarrr   r  r   r   r~   r   r   r   pdf_choice_widget_options7  s    
z4JM_choice_options.<locals>.pdf_choice_widget_optionsr   Nr  r   r   )r.   rh   r:   r   r  rp   rq   r   r  r  rm   r)  )
rO   r   r  r  r   r  r  r   r   r~   r   r  r   JM_choice_options7  s&   

r  c                 C   s   t | ttfr| d } t | ttfsdg fS t| dvr dg fS | d d  }tt|D ]}|| dk s:|| dkr>d||< q,t||fS )Nr   r   )r   r   r   r  r   )r7   r  r  r  r  r  r   )rR  r&   r   r   r   r   r   7  s   r   c                 C   s@  t  }d}t| }t|tt|}|  }|j|j }|j	|j
 }|  }|| }	||j
|    |j|   |  }
t| |
|}d}t|rN|S t|D ]8}td|	|D ]+}t| |
| |}||kr|}||d }|d urx||7 }|||< d}|}qZ|d7 }qZ|
|7 }
qR|}||}|d ur||7 }|||< |S rj  )rf   r.   r
  fz_intersect_irectr1  r  ra
  r0  r1  r2  r3  r   r  r~  r  fz_is_empty_irectr   r"   )r  rZ  r  r
  r
  ra
  r  r,  r   	substrider  oldpixr   r   newpixr
  r  r   r   r   r
  7  sB   
$



r
  c                 C   sD   t | t j\}}|r|dkrdS t t ||}t || |S )z*
    compress char* into a new buffer
    r   N)r.    fz_new_deflated_data_from_bufferFZ_DEFLATE_BESTr  fz_new_buffer_from_datafz_resize_buffer)inbufferr  compressed_lengthr&  r   r   r   JM_compress_buffer8  s   r  c           
      C   s   d}t  }| D ]8}|jjtjkrq|D ]+}d}|D ] }t||}t||r:d}|r1|d d}|t	|jj
 q|r?d}qq| }	|	S )Nr   r   r  )r  StringIOri   r>   r.   r\  r^  r_  r@  rn  r  r  )
rG   r  need_new_liner  rf  r   line_had_textr  r   r  r   r   r   r  -8  s,   


r  c                 C   sD  t  }d}|}|}||krd}|}|}t|}|}		 t|	||s"n<t | |	}
t |
}t ||\}}}t |
|t  t 	  t 
| d}t |||||}t |d| |	d7 }	qt  }d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_t d}t |}t ||| t |}t|tsJ |S )zx
    Convert any MuPDF document to a PDF
    Returns bytes object containing the PDF, created via 'write' function.
    r   r   Nr  r   i    )r.   r<   rB
  r  rN  r	  pdf_page_writer	  r   r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r   )r   r  r  r   r  incrr  r}   r  r   rG   r  r	  r   r  r  r  r   r6  r  r   r   r   r?  D8  sR   




r?  c           
      C   sN  t t t | d}t |t j}t |}z\t| || t |t	d| |t j
krH|ttB B }t t | t |t	dt	dt	d t t | d}|jslt | d}t t | |t	dt	dt	d t || W |S  ty }	 z&trt  t || |t j
krt t | t |t	dt	dt	d  d }	~	ww )	NzRoot/AcroForm/SigFlagsr`  rR  rS  r  zRoot/AcroForm/Fieldsr   Fields)r.   rr   rj  rV  pdf_create_annot_rawr  rh   JM_set_field_typer  rq   PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyrp  
pdf_new_ntri   r   r}  rt   ru   r   r  ro  )
r   rG   r>   	fieldnameold_sigflagsrO   r   r  rq  r}   r   r   r   r  x8  sR   

	

r  c                 C   sl   t rt| S t| }tt| td}t|s t	|r"|}|j
|j
 }|j
|j }||_||_
|S )z%
    return a PDF page's CropBox
    rY	  )r   r   r~  r0
  r.   rO	  r  rq   r  r  r2  r3  )r  r  r  r3  r2  r   r   r   r~  8  s   
r~  c                 C   s   t | }t|S )z&
    just the inverse of rotation
    )r  r.   r  )rG   mpr   r   r   rz  8  s   
rz  c           	      C   s   |r|j sdS tt|td}tt|td t|  td}|j s,J t|}t|d ddD ]#}t	||}t|td}|j sMq9t
|t|s\t|| q9|j sbJ t|}|tjkrtt| | dS t| | dS )zj
    delete an annotation using mupdf functions, but first delete the /AP
    dict key in annot->obj.
    Nr   r   r   r   r   r   )ri   r.   rp   rh   rq   r   rz   r  r   r  r   r  rd   r  r  JM_delete_widget)	rG   rO   popupr  r   r   r	  r
  r   r   r   r   r	  8  s(   





r	  c                 C   s  d}t | d}t |tdd t |tdd}t |td| t |td| t |td| t |td	td
 d}	t | t |	t  d}
t |td|
 t	| |
|| t 
|\}}t |
td| t |
td| t |
tdd}t |td| |S )zE
    embed a new file in a PDF (not only /EmbeddedFiles entries)
    r   rz  r  r  r  r  r  r  r  Filespecs     rk  r  r  r  )r.   r   r   rq   r  r   r  r  r  r   rm  r   )r   r&  r   rq  r"  r  r  r~   efbsr  rS  r  r   r   r   r|  8  s.   r|  c                 C   s   t t | td}t |td}|jr%t |dkr%t |td t |tdtdtd}|jrAt |tdd dS dS )	z
    perform some cleaning if we have /EmbeddedFiles:
    (1) remove any /Limits if /Names exists
    (2) remove any empty /Collection
    (3) set /PageMode/UseAttachments
    rR  
Collectionr   rn  ro  r  r  N)	r.   rp   rV  rq   ri   r   r   r   r   )r   r  collefilesr   r   r   r  
9  s   r  c                 C   s$   | j sdS t| }t|dd}|S )Nr,   r.  errors)ri   r.   r  r  )r  r  r~   r   r   r   r<  "9  s
   
r<  c                 C   s   t t | td}|jsFt d}d}|D ]}|t|7 }qt t | tdd}t |t 	|t
| t |t 	|t
| dS dS )z!
    Store ID in PDF trailer
    r  r  r,   r   N)r.   rp   rV  rq   ri   
fz_memrnd2r  r   r}  ro  r  )r   r  rnd0rndr   r   r   r   r  *9  s   
r  c                 C   s   t t t | tdtd}|jr|S t t | td}t |tdd}t |tdd t |tdd}t |tdd t |td	d t |td
d t |tdd |S )z7
    Ensure OCProperties, return /OCProperties key
    rR  r  r   r  r   r  r  r  r  r  RBGroups)r.   rp   rV  rq   ri   r   r   )r   r,  r  r  r   r   r   r!  :9  s   "r!  c                 C   s|   | sdS |  drdS |  drdS |  drdS |  dr dS |  dr'd	S |  d
r.d	S |  dr5dS |  dr<dS dS )z'
    Make /DA string of annotation
    rK  Corf  coTirg  tiSySymbr   Zarh  zarp  r{  r   r   r   JM_expand_fnameL9  s   r  c                 C   sX   | t krdS | tkrdS | tkrdS | tkrdS | tkrdS | tkr$dS | tkr*dS dS )	z!
    String from widget type
    ButtonCheckBoxRadioButtonTextListBoxComboBox	Signaturer+  )r{  r|  rm  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )wtyper   r   r   JM_field_type_text\9  s   r  c           
      C   s   t | tjsJ t|t| }|j|j }|j|j }|dks%|dkr'dS | 	 }||j| 
   |  |j|     }	 |}t|D ]}t|  D ]}	t| |||	  |d7 }qNqF||7 }|d8 }|dkrn	 dS q@rj  )r7   r.   rS
  r  r
  r0  r1  r2  r3  ra
  r  r   r~  r   rb
  )
r  r   r-  r[  r  destspandestpr  r~  r   r   r   r   r
  q9  s*   (
r
  c                 C   s   t | tjsJ d}t| }t|}	 t |tjsJ |js!ntt|d}|r8t|t| s8d}nt	|}q|rBt
S dS )z
    Return the first annotation whose /IRT key ("In Response To") points to
    annot. Used to remove the response chain of a given annotation.
    r   r   rn  N)r7   r.   rL   r   r	  ri   rg   rh   r   r  r  )rO   r  rG   annotptrr	  r   r   r   r  9  s    



r  c                 C   s"   t | tjsJ trdS t| S )3
    need own versions of ascender / descender
    r  )r7   r.   r  r  r  r  r   r   r   r  9  s   
r  c                 C   s&   t | tjsJ trdS t| }|S )r  gɿ)r7   r.   r  r  r  )r  r&   r   r   r   r  9  s
   
r  c                 C   s@   | dks| dkr
dS |sdS t | }|D ]	}||kr dS qdS )z7Check if ch is an extra word delimiting character.
    r  r  TFrm  )r  r  r  rc  r   r   r   r  9  s   r  c                 C   sL   t | tjsJ t| }|d}ts|dks|dkr|S ||d d  S )N+r   rz  r   )r7   r.   r  r  r+  g_subset_fontnames)r  r#   r  r   r   r   JM_font_name9  s   

r  c              	   C   s"  d}t |}t|D ]}t ||}t ||}t |s1t dt | dt | d qt 	|t j
}	t 	|t j}
|
jrGt |
rOt 	|t j}n|
}t 	|t j}t |rdt 	|t j}t |}d}|rrt| |}||t |	tt |t |t ||f}|| q|S )Nr   r  z' is no font dict ( 0 R)rn  )r.   r   r   r   r   r   fz_warnr   rk   rp   PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontri   rq  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingrr  r  r)  )r   dict_fontliststream_xrefr  r   r   refnamer
  rt  ru  r#   rP  r{   r  rr  r   r   r   JM_gather_fonts9  s<   

$


	r  r  r  c              	   C   s&  t | tjsJ d}t|}t|D ]}}t||}t||}t|s9tdt	| dt
| d qt|td}	t|	tdsJqt|td}
t|td}|jrct|}nt }|
jrttt|
|}nttjj}t
|}|t	||t|f}|| q|S )	z6
    Store info of a /Form xobject in Python list
    r   r  z' is no form dict (r  r  Formr   r   )r7   r.   r<   r   r   r   r   r   r  r   rk   rp   rq   ro  ri   pdf_to_matrixr   r  rO	  r   r   r   r)  )r   r  	imagelistr  r  r   r   r  	imagedictr   r	  r   r   r   r{   rr  r   r   r   JM_gather_forms9  s8   

$
r  r   c                 C   s  d}t |}t|D ]}t ||}t ||}t |s1t dt | dt | d qt 	|t
d}	t |	t
dsBqt |}
d}t |t
dt
d	}|jr\t |}t |t
d
t
d}t |rrt |d}t d}t |t
dt
d}t |r|}t |d}t |t
dst |t
drt |d}t |rt |d}t |t
dt
d}t |t
dt
d}t |t
dt
d}|
|t |t |t |tt |tt |tt |tt ||f
}|| q|S )z/
    Store info of an image in Python list
    r   r  z' is no image dict (r  r  rz  r   r{  r|  Filterr  
ColorSpaceCSDeviceN
Separationr   r	  r  r	  r   BitsPerComponentBPC)r.   r   r   r   r   r   r  r   rk   rp   rq   ro  r  ri   r{  r  r  rr   r  r)  )r   r  r  r  r  r   r   r  r  r   r{   genr  r   altcsrE  csesr  r,  r  rr  r   r   r   JM_gather_images:  s\   

$





r  c                 C   sb   t | tjsJ d}t| }	 |jsn|tt|kr!d}nt|}q|s/td| |S )z$
    retrieve annot by its xref
    r   r   z$xref %d is not an annot of this page)	r7   r.   rD   r	  ri   rk   rh   r  rt   )rG   r{   r  rO   r   r   r   rK	  R:  s   

rK	  c                 C   sz   t | tjsJ |sdS d}t| }	 |jsnttt|d\}}||kr-d}nt|}q|s;t	d| |S )z*
    retrieve annot by name (/NM key)
    Nr   r   rd  z!'%s' is not an annot of this page)
r7   r.   rD   r	  ri   pdf_to_stringrg   rh   r  rt   )rG   r#   r  rO   rO  r  r   r   r   rJ	  f:  s"   

	rJ	  c                 C   sf   g }t |  t j}|js|S tt |D ]}t ||}t |d}|jr0|	t 
| q|S )Nrd  )r.   rp   rz   PDF_ENUM_NAME_Annotsri   r   r  r  rg   r)  rm   )rG   rq  r  r   r   r#   r   r   r   r	  ~:  s   r	  c           
      C   s   t r	t| }|S g }t| td}t|}t|D ]8}t||}t	|}t|td}|j
s5qtt|}|tjkrCqt|d}	|||t|	f q|S )zK
    return the xrefs and /NM ids of a page's annots, links and fields
    r   r  rd  )r   r   r}  r.   rp   rq   r  r   r  rk   ri   r  r   PDF_ANNOT_UNKNOWNrg   r)  rm   )
r  rq  r  r   r   r   r{   rt  r   r  r   r   r   r}  :  s$   



r}  c                 C   s   t j}| du r	|S | }|ds|drt j}|S |ds$|dr)t j}|S |ds3|dr8t j}|S |dsB|d	rGt j}|S |d
sQ|drTt j}|S )z7
    return pdf_obj "border style" from Python str
    Nr-  rM  rc  r  r   rV  r  Ur  rI  )r.   PDF_ENUM_NAME_Srp  PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r  r~   r  r   r   r   rc  :  s   rc  c
                    s    fdd}
d}d}|rt d||d}|
|S |r*t|}t d||d}|
|S |dkr7t |}|
|S | rPt | }|jrE|
|S t | ||}|
|S t ||\}}}d}|rft 	d|||d}|jrm|
|S t 
|||||}|
|S )z6
    return a fz_font from a number of parameters
    c                    s(   | j stt| j jjst|   | S rK   )ri   r   MSG_FONT_FAILEDr%  r  r.   fz_set_font_embeddingr  ry  r   r   fertig:  s
   
zJM_get_font.<locals>.fertigr   Nr   )r.   fz_new_font_from_filer   r  fz_new_cjk_fontfz_new_base14_fontri   fz_new_builtin_fontfz_lookup_noto_fontr  fz_load_fallback_font)ra   r  r  ru  rw  r  rv  rw  rx  ry  r  rw  r  r   r  r  r   r  r   rt  :  s6   

rt  c                 C   sN  |dk rdS t | |}t |td}|jr)t t |d}t |td}nt |td}|js:td dS |}d}t |td}|jrK|}t |td}|jrX|}t |td	}|jr|}t |td
}|jr{t |s{td dS t 	|tdrnt 	|tdrnt 	|tdrntd |std dS t 
|S )z@
    Return the contents of a font file, identified by xref
    r   NDescendantFontsr   FontDescriptorz%invalid font - FontDescriptor missingFontFile	FontFile2	FontFile3r  invalid font descriptor subtypeType1CCIDFontType0COpenTypez6warning: unhandled font type {pdf_to_name(ctx, obj)!r}zwarning: unhandled font type)r.   r  rp   rq   ri   r  r  r   r  ro  r   )r   r{   r	  desftrz   r   r   r   r   r  :  sJ   
r  c           	      C   s   t | tdtd}|jsdS t |}|dk rdS g }t|D ]}t ||}t ||}t |}t 	|}|
||f q!|S )z
    Return the items of Resources/Properties (used for Marked Content)
    Argument may be e.g. a page object or a Form XObject
    r   
Propertiesr   r   )r.   r   rq   ri   r   r   r   r   r   rk   r)  )	r9	  
propertiesr   r  r   rh  r~   r  r{   r   r   r   r		  *;  s   


r		  c                 C   s^   d}t | }|jr!t |}|t |krd}nt |}|js
|s+td| dt|S )z%
    retrieve widget by its xref
    FTzxref z is not a widget of this page)r.   r	  ri   rh   rk   r  rt   rI   )rG   r{   r  rO   r   r   r   r   r.
  @;  s   


r.
  c                    s~  t | j}t | j}| }| } fdd}dd }t |j}| _|tkr;t ||r5|dd n|dd n|dd | d	t	t 
| | d
t	t| t |}	| d|	 t |td}
|
jrvt |
}| d| d}|tkrt |td}
|
jr| dt |
 t |td}
|
jrt |
}|st |}| dt	| | dt | t t |tdtd}|dkrd}| d| t |tdtd}
t |
rt |
}dg| }t|D ]}t t |
|||< q| d| | dt |j | dt |j t |tdtd}
t |
rMt |
}dg| }t|D ]}t t |
|||< q8| d| t |tdtd}
t |
rt |
}dg| }t|D ]}t t |
|||< ql| d | | d!t|  t t  |td"}| d#t	| t |tdtd$}
|
jr| d%t	t |
 | d&t !|  " }t |td'}t#|}| d(| | d)t#t |td*td+ | d,t#t |td*td- | d.t#t |td*td/ | d0t#t |td*td1 | d2t#t |td*t $d3 | d4t#t |td*t $d5 dS )6z
    Populate a Python Widget object with the values from a PDF form field.
    Called by "Page.first_widget" and "Widget.next".
    c                    s   t  | | d S rK   r+  )rh  r  r  r   r   SETATTR];  r  z)JM_get_widget_properties.<locals>.SETATTRc                 S   s   t | || d S rK   r  )modrh  r  r   r   r   SETATTR_DROP`;  s   z.JM_get_widget_properties.<locals>.SETATTR_DROPrY  TFNrL  rW  rQ  TUrR  r   rP  rl  rS  rU  rT  r  r   r   rM  r  rN  r\  r]  MKBGr   BCr  rO  r  r^  r   rX  rT  r  ru  r_  AAKr`  r  ra  Vrb  rK  rc  Blrd  Fo)%r.   rh   r:   r   r   pdf_widget_typerV  r  pdf_signature_is_signedrn   pdf_field_border_styler  pdf_load_field_namerp   rq   ri   rm   rm  rk   r   pdf_field_valuepdf_field_displayrT  r   r{  r  r   rr   r  pdf_text_widget_max_lenpdf_text_widget_formatr  r  pdf_field_flagsrw   JM_get_scriptrW  )rO   r  r   rG   r   twr  r  rV  rQ  rz   rE  fvaluerM  r   rc  r   r   r  callr  ssr   r  r   JM_get_widget_propertiesQ;  s   










r6  c                 C   s6  |dk rdS t | |}t |td}|jr)t t |d}t |td}nt |td}|js6dS |}t |td}|jrEdS t |td}|jrRd	S t |td
}|jrt |td}|jrst |sstd dS t 	|tdr}dS t 	|tdrdS t 	|tdrdS tdt 
| dS )zF
    Return the file extension of a font file, identified by xref
    r   rn  r  r   r  r  pfar  ttfr  r  r  r  cffr  cidr  otfzunhandled font type '%s')r.   r  rp   rq   ri   r  r  r  PySys_WriteStdoutro  r   )r   r{   r	  r  rz   r   r   r   rr  ;  s>   rr  c                 C   sT   t  }t| r(t| }t|D ]}t| |}t|}||vr'|| q|S )z
    Get OCG arrays from OC configuration
    Returns dict {"basestate":name, "on":list, "off":list, "rbg":list, "locked":list}
    )r  r.   r{  r  r   r  rk   r)  )r  list_r   r   rz   r  r   r   r   JM_get_ocg_arrays_imp<  s   



r>  c           	      C   s   t  }t| td}t|}|r||d< t| td}t|}|r'||d< t| td}t|}|r9||d< t }t| td}t|rdt|}t|D ]}t	||}t|}|
| qR|rj||d< t| td	}|jr~t|}||d
< |S )Nr  r  r  r  LockedrG  r  r  rp  r  )rf   r.   rp   rq   r>  r  r{  r  r   r  r)  ri   r   )	confr  r  r=  r   r   rz   list1r@	  r   r   r   r  <  s8   


r  c           	      C   s   t |}td|dD ]9}t t ||}t |}t t ||d }t|dd}t |}t|t	s8J |
d}| ||f qd S )Nr   r   r   r  )r.   r  r   r  r  rr   r/  fz_buffer_extractr7   r   rh  r)  )	r  r  r   r   rh  r  r~   r   r  r   r   r   r  5<  s   



r  c                 C   s   | j sdS t| td}t|}|dkr$t| td}|j s#dS ndS t|r3tt|}nt|rBt	|}t
|}ndS |rH|S dS )z
    JavaScript extractor
    Returns either the script source or None. Parameter is a PDF action
    dictionary, which must have keys /S and /JS. The value of /S must be
    '/JavaScript'. The value of /JS is returned.
    NrI  
JavaScriptJS)ri   r.   rp   rq   r   r.  rn   rm   r   r   r<  )rh  r   jjjsru  r   r   r   r   r1  B<  s&   




r1  c                 C   s   | j jrt| dsdS dS )z(
    Ensure valid journalling state
    r   r   )ri   r$  r.   r+  r*  r   r   r   r)  a<  s   r)  c                 C   s   | t jkrdS | t jkrdS | t jkrdS | t jkrdS | t jkr#dS | t jkr*dS | t jkr1dS | t jkr8dS | t j	kr?d	S | t j
krFd
S | t jkrMdS | t jkrTdS | t jkr[dS | t jkrbdS dS )z.
    return extension for fitz image type
    faxrI
  flatelzwrldbmpgifr~  r
  r}  jxrr  r
  tiffrn  )r.   r  r  r  r  r  FZ_IMAGE_BMPFZ_IMAGE_GIFr  FZ_IMAGE_JPEGr  FZ_IMAGE_JXRFZ_IMAGE_PNGFZ_IMAGE_PNMFZ_IMAGE_TIFF)r   r   r   r   r  j<  s   r  c                 C   s^   t |tjsJ ttjj}tt||}tdkr"t|t}|t	|f}t
| d S )NrH  )r7   r.   r   r   r  r  fz_quad_from_rectrX  g_img_info_matrixJM_py_from_quad
g_img_infor)  )r
  rD  r#   r>	  r   r  r  r   r   r   JM_image_filter<  s   rZ  c                 C   s  | sdS || }|dk rt jd dS tt}|tjkr dS |r)tt|}ntt|}t	|}t
|}t|\}}t|}	t| }
t }| |t< | |t< |	|d< t||t< ||t< ||t< | |t< | |t< t||t< |
|t< |r||t< |S )z
    Return basic properties of an image provided as bytes or bytearray
    The function creates an fz_image and optionally returns it.
    Nr  zbad image data
orientation) r   r   r@  r.   r  r  r  r  fz_new_buffer_from_shared_datar  fz_image_orientation_matrixr  fz_image_orientationr  rA  rf   r[  r  r\  r  r   r  r  r  r   r  r  r  r  r  r  r  )r}
  
keep_imager  r>   r   r>	  rD  r  r  r[  r  rl  r   r   r   JM_image_profile<  s>   




r`  rH  c                 C   sr   |   }t at }t| |t G dd dtj}| }tdddd|d}g at	|| | t
t}g a|S )Nc                       $   e Zd Z fddZdd Z  ZS )z0JM_image_reporter.<locals>.SanitizeFilterOptionsc                       t    |   d S rK   r=   rP   use_virtual_image_filterrW   r  r   r   rP   <     
z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__c                 S   s   t d t||| d S rK   )rZ  r.   r   rN   r  rD  r#   r>	  r   r   r   image_filter<  r  z=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterr  r  r  rP   rg  r  r   r   r  r   SanitizeFilterOptions<  s    ri  r   )r   r   r  r   r  )r   r.   r   rW  r   ry  PdfSanitizeFilterOptions2r   rY  r	  r  )rG   r   r  ri  sanitize_filter_optionsfilter_optionsr  r   r   r   r	  <  s$   	r	  c           
   	   C   s   t d}t ||j}|jr1t | d}t | ||||||}	t |	| ||t   t 	|	 n|}t || ||t   t 	| ||fS )z-
        Returns (out_buf, out_res).
        r
  r   )
r.   r  pdf_new_buffer_processorr   r   r   pdf_new_filter_processorpdf_process_contentsr  pdf_close_processor)
r   in_stmin_resr  r   r  out_bufproc_bufferout_resproc_filterr   r   r   JM_filter_content_stream<  s   

rw  c              	   C   s   |   }t }| |_d|_d|_d|_d|_t }t	| t
dddd| t|  td}d}t|r=t|}t| }t| }g at||||||\}}	tt}
|
S )Nr   r   StructParentsr   )r   JM_image_reporter_Filter_pager   r   r   r   r.   r   ry  r   rp   rz   rq   r  rr   pdf_page_contentspdf_page_resourcesrY  rw  r  )rG   r   r   rD  struct_parents_objr  r  old_resr   new_resr  r   r   r   r	  =  s&   



c                 C   s   t |td}t | |t  d}t |}t |r/|r&t || |S t ||d |S t 	| d}|rG|j
r@t || t || nt || |j
rVt || t |td| |S )ag  
    Insert a buffer as a new separate /Contents object of a page.
    1. Create a new stream object from buffer 'newcont'
    2. If /Contents already is an array, then just prepend or append this object
    3. Else, create new array and put old content obj and this object into it.
       If the page had no /Contents before, just create a 1-item array.
    rl  r   r  )r.   rp   rq   r  r  rk   r{  r}  r  r   ri   r   )r   r  newcontr,	  r  newcontsr{   carrr   r   r   r)	  =  s&   

r)	  c
              	   C   s  d}
d}d}d}d}d}d}d}d}d}t |  |	dkr$t|	\}}}|r=td|||d}
t| |
|	||}d}d}nT|rFt|\}}|r]t|||dd}
t| |
|}d}d}n4|rhtd||d}
nt|}|j	sut
ttt td||d}
|st| |
}d}n	t| |
|}d}t|}ttt|td}ttt|td}|stt| |}t|
}t|
}||||t||	||d	g}|S )
z 
    Insert a font in a PDF
    Nr   r   rn  r   r   rm  r  )r#   r>   r  r  r  r  r  )r  r.   r  r  pdf_add_cjk_fontr  pdf_add_simple_fontr  r   ri   r  r  r  r
  r  pdf_add_cid_fontrk   r  r   rp   rq   rn   rr  r  r  r  )r   r  r  r  rG	  rp  r  r  rP  r  r  r   r  ixrefrw  r  r  r#   r  extor  rH	  r  r  r   r   r   r  :=  sl   


r  c                 C   s8  t | tjsJ t |tjsJ t|t| }|j|j }|j|j	 }|dks-|dkr/dS | 
 }||j	|    |  |j|     }|  |   }|  }	 |}t|D ]1}	t|D ]}
t| |}d| }t| || |d7 }q`|rt| |}|d7 }t| || qZ||7 }|d8 }|dkr	 dS qT)z>
    invert a rectangle - also supports non-alpha pixmaps
    r   r   rJ
  )r7   r.   rS
  rP
  r  r
  r0  r1  r2  r3  ra
  r  r   r~  rB  r   rc
  rb
  )r  r-  r[  r  r  r  r  rB  r  r~  r   r5  r   r   r   r
  =  s<   (
r
  c                 C   s  t | tjr| S t | tjrt| j| j| j| j} | S t | t	r/t
| j| j| j| j}|S | r;t| r;t| dkrAttjS g d}tdD ]*}| | ||< || du r_ttj  S || tk rit||< || tkrst||< qIt
|d |d |d |d S )z9
    PySequence to fz_irect. Default: infinite irect
    r  r
  Nr   r   r   r   )r7   r.   rP
  r  rQ
  r1  r3  r0  r2  r   fz_make_irectr  r  fz_infinite_irectr   r   rg
  rh
  )r   r&   r  r   r   r   r   r  =  s*   
 r  c                 C   r  r  r   )r  r   r   r   r  =  r  r  c                 C   s   t | }t |td}t |rt |S t |}g }t|D ]}t ||}t 	|r5t |d}|
tt | q"|S )z 
    ListBox retrieve value
    r%  r   )r.   rh   rp   rq   r.  rm   r  r   r  r{  r)  rn   )rO   r   r  r   r  r   elemr   r   r   JM_listbox_value=  s   




r  c              	   C   s   d}|dk r|d7 }nL|dkr||d dd7 }n=|dkr J |dkr;||d dd	|d dd	|d dd
7 }n||d dd	|d dd	|d dd	|d dd7 }|dt | d	| d7 }tt| tj| d S )Nr,   r   z0 g r   rr  z g r   r   r  z rg z k rb  r  )r  r.   r  rh   PDF_ENUM_NAME_DA)rO   r  r   ra   rb   r&  r   r   r   r  =  s   
.8r  c                 C   s   t rt| ||||S d }g }t| ttjj}ttjj}G dd d}	|	 }
|	 }|D ]}t||}t||sDt	|sDq1t
tt|jj||}t|jj}|jj|_||_ttt|jj|_|jj|_ttt|jj|_ttt|jj|_|j|
jks|j|
jks|j|
jks|j|
jkr|
jdkr|r||t< d }nt||t< t| t||t< t||t< t ||}|!| d }t" }|j}|j}|jdk rd}d}|j|t#< |j|t$< t%|j|t&< |j|t'< ||d< ||d< |	|}
|}|}t ||}|r?t" }t|jj|t< t||t< t(|jj)|t*< |d u r9g }|!| q1t+||jj) q1|r~|rT||t< d }nt||t< t| t||t< t||t< t,|s||!| t ||}d }t,|s|| t-< |S || t-< |S )	Nc                   @   s   e Zd ZdddZdd ZdS )z$JM_make_spanlist.<locals>.char_styleNc                 S   s`   |r|j | _ |j| _|j| _|j| _|j| _|j| _d S d| _ d| _d| _d| _d| _d| _d S )Nr   r,   r   r  r%  r  rR  r  r"  )rN   r  r   r   r   rP   >  s   
z-JM_make_spanlist.<locals>.char_style.__init__c                 S   s2   | j  d| j d| j d| j d| j d| j S )Nr  r  rW   r   r   r   rX   >  s   2z,JM_make_spanlist.<locals>.char_style.__str__rK   )r  r  r  rP   rX   r   r   r   r   
char_style>  s    
r  r   r  r}  r|  r  r  ).r   r   JM_make_spanlistr.   r]  r   r[  r^  r_  r  r{  r  r  ri   r  r|  r   r  r%  r  rR  r  r  r  r"  dictkey_charsr<  ro   JM_py_from_pointdictkey_originr   r}  ra  r)  rf   r  dictkey_flagsr  dictkey_fontr  r  r  	dictkey_cr`  r  dictkey_spans)	line_dictr   rI
  r  re  	char_list	span_list	span_rect	line_rectr  	old_styler  r  r   r%  r   r<  span_originr  r"  	char_dictr   r   r   r  =  s   















r  c                 C   s"  |   }t| }| }| }tj}t|j}|r"|j	j
}|tjk s,|tjkr/tj}d }|rF|tjkrFtt|j}	t|}
n
t|t }	d}
t|	}|sZtd}||t< ||t< |
|t< ||t< | |t< | |t< | |t< t|   |t!< t"||t#< ||t$< d S )Nr  r,   )%rc  r.   r  rA  r[  r\  r  r  ri   r  r>   rO  r  r  r  r  r  r  r  r   JM_BinFromCharr  r  r  r  r  r  r  r  r  r  r   r~  r  r  r  r  )rf  r  r>	  r   r[  r\  r   ll_fz_compressed_bufferrw  r&  r  r   r   r   JM_make_image_block|>  s:   
r  c           
   	   C   s   t r
ttjt|S g }ttjj}| D ]@}t	t
|t|jjr+t|s+qt }t|||||}	t||	}|jj|t< t|jj|t< t|	|t< || qt||t< ||t< d S rK   )r   r   JM_make_text_blockr  ri   rV  r.   r   r[  r  r0  r   r  rf   r  ra  r  dictkey_wmoder  r  dictkey_dirr   r}  r)  dictkey_lines)
rf  r  rI
  r  re  	line_list
block_rectr   r  r  r   r   r   r  >  s$   r  c           	   	   C   s  t r
t| j||S td}g }t| jj}d}| D ]a}|d7 }t|t|jj	s:t
|s:|jjtjkr:qt
|sNtt|t|jj	rNqt }||t< |jj|t< |jjtjkrpt|jj	|t< t|| nt||||| || q||t< d S )Nr
  r   r   )r   r   rU  ri   r.   r  r   r  fz_contains_rectr   r  r>   FZ_STEXT_BLOCK_IMAGEr  r0  rf   r|  dictkey_typer   r}  r  r  r)  dictkey_blocks)	r  rV  rI
  text_buffer
block_listre  rd  rf  r  r   r   r   rU  >  s4   

rU  c              	   C   s   g d}t | tjr| S t | tr!t| j| j| j| j| j| j	S | r-t
| r-t| dkr1t S tdD ]}t| |||< || d u rJt   S q5t|d |d |d |d |d |d S )	N)r   r   r   r   r   r   rz  r   r   r   r   r  r  )r7   r.   r   r   r2  r-  r  rc  r}   r  r  r  r   r/  r   )r   r2  r   r   r   r   r9  >  s   
 ,r9  c              	   C   s   t t jj}t t | td}t |st |r(d|_d|_	d|_
d|_t t |j|j
t |j	|jt |j|j
t |j	|j}|j
|j dk sX|j|j	 dk r_t t jj}|S )z&
    return a PDF page's MediaBox
    r@
  r   d    r   )r.   r   r  rO	  r  rq   r  r  r1  r3  r0  r2  fz_minfz_max)r  page_mediaboxr  r   r   r   r0
  >  s&   r0
  c
                 C   s  t rt| |||||||||	
S |}
d}t|| d }||k rX|}||krVt| |||
||||	 |d7 }|dkrH|| dkrHtjd|| |d7 }|
d7 }
||ks'dS dS |}||krt| |||
||||	 |d7 }|dkr|| dkrtjd|| |d8 }|
d7 }
||ks^dS dS )z
    Copy a range of pages (spage, epage) from a source PDF to a specified
    location (apage) of the target PDF.
    If spage > epage, the sequence of source pages is reversed.
    r   r   zInserted %i of %i pages.
N)	r   r   r  r.   fz_absi
page_merger   r   r@  )doc_desdoc_srcspageepageapager   r  r  r  	graft_map	afterpagecounterrt  rG   r   r   r   r  ?  sF   r  c                 C   s  t |  td}t |td}t |td}t |td}t |td}d}d}t |rt |}	t |rftt |D ] }
t t ||
}|	dsUqDt 
|dd }||krd|}qDn	t |td|	}|d7 }t|	D ](}
t t ||
}t 
|dd | }d| }t ||
}t ||| qwt |rtt |D ] }
t t ||
}|	d	sqt 
|dd }||kr|}qn	t |tdd
}|d7 }tt |D ](}
t t ||
}t 
|dd | }d	| }t ||
}t ||| q||fS )aW  
    Merge the /Resources object created by a text pdf device into the page.
    The device may have created multiple /ExtGState/Alp? and /Font/F? objects.
    These need to be renamed (renumbered) to not overwrite existing page
    objects from previous executions.
    Returns the next available numbers n, m for objects /Alp<n>, /F<m>.
    r   r   rU  r   Alpr   Nr   r  r   )r.   rp   rz   rq   r   r   r   r   r   rp  fz_atoir   r   r  )rG   temp_resr   	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsr   r   r  r   r   r~   r  r   r   r   r  9?  s\   	



	



r  c                 C   s4   t j  t|  trt jd|  d dS dS )z!
    redirect MuPDF warnings
    zmupdfpy warning: r  N)r   r   r   r>  r)  JM_mupdf_show_warningsr@  messager   r   r   JM_mupdf_warning{?  s
   

r  c                 C   s*   t |  trtjd|  d d S d S )Nzmupdfpy error: r  )r>  r)  JM_mupdf_show_errorsr   r   r@  r  r   r   r   JM_mupdf_error?  s   
r  c                 C   s   t | tsJ t| |S rK   )r7   r  JM_new_bbox_device_Device)r  r	  r   r   r   r	  ?  s   
r	  c                 C   s   t | tjsJ t| jj}td}| D ]9}|jjtjkrO|D ]%}|D ]}t	|t
||s5t|s5q%t||jj q%t|td q!t|td q|S )z1
    make a buffer from an stext_page's text
    r  r  )r7   r.   rX  r   ri   r  r  r>   r\  r_  r^  r  fz_append_runer  rb  r  )rG   r_   r&  rf  r   r  r   r   r   JM_new_buffer_from_stext_page?  s    
r  c                 C   r
  rK   )JM_new_output_fileptr_Output)r$  r   r   r   r4  ?  rY   r4  c                 C   sD   | dk r| d7 } | dk s| dkr| d8 } | dks| d dkr dS | S )zB
    # return normalized /Rotate value:one of 0, 90, 180, 270
    r   r  r  r   )r   r   r   r   rB
  ?  s   rB
  c                 C   s2   t d}t |}t || || t | |S )Nr  )r.   r  r  r  fz_terminate_buffer)r  r  r   r   r6  r   r   r   r/  ?  s
   


r/  c                 C   s   | j s|S | }|j rPt|}||v st|tdj r	 |S || t|td}t|r6t||}t|td}t|td}t|sM|}|j s
|S )z
    Return list of outline xref numbers. Recursive function. Arguments:
    'obj' first OL item
    'xrefs' empty Python list
    r  r\  Nextr   )ri   r.   rk   rp   rq   r)  r   r]  )rz   r`  thisobjnewxrefrb  rR   r   r   r   r]  ?  s$   
	



r]  c                 C   s,   d}t |  t j}t |}t|}|S )zE
    return a PDF page's /Rotate value: one of (0, 90, 180, 270)
    r   )r.   r  rz   r  rr   rB
  )rG   r   rz   r   r   r   r5
  ?  s
   
r5
  c                 C   s8   t t|d}t |}t t j}t | ||}|S )zP
    create PDF object from given string (new in v1.14.0: MuPDF dropped it)
    rX  )r.   r  r   r  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r   r/  r   r   lexbufrl  r   r   r   rX  ?  s
   
rX  c                 C   s<  t | tjsJ |du rt }|du s&t |tjs&J dt|d| t| }t|}t|}t||}t	||}t
|}	t |tsKJ t|j|	||}
|r\t|
 nt|
d t|s|t||
|	}t| |t |t  nt||
}t| |t ttjjt  t| td|
S )z
    Version of fz_new_pixmap_from_display_list (util.c) to also support
    rendering of only the 'clip' part of the displaylist rectangle
    Nztype(seps)=r   rJ
  rI
  )r7   r.   r  r<  r>   r  r9  r  r0  r  r1  r  rR
  r:   r
  r
  r  r  r  r   r  r  r   r   r	  r>  )r=  rD  rE  rB  rZ  rn
  r_   r?  rA  r
  rF  r	  r   r   r   r  ?  s,   ,


$

r  c                 C   s   t | tjr| S t | trt| j| jS trt| S tdd}t	| d}t	| d}|du s4|du r6|S t
|t}t
|t}t|t}t|t}t||S )zM
    PySequence to fz_point. Default: (FZ_MIN_INF_RECT, FZ_MIN_INF_RECT)
    r   r   N)r7   r.   r|  r:  r~  r  r   r   r  r/  r8  rg
  r  rh
  )r
  p0r~  r  r   r   r   r  @  s    







r  c                 C   s*  t rt| |S t| tjsJ t|tjsJ t|jj	}d}d}d}d}t
|D ])\}}|jjtjkrPt
|D ]\}	}
t
|
D ]\}}qB||7 }q:||	7 }||7 }q+|D ];}|jjtjkr|D ]/}
d}|
D ]}t|
|}t|syt||r|jj}t| | qh|dkr|dkrt| d qbqWdS )z
    Plain text output. An identical copy of fz_print_stext_page_as_text,
    but lines within a block are concatenated by space instead a new-line
    character (which else leads to 2 new-lines).
    r   r   rY  r  N)r   r   rR  r7   r.   r  rX  r   ri   r  rC  r>   r\  r^  r  r_  r  r`  r(	  )r   rG   r_   rj  n_blocksn_linesn_chars	n_blocks2rf  n_lines2r   n_chars2r  chbboxr   r   r   rR  4@  sB   




rR  c                 C   s   t | |}t | }|s%|r|jst | | dS |jr#t || dS |jr+|js0t|}ntt ||}||krWt||}|jsMt | || dS t | ||| dS dS )a   
    Create a JavaScript PDF action.
    Usable for all object types which support PDF actions, even if the
    argument name suggests annotations. Up to 2 key values can be specified, so
    JavaScript actions can be stored for '/A' and '/AA/?' keys.
    N)	r.   rp   r   ri   r   r1  JM_new_javascriptr   rp  )r   key1key2r  key1_objr   ru  	newactionr   r   r   JM_put_script_@  s$   



r  c                 C      | j | j| j| jfS rK   rF  r   r   r   r   r
  @  r  r
  c                 C   s   | j | j| j| j| j| jfS rK   r  )r   r   r   r   r   @     r   c                 C   s   | j | jfS rK   r  )r
  r   r   r   r  @  r  r  c                 C   s<   | j j| j jf| jj| jjf| jj| jjf| jj| jjffS )z"
    PySequence from fz_quad.
    )r  r~  r  r	  r	  r	  )r  r   r   r   rX  @  s
   rX  c                 C   r  rK   rF  r  r   r   r   r   @  r  r   c              
   C   s  t | tjr| S t | trt| j| j| j| j} t | tjr$t	| S t | t
rEt| jj| jj| jj| jj| jj| jj| jj| jjS tdddddddd}g d}| rdt | ttfrdt| dkrf|S t| dd u rtt	t| S tdD ]M}| | }|jrt|rt|dkr|  S t|d|| _t|d|| _|| jd u s|| jd u r|  S t|t}t|t}t|t}t|t}qx|d |_|d |_|d |_|d |_|S )Nr   r
  r  r   r   r   )r7   r.   r/  r   r   r1  r3  r0  r2  rV  r	  fz_make_quadr  r~  r  r	  r	  r	  r  r  r  r/  r  r   ri   r  r  r8  rg
  r  rh
  )r   r  r
  r   rz   r~  r  r   r   r   r  @  sH   









r  c                 C   s   t | tjsJ t|  t| tj}t|r;td}tt	|D ]}t
||}t|}t|| q%|S |jrCt|}|S )zJ
    Read and concatenate a PDF page's /Conents object(s) in a buffer
    r
  )r7   r.   r  r>   rp   r	  r{  r  r   r  r  r   fz_append_bufferri   )r  r  r   r   rz   rE	  r   r   r   r  @  s   



r  c                 C   s   t | tjr| S t | trt| j| j| j| jS | r%t	| r%t
| dkr,ttjjS g d}tdD ],}t| |||< || d u rLttjj  S || tk rVt||< || tkr`t||< q4t|d |d |d |d S )Nr  r
  r   r   r   r   )r7   r.   r   r   r  r1  r3  r0  r2  r  r  r   r   r/  rg
  rh
  )r   r  r   r   r   r   r  @  s"   
 r  c                 C   s:   	 | j |jks| j|jks| j|j ks| j|jkrdS dS rj  r^  )r2  r-  r   r   r   r_  @  s   r_  c                 C   s   | sdS t |  td}|jr?|  }t ||  }t  }t  }t 	| || t 
|| |||}t |j| j_dS dS )z<
    refreshes the link and annotation tables of a page
    Nr   )r.   rp   rz   rq   ri   r   r  r   r   ry  pdf_load_link_annotsll_fz_keep_linkr  )rG   rz   r   r  r  r  r*
  r   r   r   r  @  s   r  c                 C   s   | j st S t| }|dkrt S t|  }|j}|j}|dkr/tdddd|d}|S |dkr?tdddd||}|S tddddd|}|S )z*
    calculate page rotation matrices
    r   r  r   r   r	  )	ri   r.   r   r5
  JM_cropbox_sizerz   r~  r  r  )rG   r  cb_sizer[  r\  r   r   r   r   r  A  s    r  c                 C   s  t r	t| j|S t| jj}|sd S g }G dd d}| }d|_||_d|_	d|_
t| }t|}d}t||d  |\}	}
|	d u rH|S |	|7 }	|
|7 }
d}d}| D ]}|jjtjkr`qV|D ]n}|D ]S}|d7 }t|s|t||}t||s|qf	 |s||	krd}|r||
k rt||| n#d}t||d  |\}	}
|	d u r|      S |	|7 }	|
|7 }
q|	 |d7 }qf|| dksJ d|d	|| |d7 }qb|| dksJ d|d	|| |d7 }qV|S )
Nc                   @   r  )z"JM_search_stext_page.<locals>.Hitsc                 S   s$   d| j  d| j d| j d| j S )Nz	Hits(len=z quads=z hfuzz=z vfuzz=)r  r  hfuzzvfuzzrW   r   r   r   rX   'A  r  z*JM_search_stext_page.<locals>.Hits.__str__N)r  r  r  rX   r   r   r   r   Hits&A  r  r  r   r  皙?r   r  z	haystack=z haystack_string[haystack]=)r   r   r  ri   r.   r   r  r  r  r  r  r  fz_string_from_bufferfind_stringr>   r\  r  r^  r_  on_highlight_charsearch_stext_pager7   r  r  )rG   r  r_   r  r  hitsr   haystack_stringhaystackbeginr  insider   rf  r   r  r   r&   r  r   r   r   r  A  st   






r  c              	   C   sB  t |rt d dS zt |t j}|dkr't |t j}t| ||| n |dkr3t| ||| n|dkr?t| ||| nW t 	| dS t 
|}t|D ]B}	t ||	}
t |
rct |
}nd}t |
t j}|jr|}||vr|| t| ||||| qPt d  W t 	| dS qPW t 	| dS t 	| w )zP
    Step through /Resources, looking up image, xobject or font information
    z.Circular dependencies! Consider page cleaning.Nr   r   r   r   )r.   pdf_mark_objr  rp   PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_Fontr  r  r  pdf_unmark_objr   r   r   r   rk   r  ri   r)  r  )r   r  r  r  r  r  xobjr  r   r   rz   sxrefsubrsrcsxref_tr   r   r   r  wA  s@   





r  c                 C   s   |sdS t |ttfsJ t|}|dkrdS t| }t|}t||}t|D ]C}|| }|}t |t	r?t
|| q+t |ttfrLt|dksPJ d|\}	}
|	rX|
s\J dt|d}t
||	 t
||
 q+t|td| dS )z'
    set ListBox / ComboBox values
    Nr   r   zbad choice field listr  )r7   r  r  r  r.   rh   r   r   r   rT   pdf_array_push_text_stringpdf_array_push_arrayr   rq   )rO   r  r   r   r   r  r   r~   optopt1opt2	optarrsubr   r   r   JM_set_choice_optionsA  s*   


"r	  c                 C   s  d}d}d}|t jkrtd}t}nG|t jkr td}t}t}n9|t jkr.td}ttB }n+|t jkr8td}n!|t jkrDtd}t	}n|t j
krPtd}t	}n	|t jkrYtd}|rdt |td| |dksl|dkrt |td}|| M }||O }t |td| dS dS )	z
    Set the field type
    r   NBtnTxChSigFTFf)r.   r{  rq   PDF_BTN_FIELD_IS_PUSHBUTTONrm  PDF_BTN_FIELD_IS_RADIOr|  r  r  PDF_CH_FIELD_IS_COMBOr  r  r   r  r   )r   rz   r>   setbits	clearbitstypenamer  r   r   r   r  A  s>   









r  c                 C   s8  d}t | }|d}t|}|d }|| }||= t|}t | |}	|	jsP|dkrPd|}
t t | t|
rCt	dt|||d = t|}|dks,t 
| |t | t | |}	t |	sjt	d|t |	}||krxt	d|t| dd}t|}d||f }d||f }|||d}t||}|S )	z*
    Set a PDF dict key to some value
    zfitz: replace me!rb  r   r   zpath to '%s' has indirectszcannot insert value for '%s'z/%s(%s)z/%s %s)r.   r   rd  r  rj  ri   r&  r  r  rt   pdf_dict_putpr  r.  rm   r/  r<  r.  rX  )rz   rh  r  
eyecatcherr   r=  r  r   skeytestkeyr  r  r   objstrnullvalnewvalnewstrr  r   r   r   r?  A  s>   








r?  c                 C   s,  |rt | td| |d ur't | td |r't | tdd}t|| |d urCt | td |rCt | tdd}t|| |d ur_t | td |r_t | tdd}t|| |d urt | td |rt | tdd}t|}t|D ]}|| }	t |d}
t|
|	 q~d S d S d S )Nrp  r  r   r  r?  r  )	r.   r   rq   r   r   JM_set_ocg_arrays_impr  r   r  )r@  r  r  r  r  rG  r  r   r   item0rz   r   r   r   r  B  s:   


r  c                 C   s   t | }t ||d}|jstttt t | t	d}|js)t 
| t	dd}t |t	d}|js=t 
|t	dd}t |t || dS )z
    Insert an item into Resources/Properties (used for Marked Content)
    Arguments:
    (1) e.g. page object, Form XObject
    (2) marked content name
    (3) xref of the referenced object (insert as indirect reference)
    r   r   r   r  N)r.   r   r  ri   r  r  r  r
  rp   rq   r   r   rW  )r9	  r#   r{   r   rt  r   r  r   r   r   rb	  0B  s   
rb	  c                    s  t | tr| j} t | tjsJ dt| dtt| }t| }| } fdd}|d}|}|d}t	|}t
|}	t||	}t| | |d}|ryt|ryt|}
t||
}d}t|
D ]}|| }t|| qft|| |d	}|rt|rt|}
t||
}t|
D ]
}t|||  qt||td
td |d}|rt|rt|}
t||
}d}t|
D ]}|| }t|| qt||tdtd |d}|durt|}t|td| |d}|durt|}t|}||krt|td| |tkr'|d}|}|r't|td| |d}|}t|| |ttfv rC|d}t| | |d}t|}t||td
td |d}|}t|t |td
td |d}t|}t|td| t!|td t!|td |d }|dur|tkr|t"O }n|t#kr|t$O }n	|t%kr|t&O }t|td!| |d"}t|}|rt'|| |d#}t(|td$d| |d%}t(|td&td'| |d(}t(|td&td)| |d*}t(|td&td+| |d,}t(|td&td-| |d.}t(|td&t)d/| |d0}t(|td&t)d1| |d2}t|}|t#kr|sXt*||d3d4 t+|td5d3 nt,|}|j-rxt.|}t*|||d4 t+|td5| nn|rt+|td5| na|t/kr|d6ks|d7krt,|}t.|}t*|||d4 t+|td5d7 t+|td+d7 n-t+|td5d3 t+|td+d3 n|rt*|||d4}|ttfv rt!|td8 t0|  t1| d4 t2| d4 t3|  dS )9z
    Update the PDF form field with the properties from a Python Widget object.
    Called by "Page.addWidget" and "Annot.updateWidget".
    ztype(annot)=r  c                    s   t  | d S rK   )rS   r{  r  r   r   GETATTRPB  r  z)JM_set_widget_properties.<locals>.GETATTRrV  r_   r   r   rN  rT  r  r  r   r"  rR  Nr  rQ  r`  r\  MaxLenrU  rO  rL  rI  rM  r  r^  r  DSRCrT  r  rX  ru  r  r_  r#  r$  r`  r  ra  r%  rb  rK  rc  r&  rd  r'  rS  rk  r   rl  Tr  rV  )4r7   rI   r:   r.   rL   r>   r   rh   r   r  r  r  r  r  r  r   r   r   pdf_field_set_fill_colorra  rp  rq   r  r  r+  r  r   pdf_field_set_displayr  r  r	  rc  rb  r   r  rm  r  r{  r  pdf_field_set_button_captionr  rW  pdf_set_field_valuer   pdf_button_field_on_stateri   r   r|  r   pdf_set_annot_hotpdf_set_annot_activer   )rO   r  rG   r   r   r   r  rV  r_   rot_matr   fill_colr   r   r  
border_colrE  r#   old_namer\  rc  r~   rM  r  rT  r   r   onstater  rl  r   r  r   JM_set_widget_propertiesEB  s  
$



















r0  c                 C   s<   t | }|jdd}|td}|dkr|d | }|S )Nr.  r  r   )r.   r  rh  r+  r  )r  
buff_bytesr~   r  r   r   r   r  C  s   
r  c                 C   s   t |\}}|}|dkr t|}t|t jsJ t |\}}||k r=|r=|dkr=t |t jt j t | ||d dS t | ||d dS )zD
    update a stream object
    compress stream when beneficial
       r   r   N)	r.   rm  r  r7   r  r   PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecoder  )r   rz   r   r  r  rS  nlenrE	  r   r   r   r   C  s   r   c                 C   s   t |tjsJ dt||dkrt| |d}|S t|j}| }tt	|t
d}t	|t
d}|jrCt||}	nt| |}	t|}
t| |t td|
}t| ||
d t|t
d|	 |S )zl
    Make an XObject from a PDF page
    For a positive xref assume that its object can be used instead
    ztype(gmap)=r   r@
  r   r   )r7   r.   PdfGraftMapr>   r  r  r:   rz   rO	  r  rq   ri   pdf_graft_mapped_objectpdf_graft_objectr  rf	  r   r  r   r   )r  fsrcpager{   gmaprk	  srcpagespagerefr  r	  r   r   r   r   r   re	  'C  s    re	  c                 C   s   t | ttfS rK   )r7   r  r  rI  r   r   r   r  JC  r  r  c                 C   r
  rK   )r  rI  r   r   r   r  NC  rY   r  zbad annot typezbad or missing annot AP/Nz%arg must be seq of seq of float pairszbad seq of pointszbad type: 'buffer'zbad color sequencer  zbad filetypezbad locationzbad config numberzbad layer numberzbad 'oc' referencerv  r	  zPDF has no rootr]	  zbad type: 'text'r  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imagec                 C   s   t | rK   )rt   )rJ  excr   r   r   r  qC  ry  r  c                 C   s   | st td S rK   )r   MSG_IS_NO_PDFr  r   r   r   rk  wC  s   c                 C   r'  r(  )r)  r   r*  r   r   r   r  |C  r+  strictc                 C   sl   | sdS t | tr| jd|d}nt | tr| d d  }|jd|d}|td}|dkr4|d | }|S )Nr,   rX  r  raw_unicode_escaper   )r7   rT   r  r   rh  r+  r  )r  r  r  r&   r  r   r   r   r  C  s   

r  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   r   r  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r>   r  r  r  r  r8  r   r  r   r   r   r  C  s   r  rG   r  ra   c                 C   s&   |   D ]}|d |kr|  S qdS )GReturn an entry in the page's font list if reference name matches.
    r  N)r	  rG   ra   r  r   r   r   r
  C  s
   r
  zstruct Document *c                 C   $   | j D ]}||d kr|  S qdS z3Return a font info if present in the document.
    r   Nr   r   r{   r  r   r   r   r
  C  
   
r
  r  c                 C   L   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   rh  r+  r   r  r   r  r   r   r   r}	  C     r}	  c                 C      t | sdS t| ttfv rt| dkstdt| d dkr(t| d dks,td| d d | d d	   krAdksFtd
 td
dS NFr   z$morph must be a sequence of length 2r   r   rz  zinvalid morph parm 0r  r  zinvalid morph parm 1Tr  r>   r  r  r  r   rH  r   r   r   r  C      "r  c                 C   r  rK   )r  rR   r   r>   rH  r   r   r   r   C  r  r   r  c                 C   s   zt | }W |jS    Y dS )zkCheck 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+  C  s
   
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.
    r   F)r   r   rz  ry  r  r   r   r   r*  C  s   r*  r  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,   r  r   z%g r   r  zG zg r   z	%g %g %g zRG zrg z%g %g %g %g zK zk )r  r  r  r  )r  r  r  r   r   r   r  C  s   
r  c           	   
      s   |    t  fdd}z:dkrt  tdd t |}t|}|D ]}t|}t	|| q+t
| t|d |  W t|S  tyd } ztrVt  |  W Y d }~d S d }~ww )Nc                      s&   dkrt   td d S d S )Nr   r   )r.   r   rz   rq   r   r  r  r   r   r  C  s   z$Page__add_text_marker.<locals>.finalr   r   r  )r  r5
  r.   r   rz   rq   r  r  r  pdf_add_annot_quad_pointr   r  rt   ru   r   rI   )	rN   r  r@  r  rO   r  r  r  r}   r   rS  r   r  C  s*   


r  c                 C   s   t | tsJ ttd|  S )Nr  )r7   rT   rS   r.   r  r   r   r   rq   D  s   rq   rm  c                 C   sV   |d }d}t | jD ]\}}|d |krd} nq|r#|| j|< d S | j| d S )Nr   FT)rC  r   r)  )r   rm  r{   r  r   fir   r   r   UpdateFontInfoD  s   rV  c                 G   s|   d}t t|D ]+}|| }|t| kr!t|trd|v rq dS |dur/t| | |s/ dS |d7 }q|t| kr<dS dS )z
    Returns true if <args> matches <types>.

    Each item in <types> is a type or tuple of types. Any of these types will
    match an item in <args>. None will match anything in <args>.
    r   NFr   T)r   r  r7   r  )r  r	  r   r   r   r   r   r   r   D  s   
r  c                 C   sd  t |}t|}|j|j }|j|j }|}	|}
|r)t| |}| | }|| }nd }}t||}|dkr@|dkr@|}|}|}|dk rZ|| || krS|| }	|}
n%|}	|| }
n||krt|| || krm|| }	|}
n|}	|| }
n|}	|}
t	|j|j d |j|j d }t
dddddd}t||}t|t|	|
}t|t|j|j}|S )z*
    # compute image insertion matrix
    r   r   r	  r   g      )r  r.   	fz_rotater0  r1  r2  r3  r8  r  fz_make_pointr  r{  fz_scalefz_translater~  r  )r  r,  rr  r   keeptrectr  trwtrhr[  r\  largefwfhsmallr  tmpr   r   r   r   r'	  8D  sN   





r'	  c                 C   sN   | j jdkr%| j jjdkr%| j jjdkr%|j jj| j jjj|j jd  k S dS )Nr   r   r  )ri   r  r  r~  r  r   
first_charr  )r   r  r   r   r   rv  iD  s   ("rv  c                 C   sD   |  dt |  dtt|  d}t| D ]
}|d| d7 }q|S )Nr  z (z):
rO
  r  )r>   r  r  )r~  r&   r   r   r   r   dir_stroD  s   "re  r  r  r  c                    s   |  dr| dr| S t| sdS |r5 du r#ddd | D }nd fdd| D }d| d S |d	k rFd fd
d| D }n
ddd | D }d| d S )a   Return a PDF string enclosed in [] brackets, suitable for the PDF TJ
    operator.

    Notes:
        The input string is converted to either 2 or 4 hex digits per character.
    Args:
        simple: no glyphs: 2-chars, use char codes as the glyph
                glyphs: 2-chars, use glyphs instead of char codes (Symbol,
                ZapfDingbats)
        not simple: ordering < 0: 4-chars, use glyphs not char codes
                    ordering >=0: a CJK font! 4 chars, use char codes as glyphs
    z[<z>]z[<>]Nr,   c                 S   s(   g | ]}t |d k rdt | ndqS )r  %02xb7r  r  r   r   r   r  D  s   ( zgetTJstr.<locals>.<listcomp>c                    s0   g | ]}t |d k rd t | d  ndqS )r  rf  r   rg  r  r  r  r   r   r  D  s   0 r   c                    s    g | ]}d  t | d  qS )%04xr   r  r  r  r   r   r  D  r  c                 S   s   g | ]}d t | qS )rh  r  r  r   r   r   r  D  r  )rp  r*  r  r&  )r   r  r  r  otxtr   r  r   r  vD  s   r  r  c                 C      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 )   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.
    ()c                 S   &   t ddgt | d }d|  d S Nr  rJ
  zUTF-16BE<>r  hexr  r   r   r   r   make_utf16beD     !get_pdf_str.<locals>.make_utf16ber,   rJ
     rk  r  r  ri  ri  \%03or  \br  \trY  rZ  r  \fr  \r\267r  r  r  r  r  rt  r   r  r+  r   r   r   r^  D  8   






r^  c                  C   sD  t d} | dkr| S tjdkrd}nd}t j|r|S 	 tjdkrZtjddddd	}|j	 }|j
s6|s<td
 dS t j|}t j|d}t j|rQ|S tdtjd dS tddddd	}|j	  }|j
srt|dkrxt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.
    r1   Nwin32z'C:\Program Files\Tesseract-OCR\tessdataz&/usr/share/tesseract-ocr/4.00/tessdatazwhere tesseractr   r   )shellcapture_outputr	  zTesseract-OCR is not installedFr
  z2unexpected: Tesseract-OCR has no 'tessdata' folderr   zwhereis tesseract-ocrr   z2unexpected: tesseract-ocr has no 'tessdata' folder)r
   getenvr   platformr   r(  
subprocessr  r   strip
returncoder   dirnamer&  r   rd  r  iterdirrT   r*  )r1   r
  r  rO  r  sub_responsesub_subr   r   r   get_tessdataD  sR   




r  )CSSr  r#   fontcoder  r  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   r  )r  r  r  r   r   r  CE  rF  z(css_for_pymupdf_font.<locals>.<listcomp>zNo font code 'z' found in pymupdf-fonts.r  zfontcode too shortr  r  r$  zfont-weight: bold;zfont-style: italic;)r>   r  r   rp  r  r  r  )r  r  r  r#   CSSFONT	font_keysfkeyr  r  r  fbuff	bold_textitalic_textr   r  r   css_for_pymupdf_fontE  s,   )
r  rb   rP  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  r   r&  r  r  r  r   r   r  jE  s   4 z#get_text_length.<locals>.<listcomp>)rk  rm  rl  r
  ro  r
  rn  r
  zFont '%s' is unsupported)
r8  rs  r"   symbol_glyphszapf_glyphsr  r  util_measure_stringr  r   )r   ra   rb   rP  r  r[  r   r  r   get_text_lengthWE  s"   

r  r.  c                 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.
    r  zbad argument 'img')r>   r  r  r  r  r  r   r  r   rv   image_profile)r.  r   r   r   r   r  E  s   




r  c              
      s  t  jtsJ t js jr/ jdkrJ t j j j}|s*t	dt
jd d _dS  fdd}t  jts=J t j}|dkrI| S  jt }|dkrU| S  j|d  }|t }|d	krg| S |t } jt }||krw| S z j D ]\}	}
|	|vr|
||	< q}d}W n ty } ztrt  d
}W Y d}~nd}~ww |dkrd|t<  j  dS t	dt
jd |  dS )aq  
    Append current path to list or merge into last path of the list.
    (1) Append if first path, different item lists or not a 'stroke' version
        of previous path
    (2) If new path has the same items, merge its content into previous path
        and change path["type"] to "fs".
    (3) If "out" is callable, skip the previous and pass dictionary to it.
    Nr   z2calling cdrawings callback function/method failed!r   c                      s     j  j   j  d S rK   )r6  r)  pathdictr  r  r   r	  r   r   r)  E  s   zjm_append_merge.<locals>.appendr  r   r  r   r!  z$could not merge stroke and fill path)r7   r6  r  r	  r	  PyObject_CallFunctionObjArgsr  rn  rS   r   r   r   r  r  dictkey_itemsr  rt   ru   r   r  )r	  respr)  r  thistyper  prevtype	previtems	thisitemsr  r%   r  r}   r   r  r   jm_append_mergeE  sR   






r  c                 C   s>   | j s| j|t|f d S | j|t|t| jf d S rK   )r	  rl  r)  r   r  
layer_name)r	  r  r_   r  r   r   r   jm_bbox_add_rectE  s    r  c                 C   s0   t t jj}t | |}t| ||d d S )Nz
fill-image)r.   r   r  ll_fz_transform_rectr  r  )r	  r  r>	  rD  rB  color_paramsr   r   r   r   jm_bbox_fill_imageE  s   r  c                 C   s8   zt | |tt|d W d S  ty   trt   w )Nzfill-imgmask)r  r.   r  fz_unit_rectrt   ru   r   )r	  r  r>	  rD  rA  rR  rB  r  r   r   r   jm_bbox_fill_image_maskE  s   
r  c	           	      C   sF   |rdnd}zt | |t|d |d W d S  ty"   tr!t   w )NTFz	fill-pathr  r.   ll_fz_bound_pathrt   ru   r   )	r	  r  r   r	  rD  rA  rR  rB  r  r   r   r   jm_bbox_fill_pathE  s   
r  c              
   C   sB   zt | |t||d W d S  ty  } ztrt   d }~ww )Nz
fill-shade)r  r.   ll_fz_bound_shadert   ru   r   )r	  r  shaderD  rB  r  r}   r   r   r   jm_bbox_fill_shadeE  s   
r  c                 G   :   zt | |t|||d W d S  ty   trt   w )Nzstroke-text)m_bbox_add_rectr.   ll_fz_bound_textrt   ru   r   )r	  r  r   r  rD  r  r   r   r   jm_bbox_stroke_textF     
r  c                 G   s:   zt | |t|d |d W d S  ty   trt   w )Nz	fill-text)r  r.   r  rt   ru   r   )r	  r  r   rD  r  r   r   r   jm_bbox_fill_textF  r  r  c                 C   s   t | |t|d |d d S )Nzignore-text)r  r.   r  )r	  r  r   rD  r   r   r   jm_bbox_ignore_textF  r  r  c	           	      C   r  )Nzstroke-pathr  )	r	  r  r   r  rD  rA  rR  rB  r  r   r   r   jm_bbox_stroke_pathF  r  r  c           
      C   s   | j t }t|}dgd }tdD ]&}||d |  }t|d }|j||d < |j||d d < t|d }q|j|d ksG|j|d krIdS d| _t	|d |d |d |d |d |d |d |d	 }d
t
|f}	|	||d < ||d |= dS )a  
    Check whether the last 4 lines represent a quad.
    Because of how we count, the lines are a polyline already, i.e. last point
    of a line equals 1st point of next line.
    So we check for a polygon (last line's end point equals start point).
    If not true we return 0.
    r   r  r  r   r   rz  r!  r   r  r	  )r  r  r  r   r  r~  r  	linecountr.   r  rX  )
r	  r  r  r  r   r   r  lpr  r_   r   r   r   jm_checkquad F  s"   
	
8r  c                 C   s  d| _ d}| jt }t|}||d  }t|d }t|d }||d  }t|d }t|d }		 |j|jksK|j|	jksK|j|	jksK|j|jkrMdS |	j|jk rbt|	j|	j|j|j}
d}nt|j|j|j|j}
d}dt	|
|f}|||d < ||d |= dS )z}
    Check whether the last 3 path items represent a rectangle.
    Returns 1 if we have modified the path, otherwise 0.
    r   r   r   r   r   r]  )
r  r  r  r  r  r  r~  r.   r  r   )r	  r[  r  r  line0r	  r	  line2r	  r  r   r_   r   r   r   jm_checkrectGF  s2   
	r  c           	   	   C   s.   |j }	 |sd S t| ||||||| |j}qrK   )headjm_trace_text_spanr  )	r	  r   r   rD  rA  rR  rB  seqnor<  r   r   r   jm_trace_textxF  s   r  c           %      C   s  d}t |tjs
J t|}t |tjsJ t|}t| }	t|	 |}
t
tdd|
}t|j|j |j|j  }t|}d}t| }t| }|dk r^d}d}|| ||  }|| ||  }d}t| }||t 7 }|t| t 7 }|t| t 7 }|t| t 7 }d}t|j|j|j |jdd}|jdkrd|_g }t|jjD ]}d}| |j!dkrt"| | |j!|jj#}||9 }|}| |j$dkr|}t| |j| |j}t%||}tdddd|j |j }t||}t|tdddd|j|j}|j}|| }|
jdkr;|jdksI|jdksI|
j&dkrT|
j&|
j' krT|j| }|j| }n
|j| }|j| }t(||||}t)||}|*| |j$| |j!|j|jf|j+|j,|j-|j.ff |dkrt/| |} q|} qt0|}|s|st1| ddd\}!}t"| |!|jj#}||9 }|s|}n|}t2 }"t3||"d	< t4|	|"d
< |jj#|"d< ||"d< |jj5|"d< |jj6|"d< ||"d< ||"d< d|"d< |rt7t8t9||t: t8 t; }#|#dd }#nd}#| j<dkr!| j<}$n|d }$|#|"d< ||"d< ||"d< |$|"d< ||"d< ||"d< t=| |"d< t4| j>|"d< ||"d< ||"d< | j?*|" dS )z
    jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
    Nr   r   r  r|  r}  r   r  r  r  r  r%  bidi_lvlbidi_dirr  r  r   rA  rJ  r  rR  r  r   	linewidth
spacewidthr>   r   layerr  r  )@r7   r.   fz_text_span
FzTextSpan	fz_matrixr   r  r  r{  r  fz_transform_vectorrX  r  r  r~  r  fz_normalize_vectorr  r  r  ry  r  rw  r  rx  r  rz  r  rc  r   ri   r  r  r  r  r  ucsr}  r-  r  r  r  r)  r1  r3  r0  r2  ra  r  r  rf   r  r  
bidi_levelr  fz_convert_colorr  r{  r:  r  r  r   r  r6  )%r	  r<  r   rD  rA  rR  rB  r  out_fontra   r   r  rG  	space_advr  r  ascsizedscsizefflagsr  last_advr  r  r   r  	char_origr  r1  r0  r3  r2  	char_bbox	span_bboxr  	span_dictr2  r  r   r   r   r  F  s   



 $





r  c              
   C   sl   | r4zt t jj}t  }t | ||jd | }W n ty- } ztr(t	   d }~ww |d d S dS )Nr   r   )
r.   r  r  r  ll_fz_convert_colorri   r  rt   ru   r   )rA  rR  rE  r  r2  r}   r   r   r   jm_lineart_colorG  s$   	
r  c                 C   s   t | jtr	g | _g | _d S rK   )r7   r6  r  scissorsr	  r  r   r   r   jm_lineart_drop_device7G  s   
r  c	              
   C   s   |rdnd}zft |tjsJ | j}	t|| _t| _t| || | j	d u r)W d S d| j	t
< || j	d< || j	d< t||| j	d< t| j| j	t< | j| j	d< t| j| j	d< | jr_| j| j	d	< t|  |  jd
7  _W d S  ty~ }
 ztryt   d }
~
ww )NTFr  r	  r	  rc   r  r  r(  r   )r7   r.   r  r6  r   rD  trace_device_FILL_PATH	path_typejm_lineart_pathr  r  r  r   pathrectdictkey_rectr  r  r  r	  rF  r  rt   ru   r   )r	  r  r   r	  rD  rA  rR  rB  r  r6  r}   r   r   r   jm_lineart_fill_path=G  s2   




r  c           	   	   C   s2   	 | j}t| |d||||| j |  jd7  _d S )Nr   z
type(ctx)=z ctx=z
type(dev)=z dev=ztype(text)=z text=z
type(ctm)=z ctm=ztype(colorspace)=z colorspace=ztype(color)=z color=ztype(alpha)=rK
  ztype(color_params)=z color_params=r   )r   r>   r6  r  r  )	r	  r  r   rD  rA  rR  rB  r  r6  r   r   r   jm_lineart_fill_texteG  s   	r  c              	   C   s*   t | |d|d d d| j |  jd7  _d S )Nr   r   r  r  )r	  r   rD  r   r   r   jm_lineart_ignore_texttG  s   r  c                       <   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )Walkerc                    s4   t    |   |   |   |   || _d S rK   )r=   rP   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathr	  )rN   r	  r  r   r   rP   |G  s   

zWalker.__init__c              
   C   s\   z| j jdkrt| j rW d S d| j jd< d| j _W d S  ty- } ztr(t   d }~ww )Nr   Tr	  r   )r	  r  r  r  rt   ru   r   )rN   r  r}   r   r   r   	closepathG  s   

zWalker.closepathc              
   C   s   zmd| j _t||}t||}	t||}
t|| j j}t|	| j j}	t|
| j j}
t| j j|| j _t| j j|	| j _t| j j|
| j _dt| j j	t|t|	t|
f}|
| j _	| j j
t | W d S  ty } ztrzt   d }~ww )Nr   r  )r	  r  r.   rX  r}  rD  fz_include_point_in_rectr  r  	lastpointr  r  r)  rt   ru   r   )rN   r  r0  r2  x2y2x3y3re  rf  r  r=  r}   r   r   r   curvetoG  s0   

zWalker.curvetoc              
   C   s   zRt t ||| jj}t | jj|| j_dt| jjt|f}|| j_| jj	t
 }|| | j jd7  _| jjdkrM| jjtkrPt| j W d S W d S W d S  tyd } ztr_t   d }~ww )Nrr  r   r  )r.   r}  rX  r	  rD  r  r  r  r  r  r  r)  r  r  r  r  rt   ru   r   )rN   r  r~  r  re  r=  r  r}   r   r   r   linetoG  s&   


zWalker.linetoc              
   C   s   	 z2tt||| jj	| j_
t| jjr-t| jj
j| jj
j| jj
j| jj
j| j_d| j_W d S  tyE } ztr@t   d }~ww r  )r7   r	  r  rf   r   r  r.   r}  rX  rD  r  r  r  r  r~  r  r  rt   ru   r   )rN   r  r~  r  r   r%   r}   r   r   r   movetoG  s&   

zWalker.moveto)	r  r  r  rP   r  r  r  r  r  r   r   r  r   r  zG  s    r  c                 C   s   z;t t jj| _d| _t dd| _t | _g | jt	< t
| }t t t |||j | jt	 s9d| _W dS W dS  tyH   trGt   w )a#  
    Create the "items" list of the path dictionary
    * either create or empty the path dictionary
    * reset the end point of the path
    * reset count of consecutive lines
    * invoke fz_walk_path(), which create the single items
    * if no items detected, empty path dict again
    r   N)r.   r   r   r  r  r|  r  rf   r  r  r  fz_walk_pathFzPathll_fz_keep_pathri   rt   ru   r   )r	  r  r   walkerr   r   r   r  G  s   



r  c	                 C   s  zt |tjs	J | j}	d| _t|jt|jkrt|j| _t|| _	t
| _t| || | jd u r6W d S d| jt< || jd< t||| jd< | j|j | jt< |j|j|jf| jd< | j|j | jd< d| jvrod| jd< |jrtd	}
t|
d
 t|jD ]}t|j|}t|
| j| dd qt|
d| j|j d |
| jd< nd| jd< t| j| jt< t | j!| jd< | j"| jd< | j#r| j$| jd< t%|  |  j"d7  _"W d S  t&y   t'rt(   w )Nr   r  r	  rR  r	  r	  r	  Fr  z[ rr  r  z] r  r  r  r  r(  ))r7   r.   r  r6  
pathfactorr=  r2  rc  r   rD  trace_device_STROKE_PATHr  r  r  r  r  r  r  	start_capdash_capend_caplinejoindash_lenr  r(	  r   floats_getitem	dash_list
dash_phaser   r  r  r  r  r  r	  rF  r  rt   ru   r   )r	  r  r   r  rD  rA  rR  rB  r  r6  r  r   r  r   r   r   jm_lineart_stroke_pathG  sT   








r
  c                 C   s   | j sd S | j}t|| _t| _t| || | jd u rd S d| jt	< t
|| jd< d| jvr4d| jd< tt| | jd< | j| jd< t| j| jd< t|  |  jd7  _d S )	NrZ  r	  r	  Fr	  r(  r  r   )r	  r6  r.   r   rD  trace_device_CLIP_PATHr  r  r  r  r  r   compute_scissorrF  r  r  r  )r	  r  r   r	  rD  r	  r6  r   r   r   jm_lineart_clip_path2H  s"   



r  c                 C   s   | j sd S | j}t|| _t| _t| || | jd u rd S d| jd< d | jd< d| jvr2d| jd< t	t
| | jd< | j| jd< t| j| jd< t|  |  jd	7  _d S )
NrZ  r  r	  r	  Fr	  r(  r  r   )r	  r6  r.   r   rD  trace_device_CLIP_STROKE_PATHr  r  r  r   r  rF  r  r  r  )r	  r  r   r  rD  r	  r6  r   r   r   jm_lineart_clip_stroke_pathHH  s"   




r  c                 C   $   | j sd S t|  |  jd7  _d S r  r	  r  rF  )r	  r  r   r  rD  r	  r   r   r   jm_lineart_clip_stroke_text]H     r  c                 C   r  r  r  )r	  r  r   rD  r	  r   r   r   jm_lineart_clip_textdH  r  r  c                 C   r  r  r  )r	  r  r>	  rD  r	  r   r   r   jm_lineart_clip_image_maskkH  r  r  c                 C   s@   | j r| jsd S t| j}|dk rd S | jd= |  jd8  _d S )Nr   r   )r	  r  r  rF  )r	  r  r  r   r   r   jm_lineart_pop_cliprH  s   
r  c                 C   s
   || _ d S rK   r  )r	  r  r#   r   r   r   jm_lineart_begin_layer|H  r=  r  c                 C   r;  rK   r  r  r   r   r   jm_lineart_end_layerH  r=  r  c           	   	   C   s\   | j sd S | j}dt|t|t|t||| jt| jd| _	t
|  |  jd7  _d S )Nr=  )r>   r_   isolatedknockoutr   r   r(  r  r   )r	  r6  r   r  r.   fz_blendmode_namerF  r  r  r  r  )	r	  r  r   rE  r  r  r   rB  r6  r   r   r   jm_lineart_begin_groupH  s   
r  c                 C   s   | j sd S |  jd8  _d S r  )r	  rF  r  r   r   r   jm_lineart_end_groupH  s   r  c	           	   	   C   s*   t | |d||||| j |  jd7  _d S r  r  )	r	  r  r   r  rD  rA  rR  rB  r  r   r   r   jm_lineart_stroke_textH  s   r  c	           	      C   s   |j | _ t| | d S rK   )r  jm_increase_seqno)	r	  r  r   r  r?  rA  rR  rB  r  r   r   r   jm_dev_linewidthH  ri  r!  c                 G   s0   z
|  j d7  _ W d S  ty   trt   w r  )r  rt   ru   r   )r	  r  vargsr   r   r   r   H  s   
r   re  rf  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:  r   r	  )re  rf  r   r   r   r4  H  s   r4  c                       ra  )ry  c                    rb  rK   rc  rW   r  r   r   rP   H  re  z!JM_image_reporter_Filter.__init__c                 C   s0   t |tjsJ t| t||| trdS d S r  )r7   r.   r  rZ  r   r-   rf  r   r   r   rg  H  s
   z%JM_image_reporter_Filter.image_filterrh  r   r   r  r   ry  H  s    ry  c                       s<   e Zd Z fddZeZeZeZ	e
ZeZeZeZeZ  ZS )r  c                    sv   t    || _|| _|   |   |   |   |   | 	  | 
  |   |   |   t| _t| _d S rK   )r=   rP   rl  r	  use_virtual_fill_pathuse_virtual_stroke_pathuse_virtual_fill_textuse_virtual_stroke_textuse_virtual_ignore_textuse_virtual_fill_shadeuse_virtual_fill_imageuse_virtual_fill_image_maskuse_virtual_begin_layeruse_virtual_end_layerr  begin_layerr  	end_layer)rN   rl  r	  r  r   r   rP   H  s   

z"JM_new_bbox_device_Device.__init__)r  r  r  rP   r  	fill_pathr  stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shader  
fill_imager  fill_image_maskr  r   r   r  r   r  H  s    r  c                       r  )r  c                    s4   t    || _|   |   |   |   d S rK   )r=   rP   r$  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)rN   r$  r  r   r   rP   H  s   
z%JM_new_output_fileptr_Output.__init__c                 O      | j j|i |S rK   )r$  r  rN   r  r  r
  r   r   r   r  H  rW  z!JM_new_output_fileptr_Output.seekc                 O   s   | j j|i |}|S rK   )r$  tell)rN   r  r  r
  r&   r   r   r   r=  H  s   z!JM_new_output_fileptr_Output.tellc                 O   r;  rK   )r$  truncater<  r   r   r   r>  H  rW  z%JM_new_output_fileptr_Output.truncatec                 C   s   t ||}| j|S rK   )r.   raw_to_python_bytesr$  r@  )rN   r  data_rawdata_lengthr  r   r   r   r@  H  s   z"JM_new_output_fileptr_Output.write)	r  r  r  rP   r  r=  r>  r@  r  r   r   r  r   r  H  s    r  c                 C   sd   | j du r	t | _ t| j }|dkr%| j |d  }t|}t|| j}n| j}| j t| |S )zt
    Every scissor of a clip is a sub rectangle of the preceeding clip scissor
    if the clip level is larger.
    Nr   r   )	r  r  r  r  r.   r0  r  r)  r   )r	  num_scissorslast_scissorr	  r   r   r   r  I  s   

r  c                       sh   e Zd ZdZ fddZeZeZe	Z
eZeZeZeZeZeZeZeZeZeZeZeZeZe Z!e"Z#  Z$S )r	  z?
    LINEART device for Python method Page.get_cdrawings()
    c                    s  t    |   |   |   |   |   |   |   | j	 | j
 | j |   |   |   |   |   |   |   |   || _d| _d| _|| _|| _d | _d | _d | _d| _t | _t | _ t | _!t" | _#t$ | _d| _%d| _&d| _'d S r  )(r=   rP   r#  r$  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr%  r&  r'  r(  r)  r*  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr+  r,  r6  r  rF  r	  r	  r  r  r  r  r.   r   r	  rD  r  r|  r  r   r   r  r  )rN   r6  r	  r	  r  r   r   rP   I  sH   






z%JM_new_lineart_device_Device.__init__)%r  r  r  r1  rP   r  r/  r
  r0  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr  clip_stroke_textr   r1  r2  r3  r4  r5  r6  r  pop_clipr  begin_groupr  	end_groupr  r-  r  r.  r  r   r   r  r   r	  I  s*    3r	  c                       sH   e Zd ZdZ fddZeZeZe	Z
eZeZeZeZeZeZeZ  ZS )r
  zB
    Trace TEXT device for Python method Page.get_texttrace()
    c                    s   t    |   |   |   |   |   |   |   | 	  | 
  |   || _d| _d| _d| _d | _d| _t | _t | _d| _t | _t | _t | _t | _t | _d| _d| _ d| _!d | _"d S r  )#r=   rP   r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r6  r  rF  r	  r	  rf   r  r  r  r  r.   r   r	  rD  r  r|  r  r   r  r   r  r  r  )rN   r6  r  r   r   rP   lI  s:   






z JM_new_texttrace_device.__init__)r  r  r  r1  rP   r   r/  r!  r0  r  r1  r  r2  r  r3  r4  r5  r6  r  r-  r  r.  r  r   r   r  r   r
  gI  s    $r
  c                  C   s(   ddl } ddl}|| d  S )#
    Adobe Glyph List function
    r   Ns~  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)r  gzip
decompress	b64decoderh  r(  )r  rU  r   r   r   _get_glyph_textI  s      S   rX  c                 C   rI  rJ  rK  rL  r   r   r   r}	  vK  rM  c                 C   rN  rO  rP  rH  r   r   r   r  K  rQ  c                 C   sB   |   D ]}|d |kr|  S |d  | kr|  S qdS )rB  r  r   N)r	  r8  rC  r   r   r   r
  K  s   c                 C   rD  rE  rF  rG  r   r   r   r
  K  rH  c                  O   r  rK   r   r   r   r   r   r!  K  r  r+  r   c           
      C   s   |   }dd l}|d}|d| }|d}d}d| }|dkr'|}	|	S |dkr/|}	|	S |d	kr7|}	|	S |d
kr?|}	|	S |}	|	S )Nr   a^  
            <!DOCTYPE html>
            <html>
            <head>
            <style>
            body{background-color:gray}
            div{position:relative;background-color:white;margin:1em auto}
            p{position:absolute;margin:0}
            img{position:absolute}
            </style>
            </head>
            <body>
            zP
            <?xml version="1.0"?>
            <document name="%s">
            a  
            <?xml version="1.0"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <style>
            body{background-color:gray}
            div{background-color:white;margin:1em;padding:1em}
            p{white-space:pre-wrap}
            </style>
            </head>
            <body>
            r,   z{"document": "%s", "pages": [
r	  r  r  xhtml)r8  textwrapdedent)
r   r   r  rZ  r	  r  rY  r   r  r   r   r   r   ConversionHeaderK  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  rY  )r8  )r   r  r   r  r	  r  rY  r   r   r   r   ConversionTrailerK  s(   
r]  c                  C   Z   t i kr't D ]} | drq| d\}}td|dd  dd}|t |< qtt  S rT  r  r>  0xNr  r  base)_adobe_unicodesrX  rp  rd  r  r  r  r   gnameuncr  r   r   r   adobe_glyph_namesK     


rg  c                  C   r^  r_  )rc  rX  rp  rd  r  r  ry   rd  r   r   r   adobe_glyph_unicodesK  rh  ri  c                 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.
    r  r   )r   rR   r
  r   r  r  )rG   rs	  r   r   r   rq	  L  s   
rq	  rO   c                 C   s:   t | tsJ t |tsJ | |_|| jt|< d|_dS )ztClean up after annotation inertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)r7   rC   rI   rR   r  r/  rZ   )rG   rO   r   r   r   rr	  L  s
   
rr	  c                 C   s   t | tsJ | dks| dks| dkrtdS | tdks)| tdks)| tdkr-tdS | tdkrC| td	krC| td td
 S | S )Nr  i(   i)   r  r  	r  Zr2  )r7   r  r  rA  r   r   r   canon'L  s   $rm  c                 C   s,   t | tsJ t| \}}t|}||fS rK   )r7   rT   r.   fz_chartorunerm  )r  r   r  r   r   r   chartocanon4L  s   ro  c                 C   s   t | td}t t |tdtdr#tt |td|s#dS t | td}|js1	 dS t |r;t||S tt |d||sGdS dS )Nr  rI  r  r  r   r  r   )	r.   rp   rq   ro  string_in_names_listri   r.  dest_is_valid_pager  )r	  r  page_object_nums
names_listr
  r   r   r   dest_is_valid;L  s2   
	


rt  c                 C   s:   t | }|dkrdS t|D ]}|| |kr dS qdS rj  )r.   rk   r   )rz   rr  r  numr   r   r   r   rq  WL  s   
rq  c                 C   sR   t | tsJ tt| D ]}t| |d  |}|d ur&||7 }||f  S qdS )NrP  )r7   rT   r   r  match_string)r  r  r   r  r   r   r   r  bL  s   r  c                  C   s   ddl } dtt| jd ddtt| jd d ddf }| d|  }| jdkr7|d	| 7 }|S | jdk rD|d
| 7 }|S 	 |S )z'
    "Now" timestamp in PDF Format
    r   Nz%s'%s'i  r   r    rG  zD:%Y%m%d%H%M%SrJ  r  )timerT   r=  altzonerjuststrftime	localtime)rw  tztstampr   r   r   r]  lL  s   

r]  c                 C   rj  )rk  rl  c                 S   rm  rn  rq  rs  r   r   r   rt  L  ru  rv  r,   rJ
  rw  rk  rx  ri  ry  r  rz  r  r{  rY  rZ  r  r|  r  r}  r~  r  r  r  r  r   r   r   r^  L  r  c                   @   r2  )ElementPositionzDConvert a dictionary with element position information to an object.c                 C   r  rK   r   rW   r   r   r   rP   L  r  zElementPosition.__init__NrG  r   r   r   r   r~  L  rH  r~  c                   C      t  S rK   )r~  r   r   r   r   make_story_elposL  rO  r  r  r  rZ  c                 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.
    Nrf   r   )r%  rZ  ro  r   rD  c                 S   r  rK   )r2  )r   r   r   r   r  L  rO  z)get_highlight_selection.<locals>.<lambda>rs  r  )r_   r   r;  r<  r  r3  r2  rz  ry  get_textr)  rT  popr,  r~  insert)rG   r  r  rZ  ro  rD  r-  r   r   bboxfr   bboxlr   r   r   r|	  L  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 )rT  r  r>  Nr  r  ra  i  )rc  rX  rp  rd  r  r"   )r#   r   re  rf  r  r   r   r   r  M  s   


r  c                 C   s2   |j |j  }|j|j }t|| j  || j  S rK   r~  r  r.   fz_absr  r2  r-  dxdyr   r   r   hdistM     r  r   r   r   r   r  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   rz  ry  r   r;  r,  r  r~  r  r   r)  )r_   r  r  r;  r,  r  delta_hdelta_vr   rowr   rectsnrowr   r   r   
make_tableM  s*   

r  c                 C   s   t | j}t |}t d}t t |tdtd}t ||}|js.t 	||d}t 
|}d}t |}t|D ]}	t t ||	}
||
krQd} nq>|sat |t ||d dS dS )zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    rQ  rR  rS  r   r   r   N)r.   rh   r:   r   rW  r   rV  rq   rp   r   r  rk   r   r  r}  r  )rO   r   r   
PDFNAME_COacrorQ  r   r  r{   r   nxrefr   r   r   r  GM  s.   



r  c                  G   s  dd }dd }t | dkrdS t | dkra| d }t|ttfr2t |dkr2|\}}g ||R S t|ttfr[t |d	kr[|\}}}||}||}||}g |||R }	|	S ||}|S t | dkrs|| d || d  S t | d	kr|| d \}
}|
|fdkr|
|| d | d fS || d \}}||fdkr| d | d ||fS nt | d
kr| d | d | d | d	 fS td|  )aQ  
    Helper for initialising rectangle classes.
    
    2022-09-02: This is quite different from PyMuPDF's util_make_rect(), which
    uses `goto` in ways that don't easily translate to Python.

    Returns (x0, y0, x1, y1) derived from <args>.

    Accepts following forms for <args>:
        () returns all zeros.
        (top-left, bottom-right)
        (top-left, x1, y1)
        (x0, y0, bottom-right)
        (x0, y0, x1, y1)
        (rect)

    Where top-left and bottom-right are (x, y) or something with .x, .y
    members; rect is something with .x0, .y0, .x1, and .y1 members.
    c                 S   sN   t | ttfrt| dkr| d | d fS t | ttjtjfr%| j| j	fS dS )Nr   r   r   rP  )
r7   r  r  r  r:  r.   r|  r  r~  r  )r~
  r   r   r   get_xywM  s
   zutil_make_rect.<locals>.get_xyc                 S   sf   t | tr| S t | tr| j| jfS t | tttjtj	fr'| j
| j| j| jfS t | ttfs1| f} | S rK   )r7   r  r:  r~  r  r   rQ
  r.   r   fz_rectr1  r3  r0  r2  r  )r2  r   r   r   
make_tuple}M  s   

z"util_make_rect.<locals>.make_tupler   r
  r   r   r   r  rP  rN  )	r  r7   r  r  r1  r3  r0  r2  rt   )r  r  r  r~
  re  rf  r2  r-  r  r&   r1  r3  r0  r2  r   r   r   rH  cM  s>   

rH  c                  G   sD   t |  \}}}}dd }||}||}||}||}||||fS )Nc                 S   s   t | }|| ks
J |S rK   )r  )r~  r&   r   r   r   convertM  s   z util_make_irect.<locals>.convert)rH  )r  r2  r-  r  rc  r  r   r   r   r  M  s   r  c                 C   s   t tt| S rK   )r
  r.   r1  r  r!  r   r   r   rt  M  rW  rt  c                 C   s(   t rt| |S ttt| t|S rK   )r   r   r}  r   r.   r  r  r9  )r_   r?  r   r   r   r}  M  s   r}  c                 C      t tt| t|S rK   )r   r.   r0  r  rB  r  r   r   r   rZ  M     rZ  c                 C   s   t t| t|S rK   )r.   fz_is_point_inside_rectr  r  )r
  r   r   r   r   rD  M  s   rD  c                 C      t tt| t|S rK   )r   r.   r  r  r  )r   r
  r   r   r   rW  M  r  rW  c                 C   s   t | }t|}t||S rK   )r  r  r.   fz_is_point_inside_quad)r  r^   r
  r  r   r   r   r)  M  s   r)  c                 C   r  rK   )r  r.   r}  r  r9  )r  r?  r   r   r   r   M  r  r   c                 C   r  rK   )r   r.   ra  r  r  r   r   r   rY  M  r  rY  c                 C   r  rK   )r   r.   r{  r9  )r  r  r   r   r   r  M  r  r  c                 C   s   	 t| }|j}||j
 |j|j	  }|tjj k s |tjjkrot }d| }|j
| |_|j | |_|j	 | |_	|| |_
|j |j |j|j	  }|j |j |j|j
  |_||_d|j|j|j	|j
|j|jffS dS )Nr   ztype(matrix)=r   r   )r   r   )r7   r  r  r.   r   r  r   r2  r-  r  rc  r}   r  r>   r  r=  r   
float_infoepsilonr9  )r?  r&   r/  r2  detr  rdetr   r   r   r  M  s    
 r  c                 C   s   t |}d}d}|t| k rVt | |d  \}}||7 }|t jkr)t |}n|t jkr4t |}nt |}|dk r?d}t 	||}	t 
||	d}
||
7 }|t| k s|| }|S )Nr   r&  )r.   r
  r  rn  PDF_SIMPLE_ENCODING_GREEKfz_iso8859_7_from_unicodePDF_SIMPLE_ENCODING_CYRILLICfz_windows_1251_from_unicodefz_windows_1252_from_unicoder  r  )r   ra   rb   rP  r  r[  r  r  r  rr  r  r&   r   r   r   r   N  s&   



r  c           	      C   s   t | }t |}t |}tt|j|j |j|j }tdddd|j |j }t|j|j |j|jdd}t||}t||}t|}|jS )Nr   r   )	r  r.   r  rX  r~  r  r  r{  r}  )	rK  r  r^   r  r
  r  r  r  r  r   r   r   r5  6N  s   "
r5  c                 C   s|   t | }t |}tt|j|j |j|j }tdddd|j |j }t|j|j |j|jdd}tt||S )z
    Return the matrix that maps two points C, P to the x-axis such that
    C -> (0,0) and the image of P have the same distance.
    r   r   )	r  r.   r  rX  r~  r  r  r   r{  )rK  r  r  r
  r  r  r  r   r   r   r	  DN  s   "r	  c           	      C   s  d}d}|}t | |d  \}}||7 }t ||d  \}}||7 }||kr|}|tdkrF	 t | |d  \}}||7 }|tdkrDnq/nt | |d  \}}||7 }|tdkrr	 t ||d  \}}||7 }|tdkrpnq[nt ||d  \}}||7 }||ks&|dkrd S |S )Nr   r  )ro  r  )	h0r  r\  r   r}   r  hcdelta_nncr   r   r   rv  TN  s>   rv  c                 C   s  | sJ t |tjsJ t |tjsJ |jj| j }|jj| j }t||}| j	dkr|| j
| j	d  }t|}	 t|jj|j|j|k r|t|jj|j|j|k r|t|jj|j|j|k r|t|jj|j|j|k r||j|_|j|_| j
d |kszJ d S | j
| |  j	d7  _	d S )Nr   r   r   )r7   r.   r~  r  ri   r  r  r  ru  r  r  r  r  r  r	  r	  vdistr	  r  r)  )r  r   r  r  r  ch_quadrh  r  r   r   r   r  sN  s(   

r  c              
   C   s&  t rt| |||||||S tdtdtdtdtdtdtdtdtd	g	}t||}	t| d
}
t|
tdtd tt	|D ]}t
|	|| }|jrct|
|| t|j| qH|rt|	td}t|}|dkrt|
td|}t|D ]q}t||}|jrt|rqt|djrqt|td}t|tdrqt|tdrqt|tdrtd qt|tdrqt|td t|td t|j|}t| t|d}t|| q|dkrt|
td| t| |
}t| || dS )z
    Deep-copies a source page to the target.
    Modified version of function of pdfmerge.c: we also copy annotations, but
    we skip some subtypes. In addition we rotate output.
    rl  r   r@
  rY	  rZ	  r[	  r\	  r   UserUnitr  r  rC   r   r   rn  r  r  r   r  zskipping widget annotationr  r   N)r   r   r  rq   r.   r  r   r   r   r  r  ri   r7  r:   rp   r  r   r  r   rg   ro  r  r   r  rk   r}  r   r  r  )r  r  	page_frompage_tor   r  copy_annotsr  known_page_objspage_refrV  r   rz   r  r   r  r	  rt  r  rO   r9	  r   r   r   r  N  sd   


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.
    r  )
paper_sizer   )r  r  r,  r   r   r   
paper_rectN  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.
    r
  z-lrr  Nr   z-pr  r   r   )r8  r*  paper_sizesr"   )r  r  r  r  r   r   r   r  N  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
    r  )P	  i*  a1)  r  a10)rX  r|  a2)  r  a3)r  r  a4)r  r  a5)  r  a6)*  r  a7)r  r  a8)   r  a9)r|  r  b0)  i  b1)  r  b10)rj  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  rg  )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  r  )r  i  )r  i  )r  i  )r  r  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar   r   r   r   r   r  N  s   		
 !"#r  c                 C   sZ  t |tjsJ t |trt|dksJ t |tr t|dks"J t |tr5t|dkr5t |d tjs7J d }g }z	 t|td}t|}|dkrRtd|	| t
|r`tdt|D ]}	t||	}
t|
td}|jrt|td}nt|
tdjot|
tdj }|rt|
td	}|d |k r|
} nI|d  |8  < qd|jrt|td
 }n
t|
tdj }|rtdt| d |d dkr||d< |	|d< |
} n	|d  d8  < qd|d u s|jd u r|	|k snq=W tt|ddD ]}	t||	d   q|S tt|ddD ]}	t||	d   qw )Nr   r   r  zmalformed page treezcycle in page treer  Pagesr@
  r  rC   znon-page object in page tree (r  r   )r7   r.   r  r  r  rp   rq   r  rt   r)  r  r   r  ri   ro  r  r  r   r  )r   r  skipparentpindexphitr	   r  r  r   kidr   r2  r  r   r   r   pdf_lookup_page_loc_imp*O  sd   *


3r  c                 C   s   t t | td}t |td}|g}|jstdt  g}dg}t| ||||}|d }|d }|d }|jsDtd| d |||fS )z9
    Copy of MuPDF's internal pdf_lookup_page_loc().
    rR  r  zcannot find page treer   z cannot find page %d in page treer   )r.   rp   rV  rq   ri   rt   r  r  )r   r  r  r  r  r  r  r  r   r   r   r  nO  s   

r  c                 C   rs  )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    r   zuse mupdf.pdf_debug_obj() ?)r.   r{  r  r   r  pdfobj_stringrk  array_get_boolr   r   r   rp   pdf_is_embedded_fileembedded_file_namer  r,  rr   r  r  r   rq  r-  rT  r   r.  r  )r	  prefixr&   rr  r   oorh  r  r   r   r   r  O  s   r  c                    s    j d sdS | j}|  } fdd|D }|g krdS t|}tt dd }|D ]}t|||s@t	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
        distance, e.g. "a b c" instead of "abc". This utility adds an entry
        "/W[0 65535 w]" to the descendent font(s) of font. The float w is
        taken to be the width of 0x20 (space).
        This should enforce viewers to use 'w' as the character width.

    Args:
        page: fitz.Page object.
        font: fitz.Font object.
    r  Nc                    s>   g | ]}|d   j kr|d dr|d dr|d qS )r   r  r  r  Identityr   )r#   rp  rv  r  r   r   r  O  s
    *z$repair_mono_font.<locals>.<listcomp>r  i  z$Cannot set width for '%s' in xref %i)r%  rR   r	  rS  r  r  r  rv   set_font_widthr   r#   )rG   r  r   r  r`  r  r{   r   r  r   r  O  s    

r  c                 C   s8   t | |}t | t |td| t || dS )z<
    Recreate page tree to only retain specified pages.
    r   N)r.   r  "pdf_flatten_inheritable_page_itemsr   rq   r}  )r   rR   r  rG   r  r   r   r   
retainpageO  s   
r  c              	   C   s  t |}t| }tt| td}t|td}t| td}t|td}t|td}t| d}	t|	tdt|td t|	tdt|td |j	rdt|	td| |j	rpt|	td| t
| t||	 t| d}
t|D ]}|| }|d	k s||krtttt t| ||
| qtt|
}t|td
| t|td|
 t| }g }t|D ]}t| |}|t| q|rSt| d}t| d}t|}t| d}t|D ]C}t||}t||}t|td}t|j	r|n|d	}t|||r7tt|t t|}t|| t|| qt|td| t|td| t|	td| t|D ]R}t| |}t|td}t|}d	}	 ||krun3t||}tt|tdtdsqnt ||||st!|| |d8 }|d8 }|d7 }qoqWt"| ||||d	krt#|	td dS dS )zG
    This is called by PyMuPDF:
    liste = page numbers to retain
    rR  r  r  r[  r  r   r  r   r   r  r  r  r  rn  r   r  r  N)$r  r.   r  rp   rV  rq   r  r   r   ri   r  rk   r   r   r  r  r  r
  r  ro  r  r  r)  r   r   r   r  rq  ro  r   r}  ro  rt  r  strip_outlinesr   )r   r  argcr  oldrootr8  olddestsoutlinesocpropertiesr  r  rG   r   countobjrr  r  rq  r  r  rs  rh  r~   r  key_strr  r   r	  r   r   r   r  O  s   




r  srgbc                 C   s*   t | }|d d |d d |d d fS )a  Convert sRGB color code to a PDF color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 1.
    r   g     o@r   r   )rQ  )r  r  r   r   r   sRGB_to_pdfBP  s   
"r  c                 C   s6   | d? }| |d>  d? }| |d>  |d>  }|||fS )a  Convert sRGB color code to an RGB color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 255.
    r  r  r   )r  r   rr  r-  r   r   r   rQ  PP  s   

rQ  c                 C   sF   t |}t | }td|dD ]}t t |||kr  dS qdS )Nr   r   r   )r.   r  rm   r   r  )r
  rs  r   str_r   r   r   r   rp  `P  s   

rp  c                 C   s  d}d}|}|j rt| ||||}t||||sm|dkrTt|td}	|	j s3|
j r2t|
td n|
j rIt|
td|	 t|	td|
 nt|	td |	}n.t|td t|td t|td}n|rr|j st|}|}
t|td}|d7 }|j s	|||
fS )z'
    Returns (count, first, prev).
    Nr   r  Prevr  r  r   )ri   r  rt  r.   rp   rq   r   r   )r   r	  r  rr  rs  rb  r  currentr  r  r  r   r   r   strip_outlineiP  s6   

!r  c           	      C   s   |j sdS t|td}|j sd}nt| ||||\}}}|dkr<t|td t|td t|td |S tt|td}t|td| t|td| t|tdt|dkrg|n|  |S )Nr   r\  Lastr  )	ri   r.   rp   rq   r  r   rr   r   ro  )	r   r	  r  rr  rs  rb  r  last	old_countr   r   r   r  P  s    &r  r  c                 C   sh   t i kr.t D ]&}|drq|d\}}| }|D ]}t|dd dd}|t |< qqt | dS )rT  r  r>  Nr  r  ra  z.notdef)_adobe_glyphsrX  rp  rd  r  r"   )r  r   r#   rf  unclr  r   r   r   r  P  s   


r  c                 C   s2   |j |j  }|j|j }t|| j || j   S rK   r  r  r   r   r   r  P  r  r  c                	   @   s  e Zd ZdZdd Zedd Zedd Zedmd	d
Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Ze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ed/d0 Zednd2d3Zedod5d6Zedod7d8Zed9d: Zedmd;d<Z ed=d> Z!ed?d@ Z"edodAdBZ#edCdD Z$edEdF Z%edndGdHZ&edodIdJZ'edodKdLZ(edodMdNZ)edOdP Z*edQdR Z+edSdT Z,edUdV Z-edodWdXZ.dYZ/i dZd[d\d[d]d[d^d[d_d[d`d[dad[dbd[dcd[ddd[ded[dfd[dgd[dhd[did[djd[dkd[d[d[d[d[d[d[d[dlZ0d4S )prv   zU
    We use @staticmethod to avoid the need to create an instance of this class.
    c                 C   s$   t | tjrtt| S tt S rK   )r7   r.   rD   r   rz  r   rF   r   r   r   _derotate_matrixP  s   zTOOLS._derotate_matrixc                 C   s   t | |}t| j|_| j|_| j|_| |_|jsd |_|js"d |_|js(d |_|j	s.d |_	|j
s4d |_
|js:d |_|js@d |_|S rK   )r6  r   r_   r{   rR   r  ru  r_  r`  ra  rb  rc  rd  )rO   r  r~   r   r   r   r  P  s(   
zTOOLS._fill_widgetc                 C   s$   t | j} t|  }t|}|S rK   )r.   r  r:   r  rz   r   )rG   r   rl  r   r   r   r3
  P  s   zTOOLS._get_all_contentsr   c                 C   s2   |   }t| t|}t| | ||}|S )zDAdd bytes as a new /Contents object for a page, and return its xref.)r  rk  r   r)	  r   rz   )rG   r  r,	  r  contbufr{   r   r   r   rG
  P  s
   zTOOLS._insert_contentsc                 C   s   | j d }| jd }|sd}dtt|d }|r|}n| jd }|s&d}dtt|d }|}	|}
tt|	|
}| }|	| }|
| }d	| j  krQd
k rVn nd}nd}||||||||fS )as  Get common parameters for making annot line end symbols.

        Returns:
            m: matrix that maps p1, p2 to points L, P on the x-axis
            im: its inverse
            L, P: transformed p1, p2
            w: line width
            scol: stroke color string
            fcol: fill color store_shrink
            opacity: opacity string (gs command)
        r  r  rJ  r  z RG
rc   r	  z rg
r   r   r  r,   )r   rx   r&  r'  rT   r   r	  r   )rO   re  rf  r   r[  scscolr`  r   np1np2r   r3  rv  rI  r   r   r   r   _le_annot_parmsP  s*   


zTOOLS._le_annot_parmsc                 C   s   t | |||\}}}}}	}
}}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.
        r   r   r          @
q
%s%f %f m
%f %f l
r  s
Q
rv   r  r8  r~  r  )rO   re  rf  r	  r   r   r3  rv  rI  r[  r  r   r   r  rc  rb  r  botr   r   r   r   r4   Q  s    zTOOLS._le_buttc                 C   s   t | |||\}}}}}	}
}}d}|td|	 }|r#||d df n||d df }t||| | ||f }d| t |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   zq
r  b
Q
)	rv   r  r8  r   _oval_stringr;  rr  r<  rs  )rO   re  rf  r	  r   r   r3  rv  rI  r[  r  r   r   r  rc  rb  r   r   r   r   r   r0  0Q  s    $0zTOOLS._le_circlec                 C   s  t | |||\}}}}}	}
}}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   r   r   r!  r  r&  r#  rO   re  rf  r	  r   r   r3  rv  rI  r[  r  r   r   r  rc  r  r   r   r   r   r3  >Q      $($zTOOLS._le_closedarrowc                 C   sF  t | |||\}}}}}	}
}}d}|td|	 }|r#||d df n||d df }t||| | ||f }|j|j|j d  | }d||j|jf }|j|j|j d  | }|d|j|jf 7 }|j|j	|j d  | }|d|j|jf 7 }|j	|j|j	 d  | }|d|j|jf 7 }|d|	 7 }||
| d	 7 }|S )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        r%  r   r  r   r  q
%s%f %f m
r!  r  r&  )
rv   r  r8  r   r;  rs  r~  r  rr  r<  rO   re  rf  r	  r   r   r3  rv  rI  r[  r  r   r   r  rc  rb  r   r
  r   r   r   r   r1  RQ  s     $zTOOLS._le_diamondc                 C   s  t | |||\}}}}}	}
}}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   r   r   r!  r  S
Q
r#  r(  r   r   r   r2  hQ  s    $($zTOOLS._le_openarrowc                 C   s  t | |||\}}}}}	}
}}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   r   r   r   r   r!  r  r&  r#  r(  r   r   r   r6  |Q  r)  zTOOLS._le_rclosedarrowc                 C   s  t | |||\}}}}}	}
}}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   r   r   r   r!  r  r,  r#  r(  r   r   r   r5  Q  r)  zTOOLS._le_ropenarrowc                 C   s   t | |||\}}}}}	}
}}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   r  r   r   r!  r  r"  )rv   r  r8  r   r~  r  r;  r<  )rO   re  rf  r	  r   r   r3  rv  rI  r[  r  r   r   rwrb  r   r  r$  r   r   r   r   r7  Q  s    .

zTOOLS._le_slashc                 C   s  t | |||\}}}}}	}
}}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&  )
rv   r  r8  r   r;  r~  r  rr  r<  rs  r+  r   r   r   r/  Q  s     $



zTOOLS._le_squarec                 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  )r
  r  r   r  r   r   r   bezierQ  s    z"TOOLS._oval_string.<locals>.bezierr  r  z%f %f m
r  )re  rf  r  r  r.  r  r  mor  muol1ol2or1or2ur1ur2ul1ul2r   r   r   r   r'  Q  s(   zTOOLS._oval_stringc           	      C   s  t r	t| j}ndd }|| }|sdS d}d}d}| }t|D ]\}}|dkrN||d  d	d  }t||d	  }d
 ||<  ||d	 < ||d < q#|dkrft||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 )Nc              
   S   s   | j }t|tjsJ t|}t|}z&t|td}|js4t	|}t
|tdtdtd}t|}W |S  tyS } ztrHt  W Y d }~d S d }~ww )Nr  rR  rS  )r:   r7   r.   rL   rh   r   r  rq   ri   rV  r   rm   rt   ru   r   )rO   rv  this_annot_objr   r  r  rI  r}   r   r   r   Tools__parse_daQ  s(   



z(TOOLS._parse_da.<locals>.Tools__parse_da)r  r,   r   rK  r  rJ  rq  r   r   r,   rr  rs  c                 S   rt  r   ru  rv  r   r   r   r  R  r  z#TOOLS._parse_da.<locals>.<listcomp>r   r  c                 S   rt  r   ru  rv  r   r   r   r  R  r  r  )r   r   Tools_parse_dar:   rd  rC  r  )	rO   r~   r:  r  rG  r   rw  r   r  r   r   r   rw   Q  s>    ,8
zTOOLS._parse_dac                 C   s(   | }t |}t |}t || d S rK   )r.   rh   r   pdf_field_reset)rO   rv  r9  r   r   r   r   r  R  s   

zTOOLS._reset_widgetc                 C   s&   |   }tjstt S tt|S rK   )r  r  ri   r   r.   r   r  )rG   r  r   r   r   r6
  %R  s   zTOOLS._rotate_matrixc                 C   s   t | | d S rK   )r0  )rO   r  r   r   r   r  ,R  rR	  zTOOLS._save_widgetc              
   C   s   t rt| j| d S z0| j}t|tjsJ tt|t	d| t
t|t	d t
t|t	d W d S  tyS } ztrHt  W Y d }~d S d }~ww )Nr  r"  r#  )r   r   Tools_update_dar:   r7   r.   rL   r  rh   rq   r   rt   ru   r   )rO   rI  rv  r}   r   r   r   r%  0R  s   
zTOOLS._update_dac                   C   r  )zB
        Was previously hidden by Tools.fitz_config list?
        )JM_fitz_configr   r   r   r   fitz_config_?R  r  zTOOLS.fitz_config_c                   C   s   t d7 a t S r  )TOOLS_JM_UNIQUE_IDr   r   r   r   r?  FR  s   zTOOLS.gen_idc                   C   s   t   dS )z(
        Empty the glyph cache.
        N)r.   fz_purge_glyph_cacher   r   r   r   glyph_cache_emptyLR  r
  zTOOLS.glyph_cache_emptyr   c                 C   s
   t | |S )z5
        Metadata of an image binary stream.
        )r`  )r   r_  r   r   r   r  SR  s   
zTOOLS.image_profileNc                 C      | durt | atS )z;
        Set MuPDF error display to True or False.
        N)r  r  r  r   r   r   mupdf_display_errorsZR     zTOOLS.mupdf_display_errorsc                 C   rC  )z>
        Set MuPDF warnings display to True or False.
        N)r  r  rD  r   r   r   mupdf_display_warningsdR  rF  zTOOLS.mupdf_display_warningsc                   C   s   t jS )z"Get version of MuPDF binary build.)r.   
FZ_VERSIONr   r   r   r   mupdf_versionnR  s   zTOOLS.mupdf_versionc                 C   s   d t}| rt  |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        r  )r&  r>  rv   reset_mupdf_warnings)r  r&   r   r   r   r	  sR  s   
zTOOLS.mupdf_warningsc                   C   s
   t  ad S rK   )r  r>  r   r   r   r   rJ  }R  rs  zTOOLS.reset_mupdf_warningsc                 C      t |  dS )z*
        Set anti-aliasing level.
        N)r.   fz_set_aa_level)r(  r   r   r   set_aa_levelR     zTOOLS.set_aa_levelc                 C   s4   | d u rt S t| d }|dkrd}| d d a t S )Nr   r	  )rK  r  )rM  r  r   r   r   set_annot_stemR  s   zTOOLS.set_annot_stemc           
      C   s   t | }|sdS t||}t|td}t|rWt|}t|D ]2}t||}t	|d}	t
|	td t
|	td t
|	t| t|td|	 q$dS )NFr  r   r   rl  r  T)rA   r.   r  rp   rq   r{  r  r   r  r   r}  ro  r   )
r   r{   r  r   r  dfontsr   r   dfontwarrayr   r   r   r  R  s   

zTOOLS.set_font_widthc                 C   rK  )z6
        Set the graphics minimum line width.
        N)r.   fz_set_graphics_min_line_width)min_line_widthr   r   r   set_graphics_min_line_widthR  rN  z!TOOLS.set_graphics_min_line_widthc                 C   s4   | rt r
t  dS tdt dS t rt  dS dS )z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)FZ_ENABLE_ICCr.   fz_enable_iccr  r
  fz_disable_iccrD  r   r   r   set_iccR  s   
zTOOLS.set_iccc                 C   rC  )z!Set / unset MuPDF device caching.N)r  r	  rD  r   r   r   set_low_memoryR  s   zTOOLS.set_low_memoryc                 C   s   | durt | att tS )z Set / unset small glyph heights.N)r  r  r   set_small_glyph_heightsrD  r   r   r   r[  R  s   
zTOOLS.set_small_glyph_heightsc                 C   rC  )zK
        Set / unset returning fontnames with their subset prefix.
        N)r  r  rD  r   r   r   set_subset_fontnamesR  rF  zTOOLS.set_subset_fontnamesc                   C   s   t t t t dS )z,
        Show anti-aliasing values.
        )graphicsr   graphics_min_line_width)rf   r.   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr   r   r   r   show_aa_levelR  s
   zTOOLS.show_aa_levelc                   C   r  )z)
        MuPDF store size limit.
        Nr   r   r   r   r   store_maxsizeR     zTOOLS.store_maxsizec                 C   s2   | dkr
t   dS | dkrt d|   dS dS )z7
        Free 'percent' of current store size.
        r  r   N)r.   fz_empty_storefz_shrink_store)percentr   r   r   r  R  s   zTOOLS.store_shrinkc                   C   r  )z+
        MuPDF current store size.
        Nr   r   r   r   r   
store_sizeR  rd  zTOOLS.store_sizec                 C   rC  )zA
        Set ascender / descender corrections on or off.
        N)r  r  rD  r   r   r   unset_quad_correctionsR  rF  zTOOLS.unset_quad_correctionsr  z	plotter-gTzplotter-rgbzplotter-cmykz	plotter-nr   xpsr  cbzr.  r	  epubr}  rF  tofuztofu-cjkztofu-cjk-extztofu-cjk-lang)z
tofu-emojiztofu-historicztofu-symbolztofu-siliccbase14z	py-memoryr  r  rK   )1r  r  r  r1  r  r  r  r3
  rG
  r  r4  r0  r3  r1  r2  r6  r5  r7  r/  r'  rw   r  r6
  r  r%  r?  r?  rB  r  rE  rG  rI  r	  rJ  rM  rO  r  rU  rY  rZ  r[  r\  rb  rc  r  rh  ri  rK  fitz_configr   r   r   r   rv   P  s   

	
%










6





		
	





	





	
rv   )utilsc                 C   s0   g | ]\}\}}}||d  |d  |d  ffqS )rJ
  r   )r  r  r   rr  r-  r   r   r   r  ,S  s    r  c                   C   s    t   t d  t d  d S rK   )r.   fz_flush_warningsfz_set_warning_callbackfz_set_error_callbackr   r   r   r   _atexitJS  s   
ru  c                 C   r2
  rK   )rq  r  r  r   r   r   r  S  s   
 r  )find_tablesc                   @   r$  )FitzDeprecationNr%  r   r   r   r   rw  S  r'  rw  z1.23.5z1.23.6z2023-11-06 00:00:01rJ  r  r   c                  C   sr	  t jdtd d dd} | t _ddd}|tdd |td	 |td
d |td |td |tdd |td |tdd |td |td |td |td |td |td |tdd |td |td |tdd |td	 |tdd |td |td  |td!d" |td# |td$ |td%d& |td'd( |td)d* |td+d, |td-d. |td/d0 |td1d2 |td3d4 |td5 |td6 |td7 |td8 |td9 |td:d; |td<d= |td>d? |td@ |tdA |tdBdC |tdDdE |tdFdG |tdH |tdI |tdJdK |tdL |tdMdN |tdOdP |tdQ |tdR |tdS |tdT |tdU |tdV |tdW |tdX |tdY |tdZ |td[d\ |td] |td^d_ |td`da |tdbdc |tdd |tde |tdf |tdg |tdhdi |tdj |tdk |tdl |tdmdn |tdo |tdp |tdq |tdr |tdsdt |tdu |tdudv |tdw |tdx |tdy |tdz |td{ |td |td |t	d| |t	d}d~ |t	dd |t	dd |t	dd |d dd |d dd |d d |d dd |d dd |d dd |d dd |d d |d d |t
d{ |t
d |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |tdd |tdd |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |td |tdd |td |tdd |td |tddă |tdŃ |td	 |tddǃ |td |tdȃ |tdɃ |td |tdd |tdʃ |td˃ |td̃ |td̓ |td΃ |tddЃ |tdу |td҃ |tddԃ |tddփ |td׃ |td؃ |tdك |tdڃ |tdd܃ |tddރ |td߃ |tdd |td |td |td |td |td |tdd |td |tdd |tdd |tdd |tdd |tdd |td |tdd |td |td |td |td |tdd |tdd |tdd |td |tdy |td |tdu |tdudv |tdw |tdx |tdy |tdz |td |td |tjd |tjd |tjd |tjd |tjd |tjd |tjd |tjd |tjd |tjd |tjd |tjd̓ |tjd΃ d S (  Noncecategoryc                 S   sf   t j| ||||d}|d}|dk rt|tjd d S ||d   d dd  }t|tjd d S )N)r   rw  r   r   r  )warningsformatwarningr+  r   r   r   r(  )rJ  catr   r   r   r   r   r  r   r   r   showthisS  s   
z!restore_aliases.<locals>.showthisc                    s    du r	t jt  s*dd}D ]}|dkrd}q|r%| 7 d}q|7 qt t dr?J d  d tr^ fdd	}t | d
 dj |_dS t  dS )a  
        Adds an alias for a class_ or module item clled <class_>.<new>.

        class_:
            Class/module to modify; use None for the current module.
        new_name:
            String name of existing item, e.g. name of method.
        legacy_name:
            Name of legacy object to create in <class_>. If None, we generate
            from <item> by removing underscores and capitalising the next
            letter.
        Nr,   FrS  Tzclass z already has c                     s:   t dstjd d  d dtd | i |S )Nz1.18r  z" removed from z after v1.19.0 - use "z".ry  )VersionBindrp  r{  warnrw  )r  r
  class_legacy_namenew_name
new_objectr   r   deprecated_functionS  s   
z<restore_aliases.<locals>._alias.<locals>.deprecated_functionz>*** Deprecated and removed in version following 1.19.0 - use "z". ***
)r   modulesr  r  rS   r	  r+  r1  )r  r  r  capitalise_nextr  r  r   r  r   _aliasS  s,   


 zrestore_aliases.<locals>._aliasr'  fileGetrG  rV  soundGetr  r
  r]  getTextPager  r  setBlendModer  r  r  r  r  r  r  setOCr  r  rs  fileUpdr  r  rC  convertToPDFrK  r  r  deletePageRanger`  embeddedFileAddra  embeddedFileCountrd  embeddedFileDelre  embeddedFileGetrj  embeddedFileInforv  embeddedFileNamesrk  embeddedFileUpdry  r  r  r  r
  r  getOCGsr  getPageFontListr  getPageImageListget_page_pixmapget_page_textr  getPageXObjectListr  getSigFlagsrN  getToCr  insert_pager  	insertPDFr  r  ri  r
  isPDFr  r  rB  r  rZ  rg  rA  new_pager{  r  r  pageCropBoxr  r  
PDFCatalogrV  
PDFTrailerr  previousLocationr  search_page_forr  set_metadataset_tocsetToCr  r  r   r9  isStreamr;  r  rC  rF  rG  metadataXMLget_areagetRectArearK  rL  rz  ry  r  r  r  	preRotater!  preScaler"  preShearr%  preTranslater]  	getPDFnowr^  	getPDFstrr  getTextlengthr  ImagePropertiesr  	PaperRectr  	PaperSizer  r4  rr  rt	  rw	  ry	  rz	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r   r  rY	  r	  CropBoxPositionr	  r	  delete_widgetr  r  r  r  r  r  r  r  r  r  r  r  r	  r	  r	  r	  r	  getDisplayListr	  r	  getFontListr	  r 
  getImageList	get_linksr
  getSVGimageget_text_blocksget_text_wordsr 
  insert_imager  rr  r  r	  
_isWrappedr	  r	  r  r@
  r1
  MediaBoxSize	new_shaper$
  r7
  
search_forr?
  
setCropBoxrA
  setMediaBoxr  show_pdf_pageshowPDFpager   update_linkr	  r  r
  r  
copyPixmapr
  r
  invertIRectr
  pillowWriter
  
pillowDatar  
writeImagewritePNGr
  r=  setResolutionr
  r
  r
  r  getImageData
getPNGData
getPNGdatar  r7  fill_textboxrP  rK   )r{  filterwarningsrw  showwarningrI   r  r8   rQ
  r  r   r  rC   r>  r	  r   r  rq  r  )r~  r  r   r   r   restore_aliasesS  s  	,












































































































































r  r  )r   r   r   r   r   N)r?  )r
  r  r   )r+  )rG   rC   rO   rI   r  Nr  )r  r   r   rh  )rG   rC   r  rU  r  N(  r1  globr
   r  r   r  r  r   r   r(  r   atexitr  r  r  r]  rS  r{  r$  r*  r,   r   rS  
whitespacer  r=  r'   ru   r   r	  r  r  r  r!   r"   r-   __file__	importlib	machinerySourceFileLoaderload_moduler  r  r.   rt   r}   reinit_singlethreadedFZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHrX  OptionalrU  rV  rf   OptDictr  r  rT  r  rW  Sequencer  rT   r  rC   r:  r1   r2   r3   r4   r5   r9   rA   rH   rI   r  r  r  r  r  FzDocument_insert_pdfr  r8   r  r\  rU  r  r  r   r)  r  r  r  r  r  r   r	  r  r>  r	  r   r  r  rY  r  rQ
  r  r  rN   rN  r  r#   r  rp  r+  r   
getmembersPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCEUCDN_EAST_ASIAN_HPDF_TX_FIELD_IS_MULTILINEUCDN_SCRIPT_ADLAMr  rc  AnyAnyTypeBase14_fontnamesrs  r  r8  r  r  rg
  rh
  rK  r>  r  r  	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFr6  r<  r;  rA  r@  rB  r>  r?  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMSTAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_Draftr  r  r  r  TEXT_FONT_SUPERSCRIPTrw  rx  ry  rz  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_CYRILLICr@  r  r  r  PDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLight
annot_skelr   r*  r)  r,  r6  r5  r7  rs   r}  r  r  r  r  r  r  rf  ri  r  
dictkey_darW  r  r  dictkey_effectr  r  r^  r  r  dictkey_glyphr  rl  r  r  r  r  r  rj  rg  r|  r  r  r  r  r  r]  rX  rk  ro   rh  r  r  r  r  rl   r  r  rq  r"  r#  r  rp  r  r  r
  r  r  r  r  r  rk  r!  r#  r&  r%  r  r,  r8  rE  r   r  r   r/  r_  rM	  r  r  r  r^	  rn   r  r  r   r   r  rn  r`  r  r  r^  r{  ru  r  r   r
  r  r  r?  r  r~  rz  r	  r|  r  r<  r  r!  r  r  r
  r  r  r  r  r  r  r  r  r<   r  rK	  rJ	  r	  r}  rc  rt  r  r		  r.
  r6  rr  r>  r  r  r1  r)  r  rY  rZ  r`  r	  rw  r)	  r  r
  r  r  r  r  r  r  r  rU  r9  r0
  r  r  r  r  r	  r  r4  rB
  r/  r]  r5
  rX  r  r  rR  r  r
  r   r  rX  r   r  r  r  r_  r  r  r  r  r	  r  r?  r  rb	  r0  r  r   re	  r  r  r  r   r  r  r   r
  r/  r.  MSG_BAD_LOCATIONr"  r  rQ  MSG_BAD_PAGEIDr  r  r  r  r  r
  r  r  r  r	  r>  r  rW
  r
  r  r  r  r
  r  r
  r}	  r  r  r   r+  r*  r  r  rq   rV  r  r'	  rv  re  r  r^  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  FzPathWalker2r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r!  r   r4  PdfFilterOptions2ry  	FzDevice2r  	FzOutput2r  r  r	  r
  r   rX  r\  r]  rg  ri  rq	  rr	  rm  ro  rt  rq  r  r]  r	  r~  r  r|	  r  r  r  r  rH  r  rt  r}  rZ  rD  rW  r)  r   rY  r  r  r  r5  r	  rv  r  r  r  r  r  r  r  r  r  r  r  r  rQ  rp  r  r  r  r  r  r  r  r  rv   rq  getColorInfoDictpdfcolorrs  rt  ru  registerrecover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadr  r
  do_linksr  del_toc_itemr
  r,  get_ocmdget_page_labelsget_page_numbersr  r  rN  
has_annots	has_linksr  r  scrubr  r  r  set_ocmdset_page_labelsr  set_toc_itemsubset_fontsr@  r  r  apply_redactionsdelete_imager  r  r  r  r  r  r  r  r  r  r  r  get_image_infor	  	get_labelr  rG  r  get_text_selectionr  get_textpage_ocrr  r  rr  r  r  replace_imager  r  r  r  tablerv  r  DeprecationWarningrw  VersionFitzr  VersionDater.  VersionDate2versionr  __version__r   r   r   r   <module>   s   





          q B    m*                          x,  
 = cD  LA                f      : 7 d         (    J   4


    
	
	

#






	F  	(7	Y8%42%
	 %*(:>7 ,!	
5#N#~#!6B
,+!*Y)&0 B	#&$    2 1>%5C
0E*G	'1	 (b7
"Q6    \ &$
6
5.I,+F					'J9D2 b	+    f
	
,  