o
    ݉fq'                    @   sR"  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZ dd ZedejZedejZe Zd	ad
d Zdd Zdd ZdiddZdjddZdd Z e!e
j"d e#d Z$dd Z%dd Z&e&ddZ'e%ddZ(G dd  d Z)e) Z*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/j01d&e-2 Z-e-j3j4j5Z5nzdd'lm5Z5 W n e6y   ddl5Z5Y nw e57  d(d) Z8d*Z9e5j:Z;d+Z<e=d,d- e9>d.D Z?e=d/d- e;>d.D Z@e@e5jAe5jBe5jCfks8J d0e@d1e5jAe5jBe5jCfe<Dd2dDd3dDd4dZEe9e;eEfZFe;ZGe9ZHe<ZId5d6d7d8ZJeJZKejLejM ZNejLeO ZPejLeQ ZRejSeTdf ZUejLejV ZWejLeX ZYd9ZZd:Z[ej+,d;Z\d<Z]d=Z^d>Z_d?Z`d@dA ZadkdBdCZbdDdE ZcdkdFdGZddZeG dHdI dIZfG dJdK dKZgG dLdM dMZhG dNdO dOZiG dPdQ dQZjG dRdS dSZke(rejlZmG dTdU dUZnenZoG dVdW dWZpG dXdY dYZqG dZd[ d[ZrG d\d] d]ZsG d^d_ d_ZtG d`da daetZueu ZvG dbdc dcZwG ddde deZxddflmyZy G dgdh dhZz						dldidjZ{G dkdl dlZZG dmdn dnZ|[[G dodp dpZ[G dqdr drZ}G dsdt dtZ~G dudv dvZG dwdx dxZG dydz dzZG d{d| d|ZG d}d~ d~Z	 eje Z	 e5j D ]\ZZedredrqeeee qde5jB e5jB e5jB e5jB e5jB e5jB Ze5jdksJ ee5jksJ ee5jksJ [[[i Zi ZejZdZi ZeD ]	Zeee < qded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< dZdZdZdZdag adadadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdeB eB eB eB ZdeB eB eB eB ZdeB eB eB eB eB ZeZdeB eB eB eB ZdeB eB eB eB eB ZdeB eB eB eB eB ZdeB eB eB eB ZdeB eB eB eB ZdZdZdZdadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZddÄ ddÄ ddÄ ddÄ ddÄ ddÄ ddÄ dʜZG dd̄ deZ G dd΄ deZG ddЄ dАe ZeieZeieZeieZdѐZdҐZdӐZdԐZ	dՐZ
d֐ZdאZdؐZdِZdڐZdېZdܐZdݐZdސZdߐZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4dZ5dZ6dZ7z3ddl8m9Z9m:Z: e9; Z<e<= D ]Z>e:e> e<e> d< q%[9[:W n e?yJ   i Z<Y nw dZ@dZAdd	 ZBd
d ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMd d! ZNd"d# ZOd$d% ZPd&d' ZQd(d) ZRd*d+ ZSd,ejVd-e=fd.d/ZTd,ejVd-e=fd0d1ZUd2d3 ZVd4d5 ZWd6d7 ZXd8d9 ZYd:d; ZZd<d= Z[d>d? Z\d@dA Z]dBdC Z^dDdE Z_dFdG Z`dHdI ZadJdK ZbdLdM ZcdNdO ZddPdQ ZedRdS ZfdTdU ZgdVdW ZhdXdY ZidZd[ Zjd\d] Zkd^d_ Zld`da Zmdbdc Znddde Zodfdg Zpdhdi Zqdjdk Zrdldm Zsdndo Ztdpdq Zudrds Zvdtdu Zwdvdw Zxdxdy Zydzd{ Zzd|d} Z{d~e5j|deTfddZ}de5j~d~e5j|deTf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 Zda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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ܐd0Zݐd1Zސd2Zߐd3Zd4Zd5Zd6Zd7Zd8Zd9Zd:Zd;Zd<Zd=Zd̐Zd>Zd?d@ ZdmdBdCZdeWfdDdEZdFeZdGeXd-e=fdHdIZdendeTd-efdJdKZdLejd-e=fdMdNZd,ejd-efdOdPZd,ejfdQdRZdSejd-efdTdUZdVejd-efdWdXZdejSee=eQdf dYeXd-eXfdZd[Zd\d] Zd^d_ Zdend`ejVfdadbZdcdd Zdedf Zdgdh Zdidj ZdeXdkejSee=df dledmeTd-eXf
dndoZ dpeXd-eXfdqdrZd-eXfdsdtZddddudveXdweYdxedeYd-eXf
dydzZdndeXdGeXd{eQd|eTd-eQf
d}d~ZdejMd-eOf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G dd de5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)de^de^d-etfdʐd˄Z*G d̐d̈́ de5j+Z,G dΐdτ de5j-Z.G dАdф de5j/Z0dҐdӄ Z1G dԐdՄ de5j-Z2G d֐dׄ de5j-Z3d-e4fdؐdلZ5dodeXdeYfdܐd݄Z6deXfdސd߄Z7d-e=fddZ8d-e=fddZ9dFdld-eTfddZ:dpddZ;dd Z<dd Z=dd Z>dd Z?dd Z@d-eXfddZAG dd deBZCdd ZDdqde^de^de`d-efddZEdeXd-eTfddZFd d ZGdrde`deTdeTd-efddZHdd ZIddddddd	d
dZJddddddd	ddZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTd d! ZUd"d# ZVd$d% ZWd&d' ZXd(d) ZYd*d+ ZZd,d- Z[dpeXd-e~fd.d/Z\dpeXd-e=fd0d1Z]d2d3 Z^e@d4krd5d6 Z_nd7d8 Z`d9d6 Z_djd:d;Zadsd<d=Zbd>eTd-e=fd?d@Zcd>eTd-e=fdAdBZddCdD ZedEdF ZfdGdH ZgdZhdZidZjdZkdIeTd-eXfdJdKZldLdM ZmdNeO ddNeO ddOdd	dP	dQdRZnddOdddddd	dd	dS
dTdUZoG dVdW dWZpddXlmqZq eOdYd- eqr  D Zse-se5te e5ue dZd[ Zvewev eqjxZxeqjyZyeqjzZzeqj{Z{eqj|Z|eqjoef_oeqj}ef_}eqj~en_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_eqjen_enjen_eqjen_eqje_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjoeZ_oeqjeZ_eqjeZ_eqjeZ_eqj}eZ_}eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_d\dÄ eZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_eqjeZ_dd]lmZ eeZ_eqje~_eqje_G d^d_ d_eZd`da Z	 eHZdbeH dceG ddejd  d.ejd  deejě dfejŐdgkr!dnd dhZ dS (t  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   )extrac                 C   s   t j| }|du r|S |drtt|dd dddS |dr,t|dd dS |d	r:t|d
d dS td| d|)zI
    Returns a stream to use based on environmental variable `name`.
    Nzfd:   wF)modeclosefdzpath:   zpath+:   az&Unrecognised stream specification for z? should match `fd:<int>`, `path:<string>` or `path+:<string>`: )osenvironget
startswithopenint	Exception)namedefaultt r   H/home/ubuntu/flask/venv/lib/python3.10/site-packages/pymupdf/__init__.py_set_stream.   s   


r   PYMUPDF_LOGPYMUPDF_MESSAGEFc                   C   s   t S N_g_log_itemsr   r   r   r   
_log_itemsD      r   c                 C   s   | a d S r   )_g_log_items_active)activer   r   r   _log_items_activeG      r!   c                   C   s   t d d = d S r   r   r   r   r   r   _log_items_clearK      r#    c                 C   s   zt jdd}W n	 ty   Y n.w || }z	tj|j}W n ty+   |j}Y nw |j}|j	}| d| d| d|  } t
rFt|  t| tdd dS )z0
    For development/debugging diagnostics.
    r   )context:z(): r   )fileflushN)inspectstackStopIterationr   pathrelpathfilenamer   linenofunctionr   r   appendprint
_g_out_log)textcallerr+   frame_recordr/   liner1   r   r   r   logO   s"   

r9   c                 C   s   t | td t  dS )z
    For user messages.
    )r(   N)r3   _g_out_messager)   r5   r   r   r   messagee   s   r<   c                  C   s    dd l } td t|   d S )Nr   zexception_info:)	tracebackr9   
format_exc)r=   r   r   r   exception_infom   s   r?   z
()<>[]{}/%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 )
}
    Returns `True`, `False` or `default` depending on whether $<name> is '1',
    '0' or unset. Otherwise assert-fails.
    N1T0Fr   zUnrecognised value for : Using non-default setting from )r   r   r   r9   r   r   vretr   r   r   get_env_boolv   s   rH   c                 C   sB   t j| }|du r|}nt|}||krtd|  d|  |S )r@   NrD   rC   )r   r   r   r   r9   rE   r   r   r   get_env_int   s   rI   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                   @      e Zd Zdd ZdS )_Globalsc                 C   s   d| _ d| _d| _d| _d S Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsselfr   r   r   __init__   s   
z_Globals.__init__N__name__
__module____qualname__rU   r   r   r   r   rM          rM   MUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATHmupdf_cppyy)mupdfc                 C   s&   |  d}|dkr| d| } t| S )z<
    Converts string to int, ignoring trailing 'rc...'.
    rcr   N)findr   )r5   r_   r   r   r   _int_rc   s   
ra   z1.24.9z2024-07-24 00:00:01c                 C      g | ]}t |qS r   ra   .0ir   r   r   
<listcomp>       rg   .c                 C   rb   r   rc   rd   r   r   r   rg      rh   z8Inconsistent MuPDF version numbers: mupdf_version_tuple=zM != (mupdf.FZ_VERSION_MAJOR, mupdf.FZ_VERSION_MINOR, mupdf.FZ_VERSION_PATCH)=- r'   z%gfmtc                C   sX   t | ttfrd}| D ]}|r|d7 }|t||d7 }q|S tdkr(t|| S ||  S )z
    Returns `value` formatted with mupdf.fz_format_double() if available,
    otherwise with Python's `%`.

    If `value` is a list or tuple, we return a space-separated string of
    formatted values.
    r%   rk   rl   )r         )
isinstancelisttuple	_format_gmupdf_version_tupler^   fz_format_double)valuerm   rG   rF   r   r   r   rs      s   rs   Page_forward_declPoint_forward_declTESSDATA_PREFIXmatrix_like
point_like	quad_like	rect_likec                 C   sd   t | tr| jrtd| j} t | tjr| S t | tjr!|  S | du r)J dJ dt	| )zz
    Returns document as a mupdf.FzDocument, upcasting as required. Raises
    'document closed' exception if closed.
    document closedNr   document is NoneUnrecognised type(document)=)
rp   Document	is_closed
ValueErrorthisr^   
FzDocumentPdfDocumentsupertype)documentr   r   r   _as_fz_document  s   
r   c                 C   sx   t | tr| jrtd| j} t | tjr| S t | tjr+t| }|r)|js)J |S | du r3J dJ dt	| )a  
    Returns `document` downcast to a mupdf.PdfDocument. If downcast fails (i.e.
    `document` is not actually a `PdfDocument`) then we assert-fail if `required`
    is true (the default) else return a `mupdf.PdfDocument` with `.m_internal`
    false.
    r~   Nr   r   r   )
rp   r   r   r   r   r^   r   r   
m_internalr   )r   requiredrG   r   r   r   _as_pdf_document%  s   


r   c                 C   sV   t | tr| j} t | tjr|  S t | tjr| S | du r"J dJ dt| )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    Nr   page is NoneUnrecognised type(page)=)rp   Pager   r^   PdfPager   FzPager   pager   r   r   _as_fz_page<  s   
r   c                 C   sj   t | tr| j} t | tjr| S t | tjr$t| }|r"|js"J |S | du r,J dJ dt| )z
    Returns `page` downcast to a mupdf.PdfPage. If downcast fails (i.e. `page`
    is not actually a `PdfPage`) then we assert-fail if `required` is true (the
    default) else return a `mupdf.PdfPage` with `.m_internal` false.
    Nr   r   r   )	rp   r   r   r^   r   r   pdf_page_from_fz_pager   r   )r   r   rG   r   r   r   _as_pdf_pageK  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	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e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 r   )rp   r^   PdfAnnotr   rT   annotr   r   r   rU   h     
zAnnot.__init__c                 C   s"   t | dd}d| jd t|f S )Nparentz<>z'%s' annotation on %sr   )getattrr   str)rT   r   r   r   r   __repr__l  s   zAnnot.__repr__c                 C      |   S r   )r   rS   r   r   r   __str__p     zAnnot.__str__c                 C   s   t | ddrd| _d S d S )NthisownF)r   r   rS   r   r   r   _erases  s   
zAnnot._erasec                 C   s4  | 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yo   trlt  Y d S w |}|sv|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_objr   message_warning
pdf_to_numdictkey_xrefpdf_to_text_stringJM_UnicodeFromStrdictkey_textpdf_dict_getPDF_NAME
pdf_to_intdictkey_alignr   g_exceptions_verboser?   r   TOOLS	_parse_dacolors)rT   r   valuesobjxrefr5   alignvalr   r   r   r   r   r   r   _get_redact_valuesw  sF   





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_extrarp   r   r^   r   r   Annot_getAPbytesr   pdf_dict_getlr   pdf_is_streampdf_load_streamr   JM_BinFromBuffer)rT   rG   rresr   	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yg   trdt  Y d S Y d S w )Nr   r   r   RectBBox)r   r^   r   pdf_annot_pager   r   r   RuntimeErrorMSG_BAD_APNr   JM_BufferFromBytesr   MSG_BAD_BUFFERJM_update_streamdocpdf_dict_get_rectpdf_dict_put_rectr   r   r?   )	rT   buffer_r   r   r   r   apobjr   bboxr   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|   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r>|dk r>t)|td| t)|td| t)|td| |rSt*|td| t*|td| t&|td}|jsht'|tdd
}t|td| W dS  ty } zt rt!  t"d|   d }~ww )Nr   ICr   Rotatezcannot update annot: Tr   r   	Resourcesro   r   CAcaBM	ExtGStateHz#cannot set opacity or blend mode
: )+r   r   r^   r   r   r   r   JM_color_FromSequencePDF_ANNOT_SQUAREPDF_ANNOT_CIRCLEPDF_ANNOT_LINEPDF_ANNOT_POLY_LINEPDF_ANNOT_POLYGONpdf_dict_delr   pdf_set_annot_interior_colorPDF_ANNOT_CARETPDF_ANNOT_FREE_TEXTPDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_STAMPPDF_ANNOT_TEXTpdf_dict_put_intpdf_dirty_annotpdf_update_annotresynth_requiredpdf_set_annot_colorpdf_new_arrayrangepdf_array_push_realpdf_dict_putr   r   r?   r<   r   r   r   r   pdf_dict_put_dictpdf_new_dictpdf_dict_put_realpdf_dict_put_name)rT   opacity
blend_mode
fill_colorrotater   r   r   pdftype_nfcolfcol
insert_rotcolrf   er   	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9 }|S )zannotation appearance bboxr   r   r   )CheckParentr   r^   r   r   r   r   JM_py_from_rectFzRectFixed_INFINITEr   r   
get_parenttransformation_matrixderotation_matrix)rT   r   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   rp   r^   r   r   r   PDF_ENUM_NAME_APPDF_ENUM_NAME_Nr   JM_py_from_matrixFzMatrixpdf_dict_get_matrixPDF_ENUM_NAME_MatrixMatrixr   r   r?   )rT   r   r   matr   r   r   r   
apn_matrix8  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^   r   r   r   r   r   pdf_to_namer   pdf_is_dictpdf_dict_lenr  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)rT   r   r   r   r
  nrf   obj1mjobj2r   r   r   	blendmodeP  s:   




zAnnot.blendmodec                 C   sT   t |  | jd }|tjtjtjtjtjtjtj	fvrt
 S t| j}t|}|S )zBorder information.r   )r  r   r^   r   r   r   r   r   r   r   r   r   r   JM_annot_border)rT   atypeaorG   r   r   r   borderp  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_documentr   _make_PdfFilterOptionspdf_filter_annot_contents)rT   r<  r   r  filter_r   r   r   clean_contents  s
   zAnnot.clean_contentsc                 C   sJ   zt |  | j}t|tjsJ tt|W S  ty$   tr#t	   w )zColor definitions.)
r  r   rp   r^   r   JM_annot_colorsr   r   r   r?   r   r   r   r   r     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^   r   r   JM_find_annot_irtr   pdf_delete_annotr   r   r   r   pdf_array_lenr  pdf_array_getr.  pdf_array_deleter  )rT   r   r   r   	irt_annotannotsr/  foundrf   opr   r   r   delete_responses  s4   


zAnnot.delete_responsesc                 C   sV  t |  t }d}d}d}| j}t|}t|}|tjkr#ttt	|t
dt
dt
d}|js9tdt t|t
d}	t|	t
d}
|
jrRt|
}nt|	t
d}
|
jrbt|
}t|	t
d}
|
jrrt|
}t|t
d	}
|
jrt|
}t	|t
d
t
d}
|
jrt|
}t||t< t||t< ||t< ||t< |S )zAttached file information.r   NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)r  r   r   r^   r   r   r   	TypeErrorMSG_BAD_ANNOT_TYPEr   r   r   RAISEPYJM_Exc_FileDataErrorr   r   r   JM_EscapeStrFromStrdictkey_filenamer   dictkey_descdictkey_lengthdictkey_size)rT   r   lengthsizedescr   r   r  streamfsrN  r/   r   r   r   	file_info  sN   







zAnnot.file_infoc                 C   s   t |  | j}t|S )zFlags field.)r  r   r^   pdf_annot_flagsr   r   r   r   flags  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.rQ  rR  rS  rT  )r  r   r^   r   r   r   rZ  r[  r   r   r   r\  r]  r   r   )rT   r   r   r   rf  bufr   r   r   r   get_file  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^   r   r   r   r   r   )rT   ocr   r   r   r   r   r   get_oc  s   

zAnnot.get_occ                 C   sh   zt | d}W |S  ty3   t| j}t|tjsJ |jr&t|	 nd }t
||}|| _Y |S w )Nr   )r   AttributeErrorr^   r   r   rp   r   r   r   r   r   r   )rT   rG   r   r   r   r   r   r    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|}t|}	|rH|	|| |	S )zannotation Pixmap)grayrgbcmykNH   r   )r  csGRAYcsRGBcsCMYKr   r   r   lowerr&  JM_matrix_from_pyr^   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
rT   matrixdpi
colorspacealphacspacesctmcspixrG   r   r   r   
get_pixmap  s   zAnnot.get_pixmapc           	      C   s:  t |  | j}t|}t|}t|td}|tjks!|js%t	t
t|tdjr3tdt t }t|td}|jrHt||d< t|td}|jrZt||d< t|td}|jrlt||d	< t|td
}|jr~t||d< t|d}|jrt||d< t|}t|}||d< |S )zRetrieve sound stream.SoundrS  zunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionrf  )r  r   r^   r   r   r   r   PDF_ANNOT_SOUNDr   rZ  r[  r\  r]  r   pdf_to_realr   r)  r   r   r   )	rT   r   r   r   soundr   r   rk  rf  r   r   r   	get_sound*  s:   



zAnnot.get_soundc                 C   s^   t |  t }||_| j}t||}t|}|  }t|t	j
r'||_|S t	||_|S )zMake annotation TextPage.)r  r^   FzStextOptionsrj  r   FzStextPageTextPager  rp   weakref	ProxyTyper   proxy)rT   cliprj  optionsr   	stextpagerG   rO  r   r   r   get_textpageJ  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.rC  TF)r  r   r^   r   r   r   r   )rT   r   r   r   r   r   	has_popupY  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   r   r   r^   pdf_annot_contentsdictkey_contentr   r   r   r)  dictkey_namer   dictkey_titler   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)rT   r   r   rN  r   r   r   infoa  s"   z
Annot.infoc                 C   s4   | j }t|}t|td}|jsdS t|S )z%
        annotation IRT xref
        IRTr   )r   r^   r   r   r   r   r   )rT   r   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   rS   r   r   r   is_open  s   zAnnot.is_openc                 C   s6   | j }t|}|tjkrdS ttdsJ t|S )zannotation languageNfz_string_from_text_language2)r   r^   pdf_annot_languageFZ_LANG_UNSEThasattrr  )rT   
this_annotlangr   r   r   language  s   


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)rT   r   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 ksIJ ||jjt|< |jd tjkrdt }t|| |}|S )zNext annotation.NTr   )r  r   rp   r^   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   r  m_internal_valuer   _annot_refsidr   Widgetr   _fill_widget)rT   r  r  r   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^   r   r   PDF_ENUM_NAME_CApdf_is_numberr  )rT   r   opyr   r   r   r   r	    s   

zAnnot.opacityc                 C   sx   t |  ttjj}| j}t|}t|td}|jr&t	|td}t
|}t||  j }||  j9 }|S )zannotation 'Popup' rectanglerC  r   )r  r^   r  r  r   r   r   r   r   r   r  r   r  r  r  )rT   r   r   r   r   r   r   r   r   
popup_rect  s   
zAnnot.popup_rectc                 C   rm  )zannotation 'Popup' xrefr   rC  ro  )rT   r   r   r   r   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   r  r  )rT   r   rO  r   r   r   r     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   ro   r   N)r^   r   r   r   r   rH  r  rI  )rT   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^   r   r   PDF_ENUM_NAME_Rotater   r   )rT   r   rotationr   r   r   r    s   
zAnnot.rotationc           	      C   s|   t |  |  }|j}|j}|||  9 }| j}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  r  rotation_matrixr  r   r^   r   r   r   r   r   r   JM_rect_from_pyr   )	rT   r   r   rotr'  r   r   r   r   r   r   r   set_apn_bbox  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^   r   r   r   r   r   r   r{  pdf_dict_put_matrix)rT   r  r   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^   r   r  r   )rT   r
  r   r   r   r   r   set_blendmode8     
zAnnot.set_blendmodec                 C   s`  t |  | jdd \}}|tjtjtjtjtjtjtj	fvr)t
d| d dS |tjtjtjtj	fvrC|dkrCt
d| d d}t|turP||||d}|d	d |d
d |dd |dd |d	 du rrd|d	< |d du r|d|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.Nro   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   r<   r   
setdefaultr  rr   rp   r   r   r   r=  JM_annot_set_border)rT   r8  r  r  r  r  r6  atnameitemr   r   r  r   r   r   
set_border?  sV   	


zAnnot.set_borderc                 C   sn  t |  |  j}t|tur||d}|d}|d}tjtjtj	tj
tjtjf}|g dfv r;|| jdd n*|duret|drIt|g}t| t|d	v sUJ d
t| d}|| jd| |ry| jd |vrytd| jd   dS |g dfv r|| jdd dS |durt|drt|g}t| t|d	v sJ d
t| d}|| jd| dS dS )z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        r   stroker   r  r   r  []N	__float__r   r   r  []r   z0Warning: fill color ignored for annot type '%s'.r   r   )r  r  r   r   r   r   r^   r   r   r   r   r   r   xref_set_keyr   r  float
CheckColorlenrs   r<   )rT   r   r  r   r   fill_annotssr   r   r   
set_colorsn  s>   







zAnnot.set_colorsc                 C      t |  | j}t|| dS )zSet annotation flags.N)r  r   r^   pdf_set_annot_flags)rT   rj  r   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subjectr  r  r  )r  r   r   r   r   r^   pdf_annot_has_authorpdf_set_annot_contentspdf_set_annot_authorpdf_dict_put_text_stringr   r   pdf_dict_putspdf_new_text_string)	rT   r  r  r  r  r  r  r   	is_markupr   r   r   set_info  s.   
zAnnot.set_infoc                 C   s   | 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   Subtyper  N)r   r^   r   r   pdf_xref_lenr   r   MSG_BAD_XREFpdf_new_indirectr   r   pdf_annot_type_from_stringr)  MSG_IS_NO_ANNOTr  )rT   r   r   r   r   r  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^   r  fz_text_language_from_stringpdf_set_annot_language)rT   r  r  r  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^   r   pdf_set_annot_line_ending_stylesr   )rT   startendr   r   r   r   set_line_ends  s
   
zAnnot.set_line_endsc                 C   r  )zSet /Name (icon) of annotation.r  Nr  )rT   r   r   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.rn  N)r  r   r^   r   r   r   JM_add_oc_objectr=  )rT   rp  r   r   r   r   r   set_oc  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)rT   r	  r   r   r   r   r   set_opacity  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)rT   r  r   r   r   r   set_open  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)rT   r   r   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_rectr   r<   )rT   r   r   r.  r  r   r  r   r   r   set_rect  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^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rT   r  r   r   r  r   r   r   r   set_rotation  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   r   r^   r   pdf_string_from_annot_typer   r   pdf_is_namer)  )rT   r  crN  itr   r   r   r   5  s   


z
Annot.typeTr
  r	  r   r   r   border_colorr  	cross_outr  c
           >      C   s  t   t|  dd }
| jd }| jdd}| jdd}| jd }|du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j	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u rtd|
|d}|
|d}|  j}| }|r!ddtt| d }|d }nd}| jr-| j\}} nd!\}} |  }!|! }"d}#|tjkr|rqd}#|"dd }"|"\}$}%}&}'}(|"|& |"|% |"|' |"|% |"|( |"d" |dks{|d#krd}#|dkrt | d$ gng })|"D ]!}*|*!d%rq|*!d&r|d#kr|dd }*|)|* q|)}"d'|"}!|tj	krX|!"d(}+|!#d)d* },|!|+|, }!| j$j%| j$j&}-}.|	d+v s|j'|j(  krdksn |.|-}-}.d,t |-|.f  d- }/|/d. |! }!d}0|
|d}1|1rd/}0|
|d}2|2r(|dkr(d"}0t | d0 }nd# }}2|1r4|2r4d1}0|0durI||1 |2 |/ d' |0 d' |! }!|durV|d' |! }!d}d}#|tj)tj*fv rd'|"dd d' }!d}#|d#kr|tj)kr|!| d2 }!n |tj*kr|!d" }!n|tj)kr|!d3 }!n
|tj*kr|!d" }!|dur||! }!|!+d4d5d}!d}#|r|d |! }!d}#d6|! d7 }!||  dkrT|tj)tj*fv rTdtj,tj-tj.tj/tj0tj1tj2tj3tj4f
}3t5dt|3}4d*t6d| jd  }5| j$|5 |5 |5|5f }d}#| j7}6||4v r/t8|6d | }7t8|6d | }8|3| | |7|8d|}9|!|9 7 }!| |4v rTt8|6d8 | }7t8|6d | }8|3|  | |7|8d|}9|!|9 7 }!|#rn|rg| 9| | j:|!dd9 n| j:|!dd9 |tj;tj<tj=tj>tj?tj*tj)tj@tjAtjBf
vrdS | jC}:|:dkrdS | j$jD| j$jE d* };|:dkrtF|tGdd d:k rdS | j$H|;| }<| I|<j$ | JtGdd dS tG|:}=| j$H|;|=}<| 9|<j$ | J||=  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)r  codeccr   r   r   color_stringa  s   
z"Annot.update.<locals>.color_stringr   r  Nr  r   r  r   r5  r6  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.rM  r<  r  rk   z] 0 d
utf-8r   r      Sr@  s    w   ws   RG   
   BT   ETro   r6    s   0 0 s    re   
W
n
   fs    w
   B   b   ss   
S
s
   
S
[] 0 d
   q
s   
Q
r   h㈵>)Kr   update_timing_testr  r   r8  r   r   r(  r^   r   r4  r  r	  r  r   r   r  format
_update_dar  r   r  r  joinmapr   rC  r  r   
splitlinesr   r2   rs   endswithr`   rfindr   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Pointr4  r   r   r   r   r   r   r   r   r   r  tlbrabsr&  morphsetRectr  )>rT   r
  r	  r   r   r   r>  r  r?  r  rF  
annot_typedtbwidthr  r   r   apnmatopa_codetcolfnamefsizeupdate_default_appearanceda_strrm   r   bfillbstrokep_ctmimatr  line_end_leline_end_rir   ap_tab
ap_updated_LLLRURULntabr8   BTETr   hreopefill_stringstroke_stringle_funcsle_funcs_rangedpointsp1p2leftr  r  quadr'  r   r   r   updateC  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|rtt||	|d 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.rQ  rR  rS  bad PDF: no /EF objectr   DLrX  rY  rU  ContentsrV  N)r  r   r^   r   r=  r   r   rZ  r[  r   r   r   r\  r]  r   r   r   r   r   fz_buffer_storagepdf_new_intr  pdf_dict_putlr  )rT   r   r/   	ufilenamere  r   r   r  r   rf  rg  r   r  r  lr   r   r   update_file_  sB   






zAnnot.update_filec                  C   s   d} t dD ]}| |7 } q| S )Nr   i0u  )r  )totalrf   r   r   r   r`    s   
zAnnot.update_timing_testc              	   C   s  t |  | j}t|tjsJ t|}t|}t }t }t	||| t
|}t||}t|td}|jsEt|td}|jsPt|td}|jsYt|d}|jrg }tdt|dD ]+}	tt||	}
tt||	d }t|
|}t||}||j|jf qg|S t|d}|jrg }tt|D ]D}	g }t||	}tdt|dD ]+}tt||}
tt||d }t|
|}t||}||j|jf q|| q|S d	S )
zannotation vertex pointsVerticesL
QuadPointsCLr   ro   r   InkListN)r  r   rp   r^   r   r   r   r#  r  pdf_page_transformJM_derotate_page_matrix	fz_concatr   r   r   r   r  rH  r  rI  FzPointfz_transform_pointr2   xy)rT   r   r   r   page_ctmdummyderotrN  r   rf   r  r  pointres1o1r2  r   r   r   ru    sL   

zAnnot.verticesc                 C   s   t |  | j}tt|S )zannotation xref number)r  r   r^   r   r   r   r   r   r   r     s   z
Annot.xrefr   )r   NNr   r   )NNNr   rN   )Nr   NNr   NNNNNNNNNr   )	NNr   NNNNTr   NNNN)FrW   rX   rY   rU   r   r   r   r   r   r   r  propertyr  r(  r4  r8  rA  r   rP  rh  rj  rl  rq  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r(  r*  r/  r4  r7  r   OptStrOptFloatr  OptSeqboolr   r  r  staticmethodr`  ru  r   r   r   r   r   r   f  s    '

b






1


 

!


	








	

/$


	



	
  
+

5r   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)rq   _subarchivesr^   fz_new_multi_archiver   addrT   argsr   r   r   rU     s
   
zArchive.__init__c                 C   s   dt | j S )NzArchive, sub-archives: )r  r  rS   r   r   r   r        zArchive.__repr__Nc                 C   s   t | j|| d S r   )r^   fz_mount_multi_archiver   )rT   subarchr-   r   r   r   	_add_arch     zArchive._add_archc                 C   s   t |}t | j|| d S r   )r^   fz_open_directoryr  r   )rT   folderr-   subr   r   r   _add_dir  s   
zArchive._add_dirc                 C   s8   t |}tt }t||| t| j|| d S r   )r   r^   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferr  r   )rT   memoryr   r-   buffr  r   r   r   _add_treeitem  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   )rT   filepathr  r-   r  r   r   r   _add_ziptarfile  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   )rT   r  r  r-   r  rf  r  r   r   r   _add_ziptarmemory  s   

zArchive._add_ziptarmemoryc                    s$  dd } fdd}t |tjrt|}t |trqtj|r. || |t||dS tj	|rjt |tr=|dksEJ d|dt
|}| }W d	   n1 sXw   Y   || ||gd	d
S td|||rt |tr|d|dksJ  || ||gd	d
S t |tjrt|dd	}|d	u r|j } |d| n |d| || |dS t |tjrt|jdd	}|d	u r|j}t |tjs|j} | d| n |d| || |dS t |tr || |g |dS t |trtt|dkrt|\}	}
t |
ts%J dt |
||	r3 j|	|
|d n:t |	trctj	|	rbt
|	d}| }W d	   n	1 sUw   Y   j||
|d n
J dt |	d||
g|d
S t!|dr|D ]	} "|| q|d	S t#dt | d)a  
        Add a sub-archive.

        Args:
            content:
                The content to be added. May be one of:
                    `str` - must be path of directory or file.
                    `bytes`, `bytearray`, `io.BytesIO` - raw data.
                    `zipfile.Zipfile`.
                    `tarfile.TarFile`.
                    `pymupdf.Archive`.
                    A two-item tuple `(data, name)`.
                    List or tuple (but not tuple with length 2) of the above.
            path: (str) a "virtual" path name, under which the elements
                of content can be retrieved. Use it to e.g. cope with
                duplicate element names.
        c                 S   s   t | tttjfS r   )rp   r   	bytearrayioBytesIOr  r   r   r   is_binary_data     z#Archive.add.<locals>.is_binary_datac                    s   t || |d}|dks jg kr j| d S  jd }|d dks+|d |d kr3 j| d S |d |d  | jd< d S )N)rm   entriesr-   treer   rm   r-   r  )r   r  r2   extend)r  mountrm   r  ltreerS   r   r   make_subarch  s   
z!Archive.add.<locals>.make_subarchdirr%   z'Need name for binary content, but path=ri   Nr  zNot a file or directory: r/   r   zipr   r   tarmultiro   zUnexpected type(name)=)r-   rbzUnexpected type(data)=r  zUnrecognised type )$rp   pathlibPathr   r   r-   isdirr  listdirisfiler   readr  r   zipfileZipFiler   fpgetvaluer  r  namelisttarfileTarFilefileobjr  r  getnamesr  r  rr   r  r   r  r  rZ  )rT   r  r-   r  r  rM  ffr/   r  datar   r  r   rS   r   r    s|   






zArchive.addc                 C      | j S )z'
        List of sub archives.
        )r  rS   r   r   r   
entry_listf  s   zArchive.entry_listc                 C   s   t | j|S r   )r^   fz_has_archive_entryr   rT   r   r   r   r   	has_entrym  r$   zArchive.has_entryc                 C   s   t | j|}t|S r   )r^   fz_read_archive_entryr   r   )rT   r   r  r   r   r   
read_entryp  s   zArchive.read_entryr   )rW   rX   rY   rU   r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s    





	i
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 r   r   rS   r   r   r   	__enter__w  r   zXml.__enter__c                 G      d S r   r   r  r   r   r   __exit__z  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: )rp   r^   FzXmlr   r   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )rT   rhsr  r   r   r   rU   }  s   

zXml.__init__c                    s$    fdd d}g } | ||}|S )Nc              	      s   | d u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 us|S )N"(=z ''r   ))is_textr2   r5   r  tagnameget_attributesitemsfirst_child)noder#  shiftkrF   child	show_noder   r   r*    s   z%Xml._get_node_tree.<locals>.show_noder   r   )rT   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rT   r(  r   r   r   add_bullet_list     

zXml.add_bullet_listc                 C   R   |  d}|dur||v r| S | d |du r|}n|d| 7 }| d| | S )z5Set some class via CSS. Replaces complete class spec.classNrk   get_attribute_valueremove_attributeset_attribute)rT   r5   clsr   r   r   	add_class     

zXml.add_classNc                 C   H   |  d}t|tu r|| | |  }|du r| }|| | S )zAdd a "code" tagrD  Nr/  r   r   r0  create_text_nodespan_bottomrT   r5   r(  prevr   r   r   add_code     

zXml.add_codec                 C   r,  )z!Add monospaced lines ("pre" node)prer.  r1  r   r   r   add_codeblock  r3  zXml.add_codeblockc                 C   r,  )zAdd description list ("dl" tag)dlr.  r1  r   r   r   add_description_list  r3  zXml.add_description_listc                 C   r,  )zAdd "div" tagdivr.  r1  r   r   r   add_division  r3  zXml.add_divisionr   c                 C   sV   |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h6rO  )r  r   r!  r/  r0  r   )rT   levelthis_tagnew_tagr(  r   r   r   
add_header  s   


zXml.add_headerc                 C   r,  )zAdd horizontal line ("hr" tag)hrr.  r1  r   r   r   add_horizontal_line  r3  zXml.add_horizontal_linec                 C   s   |  d}|dur|d|  |dur|d|  |dur(|dd|  |dur3|d|  |d|  | | |S )	zAdd image node (tag "img").imgNr  rh  r  zfloat: r   src)r/  r9  r0  )rT   r   r  rh  imgfloatr   r(  r   r   r   	add_image  s   

zXml.add_imagec                 C   sV   |  d}t|ts|}|d| || | |  }|du r$| }|| | S )zAdd a hyperlink ("a" tag)r
   hrefN)r/  rp   r   r9  r0  r?  r@  )rT   r\  r5   r(  rB  r   r   r   add_link  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/  r0  r1  r   r   r   add_list_item  s
   


zXml.add_list_itemc                 C   sD   |  d}|dkr|dt| |dur|d| | | |S )zAdd numbered list ("ol" tag)r^  r   r  Nr   )r/  r9  r   r0  )rT   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" tagrO  )r/  r!  r0  r   r1  r   r   r   add_paragraph  s   


zXml.add_paragraphc                 C   r,  Nspanr.  r1  r   r   r   add_span  s   

zXml.add_spanc                 C   r4  )z;Set some style via CSS style. Replaces complete style spec.r  N;r6  )rT   r5   r  r   r   r   	add_style  r<  zXml.add_stylec                 C   r=  )zAdd a subscript ("sub" tag)r  Nr>  rA  r   r   r   add_subscript(  rD  zXml.add_subscriptc                 C   r=  )zAdd a superscript ("sup" tag)supNr>  rA  r   r   r   add_superscript3  rD  zXml.add_superscriptc                 C   sf   |  }t|}|  }|du r| }t|D ]\}}|| | ||d k r0|| d q| S )z"Add text. Line breaks are honored.Nr   rx  )re  r  r@  	enumerater0  r?  r/  )rT   r5   lines
line_countrB  rf   r8   r   r   r   add_text>  s   zXml.add_textc                 C      t | j|j d S r   )r^   fz_dom_append_childr   r1  r   r   r   r0  L  r  zXml.append_childc                 C   s6   |  d}|| |  }|d u r| }|| |S rd  )r/  rh  r@  r0  )rT   r  re  rB  r   r   r   append_styled_spanO  s   


zXml.append_styled_spanc                 C      t t| jS r   )r  r^   fz_dom_bodyr   rS   r   r   r   bodytagX  r  zXml.bodytagc                 C      t | j}t|S r   )r^   fz_dom_cloner   r  rT   rG   r   r   r   clone[     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  rt  )r   r   r   sRGB_to_rgbrr   rq   )colorr   r   r   
color_text_  s   zXml.color_textc                 C      t t| j|S r   )r  r^   fz_dom_create_elementr   )rT   tagr   r   r   r/  i  r  zXml.create_elementc                 C   r~  r   )r  r^   fz_dom_create_text_noder   rT   r5   r   r   r   r?  l  r  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   rA  \nN)r+  r<   rj  )rT   r#  r  r   r   r   debugo  s   "z	Xml.debugc                 C   $   t | j|||}|jrt|S d S r   )r^   fz_dom_findr   r   r  rT   r  attmatchrG   r   r   r   r`   u     zXml.findc                 C   r  r   )r^   fz_dom_find_nextr   r   r  r  r   r   r   	find_nextz  r  zXml.find_nextc                 C   s,   t | jrd S t | }|jrt|S d S r   )r^   fz_xml_textr   fz_dom_first_childr   r  rx  r   r   r   r$    s   
zXml.first_childc                 C   s   |sJ t | j|S r   )r^   fz_dom_attributer   rT   keyr   r   r   r7       zXml.get_attribute_valuec                 C   sN   t | jrd S t }d}	 t | j|\}}|r|s	 |S |||< |d7 }qNr   r   )r^   r  r   r   fz_dom_get_attribute)rT   resultrf   r   r  r   r   r   r"    s   zXml.get_attributesc                 C   rp  r   )r^   fz_dom_insert_afterr   rT   r%  r   r   r   insert_after  r  zXml.insert_afterc                 C   rp  r   )r^   fz_dom_insert_beforer   r  r   r   r   insert_before  r  zXml.insert_beforec                 C   sR   |  }t|}t|D ]\}}| | | ||d k r&| | d q| S )Nr   rx  )re  r  rl  r0  r?  r/  )rT   r5   rm  rn  rf   r8   r   r   r   insert_text  s   zXml.insert_textc                 C   s
   | j duS )zCheck if this is a text node.Nr;   rS   r   r   r   r        
zXml.is_textc                 C   s(   | j }|du r	dS 	 |j}|s|S |}q
)zReturn last child node.N)r$  r  )rT   r(  r  r   r   r   
last_child  s   zXml.last_childc                 C      t | j}|jrt|S d S r   )r^   fz_dom_nextr   r   r  rx  r   r   r   r       zXml.nextc                 C   r  r   )r^   fz_dom_parentr   r   r  rx  r   r   r   r     r  z
Xml.parentc                 C   r  r   )r^   fz_dom_previousr   r   r  rx  r   r   r   previous  r  zXml.previousc                 C      t | j d S r   )r^   fz_dom_remover   rS   r   r   r   remove  r  z
Xml.removec                 C   s   |sJ t | j| d S r   )r^   fz_dom_remove_attributer   r  r   r   r   r8       zXml.remove_attributec                 C   rs  r   )r  r^   fz_xml_rootr   rS   r   r   r   root     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: %sr  centerrightjustifyzUnrecognised align=)rp   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   rh  )rT   r   r5   r   r   r   r   	set_align  s   

zXml.set_alignc                 C   s   |sJ t | j|| d S r   )r^   fz_dom_add_attributer   )rT   r  rv   r   r   r   r9       zXml.set_attributec                 C      d|  | }| | | S )z"Set background color via CSS stylezbackground-color: %s)r}  rh  rT   r|  r5   r   r   r   set_bgcolor     
zXml.set_bgcolorTc                 C   $   |rd}nd}d| }|  | | S )zSet bold on / off via CSS styleboldnormalzfont-weight: %srr  rT   r   r5   r   r   r   set_bold     
zXml.set_boldc                 C   r  )zSet text color via CSS stylez	color: %s)r}  rr  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  )rT   colsr5   r   r   r   set_columns	  r3  zXml.set_columnsc                 C      d| }|  | | S )z"Set font-family name via CSS stylezfont-family: %sr  )rT   fontr5   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   r   rr  )rT   r   r  r5   r   r   r   set_fontsize	  s   
zXml.set_fontsizec                 C   s4   | j }|dd|rtd| d| d| | S )zSet a unique id.Nr  zid 'z' already exists)r  r`   r   r9  )rT   uniquer  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: rh  )rT   leadingr5   r   r   r   set_leading-	  r3  zXml.set_leadingc                 C   r  )z,Set inter-letter spacing value via CSS stylezletter-spacing: r  rT   spacingr5   r   r   r   set_letter_spacing3	  r3  zXml.set_letter_spacingc                 C   r  )z6Set line height name via CSS style - block-level only.zline-height: r  )rT   
lineheightr5   r   r   r   set_lineheight9	  r3  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  )rT   r	  r5   r   r   r   r(  E	  r3  zXml.set_opacityc                 C      d}|  | | S )z$Insert a page break after this node.zpage-break-after: alwaysr  r  r   r   r   set_pagebreak_afterK	     
zXml.set_pagebreak_afterc                 C   r  )z%Insert a page break before this node.zpage-break-before: alwaysr  r  r   r   r   set_pagebreak_beforeQ	  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 )z`Set any or all properties of a node.

        To be used for existing nodes preferably.
        Nr  rg  )r  rJ  r  r  r  r  r  r  r  set_text_indentr  r  r  r  r  r  r  set_word_spacingr  r;  r7  r2   r$  r9  rc  r  )rT   r   bgcolorr  r|  columnsr  r   indentr  r  letter_spacingr  marginspagebreak_afterpagebreak_beforeword_spacingunqidr:  r  tempstyles	top_styler(  r   r   r   set_propertiesW	  sd   

















zXml.set_propertiesc                 C   r  )z;Set text indentation name via CSS style - block-level only.ztext-indent: r  )rT   r  r5   r   r   r   r  	  r3  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  	  r3  zXml.set_word_spacingc                 C   s   | }| j }|du rdS |jr|j}|du rn|js|du s"|jdkr$dS 	 |du r+|S |jdv s3|jr7|j}q$|jdkrB|}|j}n|S q%)z$Find deepest level in stacked spans.Nre  T)r
   r  rj  body)r  r   r  r!  r  r$  )rT   r   r(  r   r   r   r@  	  s,   
zXml.span_bottomc                 C      t | jS r   )r^   
fz_xml_tagr   rS   r   r   r   r!  	     zXml.tagnamec                 C   r  r   )r^   r  r   rS   r   r   r   r5   	  r  zXml.textr   r  r  r   NT)NNNNNNNNNNNNNNNNNN)r  )NrW   rX   rY   r  r  rU   r+  r2  r;  rC  rF  rH  rJ  rU  rW  r[  r]  r`  rb  rc  rf  rh  ri  rk  ro  r0  rr  ru  ry  r  r}  r/  r?  r  r`   r  r  r$  r7  r"  r  r  r  r   r  r  r   r  r  r8  r  r  r9  r  r  r  r  r  r  r  r  r  r  r  r  r(  r  r  r  r  r  r  r@  r!  r5   add_varadd_sampadd_kbdr   r   r   r   r  u  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   s~   t |tjr|| _dS |tkrttjj| _dS |tkr'ttjj| _dS |tkr5ttjj	| _dS ttjj	| _dS )z!Supported are GRAY, RGB and CMYK.N)
rp   r^   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)rT   r  r   r   r   rU   	  s   
zColorspace.__init__c                 C   s   d| j  }d|| jf S )N)r%   GRAYr%   RGBCMYKzColorspace(CS_%s) - %s)r/  r   rT   r  r   r   r   r   	  s   
zColorspace.__repr__c                 C   r  r   )r^   fz_colorspace_namer   rS   r   r   r   _name	     zColorspace._namec                 C   r  )zSize of one pixel.)r^   fz_colorspace_nr   rS   r   r   r   r/  	     zColorspace.nc                 C   r   )zName of the Colorspace.r  rS   r   r   r   r   	     zColorspace.nameN)	rW   rX   rY   rU   r   r  r  r/  r   r   r   r   r   r  	  s    
r  c                   @   rL   )DeviceWrapperc           
      G   s   t |tjr|\}|| _d S t |td r8|\}}t|}t|r,tt || _d S t	t ||| _d S t |tj
rI|\}t|| _d S t |tjd rb|\}}t|}	t||	| _d S td|)Nz%Unrecognised args for DeviceWrapper: )
args_matchr^   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicer#  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicer   )
rT   r  devicepmr  r   rG  tprj  optsr   r   r   rU   	  s"   


zDeviceWrapper.__init__NrV   r   r   r   r   r
  	  rZ   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  r   rS   r   r   r   __del__
  r   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  rp   r^   r  r  r   r  r   r   r   rU   
  s
   zDisplayList.__init__Nr   c                 C   s>   t |tr	|j}nttjj}t| j||||d }d|_|S NT)rp   r  r   r^   r  r  JM_pixmap_from_display_listr   )rT   r  r  r  r  r   r   r   r   r  
  s   
zDisplayList.get_pixmapr   c                 C   s&   t  }||_t | j|}d|_|S )z#Make a TextPage from a DisplayList.T)r^   r  rj  r  r   r   )rT   rj  stext_optionsr   r   r   r   r  (
  s
   zDisplayList.get_textpagec                 C   s   t t| j}t|}|S r   )r  r^   fz_bound_display_listr   r   rT   r   r   r   r   r   0
  s   zDisplayList.rectc                 C   s&   t | j|jt|t|t   d S r   )r^   fz_run_display_listr   r  r{  r  FzCookie)rT   dwr1  arear   r   r   run6
  s   zDisplayList.run)NNr   N)r   )
rW   rX   rY   r  rU   r  r  r  r   r%  r   r   r   r   r  
  s    

	
r  c                   @   s  e Zd ZdefddZdWddZdd Zd	d
 ZdXdefddZ	dYd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dZd#d$Zd%d& Zd'd( Zd)d* Zd[d+d,Zd-d. Zd/efd0d1ZdXd2ed3ed4ed5ed6ed7efd8d9Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#d\dDdEZ$dFdG Z%dHdI Z&dJdK Z'd]dOdPZ(dQdR Z)dSdT Z*dUdV Z+dWdX Z,d^dYdZZ-e.d[d\ Z/d\d]d^Z0d_d`daZ1dbdc Z2ddde Z3dfdfdgdhedieddfdjdkZ4e.dldm Z5dndo Z6dpdq Z7d`drdsZ8dadteduefdvdwZ9dxdy Z:dadtefdzd{Z;d|d} Z<			dZd~edej=de>de>de>ddfddZ?defddZ@d ejeef fddZAd ejeef deBfddZCd ejeef deDfddZEdeFfddZG				d[d ejeef deHde>de>de>ddfddZIdbddZJdd ZK			f	f	f						_				f	_	_	dcddZLdd ZMdaddZNdaddZOdd ZPdd ZQdd ZRdd ZSdddtededeFfddZTdddtededeFfddZUdtedeFfddZVdd ZWdd ZXdd ZY	L	L	L	L	f	f		_deddZZ	L	L	L	L	_	_		_	dfddZ[e.dd Z\e.dd Z]e.dd Z^e.dd Z_e.dd Z`e.ddĄ ZaddƄ ZbddȄ Zcddʄ Zddd̄ Zedd΄ ZfddЄ Zgdd҄ ZhddԄ ZidgddքZjdd؄ Zkddڄ Zle.dd܄ Zme.ddބ Zndd ZodhddZpdd Zqdd Zrdd Zse.deDfddZtdadteduefddZue.dd Zvdgdd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Zejjdk rejjZnejje ZdZdedededefddZd	d
 ZdiddZe.dd Zdd Zd/edefddZdjddZdd Z													_				_		dkddZdd Zdd Zdd Zdgdd Zdld!d"ZdXd#d$Zd%eDdefd&d'Zd(efd)d*Zd+efd,d-Zd.d/ ZdXd0d1Zdgd2d3Zdmd4d5Ze.d6d7 Z													_				_		dnd8d9Ze.d:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdXdDdEZdFdG ZdHdI ZdidJdKZdLdM ZdNdO ZdPdQ ZdRdS ZdTZe.dUdV ZeZeZdS (o  r   returnc                 C   s   t |tu r|| jk rdS dS t |ttfvst|dkrdS |\}}	 t|tr2|dk s2|| jkr4dS 	 t|trE|dk sE|| |krGdS dS )NTFro   r   )	r   r   
page_countrr   rq   r  rp   chapter_countchapter_page_count)rT   locchapterpnor   r   r   __contains__E
  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_pagerq   rr   r  delete_pagesslicer'  r  stopstep)rT   rf   pcr  r4  r5  r   r   r   __delitem__[
  s.   

zDocument.__delitem__c                 C   r  r   r   rS   r   r   r   r  r
  r   zDocument.__enter__c                 G      |    d S r   closer  r   r   r   r  u
  r  zDocument.__exit__r   rf   c                    s   t |tr fddt|t  D S t |ts6t |tr.t|dkr.tdd |D s6J d|d| vrBtd| d	 	|S )
Nc                    s   g | ]} | qS r   r   )re   r2  rS   r   r   rg   z
  rh   z(Document.__getitem__.<locals>.<listcomp>ro   c                 s   s    | ]}t |tV  qd S r   )rp   r   re   r  r   r   r   	<genexpr>{
  s    z'Document.__getitem__.<locals>.<genexpr>zInvalid item number: i=ri   page z not in document)
rp   r3  r  indicesr  r   rr   all
IndexError	load_pagerT   rf   r   rS   r   r  x
  s   
 4

zDocument.__getitem__   c              
   C   sB  t }da zd| _d| _d| _d| _g | _i | _i | _i | _t	 | _
t|tjr6|}	|	| _d| _W |a dS |r>t|tu r?n t|drIt|}nt|drR|j}ntdt|d|d	|durt|tu rm|| _n#t|tu ryt|| _nt|tju r| | _n
td
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rt#d|d	t| jtu rt$| jdkrt#d|}|}t%|}t&|s|j'|j( }|j)|j* }|rCt|tsJ |}t+r*t,|}t-|}nt.t/|t$|}|}|s<|}t0||}n|r|sozt1|}W n t2yn } zt3dkrat4  t!d|d	|d}~ww t5|}|r|j6rz;t7dkrt8|}t8 }t9d}t7dkrt:||j;|j;|j;d}nt<|j6|j;|j;|j;}nt<|j6|}W n! t2y } zt3dkrt4  t!d|d|d	|d}~ww t=|}n%t7dk r|j>rt?|}t@|j>|}nJ tAtBt }t=|}|dkr|dkrtC|||| ntD|r$tC|ddd |}|| _d| _E| jErwtFG | _H| jIr=d| _n| J  |rL|K LdsV|rwd|K v rwz| M }W n t2yv } zt3dkrmt4  t!d|d}~ww tNrt| jtj| _| jrtOjP| _QntOjR| _QW |a dS W |a dS W |a dS |a w )aV  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string or pathlib.Path, must have supported
                    file extension.
            open(type, buffer) - type: valid extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            open(filename, fileype=type) - filename with unrecognized extension.
            rect, width, height, fontsize: layout reflowable document
            on open (e.g. EPUB). Ignored if n/a.
        r   FNTabsoluter   zbad filename: type(filename)=z
 filename=ri   zbad stream: type(stream)=r  r%   zno such file: 'r  z' is no filez!Cannot open empty file: filename=zCannot open empty stream.r   zFailed to open file r   rn   )r   rn      z	 as type i  iX  rC  svgcannot open broken document)SJM_mupdf_show_errorsr   is_encryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsrp   r^   r   r   this_is_pdfr   r   r  r   rZ  r   rf  r  r  r  r  r  r   r-   existsFileNotFoundErrorr  FileDataErrorgetsizeEmptyFileErrorr  r  r1  x1x0y1y0r]   r  r  fz_open_memorypython_buffer_datafz_open_document_with_streamfz_open_documentr   r   r?   ll_fz_recognize_documentr   rt   FzStream	FzArchivell_fz_document_handler_openr   ll_fz_document_open_fn_callr   open_with_streamfz_open_file$fz_document_open_with_stream_fn_callr   MSG_BAD_FILETYPEfz_layout_documentfz_is_document_reflowabler   r   gen_id	_graft_id
needs_passinit_docrz  rf  convert_to_pdfr   r   page_count_pdfpage_count2page_count_fz)rT   r/   rf  filetyper   r  rh  r   JM_mupdf_show_errors_oldpdf_document	from_filemsgr   r  r   r<  r   r
  magicr   r  handleraccelarchiver  r   r  r   r   r   rU   
  s.  
 & 












*


zDocument.__init__c                 C   r  r   )r'  rS   r   r   r   __len__J     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   rf  r   rl  rT   r1  r   r   r   r   M  s   

zDocument.__repr__c                 C   s   | j s| jr
tdt| dd}|jsdS tt|tdtdtdtd}|jr1t	|s5t
d	t|}t||}t||| dS )
zAdd new form font.document closed or encryptedr   r   NRootAcroFormDRFontzPDF has no form fonts yet)r   rJ  r   r   r   r^   r   pdf_trailerr   r*  r   pdf_new_nameJM_pdf_obj_from_strr  )rT   r   r  r  fontsr'  rF   r   r   r   _addFormFontU  s"   

zDocument._addFormFontc                 C   s   | j s| jr
tdg }t| dd}|j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||
 qW|| |}|   |S )zDelete the TOC.r  r   r  r  OutlinesFirst)r   rJ  r   r   r   r^   r   r  r   JM_outline_xrefsr  r   pdf_delete_objectr   r  JM_INT_ITEMr2   rn  )rT   xrefsr  r  olrootfirst
xref_countolroot_xrefrf   r  r   r   r   r   r   _delToCi  s.   


zDocument._delToCc                 C   s0   t | }t|| |jjrt|j d S d S r   )r   r^   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)rT   r,  r  r   r   r   _delete_page  s
   zDocument._delete_pagec                 C   s6   t | }t|dt|d sttt|| dS )zDelete object.r   N)r   r%  r^   r  r   r  r  rT   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 )Nr  NamesEmbeddedFilesro   r   rR  rS  )r   r^   r   r  r   rI  r   r   )rT   idxr  namesentryfilespecrk  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_namesr   indexr  r  r   )rT   r  	filenamesrw  r  r   r   r   _embeddedFileIndex  s   
zDocument._embeddedFileIndexc                 C   s   t | }t|}|jstttt|tdtdtdtd}t	|sHt
t|td}	t|d}t|	|tdtdtd t|||||d}
tt|
tdtd}t|t| t||
 |S )Nr  r  r  r	   r   rR  rS  )r   r   r   rZ  r   r^   r   r  r   pdf_is_arrayr   r  r  JM_embed_filer   pdf_array_pushr  )rT   r   r   r/   r  re  r  r
  r  r  	fileentryr   r   r   r   _embfile_add  s8   
zDocument._embfile_addc                 C   sP   t | }tt|tdtdtdtd}t||d  t|| d S )Nr  r  r  r   )r   r^   r   r  r   rJ  )rT   r  r  r  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   r  r  r  ro   r   CI
collectionrS  rU  rV  r   rR  rW  r  rX  rY  )r   r^   r  r   r   rI  r   r   r   r   r^  r_  dictkey_ufilenamer   r`  r   rb  ra  )rT   r  infodictr  r   ci_xreftrailerr  rN  cir   len_r  r  r   r   r   _embfile_info  sL   




zDocument._embfile_infoc                 C   s~   t | }tt|tdtdtdtd}t|r;t|}td|dD ]}tt	t
||}|| q(dS dS )z Get list of embedded file names.r  r  r  r   ro   N)r   r^   r   r  r   r  rH  r  r^  r   rI  r2   )rT   r  r  r  r/  rf   r   r   r   r   _embfile_names
  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   r  r  r  ro   r   rR  rS  r  r  rX  rY  rU  rV  )r   r^   r   r  r   rI  r   r\  r]  r   rZ  r   r   r  r  r  r  r   r  )rT   r  r   r/   r  re  r  r   r  r  r  r   r  r  r  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.r~   zoomr  r  collapser  Nr  r  z$internal error finding outline xrefsr   zneed non-simple TOC formatrS  r   Tro   Countr   Fr  DestADr   r  )r   r   r   r   Document_extend_toc_itemsr   r   r^   r   r  r   r   r  r  r@  r  r   rp   r   r   pdf_load_objectr   r  rH  r  rI  dictkey_colorr   r  )rT   r#  r  r  r  r  r  r  r  r  r  r/  r1  rf   r   r  itemdictbmrj  countr  r|  zr   r   r   r   _extend_toc_itemsB  s   





zDocument._extend_toc_itemsr   c                 C   s"   t |}|| jv r| j|= dS dS )z&Remove a page from document page dict.N)r  rQ  )rT   r   pidr   r   r   _forget_page  s   
zDocument._forget_pager   bfnameextorderinglimitr  c                 C   s   t | }|}|dk rd}|dkr"t|\}	}
}td |	|
|d}n)t|\}	}
|	r5t||	|
dd}nt||}|jsCtd| td ||d}g }t	|D ](}t
||}t||d}|dkrf|}|dkrr|||f qQ||df qQ|S )N   r   z font at xref %d is not supportedr#  )r   r^   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   r   fz_new_font_from_bufferr  fz_encode_characterfz_advance_glyphr2   )rT   r   r  r  r  r  r  r  mylimitr
  rd  r  r  rk  wlistrf   glyphadvr   r   r   _get_char_widths  s0   
zDocument._get_char_widthsc           	   	   C   s   t | }g }td}tt|td|}|js|S tt|td}|jr1t	|| |S tt|tdtd}|jrIt	|| |S tt|td}|jr\t
|s^|S t|}t|D ]}ttt||td}t	|| qg|S )N
PageLabelsr  NumsKids)r   r^   r  r   r  r   r   pdf_resolve_indirectr   JM_get_page_labelsr  rH  r  rI  )	rT   r  r_   
pagelabelsr   numskidsr/  rf   r   r   r   _get_page_labels  s2   



zDocument._get_page_labelsc                 C   s4   zt | j|W S  ty   tdkrt  Y dS w )zGet metadata.ro   r%   )r^   fz_lookup_metadata2r   r   r   r?   r  r   r   r   _getMetadata  s   zDocument._getMetadatac                 C   s   | j s| jr
tdt| }tt|td}t|td}|jsLt	|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.r  r  r  r  Type)r   rJ  r   r   r^   r   r  r   r   r  r  pdf_add_objectr   )rT   r  r  r  ind_objr   r   r   _getOLRootNumber  s   
zDocument._getOLRootNumberc           	      C   s|   t | dd}|jsdS g }tt|td}|jr<t|}t|D ]}t||}t	|}t
|}|| q$|S )zGet PDF file id.r   r  NID)r   r   r^   r   r  r   rH  r  rI  r   binasciihexlifyr2   )	rT   r  idlistidentityr/  rf   rN  r5   hex_r   r   r   _getPDFfileid  s   


zDocument._getPDFfileidc                 C   s   | j s| jr
td| j}t|tjrt|nt|}|}|dk r+||7 }|dk s#||kr3tt	t
| }t||}t|tj}g }	g }
|jrTt|||	|d|
 |	S )z,List fonts, images, XObjects used on a page.r  r   )r   rJ  r   r   rp   r^   r   pdf_count_pagesfz_count_pagesMSG_BAD_PAGENOr   pdf_lookup_page_objpdf_dict_get_inheritablePDF_ENUM_NAME_Resourcesr   JM_scan_resources)rT   r,  whatr   	pageCountr/  r  pagerefrsrclistetracerr   r   r   _getPageInfo  s$    zDocument._getPageInfoc                 C   s6   t | }|s|sttt|d||dddddd
}|S )z;
        Utility: insert font from file or binary.
        Nr   r   )r   r   MSG_FILE_OR_BUFFERJM_insert_font)rT   fontfile
fontbufferr  rv   r   r   r   _insert_font  s
   zDocument._insert_fontc                 C   sN   | j }t|tjsJ z
t|}W t|S  ty&   tdkr#t  Y dS w )zLoad first outline.r   N)	r   rp   r^   r   fz_load_outliner   r   r?   Outline)rT   r   r^  r   r   r   _loadOutline  s   zDocument._loadOutlinec                 C   s   | j rtdJ d)z)Make an array page number -> page object.r~   r   z_make_page_map() is no-op)r   r   rS   r   r   r   _make_page_map  s   zDocument._make_page_mapc                 C   s  t | }d}t||\}}}	t|td}
t||\}}}t|td}|r+|}n|d }t|
|}|sD|dkrDt|td| t||| |dkr|}|jrrt	|td}t
|td|d  t|td}|jsT|st|
|	 |}|jrt	|td}t
|td|d  t|td}|jsn9|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.r   r  r   rE  r  N)r   pdf_lookup_page_locr^   r   r   r.  r  pdf_array_insertr   pdf_dict_get_intr   rJ  r  r  _reset_page_refs)rT   r,  nbbeforecopyr  samepage1parent1i1kids1page2parent2i2kids2posr   r  r   r   r   _move_copy_page#  sV   zDocument._move_copy_pager   S  J  c           	      C   s   | j s| jr
tdtrt| j||| n3t| }t	tj	j
}||_||_t }|dk r3ttt|d}t||d||}t||| |   | | S )zMake a new PDF page.r  r   r   r   )r   rJ  r   r   r   _newPager   r   r^   r  
Fixed_UNITrX  rZ  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager	  )	rT   r,  r  rh  r  mediaboxcontentsr  page_objr   r   r   r  [  s    zDocument._newPagec                 C   s   t | }t|| d S r   )r   _remove_dest_range)rT   numbersr  r   r   r   _remove_links_tos  r  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   皙?r  )	r   r^   r  r   r   r  r  r  r  )rT   r   r  r  r|  rf   r   r   r   _remove_toc_itemw  s   zDocument._remove_toc_itemc                 C   sL   t | ddrdS dd | j D }|D ]
}|r|  d}q| j  dS )z,Invalidate all pages in document dictionary.r   TNc                 S   s   g | ]}|qS r   r   re   rO  r   r   r   rg         z-Document._reset_page_refs.<locals>.<listcomp>)r   rQ  r   r   clear)rT   pagesr   r   r   r   r	    s   zDocument._reset_page_refsc                 C   s   t | }td}tt|td}t|| t|t|d|td | 	 }| j
|dd}|dd| }| || d S )	Nr  r  r   r  T
compressedz/Nums[]z	/Nums[%s])r   r^   r  r   r  r   r   r  r  pdf_catalogxref_objectrj  update_object)rT   labelsr  r  r  r   r5   r   r   r   _set_page_labels  s   
zDocument._set_page_labelsc                 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
u s|dkr|du 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  rS  r   r  Nr  FTr   )r   r^   r  r  r   r   r  r  r   r  r  r  r   r   r  )rT   r   actionr  rj  r  r|  r  r  r   r<  rf   rM  r   r   r   _update_toc_item  s4   
 zDocument._update_toc_itemc                 C   s   t | dd}|jsdS tt|tdtdtdtd}t }|jrFt|rFt|}t	|D ]}t
||}|tt| q3|S )z&Get list of field font resource names.r   r  Nr  r  r  r  )r   r   r^   r   r  r   rq   r*  r+  r  r-  r2   r   r)  )rT   r  r  r  r/  rf   rM  r   r   r   	FormFonts  s"   
zDocument.FormFontsc                 C   s&   t | }t|||| t|j dS )zAdd a new OC layer.N)r   JM_add_layer_configr^   ll_pdf_read_ocgr   )rT   r   creatoronr  r   r   r   	add_layer  s   zDocument.add_layerr   c                 C   s:  d}t | }t|d}t|tdtd t|td| t|tdd}	|s4t|	td nt|t	sEJ d	t
|d
t
t|	t| t|tdd}
td}t|
|d}t|tdd |rxt|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|| |rt|td}|jst|tdd}nt|td}|js
t|tdd}t|| t|j t|}|S )zAdd new optional content group.r   r   r  OCGr  Intentro   Viewz)fixme: intent is not a str. type(intent)= type=UsageCreatorInfoCreatorPyMuPDFr  ArtworkOCGsr   Configsr  Orderr   ONOFF)r   r^   r  r  r   r  pdf_dict_put_arrayr  rp   r   r   r  r  r  r  JM_ensure_ocpropertiesr   r  r   MSG_BAD_OC_CONFIGrI  r   r8  r   )rT   r   configr:  intentusager   r  ocgintentsuse_forci_namecre_infoindocgocpr   cfgr   r   r   add_ocg  s^   



zDocument.add_ocgc                 C   s>   | j rtdt| j|}|rd| _d| _|   d| _|S )zDecrypt document.r~   FT)r   r   r^   fz_authenticate_passwordr   rJ  rn  r   )rT   passwordr   r   r   r   authenticate  s   zDocument.authenticatec                 C   s    t | dd}|jsdS t|S )z-Check whether incremental saves are possible.r   r  F)r   r   r^   pdf_can_be_saved_incrementallyrT   r  r   r   r   can_save_incrementally"  s   
zDocument.can_save_incrementallyT)rL  widgetsrL  r_  c                C   s"   t | }t|t|t| dS )a  Convert annotations or fields to permanent content.

        Notes:
            Converts annotations or widgets to permanent page content, like
            text and vector graphics, as appropriate.
            After execution, pages will still look the same, but no longer
            have annotations, respectively no fields.
            If widgets are selected the PDF will no longer be a Form PDF.

        Args:
            annots: convert annotations
            widgets: convert form fields

        N)r   r^   pdf_bake_documentr   )rT   rL  r_  r  r   r   r   bake)  s   zDocument.bakec                 C   s   | j rtdt| jS )zNumber of chapters.r~   )r   r   r^   fz_count_chaptersr   rS   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.r~   r   zbad chapter number)r   r   r^   rb  r   fz_count_chapter_pages)rT   r+  chaptersr+  r   r   r   r)  B  s   zDocument.chapter_page_countc                 C   sH   t | ddr
tdt| dr| jrd| _|   d| _i | _d| _dS )zClose document.r   Tr~   _outlineN)r   r   r  re  r	  r   rM  r   rS   r   r   r   r:  L  s   
zDocument.closec                 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
t|   qL|	S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r  r   r   )r   rJ  r   r   r^   r  r  JM_mupdf_warnings_storeJM_convert_to_pdfr  r<   )rT   	from_pageto_pager  fz_docr  r  srcCountlen0r   len1rf   r   r   r   ro  ^  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.
        r~   r   r/  r   r   r   r   r  r  r  rT   r,  rn  r'  r  r  r   r   r   	copy_pageu  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.r  r  MetadataN)
r   rJ  r   r   r^   r   r  r   r   r   )rT   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.  r~   r   r/  ro   r   N)r0  r   r   r'  get_tocget_outline_xrefsrl  r'  r%  	frozensetr  r	  )rT   r,  r'  tocol_xrefsrf   r  r   r   r   r1    s&   
zDocument.delete_pagec                 O   sD  | j std| jrtd| j}d }}|r]|rtd|dd}|dd}|dk r5||7 }|dk s-|dk rA||7 }|dk s9||  krN|k sStd tdtt||d	 }nct|d
ksg|g krktdt|d
kr|\}}t|t	u rt|t	u std||kr||}}||  kr|k std tdtt||d	 }n|d }t|t	tt
tfvrtdt|}t
tt	t|}|g krtd dS |  |d dk s|d |krtdt|}|  }	t|  D ]\}
}|	|
 d
 d	 |v r	| | q| | t|D ]}
| |
 q|   dS )a	  Delete pages from a PDF.

        Args:
            Either keywords 'from_page'/'to_page', or two integers to
            specify the first/last page to delete.
            Or a list/tuple/range object, which can contain arbitrary
            page numbers.
        r.  r~   r   z*cannot mix keyword and positional argumentrh  ri  r   r/  r   ro   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r0  r   r   r'  r   rr   r  r  r   r   rq   rd  setr<   sortrv  rt  rl  ru  r'  r%  reversedr  r	  )rT   r  kwr'  rM  r   r$  r   frozen_numbersrw  rf   r   r   r   r   r2    sp   	


zDocument.delete_pagesr   r   r/   r  re  c           
      C   s   |   }dt| }||v rt||du r|}|du r|}|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r   r/   r  re  r  z/EmbeddedFileParams/CreationDateParams/ModDate)r  r   r   r  get_pdf_nowr  get_pdf_str)
rT   r   r   r/   r  re  r  rw  r   dater   r   r   embfile_add  s,   zDocument.embfile_addc                 C   s   t |  S )zGet number of EmbeddedFiles.)r  r  rS   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
        )r  r  rT   r  r  r   r   r   embfile_del  s   

zDocument.embfile_delc                 C   r  )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )r  r  r  r   r   r   embfile_get.  s   

zDocument.embfile_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   r  r8  r  r  r  zParams/CheckSumchecksum)r  r  r  xref_get_keyr  r  rC  decode)rT   r  r  r  r   r   r  md5r   r   r   embfile_info9  s   
zDocument.embfile_infoc                 C   s   g }|  | |S )z#Get list of names of EmbeddedFiles.)r  )rT   r  r   r   r   r  O  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.
        r~  r  )r  r  r  r  r  )	rT   r  r   r/   r  re  r  r   r  r   r   r   embfile_updU  s   
zDocument.embfile_updc              	   C   s8  t | }t||}t|td}t|td}t|tdrt|dst|td}|jr:t	|rCt|td}	n|}	t
||}
|
dkrZ|sZt||}t|}nd}|srtt|	t|
tt||f}|S ttt|	tt|
ttt|t|i}|S |sd	}|S td
td
td
tdi}|S )zD
        Get a font by xref. Returns a tuple or dictionary.
        r  r  r  CIDFontTypeBaseFontr  n/ar@  )r%   r%   r%   r@  r%   )r   r^   r  r   r   pdf_name_eqr)  r   r   pdf_is_nullJM_get_fontextensionr  r   r^  r   r  dictkey_extdictkey_typer  )rT   r   	info_onlynamedr  r   r  subtypebasefontbnamer  r   bytes_r_   r   r   r   extract_fontt  sL   


zDocument.extract_fontc                 C   sB  | j s| jr
tdt| }d}d}t|dt|d s!ttt||d}t	|t
d}t|t
ds<tdt|t
dt
d}|jrOt|}t|r^tj}t|}d	}	t|rlt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.|/ }t0 }|	|t1< ||t2< ||t3< ||t4< ||t5< ||t6< ||t7< ||t8< ||t9< t:||t;< |S )z(Get image by xref. Returns a dictionary.r  r   r   r  Imageznot an imageSMaskMaskjpxjb2Npng)<r   rJ  r   r   r%  r^   r  r  r  r   r   r  pdf_dict_getar   r   pdf_is_jpx_imageFZ_IMAGE_JPXr   JM_is_jbig2_imageFZ_IMAGE_JBIG2pdf_load_raw_streamFZ_IMAGE_UNKNOWNr  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  r  r   r  dictkey_smaskdictkey_widthdictkey_heightdictkey_colorspacedictkey_bpcdictkey_xresdictkey_yresdictkey_cs_namer   dictkey_image)rT   r   r  img_typesmaskr   r  rN  r   r  r  r<  rX  ll_cbufxresyresr  rh  r  r  cs_namer_   r   r   r   extract_image  s   










zDocument.extract_imager   F  c                 C   sz   | j |fi d|d|d|d|d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|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preserve_metadatause_objstmscompression_effort)save)rT   r/   r  r  r  r  r  r  r;  r  r  r  r  r  r  r  r  r  r  r  r   r   r   ez_save  sN   	
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.r  )r   rJ  r   r^   fz_lookup_bookmark2r   r+  r   )rT   r  locationr   r   r   find_bookmark%  s   zDocument.find_bookmarkc              	   C   s  t | }t|}zt|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r_qFt|djrgqFtt|}t|}t||| t||d}t|t
d t|t
d t|	| qFt|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.r   r   r   rD  r  rC  r  P    r  N) r   r^   r  r%  r   r  r  r  pdf_deep_copy_objr   r   r   rH  r  r  rI  r  r   pdf_create_objectpdf_update_objectr  r   r  r  JM_read_contentspdf_add_streamr  PdfObjr   r  r  r	  )rT   r,  rn  r  r'  r  r  
old_annotsr/  
new_annotsrf   rN  r  copy_or   r   r!  r   r   r   fullcopy_page,  sN   




zDocument.fullcopy_pagec                 C   sz   t | }tt|tdtd}|jsdS |dkr$t|td}ntt|td|}|js7tt	t
|}|S )z,Content of ON, OFF, RBGroups of an OC layer.r  OCPropertiesNr   r  rF  )r   r^   r   r  r   r   r   rI  r   rL  JM_get_ocg_arrays)rT   rM  r  rV  r   r_   r   r   r   	get_layerd  s$   zDocument.get_layerc                 C   s   t | }t|}|dkr%tt|tdtdtd}t|s%d}g }t }t|D ]}t	||| ||j
|jd}|| q/|S )zShow optional OC layers.r   r  r  rF  r   )numberr   r9  )r   r^   pdf_count_layer_configsr   r  r   r  PdfLayerConfigr  pdf_layer_config_infor   r9  r2   )rT   r  r/  r   r_   r  rf   r  r   r   r   
get_layersz  s*   

zDocument.get_layersc                 C   s6   | j s| jr
tdt| }d}t| t|}|S )zMake new xref.r  r   )r   rJ  r   r   ENSURE_OPERATIONr^   r  )rT   r  r   r   r   r   get_new_xref  s   
zDocument.get_new_xrefc                 C   sr  t d}t| }t t t |tdtdtd}t }t |s'|S t 	|}t
|D ]}t ||}t |}t t |td}	t |td|td}
d}|
jr^t |
}t }t |td	}|jrt |rz|t | n$t |rt 	|}t
|D ]}t ||}t |r|t | qt |t  ||}|	|| |d
}|}|||< q0|S )z&Show existing optional content groups.rA  r  r  rE  r  r@  r  Nr=  )r   rN  r:  rO  )r^   r  r   r   r   r  r   r   r  rH  r  rI  r   r   r   r)  rq   r;  r2   pdf_is_ocg_hiddenr  )rT   r  r  ocgsr_   r/  rf   rP  r   r   r   rO  rQ  rN  r1  r2  rN  hiddenr  r  r   r   r   get_ocgs  sP   









zDocument.get_ocgsc                 C   s|   g }t | dd}|js|S tt|td}|js|S t|td}|js*|S t|td}|js7|S t||}|S )z!Get list of outline xref numbers.r   r  r  r  r  )r   r   r^   r   r  r   r  )rT   r  r  r  r  r  r   r   r   ru    s   
zDocument.get_outline_xrefsfullc                 C   sx   | j s| jr
td| jsdS t|tur)z|j}W n ty(   t  tdw | 	|d}|du r:dd |D S |S )z1Retrieve a list of fonts used on a page.
        r  r   zneed a Page or page numberr   Fc                 S      g | ]}|d d qS Nr   r   re   rF   r   r   r   rg         z+Document.get_page_fonts.<locals>.<listcomp>)
r   rJ  r   r0  r   r   r  r   r?   r  rT   r,  r  r   r   r   r   get_page_fonts  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.
        r  r   ro   Fc                 S   r   r  r   r  r   r   r   rg     r  z,Document.get_page_images.<locals>.<listcomp>r   rJ  r   r0  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.
        r  r   r   r  )rT   r,  r   r   r   r   get_page_xobjects  s   zDocument.get_page_xobjectsc                 C   sP   t | dd}|jsdS tt|tdtdtd}d}|jr&t|}|S )zGet the /SigFlags value.r   r  r   r  r  SigFlags)r   r   r^   r   r  r   r   )rT   r  sigflagssigflagr   r   r   get_sigflags  s   
zDocument.get_sigflagsc                 C   s^   d}t | dd}|jrtt|tdtd}|dur+|jr+t|}t|}|S d}|S )zGet document XML metadata.Nr   r  r  rr  r%   )r   r   r^   r   r  r   r   JM_UnicodeFromBuffer)rT   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  )re   r'  rF   rS   r   r   rg   (  s    z%Document.init_doc.<locals>.<listcomp>ra  z
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
ra  r  authorr  keywordsr9  producerr  r  trappedr  None)rJ  r   r  re  r   r#  rK  r  rS   r   rS   r   rn  #  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
        parameters - where applicable - equal those of insert_pdf().
        Nr   r  zbad infile parameterr  )rh  ri  start_atr  linksrL  show_progressfinal)rp   r  r  r/  rx  r   tobytesr   r0  ro  
insert_pdf)rT   infilerh  ri  r  r  r  rL  r  r  rY  pdfbytesr   r   r   insert_file9  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.r  z'source and target cannot be same objectr   z
memory PDFzInserting '%s' at '%s'Nr   zsource or target not a PDF)rh  ri  r  )r   rJ  r   rl  r'  r  r   r-   basenamer   r<   rM  r   Graftmapr   extra_FzDocument_insert_pdfr   r   r^   r  rt  minr   rZ  r  JM_merge_ranger	  	_do_links)rT   docsrcrh  ri  r  r  r  rL  r  r  _gmapsainnameoutnameisrtpdfoutpdfsrcoutCountrk  r  r  r   r   r   r  d  sv   !



zDocument.insert_pdfc                 C   ,   t | dd}|jsdS t|}|rdS dS )Nr   r  FT)r   r   r^   pdf_has_unsaved_changesrT   r  r   r   r   r   is_dirty  s
   
zDocument.is_dirtyc                 C   s    t | dd}|jrt|S dS )z9
        Check whether we have a linearized PDF.
        r   r  F)r   r   r^   pdf_doc_was_linearizedr]  r   r   r   is_fast_webaccess     
zDocument.is_fast_webaccessc                 C   s~   t | dd}|jsdS d}ztt|tjtjtj}t|r&t	|}W n t
y6   tr3t  Y dS w |dkr=|S dS )z Either False or PDF field count.r   r  Fr   )r   r   r^   r   r  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr  rH  r   r   r?   )rT   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)rp   r   r^   r   ll_pdf_specificsr   rx  r   r   r   r0    s   zDocument.is_pdfc                 C   s   | j rtdtt| S )z Check if document is layoutable.r~   )r   r   r  r^   rj  rS   r   r   r   is_reflowable  s   zDocument.is_reflowablec                 C   r-  )zCheck whether PDF was repaired.r   r  FT)r   r   r^   pdf_was_repairedr/  r   r   r   is_repaired  s   
zDocument.is_repairedc                 C   sJ   | j s| jr
tdd}d}t| }t|}t|}t|t|dS )z(Show if undo and / or redo are possible.r  r   )undoredo)r   rJ  r   r   r^   pdf_can_undopdf_can_redor  )rT   r=  r>  r  r   r   r   journal_can_do  s   

zDocument.journal_can_doc                 C   *   | j s| jr
tdt| }t| dS )zActivate document journalling.r  N)r   rJ  r   r   r^   pdf_enable_journalr]  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.r  )r   rJ  r   r   r   journal)rT   r  enabledr   r   r   journal_is_enabled/  s
   zDocument.journal_is_enabledc                 C   sl   | j s| jr
tdt| }t|trt|| nt|}t	|}t
|| |jjs4tdt dS dS )zLoad a journal from a file.r  z!Journal and document do not matchN)r   rJ  r   r   rp   r   r^   pdf_load_journalr   r  pdf_deserialise_journalr   rF  r\  r]  )rT   r/   r  r   stmr   r   r   journal_load7  s   

zDocument.journal_loadc                 C   s,   | j s| jr
tdt| }t||}|S )z#Show operation name for given step.r  )r   rJ  r   r   r^   pdf_undoredo_step)rT   r5  r  r   r   r   r   journal_op_nameE  s
   zDocument.journal_op_namec                 C   s6   | j s| jr
tdd}t| }t|\}}||fS )zShow journalling state.r  r   )r   rJ  r   r   r^   pdf_undoredo_state)rT   stepsr  r_   r   r   r   journal_positionM  s   zDocument.journal_positionc                 C   rB  )zMove forward in the journal.r  T)r   rJ  r   r   r^   pdf_redor]  r   r   r   journal_redoV  
   
zDocument.journal_redoc                 C   sV   | j s| jr
tdt| }t|trt|| dS t|}t	|| |
  dS )zSave journal to a file.r  N)r   rJ  r   r   rp   r   r^   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)rT   r/   r  outr   r   r   journal_save^  s   
zDocument.journal_savec                 C   sN   | j s| jr
tdt| }|jjstd|r t|| dS t	| dS )zBegin a journalling operation.r  zJournalling not enabledN)
r   rJ  r   r   r   rF  r   r^   pdf_begin_operationpdf_begin_implicit_operation)rT   r   r  r   r   r   journal_start_opj  s   zDocument.journal_start_opc                 C   rB  )zEnd a journalling operation.r  N)r   rJ  r   r   r^   pdf_end_operationr]  r   r   r   journal_stop_opv  rE  zDocument.journal_stop_opc                 C   rB  )zMove backwards in the journal.r  T)r   rJ  r   r   r^   pdf_undor]  r   r   r   journal_undo}  rT  zDocument.journal_undoc                 C   sH   t | dd}|jsdS t|}|tjkrdS tdk rJ dt|S )zDocument language.r   r  N)r      rK  znot implemented yet)r   r   r^   pdf_document_languager  rt   r  )rT   r  r  r   r   r   r    s   


zDocument.languagec                 C   s&   | j rtdt| j}|j|jfS )z Id (chapter, page) of last page.r~   )r   r   r^   fz_last_pager   r+  r   )rT   last_locr   r   r   last_location  s   zDocument.last_locationc                 C   s   t | }t }t|}g }t|D ]-}t||| |jdkr$d}n
|jdkr,d}nd}||j|j||j	|j
d}|| q|S )z-Show OC visibility status modifiable by user.r   checkboxro   radioboxlabel)r  r5   depthr   r:  locked)r   r^   PdfLayerConfigUipdf_count_layer_config_uir  pdf_layer_config_ui_infor   r5   rj  selectedrk  r2   )rT   r  r  r/  r_   rf   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.r  Nr#  zbad page size)r   rJ  r   r   r^   rj  r  r1  rX  rY  rZ  r[  ri  r	  rn  )	rT   r   r  rh  r   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.
        r  Nr   zpage not in documentT)r   rJ  r   r   r   r'  rp   r^   fz_load_pager   fz_load_chapter_pager   r   r   rQ  r  r  rP  r  r  )rT   page_idnpr   r+  pagenumr   r   r   r   rA    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).r~   r   r   )
r   r   r   r^   fz_make_locationr  r  fz_location_from_page_numberr+  r   )rT   r,  this_docr*  r'  r   r   r   location_from_page_number  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.r  )	r   rJ  r   r^   
FzLocationll_fz_make_bookmark2r   r   internal)rT   r*  markr   r   r   make_bookmark  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u 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 ty   tdkrt  | Y   S w |dkrd||< qh|S )zReturn the PDF MarkInfo value.r   NMarkInfor8  r   r   Tr,  r   ro   <<r]  >>FMarkedUserPropertiesSuspects/true)r.  r  r   splitr/  r   r   r?   )rT   r   r_   r   validrF   r  rv   r   r   r   markinfo  s6   
(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.
        r~   r   r/  r   r   ro  rp  r   r   r   	move_page  s   zDocument.move_pagec                 C   r  r   r  rS   r   r   r   r   -  s   zDocument.namec                 C   s   | j sdS t| }d}d}tt|d}t||}t|r&t|}|r1t||tj	 nt||tj
 |du rA|dkS |S )z"Get/set the NeedAppearances value.Nr   NeedAppearanceszRoot/AcroFormr   )r8  r   r^   pdf_dict_getpr  r   pdf_is_boolpdf_to_boolr  PDF_TRUE	PDF_FALSE)rT   rv   r  oldvalappkeyformappr   r   r   need_appearances1  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.r~   )r   r   rp   r   r^   r   r   fz_needs_password)rT   r   rG   r   r   r   rm  I  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 }t|ts7t	t
t |}|d }|}t||}t||}|j|jfS )z!Get (chapter, page) of next page.r  r   page id not in documentr   r   )r   rJ  r   r   r   rr   rf  r   rp   r\  MSG_BAD_PAGEIDPyExc_ValueErrorr^   rw  fz_next_pager+  r   )rT   rt  ry  r   r+  r,  r*  next_locr   r   r   next_locationR  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 rN   )r   r   page_annot_xrefsr   rp   r^   r   r  r  r   r   r  r  JM_get_annot_xref_list)rT   r/  r'  ru  r"  rL  r   r   r   r  g  s   zDocument.page_annot_xrefsc                 C   sB   | j rtdtr| | S t| jtjrt| jS t	| jS )zNumber of pages.r~   )
r   r   r   rq  rp   r   r^   r   r  r  rS   r   r   r   r'  y  s   
zDocument.page_countc           	      C   sz   | j rtd| j}t|}|}|dk r||7 }|dk st| }||kr)ttt||}t|}t	|}t
|}|S )z2Get CropBox of page number (without loading page).r~   r   )r   r   r   r^   r  r   r  r  
JM_cropboxr  r   )	rT   r,  ry  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   r  )r   r   r'  r   r^   rw  fz_page_number_from_locationr   )rT   rt  ru  r+  r,  r*  page_nr   r   r   page_number_from_location  s   z"Document.page_number_from_locationc                 C   sz   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||}|S )zGet xref of page number.r~   r   )r   r   	page_xrefr   r   r   r^   r  r   r  r   r  )rT   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
PageLayoutr8  
SinglePager   r   r.  r  rT   r   r_   r   r   r   
pagelayout     zDocument.pagelayoutc                 C   r  )z'Return the PDF PageMode value.
        r   NPageModer8  UseNoner   r   r  r  r   r   r   pagemode  r  zDocument.pagemode)r   	   r  r4  r5  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   rA  )rT   r  r4  r5  r,  r   r   r   r+    s"   
zDocument.pagesc                 C   s>   t | dd}d}|js|S tt|td}t|}|S )zGet xref of PDF catalog.r   r  r  )r   r   r^   r   r  r   r   )rT   r  r   r  r   r   r   r.    s   
zDocument.pdf_catalogc                 C   s   | j d||dS )zGet PDF trailer as a string.r   )r-  r;  )r/  )rT   r-  r;  r   r   r   r    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    )rJ  r   r^   pdf_document_from_fz_documentr   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)rT   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.r  r   r  rO  r   )r   rJ  r   r   r   r^   rw  fz_previous_pager   r+  r   )rT   rt  r+  r,  r*  prev_locr   r   r   prev_location  s   zDocument.prev_locationc           
      C   s   i }|j }|j D ]\}}|||< q
|jjj}|j }d|_|  d}t	d | 
|}| D ]\}}|| }||j|< q4|dkrI	 |S |j }	|	|ksaJ d|d|dd|	d|S )zMake a fresh copy of a page.Nd   r   z	refs_old=z m_internal_old=z#xz m_internal_new=)r  r  r#  r   r   refsr  r   r   store_shrinkrA  )
rT   r   r  r,  r'  rF   refs_oldm_internal_oldr   m_internal_newr   r   r   reload_page,  s,   






zDocument.reload_pagec                 C   s   |s|rdS dS zt | j|\}}}W n ty(   tr t  |r%Y dS Y dS w |r4|j|jf||fS t | j|}|||fS )aM  Calculate internal link destination.

        Args:
            uri: (str) some Link.uri
            chapters: (bool) whether to use (chapter, page) format
        Returns:
            (page_id, x, y) where x, y are point coordinates on the page.
            page_id is either page number (if chapters=0), or (chapter, pno).
        )r   r   r   r   )r   r   r   )	r^   fz_resolve_linkr   r   r   r?   r+  r   r  )rT   urird  r*  xpypr,  r   r   r   resolve_linkg  s    


zDocument.resolve_linkc                    s   t drjS fddtjD dd fdd  fdd	}t}tt|d
}i }td}t	||}|
 rI||| t||}|
 rX||| |_|S )af  Convert the PDF's destination names into a Python dict.

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

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

            or

            '21154a7c20684ceb91f9c9adc3b677c40': {'page': -1, 'dest': '/XYZ 15.75 1486 0'}, ...
        _resolved_namesc                    s   i | ]}  ||qS r   )r  rd   rS   r   r   
<dictcomp>  r  z*Document.resolve_names.<locals>.<dictcomp>c                 S   s4   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_objrX  r  )r   r  outputr   r   r   
obj_string  s
   

z*Document.resolve_names.<locals>.obj_stringc           	         s  ddd}|   rt| } |  r | }n|  r$ t| d}n|S |dddd }|d}|dk r?||d	< |S |d
| }||d
 }||d	< |drs|d	= |	 dd
 }t
tt|\}}}||f|d< ||d< d|v rt|	 d d|d< |S t||d< |S )z3Generate value of one item of the names dictionary.r   r%   )r   destr  r8  rB   r   r  r  Nz/XYZrn  r  0 Rr   r   )pdf_is_indirectr^   r  r  r*  r   rj  r`   r   r  rr   rd  r  r   r   )	r   
templ_dictarrayr  subvalarr_tr  r  r  )r  
page_xrefsr   r   	get_array  s6   




z)Document.resolve_names.<locals>.get_arrayc                    sj   t |}t|D ])}t ||}t ||}| r | }n
td| d d}|r2 || |< 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<   )	dest_dictpdf_dict
name_countrf   r  r   dict_key)r  r   r   	fill_dict  s   

z)Document.resolve_names.<locals>.fill_dictr  Dests)r  r  r  r'  r^   r  r   r  r  r   r*  pdf_load_name_tree)rT   r  r  catalogr  dests	old_destsr  r   )r  r  r  rT   r   resolve_names  s$   
(



zDocument.resolve_namesc                 C   s  | j s| jr
tdt|tu 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
| }t }||_||_||_||_||_|	|_||_||_|
|_||_||_||_||_||_||_|dur|| n	|dur|| |dur|| ||_||_||_ d}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.r  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   rJ  r   r   r   r  r   r'  rf  r  r   r^   PdfWriteOptionsdo_incrementaldo_asciido_compressdo_compress_imagesdo_compress_fontsdo_decompress
do_garbage	do_pretty	do_lineardo_cleando_sanitizedont_regenerate_iddo_appearance
do_encryptr  opwd_utf8_set_valueupwd_utf8_set_valuedo_preserve_metadatado_use_objstmsr  r   r   JM_embedded_cleanJM_ensure_identityrp   pdf_save_documentrV  pdf_write_documentrX  )rT   r/   r  r  r  r  r  r  r;  r  r  r  
appearancer  r  r  r  r  r  r  r  r  r  rY  r   r   r   r    sn   




 


zDocument.savec                 C   st   | j rtdt|tu rnt|drt|}nt|dr!|j}ntd|| jkr.tdt| }t|| dS )z.Save a file snapshot suitable for journalling.zdoc is closedr   r   r  zcannot snapshot to originalN)	r   r   r   r   r  r   r   r^   pdf_save_snapshot)rT   r/   r  r   r   r   save_snapshotS  s   



zDocument.save_snapshotc                 C   s   | j | jdtjdS )z Save PDF incrementallyT)r  r  )r  r   r^   PDF_ENCRYPT_KEEPrS   r   r   r   saveIncrd     zDocument.saveIncrc                 C   s   | j s| jr
td| jstdt|dstdtt| }t|dks2t||vs2t||vr6tdt	| }t
dkrEt|| nt|t| |   dS )	z,Build sub-pdf with page numbers in the list.r  r.  r  zsequence requiredr   r/  rE  N)r   rJ  r   r0  r  r  r  r!  rt  r   rt   r^   pdf_rearrange_pages2r   rearrange_pages2rr   r	  )rT   pylistevalid_ranger  r   r   r   selecth  s    
zDocument.selectc                 C   s.   t | }|s
tj}nt|}t|| dS r  )r   r^   r  r  pdf_set_document_language)rT   r  r  r  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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.r~   z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)rH  rI  r  zbad 'basestate'r  r  Nr   r  rF  )r   r   ry  r  keysr   rq   rr   
differencer   upperr   r^   r   r  r   r   r   rI  rL  JM_set_ocg_arraysr8  )rT   rM  	basestater:  offrbgroupsrk  r  r  r  r  rV  r   r   r   r   	set_layer  sr   




zDocument.set_layerc                    s   t  tr  fdd|  D }|g krtd  d|d  t| }|dkr0t|  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 )r5   r  r   )re   uir  r   r   rg          z0Document.set_layer_ui_config.<locals>.<listcomp>z	bad OCG 'r  r   r   ro   N)	rp   r   rp  r   r   r^   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)rT   r  r4  r  r  r   r  r   set_layer_ui_config  s   
zDocument.set_layer_ui_configr  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  )r  falsezbad key value 'z': 'r  r  rk   r  r  T)r.  r   rp   r   ry  r  
issupersetr  r  r#  r   rz  r  )rT   r  r   r  badkeyspdfdictr  rv   r   r   r   set_markinfo  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 valuer  r   Nr  Tr.  r   rz  r  )rT   r  r  r   rF   r   r   r   set_pagelayout     zDocument.set_pagelayoutr  c                 C   r(  )
zSet the PDF PageMode value.)r  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r"  zbad PageMode valuer  r   Nr  Tr.  )rT   r  r  r   rF   r   r   r   set_pagemode  r0  zDocument.set_pagemodec                 C   s   | j s| jr
tdt| }tt|td}|js!t	t
t t|d}t|td}|jr=t|||d d	S t||t d}t|tdtd t|tdtd t|td| d	S )
z"Store XML document level metadata.r  r  rN  rr  r   r  r  XMLN)r   rJ  r   r   r^   r   r  r   r   r\  MSG_BAD_PDFROOTr]  r  rC  r   r  r  r  )rT   rK  r  r  r   r  r   r   r   set_xml_metadata  s   
zDocument.set_xml_metadatac                 C   s   t | }tt|tdtdtd}t|rt|s)|dk r%dS tt|dk r/dS t	|| |rDt
| t|j dS dS )zActivate an OC layer.r  r  rF  r   Nr   )r   r^   r   r  r   r  rH  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr8  r   )rT   rM  
as_defaultr  cfgsr   r   r   switch_layer)  s$   
zDocument.switch_layerc                 C   sz   | j s| jr
tdt| }t|}t|d|d s!tdtt	 t
| t||}t||| |r;tt| dS dS )z!Replace object definition source.r  r   bad xrefN)r   rJ  r   r   r^   r  r%  r\  r  r  r  r  r  JM_refresh_linksr   )rT   r   r5   r   r  xreflennew_objr   r   r   r0  =  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
|}|js:ttt|||| d|_dS )zReplace xref stream part.r  r   r   N)r   rJ  r   r   r^   r  r  r  r*  MSG_IS_NO_DICTr   r   rZ  r   r   dirty)	rT   r   rf  newcompressr  rB  r   r   r   r   r   update_streamL  s   


zDocument.update_streamc                 C   s    t | dd}|jrt|S dS )z1
        Count versions of PDF document.
        r   r  )r   r   r^   pdf_count_versionsr]  r   r   r   version_count^  r3  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|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  r  r  r  )rT   r  r  r  r  r  r  r;  r  r  r  r  r  r  r  r  r  r  r  r  r  bior   r   r   writeh  sX   	
zDocument.writec                 C      t |  | j| jS zPDF xref number of page.r  r   r  r  rS   r   r   r   r        zDocument.xrefc           
      C   s~  t | }t|}t|d|d s|dkrtt|dkr$t||}nt|}|js.dS t	||}|js9dS d}t
|rJd}dt| }nct|rRd}n[t|rZd	}nSt|rid
}dt| }nDt|rqd}n<t|r{d}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'.r   r   r   )r8  r8  Nr   %i 0 Rr  r   r   z%ir  r8  r  r  r#  r   z/%sstringunknown)r   r^   r  r%  r   r  r  r  r   r  r  r   r  r*  
pdf_is_intr   pdf_is_realr  r  r  r;  r)  pdf_is_stringr   r   JM_object_to_bufferr  )
rT   r   r  r  rB  r   subobjr5   r   r   r   r   r   r    sX   











zDocument.xref_get_keyc           	      C   s   t | }t|}t|d|d s|dkrtt|dkr$t||}nt|}t|}g }|dkr6|S t	|D ]}t
t||}|| q:|S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   r   r   )r   r^   r  r%  r   r  r  r  r+  r  r)  r-  r2   )	rT   r   r  rB  r   r/  r_   rf   r  r   r   r   xref_get_keys  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.r  r  r   z/FontTFr   rJ  r   r  rT   r   r   r   r   xref_is_font  
   zDocument.xref_is_fontc                 C   r[  )z!Check if xref is an image object.r  r  r   z/ImageTFr\  r]  r   r   r   xref_is_image  r_  zDocument.xref_is_imagec                 C   s&   t | dd}|jsdS tt||S )z!Check if xref is a stream object.r   r  F)r   r   r  r^   pdf_obj_num_is_streamr  r   r   r   xref_is_stream  s   zDocument.xref_is_streamc                 C   r[  )z Check if xref is a form xobject.r  r  r   z/FormTFr\  r]  r   r   r   xref_is_xobject  r_  zDocument.xref_is_xobjectc                 C   s$   d}t | dd}|jrt|}|S )zGet length of xref table.r   r  )r   r   r^   r  )rT   rB  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	|d|d s-|dkr-tt
|dkr8t||}nt|}tt|||}t|}	|	S )z#Get xref object source as a string.r~   r   r   r   )r   r   r   r   r/  r   r   r^   r  r%  r  r  r  rX  r  JM_EscapeStrFromBuffer)
rT   r   r-  r;  rG   r  rB  r   r   r5   r   r   r   r/  
  s   

zDocument.xref_objectc           
   	   C   s0  | 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
|d|d sS|dkrStt|dkr^t||}nt|}t|||}|jsndS |dkr{t||| dS t|}t|D ]}	t|t||	t||	 qdS )	z&Set the value of a PDF dictionary key.r~   r  z	bad 'key'r   r   Nzbad 'value'r   )r   r   rp   r   INVALID_NAME_CHARSintersectionry  r   r^   r  r%  r  r  r  JM_set_object_valuer   r  r+  r  r  r-  r,  )
rT   r   r  rv   r  rB  r   rC  r/  rf   r   r   r   r    s4   $2




zDocument.xref_set_keyc                 C      | j s| jr
tdt| }t|}t|d|d s#|dkr#tt|dkr/t||d}nt	|}d}t
|rEt||}t|}|S )zGet decompressed xref stream.r  r   r   r   N)r   rJ  r   r   r^   r  r%  r  r  r  r   pdf_load_stream_numberr   rT   r   r  rB  r   r   r   r   r   r   xref_streamC     


zDocument.xref_streamc                 C   ri  )z&Get xref stream without decompression.r  r   r   r   N)r   rJ  r   r   r^   r  r%  r  r  r  r   pdf_load_raw_stream_numberr   rk  r   r   r   xref_stream_rawU  rm  zDocument.xref_stream_rawc                 C   sV   t | }tt|td}|jsttt t|td}d}|jr)t	|}|S )z"Get xref of document XML metadata.r  rr  r   )
r   r^   r   r  r   r   r\  r8  r]  r   )rT   r  r  r  r   r   r   r   xref_xml_metadatag  s   

zDocument.xref_xml_metadata)r   rq  rR  __dict__c                 C   r  r   )re  rS   r   r   r   <lambda>u      zDocument.<lambda>)r&  Nr  )NNNNr   r   rC  r  r  NN)r   r  r  NNr   NN)r   r   NN)r   r   r   )r   )r   r   N)r   FTTTFFFFFr   r  NNTr   r   r   F)r   r   r   r   TTr   r   )	r   r   r   r   r   r   r   r   Nr   )Nr   r   rC  rO  rN   )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NNr   r   r   )NNNNN)r   Nr   r   )FFFFFFFFFFFFr   r  NNr   r   r   )rW   rX   rY   r  r-  r7  r  r  r   r  rU   r|  r   r   r  r  r  r  r  typingUnionr  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r%  r'  r	  r2  r5  r  r6  r;  rX  r[  r^  ra  r(  r)  r:  ro  rq  rs  r1  r2  
ByteStringr  r  r  r  r   r  r   r  rq   r  OptBytesr  r  r  r  r  r  r  r  r  r  ru  r  r  r  r  r  rn  r  r  r0  r2  r8  r0  r:  r<  rA  rD  rH  rL  rN  rQ  rS  rZ  r]  r_  ra  r  rf  rp  rq  rA  rz  r  r  r  r   r  rm  r  r  r'  r  r  r  r  r  sysimplementationversioncollectionsabcIterable
_pages_retOptIntr+  r.  r  r  r  r  r  r  r  r  r	  r  r  r  r!  r'  r/  r6  r9  r?  r0  rH  rJ  rM  r   r  rZ  r^  r`  rb  rc  rd  r/  r  rl  ro  rp  	__slots__outliner  	is_streamr   r   r   r   r   C
  s4   	 J /$F&
8
F

	E
(
1T/8
+
.o

	




	





(
;~W	A02&r   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  r   r   rS   r   r   r   r  ~  r   zDocumentWriter.__enter__c                 G   r8  r   r9  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 )NrD  r   r   _out)rp   r   r  r   r^   FzDocumentWriterPathType_PDFr   rV  OutputType_PDFr  )rT   r-   r  rY  r   r   r   rU     s   





zDocumentWriter.__init__c                 C   s"   t |}t| j|}t|}|S r   )r  r^   fz_begin_pager   r
  )rT   r   	mediabox2r  device_wrapperr   r   r   
begin_page  s   zDocumentWriter.begin_pagec                 C   r  r   )r^   fz_close_document_writerr   rS   r   r   r   r:    r  zDocumentWriter.closec                 C   r  r   )r^   fz_end_pager   rS   r   r   r   end_page  r  zDocumentWriter.end_pageNr%   )	rW   rX   rY   r  r  rU   r  r:  r  r   r   r   r   r  |  s    
r  c                   @   s  e Zd Zdd Z										d6ddZd	d
 Zdd Zedd Zedd Z	edd Z
d7ddZedd Zedd Zd8ddZd9ddZedd Zd d! Zd8d"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d7d0d1Zd2d3 Zd4d5 ZdS ):r  c                 C   s   t | turd S d S r   )r   r  rS   r   r   r   r    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'r  \ri   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanro   )r  r  rp   r  r   r   r   rz  r<   r   fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr   r^   r  JM_get_fontr   )rT   r   r  r   scriptr  r  is_bold	is_italicis_serifembedfname_lowerr  r  r  r   r   r   rU     s@   










zFont.__init__c                 C   s
   d| j  S )Nz
Font('%s')r   rS   r   r   r   r        
zFont.__repr__c                 C      J d)Nr   zHNot implemented because implementation requires FT_Get_First_Char() etc.r   )rT   r  r   r   r   _valid_unicodes  r"   zFont._valid_unicodesc                 C   r  )z Return the glyph ascender value.)r^   fz_font_ascenderr   rS   r   r   r   ascender  r  zFont.ascenderc                 C   
   | j  S r   )r   fz_font_bboxrS   r   r   r   r        
z	Font.bboxc                 C   s    t t | jjj}t |S r   )r^   r  r  r   r   r  fz_buffer_extract_copy)rT   r   r   r   r   r    s   
zFont.bufferrC  c              	   C   st   t |}g }|D ].}	t|	}
|r t | j|
}|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_scr   !fz_encode_character_with_fallbackr2   r  )rT   r5   r   r  r  wmode
small_capsr  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   rS   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 r  r   )bitsrG   rF   r   r   ri    s   zFont.flags.<locals>.br   )monoserifr  r  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxr  zcjk-langr  znever-embed)r^   ll_fz_font_flagsr   r   rp   fz_font_flags_tr]   is_monor  r  r  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxr  cjk_langr  never_embed)rT   rM  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   rj    sJ   z
Font.flagsc           	      C   sP   t |}|rt | j|}|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  )	rT   chr_r  r  r  r  r  r  r  r   r   r   glyph_advance:  s   
zFont.glyph_advancec                 C   sX   t |}|rt | j|}|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   fz_bound_glyphr#  )rT   charr  r  r  r  r  r  r   r   r   
glyph_bboxE  s   
zFont.glyph_bboxc                 C   
   | j jjS r   )r   r   glyph_countrS   r   r   r   r  P  r  zFont.glyph_countc                 C      t |S )z$Return the unicode for a glyph name.)glyph_name_to_unicoder  r   r   r   r  T  r"   zFont.glyph_name_to_unicodec           	      C   sP   |rt |}t | j|||\}}|S |rt | j|}|S t | j|}|S )z0Check whether font has a glyph for this unicode.)r^   r  r  r   r  r  )	rT   chrr  r  fallbackr  r  r  r  r   r   r   	has_glyphX  s   
zFont.has_glyphc                 C   r  r   )r^   fz_font_is_boldr   rS   r   r   r   r  d  r  zFont.is_boldc                 C   r  r   )r^   fz_font_is_italicr   rS   r   r   r   r  h  r  zFont.is_italicc                 C   r  r   )r^   fz_font_is_monospacedr   rS   r   r   r   is_monospacedl  r  zFont.is_monospacedc                 C   r  r   )r^   fz_font_is_serifr   rS   r   r   r   r  p  r  zFont.is_serifc                 C      dS r  )r   r^   r  r   r]   cppyygbl"mupdf_mfz_font_flags_ft_substituter  ll_fz_font_t3_procspdf_font_writing_supported)rT   r  rj  r  r  r   r   r   is_writablet     zFont.is_writablec                 C   s   t | j}|S r   )r^   fz_font_namer   rx  r   r   r   r     s   z	Font.namec                 C   s   | j }t|}d}	t|ts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  rp   r   rZ  MSG_BAD_TEXTr  r  r  r  )rT   r5   r   r  r  r  r  thisfontr  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)rT   r  r   r   r   r    r"   zFont.unicode_to_glyph_namec                 C   s   g S )z5
        list of valid unicodes of a fz_font
        )r  r  buffer_infor  sortedry  )rT   r  gccpr  r   r   r   valid_codepoints  s   zFont.valid_codepoints)
NNNr   Nr   r   r   r   r   )rC  Nr   r   r   )Nr   r   r   )Nr   r   )rW   rX   rY   r  rU   r   r  r  r  r   r  r  r  rj  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r   r   r   r   r    s^    
3






+









r  c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   r  r  )r   r  r   rS   r   r   r   r    s   
zGraftmap.__del__c                 C   s"   t |}t|}|| _d| _d S r  )r   r^   pdf_new_graft_mapr   r   )rT   r   dstmap_r   r   r   rU     s   

zGraftmap.__init__N)rW   rX   rY   r  rU   r   r   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
 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   r8  r   )r   rS   r   r   r   r    r  zLink.__del__c                 C   r   r   )rp   r^   FzLinkr   )rT   r   r   r   r   rU     r   zLink.__init__c                 C      t |  dt| j S Nzlink on r  r   r   rS   r   r   r   r     r  zLink.__repr__c                 C   r  r  r  rS   r   r   r   r     r  zLink.__str__c                 C   s:   t |dd}|jsd S t||d}|jsd S t|}|S Nr   r  )r   r   r^   r  r5  rT   r   r   r  link_objri  r   r   r   _border  s   zLink._borderc                 C   s>   t |dd}|jsd S t||d}|jsttt|}|S r  )r   r   r^   r  r   r  rB  r  r   r   r   _colors  s   zLink._colorsc                 C   s   d | _ d| _d S r  )r   r   rS   r   r   r   r     s   
zLink._erasec                 C   s>   t |dd}|jsd S t||d}|jsd S t|||}|S r  )r   r   r^   r  r  )rT   r8  r   r   r  r  ri  r   r   r   
_setBorder  s   zLink._setBorderc                 C      |  | jjj| jS r   )r  r   r   r   rS   r   r   r   r8    r
  zLink.borderc                 C   r  r   )r  r   r   r   rS   r   r   r   r     r
  zLink.colorsc                 C   sp   t | dr| jdu rtd| jjjs| jjjrtd| jj}| js)| jdr,d}n|| j}t	| ||S )z Create link destination details.r   Norphaned object: parent is Noner  #)
r  r   r   r   rJ  is_externalr  r   r  linkDest)rT   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   rS  r   r8  )r  r   r0  r  r   r   )rT   r   rM  r   r   r   rj  
  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   r   r  r  r^   fz_is_external_linkrT   	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_LINKr;  r   r   r   rg   2     " zLink.next.<locals>.<listcomp>c                 S   r  )r   ro   r  r;  r   r   r   rg   3  r	  r   r%   )r   r   r  r   r   	Link_nextr  r  r   r   r  r  r   annot_xrefsr  )rT   r   
link_xrefslink_idsr  r   r   r   r     s,   

z	Link.nextc                 C   s<   t |  | jdu s| jjstdt| j }t|}|S )zRectangle ('hot area').Nz"self.this.m_internal not available)r  r   r   r   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   r   r  r   r   r   )rT   r8  r  r  r  r   r   r   r  H  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
v sKJ dt| d}|| jd| dS )zSet border colors.r  r   r  Nz!warning: links have no fill colorr   r  r  r  r  r  r  )r  r   r   r   r   r<   r  r   r  r  r  r  rs   )rT   r   r  r   r   r  r   r   r   r  M  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' valuerS  )	r  r   r0  r   r   r   r  r   r   )rT   rj  r   r   r   r   r  a  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   r   r  r  r   r   r   r  k  s   zLink.urir   )Nr   NNr  )rW   rX   rY   r  rU   r   r   r  r  r   r  r  r8  r   r  r   rj  r  r  r   r  r  r  r  r   r   r   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
 Zddddddd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d1d%d&Zed'd( Zd)d* Zd+d, Zd-d. Zd/d0 Ze	ZeZeZdS )2r&  c                 C      t tdd | D S )Nc                 S      g | ]}|| qS r   r   re   r<  r   r   r   rg   z  rh   z"Matrix.__abs__.<locals>.<listcomp>mathsqrtsumrS   r   r   r   __abs__y     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  r	   Matrix: bad seq lenr   r   ro   r   r  r   
r  r&  r
   ri  r<  r  r  rM  r  r   r~  r   r   r   __add__|     
&$zMatrix.__add__c                 C   $   t | t|   kodk S    S rN   rt  r!  rS   r   r   r   __bool__     $zMatrix.__bool__c                 C   *   t |dsdS t|dkot| | du S )Nr|  Fr	   r  r  r  )rT   r'  r   r   r   __eq__     
zMatrix.__eq__c                 C   s    | j | j| j| j| j| jf| S r   r
   ri  r<  r  r  rM  rB  r   r   r   r    s    zMatrix.__getitem__Nr%  c                G   s  |sd | _  | _ | _ | _ | _| _nt|dkrtdt|dkr7tt	|\| _ | _| _| _| _| _nt|dkrt
|d tjrj|d j | _ |d j| _|d j| _|d j| _|d j| _|d j| _nt|d drt|d }tt|d}	tt|d}
|	 | _ | _|
| _|
 | _d | _| _nrtt	|d \| _ | _| _| _| _| _n^t|dkst|d	kr|d dkrt	|d ddt	|d ddf\| _ | _| _| _| _| _n/t|d	kr
|d dkr
d
t	|d t	|d d
ddf\| _ | _| _| _| _| _ntd|dur|| _ |dur|| _|dur&|| _|dur.|| _|dur6|| _|dur@|| _dS dS )a  
        Matrix() - all zeros
        Matrix(a, b, c, d, e, f)
        Matrix(zoom-x, zoom-y) - zoom
        Matrix(shear-x, shear-y, 1) - shear
        Matrix(degree) - rotate
        Matrix(Matrix) - new copy
        Matrix(sequence) - from 'sequence'
        Matrix(mupdf.FzMatrix) - from MuPDF class wrapper for fz_matrix.
        
        Explicit keyword args a, b, c, d, e, f override any earlier settings if
        not None.
        r#  r	   r  r   r   r  rF  ro   r   r$  zMatrix: bad argsN)r
   ri  r<  r  r  rM  r  r   rd  r  rp   r^   r#  r  r  radiansroundcossin)rT   r
   ri  r<  r  r  rM  r  thetac_s_r   r   r   rU     sL   &$($
zMatrix.__init__c                 C   s   t  }||  |S )zCalculate inverted matrix.)r&  invert)rT   m1r   r   r   
__invert__  s   
zMatrix.__invert__c                 C   r  )Nr	   r   rS   r   r   r   r|    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&  r
   ri  r<  r  r  rM  concat)rT   r1  r.  r   r   r   __mul__  s   

zMatrix.__mul__c                 C   s*   t | j | j | j | j | j | j S r   )r&  r
   ri  r<  r  r  rM  rS   r   r   r   __neg__  s   *zMatrix.__neg__c                 C   r  rN   r  rS   r   r   r   __nonzero__  r   zMatrix.__nonzero__c                 C      t | S r   )r&  rS   r   r   r   __pos__  r   zMatrix.__pos__c                 C      dt t|  S )Nr&  r   rr   rS   r   r   r   r     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   ro   r   r  r   index out of range)r  r
   ri  r<  r  r  rM  r@  rT   rf   rF   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  r~  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&  r
   ri  r<  r  r  rM  util_invert_matrixZeroDivisionErrorr0  )rT   r1  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.r	   r  )	r  r   util_concat_matrixr
   ri  r<  r  r  rM  )rT   onetwor   r   r   r0    s   "zMatrix.concatc                 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=  r
   ri  r<  r  r  rM  )rT   rY  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.)ry  ri  EPSILONr<  r
   r  rS   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   r5  g     V@g     f@g     p@)r  ry  rD  r
   ri  r<  r  r  r&  r)  r(  )rT   r*  r
   ri  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  r
   ri  r<  r  )rT   sxsyr   r   r   prescaleG  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.rH  )rT   r  rF   r
   ri  r   r   r   preshearQ  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  r
   r<  rM  ri  r  )rT   txtyr   r   r   pretranslate\  s
   zMatrix.pretranslater   )rW   rX   rY   r  r  r  r#  r  rU   r/  r|  r1  r2  r3  r5  r   r:  r;  r@  r0  r-  r  rE  rG  rK  rL  rO  __inv____div__normr   r   r   r   r&  w  s8    	7	


+
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   )hashrS   r   r   r   __hash__l  r   zIdentityMatrix.__hash__c                 C   s   t | dd d S )Nr$  )r&  rU   rS   r   r   r   rU   o  r  zIdentityMatrix.__init__c                 C   r  )Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r   rS   r   r   r   r   r  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#  )rq  )rT   r   rv   r   r   r   __setattr__u  s
   zIdentityMatrix.__setattr__c                  G   s   t d)NzIdentity is readonly)NotImplementedError)r  r   r   r   	checkargs}  r   zIdentityMatrix.checkargsN)	rW   rX   rY   __doc__rU  rU   r   rX  rZ  r   r   r   r   rS  i  s    rS  c                   @   s   e Zd ZdZdddZdS )r   z#link or outline destination detailsNc           
         s  |j }| }d _d _d _d _d _t _tdd _	t
  _d _|j _tdd _|j _ fdd}|rY jdsYd|d d  d	t|d  d
t|d   _|j rbd _t _ jskd _t _|r jr jdd _ jdrt _td j}|rt|dd  _tt|dt|d _	 jtB tB  _nVtd j}|rt|dd  _nBt _td j}|sJ |r|r|d}| | _ jd u rt
  _| jd< n| jdd   _n	t _| j _|j rx jsnj jdre jdd   _ jdr, jdd   _d _d _t _ j d}	t!|	dkrd|	d drdt" _|	d  _t|	d  dd dd  d  _nd jv rrd _t _nd _t _t# jt
sJ d S )Nr%   r   Fc                    s`    j dd  d}t }|D ]}|d}|dkr)||d d  ||d | < qd ||< q|S )Nr   &r  r   )r  r  r   r`   )r  r#  rG   r  eqrS   r   r   uri_to_dict  s   

z&linkDest.__init__.<locals>.uri_to_dictr  z#page=r   z&zoom=0,,ro   r   z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   r  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r   z//zpage=r\  r'   T)$r  r  	file_specrj  is_mapis_uri	LINK_NONEkindrv  ltr   r  
new_windowr   r  r  r   rs   LINK_URIrj  	LINK_GOTOr  r  r   groupr  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr  r   LINK_LAUNCHr  r  
LINK_GOTORrp   )
rT   r   rlinkr   isExtisIntr^  r1  r  ftabr   rS   r   rU     s   0 


$zlinkDest.__init__r   rW   rX   rY   r[  rU   r   r   r   r   r     s    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_dar  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r   rS   r   r   r   rU     s>   
zWidget.__init__c                 C   s   d| j  d| j dS )NzWidget:(field_type=z script=r  )r  r  rS   r   r   r   r   	     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.
        rw  N)CourTiRorw  ZaDb)r  rz  )rT   valid_fontsrM  r   r   r   _adjust_font  s   zWidget._adjust_fontc                 C   s   | j tddvrtd| j tjkrO| jdvrQt| drS| jj}|| j	d\}}|dkrUt
tt|dd d	d
 }|D ]}|| j	krN||dd q@dS dS dS dS dS )z Any widget type checks.
        r   rF  zbad field type)FOffr   zParent/Kidsr  r   r  r%   ASz/OffN)r  r  r   r^   PDF_WIDGET_TYPE_RADIOBUTTONr  r  r   r  r   rr   rd  r   rj  r  r  )rT   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'.
        Nrw  r   rv  Tfro   r   r%   grgc                 S   rb   r   r  re   rM  r   r   r   rg   H  rh   z$Widget._parse_da.<locals>.<listcomp>r   )r  r  rl  r  r  r  r   )rT   r  r  r  datrf   r  r   r   r   r   2  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jtjtjfv }| jsXd| _nt| jturctd|sh| jsld| _nt| jturwt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|s| jsd| _nt| jturtd|   dS )z$Validate the class entries.
        zbad rectzfield name missingUnnamedNrv  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r   is_infiniteis_emptyr   r}  r~  r  r>  r  r   ry  r  rx  r  r  r^   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXr  r  r   r   r  r  r  r  r  r  r  )rT   btn_typer   r   r   	_validateQ  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krg }t|d dd }||}|ddd }|D ]}|| d  qo||d< ||d}	|	d dkrg }
|	d d	d
 }	|	ddd }|D ]}|
| d  q|
|d< |	d dkrg }
t|	d dd }||}	|	ddd }|D ]}|
| d  q|
|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.
        ro   r   Nr   )r  downzAP/Nr   r   r   ro   r]  r  r  r   rk   zAP/Dr  )	r  r  r   r   r  r  r2   r   r/  )rT   r   r   statesAPNnstatesapntr  nxrefAPDdstatesapdtdxrefr   r   r   button_states  sP   





zWidget.button_statesc                 C      | j jS r   )_annotr  rS   r   r   r   r    r"   zWidget.nextc                 C   sn   | j dvrdS | j dkrdS |  }|du 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  Nro   Yesr  z(warning: radio button has no 'On' value.T)r  r  r   r  r<   )rT   bstater'  rF   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)r   _reset_widgetr  rS   r   r   r   reset     zWidget.resetc                 C   s   |    |   d| _t| jdkrd| j }nt| jdkr%d| j }nt| jdkr1d| j }|j| j| j| jd| _| jrFt	| j
 t| j
|  d| _d	S )
z*Reflect Python object in the PDF.
        r%   r   rI  r   rJ  r  rK  rL  N)r  r  r  r  r   ra  r  r  r  util_ensure_widget_calcr  r   _save_widget)rT   rm   r   r   r   r    s    



zWidget.updateN)rW   rX   rY   r[  rU   r   r  r  r   r  r  r  r  r  r  r  r   r   r   r   r    s    %G1
r  )_extrac                   @   s   e Zd Zdd Zedd Zdd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd ZdgZdS )r  c                 C   s
   || _ d S r   )r   rT   r^  r   r   r   rU     r  zOutline.__init__c                 C   s   t | ddS )zoutline destination detailsNr   rS   r   r   r   r    r  zOutline.destc                 C   s   t | d|S )zo
        Like `dest` property but uses `document` to resolve destinations for
        kind=LINK_NAMED.
        Nr  )rT   r   r   r   r   destination     zOutline.destinationc                 C       | j }| }|jsd S t|S r   )r   r  r   r  )rT   r^  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   r   r  r^   r  )rT   r^  r  r   r   r   r  #  s   
zOutline.is_externalc                 C   s   	 | j jjS r   )r   r   r  rS   r   r   r   r  2  s   
zOutline.is_openc                 C   r  r   )r   r  r   r  )rT   r^  next_olr   r   r   r  8  r  zOutline.nextc                 C   s   	 | j jjjS r   )r   r   r   rS   r   r   r   r   @  s   zOutline.pagec                 C   r  r   )r   r   r  rS   r   r   r   r  F  r  zOutline.titlec                 C   s   | j }|jsd S |jjS r   )r   r   r  r  r   r   r   r  J  s   zOutline.uric                 C   r  r   )r   r   r  rS   r   r   r   r  Q  r  z	Outline.xc                 C   r  r   )r   r   r  rS   r   r   r   r  U  r  z	Outline.yr   N)rW   rX   rY   rU   r  r  r  r  r  r  r  r   r  r  r  r  r  r   r   r   r   r  
  s0    










r  c           	         sv   t  }| |_||_||_||_|r9 rt t jsJ nt   G  fdddt j}| }|	|
  ||_|S )z4
    Returns a mupdf.PdfFilterOptions instance.
    c                       s&   e Zd Z fddZdd Z  ZS )z'_make_PdfFilterOptions.<locals>.Factoryc                    s   t    |   | _d S r   )r   rU   use_virtual_filtersoptsrS   )	__class__r  r   r   rU   |  s   

z0_make_PdfFilterOptions.<locals>.Factory.__init__c              	   S   s   	 t|||||| j S r   )r9   r  r}  r^   ll_pdf_new_sanitize_filter)rT   ctxr   chainstruct_parents	transformr  r   r   r   filter  s   
z._make_PdfFilterOptions.<locals>.Factory.filter)rW   rX   rY   rU   r  __classcell__r   r  r  r   Factory{  s    r  )r^   PdfFilterOptionsr9  r:  r;  	no_updaterp   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryr}  _factory)	r9  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(d) Zd*ed+efd,d-Zd.d/ Zdd0d1Z					dd4d5Zd6d7 Zd8d9 Zdd:d;Zd<d= Zdd?d@Z dAdB Z!ddCdDZ"dEdF Z#dGdH Z$ddIdJZ%dKe&d+e'fdLdMZ(dNe)d+e'fdOdPZ*						ddKe&dQe+j,dRe-dSedTedUed+e'fdVdWZ.											d	dNe)dXe-dYe/dZed[e0d\e0d]e0d^e1d_e1d+e'fd`daZ2				dd+e'fdbdcZ3dde4d+e'fdedfZ5dge&dhe&d+e'fdidjZ6dke4d+e'fdldmZ7dke4d+e'fdndoZ8dNe)d+e'fdpdqZ9											>ddXedZedYe/d^e1dre0d\e0dse:d+e'fdtduZ;								dd+e'fdvdwZ<ddNe)dxe1d+e'fdydzZ=dd+e'fd{d|Z>ddKe&dXe-dUe-d+e'fd~dZ?dd+e'fddZ@deAd+e'fddZBdd ZCdd ZDdddZEeFdd ZGeFdd ZHdd ZIdddZJeFdd ZKeFdd ZLdd ZMdd ZNeFd+eOfddZPdddZQeFdd ZReFdd ZSeFdd ZTdddZUdddZVdd ZWdddZXdde:d+e4fddZYdd ZZ	dde/de/d+e4fddZ[dddZ\dddZ]dddZ^d+e4fddZ_dddZ`		ddeadNe)d+e-fddĄZbdde)de1d+dfddɄZcdd˄ Zddd̈́ Ze			dddЄZfeFdd҄ ZgeFddԄ ZhdddքZide+jje-e1f d+e'fddلZkddۄ Zldd݄ ZmeFdd߄ ZneFdd Zodd Zpdd ZqeFdd ZreFd+eOfddZsdd Ztdd Zudd Zvdd Zwdd ZxdddZydd Zzdd Z{dd Z|eFdd Z}eFdd Z~dd dZdd ZeFdd ZeFeIddZd	S (  r   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%   )rp   r^   r   r   r   r   
last_point	draw_contr   r  r   r   r   r  )rT   r   r   r   r   r   rU     s    
zPage.__init__c                 C   r   r   )r   r  r   r   rf  rl  r  r  r   r   r   r     r   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 )Nr   r=  z<memory, doc# %i>r%   z<new PDF, doc# %i> of )r   rp   r   r   r^   pdf_pager   r  r   r   rf  rl  )rT   r   r  rG   r  r   r   r   r     s   

zPage.__str__c                 C   s   t rt| jt|}|S |  }t|tj}|rAt|}t	|}t
|j|j|j|j |j |j|j |j }t|| t| t|d |S Nr  )r   r   _add_caret_annotr   JM_point_from_py	_pdf_pager^   pdf_create_annotr   pdf_annot_rectr  r  r  rX  rY  rZ  r[  r3  r   JM_add_annot_id)rT   r  r   r   rO  r   r   r   r   r    s   
0

zPage._add_caret_annotNc                 C   s.  |   }|r|n|}|r|n|}	t|}
t|}|jsttt|tj}t	|}t
|
j|
j|
j|j |j |
j|j |j }t|| tj}t|| |rZt|| t| ||||	d}tt|td| tt|td| t| t|| t|| t|d t|S )Nr   rQ  r  r  )r  r  r   r   rZ  r   r^   r  r   r  fz_make_rectr  r  rX  rY  rZ  r[  r3  PDF_ANNOT_IS_PRINTr   pdf_set_annot_icon_namer  r   r  r   r   r  r   r  r   )rT   r  r   r/   r  re  iconr   ufr  rO  filebufr   r   rj  r   r   r   r   _add_file_annot  s.   
0

zPage._add_file_annotrC  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t||f d }|d | }d }d}t|d }|r|d7 }d}t|d }|r|d7 }d}d}|r|rd}|d ur|| | | d | d | }|| |S )Nr   r   r   r  rS  rT  ro   r   r   )r6  irV  z0 0 z rerW  r@  rM  rR  rX  r<  s   1 w
rP  rY  )r  r   r  r^   r1  r0  r   r2  r  r   r   r	  r3  r   r   r   JM_make_annot_DAr   r  r   r   r`   rg  rs   rC  rB  r   )rT   r   r5   r   r   r   r  r>  r   r  r   r  r  ntcolr  r   r   r   r   r   r  r  r   r  r  r  r~  r  r  r   r   r   _add_freetext_annot  sZ   




 
zPage._add_freetext_annotc                 C   s:  t | j}t|sttt }t|td| t	|}t
|tj}t|}t|}t| |}t|D ]I}	||	 }
t|
}t| d| }t|D ]*}|
| }t|rdt|dkrhtttt||}t||j t||j qTt|| q<t|td| t| t|d t|S )Nr   ro   r  r  )r   r   PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr^   r#  r  r  fz_invert_matrixr  r   r   r  r  r   r  PySequence_Sizer  r  r  r  r  r  r  r   r   r  r   )rT   rq   r   r  inv_ctmr   r   n0inklistr2  sublistn1r  rf   rO  r  r   r   r   _add_ink_annot/  s4   




zPage._add_ink_annotc                 C   sZ   |   }t|tj}t|}t|}t||| t| t|d |js)J t	|S r  )
r  r^   r  r   r  pdf_set_annot_liner   r  r   r   )rT   r  r  r   r   r
   ri  r   r   r   _add_line_annotO  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 )Nro   r  )r  r  r   MSG_BAD_ARG_POINTSr^   r  r  r  pdf_add_annot_vertexr   r  r   )rT   r  r|  r   r   rO  r  r   r   r   _add_multilineZ  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  r   JM_quad_from_pyfz_rect_from_quadr3  r   r  r   r  r  r  r   r   r  r  r  r   r   r  ll_pdf_keep_annotr   r   r   )rT   r  r5   r  r   r   r   r   r  r  r   qr   r  rf   r   r   r   _add_redact_annoti  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^   r1  r0  r   r2  r  r3  r   r  r   r   )rT   r   r|  r   r   r   r   r   r   _add_square_or_circle  s   


zPage._add_square_or_circlec           	      C   s@  |   }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|sFt|rJttt	|d|d rV|| }t
|tj}t|| ztd}tt|td| W n ty   trt   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  r   r  r  r^   r1  r0  r   r2  r%  r  r   r3  r  r   r   r   r?   r	  pdf_dict_get_namer   r  r   )	rT   r   stampr   stamp_idr/  r   r   r   r   r   r   _add_stamp_annot  sN   


zPage._add_stamp_annotc                 C   s   |   }t|}t|tj}t|}t|j|j|j|j	 |j
 |j|j |j }t|| t|| |r@t|| t| t|d t|S r  )r  r  r^   r  r   r  r  r  r  rX  rY  rZ  r[  r3  r	  r  r   r  r   )rT   r  r5   r  r   rO  r   r   r   r   r   _add_text_annot  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  r   r0  r   Page__add_text_markerr  r  r  r  )rT   quadsr|  r   r   r   r   _add_text_marker  s   zPage._add_text_markerc           
   	   C   sP  t |  trtj| j_t| j|S t| j}t|}|dk r!dS d}t	|t
s,tdt| tdjsBt| td| t| td}|jsZJ d|d|jt|D ]G}|| }t|}|sptd| q^z!t| t| |}t| t|d	}	t||	 W q^ ty   trt  td
|  Y q^w dS )z&Add links from list of object sources.r   Nr   zbad 'linklist' argumentrD  zlcount=z annots.m_internal=z"skipping bad link / annot item %i.r   z#skipping bad link / annot item %i.
)r  r   r   Page_addAnnot_FromStringr  _addAnnot_FromStringr   r   r  rp   rr   r   r^   r   r   r   r   rJ  r  JM_StrAsCharr<   r  r   r  r  r   r  r   r   r?   )
rT   linklistr   lcountrf   rL  txtpyr5   r   r  r   r   r   r 	    s<   




zPage._addAnnot_FromStringc                 C   s>   |   }| }t||||}|jstdt|d t|S )Nzcannot create widgetW)r  r   JM_create_widgetr   r   r  r   )rT   r  r}  r   r  r   r   r   r   
_addWidget  s   
zPage._addWidgetc                 C   s>   |   }t }d|_||_||_||_t| ||}|S rN   )	r  r^   PdfRedactOptionsblack_boxesr5   image_methodline_artpdf_redact_pager   )rT   r5   imagesgraphicsr   r  successr   r   r   _apply_redactions  s   zPage._apply_redactionsc                 C   sN   |    z| j|  W n ty   t  Y nw d | _d| _d | _d | _d S r  )_reset_annot_refsr   r  r   r?   r   r  r   rS   r   r   r   r     s   
zPage._erasec                 C   sD   t | }t| tj}t| tj}t| j}t|||S )a  Count missing graphic state pushs and pops.

        Returns:
            A pair of integers (push, pop). Push is the number of missing
            PDF "q" commands, pop is the number of "Q" commands.
            A balanced graphics state for the page will be reached if its
            /Contents is prepended with 'push' copies of string "q
"
            and appended with 'pop' copies of "
Q".
        )	r   r^   r   r   r  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)rT   r   r   r  r  r   r   r   _count_q_balance  s   

zPage._count_q_balancerp  r&  c           	      C   s   |d u s|dkr
d S | j }|j|dd}d|v s d|v s tdi }|  D ]\}}|||< q&|| v r9|| S d}d| }|| v rS|d7 }d| }|| v sE| || |S )	Nr   Tr,  	/Type/OCG
/Type/OCMDzbad optional content: 'oc'zMC%ir   )r   r/  r   _get_resource_propertiesr  r   _set_resource_property)	rT   rp  r   checkpropsrO  r  rf   mcr   r   r   _get_optional_content0  s&   
zPage._get_optional_contentc                 C   s   |   }t| }|S )z/
        page list Resource/Properties
        )r  JM_get_resource_propertiesr   )rT   r   r_   r   r   r   r7	  G  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jrDt|
tj t|tjrKnt|tjrV| }n	J dt|t||
|	t  t|
 |S )Nr   r   )r   r   page_get_textpager   r^   r  r  r  fz_bound_pager{  r  _globalsrO   fz_enable_device_hintsFZ_NO_CACHErp   r   r   r   r   fz_run_pager"  fz_close_device)rT   r  rj  r  ll_tpagetpager   r  r   r  devr   r   r   _get_textpageO  s*   




zPage._get_textpager   r   c           1      C   s  t  }|  }| }|
}|}|}d}d}d}d}d}d}|dkrXt ||d}t t |tdtd}t t |tdtd}|| dkrOtt	d}d}d}d}n|rat
|}d}n	|rjt |}d}|r|j}| }| }t |}|} || d }!|!d ur|!}t | |d}d}d}d}n:| dkrt |t  }"n't |t  t  t d t  d}#d|#_d |#_t |#t  }$t ||$}"d}d}|r\t  }%trt |%| nt |%|jj|jj |r
t
|}trt |%| nt |%|jj|jj t  |%}t!|} || d }!|!d urJ|!}t | |d}t t |tdtd}t t |tdtd}d}d}nt "|}"|" }|" }|s\d}|rt#dkrt $|"}&|&jsqtd|"% }'|" }(t &|"\})}*t "|}$t '|||'|(|)|*ddt( t( |&|$}"n;t )|"j}&|&std|"% }'|" }(t &|"\})}*t "|}$t*+|||'|(j|)|*dd|&|$j
}+t |+}+d |"_|+}"|rt ,||"}|	rt-|||	 t .|}||| < d}|r[t /|0 td	},|,jst 1|0 td	d
},t 2|,td}-|-js!t 1|,tdd
}-t3|||||}.t 4|-|| t 5d}/dt6|.j7|.j8|.j9|.j:|.j;|.j<f d| d}0t =|/|0 t>||0 |/| |rb||fS |d fS )Nr   r   Widthr%	  Heightr   rE  z#uncompressed image cannot have maskr   ro   XObject2   
q
z cm
/z Do
Q
)?r^   r  r  r   r  r   r  r   r   MSG_IS_NO_IMAGEr   fz_read_filer   r   r  fz_md5_pixmap2r   r  fz_new_image_from_pixmapFzImagefz_convert_pixmapr  FzDefaultColorspacesr  r  FzMd5r]   fz_md5_update_bufferfz_md5_updater   r
  r  fz_md5_final2r   r  rt   fz_compressed_image_bufferr  r  $fz_new_image_from_compressed_buffer2rq   r  r   #fz_new_image_from_compressed_bufferpdf_add_imager!  r   r  r   r  r   calc_image_matrixr  r  rs   r
   ri  r<  r  r  rM  fz_append_stringJM_insert_contents)1rT   r/   pixmaprf  imaskr  overlayr  keep_proportionrp  r  rh  r   r  _imgnamedigestsmaskbufr   r  r   r  img_xref	rc_digestdo_process_pixmapdo_process_streamdo_have_imaskdo_have_imagedo_have_xrefrefimgbufarg_pixdigestmd5_pyr  imager  maskstatecbuf1r  r  r  r  zimgr  xobjectr'  nresr  r   r   r   _insert_imageh  s,  











.zPage._insert_imagec                 C   s   |   }| }t|||||||||	|

}t| td}t|td}|js>t	|d}t
| |tdtd t|d\}}|sKtdt||d}t||| |S )Nr   r  r   r   zcannot insert font)r  r   r  r^   r  r   r   r   r   r  r  r  r   r  r  )rT   r   r  r  r   
set_simpler  r  r  r  r  r   r  rv   r  r  r  r   font_objr   r   r   _insertFontG  s   zPage._insertFontc                 C   s8   |   }|dkrt||}nt||}|jrt|S d S rN   )r  JM_get_annot_by_nameJM_get_annot_by_xrefr   r   )rT   r   r   r   r   r   r   r   _load_annotZ  s   
zPage._load_annotc                 C   s   t || j|||||}t|S r   )JM_pixmap_from_pager   r  )rT   r   r  r  r  rL  r  r  r   r   r   _makePixmapc  s   zPage._makePixmapc                 C   s\   t t jj}t| jdd}|jr#t | |}t |r#t 	|}t 
|r*d S t|S NFr  )r^   r  r  r   r   r   r   r   r  pdf_to_rectr1  r  )rT   boxtyper   r   r   r   r   r   
_other_boxg  s   


zPage._other_boxTc                 C   s   t | j|dS )Nr  )r   r   )rT   r   r   r   r   r  r  r$   zPage._pdf_pagec                 C   s   | j   dS )z,Invalidate / delete all annots of this page.N)r  r*  rS   r   r   r   r1	  u     zPage._reset_annot_refsc                 C   sZ  |dkr|dkr|d u 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d}|j	sWt
| tdd}t|td}	|	j	skt
|tdd}	t|	}
t|
D ]}t|	|}t|}||kr|  S qtt| d	}t|td
| t|td| t|	|| |S )Nr   r   r  c   zfitzca%02i%02ir   ro   r   r   r   r   )r   r'  rt  r   r   r^   r   r   r   r   r  r+  r  r-  r)  r  r   r  r  )rT   gstater   r   r4  tCAtcar   r  r  r/  rf   r  r   opar   r   r   _set_opacityy  s<   


zPage._set_opacityc                 C   s   | j }|d u rtd|jstdd}||vrtdt|}| j}t|d |j|d  |d |j|d  }|j|j  krK|j  k rK|jkran n|j|j  kr`|j  k r`|jkshn t| d	|	| j
|d
tt| d d S )Nr  r.  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   ro   r   z not in MediaBoxr  r  )r   r   r0  r   r   rZ  rY  rX  r[  r  r   rs   rr   )rT   r	  r   r   valid_boxesmbr   r   r   _set_pagebox  s   *R$zPage._set_pageboxc                 C   s   |   }t| || d S r   )r  JM_set_resource_propertyr   )rT   r   r   r   r   r   r   r8	    r  zPage._set_resource_propertyc	                 C   sT  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rgt|t|| t|td}t|td}|jst|tdd}t||| td}t|d	 t|| t|d
 t|||| |S )Nr   fullpagerK	     z/fullpage Dor   r   rL	  z q /z Do Q )r  r{  r   r   r   r   r  JM_xobject_from_pager^   r   r  r  r  r   r  r^	  pdf_new_xobjectr!  r  r  r   r   r  r_	  )rT   
fz_srcpagerb	  r  r   rp  r  graftmaprd	  r  r'  rc_xrefrF	  tpagerefr*  xobj1subres1subresr   xobj2r  ry	  r   r   r   _show_pdf_page  s<   



zPage._show_pdf_pager  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   r   )annot_preprocessr  r7  r   annot_postprocessr  )rT   r  old_rotationr   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   )r	  r	  r^   r   r7  r	  rT   r   r	  r   r   r   r   add_circle_annot     

zPage.add_circle_annotr   r/   r  re  r  c           	   	   C   sZ   t | }z| j||||||d}W |dkr| | n|dkr%| | w w t| | |S )z"Add a 'FileAttachment' annotation.)r  re  r  r   )r	  r  r7  r	  )	rT   r  r   r/   r  re  r  r	  r   r   r   r   add_file_annot   s"   


zPage.add_file_annotr5   r   r   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.)r   r   r>  r   r  r   r  r   )r	  r  r7  r	  )rT   r   r5   r   r   r>  r   r  r   r  r	  r   r   r   r   add_freetext_annot   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  r4  r  )get_highlight_selectionCheckMarkerArgr	  r^   PDF_ANNOT_HIGHLIGHT)rT   r	  r  r4  r  r	  rG   r   r   r   add_highlight_annot<   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   )r	  r  r7  r	  )rT   r	  r	  r   r   r   r   add_ink_annotF   s   

zPage.add_ink_annotr  r  c              	   C   P   t | }z| ||}W |dkr| | n|dkr | | w w t| | |S )zAdd a 'Line' annotation.r   )r	  r  r7  r	  )rT   r  r  r	  r   r   r   r   add_line_annotT      

zPage.add_line_annotr  c              	   C   r	  )zAdd a 'Polygon' annotation.r   )r	  r	  r^   r   r7  r	  rT   r  r	  r   r   r   r   add_polygon_annot_   r	  zPage.add_polygon_annotc              	   C   r	  )zAdd a 'PolyLine' annotation.r   )r	  r	  r^   r   r7  r	  r	  r   r   r   add_polyline_annotj   r	  zPage.add_polyline_annotc              	   C   r	  )z&Add a 'Square' (rectangle) annotation.r   )r	  r	  r^   r   r7  r	  r	  r   r   r   add_rect_annotu   r	  zPage.add_rect_annotr   r?  c	              	   C   s  d}	|r_t tj|s_t| t| |sd}|sd}|s d}t|dr*|||f}t|dkr6|dd }d}
|
j|||d}	|du rGd	}|r_t|drS|||f}t|dkr_|dd }t| }z| j	|||	||d
}W |dkrx| 
| n|dkr| 
| w w t| | |r|  dd }|\}}}}}|| || || || || |d d|}||d |S )zAdd a 'Redact' annotation.Nrw  rC  rv  r  r   rI  rL  r   r   r   )r5   r  r   r   r   r   rP  rR  )ry  rS  
whitespacer$  r  r  r  ra  r	  r	  r7  r	  r   re  r2   rc  r   )rT   r  r5   r   r   r   r   r   r?  r  rm   r	  r   r  r  r  r  r  r  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rT   r	  r  r4  r  r	  r   r   r   add_squiggly_annot   s   zPage.add_squiggly_annotr	  c              	   C   r	  )z$Add a ('rubber') 'Stamp' annotation.r   )r	  r	  r7  r	  )rT   r   r	  r	  r   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   )r	  r	  r7  r	  )rT   r  r5   r  r	  r   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  r   r0  r   r  r'	  r  r}  r   r  r  r  r  r  r  )rT   r  r   r   r   r   r   
add_widget   s   zPage.add_widgetc                 C   s(   	 t |  | jdd}|jsg S t|S )z.
        page get list of annot names
        Fr  )r  r  r   JM_get_annot_id_listrT   r   r   r   r   annot_names!  s   zPage.annot_namesc                 C   r4  )zH
        List of xref numbers of annotations, fields and links.
        )JM_get_annot_xref_list2rS   r   r   r   r  !     zPage.annot_xrefsc                 #   sp    t jt jt j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   re   r
   )
skip_typesr   r   rg   !  r  zPage.annots.<locals>.<listcomp>c                    s,   g | ]}|d  v r|d   vr|d qS r  r   r	  r	  typesr   r   rg   !  s   , TN)r^   r  PDF_ANNOT_POPUPr  r  r  
load_annot_yielded)rT   r	  r  r   r   r   r	  r   rL  !  s   

zPage.annotsc                 C   H   |  d}|du r| jS | j}t|d |j|d  |d |j|d  S )z
The ArtBoxr	  Nr   r   ro   r   r	  r  r   r   rZ  rT   r   r	  r   r   r   artbox%!  
   
*zPage.artboxc                 C   r	  )zThe BleedBoxr	  Nr   r   ro   r   r	  r	  r   r   r   bleedbox.!  r	  zPage.bleedboxc                 C   s   t |  t| j}t|}t|}|jrB| jjrB| j	}|j
|j}}| jdvr-||}}tdd||}tjdd d }t| |S )zGet page rectangle.)r      r   F)r  r   )r  r   r   r^   r?	  r   r  r   r0  r  r  rh  r  r   mupdf_warningsre  r<   )rT   r   r   cbr   r  rw  r   r   r   bound7!  s   



z
Page.boundc                 C   sL   |s	| j s	|   t| jdd}|jsd S td|d}t| || d S )NFr  r   )r9  r<  )	
is_wrappedwrap_contentsr   r   r   r>  r^   pdf_filter_page_contentsr   )rT   r<  r   r@  r   r   r   rA  I!  s   
zPage.clean_contentsc                 C   s@   t |  | jdd}|jst| j}nt| }t|}|S )zThe CropBox.Fr  )	r  r  r   r^   r?	  r   r  r   r   )rT   r   r   r   r   r   r  R!  s   zPage.cropboxc                 C   r  r   )r  rw  rS   r   r   r   cropbox_position_!  r"   zPage.cropbox_positionc                 C   s   t |  t | |  }	 t|j}|snt||j qt|j}t||j t|}|rAd|_t	
| |_||jjt|< |  |S )z!Delete annot and return next one.r   T)r  r  rF  r   r^   rG  r  r   r   r  r  r   r  r  r   )rT   r   r   rK  	nextannotr   r   r   r   delete_annotc!  s$   
zPage.delete_annotc           	         s
  t  t tsdS  fdd}tjdd}|js| S  t }|dk r*| S t|	 t
d}|js:| S t|}|dkrF| S d}t|D ]}tt||}||kr] nqL||kre| S t|| t| | t|	 t
d| t| | S )	zDelete a Link.Nc                     sT    d dkrd S z d } j |  }|  W d S  ty)   tdkr&t  Y d S w )Nr   r   r  r   )r  r   r   r   r?   )linkidlinkobjlinkdictrT   r   r   finished!  s   
z"Page.delete_link.<locals>.finishedFr  r   rD  r   )r  rp   r   r   r   r   r   r^   r   r   r   rH  r  r   rI  rJ  r  r   r  rA  )	rT   r	  r	  r   r   rL  r  oxrefrf   r   r	  r   delete_linkz!  s:   

zPage.delete_linkc                 C   sD   t r
tt| jS | jdd}|jstttjj	S tt
|S )zReflects page de-rotation.Fr  )r   r&  r   Page_derotate_matrixr   r  r   r^   r  UNITr  )rT   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 r   )r   rp   r^   r  r  rj  r{  r  rC	  r"  rD	  )	rT   rF	  rj  r  r   r  r  r  rG	  r   r   r   extend_textpage!  s   zPage.extend_textpagec                 C   s^   t |  | jdd}|jsdS t|}|jsdS t|}d|_t| |_	|| j
t|< |S )zFirst annotation.Fr  NT)r  r  r   r^   pdf_first_annotr   r   r  r  r   r  r  )rT   r   r   r   r   r   r   first_annot!  s   
zPage.first_annotc                 C   r   )z$
        First link on page
        )
load_linksrS   r   r   r   
first_link!  s   zPage.first_linkc                 C   sx   t |  d}| jdd}|jsdS t|}|jsdS t|}d|_t| |_	|| j
t|< t }t|| |}|S )zFirst widget/field.r   Fr  NT)r  r  r   r^   pdf_first_widgetr   r   r  r  r   r  r  r  r   r  )rT   r   r   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  r7  r   JM_new_bbox_devicer^   rC	  r#  r"  rD	  )rT   layersr	  r   r_   
inc_layersrG	  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  r7  r   rp   r^   r   r   r?	  r   r   get_cdrawingsrq   callableJM_new_lineart_device_Devicer#  rZ  ptmrC	  r"  rD	  )
rT   extendedcallbackmethodr	  r   clipsprectr_   rG	  r   r   r   r	  !  s0   




zPage.get_cdrawingsc           	      C   s   t |  g }t| j}| }t|tj}t|r9t|}t	|D ]}t
||}t|}|| q$|S |jrFt|}|| |S )zGet xrefs of /Contents objects.)r  r   r   r   r^   r   r2	  r  rH  r  rI  r   r2   r   )	rT   rG   r   r   r!  r/  rf   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  )rT   rL  rG  r   r   r   get_displaylist'"  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r{|d }g }|D ]<}|d	 }	|d
d }
|	dkrXdt|
d	  |
d
 f}n|	dkred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.
        )
	closePathr   r|  r  lineCaplineJoinr  stroke_opacityfill_opacityeven_odd)r	  r   r  r   scissorrj  r#  r   r   Nr  quc                 S   rb   r   rv  rd   r   r   r   rg   Z"  rh   z%Page.get_drawings.<locals>.<listcomp>rL  )r	  r  r  r   r   	normalizeQuadrr   r2   r   object)rT   r	  allkeysr   rf   npathr#  newitemsr  cmdrestr'  DrawpathDrawpathlistget_lineartr   r   r   get_drawings4"  s2   
zPage.get_drawingsc              	   C   s  | j }|dkr	tS | j}|dkr$tdddd|j|j |j |j d}n'|dkr<tddddd|j|j |j |j }ntddddd|j d|j }|| j }t	t
|d }|d}t| |d}|d	v r|\}}}	}
||_||_|
|_|	|_| | | d | }|  D ]}|j| }|| q|  D ]!}|d
 | }| | ||d
< z| | W q ty   Y qw |  D ]}|j| }||_|  q|S )z;Set page rotation to 0 while maintaining visual appearance.r   r6  r   rV  r]  z cm utf8FrU  from)r  Identityr   r&  rZ  rX  rY  r[  r  rs   rr   rC  r   _insert_contentsset_mediaboxr7  rL  r   r4  	get_linksr	  insert_linkr   r_  r  )rT   r  r	  mat0r'  r
  r  rY  r[  rX  rZ  r   r   linkr  r   r   r   remove_rotation"  sN   ((







zPage.remove_rotationr   x_tolerancey_tolerancec                    s0  t |  | j|durt|| ||du r|  } fdd}fdd|D }tdd |D dd d	}g }|r|d
 
 }	d}
|
rpd}
tt|d d
dD ]}||| |	rm|	|| jO }	|	|| jO }	||= d}
qQ|
sE|	|	 |d
= tt
|dd d	}|s<tt
|dd d	} fdd|D S )a  Join rectangles of neighboring vector graphic items.

        Args:
            clip: optional rect-like to restrict the page area to consider.
            drawings: (optional) output of a previous "get_drawings()".
            x_tolerance: horizontal neighborhood threshold.
            y_tolerance: vertical neighborhood threshold.

        Notes:
            Vector graphics (also called line-art or drawings) usually consist
            of independent items like rectangles, lines or curves to jointly
            form table grid lines or bar, line, pie charts and similar.
            This method identifies rectangles wrapping these disparate items.

        Returns:
            A list of Rect items, each wrapping line-art items that are close
            enough to be considered forming a common vector graphic.
            Only "significant" rectangles will be returned, i.e. having both,
            width and height larger than the tolerance values.
        Nc           
         s   | j | jkr| j| j fn| j | jf\}}| j| jkr | j| jfn| j| jf\}}|j |jkr4|j|j fn|j |jf\}}|j|jkrH|j|jfn|j|jf\}}			 ||  k sj||  ksj|| k sj||	 krldS dS )zDetect whether r1, r2 are "neighbors".

            Items r1, r2 are called neighbors if the minimum distance between
            their points is less-equal delta.

            Both parameters must be (potentially invalid) rectangles.
            r   FTrX  rY  rZ  r[  )
r1r2rr1_x0rr1_x1rr1_y0rr1_y1rr2_x0rr2_x1rr2_y0rr2_y1delta_xdelta_yr   r   are_neighborsH#  s   (	(((z,Page.cluster_drawings.<locals>.are_neighborsc                    sT   g | ]&}	 	 |d j  j kr(|d j jkr(|d j jkr(|d j jkr|qS )r   r   rY  rX  r[  rZ  r(  )parear   r   rg   c#  s    z)Page.cluster_drawings.<locals>.<listcomp>c                 S      g | ]}|d  qS r^  r   r(  r   r   r   rg   n#  rh   c                 S      | j | jfS r   rZ  rY  r   r   r   r   rr  n#      z'Page.cluster_drawings.<locals>.<lambda>r  r   TFr   r   c                 S   r<
  r   r=
  r>
  r   r   r   rr  #  r?
  c                 S   r<
  r   r=
  r>
  r   r   r   rr  #  r?
  c                    s$   g | ]}|j  kr|jkr|qS r   r  rh  )re   r   r5
  r   r   rg   #  s   $ )r  r   r   r
  r  r  r  rw  rx  r2   ry  )rT   r  drawingsr(
  r)
  r8
  pathsprects	new_rectsr   repeatrf   r   )r6
  r7
  r:
  r   cluster_drawings(#  sB   


	zPage.cluster_drawingsc                 C      t |  | jj| j|dS )z)List of fonts defined in the page object.r  )r  r   r  r  rT   r  r   r   r   	get_fonts#     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u rz
| j||dd W S  ty   t  | Y S w |  }
t|
}t|s|S |D ]R}|d |d krqt|d }|j}|dkr|} |}|S tt|j|j}t|j|j }t|j|j }td| ddd| dd}||  }||f} |}|S |}|S )zGet rectangle occupied by image 'name'.

        'name' is either an item of the image list, or the referencing
        name string - elem[7] of the resp. item.
        Option 'transform' also returns the image transformation matrix.
        r  r   r   z!need item of full page image listc                    s   g | ]
} |d  kr|qS )rK  r   rd   r  r   r   rg   #  s    z'Page.get_image_bbox.<locals>.<listcomp>Tr   zbad image namez!found multiple images named '%s'.)r  )r  r   r   rJ  r   r   r&  r   rq   rr   r   r  r  r  get_image_rectsr   r?   r  JM_image_reporterr  r
  r   util_hor_matrixlllrry  r-  ur)rT   r   r  r   inf_rectnull_matr_   r  imglistr   r  r   rF   r	  r   hmr  r   m0r1  r   r  r   get_image_bbox#  sh   

	
zPage.get_image_bboxc                 C   rH
  )z*List of images defined in the page object.rI
  )r  r   r  r  rJ
  r   r   r   
get_images#  rL
  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,  r5	  rP  r6	  ocmd)r7	  r   r/  r2   )rT   r_   pnamer   r5   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   r{  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr,  r  r  fz_new_svg_devicerX  rY  rZ  r[  rC	  r"  rD	  rX  re  )rT   r  text_as_pathr   r  tboundstext_optionr   rY  rG	  r5   r   r   r   get_svg_image#  s(   




zPage.get_svg_imager   c                 C   sD   |}|d u r|   }nt|d| krtd||}|d u r ~|S )Nr   znot a textpage of this page)r  r   r   extractTextbox)r   r   textpager  r_   r   r   r   get_textbox#  s   

zPage.get_textboxr  rj  r  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   )rj  r  )	r  r&  r  r7  rH	  r  r  r  r   )rT   r  rj  r  r	  rh
  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	ddddd|j
|_t||t	 t  t| |dkrL| | |S Nr   r   r   )r  r  r7  r   r   r   JM_new_texttrace_devicer^   r?	  r#  rZ  r	  rC	  r"  rD	  )rT   r	  r   r_   rG	  r
  r   r   r   get_texttrace$  s    



zPage.get_texttracec                 C   rN  )z,List of xobjects defined in the page object.)r  r   r  r  rS   r   r   r   get_xobjects1$  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yq   tdkrot  Y nw |dk rz	||}d}W n ty   tdkrt  Y nw | t v rdd l}||}~|d urt|tu r|}nt|d	rt|}nt|d
r|j}ntdd }| ||||||||||
}|s|S |d }|d }t||r|S |j||d |S )Nr  r   r  r   zbad fontname chars r   )r  r  r  r  )r  china-ssjapan-skorea-srD  r   zbad fontfile)fontdict)r   r   r   rf  rg  ry  	CheckFontCheckFontInfoget_char_widthsr  r   rz  r  r   r   r?   r  r  r  r  r   r   r  r   r}	  )rT   r   r  r   r{	  r  r  r   r  	inv_charsr  r   r  r  
CJK_number
CJK_list_n
CJK_list_sr  fontfile_strr   rr
  r   r   r   insert_font6$  sx   












zPage.insert_fontc                 C   s   |   dkS )z3Check if /Contents is in a balanced graphics state.rO  )r4	  rS   r   r   r   r	  $  r  zPage.is_wrappedc                 C   s@   t | jdd}|jsdS t| td}|jsdS t|S )zPage language.Fr  NLang)r   r   r   r^   r  r   r   pdf_to_str_buf)rT   r.  r  r   r   r   r  $  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.
        Nre  )r#
  )rT   kinds	all_linksr&
  r   r   r   r  $  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   r   r   r   r	  r   r  r  r   r  r  )rT   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   rg   $  s    z#Page.load_links.<locals>.<listcomp>ro   )r  r^   fz_load_linksr   r   r  r   r  r  r   r  r  r   r0  r  )rT   r   r  link_idr   r   r   r	  $  s*   

zPage.load_linksc                 C   sb   t |  t| j}t||}|}|s|S d|_t| |_|| jt	|< t
 }t|| |}|S )zLoad a widget by its xref.T)r  r   r   JM_get_widget_by_xrefr   r  r  r   r  r  r  r   r  )rT   r   r   r   r   r  r   r   r   load_widget$  s   

zPage.load_widgetc                 C   sB   t |  | jdd}|jst| j}t|S t| }t|S )zThe MediaBox.Fr  )	r  r  r   r^   r?	  r   JM_mediaboxr   r   )rT   r   r   r   r   r   r   $  s   zPage.mediaboxc                 C   s   t | jj| jjS r   )rv  r   rX  rZ  rS   r   r   r   mediabox_size$     zPage.mediabox_sizec                 C   
   t | S )z7All /Contents streams concatenated to one bytes object.)r   _get_all_contentsrS   r   r   r   read_contents %  r  zPage.read_contentsc                 C   s"   t |  | j}|| }|| _dS )z-Refresh page after link/annot/widget updates.N)r  r   r  r   )rT   r   r   r   r   r   refresh%  s   

zPage.refreshc                 C   s(   t |  t| jdd}|jsdS t|S )zPage rotation.r   r  )r  r   r   r   JM_page_rotationr	  r   r   r   r  %  s
   zPage.rotationc                 C   s   t t| S )zReflects page rotation.)r&  r   _rotate_matrixrS   r   r   r   r  %     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^   rC	  r   r  r{  r"  )rT   r#  r1  r   r   r   r%  %  s    zPage.runc                 C      |  d|S )zSet the ArtBox.r	  r	  rT   r   r   r   r   
set_artbox!%  r  zPage.set_artboxc                 C   r
  )zSet the BleedBox.r	  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.r~   r.  r   r@  zxref is no streamr  rR  N)
r  r   r   r   r0  r  rd  rb  r  r   )rT   r   r   r   r   r   set_contents)%  s   
zPage.set_contentsc                 C   r
  )z,Set the CropBox. Will also change Page.rect.r	  r
  r
  r   r   r   set_cropbox7%  r  zPage.set_cropboxc                 C   sd   t |  t| j}|st| td dS t|}ttds#J t	|jtdt
| dS )zSet PDF page default language.r|
  r  N)r  r   r   r^   r   r   r   r  r  r  r  )rT   r  r.  r  r   r   r   r  ;%  s   

zPage.set_languagec                 C   s   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.MediaBoxr	  r	  r	  r	  N)r  r  r  r^   r0  r1  r   r2  r   r   r   r   )rT   r   r   r   r   r   r   r"
  J%  s   
zPage.set_mediaboxc                 C   s4   t |  t| j}t|}t| td| dS )zSet page rotation.r   N)r  r   r   JM_norm_rotationr^   r   r   r   )rT   r  r   r  r   r   r   r7  Y%  s   
zPage.set_rotationc                 C   r
  )zSet the TrimBox.r	  r
  r
  r   r   r   set_trimbox`%  r  zPage.set_trimboxc                 C   s   t |  t }| jdd}|jst|S ttjj}t||| t|}| j	d dkr4t
|}|S t
ddddd| jj}|S )zPage transformation matrix.Fr  r5  r   r   r   )r  r^   r#  r  r   r"  r  r  r  r  r&  r  rh  )rT   r  r   r   r   r   r   r   r  d%  s   zPage.transformation_matrixc                 C   r	  )zThe TrimBoxr	  Nr   r   ro   r   r	  r	  r   r   r   trimboxw%  r	  zPage.trimboxc                 c   sD    dd |   D }|D ]}| |}|du 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   r  r  )r^   r  r	  r   r   r   rg   %  r	  z Page.widgets.<locals>.<listcomp>N)r  r
  r  )rT   r	  widget_xrefsr   r  r   r   r   r_  %  s   

zPage.widgetsc                 C   sT   |   \}}|dkrd| }t| |d |dkr(d| d }t| |d dS dS )z,Ensure page is in a balanced graphics state.r   r\  Fs   
QrR  TN)r4	  r   r!
  )rT   pushpopprependr2   r   r   r   r	  %  s   zPage.wrap_contentsc                 C   rN  rO  rP  rS   r   r   r   r   %  rQ  z	Page.xrefzpage rectangle)r   r  )rC  NNNNr   r   ru  r  r   )Nr   N)NNNNNr   r   r   r   r   r   r   r   NN)r   r   Nr  )Nr   r   N)r   Nr   r   NNNr  )NNrC  r   NNT)r	  r  r   Nrv  )NNr   r   r  )rn
  NNFr   r   )rW   rX   rY   rU   r   r   r  r  r  r  r  r	  r	  r	  r	  r	  r	  r 	  r'	  r0	  r   r4	  r  r  r<	  r7	  rH	  rz	  r}	  r	  r	  r	  r  r1	  r	  r	  r8	  r	  r{   r   r	  r}   r	  rw  ry  r   r	  r  r  r   r	  r	  rq   r	  r	  r	  r	  r	  r  r	  r	  r	  r	  r	  r	  r  r	  r	  r  rL  r  r	  r	  r	  rA  r  r	  r	  r	  r&  r  r	  r	  r	  r	  r	  r	  r
  r
  r
  r'
  rG
  rK
  rY
  rZ
  r^
  rf
  r   ri
  r  rl
  rm
  r{
  r	  r  r  rx  r	  r	  r
  r   r
  r
  r
  r  r  r%  r
  r
  r
  r
  r  r"
  r7  r
  r  r
  r_  r	  r   r   r   r   r   r   r     s   
> )"	
 `	!7
	

!

	

>


	

,	


 ?7
`@
S










r   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tjftjtjtttfr)|\}}d}t	|t
|td|}|| _nt |ttjftjtjtttfttfrS|\}}}t	|t
|td|}|| _nut |ttjtdfttjfr|\}}t|tro|j}n	|du rxtd}t|tr|j}t|jstd|jrt||t tdt d| _n't|| _| jjsttnt |ttjfttjfr|\}}t|tr|j}t|tr|j}|}|}	|jst|	}
|
jsttnt||	}
|
| _nt |ttjfttfttfdst |ttjfttfttfrztdk rJ d|dt|dkr/|\}}}ttj }n
|\}}}}t
|}|\}}}}t|trH|jn|}t
|}t!|sct"||# |$ |||}nt"||# |$ ||ttj }|| _nNt |t%ttjfr|d d	kr|\}}t|tr|j}|| _n+t |ttjftdfr#|d }t|d
kr|d nd}t|tr|jn|}t&|ddstdt|}|js|stdt }t'|}t(|}t)|}t*|||||}|jj#|j_#|jj$|j_$|jj+|j_+|jj,|j_,	 t-|j|j| || _nt |tjtfttdttfr|\}}}}$}t|trK|j}t|tjsKJ t5|}|| | }%t }t*|||||}t|$t6t7frut8|$}&t|$}nt9|$}'|'jstdt:|'\}}(t8|$}&|%| |krtd|d|d|d|d|%d|t;|j|& || _nt |dr7|\})d}*t<|)dr|)= }+|+rt>|+},n4t<|)|*r|)j?}+|+rt>|+},n"t|)t%rt>|)},nt9|)}'|'jr|'jjstdt@|'},tA|,ttBtBtCtCtD|,E dd|,F dd\}}}tG|,\}-}.|-|j_+|.|j_,|| _nt |tHtjIftr|\}/}0tJ|/}1tK|1}2t&|0d|2d s[ttLtM|1|0d}3tN|3tOd}4tP|4tOdstP|4tOdstP|4tOdsttQtR|1|3},tA|,ttBtBtCtCtD|,E dd|,F dd\}5}}|5| _nd}6|D ]}7|6dt|7 d|7 d7 }6qtS|6d| _TdS ) a  
        Pixmap(colorspace, irect, alpha) - empty pixmap.
        Pixmap(colorspace, src) - copy changing colorspace.
        Pixmap(src, width, height,[clip]) - scaled copy, float dimensions.
        Pixmap(src, alpha=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   Nz"source colorspace must not be Noner   r   rb  rF  zCannot handle args=zY because fz_scale_pixmap() and fz_scale_pixmap_cached() are not declared in MuPDF headersr   rawro   zbad alpha valuez'cannot drop alpha for 'NULL' colorspace   zbad samples datazbad samples length w=z h= alpha=z n=z stride=z size=r   resolvebad image datar  r  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    rC   rA  )Ur  r  r^   r  r  FzIrectIRectr   rr   fz_new_pixmap_with_bboxr  r~  r   r   r  r   r  FzPixmaprp   fz_pixmap_colorspacer   r   rS	  rT	  r   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskr  rt   r  fz_infinite_irectr  fz_scale_pixmapr  r  r   r%  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  ll_fz_pixmap_copyfz_pixmap_samples_memoryviewr  strider/  r  fz_samples_setfz_samples_getr  r   r  r]  r   r  ll_fz_pixmap_copy_rawr  r   fz_new_image_from_filer   r  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTr#  r   r  r  r   r   r   r  r  r  r   r   r  rN	  r  r   _memory_view)8rT   r  r  r   r  r  spixmpixspmmpmr  r   r  r   r  src_pixr  sepsr/  src_viewpm_viewrd  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr  r  pm_isrc_irf   src_pix_alphar2  samplesr
  samples2r   r<  	imagedatar   r  rX  r  r  r   r   r  rB  rn	  r  r  r5   argr   r   r   rU   %  sZ  






	



 

$
"





4



,







zPixmap.__init__c                 C   r  r   )rd  rS   r   r   r   r|  &  r}  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  r  r   r   r   irectr  rS   r   r   r   r   &  s   zPixmap.__repr__c                 C   s   | j }t||  }t|}t|}|dkr!t|| nK|dkr,t|| n@|dkr7t|| n5|dkrBt	|| n*|dkrMt
|| n|dkrftdk r]t||| nt|||d nt|| |  t|}|S )	z!
        Pixmap._tobytes
        r   ro   r   r   r	   rK  rE  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_psrt   fz_write_pixmap_as_jpegrX  r   )rT   format_jpg_qualityr  rd  r   rY  barrayr   r   r   _tobytes&  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   ro   r   r   r	   rK  )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)rT   r/   r
  r
  r  r   r   r   	_writeIMG&  s   zPixmap._writeIMGc                 C   r  )z$Indicates presence of alpha channel.)r^   fz_pixmap_alphar   rS   r   r   r   r  &  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  )rT   rv   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  )rT   r   r  r  r_   r   r   r   color_count&  s   
zPixmap.color_countc                 C   s|   d}d}|du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)r   r  r   r
  )r
  r   r
  r#  r   r/  )rT   r  	allpixelscntpixelr  maxpixelr   r   r   color_topusage'  s   zPixmap.color_topusagec                 C   rs  )zPixmap Colorspace.)r  r^   r
  r   rS   r   r   r   r  '  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^   r
  r   r  fz_copy_pixmap_rectr  rT	  )rT   rY  r   r  r
  r   r   r   r  '  s   
zPixmap.copyc                 C   rv  )zMD5 digest of pixmap (bytes).)r^   rP	  r   r   rx  r   r   r   rq	  #'     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^   r
  r   r   fz_gamma_pixmap)rT   gammar   r   r   
gamma_with)'  s   zPixmap.gamma_withc                 C   r  )zThe height.)r^   r
  r   rS   r   r   r   r  1'  r  zPixmap.hc                 C   sH   | j }t|j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^   r
  r   r   r  r  fz_pixmap_bboxr  JM_invert_pixmap_rect)rT   r   r  r   r   r   r   invert_irect6'  s   

zPixmap.invert_irectc                 C   rv  )zPixmap bbox - an IRect object.)r^   r
  r   JM_py_from_irectr   r   r   r   r
  A'  r
  zPixmap.irectc                 C   r  )zCheck if pixmap is monochrome.)r^   fz_is_pixmap_monochromer   rS   r   r   r   is_monochromeG'  r  zPixmap.is_monochromec                 C   sf   | j }| }| |  | }dd }||d|}t|||D ]}||||}||kr0 dS q!dS )z5
        Check if pixmap has only one color.
        c                 S   s.   t  }t|D ]}|t| ||  q|S r   )rq   r  r2   r^   r
  )r  offsetr/  rG   rf   r   r   r   _pixmap_read_samplesT'  s   z0Pixmap.is_unicolor.<locals>._pixmap_read_samplesr   FT)r   r/  r   r  r  )rT   r  r/  r  r  sample0r  sampler   r   r   is_unicolorL'  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  r   )r   pixmap_nr   rS   r   r   r   n2g'  r  zPixmap.n.<locals>.n2)r   r  r  r/  r^   fz_pixmap_componentsr   )rT   r  r   r   r   r/  `'  s
   zPixmap.nr   c                 C   s   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)ry   r   r^   FzPdfocrOptionsrG  language_set2datadir_set2r   rp   r   fz_save_pixmap_as_pdfocrrV  fz_write_pixmap_as_pdfocrrX  )rT   r/   rG  r  tessdatar  r  rY  r   r   r   pdfocr_savem'  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   rK  )rG  r  r  )ry   r   r  r  r  r  )rT   rG  r  r  r  rL  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   )r  zPIL/Pillow not installedNr  r   LAr   r   RGBAr  r  )PILr  ImportErrorr<   r  r/  r  	frombytesr  rh  r
  r  r  r  r  )rT   r  kwargsr  cspacer   rX  r   r   r   pil_save'  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   rK  )r  r  r  r  )rT   r  r  r  	bytes_outr   r   r   pil_tobytes'  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   r   r   r  r\  MSG_PIXEL_OUTSIDEr  r/  r
  rr   
samples_mv)rT   r  r  r/  r
  rf   rG   r   r   r   r
  '  s   


zPixmap.pixelr&  c                 C   s   | j }t|S r   )r   r   )rT   mvr   r   r   r
  '  s   zPixmap.samplesc                 C   r  )z,
        Pixmap samples memoryview.
        )r^   r
  r   rS   r   r   r   r   '  r  zPixmap.samples_mvc                 C   r  r   )r^   fz_pixmap_samples_intr   rS   r   r   r   samples_ptr'  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
u 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   ro   r   r   r	   rK  )
r  pnmpgmppmpbmpampsdpsjpgjpegrD  r   NImage format  not in ro   r	   rK  z'%s' cannot have alphar   ro   r  zunsupported colorspace for '%s')r   r   r  r   r   r-   splitextr   rz  r   rr   r  r  r  r/  r  r  r  r
  )rT   r/   r  r
  valid_formatsr  r  r  r   r   r   r  '  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 valuesr
  c                 S   s    | | d }||d 7 }|d S )N   r  r   )r
   ri  r  r   r   r   	fz_mul255S(  s   z#Pixmap.set_alpha.<locals>.fz_mul255N)r   r  r   r
  r^   r
  r
  r
  rp   rq   rr   r  r  r   r  r   Pixmap_set_alpha_helperr]  r   r
  r
  )rT   alphavaluespremultiplyopaquematter  r  r1  r/  r   r  balenr   r  zero_outbgroundrf   r
  data_lenr'  r2  data_fixr6  r   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	u 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   ro   r   r  r   r	   rK  )r  r%  r&  r'  r(  r)  tgatpicr*  r+  r,  r-  Nr.  r/  r0  z'{output}' cannot have alphar1  z%unsupported colorspace for '{output}')r   rz  r   rr   r  r  r  r/  r  r  r  r
  )rT   r  r
  r3  r  r
  r   r   r   r  h(  s0   zPixmap.tobytesc                 C      | j }||j_||j_dS )z"Set resolution in both dimensions.N)r   r   r  r  )rT   r  r  r  r   r   r   r  (     zPixmap.set_dpic                 C   rD  )zSet top-left coordinates.N)r   r   r  r  )rT   r  r  r  r   r   r   
set_origin(  rE  zPixmap.set_originc           	      C   s   t rt| jj|||S | j}t|d| d r#t|d| d s'tt	|
 }t|D ]}|| }t|dds?ttq/t|}|| ||  }	 t|D ]}||| ||  qRdS )zSet color of pixel (x, y).r   r   r
  N)r   r   	set_pixelr   r   r%  r   r  r   r  r/  r  MSG_BAD_COLOR_SEQr^   r
  r
  r   r
  )	rT   r  r  r|  r  r/  r2  rf   r
  r   r   r   rG  (  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   r
  )
r   r/  r  r%  r   rH  r2   r  JM_fill_pixmap_rect_with_colorr  )	rT   r   r|  r  r/  r<  r2  rf   r_   r   r   r   r4  (  s   zPixmap.set_rectc                 C   s,   |dk r
t d dS t| j| d| _dS )zgDivide width and height by 2**factor.
        E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)r   r^   fz_subsample_pixmapr   r
  )rT   factorr   r   r   shrink(  s
   
zPixmap.shrinkc                 C   s2   t dkr
t| jS | j}| |  |  S )zPixmap size.r
  )rt   r^   fz_pixmap_sizer   r/  r   r  )rT   r  r   r   r   rd  (  s   zPixmap.sizec                 C   r  )z%Length of one image line (width * n).)r   r
  rS   r   r   r   r
  (  r  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)r  r/  r<   r^   fz_tint_pixmapr   )rT   blackwhiter   r   r   	tint_with(  s   zPixmap.tint_withc                 C   r  )z
The width.)r^   r
  r   rS   r   r   r   r   (  r  zPixmap.wc                 C   sD   |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)	is_convexr   r	  r-  rS
  rR
  rQ
  r^   fz_warp_pixmapr   r  )rT   r  r  rh  r	  r  r  r   r   r   warp(  s
   zPixmap.warpc                 C   r  )zx component of Pixmap origin.)r^   fz_pixmap_xr   rS   r   r   r   r  (  r  zPixmap.xc                 C   r  )zResolution in x direction.)r   r  rS   r   r   r   r  (  r  zPixmap.xresc                 C   r  )zy component of Pixmap origin.)r^   fz_pixmap_yr   rS   r   r   r   r  (  r  zPixmap.yc                 C   r  )zResolution in y direction.)r   r  rS   r   r   r   r  (  r  zPixmap.yresrt  r
  r   )r   NN)Tr  N)Nr$  )Nr   NN)r  r$  )3rW   rX   rY   rU   r|  r   r
  r
  r  r  r
  r
  r
  r  r  rq	  r
  r  r
  r
  r  r  r/  r  r  r  r  r
  r   r
  r   r#  r  rA  r  r  rF  rG  r4  rL  rd  r
  rQ  r   rT  r  r  r  r  r  rh  r   r   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
 Zdd Zddd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 )+rv  c                 C   s   t | j| j | j| j  S r   )r  r  r  r  rS   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  ro   Point: bad seq lenr   r   r  rv  r  r  r  r   rT   rO  r   r   r   r  )  
   
zPoint.__add__c                 C   r  rN   r  rS   r   r   r   r  )  r   zPoint.__bool__c                 C   r!  )Nr|  Fro   r"  r[  r   r   r   r#  )  r$  zPoint.__eq__c                 C   s   | j | jf| S r   r  r  rB  r   r   r   r  )  r  zPoint.__getitem__c                 C      t t| S r   rT  rr   rS   r   r   r   rU  )  r  zPoint.__hash__Nr]  c                G   s   |s	d| _ d| _nct|dkrtdt|dkr(t|d | _ t|d | _nDt|dkrh|d }t|tjtjfrD|j | _ |j| _n(t	|ddu rOtdt|dkrYtdt|d | _ t|d | _ntd|d	urs|| _ |d	ur||| _d	S d	S )
z
        Point() - all zeros
        Point(x, y)
        Point(Point) - new copy
        Point(sequence) - from 'sequence'

        Explicit keyword args x, y override earlier settings if not None.
        r#  ro   rY  r   r   r  FzPoint: bad argsN)
r  r  r  r   r  rp   r^   r  fz_pointr  )rT   r  r  r  r  r   r   r   rU   )  s,   	
zPoint.__init__c                 C   r  Nro   r   rS   r   r   r   r|  <)  r   zPoint.__len__c                 C   s2   t |drt| j| | j| S t| }||S Nr  )r  rv  r  r  r  )rT   r1  rO  r   r   r   r1  ?)  s   

zPoint.__mul__c                 C   s   t | j | j S r   )rv  r  r  rS   r   r   r   r2  E)  r  zPoint.__neg__c                 C   r  rN   r  rS   r   r   r   r3  H)  r   zPoint.__nonzero__c                 C   r4  r   r
  rS   r   r   r   r5  K)  r   zPoint.__pos__c                 C   r6  )Nrv  r7  rS   r   r   r   r   N)  r  zPoint.__repr__c                 C   s4   t |}|dkr|| _d S |dkr|| _d S td)Nr   r   r8  )r  r  r  r@  r9  r   r   r   r:  Q)  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 rX  rZ  r[  r   r   r   r;  Y)  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  rv  r  r  r=  r>  r  )rT   r1  r.  rO  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  rD  rv  r  r  ry  rT   r  r   r   r   abs_uniti)  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 givenro   r  z$arg1 must be point-like or rect-liker   r  )r$  r$  )r$        R@)gRQ@re  )gffffff9@re  )r  incmmmr#  )r  r   rv  r   r   ry  top_leftbottom_rightr  rX  r  rZ  distance_tor[  	top_rightrY  bottom_left)rT   r  r  uniturM  r   r   r   r   rk  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.r	   r  )r  r   util_transform_pointr  r  r~  r   r   r   r  )  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  rD  rv  r  r  rc  r   r   r   rn  )  s
   

z
Point.unit)rW   rX   rY   r  r  r  r#  r  rU  rU   r|  r1  r2  r3  r5  r   r:  r;  r@  r  rd  rk  r  rn  rQ  rR  r   r   r   r   rv   )  s2    "	
2
rv  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ddd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/d0 Zd1d2 ZeZed3d4 Zed5d4 ZdS )6r
  c                 C   s*   | j rdS t| j| j t| j| j  S Nr#  )r  ry  r-  rS
  rQ
  rS   r   r   r   r  )  s    zQuad.__abs__c                 C   z   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  Quad: bad seq lenr   r   ro   r   r  r
  r-  rS
  rQ
  rR
  r  r   rT   r	  r   r   r   r  )  
   
&6zQuad.__add__c                 C      | j  S r   r  rS   r   r   r   r  )  r   zQuad.__bool__c                 C   s   z|  }W n ty   tdkrt  Y dS w |dkr!t|| S |dkr'dS t|rDt|jr2dS t|d d | oCt|dd  | S t|r[t	dD ]}t|| | sX dS qLdS dS )Nr   Fro   r  T)
r|  r   r   r?   util_point_in_quad	CheckRectr   r  	CheckQuadr  )rT   r  r  rf   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 Nr|  Fr  r   r   ro   r   )r  r  r-  rS
  rQ
  rR
  )rT   r  r   r   r   r#  )  s   
zQuad.__eq__c                 C      | j | j| j| jf| S r   r-  rS
  rQ
  rR
  rB  r   r   r   r  )  r  zQuad.__getitem__c                 C   r^  r   r_  rS   r   r   r   rU  )  r  zQuad.__hash__Nr  c                G   sV  |st   | _ | _ | _| _nst|dkrtdt|dkr.tt |\| _| _| _| _nUt|dkr|d }t|t	j
r\|| _t |jt |jt |jt |jf\| _| _| _| _n't|ddu rgtdt|dkrqtdtt |\| _| _| _| _ntd|durt || _|durt || _|durt || _|durt || _dS dS )	z
        Quad() - all zero points
        Quad(ul, ur, ll, lr)
        Quad(quad) - new copy
        Quad(sequence) - from 'sequence'

        Explicit keyword args ul, ur, ll, lr override earlier settings if not
        None.
    
        r  rt  r   r   r  FzQuad: bad argsN)rv  r-  rS
  rQ
  rR
  r  r   rd  rp   r^   FzQuadr   r  )rT   r-  rS
  rQ
  rR
  r  r  r   r   r   rU   )  s*   6zQuad.__init__c                 C   r  Nr  r   rS   r   r   r   r|  *  r   zQuad.__len__c                 C   s   t | }||}|S r   )r
  r  )rT   r1  r	  r   r   r   r1  *  r  zQuad.__mul__c                 C      t | j | j | j | j S r   )r
  r-  rS
  rQ
  rR
  rS   r   r   r   r2  *  rW  zQuad.__neg__c                 C   rx  r   ry  rS   r   r   r   r3  *  r   zQuad.__nonzero__c                 C   r4  r   )r
  rS   r   r   r   r5  *  r   zQuad.__pos__c                 C   r6  )Nr
  r7  rS   r   r   r   r   "*  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   ro   r   r8  )rv  r-  rS
  rQ
  rR
  r@  r9  r   r   r   r:  %*  s   zQuad.__setitem__c                 C   z   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 rs  ru  rv  r   r   r   r;  .*  rw  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  )rT   r1  imr	  r   r   r   r@  5*  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-  rR
  rQ
  rS
  r  )rT   r1  r  r  r   r   r   rR  @*  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  rD  rh  rS   r   r   r   r  V*  s   zQuad.is_emptyc                 C   r  )z(Check whether this is the infinite quad.)r   r  rS   r   r   r   r  ^*  r	  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-  rS
  rR
  ry  rD  rQ
  )rT   siner   r   r   is_rectangularc*  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   )r  INFINITE_QUADr&  rO  r  r  )rT   rO  r1  deltar	  r   r   r   rz  |*  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 r   )r   r!  r-  r  rS
  rR
  rQ
  rY  r  r[  rt  rX  rZ  rT   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  r	   r  )r  r  r   r-  rS
  rQ
  rR
  r~  r   r   r   r  *  s   
zQuad.transformc                 C   "   t t| j| j t| j| j S r   )rt  ry  r-  rS
  rQ
  rR
  rS   r   r   r   rr  *  r	  zQuad.<lambda>c                 C   r  r   )rt  ry  r-  rQ
  rS
  rR
  rS   r   r   r   rr  *  r	  )rW   rX   rY   r  r  r  r-  r#  r  rU  rU   r|  r1  r2  r3  r5  r   r:  r;  r@  r  rR  r  r  r  rz  r   r  rQ  r  rh  r   r   r   r   r
  )  sB    
#	





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ddddd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ed/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zed9d: Zed;d< Z ed=d> Z!d?d@ Z"dAdB Z#dCdD Z$edEdF Z%dGdH Z&edIdJ Z'edKdL Z(dMdN Z)dOdP Z*edQdR Z+eZ,eZ-eZ.ee&Z/e'Z0e(Z1dS )Sr   c                 C   s(   | j s| jrdS | j| j | j| j  S rq  )r  r  rX  rY  rZ  r[  rS   r   r   r   r  *  s   zRect.__abs__c                 C   rr  Nr  r  Rect: bad seq lenr   r   ro   r   r  r   rY  r[  rX  rZ  r  r   r[  r   r   r   r  *  rw  zRect.__add__c                 C   s,   t |ds	tdt|}t| }||S )Nr|  bad operand 2)r  r   r   	intersectrT   r  r+
  r   r   r   r   __and__*  s
   

zRect.__and__c                 C   r  rN   r  rS   r   r   r   r  *  r   zRect.__bool__c                 C   s   t |dr|t| v S t|}|dkrt|| S |dkret }zt|}W n ty:   tdkr3t  t	|j
}Y nw | j|j  koM|j  koM| jkn  od| j|j  kob|j  kob| jkS   S dS )Nr  ro   r  r   F)r  rr   r  util_is_point_in_rectINFINITE_RECTr   r   r   r?   r
  r   rY  rX  r[  rZ  )rT   r  r  r   r   r   r   r-  *  s&   

*"zRect.__contains__c                 C   r!  )Nr|  Fr  r"  r
  r   r   r   r#  *  r$  zRect.__eq__c                 C   r  r   rY  r[  rX  rZ  rB  r   r   r   r  *  r  zRect.__getitem__c                 C   r^  r   r_  rS   r   r   r   rU  *  r  zRect.__hash__Np0r  rY  r[  rX  rZ  c             	   G   sL   t |||||||d\}}}}t|| _t|| _t|| _t|| _dS )aa  
        Rect() - all zeros
        Rect(x0, y0, x1, y1)
        Rect(top-left, x1, y1)
        Rect(x0, y0, bottom-right)
        Rect(top-left, bottom-right)
        Rect(Rect or IRect) - new copy
        Rect(sequence) - from 'sequence'
    
        Explicit keyword args p0, p1, x0, y0, x1, y1 override earlier settings
        if not None.
        r  N)util_make_rectr  rY  r[  rX  rZ  rT   r  r  rY  r[  rX  rZ  r  r   r   r   rU   *  s
    


zRect.__init__c                 C   r  r  r   rS   r   r   r   r|  *  r   zRect.__len__c                 C   sF   t |drt| j| | j| | j| | j| S t| }||}|S rb  )r  r   rY  r[  rX  rZ  r  )rT   r1  r   r   r   r   r1  *  s
   
&
zRect.__mul__c                 C   r  r   )r   rY  r[  rX  rZ  rS   r   r   r   r2  *  rW  zRect.__neg__c                 C   r  rN   r  rS   r   r   r   r3  *  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)Nr|  r  ro   r  )r  r   r   r  include_pointinclude_rect)rT   r  r   r   r   r   __or__*  s   


zRect.__or__c                 C   r4  r   r   rS   r   r   r   r5  +  r   zRect.__pos__c                 C   r6  )Nr   r7  rS   r   r   r   r   +  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r  )r  rY  r[  rX  rZ  r@  r9  r   r   r   r:  +     zRect.__setitem__c                 C   r  r  r  r[  r   r   r   r;  +  rw  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   rY  r[  rX  rZ  r=  r>  r  )rT   r1  r  r   r   r   r   r@  +  s   
6
zRect.__truediv__c                 C      t | j| jS zBottom-left corner.rv  rY  rZ  rS   r   r   r   rm  #+  r
  zRect.bottom_leftc                 C   r  zBottom-right corner.rv  rX  rZ  rS   r   r   r   rj  (+  r
  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      t d| j| j S rN   rt  rZ  r[  rS   r   r   r   rh  1+  r
  zRect.heightc                 C   s2   t |dkr
tdt| |\| _| _| _| _| S )zExtend to include point-like p.ro   rY  )r  r   util_include_point_in_rectrY  r[  rX  rZ  r[  r   r   r   r  5+     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   r  r
  r
  rY  r[  rX  rZ  r  util_union_rectr  r   r   r   r  <+  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   r  rY  r[  rX  rZ  r  util_intersect_rectr  r   r   r   r  K+  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   r  r  r  r  r   r   r   
intersects\+  s   zRect.intersectsc                 C      | j | jkp| j| jkS z True if rectangle area is empty.r9
  rS   r   r   r   r  f+     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.rY  r[  r
  rX  rZ  r
  rS   r   r   r   r  k+     8zRect.is_infinitec                 C      | j | jko| j| jkS zTrue if rectangle is valid.r9
  rS   r   r   r   is_validp+  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.r  r  r  rz  rT   rO  r1  r   r   r   rz  u+     z
Rect.morphc                 C   r  )Nc                 S   r  r   r   r  r   r   r   rg   ~+  rh   zRect.norm.<locals>.<listcomp>r  rS   r   r   r   rR  }+  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.r*
  rS   r   r   r   r
  +  
   zRect.normalizec                 C      t | j| j| j| jS z!Return Quad version of rectangle.r
  rw  trblrx  rS   r   r   r   r  +  r  z	Rect.quadc                 C   r^  )zReturn the IRect.)r
  util_round_rectrS   r   r   r   r'  +  r  z
Rect.roundc                 C   r  zTop-left corner.rv  rY  r[  rS   r   r   r   ri  +  r
  zRect.top_leftc                 C   r  zTop-right corner.rv  rX  r[  rS   r   r   r   rl  +  r
  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   r  r  r   r&  rY  r[  r  rh  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.r	   r  )r  r   util_transform_rectrY  r[  rX  rZ  r~  r   r   r   r  +  r  zRect.transformc                 C   r  rN   rt  rX  rY  rS   r   r   r   r  +  r
  z
Rect.width)2rW   rX   rY   r  r  r  r  r-  r#  r  rU  rU   r|  r1  r2  r3  r  r5  r   r:  r;  r@  r  rm  rj  r  rh  r  r  r  r  r  r  r  rz  rR  r
  r  r'  ri  rl  r  r  r  rQ  r  rx  r
  rw  r  r   r   r   r   r   *  sr    



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







r   c                %   @   s  e Zd ZdZdefddZdTd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	dTded%ed&e
d'efd(d)Z	*dUdedefd+d,Z	*dUdeded-e
fd.d/Z	0	1		2	2		3			0	0	2dVd4e
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	2dWd%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"dRdS Z#dS )XShapezCreate a new shape.r   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  r   r   r   r0  r   r
  r  rh  r  r  r	  r  pctmipctmr  	text_cont	totalcontr  r   r	  r   r   r   rU   +  s    





zShape.__init__Trb	  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  r   r  r  rC  r   r!
  r^   pdf_update_streamr   r  r   r  )rT   rb	  r   r   r   r   commit+  s   

zShape.commitr  r  p3p4c                 C   s   t |}t |}t |}t |}| j|ks(t|| j }|  jt| d7  _tt|| j t|| j  t|| j  }|  jt| d7  _| | | | | | | | || _| jS )z#Draw a standard cubic Bezier curve. m
 c
)rv  r  JM_TUPLEr  r  rs   rq   
updateRect)rT   r  r  r  r  r  r   r   r   draw_bezier+  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.radius must be positiver   r5  F)
fullSector)rD  r   rv  draw_sector)rT   r  r  r  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?)rv  r  )rT   r  r  r  kappak1k2r   r   r   
draw_curve	,  s   zShape.draw_curvec                 C   s   t |}t |}| j|ks%|  jtt|| j d 7  _|| _| | |  jtt|| j d 7  _| | || _| jS )zDraw a line between two points.r   l
)rv  r  r  rs   r  r  r  )rT   r  r  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tt|| j d 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   r  r
  r-  rS
  rR
  rQ
  r  r  rs   r  r  r  r  r   )rT   r  r	  mtmrr	  mlr   r   r   	draw_oval&,  s&   
 zShape.draw_ovalr  c                 C   s   t |D ]>\}}|dkr+| jt|ks*|  jttt|| j d 7  _t|| _n|  jttt|| j d 7  _| | qt|d | _| jS )z%Draw several connected line segments.r   r  r  r   )rl  r  rv  r  rs   r  r  r  )rT   r  rf   rO  r   r   r   draw_polyline>,  s   $
$zShape.draw_polyliner  c                 C   s&   t |}| |j|j|j|j|jgS )zDraw a Quad.)r
  r  r-  rQ
  rR
  rS
  )rT   r  r	  r   r   r   	draw_quadL,  s   zShape.draw_quadr   c                 C   sV   t |}tt|j| j |j|jg }|  jt|d 7  _| 	| |j
| _| jS )zDraw a rectangle.z re
)r   r  rq   r  r  r  rh  r  rs   r  rw  r  )rT   r   r   r  r   r   r   	draw_rectQ,  s    
zShape.draw_rectr  betar  c                 C   s  t |}t |}dd }dd }dd }t| }ttd|d }	ttd	|}
|
d
 }t|d
tj krH||	7 }t|d
tj ks;| j|ks^|  j|t|| j	 7  _|| _t dd}|}|}|| }t|}|t
kswt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.c                 S      t | |fd S )Nr  rs   r
   ri  r   r   r   l3e,  r  zShape.draw_sector.<locals>.l3c                 S   s   t | |||||fd S )Nr  r  r%  r   r   r   l4g,  r  zShape.draw_sector.<locals>.l4c                 S   r  )Nr  r  r  r   r   r   l5i,  r  zShape.draw_sector.<locals>.l5r5  r   r6  ro   r   r  r   r  r   MbP?)rv  r  r&  copysignry  pir  r  r  r  rD  r   horizontal_angler  r(  r  r)  rq   )rT   r  r  r  r  r  r  r  betarw360w90w45r   r  r  ru  rF  alfaq1q2r+
  r,
  r  kappahr  cp1cp2beta2r   r   r   r  [,  s|   


""
"
(

""
"
(
zShape.draw_sectorro   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   ro   )rv  ry  r   r'  r   r&  r   _hor_matrixr  r2   r  r  )rT   r  r  breadthru  rF  r
  r	  r  i_matr'  r  rf   rO  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   )rv  ry  r   r'  r   r&  r   r
  r  r2   r  )rT   r  r  r  ru  rF  r
  r	  r  r  r  rf   rO  r   r   r   draw_zigzag,  s(   zShape.draw_zigzagr   r  r   Fr  r|  r   r

  r
  r  r
  rz  r	
  r
  r
  rp  c              	   C   s<  | j dkrdS |dkrd}n|du rd}t|d}t|d}| j|}|dur3d| | j  | _ d}nd}| jj||
d}|durId	| | j  | _ |d
kr\|dkr\|  j t|d 7  _ |dkrhd| | j  | _ |dkrtd| | j  | _ |dvrd| | 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
  | }tt|| j  d | _ |  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<  rM  /OC /%s BDC
EMC
r   r   /%s gs
r    w
z%i J
z%i j
)Nr%   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
 cm
rM	  Q
)r  rB  r   r<	  r	  rs   r  
CheckMorphr&  r  rh  r  r  r  )rT   r  r|  r   r

  r
  r  r
  rz  r	
  r
  r
  rp  	color_strfill_stroptcontemcr  r.  r'  r   r   r   finish,  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   )rv  rn  r  asinry  r  r  r  )r  r  ru  r  r   r   r   r  E-  s   



zShape.horizontal_anglerC  rn
  r   r   r  r   r  r{	  r  render_modery  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<   t
  Y dS w |}|drJ|dd  }| jj||||d}t| j|}|d }|d }|d	 }|d
 }|d }|d }|ry|| }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}(d})d}*| j}+| j},|$r1tdddd|d j| j |+|d j | j }-|- |d  |- }.tt|.d }/nd}/|+|j | j }0|j| j }1|0}2|%dkrb|+|j | j }1|j | j }0|/|(7 }/|,t|0 }2n>|%dkr|+ |j | j }1|j| j }0|/|)7 }/t|0}2n!|%dkr|j | j }1|+ |j | j }0|/|*7 }/t|j| j }2| j|}3|3d urd |3 }4d!}5nd }4}5| jj||d"}6|6d u rd}6nd#|6 }6|&|4|6|/|1|0||}7|dkr|7d$| 7 }7|dkr|7t|d% 7 }7|	d ur|7|"7 }7|
d ur|7|#7 }7|7|d 7 }7d}8t|dkr|7|'|7 }7n|7d&7 }7t dt|D ]#}9|2|k r( n|9dkr1|7d'7 }7|7||9 d& 7 }7|2|8 }2|8d7 }8q|7d(|5 7 }7|  j!|77  _!|8S ))Nr   c                 S   rb   r   r  r  r   r   r   rg   {-  rh   z%Shape.insert_text.<locals>.<listcomp>rk   r  r   )r   r  r  r{	  r  simpler   r  r  333333?r
  glyphs)SymbolZapfDingbatsr<  rM  r6  zbad rotate valuer5  c                 S   s0   d|  | d| dt ||f d| d| dS )NrM	  zBT
%1 0 0 1 z Tm
/rk   z Tf r  r
   ri  r<  r  r  rM  r  r   r   r   rr  -     0 z#Shape.insert_text.<locals>.<lambda>c                 S   s   dt |  dS )NzTJ
0 -z TD
r  r
   r   r   r   rr  -  r)  z0 1 -1 0 0 0 cm
z0 -1 1 0 0 0 cm
z-1 0 0 -1 0 0 cm
r  r%   rV  r	  r  r  r  r  z%i Tr z w TJz
T* z
ET
%sQ
)"r  r   rq   rr   re  r  rv  rt  rc  r   r?   r   r   r{
  rt
  r   ru
  r2   getTJstrrB  r  r   rh  r  r&  r  r  rs   r  ry  r<	  r	  r  r  ):rT   r  r   r   r  r   r  r{	  r  r|  r   r  ry  r  rz  r
  r
  rp  r5   maxcoder  r   fontinforr
  r  r   r  r  r  lheightr"  tabr   r  r  r  morphingr  templ1templ2cmp90cmm90cm180rh  r  r.  r'  rg  topr  spacer  bdcr  r  ry	  nlinesrf   r   r   r   r  Y-  s   






.











zShape.insert_textc                 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 ra  )r   r  r   rv  r!  rY  r  r[  r  rt  rX  rZ  r  r   r   r   update_rect.  s   
zShape.update_rectr  )ro   )r   r  Nr   r   NFNTr   r   r   )rC  Nrn
  Nr   r   NNr   r   r   Nr   r   r   )$rW   rX   rY   r[  r   rU   r  r  r{   r  r  r  r  r  rw  rx  r|   r}   r  rq   r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r9  r   r   r   r   r  +  s"   


Q
)
	

[
	

 5r  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d0ddZed0ddZd/ddZG dd  d Zd1d#d$Zd2d&d'Zd3d)d*Zd3d+d,ZdS )4Storyr%   NrH  c                 C   sp   t |d}|rt|tst|}|r|jnt d }tt dr-t ||||| _d S t 	||||| _d S )NrN  FzStoryS)
r^   r  rC  rp   r  r   rb  r  r;  FzStory)rT   htmluser_cssemr{  r   archr   r   r   rU   $.  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   Nro   r  r   123456r  h_id_)r  r`   r!  r  r7  r9  r  )rT   domrf   r  r   attrid_r   r   r   add_header_ids..  s   $

zStory.add_header_idsc                 C   sj  t | tr| }ntd| }t }|D ]}|jd@ r'|jr'|j|v r"q|||j< q|D ]}|jd@ r|jrt }t|j|d< |jdr|jdd }z|| }W n t	yo }	 zt
dkr`t  td| d| |	d}	~	ww 	 t|d< |j\}
}}}t|
||d< |jd |d< n|jdrt|d< |jdd |d< n	t|d< |j|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 `positions` has `id =
        name`.
        r  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:re  rn  r   zname:r   r   r  )rp   r   r   
open_closer  r\  r   r   r   r   r   r?   r   r9   ri  rv  page_numrm  rh  r$
  )document_or_stream	positionsr   id_to_positionpositionposition_fromr&
  	target_idposition_tor  rY  r[  rX  rZ  r   r   r   add_pdf_linksA.  sH   




zStory.add_pdf_linksc                 C   s   |   }| S r   )r   ru  rT   rC  r   r   r   r  .  s   z
Story.bodyc                 C   rv  r   )r^   fz_story_documentr   r  rQ  r   r   r   r   .  rz  zStory.documentc                 C   s0   t |}|r	|jntd }t| j|| d S r   )r{  r   r^   r  fz_draw_story)rT   r  r  ctm2rG	  r   r   r   draw.  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rW   rX   rY   r   r   r   r   	Position2.      rX  )rj  headingr  r  r   r5   rG  rectangle_numrect_numr\  r#  setattr)rL  rX  	position2r'  rF   r  r1   r   r   	function2.  s   z*Story.element_positions.<locals>.function2N)r   r   r  r   isidentifierr   r	  __code__co_argcountr^   fz_story_positionsr   )rT   r1   r  r'  r`  r   r_  r   element_positions.  s   zStory.element_positionsc                 C   s,   t |}t }t| j||}|t|fS r   )r  r^   r  fz_place_storyr   r  )rT   wherefilledmorer   r   r   place.  s   zStory.placec                 C   r  r   )r^   fz_reset_storyr   rS   r   r   r   r  .  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| ||d |  ||}|rV| ||d | ||
 |sk|rg| ||d |  n| d |
 |svd S q)Nr   r   c                    s    | _ |  d S r   )rH  rL  rH  
positionfnr   r   positionfn2.  s   z Story.write.<locals>.positionfn2)r   rj  re  r  r  rU  )rT   writerrectfnrn  pagefnrG	  r\  rh  r   r   r  ri  ro  r   rm  r   rM  .  s@   

zStory.writeTc	                    s~   t  d }		 |	}
|}	d|	|
krd|	}t||||}|r#|  t   fdd}|r4| nd ||| r>d S q)Nr   FTc                    s&    |  r r |  d S d S d S r   r2   rl  rn  rJ  stabler   r   ro  /  s   
z+Story.write_stabilized.<locals>.positionfn2)rq   r:  rF  rM  )rp  	contentfnrq  r>  r?  rn  rr  r{  rF  r  content_prevcontent2storyro  r   rt  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 r   rs  rl  rn  rJ  r   r   ro  /     
z6Story.write_stabilized_with_links.<locals>.positionfn2r   )r  r  r  r:  rz  r:  r  rP  )rv  rq  r>  r?  rn  rr  r{  rF  rf  rp  ro  r   r|  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                    r{  r   rs  rl  r|  r   r   ro  (/  r}  z+Story.write_with_links.<locals>.positionfn2)rn  rr  r   )r  r  r  rM  r:  r  r:  rP  )rT   rq  rn  rr  rf  rp  ro  r   r|  r   write_with_links#/  s   
zStory.write_with_linksc                   @   s"   e Zd ZdZdddZdd ZdS )zStory.FitResulta  
        The result from a `Story.fit*()` method.
        
        Members:
        
        `big_enough`:
            `True` if the fit succeeded.
        `filled`:
            From the last call to `Story.place()`.
        `more`:
            `False` if the fit succeeded.
        `numcalls`:
            Number of calls made to `self.place()`.
        `parameter`:
            The successful parameter value, or the largest failing value.
        `rect`:
            The rect created from `parameter`.
        Nc                 C   s(   || _ || _|| _|| _|| _|| _d S r   
big_enoughrh  ri  numcalls	parameterr   )rT   r  rh  ri  r  r  r   r   r   r   rU   E/  s   
zStory.FitResult.__init__c                 C   s4   d| j  d| j d| j d| j d| j d| j S )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=r  rS   r   r   r   r   M/  s   
zStory.FitResult.__repr__r  )rW   rX   rY   r[  rU   r   r   r   r   r   	FitResult2/  s    
r  r  Fc           
         s  fddt ttfsdu sJ t ttfs du s J G fddd}| r=djdjd   fd	d
} fdddd }jdu rurcd |jd}		 |	son|	d9 }	qjnjrrdjd | S jdu rrd |jd}		 |	rn|	d9 }	qnjsd_rdjd | S rʈdjdjd 	 jj |k r| S jj d }	|	 q)aB  
        Finds optimal rect that contains the story `self`.
        
        Returns a `Story.FitResult` instance.
            
        On success, the last call to `self.place()` will have been with the
        returned rectangle, so `self.draw()` can be used directly.
        
        Args:
        :arg fn:
            A callable taking a floating point `parameter` and returning a
            `pymupdf.Rect()`. If the rect is empty, we assume the story will
            not fit and do not call `self.place()`.

            Must guarantee that `self.place()` behaves monotonically when
            given rect `fn(parameter`) as `parameter` increases. This
            usually means that both width and height increase or stay
            unchanged as `parameter` increases.
        :arg pmin:
            Minimum parameter to consider; `None` for -infinity.
        :arg pmax:
            Maximum parameter to consider; `None` for +infinity.
        :arg delta:
            Maximum error in returned `parameter`.
        :arg verbose:
            If true we output diagnostics.
        c                    s    sJ t d|   d S )Nzfit(): r<   r;   )verboser   r   r9   s/  r  zStory.fit.<locals>.logNc                       s   e Zd Z fddZdS )zStory.fit.<locals>.Statec                    s<   | _  | _d | _d | _d | _d| _r| _ | _d S d S rN   )pminpmaxpmin_resultpmax_resultr  r  pmin0pmax0rS   r  r  r  r   r   rU   {/  s   
z!Story.fit.<locals>.State.__init__NrV   r   r  r   r   Statez/  s    r  zstarting. state.pmin= state.pmax=ri   c               	      s   j d urjj krr d j } | sJ j}njr$jntjjd}r@ djdjdj d| |S )NzCCalling update() with pmax, because was overwritten by later calls.)r  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  r:  r  r  r  r  )r  r  )r9   ru	  r  r  r   r   rG   /  s   

&zStory.fit.<locals>.retc              
      s    | }t |tsJ dt|d||jr)d}tj| jd}r(d n2|\}} jd7  _| }tj||j| ||d}r[djd	d
|d| d|d	 |rd| _|_	n| _
|_| _|S )a  
            Evaluates `more, _ = self.place(fn(parameter))`. If `more` is
            false, then `rect` is big enough to contain `self` and we
            set `state.pmax=parameter` and return True. Otherwise we set
            `state.pmin=parameter` and return False.
            ztype(rect)=r  F)r  r  z9update(): not calling self.place() because rect is empty.r   )rh  ri  r  r  r   r  zupdate(): called self.place(): z>2dz: more=r  ri   )rp   r   r   r  r:  r  r  rj  r  r  r  r  r  )r  r   r  r  ri  rh  )fnr9   rT   ru	  r  r   r   r  /  s8   "&zStory.fit.<locals>.updatec                 S   s.   | du s| dkr
|S ||  dkrd|  S |  S )z
            Returns same sign as `direction`, larger or smaller than `p` if
            direction is positive or negative respectively.
            Nr   ro   r   )rO  	directionr   r   r   opposite/  s
   zStory.fit.<locals>.oppositezfinding pmin.r   r   ro   zstate.pmin=z is big enough.zfinding pmax.z No solution possible state.pmax=z$doing binary search with state.pmin=)rp   r   r  r  r  r  )
rT   r  r  r  r  r  r  rG   r  r  r   )r  r9   r  r  rT   ru	  r  r  r   fitW/  sV   %



z	Story.fitr   c           	         s@   |\}}| |   fdd}|  |||||S )ao  
        Finds smallest value `scale` in range `scale_min..scale_max` where
        `scale * rect` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height:
            height of rect.
        :arg scale_min:
            Minimum scale to consider; must be >= 0.
        :arg scale_max:
            Maximum scale to consider, must be >= scale_min or `None` for
            infinite.
        :arg delta:
            Maximum error in returned scale.
        :arg verbose:
            If true we output diagnostics.
        c                    s   t |   |    S r   r  )scalerh  r  rY  r[  r   r   r  0  rW  zStory.fit_scale.<locals>.fnr  )	rT   r   	scale_min	scale_maxr  r  rX  rZ  r  r   r  r   	fit_scale/  s
   zStory.fit_scalerO  c                    s2   |\  |  fdd}|  |||||S )a  
        Finds smallest height in range `height_min..height_max` where a rect
        with size `(width, height)` is large enough to contain the story
        `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height_min:
            Minimum height to consider; must be >= 0.
        :arg height_max:
            Maximum height to consider, must be >= height_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned height.
        :arg verbose:
            If true we output diagnostics.
        c                    s   t  |  S r   r  )rh  rY  rX  r[  r   r   r  "0  r  zStory.fit_height.<locals>.fnr  )rT   r  
height_min
height_maxoriginr  r  r  r   r  r   
fit_height
0     zStory.fit_heightc                    s2   |\ |  fdd}|  |||||S )a  
        Finds smallest width in range `width_min..width_max` where a rect with size
        `(width, height)` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.
        Returns a `FitResult` instance.

        :arg height:
            height of rect.
        :arg width_min:
            Minimum width to consider; must be >= 0.
        :arg width_max:
            Maximum width to consider, must be >= width_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned width.
        :arg verbose:
            If true we output diagnostics.
        c                    s   t   |  S r   r  )r  rY  r[  rZ  r   r   r  >0  r  zStory.fit_width.<locals>.fnr  )rT   rh  	width_min	width_maxr  r  r  r  r   r  r   	fit_width&0  r  zStory.fit_width)r%   NrH  Nr   rt  )NrH  NNNT)NNr  F)r   Nr  F)r   NrO  r  F)rW   rX   rY   rU   rF  r  rP  r  r  r   rU  re  rj  r  rM  rz  r~  r  r  r  r  r  r  r   r   r   r   r:  ".  s0    


T



'

% 

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 )3r  c                 G   sX   t |tjr|d }t|| _nt |tjr|d | _ntd| d| _d | _d S )Nr   Unrecognised args: T)r  r^   r  r  r   r   r   r   )rT   r  r   r   r   r   rU   E0  s   
zTextPage.__init__c                 C   s   | 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_textrX  re  )rT   r
  
this_tpager   rY  r5   r   r   r   _extractTextP0  s   


zTextPage._extractTextc                 C   s   t | j|| d S r   )JM_make_textpage_dictr   )rT   	page_dictr
  r   r   r   _getNewBlockListe0  r  zTextPage._getNewBlockListFc                 C   s"   | j j| j jd}| || |S )NrA
  )r   r  rh  r  )rT   r
  r  r   r   r   _textpage_dicth0  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 ]H}
|d7 }ttjj	}|
D ]#}t|
|}t||s]t|s]qKt||jj |jj}	t||}qK|	dkr~t|s~t|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   
   z+<image: %s, width: %d, height: %d, bpc: %d>)"r   r   extractBLOCKSr   r^   r  r   r   r  Fixed_EMPTYr   FZ_STEXT_BLOCK_TEXTfz_clear_bufferJM_char_bboxJM_rects_overlapr1  JM_append_runer<  fz_union_rectr0  fz_append_bytere  r   i_imager  r  r   r  r  rY  r[  rX  rZ  r2   )rT   block_nr  tp_rectr   rm  block	blockrectline_n	last_charr8   linerectr  cbboxr5   rX  r  litemr   r   r   r  m0  sh   






	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r
  Nr  rh  Tblocksc                 S      | d d | d d fS Nr   r   r   r   ri  r   r   r   rr  0  r  z&TextPage.extractDICT.<locals>.<lambda>r@
  r  r  rh  rz  rT   r	  rz  r   r  r   r   r   extractDICT0     

zTextPage.extractDICTc                 C   
   |  dS )z%Return page content as a HTML string.r   r  rS   r   r   r   extractHTML0  r  zTextPage.extractHTMLr   c              	   C   s  d}| j }g }|D ]}|d7 }|jjtjkrq	| }d}tdkr0t|}|jr/| }d}nt	|j}|r=t
|}|rttttt}	t|	sNJ t| dd| dd}
t||	|
\}}}t|}t|}|dkr| |  |  }tt|jj}t }||t< t|jj|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   rE  Nrq	  )/r   r   r   r^   r  r  rt   rY	  fz_compressed_buffer_sizer  ll_fz_compressed_buffer_sizer
  r
  r
  r  r#  r   r  r
  rP	  r   r/  r  ll_fz_keep_colorspacer  r   dictkey_numberr  r   dictkey_bboxr"  i_transformdictkey_matrixr  r  r  r  r  r  r  r  r  r  r  r  rb  r2   )rT   hashesr  r  r_   r  rX  img_size
compr_buffr   r1  r  r   r  rq	  r  
block_dictr   r   r   extractIMGINFO0  sX   


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   NFr  c                          e Zd Z fddZdS )z'TextPage.extractJSON.<locals>.b64encodec                    "   t |ttfv r | S d S r   r   r   r  	b64encoder  rc  base64r   r   r   0     z/TextPage.extractJSON.<locals>.b64encode.defaultNrW   rX   rY   r   r   r  r   r   r  0      r  r  rh  Tr  c                 S   r  r  r   r  r   r   r   rr  0  r  z&TextPage.extractJSON.<locals>.<lambda>r@
  r_  r'   r   
separatorsr:  r  r  jsonr  JSONEncoderr  rh  rz  dumpsrT   r	  rz  r  r   r  r  r   r  r   extractJSON0  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.Tr  Nr  rh  r  c                 S   r  r  r   r  r   r   r   rr  1  r  z)TextPage.extractRAWDICT.<locals>.<lambda>r@
  r  r  r   r   r   extractRAWDICT0  r  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   NTr  c                       r  )z*TextPage.extractRAWJSON.<locals>.b64encodec                    r  r   r  rc  r  r   r   r   1  r  z2TextPage.extractRAWJSON.<locals>.b64encode.defaultNr  r   r  r   r   r  1  r  r  r  rh  r  c                 S   r  r  r   r  r   r   r   rr  1  r  z)TextPage.extractRAWJSON.<locals>.<lambda>r@
  r  r   r  r  r  r   r  r   extractRAWJSON1  s   

zTextPage.extractRAWJSONc                 C   s&   t |}t |}t| j||d}|S rN   )r  r^   fz_copy_selectionr   )rT   pointapointbr
   ri  rM  r   r   r   extractSelection1  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   r  r   r   r   rr  %1  r)  z&TextPage.extractText.<locals>.<lambda>r@
  r%   c                 S   r;
  )r  r   )re   ri  r   r   r   rg   &1  rh   z(TextPage.extractText.<locals>.<listcomp>)r  r  rz  rc  )rT   rz  r  r   r   r   extractText 1  s
   
zTextPage.extractTextc                 C   s4   | j }t|tjsJ t|}t||}t|}|S r   )r   rp   r^   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)rT   r   r  r$  rM  r_   r   r   r   rg
  (1  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  r   r   r  r   r  r  r  r  r1  JM_is_word_delimiterr<  r0  JM_append_wordr  r  )rT   
delimitersbuflenr  wbboxr  r  rm  r  r  r  r8   word_nr  r  word_delimiterr   r   r   r  01  sV   





zTextPage.extractWORDSc                 C   r  )z&Return page content as a XHTML string.r  r  rS   r   r   r   extractXHTML`1  r  zTextPage.extractXHTMLc                 C   r  )z$Return page content as a XML string.r   r  rS   r   r   r   
extractXMLd1  r  zTextPage.extractXMLc                 C   s(   | j }t|jj}t|}d|_|S )zTextPage current poolsize.N)r   r^   Poolr   poolfz_pool_size)rT   rF	  r  rd  r   r   r   poolsizeh1  s
   
zTextPage.poolsizec                 C   s"   | j }|jj}t|}t|}|S )zPage rectangle.)r   r   r   r  r   )rT   r  r   r   r   r   r   r   p1  s
   zTextPage.rectr   c           
      C   s   t | j|}|s
|S t|}t|D ]}t|| }|r!|||< q|j||< q|r+|S d}||d k rb|| }||d  }	|j|	jksH||	@ jrM|d7 }q-||	B ||< ||d = |d8 }||d k s3|S )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r  r  r
  r   rZ  r  )
rT   needlehit_maxr	  r   r#  rf   r	  v1v2r   r   r   searchz1  s.   

	zTextPage.searchrv  r  r  r   )r   r   )rW   rX   rY   rU   r  r  r  r  r   r  r   r  r  r  r  r  r  r  rg
  r  r  r  r  r  r   r  extractTEXTr   r   r   r   r  C0  s.    
7
/
0

	r  c                   @   sH   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	  r|  r   r   r&  rh  r  ictmrv  r  r[  	text_rectry  
used_fontsr   )rT   	page_rectr	  r|  r   r   r   rU   1  s   



zTextWriter.__init__c                 C   s*   t t| jtd t }t|}|S r   )r  r^   fz_bound_textr   FzStrokeStater#  r   r   r   r   r   _bbox1  s   zTextWriter._bboxrC  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'.Nrn
  r   z{font.this.m_internal.name=}z {font.this.m_internal.t3matrix=}z{font.this.m_internal.bbox=}z#{font.this.m_internal.glyph_count=}z&{font.this.m_internal.use_glyph_bbox=}z#{font.this.m_internal.width_count=}z%{font.this.m_internal.width_default=}z"{font.this.m_internal.has_digest=}zUnsupported font {font.name=}zAUnsupported font cppyy.gbl.mupdf_font_name(font.this.m_internal)=zUnsupported font '%s'.r%   r]  r  r   ) rv  r  r  r  r9   r]   r  r  mupdf_font_namer   r   r   r   	clean_rtlrc  r{  r^   r  r  fz_make_matrixr  r  fz_show_stringJM_show_string_csr"  r  r  r  r  rj  r  r  )rT   r  r5   r  r   r  right_to_leftr  r  r  rO  trm
markup_dirr  r   r   r   r   r2   1  s2   

zTextWriter.appendFc           	   	   C   sB   |d }|D ]}| j ||||||d | j|7  _q| j| jfS )Nr!  )r  r   r  r  )r2   r  r  r  )	rT   r  r5   r  r   r  r  r-  r<  r   r   r   appendv1  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.
        rk   ro   c                 S   rb   r   r  r  r   r   r   rg   1  rh   z(TextWriter.clean_rtl.<locals>.<listcomp>r
  r%   r   r   r   )r  r  r  rt  rc  r{  r2   )rT   r5   wordsr  rf   r   idx2r   r   r   r  1  s2   
"

zTextWriter.clean_rtlr   c	           '      C   sv  t | t| j|j dkrtd|dur2t|ttfvs.t|d tus.t|d tur2td|dur>|du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|	 d}td}t|	 t ||}t|| jt |||
ttj t| t|	|}t|}||f}|}|d }|d }|\}}| }||}|du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t(|j)|j*|j' | f d |rO|d | j+ } tdd,| j)| j*}| |d  | }|sU|r`| t(t-|d  |D ]}!|!.drlqb|!dkr| |! | d|  qb|!.drt/|!0 d dd | }"d|" }!no|!.dr|!0 }#t1|#d }$|dkr|$d }%nd}%| t(|%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& | |! qb|r| | | d' d(2|4d)}t5j6|||d* d}| j7D ]}&t8||& q0|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   r4  r   r  r   r_
  z/OC /%s BDCEMCr%   r	  rU  r%  z cmr  z%i Trz gsz	/Alp%i gs Tf皙?z wro   rk   z/F%iz rgr  RGz gz Gz kz Kr  rA  rN  )rb	  )9r  ry  r   r   r   rr   rq   rv  r&  r   r	  r|  r  r   r^   r|  fz_device_cmykfz_device_grayr  r   r  pdf_new_pdf_devicer#  fz_fill_textr   r  r  rD	  JM_merge_resourcesre  re  r<	  r2   r	  r  rh  r  r   r  r[  rs   r  r  r  rO  r  rf  r   r  r  rc  rj  rC  r   r!
  r  repair_mono_font)'rT   r   r|  r	  rb	  rz  r  r  rp  r.  r  ncol	dev_colorr  r  r!  rG	  max_numscont_stringr  r   r  max_alpmax_fontold_cont_linesr  r7  r  new_cont_linesr	  r  r	  rO  r8   alpr  r  r   r  r   r   r   
write_text2  s   




	


 (







zTextWriter.write_textr  )NrC  Nr   r   )NrC  NF)Nr   r   NNr   r   )
rW   rX   rY   rU   r  r  r2   r   r  r6  r   r   r   r   r  1  s    



,.r  c                   @   st  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zddddddd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d0d1 Zed2d3 Zed4d5 Zd6d7 Zd8d9 Zd:d; Z ed<d= Z!ed>d? Z"ed@dA Z#edBdC Z$dDdE Z%dFdG Z&edHdI Z'eZ(eZ)e#Z*e$Z+dS )Jr
  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 r   )r   r  r'  r[  r   r   r   r  2  r  zIRect.__add__c                 C   r7  r   )r   r  r'  r  r   r   r   r  2  r  zIRect.__and__c                 C      t | |S r   )r   r-  r  r   r   r   r-  2  r  zIRect.__contains__c                 C   r}  r~  )r  r  rY  r[  rX  rZ  r  r   r   r   r#  2  s   
DzIRect.__eq__c                 C   r  r   r  rB  r   r   r   r  2  r  zIRect.__getitem__Nr  c             	   G   s,   t |||||||d\| _| _| _| _d S )Nr  )util_make_irectrY  r[  rX  rZ  r  r   r   r   rU   2  s   ,zIRect.__init__c                 C   r  r  r   rS   r   r   r   r|  2  r   zIRect.__len__c                 C   r7  r   )r   r1  r'  r~  r   r   r   r1  2  r  zIRect.__mul__c                 C   r  r   )r
  rY  r[  rX  rZ  rS   r   r   r   r2  2  rW  zIRect.__neg__c                 C   r7  r   )r   r  r'  r  r   r   r   r  2  r  zIRect.__or__c                 C   r4  r   )r
  rS   r   r   r   r5  2  r   zIRect.__pos__c                 C   r6  )Nr
  r7  rS   r   r   r   r   2  r  zIRect.__repr__c                 C   r  r  )r   rY  r[  rX  rZ  r@  r9  r   r   r   r:  2  r  zIRect.__setitem__c                 C   r7  r   )r   r;  r'  r[  r   r   r   r;  2  r  zIRect.__sub__c                 C   r7  r   )r   r@  r'  r~  r   r   r   r@  2  r  zIRect.__truediv__c                 C   r  r  r  rS   r   r   r   rm  2  r
  zIRect.bottom_leftc                 C   r  r  r  rS   r   r   r   rj  2  r
  zIRect.bottom_rightc                 C   r  rN   r  rS   r   r   r   rh  2  r
  zIRect.heightc                 C      | j |}|jS )z$Extend rectangle to include point p.)r   r  r
  )rT   rO  r   r   r   r   r  2     zIRect.include_pointc                 C   r:  )z(Extend rectangle to include rectangle r.)r   r  r
  )rT   r   r   r   r   r   r  2  r;  zIRect.include_rectc                 C   r7  )z4Restrict rectangle to intersection with rectangle r.)r   r  r'  r  r   r   r   r  2  r  zIRect.intersectc                 C   r8  r   )r   r  r  r   r   r   r  2  r  zIRect.intersectsc                 C   r  r  r9
  rS   r   r   r   r  2  r  zIRect.is_emptyc                 C   r  )zTrue if rectangle is infinite.r  rS   r   r   r   r  2  r  zIRect.is_infinitec                 C   r  r  r9
  rS   r   r   r   r  3  r  zIRect.is_validc                 C   r  r  r  r  r   r   r   rz  3  r  zIRect.morphc                 C   r  )Nc                 S   r  r   r   r  r   r   r   rg   3  rh   zIRect.norm.<locals>.<listcomp>r  rS   r   r   r   rR  3  r  z
IRect.normc                 C   r  )z)Replace rectangle with its valid version.r*
  rS   r   r   r   r
  3  r  zIRect.normalizec                 C   r  r  r  rS   r   r   r   r  3  r  z
IRect.quadc                 C   r4  r   r  rS   r   r   r   r   3  r"   z
IRect.rectc                 C   r  r  r  rS   r   r   r   ri  #3  r
  zIRect.top_leftc                 C   r  r  r  rS   r   r   r   rl  (3  r
  zIRect.top_rightc                 C   r  r  r  r  r   r   r   r  -3  s   zIRect.torectc                 C   r7  r   )r   r  r'  r~  r   r   r   r  83  r  zIRect.transformc                 C   r  rN   r  rS   r   r   r   r  ;3  r
  zIRect.width),rW   rX   rY   r[  r  r  r-  r#  r  rU   r|  r1  r2  r  r5  r   r:  r;  r@  r  rm  rj  rh  r  r  r  r  r  r  r  rz  rR  r
  r  r   ri  rl  r  r  r  rx  r  rw  r  r   r   r   r   r
  2  sh    	











r
  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr#  r$  rC  rn
  rD  heitrE  heborF  hebir?  courr@  coitrA  coborB  cobirG  tirorI  tiborH  tiitrJ  tibir#  symbr$  zadbr_  i   ifitzro   r   r  r   rF         r  r	   rK  r  r  rC  rH     r5  Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenr
  MultiplyNormalOverlay
SaturationScreen	Softlightc                 C   s"   d|  dt |||f d| dS )Nz<</A<</S/GoTo/D[z	 0 R/XYZ z	]>>/Rect[]/BS<</W 0>>/Subtype/Link>>r  )r
   ri  r<  r  r  r   r   r   rr  V4  r	  rr  c                 C      d|  d| dS )Nz<</A<</S/GoTo/Dz>>/Rect[rk  r   r  r   r   r   rr  W4      c                 C   s.   d|  dt |||f d| d| d| dS )Nz<</A<</S/GoToR/D[z /XYZ z]/F<</F()/UF()/Type/Filespec>>>>/Rect[rk  r  r&  r   r   r   rr  X4  s   . c                 C      d|  d| d| dS )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[rk  r   r
   ri  r<  r   r   r   rr  Y4  r  c                 C   rp  )Nz<</A<</S/Launch/F<</F(rn  ro  rk  r   rr  r   r   r   rr  Z4  r  c                 C   rl  )Nz<</A<</S/URI/URI(rq  rk  r   r  r   r   r   rr  [4  rm  c                 C   rl  )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[rk  r   r  r   r   r   rr  \4  rm  )goto1goto2gotor1gotor2launchr  r  c                   @      e Zd ZdZdS )rU  z0Raised for documents with file structure issues.NrW   rX   rY   r[  r   r   r   r   rU  _4      rU  c                   @   rx  )rT  zRaised if file does not exist.Nry  r   r   r   r   rT  c4  rz  rT  c                   @   rx  )rW  z5Raised when creating documents from zero-length data.Nry  r   r   r   r   rW  g4  rz  rW  r   r  r   r  r  r<  charsr|  r  r  r  zcs-namedar  re  r  r  effectr  r/   r   rj  r  r  rh  r  rs	  r#  rc  rm  r  r  r   r  r  r   rd  r  spansr  r  r  r5   r  r   r  r  r  r   r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )rZ        ?)!   Zd;O?)"   7A`?)#   r  )$    rh?)%   -?)&   gL7A`?)'   jt?)r  r  ))   r  )*   r  )+   r  ),   r  )-   r  ).   r  )/   n?)0   r  )1   r  )rL	  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   r  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)rv  r  )I   r  )J   x&1?)K   r  )L   ʡE?)M   g r?)N   r  )O   r  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   r  )U   Gz?)V   r  )W   r  )X   gp=
ף?)Y   q=
ףp?)r6  r  )[   r  )\   gV-?)]   r  )^   uV?)r$  r  )`   r  )a   r  )b   r  )r	  r  )r  V-?)e   r  )f   y&1?)g   M?)h   r  )i   uV?)j   r  )k   r  )l   r  )m   ;On?)n   r  )o   r  )p   r  )q   r  )r   r  )s   r  )t   r  )u   r  )v   r  )w   r  )x   gZd;O?)y   r  )z   r  ){   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  )   r  )   /$?)   r  )   g?)   r  )   r  )   r  )r	  r  )   r  )   r  r  )   r  )   r  )   r  )   r  )   r   )   r  )   r   )   r  )   tV?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   HzG?)   r(  )   g{Gz?)   r  )   r  )   r  )   r  )   r  )   r  )   r   )   r  )   r  )   r  )   r  )   r  )   r  )   r(  )   r(  )   x&?)   r  )   ~jt?)   r>  )   r>  )   r>  )   r>  )   r>  )   r  )   r  )   r  )   r  r  )   r  )   gK7?)   r  )   r  )   r  )   r>  )   r  )   r>  )   r>  )   r>  )   r>  )   r  )   r  )   r  r  (   r  K7?rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  )rZ  r  )r  ^I+?)r  gn?)r  rX  )r  g\(\?)r  g5^I?)r  sh|??)r  r(  )r  Zd;O?)r  r  )r  gQ?)r  g?5^I?)r  r  )r  g\(\?)r  x&?)r  gB`"?)r  r[  )r  g=
ףp=?)rL	  rX  )r  g)\(?)r  gOn?)r  Mb?)r  '1Z?)r  gʡE?)r  gDl?)r  r  )r  RQ?)r  }?5^I?)r  gT㥛 ?)r  r  )r  gDl?)r  gv/?)r  gX9v?)r  g/$?)r  r;  )r  rW  )r  rW  )r  r(  )r  gK7A`?)r  g rh?)rv  &1?)r  r  )r  rY  )r  gx?)r  r  )r  r  )r  r`  )r  d;O?)r  gK7?)r  g+?)r  gA`"?)r  g+?)r  r(  )r  MbX?)r  g=
ףp=?)r  E?)r  r  )r  rb  )r6  r_  )r  9v?)r  g-?)r  gm?)r  g;On?)r$  g;On?)r  gGz?)r  rY  )r  rY  )r	  rd  )r  gCl?)r  ʡE?)r  g?5^I?)r  r;  )r  gv/?)r  r  )r  rZ  )r  gQ?)r  rZ  )r  V-?)r  r]  )r  r\  )r  r\  )r  r_  )r  r_  )r  %C?)r  rg  )r  rW  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  rh  )r  K7A`?)r  ri  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  rV  )r  gCl?)r   rh?)r  rj  )r  gQ?)r  r  )r  r^  )r  r^  )r  rc  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r	  rW  )r	  rW  )r
  rW  )r  rW  rV  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r  rW  )r   rW  )r!  rW  )r"  rW  )r#  rW  )r$  rW  )r%  rW  )r&  rW  )r'  rW  )r)  rW  )r*  gS㥛?)r+  g7A`?)r,  gK7A?)r-  gZd;O?)r.  V-?)r/   rh?)r0  rk  )r1  gK7A`?)r2  Dl?)r3  V-?)r4  rn  )r5  g㥛 ?)r6  rf  )r7  g"~?)r8  rl  )r9  rl  )r:  gMbX?)r<  g(\?)r=  gn?)r?  goʡ?)r@  gK7A?)rA  獗n?)rB  ro  )rC  X9v?)rD  rp  )rE  re  )rF  re  )rG  +?rV  )rH  rq  )rI  r^  )rJ  gʡE?)rK  y&1?)rL  gGz?)rM  rr  )rN  "~j?)rO  gl?)rP  rs  )rQ  ra  )rR  rf  )rS  rm  )rT  g
ףp=
?rV  rV  c                 C   s0   g }t |D ]}|t| ||  qt|S r   )r  r2   r^   r
  r   )r`	  r  r/  rG   rf   r   r   r   _read_samples6  s   rt  c                 C   s   || ko| |kS r   r   )rF   lowhighr   r   r   r%  6  r  r%  c              	   C   sb  t | }t|D ]}|}||v rq	t | |}t |td}|js$q	t |}t|d ddD ]|}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 |\}}}|j}|dk rq1|}||v rt || q1q	d S )NrD  r   r   r  r  r  r  ru  GoTor  r   )r^   r  r  r  r   r   r   rH  rI  r  r  pdf_lookup_page_numberrW  r  r   r   r   rJ  )r  r$  	pagecountrf   r  r  rL  r  r2  rN  r4  r  r,  targetr  r  r   r   r   r#  6  sF   



r#  c                 C   s<   t | tjtjfsJ dt| d| | jsttd S )Nztype(cond)=z cond=)rp   r^   r   r   r   r   r   MSG_IS_NO_PDF)condr   r   r   
ASSERT_PDF6  s   *r}  c                   C      t ttttS r   )r
  r
  r
  r   r   r   r   EMPTY_IRECT6  r$   r  c                   C      t  jS r   )
EMPTY_RECTr  r   r   r   r   
EMPTY_QUAD6  r   r  c                   C   r~  r   )r   r
  r
  r   r   r   r   r  6  r$   r  c                 C   s   t | stdd S )Nz No journalling operation started)JM_have_operationr   r  r   r   r   r  7  s   r  c                   C   r~  r   )r
  r
  r
  r   r   r   r   INFINITE_IRECT7  r$   r  c                   C   r  r   )r  r  r   r   r   r   r  7  r   r  c                   C   r~  r   )r   r
  r
  r   r   r   r   r  7  r$   r  c                 C   s   t | tjsJ t| }|S )z3
    Turn fz_buffer into a Python bytes object
    )rp   r^   r  r  )r   rG   r   r   r   r   7  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)=r
  surrogateescape)rp   r   r   rC  r  )r<  ri  rG   bbr   r   r   r^  7  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  rN  z&.getvalue() returned unexpected type: )rp   r   r  r  r  r   rC  r   r   r^   r  r  )rf  r
  r   r   r   r   97  s   



r   c                 C   s   t | sd S t| | S r   )r  r  )r   r  r   r   r   JM_FLOAT_ITEMK7  s   r  c                 C   s.   |t | k r| | }t|ttfrd|fS dS )Nr   r  )r  rp   r   r  )r   r  r  r   r   r   r  P7  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rmt|D ]
}t||tj qan-t|D ]
}t||tj qqnt|rtd}n|jrt	|t	|krtd}t||||}|rt| nt|d t||}|rt||t t  nt||t t  t| |S )zf
    Pixmap creation directly using a short-lived displaylist, so we can support
    separations.
    r   r   ro   TNr
  )r{  r^   r?	  r  fz_intersect_rectr,  fz_round_rectfz_document_output_intentr   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_separationsr
  r
  r
  r  rC	  r#  r"  fz_run_page_contentsrD	  )r   r   r  r  r  rL  r  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsr
  r  r  r   rclipr   oir/  rf   r  rG	  r   r   r   r	  X7  sX   








r	  c                 C   r  r   r   r  r   r   r   r!	  7  r  r!	  rN  r&  c                 C      t tdd | S )Nc                 S      t | dkrt| dS dS )Ng-C6?r   r   ry  r'  r  r   r   r   rr  7      zJM_TUPLE.<locals>.<lambda>rr   rd  rN  r   r   r   r  7  r  r  c                 C   r  )Nc                 S   r  )Nr  r   r   r  r  r   r   r   rr  7  r  zJM_TUPLE3.<locals>.<lambda>r  r  r   r   r   	JM_TUPLE37  r  r  c                 C   sF   | d u rdS t | tr| d} t | ts!J dt| d| | S )Nr%   r
  ztype(s)=z s=)rp   r   r  r   r   r  r   r   r   r   7  s   

"r   c           	      C   s   t | tjsJ t| }t| }t|}d}	 t d| | }||vr'n|d7 }qt|}t|t	|}t
|d| d| j_dS )z
    Add a unique /NM key to an annotation or widget.
    Append a number to 'stem' such that the result is a unique name.
    r   r   rj   r  N)rp   r^   r   r   r   r	  JM_annot_id_stemr!	  pdf_new_stringr  r  r   r   r   )	r   stemr   r   r  rf   stem_idresponser   r   r   r   r  7  s   

r  c                 C   s~   t | |d}t |sttt t |td}t |tddks-t |tddkr8t 	|td| dS ttt dS )z1
    Add OC object reference to a dictionary
    r   r  r<  OCMDrn  N)
r^   r  r*  r\  MSG_BAD_OC_REFr  r   r   r.  r  )r  rn	  r   indobjr  r   r   r   r!  7  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   Borderro   r  r   BSr%	  ru  r%   r  BEIr  )rq   r^   r   r   r  r  rI  rH  r  r   r2   r   r)  r   r  rr   dictkey_dashesdictkey_style)r   dash_pyr  r  r  r   dashrf   r   bs_or   r   r   r   r5  7  sB   
r5  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   )r   rq   r^   r   PDF_ENUM_NAME_Cr  rH  r  r  rI  r2   dictkey_stroker   dictkey_fill)r   r   bcfcrN  r/  rf   r  r   r   r   rB  8  s$   



rB  c                 C   s  t | tsJ d }d}| t}| t}| t}| d}t|}	t|t	d t|t	d t|t	d |dk rD|	t}|d u rM|	t}|d u rV|	t}|dk r_|	d}t |t
rt|dkrt|}t||}
|D ]}t|
| qvt||
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  r  r  r  r  r%	  ru  ro   r  r  )rp   r   r   r  r  r  r5  r^   r   r   rr   r  r  pdf_array_push_intr  pdf_new_realJM_get_border_styler  r   r  r   )r8  r   r   r   dashlennwidthndashesnstylencloudsoborderdarrr  r   r   r   r  8  sR   








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 )Nr  z\u005crZ     r  i   i  z\ufffd  z\u%04xz\U%08xr  )r  r   r   r   make_escapeO8  s   r  c                 C   s   t | t| dS )zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)r^   r^	  r  )r  r  r   r   r   r  \8  s   r  c                 C   sD   t |}|j|j|j|j||||f}| | |d ttjjfS )z'
    Functions for wordlist output
    r   )	re  rY  r[  rX  rZ  r2   r^   r  r  )rm  r  r  r  r  r   r  r  r   r   r   r  c8  s   

r  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
    rF  r   r   r  NrB  	BaseStaterI  rH  rE  r   )rK  r^   r   r   r  rJ  r  r  r  r  r  r  r  pdf_array_containsr  )r  r   r9  rH  rV  configsr  onarrayr  r/  rf   r   r  indr   r   r   r7  v8  s0   
r7  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	  r   r  rZ  r[  rd  )r8   r  r	  r   r   r   r   r  8  s   

r  c                 C   sV   t ||}|t| t 7 }|t| t 7 }|t| t 7 }|t| t	 7 }|S r   )
detect_super_scriptr^   r  TEXT_FONT_ITALICr  TEXT_FONT_SERIFEDr  TEXT_FONT_MONOSPACEDr  TEXT_FONT_BOLD)r  r8   r  rj  r   r   r   JM_char_font_flags8  s   
r  c                 C   s  t rtt| j|jS t| tjsJ t|tjsJ t	j
r#|jS | jjr*|jS tt|jj}t|}t|}|jj}|| t }|dkrVt	jdkrVt|jjS |jj}t|}|j|j }|dk rod}d}d}t	jsv|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 r\t#||jj$}|r\t%||| 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   r  r   rp   FzStextLineFzStextCharr@	  rR   r  r  FzFontll_fz_keep_fontr  JM_font_ascenderJM_font_descenderrd  FLT_EPSILONrP   r  rX  rY  r  r  r  r  r  r  fz_transform_quadr-  rS
  rQ
  rR
  r  r<  r  )r8   r  r  ascdscr  asc_dscr   fwidthr<  r  trm1trm2xlate1xlate2r  cwidthr  r   r   r   r  8  sz   


$ 





r  c           	   
      s   t | j tdkrt | d}n fdd}|| d}t|}|dkr&dS t  td}g }t|D ]=}t 	t 
||}|dkrct t 
t 
||dt t 
t 
||df}|| q4t t 
||}|| q4|S )	z8
    return list of choices for list or combo boxes
    rE  r   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Optro   r   r   )r^   r  r   r   r   rH  r   r  rI  r   r2   r   )r   	exportvaloptarrr/  r  rf   r1  r   r   r   r   pdf_choice_widget_options9  s    
z4JM_choice_options.<locals>.pdf_choice_widget_optionsNr  ro   r   )r^   r   r   rt   pdf_choice_widget_options2r  r   r   r  rH  rI  r   r2   )	r   r  r  r/  r  r  rf   r1  r   r   r  r   JM_choice_options9  s(   
r  c           
      C   s  t |t | }|j|j }|j|j }|dks|dkrdS |  }||j|    | 	 |j| 
    }t |  dkrd| }	 |}td|D ]=}t | |d |d7 }t | |d |d7 }t | |d |d7 }t | || |d7 }|  rt | |d |d7 }qL||7 }|dkr	 dS |d8 }qE	 |}t|D ]3}t| 	 d D ]}	t | || |d7 }q|  rt | |d |d7 }qt | || |d7 }q||7 }|dkr	 dS |d8 }q)zO
    Clear a pixmap rectangle - my version also supports non-alpha pixmaps
    r   r  r
  r   )r^   fz_intersect_irectr
  rX  rY  rZ  r[  r
  r  r/  r  r  r  r  r
  r  )
r  rv   ri  r   r  destspandestpr  r  r'  r   r   r   r
  ;9  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   )rp   r   r  rq   rr   r  r  )r|  rG   rf   r   r   r   r   r9  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 r  )r   r^   r
  r  r  r  r
  rX  rY  rZ  r[  r/  r  r  rt  fz_is_empty_irectr  r   )r  r  r_   r
  r
  r
  r  rh  r/  	substrider  oldpixrf   r2  newpixr
  r<  r   r   r   r
  9  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_lengthrk  r   r   r   JM_compress_buffer9  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   rA  )r  StringIOr   r   r^   r  r  r  rM  r  r<  r  )
r   r$  need_new_liner  r  r8   line_had_textr  r   r  r   r   r   r  9  s,   


r  c                 C   sL  t  }d}|}|}||krd}|}|}t|}|}		 t|	||s"n<t | |	}
t |
}t ||\}}}t |
|t  t 	  t 
| d}t |||||}t |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   r
  r%  rr  r?	  pdf_page_writerC	  r#  r"  rD	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rX  r  rp   r   )r   r  r  r  r*  incrr  r  r  rf   r   r   rG	  r  r!  r"  r  r   rY  r<  r   r   r   rg  9  sT   




rg  c           	      C   sD  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   trt  t || |t j
krt t | t |t	dt	dt	d  w )	NzRoot/AcroForm/SigFlagsr  r  r  r	  zRoot/AcroForm/Fieldsr   Fields)r^   r   r  r  pdf_create_annot_rawr  r   JM_set_field_typer  r   PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyr  
pdf_new_ntr   r  r  r   r   r?   rG  r  )	r   r   r   	fieldnameold_sigflagsr   r   r
  r  r   r   r   r&	  :  sP   

	

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
    r	  )r   r   r  r
  r^   r	  r  r   r1  r0  rZ  r[  )r"  r   r  r[  rZ  r   r   r   r  7:  s   
r  c                 C   s8   t | }t|j|j }t|j|j }t||}|S r   )r  ry  rX  rY  rZ  r[  r^   fz_make_point)r"  r   r   r  rd  r   r   r   JM_cropbox_sizeK:  s
   r  c                 C   s   t | }t|S )z&
    just the inverse of rotation
    )r+  r^   r  )r   mpr   r   r   r  S:  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   r	   r  r  rR  rS  rU  rV  r  Filespecs     r  rW  rX  rY  )r^   r  r  r   r  r  r  r  r  r   r  r   )r  rk  r/   r  re  rG  r  r   efbsrM  r  r  r   r   r   r  [:  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
    r  
Collectionr   r  r  r  r5  N)	r^   r   r  r   r   r+  r   r   r  )r  r  collefilesr   r   r   r  :  s   r  c                 C   s$   | j sdS t| }t|dd}|S )Nr%   rj  errors)r   r^   r  r  )r  r  r   r   r   r   re  :  s
   
re  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  rY  r%   ro   N)r^   r   r  r   r   
fz_memrnd2r  rJ  r  r  r  )r  rE  rnd0rndrf   r   r   r   r  :  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
    r  r  ro   rE  r   r  r   rH  rI  rG  RBGroups)r^   r   r  r   r   r  rJ  )r  rV  r  r  r   r   r   rK  :  s   "rK  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
    rw  Cor  coTir  tiSySymbrJ  Zar  zar   r  r   r   r   JM_expand_fname:  s   r"  c                 C   sf   | 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 dS )	z!
    String from widget type
    ButtonCheckBoxRadioButtonTextListBoxComboBox	SignaturerT  )r^   r  r  r  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )wtyper   r   r   JM_field_type_text:  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@r  )rp   r^   r
  r  r
  rX  rY  rZ  r[  r
  r  r/  r  r  r
  )
r  r  ri  r   r  r  r  r  r  rf   r   r   r   rI  :  s*   (
rI  c                 C   s   t | tjsJ d}t| }d}t| }t|}	 t |tjs$J |js(nt|}t|d}|jr?t||s?d}nt	|}q|rI|S dS )z
    Return the first annotation whose /IRT key ("In Response To") points to
    annot. Used to remove the response chain of a given annotation.
    Nr   r   r  )
rp   r^   r   r   r   r	  r   r   r.  r  )r   rK  r   rM  r   irt_annot_objrN  r   r   r   rF  :  s*   




rF  c                 C   s$   t | tjsJ tjrdS t| S )3
    need own versions of ascender / descender
    r&  )rp   r^   r  r@	  rR   r  r  r   r   r   r  ;  s   
r  c                 C   s(   t | tjsJ tjrdS t| }|S )r0  gɿ)rp   r^   r  r@	  rR   r  )r  rG   r   r   r   r  #;  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.
    rZ  r  TFr  )r  r  r  r  r   r   r   r  .;  s   r  c                 C   sN   t | tjsJ t| }|d}tjs|dks|dkr|S ||d d  S )N+r   r	   r   )rp   r^   r  r  r`   r@	  rQ   )r  r   r  r   r   r   JM_font_name<;  s   

r3  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)r  )r^   r+  r  r-  r,  r*  fz_warnr)  r   r   PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   r  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingr  r^  r2   )r  dict_fontliststream_xrefr_   r/  rf   refnamerr
  r  r  r   r  r   r  r  r   r   r   JM_gather_fontsE;  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 (r4  r  Formr   r&  )rp   r^   r   r+  r  r-  r,  r*  r5  r)  r   r   r   r  r   pdf_to_matrixr#  r,  r	  r  r  r  r2   )r   r;  	imagelistr=  r_   r/  rf   r>  	imagedictr  rN  r1  r'  r   r   r  r   r   r   JM_gather_formsj;  s8   

$
rD  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 (r4  r  r  r   r  r  FilterrS  
ColorSpaceCSDeviceN
Separationro   rI	  r%	  rJ	  r   BitsPerComponentBPC)r^   r+  r  r-  r,  r*  r5  r)  r   r   r   r  r  r   r  rI  r  r   r^  r2   )r   r;  rB  r=  r_   r/  rf   r>  rC  r  r   genr  r@  altcsr  csesr  rh  r  r  r   r   r   JM_gather_images;  s\   

$





rO  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)	rp   r^   r   r	  r   r   r   r  r   )r   r   rM  r   r   r   r   r	  ;  s   

r	  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   r  z!'%s' is not an annot of this page)
rp   r^   r   r	  r   pdf_to_stringr   r   r  r   )r   r   rM  r   r  r  r   r   r   r~	  ;  s"   

	r~	  c                 C   sf   g }t |  t j}|js|S tt |D ]}t ||}t |d}|jr0|	t 
| q|S )Nr  )r^   r   r   PDF_ENUM_NAME_Annotsr   r  rH  rI  r   r2   r   )r   r  rL  rf   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
    rD  r  r  )r   r   r  r^   r   r   rH  r  rI  r   r   r  r)  PDF_ANNOT_UNKNOWNr   r2   r   )
r"  r  rL  r/  rf   r   r   r  r  rE  r   r   r   r  <  s$   



r  c                 C   s$   | j dd} | jst S t|  S r	  )r  r   rq   r  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
    Nri  r  r  r  rf   r  ro  Ur  ru  )r^   PDF_ENUM_NAME_Sr   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r  r   r  r   r   r   r  &<  s   r  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 r   )r   r   MSG_FONT_FAILEDrj  r  r^   fz_set_font_embeddingr1  r  r   r   fertigE<  s
   
zJM_get_font.<locals>.fertigr   Nr   )r^   fz_new_font_from_filer   r  fz_new_cjk_fontfz_new_base14_fontr   fz_new_builtin_fontfz_lookup_noto_fontr  fz_load_fallback_font)r   r  r   r  r  r  r  r  r  r  r\  r  r  r   r
  rd  r   r[  r   r  6<  s6   

r  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  r   r   r   r  rI  r<   r;  r  r   )r   r   rN  desftr   rf  r   r   r   r  t<  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   r   r   r+  r  r-  r,  r)  r   r2   )	rn	  
propertiesr/  r_   rf   r  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	  r   r   r   r  r   r   )r   r   rM  r   r   r   r   r   r
  <  s   


r
  c                    s  t | j}t | j}| }| } fdd}dd }t |j}| _|t jkr<t ||r6|dd n|dd n|dd | d	t	t 
| | d
t	t| t |}	| d|	 t |td}
|
jrwt |
}| d| d}|t j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 |
rOt |
}dg| }t|D ]}t t |
|||< q:| d| t |tdtd}
t |
rt |
}dg| }t|D ]}t t |
|||< qn| 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 r   r]  )r  rv   r  r   r   SETATTR<  r  z)JM_get_widget_properties.<locals>.SETATTRc                 S   s   t | || d S r   ro  )modr  rv   r   r   r   SETATTR_DROP<  s   z.JM_get_widget_properties.<locals>.SETATTR_DROPr  TFNrx  r  r}  TUr~  rE  r|  r  r  r  r  r%	  r   r   ry  r  rz  r  r  MKBGr  BCr>  r{  r	  r  r   r  r  r  r  r  AAKr  rS  r  Vr  r  r  Blr  Fo)%r^   r   r   r   r   pdf_widget_typer  r  pdf_signature_is_signedr   pdf_field_border_styler.  pdf_load_field_namer   r   r   r   r  r   r)  pdf_field_valuepdf_field_displayr  r   r  rH  r  r   rI  pdf_text_widget_max_lenpdf_text_widget_formatr  r  pdf_field_flagsr   JM_get_scriptr  )r   r  r   r   r  twrq  rs  r  r}  r   ri  fvaluery  r/  r  rf   r  r|  r  ssr   rp  r   JM_get_widget_properties<  s   












r  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   r  rc  r   rd  re  pfarf  ttfrg  r  rh  ri  cffrj  cidrk  otfzunhandled font type '%s')r^   r  r   r   r   r  rI  r;  r<   r  r)  )r   r   rN  rl  r   r   r   r   r  X=  s>   r  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}
    )rq   r^   r  rH  r  rI  r   r2   )r  list_r/  rf   r   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 )NrH  r:  rI  r  Lockedrk  r  r  r  r  )r   r^   r   r   r  rq   r  rH  r  rI  r2   r   r)  )	confr_   r  r  r/  rf   r   list1ru	  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   ro   r   rN  )r^   rH  r  r  rI  r   rX  fz_buffer_extractrp   r   r  r2   )	r  r  r/  rf   r  r,  r   r   r<  r   r   r   r  =  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.
    Nru  
JavaScriptJS)r   r^   r   r   r)  rW  r   r   r   r   re  )r  r2  jjjsr  r   r   r   r   r  =  s&   




r  c                 C   s   | j jrt| dsdS dS )z(
    Ensure valid journalling state
    r   r   )r   rF  r^   rM  r  r   r   r   r  =  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 MuPDF image type
    faxr
  flatelzwrldbmpgifr  r-  r  jxrr  r%  tiffr  )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  =  s   r  c                 C   sV   t |tjsJ ttjj}tt||}t|t}|t|f}t	
| d S r   )rp   r^   r#  r  r  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_infor2   )r:  r  r   rs	  r   r	  r  r   r   r   JM_image_filter>  s   r  c                 C   s  | sdS t | }|dk rtd dS | }t|}|tjkr dS |r)t||}n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.
    NrF  r
  orientation)r  r<   r^   r  r  r  fz_new_buffer_from_shared_datar  fz_image_orientation_matrixr  fz_image_orientationr  r  r   r   r  r  r  r"  r  r  r  r/  r  r  r  r  r  r  r  )r
  
keep_imager  r<  r  r   rs	  r  r  r  r  r  r  r   r   r   JM_image_profile>  s@   




r  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                       s<   e Zd Z fddZedkrdd Z  ZS dd Z  ZS )z0JM_image_reporter.<locals>.SanitizeFilterOptionsc                       t    |   d S r   r   rU   use_virtual_image_filterrS   r  r   r   rU   A>     
z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__)r   rb  rC  c                 S      t d t||| d S r   r  r^   r#  )rT   r  r  r   rs	  r
  r   r   r   image_filterE>  r  z=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterc                 S   r  r   r  rT   r  r  r   rs	  r   r   r   r  H>  r  )rW   rX   rY   rU   rt   r  r  r   r   r  r   SanitizeFilterOptions@>  s
    r  r   )r:  r;  r  r<  r  )r   r^   r#  r  r  r  PdfSanitizeFilterOptions2r>  r  r	  rr   )r   r   r   r  sanitize_filter_optionsfilter_optionsr_   r   r   r   rO
  9>  s$   	rO
  c            
      C   s  t td } t td }t td }t td }t td }t td }t td }t td }t td	 }t }	||	d
< ttj|	d< ttj|	d< ttj|	d< ttj|	d< ttj|	d< ttj	|	d< ttj
|	d< ttj|	d< ttj|	d< ttj|	d< ttj|	d< ttj|	d< tt|	d< ttj|	d< | |	d< ||	d< ||	d< ||	d< ||	d< ||	d< ||	d< ||	d < ttj|	d!< |	S )"NTOFUTOFU_BASE14TOFU_CJKTOFU_CJK_EXTTOFU_CJK_LANG
TOFU_EMOJITOFU_HISTORICTOFU_SILTOFU_SYMBOLbase14cbzepubr=  iccrX  r  r  r  zplotter-cmykz	plotter-gz	plotter-nzplotter-rgbz	py-memoryrG  tofuztofu-cjkztofu-cjk-extztofu-cjk-langz
tofu-emojiztofu-historicztofu-silztofu-symbolxps)r  r^   r   r  FZ_ENABLE_CBZFZ_ENABLE_EPUBFZ_ENABLE_HTMLFZ_ENABLE_ICCFZ_ENABLE_IMGFZ_ENABLE_JPXFZ_ENABLE_JSFZ_ENABLE_PDFFZ_PLOTTERS_CMYKFZ_PLOTTERS_GFZ_PLOTTERS_NFZ_PLOTTERS_RGB	JM_MEMORYFZ_ENABLE_SVGFZ_ENABLE_XPS)
	have_TOFUhave_TOFU_BASE14have_TOFU_CJKhave_TOFU_CJK_EXThave_TOFU_CJK_LANGhave_TOFU_EMOJIhave_TOFU_HISTORIChave_TOFU_SILhave_TOFU_SYMBOLrG   r   r   r   JM_fitz_config_>  sF   r  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.
    r  r   r   )r^   r   r   r  r  r   r  r  r  r  r   r  )r  r  newcontrb	  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}nS|rFt|\}}|r]t|||dd}
t| |
|}d}d}n3|rhtd||d}
nt|}|j	stt
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   r  r   ro   r  r  )r   r   r  r   r  r  r  )r  r^   r  r  pdf_add_cjk_fontr  pdf_add_simple_fontr]  r   r   r\  r  r  r  pdf_add_cid_fontr   r^  r)  r   r   r   r  r  r  r  )r  r  r  r   r{	  r  r  r  r  r  r  r   r
  ixrefr  r   rv   r   r  extord  r|	  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   r
  )rp   r^   r
  r
  r  r
  rX  rY  rZ  r[  r
  r  r/  r  r  r  r
  r
  )r  ri  r   r  r  r  r  r  r  r  rf   r  r   r   r   r
  >  s<   (
r
  c                 C   s*  t | tjr| S t | trt| j| j| j| j} | S t | tr3t	| j| j| j| j}t|}|S t | tj	r@t| }|S | rLt
| rLt| dkrRttjS g d}tdD ]*}| | ||< || du rpttj  S || tk rzt||< || tkrt||< qZt|d |d |d |d S )z>
    PySequence to mupdf.FzIrect. Default: infinite irect
    r  r4  Nr   r   ro   r   )rp   r^   r
  r
  rY  r[  rX  rZ  r   r  r  r  r
  r  r
  r
  fz_make_irect)r   rG   rM  rf   r   r   r   r  ?  s2   



 r  c                 C   r  rN   r   )r;  r   r   r   r  3?  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
    rz  r   )r^   r   r   r   rW  r   rH  r  rI  r  r2   r   )r   r   r  r/  r  rf   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   r  z g ro   r   rk   z rg z k r  r$  )r"  r^   r  r   PDF_ENUM_NAME_DA)r   r-  r  r   r   rk  r   r   r   r  W?  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 }d }|D ]}t||}t||sHt	|sHq5t
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 ||}|rCt" }t|jj|t< t||t< t(|jj)|t*< |d u r=g }|!| q5t+||jj) q5|r|rX||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   rd  rj  r  r|  r  re  )rT   r  r   r   r   rU   u?  s   
z-JM_make_spanlist.<locals>.char_style.__init__c                 S   s2   | j  d| j d| j d| j d| j d| j S )Nrk   r  rS   r   r   r   r   ?  s   2z,JM_make_spanlist.<locals>.char_style.__str__r   )rW   rX   rY   rU   r   r   r   r   r   
char_stylet?  s    
r  r   r  r  r  r  r  ).r   r   JM_make_spanlistr^   r  r  r  r  r  r1  r  r  r  r   r  r  r  rd  rj  r3  r|  r  r  r  re  dictkey_charsre  r   JM_py_from_pointdictkey_originr  r  r  r2   r   rb  dictkey_flagsr^  dictkey_fontr  r  r<  	dictkey_cr  r0  dictkey_spans)	line_dictr8   r
  r  r  	char_list	span_list	span_rect	line_rectr  	old_styler  re  span_originr  r   rj  r  r  re  	char_dictr   r   r   r  k?  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|	}||t< ||t< |
|t< ||t< | |t< | |t< | |t< t|  |t < t!||t"< ||t#< d S )Nr  )$r  r^   r  r  r   r  r  r  r   r  r   r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r"  r  r  r  rb  r  )r  r  rs	  r/  r   r  r  ll_fz_compressed_bufferr  rk  r  r   r   r   JM_make_image_block?  s6   
r  c           
   	   C   s   t rt| j|||j|j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 r   )r   r   JM_make_text_blockr   r^   r  r  r0  r  r   r1  r   r  r  r  dictkey_wmoder  r  dictkey_dirr  r  r2   dictkey_lines)
r  r  r
  r  r  	line_list
block_rectr8   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 )Nr5  r   r   )r   r   r  r   r^   r  r  r   fz_contains_rectr   r1  r   FZ_STEXT_BLOCK_IMAGEr0  r  r   r  r  r  r  r  r  r2   dictkey_blocks)	r  r  r
  text_buffer
block_listr  r  r  r  r   r   r   r  #@  s4   

r  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   r	   r   r   ro   r   r  r   )rp   r^   r#  r&  r
   ri  r<  r  r  rM  r  r  r  r  r  )r1  r
   rf   r   r   r   r{  D@  s   
 ,r{  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  r	  r  r   r0  r1  rY  r[  rX  rZ  fz_minfz_max)r"  page_mediaboxr   r   r   r   r
  S@  s&   r
  c
                 C   s*  t rt| |||||||||	
S |}
d}t|| d }||k r[|}||krYt| |||
||||	 |d7 }|dkrK|| dkrKtd| d| d |d7 }|
d7 }
||ks'dS dS |}||krt| |||
||||	 |d7 }|dkr|| dkrtd| d| d |d8 }|
d7 }
||ksadS dS )z
    Copy a range of pages (spage, epage) from a source PDF to a specified
    location (apage) of the target PDF.
    If spage > epage, the sequence of source pages is reversed.
    r   r   z	Inserted r  z pages.N)r   r   r"  r^   fz_absi
page_merger<   )doc_desdoc_srcspageepageapager  r  rL  r  	graft_map	afterpagecounterr  r   r   r   r   r"  p@  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   r  r   Alpr   Nr   rS  ro   )r^   r   r   r   r*  r+  r  r)  r-  r   fz_atoir  r,  r  )r   temp_resr  	main_extg
main_fonts	temp_extg
temp_fontsr1  	max_fontsr/  rf   r5  r2  r5   r   r  r   r   r   r+  @  s\   	



	



r+  c                 C   s$   t |  trtd|   dS dS )z!
    redirect MuPDF warnings
    zMuPDF warning: N)rf  r2   JM_mupdf_show_warningsr<   r;   r   r   r   JM_mupdf_warning@  s   
r+  c                 C   s&   t |  trtd|  d d S d S )NzMuPDF error: rA  )rf  r2   rI  r<   r;   r   r   r   JM_mupdf_error@  s   
r,  c                 C   s   t | tsJ t| |S r   )rp   rq   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  rA  )rp   r^   r  r  r   r   r  r   r  r  r  r1  fz_append_runer<  r  r  )r   r   rk  r  r8   r  r   r   r   JM_new_buffer_from_stext_page@  s    
r/  c                 C   s~   |du rdS t |}|du rdS t|d}t| |t d}t| d}t|tdt	d t|td| |S )z
    make new PDF action object from JavaScript source
    Parameters are a PDF document and a Python string.
    Returns a PDF action object.
    Nr
  r   r  ru  r  r  )
r!	  r^   r  rC  r  r  r  r  r   r  )r  rv   r
  r   source	newactionr   r   r   JM_new_javascriptA  s   r2  c                 C   r4  r   )JM_new_output_fileptr_Output)rL  r   r   r   rV  %A  r   rV  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   r5  r6  r   )r  r   r   r   r
  )A  s   r
  c                 C   s:   t d}t |}t || || |  t | |S )Nr  )r^   r  r  r  rX  fz_terminate_buffer)r  rG  r;  r   rY  r   r   r   rX  6A  s   


rX  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  NextrE  )r   r^   r   r   r   r2   r*  r  )r   r  thisobjnewxrefr  r   r   r   r   r  ?A  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  r   r  r   r
  )r   r  r   r   r   r   r
  XA  s
   
r
  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)
    r
  )r^   r  r   r  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r   rY  r   rf  lexbufr  r   r   r   r  dA  s
   
r  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jsLJ t||	||}
|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)=rC   r
  r
  )rp   r^   r  r~  r   r  r{  r  r  r,  r  r  r
  r
  r
  r1  r  r!  r#  r"  r  r  r  rD	  r  )r  r  r  r  r  r
  r   r  r  r
  r  rG	  r   r   r   r  rA  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)rp   r^   r  rv  r  r  r   r   r  r  rt  r
  r!  r
  )rO  r  r  r  r   r   r   r  A  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   r  rA  N)r   r   r  rp   r^   r  r  r  r   r   rl  r   r  r  r1  r  r<  r  r^	  )r   r   r   r  n_blocksn_linesn_chars	n_blocks2r  n_lines2r8   n_chars2r  chbboxr   r   r   r  A  sB   




r  c                 C   s   t | |}t | }|s'|du s|jst | | dS |jr%t || dS |jr-|js2t|}ntt ||}||krYt||}|jsOt | || 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^   r   r=  r   r   r  r2  r  r  )r   key1key2rv   key1_objr  r  r1  r   r   r   JM_put_scriptA  s$   


rF  c                 C      | j | j| j| jfS r   r  r>
  r   r   r   r
  B  r  r
  c                 C   s   | j | j| j| j| j| jfS r   r%  )r1  r   r   r   r"  B     r"  c                 C   r<
  r   r]  )rO  r   r   r   r  
B  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  rS
  rQ
  rR
  )r	  r   r   r   r  B  s
   r  c                 C   rG  r   r  r>
  r   r   r   r  B  r  r  c              
   C   s  t | tjr| S t| dr!t| dkr!t| d dr!tjt|  } t | tjr,t| S t | trMt	| 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}| rlt | ttfrlt| dkrn|S t| dd u r|tt| S tdD ]l}|t| kr|  S | | }t|rt|dkr|  S t|d|| _t|d|| _|| jd u s|| jd u r|  S t|| jt|| _t|| jt|| _t|| jt|| _t|| jt|| _q|d |_
|d |_|d |_|d |_|S )	Nr  r  r   r  r4  ro   r   r   )rp   r^   r  r  r  r  rr   r  r
  fz_make_quadr-  r  r  rS
  rQ
  rR
  rq   r  r  r  r  r  rt  r
  r!  r
  )r   r	  rO  rf   r   r   r   r   r	  B  sL   $





r	  c                 C   s   t | tjsJ t|  t| tj}t|rJtd}tt	|D ]"}|dkr1t
|d t||}t|rGt|}t|| q%|S |jrRt|}|S )zK
    Read and concatenate a PDF page's /Contents object(s) in a buffer
    r_
  r   rZ  )rp   r^   r  r   r   r2	  r  r  r  rH  r  rI  r   r   fz_append_bufferr   )r  r!  r   rf   r   ry	  r   r   r   r  KB  s    




r  c                 C   s  t | tjr| S t | tjrt| S t | tr$t| j| j| j| j	S t | t
r5t| j| j| j| j	S | rAt| rAt| dkrHttjjS g d}tdD ],}t| |||< || d u rhttjj  S || tk rrt||< || tkr|t||< qPt|d |d |d |d S )Nr  r4  r   r   ro   r   )rp   r^   r  r
  r   r  rY  r[  rX  rZ  r
  r  r  r  r  r  r
  r
  )r   rM  rf   r   r   r   r  _B  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 r  r9
  r  r   r   r   r  vB  s   r  c                 C   s   | du s| j s	dS t|  td}|j rD|  }t||  }t }t }t	| || t
|| |||}t|j | j _dS dS )z<
    refreshes the link and annotation tables of a page
    NrD  )r   r^   r   r   r   r   rx  r  r#  r  pdf_load_link_annotsll_fz_keep_linkr  )r   r   r  r  r  r  r&
  r   r   r   rA  B  s   rA  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   r6  r   r   r	  )	r   r^   r#  r
  r  r   r  r  r  )r   r  cb_sizer   r  r1  r   r   r   r+  B  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                   @   rL   )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vfuzzrS   r   r   r   r   B  r   z*JM_search_stext_page.<locals>.Hits.__str__N)rW   rX   rY   r   r   r   r   r   HitsB  rZ   rP  r   r  皙?r   rA  z	haystack=z haystack_string[haystack]=)r   r   r  r   r^   r  r   r  r	  rN  rO  r/  fz_string_from_bufferfind_stringr   r  r1  r  r  on_highlight_char)r   r	  r   r	  rP  hitsr   haystack_stringhaystackbeginr  insiderf   r  r8   r  r   r   r   r   r  B  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   ro   r   r   )r^   pdf_mark_objr5  r   PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_Fontr?  rO  rD  pdf_unmark_objr+  r  r,  r   r   r  r   r2   r  )r  r  r  r  r=  r  xobjr  r/  rf   r   sxrefsubrsrcsxref_tr   r   r   r  B  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   ro   zbad choice field listr  )rp   rr   rq   r  r^   r   r=  r  r  r   pdf_array_push_text_stringpdf_array_push_arrayr  r   )r   r  r/  r   r  r  rf   r   optopt1opt2	optarrsubr   r   r   JM_set_choice_optionsC  s*   


"rh  c                 C   s,  d}d}d}|t jkrtd}t j}nM|t jkr#td}t j}t j}n=|t jkr3td}t jt jB }n-|t jkr=td}n#|t jkrJtd}t j	}n|t j
krWtd}t j	}n	|t jkr`td}|durp|jrpt |td| |dksx|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  r   PDF_BTN_FIELD_IS_PUSHBUTTONr  PDF_BTN_FIELD_IS_RADIOr  r*  r+  PDF_CH_FIELD_IS_COMBOr,  r  r   r  r  r   )r   r   r   setbits	clearbitstypenamer  r   r   r   r  8C  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!r  r   r   zpath to '%s' has indirectszcannot insert value for '%s'z/%s(%s)z/%s %s)r^   r=  r  r  r  r   rc  r  r!	  r   pdf_dict_putpr  rW  r   rX  re  rj  r  )r   r  rv   
eyecatcherr  r  r  rf   skeytestkeyr   r  r   objstrnullvalnewvalnewstrrC  r   r   r   rh  ^C  s>   








rh  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 )Nr  rH  r   rI  r  r  )	r^   r  r   r   rJ  JM_set_ocg_arrays_impr  r  rc  )r  r  r:  r  r  rk  r  r/  rf   item0r   r   r   r   r  C  s:   


r  c                 C   s2   t | }|D ]}t ||d}t | | qdS )z
    Set OCG arrays from dict of Python lists
    Works with dict like {"basestate":name, "on":list, "off":list, "rbg":list}
    r   N)r^   r=  r  r  )r  r  r  r   r   r   r   r   r}  C  s
   
r}  c                 C   s   t | }t ||d}|js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   rm  N)r^   r=  r  r   r\  r  r  r   r   r  r  r  )rn	  r   r   r  r  r  rn  r   r   r   r	  C  s   

r	  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jkr(|d}|}|r(t|td| |d}|}t|| |tjtjfv rF|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jkr|tj"O }n|tj#kr|tj$O }n|tj%kr|tj&O }t|td!| |d"}t|}|rt'|| |d#}t(|td$t) | |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j#kr|sdt+||d3d4 t,|td5d3 nt-|}|j.rt/|}t+|||d4 t,|td5| nq|rt,|td5| nd|tj0kr|d6u 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jtjfv rt!|td8 t1|  t2| d4 t3| d4 t4|  dS )9z
    Update the PDF form field with the properties from a Python Widget object.
    Called by "Page.add_widget" and "Annot.update_widget".
    ztype(annot)=r?  c                    s   t  | d S r   )r   r  rp  r   r   GETATTRC  r  z)JM_set_widget_properties.<locals>.GETATTRr  r   r  r   rz  r  r  r>  ru  rw  r~  Nrt  r}  r  r  MaxLenr  r{  rx  ru  ry  r%	  r  r	  DSRCr  rn  r  r  r  r  rx  ry  r  rS  r  rz  r  r  r  r{  r  r|  r  r  r   r  Tr  r  )5rp   r   r   r^   r   r   r   r   r   r  r+  r,  r3  r  r  r  r  r  pdf_field_set_fill_colorr  r  r   r!	  r  r  r*  r   pdf_field_set_displayr+  r,  rh  r  r  r   rq  r  rp  r  ro  pdf_field_set_button_captionrF  r  r  pdf_set_field_valuer  pdf_button_field_on_stater   r)  r  r   pdf_set_annot_hotpdf_set_annot_activer   )r   r  r   r   r  r  rv   r  r   rot_matr/  fill_colr  rf   r  
border_colri  r   old_namer  r  r   ry  r|  r  r   r5   onstater:  r   rp  r   JM_set_widget_propertiesC  s  
$












r  c                 C   s   d}|t |k r\t||d  \}	}
||	7 }t||
}|dkr,t||
d|\}}n|}t| ||||
||||	 t|||}|dkrNt||d}nt|d| }|t |k s|S rN   )r  r^   fz_chartoruner  r  fz_show_glyphr  fz_pre_translate)r5   	user_fontr  r  r  
bidi_levelr  r  rf   r  ucsr  r  r  r   r   r   r  D  s   
r  c                 C   s<   t | }|jdd}|td}|dkr|d | }|S )Nrj  r  r   )r^   r  r  r`   r  )r  
buff_bytesr   r  r   r   r   r  D  s   
r  c                 C   s   t d|   dS )z
    Generate a warning.
    z	warning: Nr  r;   r   r   r   r   D  s   r   c                 C   s   |r:t |\}}|dkr:t|}t|t jsJ |jr:t |\}}||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   Nr   )
r^   r  r  rp   r  r   r  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecoder  )r   r   r   rG  rc  r  buffer_compressedlength_compressedr   r   r   r   D  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rBt||}	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   )rp   r^   PdfGraftMapr   r  r   r   r   r	  r  r   r   pdf_graft_mapped_objectpdf_graft_objectr  r	  r#  r  r   r  )r*  fsrcpager   gmapr	  srcpagespagerefr   rN  r  r   r   r   r   r	  D  s    
r	  c                 C   s   t | ttfS r   )rp   rr   rq   r  r   r   r   r  D  r$   r  c                 C   r4  r   )r  r  r   r   r   r  D  r   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 sequencerH  zbad filetypezbad locationzbad config numberzbad layer numberzbad 'oc' referencezbad page idr/  zPDF has no rootzrect is infinite or emptyzbad type: 'text'r@  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager.  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                 C   s   t | r   )r   )rw  excr   r   r   r\  E  r	  r\  strictc                 C   sJ   | sdS t | tr| jd|d}nt | tr| d d  }|jd|d}|S )Nr%   r
  r  raw_unicode_escape)rp   r   rC  r   r  )r  r  r_   rG   r   r   r   r  $E  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 )Nr  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   rq   rr   r  r!  rt  r   r<  r   r   r   r  0E  s   r  r   r   c                 C   s&   |   D ]}|d |kr|  S qdS )zGReturn an entry in the page's font list if reference name matches.
    r  N)rK
  )r   r   rM  r   r   r   rs
  ;E  s
   rs
  c                 C   s$   | j D ]}||d kr|  S qdS )z3Return a font info if present in the document.
    r   N)rL  )r   r   rM  r   r   r   rt
  CE  s
   
rt
  r	  c                 C   sL   t | rt| }|jfS t| r| fS | D ]}t |s#t|s#tdq| S )Nzbad quads entry)r{  r   r  r|  r   )r	  r   r	  r   r   r   r	  KE  s   r	  c                 C   s   t | sdS t| ttfv rt| dkstdt| d dkr(t| d dks,td| d d | d d	   krAdksFtd
 td
dS )NFro   z$morph must be a sequence of length 2r   r   r	   zinvalid morph param 0r  r   zinvalid morph param 1T)r  r   rq   rr   r  r   r  r   r   r   r  WE  s    "r  c                 C   r  r   )r  r   r   r   r  r   r   r   r  cE  r   r  r	  c                 C   s4   zt | }W |jS  ty   tdkrt  Y dS w )zkCheck whether an object is convex, not empty  quad-like.

    It must be a sequence of 4 number pairs.
    r   F)r
  r   r   r?   rR  )r	  q0r   r   r   r|  iE  s   
r|  r   c                 C   s>   zt | } W n ty   tdkrt  Y dS w | jp| j S )zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    r   F)r   r   r   r?   r  r  r>
  r   r   r   r{  vE  s   r{  rM  c                 C   s   | sdS t | dr| f} t|  t| dkr*t| d d }|dkr&|d S |d S t| d	krDtt| d }|dkr@|d
 S |d S tt| d }|dkrT|d S |d S )Nr%   r  r   r   rk   r<  zG zg r   zRG zrg zK zk )r  r  r  rs   rr   )r<  rM  r  r   r   r   rB  E  s   
rB  c                    s   |    t  fdd}z6dkrt  tdd t |}|D ]}t|}t|| q't	| t
|d |  W t|S  tyW   trQt  |  Y d S w )Nc                      s&   dkrt   td d S d S )Nr   r   )r^   r   r   r   r   r.  r  r   r   r  E  s   z$Page__add_text_marker.<locals>.finalr   r   r  )r  r
  r^   r   r   r   r  r	  pdf_add_annot_quad_pointr   r  r   r   r?   r   )rT   r	  r|  r  r   r  r	  r   r  r   r	  E  s&   


r	  c                 C   s   t | tsJ ttd|  S )Nr>  )rp   r   r   r^   r  r   r   r   r   E  s   r   r  c                 C   sV   |d }d}t | jD ]\}}|d |krd} nq|r#|| j|< d S | j| d S )Nr   FT)rl  rL  r2   )r   r  r   rM  rf   fir   r   r   UpdateFontInfoE  s   r  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>. `type(None)`
    will match an arg whose value is `None`.
    r   NFr   T)r  r  rp   rr   )r  r	  r2  rf   r  r   r   r   r  E  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	  ro   g      )r  r^   	fz_rotaterX  rY  rZ  r[  rt  r!  r
  r  r  fz_scalefz_translater  r  )r  rh  r  r  keeptrectr  trwtrhr   r  largefwfhsmallrM  tmpr'  r   r   r   r]	  E  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   rQ  )r   r  r  r  r  r  
first_charrd  )r8   r  r   r   r   r  F  s   ("r  c                 C   sD   |  dt |  dtt|  d}t| D ]
}|d| d7 }q|S )Nrk    (z):
r
  rA  )r   r  r  )r  rG   rf   r   r   r   dir_strF  s   "r  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   rg   *F  s   ( zgetTJstr.<locals>.<listcomp>c                    s0   g | ]}t |d k rd t | d  ndqS )r  r  r   r  r  r  r"  r   r   rg   -F  r'  r   c                    s    g | ]}d  t | d  qS )%04xr   r  r  r  r   r   rg   3F  r  c                 S   s   g | ]}d t | qS )r  r  r  r   r   r   rg   5F  r  )r   rf  r  rc  )r5   r"  r   r  otxtr   r  r   r*  F  s   r*  r  c                 C   s   t | sdS dd }d}| D ]a}t|}|dkr||   S |dkr3|dk r3|dv r.|d	7 }||7 }q|dkr>|d
| 7 }q|dkrG|d7 }q|dkrP|d7 }q|dkrY|d7 }q|dkrb|d7 }q|dkrk|d7 }q|d7 }qd| d S )a   Return a PDF string depending on its coding.

    Notes:
        Returns a string bracketed with either "()" or "<>" for hex values.
        If only ascii then "(original)" is returned, else if only 8 bit chars
        then "(original)" with interspersed octal strings 
nn is returned,
        else a string "<FEFF[hexstring]>" is returned, where [hexstring] is the
        UTF-16BE encoding of the original.
    z()c                 S   s&   t ddgt | d }d|  d S )NrU  r
  zUTF-16BE<>)r  hex)r  r   r   r   r   make_utf16beGF  s   z!get_pdf_str.<locals>.make_utf16ber%   r
     r  )r  r  r  r  z\%03orF  z\br  z\tr  r  rH  z\fr[  z\rz\267r  r  )r  r  )r  r  r   r<  rp  r   r   r   r  :F  s8   






r  c                  C   sB  t d} | dur| S tjdkrd}nd}t j|r|S 	 ddl}tjdkr[|jddddd	}|j	 }|j
s:|s@td
 dS t j|}t j|d}t j|rU|S td dS |jddddd	}|j	  }|j
stt|dkrztd
 dS d}| D ]}| D ]}t|dr|} nqq|dur|S t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.
    ry   Nwin32z'C:\Program Files\Tesseract-OCR\tessdataz&/usr/share/tesseract-ocr/4.00/tessdatar   zwhere tesseractr   )shellcapture_outputr9	  zTesseract-OCR is not installedFr  z2unexpected: Tesseract-OCR has no 'tessdata' folderzwhereis tesseract-ocrro   z2unexpected: tesseract-ocr has no 'tessdata' folder)r   getenvr{  platformr-   rS  
subprocessr%  stdoutstrip
returncoder<   dirnamerc  r  r  iterdirr   rf  )ry   r  r  r  r  r  sub_responsesub_subr   r   r   get_tessdataoF  sN   




r  )CSSr{  r   fontcoder  r{  c                   s   d}t |turtd|du rd} fddt D }|g kr)td  dt|d	kr3td
|du 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 pymupdf.Story, execute 'set_font(fontcode)'. The correct
    font weight (bold) or style (italic) will automatically be selected.
    Expects and returns the CSS source, with the new CSS definitions appended.

    Args:
        fontcode: (str) font code for naming the font variants to include.
                  E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
                  A maximum of 4 font variants is accepted.
        CSS: (str) CSS string to add @font-face definitions to.
        archive: (Archive, mandatory) where to place the font buffers.
        name: (str) use this as family-name instead of 'fontcode'.
    Returns:
        Modified CSS, with appended @font-face statements for each font variant
        of fontcode.
        Fontbuffers associated with "fontcode" will be added to 'archive'.
    z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an ArchiveNr%   c                    s   g | ]	}|  r|qS r   r!  )re   r'  r  r   r   rg   F  r  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   r  r  r  r  )r  r  r{  r   CSSFONT	font_keysfkeyr  r  r  fbuff	bold_textitalic_textr   r  r   css_for_pymupdf_fontF  s,   )
r  r   r  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   rg   G  s   4 z#get_text_length.<locals>.<listcomp>)r  r  r  ro
  r  rp
  r  rq
  zFont '%s' is unsupported)
rz  r  r   symbol_glyphszapf_glyphsr  r  util_measure_stringr  r   )r5   r   r   r  r  r   r   r  r   get_text_lengthF  s"   

r  rX  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   r   image_profile)rX  rf  r   r   r   r  G  s   




r  c                    sf  t  jtsJ t js jr, jdu rJ t j j j}|s'td d _dS  fdd}t  jts:J t j}|dkrF| S  jt	 }|dkrR| S  j|d  }|t	 }|dkrd| S |t
 } jt
 }||krt| S z j D ]\}	}
|	|vr|
||	< qzd}W n ty   trt  d	}Y nw |dkrd
|t	<  j  dS td |  dS )aq  
    Append current path to list or merge into last path of the list.
    (1) Append if first path, different item lists or not a 'stroke' version
        of previous path
    (2) If new path has the same items, merge its content into previous path
        and change path["type"] to "fs".
    (3) If "out" is callable, skip the previous and pass dictionary to it.
    Nr   z2calling cdrawings callback function/method failed!c                      s     j  j   j  d S r   )rY  r2   pathdictr  r*  r   rG	  r   r   r2   OG  s   zjm_append_merge.<locals>.appendr  r   rM  r   rg  z$could not merge stroke and fill path)rp   rY  rq   r	  r
  r   r  r<   r  r  dictkey_itemsr#  r   r   r?   r*  )rG	  respr2   r  thistyperB  prevtype	previtems	thisitemsr'  rF   r_   r   r  r   jm_append_merge4G  sP   






r  c                 C   s:   | j s| j|t|f d S | j|t|| jf d S r   )r	  r  r2   r  
layer_name)rG	  r  r   rD  r   r   r   jm_bbox_add_rect{G  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  )rG	  r  rs	  r  r  color_paramsr   r   r   r   jm_bbox_fill_imageG  s   r  c                 C   s:   zt | |ttj|d W d S  ty   trt   w )Nzfill-imgmask)r  r^   r  fz_unit_rectr   r   r?   )rG	  r  rs	  r  r  r|  r  r  r   r   r   jm_bbox_fill_image_maskG     
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_pathr   r   r?   	rG	  r  r-   r
  r  r  r|  r  r  r   r   r   jm_bbox_fill_pathG  s   
r  c                 C   s8   zt | |t||d W d S  ty   trt   w )Nz
fill-shade)r  r^   ll_fz_bound_shader   r   r?   )rG	  r  shader  r  r  r   r   r   jm_bbox_fill_shadeG  s   
r  c                 G   :   zt | |t|||d W d S  ty   trt   w )Nzstroke-textr  r^   ll_fz_bound_textr   r   r?   )rG	  r  r5   r  r  r  r   r   r   jm_bbox_stroke_textG  r  r  c                 G   s:   zt | |t|d |d W d S  ty   trt   w )Nz	fill-textr  )rG	  r  r5   r  r  r   r   r   jm_bbox_fill_textG  r  r  c                 C   s   t | |t|d |d d S )Nzignore-text)r  r^   r  )rG	  r  r5   r  r   r   r   jm_bbox_ignore_textG  rH  r  c	           	      C   r  )Nzstroke-pathr  )	rG	  r  r-   r  r  r  r|  r  r  r   r   r   jm_bbox_stroke_pathG  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   rF  r  r   ro   r	   rK  r   r   r
  )r  r  r  r  r  r  r  	linecountr^   rI  r  )
rG	  r#  r  rM  rf   r8   r  lpr	  r   r   r   r   jm_checkquadG  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   ro   r   r  )
r  r  r  r  r  r  r  r^   r  r  )rG	  r  r#  r  line0rQ
  rR
  line2rS
  r-  r   r   r   r   r   jm_checkrectG  s2   
	r  c           	   	   C   s.   |j }	 |sd S t| ||||||| |j}qr   )headjm_trace_text_spanr  )	rG	  r5   r  r  r  r|  r  seqnore  r   r   r   jm_trace_textH  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 }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sM|jdksM|
j'dkrX|
j'|
j( krX|j| }|j| }n
|j| }|j| }t)||||} t*| |} |+|!|j%|!|j"|j|jf| j,| j-| j.| j/ff |dkrt0|| }q| }qt1|}|s|st2| ddd\}!}t#| |!|jj$}||9 }|s|}n|}t3 }"t4||"d	< t5|	|"d
< |jj$|"d< ||"d< |jj6|"d< |jj7|"d< ||"d< ||"d< d|"d< |rt8t9t:||t; t9 t< }#|#dd }#nd}#| j=dkr%| j=}$n|d }$|#|"d< ||"d< ||"d< |$|"d< ||"d< ||"d< t>||"d< | j?|"d< ||"d< ||"d< | j@+|" dS )z
    jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
    Nr   r   r  r  r  r   rZ  r  r  r  rj  bidi_lvlbidi_dirr  r  r   r  rv  r%  r|  rd  r	  	linewidth
spacewidthr   r   layerr	  r{  )Arp   r^   fz_text_span
FzTextSpan	fz_matrixr#  r3  r  r  r  fz_transform_vectorr
  r  r  r  r  fz_normalize_vectorr  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r#  r  r  r  r  r  ri  r<  r  r,  r2   rY  r[  rX  rZ  r  rr   r  r   r  r^  r  r  fz_convert_colorr  r  r|  r  r  r  r  rY  )%rG	  re  r  r  r  r|  r  r	  out_fontr   r'  r  r  	space_advr  r  ascsizedscsizefflagsr  last_adv	span_bboxr  r{  rf   r  	char_origr.  rY  rX  r[  rZ  	char_bboxr<  	span_dictrt  r  r   r   r   r  H  s   



 $






r  c                 C   sb   | r/zt t jj}t  }t | ||jd | }W n ty(   tr't	   w |d d S dS )Nr   r   )
r^   r  r  r  ll_fz_convert_colorr   r}  r   r   r?   )r  r|  r  r  rt  r   r   r   jm_lineart_colorH  s"   	
r!  c                 C   s   t | jtr	g | _g | _d S r   )rp   rY  rq   scissorsrG	  r  r   r   r   jm_lineart_drop_deviceH  s   
r$  c	           	      C   s   |rdnd}zat |tjs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< | j| jd< | jrZ| j| jd	< t|  |  jd
7  _W d S  tyt   trst   w )NTFrM  r
  r
  r   r	  r  rR  r   )rp   r^   r  r#  r  trace_device_FILL_PATH	path_typejm_lineart_pathr  r  r!  r  pathrectdictkey_rectr	  r  r
  rj  r  r   r   r?   r  r   r   r   jm_lineart_fill_pathH  s.   




r*  c              	   C   s,   	 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)=r
  ztype(color_params)=z color_params=r   )r9   r   r
  r	  )rG	  r  r5   r  r  r|  r  r  r   r   r   jm_lineart_fill_textH  s   	r+  c              	   C   s*   t | |d|d d d| j |  jd7  _d S )Nr   r   r
  r	  )rG	  r5   r  r   r   r   jm_lineart_ignore_textI  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 r   )r   rU   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathrG	  )rT   rG	  r  r   r   rU   I  s   

zWalker.__init__c                 C   s   zN| j jdkrt| j rW d S d| j _| j jrB| j j| j jkr;dt| j jt| j jf}| j jt 	| | j j| j _d| j jd< nd| j jd< d| j _W d S  t
y[   trZt   w )Nr   r   r  Fr	
  T)rG	  r  r  havemove	lastpoint
firstpointr  r  r  r2   r   r   r?   )rT   r  r  r   r   r   	closepathI  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yz   tryt   w )Nr   r<  )rG	  r  r^   r
  r  r  fz_include_point_in_rectr(  r  r5  r  r  r2   r   r   r?   )rT   r  rX  rZ  x2y2x3y3r  r  r  r  r   r   r   curveto9I  s.   

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y_   tr^t   w )Nr  r   r  )r^   r  r
  rG	  r  r8  r(  r  r5  r  r  r2   r  r&  r%  r  r   r   r?   )rT   r  r  r  r  r  r#  r   r   r   linetoTI  s$   


zWalker.linetoc                 C   s   	 z<tt||| jj	| j_
t| jjr-t| jj
j| jj
j| jj
j| jj
j| j_| jj
| j_d| j_d| j_W d S  tyJ   trIt   w )Nr   zself.dev.pathdict:z.    {type(n)=} {len(n)=} {n!r} {n}: {v!r}: {v}r   )rp   rG	  r  r   r9   r#  r^   r  r
  r  r5  r1  r(  r  r  r  r6  r4  r  r   r   r?   )rT   r  r  r  r/  rF   r   r   r   movetoiI  s(   

zWalker.moveto)	rW   rX   rY   rU   r7  r=  r>  r?  r  r   r   r  r   r/  I  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  r5  r   r  r  r/  fz_walk_pathFzPathll_fz_keep_pathr   r   r   r?   )rG	  r  r-   walkerr   r   r   r'  I  s   



r'  c	                 C   s  zt |tjs	J d| _|jdkr"t|jt|jkr"t|j| _n|jdkr7t|jt|jkr7t|j| _t	|| _
t| _t| || | jd u rNW 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rd	| jd< |jrtd
}	t|	d t|jD ]}
t|j|
}t|	t| j|  d qt|	dt| j|j   |	| jd< nd| jd< t| j | jt!< | j"| jd< | j#| jd< | j$r| j%| jd< t&|  |  j#d7  _#W d S  t'y   t(rt)   w )Nr   r   r  r
  r|  r

  r
  r	
  Fr  z[ rk   z] r  r  r  r	  rR  )*rp   r^   r  
pathfactorr
   ry  r  ri  r<  r#  r  trace_device_STROKE_PATHr&  r'  r  r  r!  r  r  	start_capdash_capend_caplinejoindash_lenr  r^	  r  floats_getitem	dash_listrs   
dash_phaser  r(  r)  r  r	  r
  rj  r  r   r   r?   )rG	  r  r-   r  r  r  r|  r  r  r  rf   rv   r   r   r   jm_lineart_stroke_pathI  sV   







rN  c                 C   s   | j sd S t|| _t| _t| || | jd u rd S d| jt< t	|| jd< d| jvr1d| jd< t
t| | jd< | j| jd< | j| jd< t|  |  jd7  _d S )	Nr  r
  r	
  Fr
  rR  r  r   )r
  r^   r#  r  trace_device_CLIP_PATHr&  r'  r  r  r  r  compute_scissorrj  r  r  )rG	  r  r-   r
  r  r
  r   r   r   jm_lineart_clip_pathI  s    



rQ  c                 C   s   | j sd S t|| _t| _t| || | jd u rd S d| jd< d | jd< d| jvr/d| jd< tt	| | jd< | j
| jd< | j| jd< t|  |  j
d	7  _
d S )
Nr  r  r
  r	
  Fr
  rR  r  r   )r
  r^   r#  r  trace_device_CLIP_STROKE_PATHr&  r'  r  r  rP  rj  r  r  )rG	  r  r-   r  r  r
  r   r   r   jm_lineart_clip_stroke_pathI  s    




rS  c                 C   $   | j sd S t|  |  jd7  _d S r  r
  rP  rj  )rG	  r  r5   r  r  r
  r   r   r   jm_lineart_clip_stroke_textJ     rV  c                 C   rT  r  rU  )rG	  r  r5   r  r
  r   r   r   jm_lineart_clip_textJ  rW  rX  c                 C   rT  r  rU  )rG	  r  rs	  r  r
  r   r   r   jm_lineart_clip_image_maskJ  rW  rY  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  rj  )rG	  r  r  r   r   r   jm_lineart_pop_clipJ  s   
rZ  c                 C   s   |r|| _ d S d| _ d S Nr%   r  )rG	  r  r   r   r   r   jm_lineart_begin_layer$J  s   

r]  c                 C   s
   d| _ d S r[  r\  r#  r   r   r   jm_lineart_end_layer+J  r  r^  c              	   C   sR   | j sd S dt|t|t|t||| j| jd| _t|  |  jd7  _d S )Nrj  )r   r   isolatedknockoutr4  r	  rR  r  r   )	r
  r  r  r^   fz_blendmode_namerj  r  r  r  )rG	  r  r   r  r_  r`  r4  r  r   r   r   jm_lineart_begin_group/J  s   
rb  c                 C   s   | j sd S |  jd8  _d S r  )r
  rj  r#  r   r   r   jm_lineart_end_groupAJ  s   rc  c	           	   	   C   s*   t | |d||||| j |  jd7  _d S r  r,  )	rG	  r  r5   r  r  r  r|  r  r  r   r   r   jm_lineart_stroke_textHJ  s   rd  c	           	      C   s   |j | _ t| | d S r   )r  jm_increase_seqno)	rG	  r  r-   r  r  r  r|  r  r  r   r   r   jm_dev_linewidthMJ  r  rf  c                 G   s0   z
|  j d7  _ W d S  ty   trt   w r  )r	  r   r   r?   )rG	  r  vargsr   r   r   re  RJ  s   
re  r  r  c                 C   s   t | } t |}tt| |S )am  Compute matrix which maps line from p1 to p2 to the x-axis, such that it
    maintains its length and p1 * matrix = Point(0, 0).

    Args:
        p1, p2: point_like
    Returns:
        Matrix which maps p1 to Point(0, 0) and p2 to a point on the x axis at
        the same distance to Point(0,0). Will always combine a rotation and a
        transformation.
    )rv  r&  rP
  )r  r  r   r   r   r  ZJ  s   r  c                       s$   e Zd Z fddZdd Z  ZS )JM_image_reporter_Filterc                    r  r   r  rS   r  r   r   rU   kJ  r  z!JM_image_reporter_Filter.__init__c                 C   s0   t |tjsJ t| t||| trdS d S rN   )rp   r^   r  r  r#  r]   r  r   r   r   r  oJ  s
   z%JM_image_reporter_Filter.image_filter)rW   rX   rY   rU   r  r  r   r   r  r   rh  jJ  s    rh  c                       sD   e 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-  c                    sj   t    || _|| _|   |   |   |   |   | 	  | 
  |   |   |   d S r   )r   rU   r  r	  use_virtual_fill_pathuse_virtual_stroke_pathuse_virtual_fill_textuse_virtual_stroke_textuse_virtual_ignore_textuse_virtual_fill_shadeuse_virtual_fill_imageuse_virtual_fill_image_maskuse_virtual_begin_layeruse_virtual_end_layer)rT   r  r	  r  r   r   rU   yJ  s   
z"JM_new_bbox_device_Device.__init__)rW   rX   rY   rU   r]  begin_layerr^  	end_layerr  	fill_pathr   stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shader  
fill_imager  fill_image_maskr  r   r   r  r   r-  xJ  s    r-  c                       r.  )r3  c                    s4   t    || _|   |   |   |   d S r   )r   rU   rL  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)rT   rL  r  r   r   rU   J  s   
z%JM_new_output_fileptr_Output.__init__c                 C   s   | j ||S r   )rL  r  )rT   r  r  whencer   r   r   r  J  r$   z!JM_new_output_fileptr_Output.seekc                 C   s   | j  }|S r   )rL  tell)rT   r  rG   r   r   r   r  J  s   
z!JM_new_output_fileptr_Output.tellc                 C   r  r   )rL  truncate)rT   r  r   r   r   r  J  r  z%JM_new_output_fileptr_Output.truncatec                 C   s   t ||}| j|S r   )r^   raw_to_python_bytesrL  rM  )rT   r  data_rawdata_lengthr
  r   r   r   rM  J  s   z"JM_new_output_fileptr_Output.write)	rW   rX   rY   rU   r  r  r  rM  r  r   r   r  r   r3  J  s    r3  c                 C   sd   | j du r	t | _ t| j }|dkr%| j |d  }t|}t|| j}n| j}| j t| |S )zs
    Every scissor of a clip is a sub rectangle of the preceding clip scissor
    if the clip level is larger.
    Nr   r   )	r"  rq   r  r  r^   r  r(  r2   r  )rG	  num_scissorslast_scissorr
  r   r   r   rP  J  s   

rP  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| _%t& | _d| _'d| _(d| _)d S Nr   r%   )*r   rU   ri  rj  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textrk  rl  rm  rn  ro  rp  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_grouprq  rr  rY  r	  rj  r
  r
  r"  r  r(  r  r^   r#  r	  r  r  r  r5  r6  r4  r  rD  r  r&  )rT   rY  r
  r
  r  r   r   rU   J  sL   







z%JM_new_lineart_device_Device.__init__)%rW   rX   rY   r[  rU   r*  ru  rN  rv  rY  clip_image_maskrQ  	clip_pathrS  clip_stroke_pathrX  	clip_textrV  clip_stroke_textre  rw  rx  ry  rz  r{  r|  rZ  pop_cliprb  begin_grouprc  	end_groupr]  rs  r^  rt  r  r   r   r  r   r	  J  s*    5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 )rk
  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   rU   ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rY  r	  rj  r
  r
  r   r  rq   r"  r  r^   r#  r	  r  r  r  r5  r  r(  rD  r  r&  r  )rT   rY  r  r   r   rU   K  s:   






z JM_new_texttrace_device.__init__)rW   rX   rY   r[  rU   re  ru  rf  rv  r+  rw  rd  rx  r-  ry  rz  r{  r|  r]  rs  r^  rt  r  r   r   r  r   rk
  K  s    $rk
  c                  C   s(   ddl } ddl}|| d  S )#
    Adobe Glyph List function
    r   Ns~  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)r  gzip
decompress	b64decoder  re  )r  r  r   r   r   _get_glyph_textIK  s      S   r  rT  rf   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)rz  textwrapdedent)
rf   r/   r   r  r=  r  r  r5   r  r   r   r   r   ConversionHeader"M  s.   


r  c                 C   sd   |   }d}d}d}d}|}|dkr|}|S |dkr|}|S |dkr&|}|S |dkr.|}|S |}|S )	Nr%   z]
}z</body>
</html>
z</document>
r=  r  r  r  )rz  )rf   r   r5   r  r=  r  r  r   r   r   r   ConversionTrailerXM  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 r  r  rg  0xNr  rY  base)_adobe_unicodesr  r   r  r   rr   r  r8   gnameuncr<  r   r   r   adobe_glyph_namesmM     


r  c                  C   r  r  )r  r  r   r  r   rr   r   r  r   r   r   adobe_glyph_unicodes{M  r  r  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  r   r0  r   r  r7  )r   r	  r   r   r   r	  M  s   
r	  r   c                 C   s:   t | tsJ t |tsJ | |_|| jt|< d|_dS )zuClean up after annotation insertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)rp   r   r   r   r  r  r   )r   r   r   r   r   r	  M  s
   
r	  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)   rk   rA  	r  Zr
   )rp   r   r  r  r   r   r   canonM  s   $r  c                 C   s,   t | tsJ t| \}}t|}||fS r   )rp   r   r^   r  r  )r  r/  r<  r   r   r   chartocanonM  s   r  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  ru  rw  r  r   r  r   )	r^   r   r   r  string_in_names_listr   rW  dest_is_valid_pagerI  )rN  r'  page_object_nums
names_listrO  r   r   r   dest_is_validM  s2   
	


r  c                 C   s:   t | }|dkrdS t|D ]}|| |kr dS qdS r  )r^   r   r  )r   r  ry  numrf   r   r   r   r  M  s   
r  c                 C   sR   t | tsJ tt| D ]}t| |d  |}|d ur&||7 }||f  S qdS )Nrt  )rp   r   r  r  match_string)r  r	  rf   r  r   r   r   rS  M  s   rS  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  ro   rB   r  zD:%Y%m%d%H%M%Srj   r2  )timer   ry  altzonerjuststrftime	localtime)r  tztstampr   r   r   r  M  s   

r  c                   @   s   e Zd ZdZdd ZdS )ElementPositionzDConvert a dictionary with element position information to an object.c                 C   r  r   r   rS   r   r   r   rU    N  r   zElementPosition.__init__Nrt  r   r   r   r   r  M  s    r  c                   C   s   t  S r   )r  r   r   r   r   make_story_elposN  r}  r  r  r4  r  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.
    Nr   r   )rj  r  r  r   rm  c                 S   r  r   )rZ  )r   r   r   r   rr  7N  rs  z)get_highlight_selection.<locals>.<lambda>r@
  rQ  )r   r   rw  rx  r  r[  rZ  r  r  get_textr2   rz  r
  rh  r  insert)r   r  r4  r  r  rm  ri  r   r8   bboxfr   bboxlr   r   r   r	  N  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 )r  r  rg  Nr  rY  r  i  )r  r  r   r  r   r   )r   r8   r  r  r<  r   r   r   r  QN  s   


r  c                 C   s2   |j |j  }|j|j }t|| j  || j  S r   r  r  r^   fz_absr  r
   ri  dxdyr   r   r   hdist_N     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   r  r  r   rw  rh  r  r  r  r  r2   )r   r  r  rw  rh  r  delta_hdelta_vr   rowrf   rectsnrowr   r   r   
make_tableeN  s*   

r  c                 C   s   t | j}t |}t d}t t |tdtd}t ||}t 	|s0t 
||d}t |}d}t |}t|D ]}	t t ||	}
||
krSd} nq@|sct |t ||d dS dS )zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    r  r  r  ro   r   r   N)r^   r   r   r=  r  r   r  r   r   r  rJ  rH  r   r  rI  r  r  )r   r   r  
PDFNAME_COacror  r/  rM  r   rf   r  r   r   r   r  N  s.   




r  r  c                    s   dd dd  fdd}| \}}	}
}| dur!| \}}	|dur+|\}
}|dur1|}|dur7|}	|dur=|}
|durC|}||	|
|fS )a  
    Helper for initialising rectangle classes.
    
    2022-09-02: This is quite different from PyMuPDF's util_make_rect(), which
    uses `goto` in ways that don't easily translate to Python.

    Returns (x0, y0, x1, y1) derived from <args>, then override with p0, p1,
    x0, y0, x1, y1 if they are not None.

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

    Where top-left and bottom-right are (x, y) or something with .x, .y
    members; rect is something with .x0, .y0, .x1, and .y1 members.

    2023-11-18: we now override with p0, p1, x0, y0, x1, y1 if not None.
    c                 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 )Nro   r   r   rt  )
rp   rq   rr   r  rv  r^   r  r`  r  r  )r
  r   r   r   get_xyN  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 r   )rp   rr   rv  r  r  r   r
  r^   r  fz_rectrY  r[  rX  rZ  rq   r(  r   r   r   
make_tupleN  s   

z"util_make_rect.<locals>.make_tuplec                     sz  t  dkrdS t  dkrY d } t| ttfr*t | dkr*| \}}g ||R S t| ttfrSt | dkrS| \}}}|}|}|}g |||R }|S | } | S t  dkrk 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  )	Nr   r4  r   ro   r   rt  r  r  )r  rp   rq   rr   r   )r
  r  r  r
   ri  r<  rG   rY  r[  rX  rZ  r  r  r  r   r   handle_argsN  s:   
z#util_make_rect.<locals>.handle_argsNr   )r  r  rY  r[  rX  rZ  r  r  ret_x0ret_y0ret_x1ret_y1r   r  r   r  N  s   
r  c              	   G   sT   t || |||||d\}}}	}
dd }||}||}||	}	||
}
|||	|
fS )Nr  c                 S   s   t | }|S r   )r   )r  rG   r   r   r   convertN  s   z util_make_irect.<locals>.convert)r  )r  r  rY  r[  rX  rZ  r  r
   ri  r<  r  r  r   r   r   r9  N  s    r9  c                 C   s   t tt| S r   )r
  r^   r  r  r^  r   r   r   r  O  r  r  c                 C   s(   t rt| |S ttt| t|S r   )r   r   r  r  r^   r,  r  r{  )r   r  r   r   r   r  
O  s   r  c                 C      t tt| t|S r   )r  r^   r  r  r+
  r,
  r   r   r   r  O     r  c                 C   s   t t| t|S r   )r^   fz_is_point_inside_rectr  r  )rO  r   r   r   r   r  O  s   r  c                 C      t tt| t|S r   )r  r^   r8  r  r  )r   rO  r   r   r   r  O  r  r  c                 C   s   t | }t|}t||S r   )r  r	  r^   fz_is_point_inside_quad)r  r   rO  r	  r   r   r   rz  (O  s   rz  c                 C   r  r   )r  r^   r  r  r{  )r  r  r   r   r   rp  .O  r  rp  c                 C   r  r   )r  r^   r  r  r  r   r   r   r  7O  r  r  c                 C   r  r   )r"  r^   r  r{  )r.  r?  r   r   r   rA  @O  r  rA  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)=rC   r   )r   r   )rp   rr   rq   r^   r#  r  r&  r
   ri  r<  r  r  rM  r   r  ry  r{  
float_infoepsilonr{  )r  rG   rY  r
   detr  rdetr   r   r   r=  IO  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  r  PDF_SIMPLE_ENCODING_GREEKfz_iso8859_7_from_unicodePDF_SIMPLE_ENCODING_CYRILLICfz_windows_1251_from_unicodefz_windows_1252_from_unicoder  r  )r5   r   r   r  r  r   r  r   r<  r  r#  rG   r   r   r   r  pO  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  r
  r  r  r  r  r  )	r  r  r   r<  rO  r	  r  r.  r?  r   r   r   r  O  s   "
r  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  r
  r  r  r  r"  r  )r  r  r<  rO  r  r.  r?  r   r   r   rP
  O  s   "rP
  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   rk   )r  r  )	h0r  r  r/  r  r  hcdelta_nncr   r   r   r  O  s>   r  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 rj
  )rp   r^   r  r  r   rd  rO  rN  r  r  r	  r	  r  r  rR
  rQ
  vdistrS
  r-  r2   )rU  r8   r  rO  rN  ch_quadr  r  r   r   r   rT  O  s(   

rT  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|sqt|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.
    r  r   r
  r	  r	  r	  r	  r   UserUnitr  r  r   rD  r   r  r  r  rC  r  zskipping widget annotationr  r   N)r   r   r  r   r^   r  r  r  r  r  r  r   r  r   r   rH  rJ  rI  r*  r   r  r5  r   r  r   r  r   r  r  )r  r  	page_frompage_tor  r  copy_annotsr  known_page_objspage_refr  rf   r   r  r/  r  rN  r  r  r   rn	  r   r   r   r  O  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  rh  r   r   r   
paper_rect&P  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.
    rO  z-lr  Nr]  z-pr  r   r   )rz  rf  paper_sizesr   )r  rd  rM  r_   r   r   r   r  -P  s   

r  c                   C   s   i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdO
S )Pa6  Known paper formats @ 72 dpi as a dictionary. Key is the format string
    like "a4" for ISO-A4. Value is the tuple (width, height).

    Information taken from the following web sites:
    www.din-formate.de
    www.din-formate.info/amerikanische-formate.html
    www.directtools.de/wissen/normen/iso.htm
    a0)P	  i*  a1)  r  a10)r  r  a2)  r  a3)r  r  a4)r  r  a5)  r  a6)*  r  a7)r'  r  a8)   r'  a9)r  r  b0)  i  b1)  r  b10)r  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  r  )rP  r!  b8)r  rP  b9)r  r  c0)'
  i]  c1)-  r%  c10)r  r  c2)  r'  c3)  r*  c4)  r,  c5)  r.  c6)C  r0  c7)r=  r2  c8)r  r=  c9)r  r  zcard-4x6)i   i  )r5  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  AP  s   		
 !"#r  r
  c                 C   r8  r   )r^   r  )r   r	  r   r   r   r  zP  r  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  r   znon-page object in page tree (r  r   )rp   r^   r  rq   r  r   r   rH  r   r2   rZ  r  rI  r   r  r  r5  r)  r]  )r   r%  skipparentpindexphitr+   r  r  rf   kidr  r
   r  r   r   r   pdf_lookup_page_loc_imp~P  sd   *


3rC  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 )zA
        Copy of MuPDF's internal pdf_lookup_page_loc().
        r  r=  zcannot find page treer   z cannot find page %d in page treer   )r^   r   r  r   r   r   r  rC  )r   r	  r  r%  r>  r?  r@  rA  r   r   r   r  P  s   

c                 C   r  )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    r   zuse mupdf.pdf_debug_obj() ?)r^   r  rH  r  rI  pdfobj_stringr  array_get_boolr*  r+  r-  r   pdf_is_embedded_fileembedded_file_namer  rU  r   r  r;  r)  r  rV  r  r   rW  rP  )rN  prefixrG   r  rf   oor  rv   r   r   r   rD  P  r	  rD  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: pymupdf.Page object.
        font: pymupdf.Font object.
    r  Nc                    s>   g | ]}|d   j kr|d dr|d dr|d qS )r   r  rS  r   r 
  r   )r   r   r  r1  r   r   rg   Q  s
    *z$repair_mono_font.<locals>.<listcomp>rZ  i  z$Cannot set width for '%s' in xref %i)rj  r   rK
  ry  r   r'  r  r   set_font_widthr9   r   )r   r  r   r<  r  r  r   r   r1  r   r,  Q  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 interval 0 <= item <= 1.
    r   g     o@r   ro   )r{  )rK  r   r   r   r   sRGB_to_pdf(Q  s   
"rL  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 interval 0 <= item <= 255.
    rY  rF  r   )rK  r   r  ri  r   r   r   r{  6Q  s   

r{  c                 C   sN   |rt |nd}t | }td|dD ]}t t |||kr$ dS qdS )Nr   ro   r   )r^   rH  r   r  rI  )rO  r  r/  str_rf   r   r   r   r  FQ  s   
r  c                 C   s  d}d}|}d}|j rt| ||||}	t||||so|	dkrVt|td}
|
j s5|j r4t|td n|j rKt|td|
 t|
td| nt|
td |
}n.t|td t|td t|td}n|rt|j sv|}|}t|td}|d7 }|j s|||fS )z'
    Returns (count, first, prev).
    Nr   r5  Prevr  r  r   )r   strip_outlinesr  r^   r   r   r   r  )r   outlinesr'  r  r  r  r  currentrB  r  r  r   r   r   strip_outlineOQ  s8   

!rR  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  )	r   r^   r   r   rR  r   r   r  r  )	r   rP  r'  r  r  r  r  last	old_countr   r   r   rO  {Q  s    &rO  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 )r  r  rg  Nr  rY  r  z.notdef)_adobe_glyphsr  r   r  r   r   )r  r8   r   r  unclr<  r   r   r   r  Q  s   


r  c                 C   s2   |j |j  }|j|j }t|| j || j   S r   r  r  r   r   r   r  Q  r  r  r   single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsr+  r
  concurrency_statsc       	         C   s  |
rt   }|dkr0|r||i | t }t| }|D ]}||g|R i |}|| qnddlm} |du rn|
r@t   }t| }t|}tt|}W d   n1 sYw   Y  |
rnt   | }t|dd |
rtt   }|dkr|	| ||||||||	|

}n|dkr|
| ||||||||	|

}nJ d
|d|
rt   | }t|dd |
rt   | }t|dd |S )a  
    Returns list of results from `pagefn()`, optionally using concurrency for
    speed.
    
    Args:
        path:
            Path of document.
        pagefn:
            Function to call for each page; is passed (page, *pagefn_args,
            **pagefn_kwargs). Return value is added to list that we return. If
            `method` is not 'single', must be a top-level function - nested
            functions don't work with concurrency.
        pagefn_args
        pagefn_kwargs:
            Additional args to pass to `pagefn`. Must be picklable.
        initfn:
            If true, called once in each worker process; is passed
            (*initfn_args, **initfn_kwargs).
        initfn_args
        initfn_kwargs:
            Args to pass to initfn. Must be picklable.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork()`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        _stats:
            Internal, may change or be removed. If true, we output simple
            timing diagnostics.
    
    Note: We require a file path rather than a Document, because Document
    instances do not work properly after a fork - internal file descriptor
    offsets are shared between the parent and child processes.
    rX  r   )_apply_pagesNz.2fzs: count pages.r  forkr   zUnrecognised method=ri   zs: work.z	s: total.)r  rq   r   r2   r%   r`  r  r  r9   _multiprocessing_fork)r-   rr  rY  rZ  r[  r\  r]  r+  r
  r^  r_  t0rG   r   r   r   r`  r   	num_pagesr   r   r   apply_pagesQ  st   8
rf  )
r+  r
  r^  optionr  rj  rh
  rz  r  r_  c       
      	   C   s,   t ||||||	d}t| tj|||||
dS )ag  
    Returns list of results from `Page.get_text()`, optionally using
    concurrency for speed.
    
    Args:
        path:
            Path of document.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        option
        clip
        flags
        textpage
        sort
        delimiters:
            Passed to internal calls to `Page.get_text()`.
    )rg  r  rj  rh
  rz  r  )rZ  r+  r
  r^  r_  )r   rf  r   r  )r-   r+  r
  r^  rg  r  rj  rh
  rz  r  r_  	args_dictr   r   r   r  ,R  s"   ,	r  c                   @   s  e Zd ZdZdd Zedd Zedd ZedXd	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dYd0d1ZedZd3d4ZedZd5d6Zed7d8 ZedXd9d:Zed;d< Z ed=d> Z!edZd?d@Z"edAdB Z#edCdD Z$edYdEdFZ%edZdGdHZ&edZdIdJZ'edZdKdLZ(edMdN Z)edOdP Z*edQdR Z+edSdT Z,edZdUdVZ-dWZ.e/ Z0d2S )[r   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 r   )rp   r^   r   r"  r  r#  r   r   r   r   _derotate_matrixqR  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 r   )r  r   r   r   r   r  r  r  r  r  r  r  r  )r   r  r   r   r   r   r  wR  s(   
zTOOLS._fill_widgetc                 C   s"   t | j} t|  }t|}|S r   )r   r   r  r   r   )r   r   r  r   r   r   r
  R  s   
zTOOLS._get_all_contentsr   c                 C   s.   t | dd}t|}t| | ||}|S )zDAdd bytes as a new /Contents object for a page, and return its xref.r   r  )r   r   r_	  r   r   )r   r  rb	  r.  contbufr   r   r   r   r!
  R  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  rv  rk   z RG
r   r	  z rg
r   r   rG  r%   )r8  r   rc  rd  r   r&  rP
  r	  )r   r  r  r  r   scscolr  r  np1np2r1  r  r  r  r	  r   r   r   _le_annot_parmsR  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 }|t|	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
r   ro  rt  r  r  rs   )r   r  r  rR
  r  r1  r  r  r  r   rl  r  r	  r&  r  r  r5  botr   r   r   r   rp  R  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|  }|t	|	d 7 }||
| d 7 }|S )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
              @r   rp  r   zq
r  b
Q
)
r   ro  rt  r   _oval_stringrw  r  rx  r  rs   )r   r  r  rR
  r  r1  r  r  r  r   rl  r  r	  r&  r  r  r   r   r   r   r   rl  R  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 }|t|	d	 7 }||
| d
 7 }|S )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        rv  r   rp  r   r]  ro   rq  rr  r  rw  rt  r   r  r  rR
  r  r1  r  r  r  r   rl  r  r	  r&  r  r  r   r   r   r   ro  R      $($zTOOLS._le_closedarrowc                 C   sJ  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 }|t
|	d 7 }||
| d	 7 }|S )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        rv  r   rp  r   r  q
%s%f %f m
rr  r  rw  )r   ro  rt  r   rw  r  r  r  r  rx  rs   r   r  r  rR
  r  r1  r  r  r  r   rl  r  r	  r&  r  r  r   rO  r   r   r   r   rm  R  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 }|t|	d	 7 }||
d
 7 }|S )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        rv  r   rp  r   r]  ro   rq  rr  r  S
Q
rt  ry  r   r   r   rn  S  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 }|t|	d 7 }||
| d	 7 }|S )
zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        rv  r   ro   r   r]  rq  rr  r  rw  rt  ry  r   r   r   rr  !S  rz  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 }|t|	d	 7 }||
| d
 7 }|S )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        rv  r   g      @r   ro   r]  rq  rr  r  r}  rt  ry  r   r   r   rq  5S  rz  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 }|t|	d 7 }||
d 7 }|S )	zbMake stream commands for slash line end symbol. "lr" denotes left (False) or right point.
        g(y?r   r$  ro   rq  rr  r  rs  )	r   ro  rt  r   r  r  rw  rx  rs   )r   r  r  rR
  r  r1  r  r  r  r   rl  r  r	  rwr  r   r5  ru  r   r   r   r   rs  IS  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 }|t
|	d 7 }||
| d 7 }|S )	zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        rv  r   rp  r   r{  rr  r  rw  )r   ro  rt  r   rw  r  r  r  rx  r  rs   r|  r   r   r   rk  YS  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]  )rO  r	  r   rM  r   r   r   beziersS  s    z"TOOLS._oval_string.<locals>.bezierr  r  z%f %f m
r]  )r  r  r  r  r  r  r  mor  muol1ol2or1or2ur1ur2ul1ul2r   r   r   r   rx  oS  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yJ   trGt  Y d S w )Nr	  r  r  )r   rp   r^   r   r   r=  r  r   r   r  r   r   r   r   r?   )r   r  this_annot_objr  r|  r  r  r   r   r   Tools__parse_daS  s&   



z(TOOLS._parse_da.<locals>.Tools__parse_da)r  r%   r   rw  rH  rv  r  ro   r   r%   r  r  c                 S   rb   r   r  r  r   r   r   rg   S  rh   z#TOOLS._parse_da.<locals>.<listcomp>r   r'  c                 S   rb   r   r  r  r   r   r   rg   S  rh   r  )r   r   Tools_parse_dar   r  rl  r  )	r   r   r  r  r  r  r  rf   r  r   r   r   r   S  s>    ,8
zTOOLS._parse_dac                 C   s(   | }t |}t |}t || d S r   )r^   r   r=  pdf_field_reset)r   r  r  r  r   r   r   r  S  s   

zTOOLS._reset_widgetc                 C   s*   | j dd}|jstt S tt|S r	  )r  r   r"  r^   r#  r+  )r   r.  r   r   r   r
  S  s   zTOOLS._rotate_matrixc                 C   s   t | | d S r   )r  )r   r  r   r   r   r  S  r	  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yJ   trGt  Y d S w )Nr	  r  r  )r   r   Tools_update_dar   rp   r^   r   r  r   r   r   r   r   r?   )r   r  r  r   r   r   rb  S  s   
zTOOLS._update_dac                   C   s   t d7 a t S r  )TOOLS_JM_UNIQUE_IDr   r   r   r   rk  S  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_emptyS  r  zTOOLS.glyph_cache_emptyr   c                 C   s
   t | |S )z5
        Metadata of an image binary stream.
        )r  )rf  r  r   r   r   r  S  s   
zTOOLS.image_profileNc                 C      | durt | atS )z;
        Set MuPDF error display to True or False.
        N)r  rI  r:  r   r   r   mupdf_display_errorsS     zTOOLS.mupdf_display_errorsc                 C   r  )z>
        Set MuPDF warnings display to True or False.
        N)r  r*  r  r   r   r   mupdf_display_warningsT  r  zTOOLS.mupdf_display_warningsc                   C   s   t jS )z"Get version of MuPDF binary build.)r^   
FZ_VERSIONr   r   r   r   mupdf_versionT  s   zTOOLS.mupdf_versionc                 C   s"   t   dt}| rt  |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        rA  )r^   fz_flush_warningsrc  rf  r   reset_mupdf_warnings)r  rG   r   r   r   r	  T  s
   
zTOOLS.mupdf_warningsc                   C   s
   t  ad S r   )rq   rf  r   r   r   r   r  T  r  zTOOLS.reset_mupdf_warningsc                 C      t |  dS )z*
        Set anti-aliasing level.
        N)r^   fz_set_aa_level)rR  r   r   r   set_aa_level"T     zTOOLS.set_aa_levelc                 C   s4   | d u rt S t| d }|dkrd}| d d a t S )Nr   rL	  )r  r  )r  r  r   r   r   set_annot_stem)T  s   zTOOLS.set_annot_stemc           
      C   s   t | dd}|jsdS t||}t|td}t|rZt|}t|D ]2}t	||}t
|d}	t|	td t|	td t|	t| t|td|	 q'dS )	Nr   r  Frc  r   r  r%	  T)r   r   r^   r  r   r   r  rH  r  rI  r  r  r  r  )
r   r   r  r  r  dfontsr/  rf   dfontwarrayr   r   r   rJ  4T  s   

zTOOLS.set_font_widthc                 C   r  )z6
        Set the graphics minimum line width.
        N)r^   fz_set_graphics_min_line_width)min_line_widthr   r   r   set_graphics_min_line_widthFT  r  z!TOOLS.set_graphics_min_line_widthc                 C   s:   | rt jrt   dS tdt dS t jrt   dS dS )z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)r^   r  fz_enable_iccr\  r  fz_disable_iccr  r   r   r   set_iccMT  s   zTOOLS.set_iccc                 C   s   | dur	t | t_tjS )z!Set / unset MuPDF device caching.N)r  r@	  rO   r  r   r   r   set_low_memoryXT  s   
zTOOLS.set_low_memoryc                 C   (   | durt | t_trttj tjS )z Set / unset small glyph heights.N)r  r@	  rP   r   r   set_small_glyph_heightsr  r   r   r   r  _T  s
   
zTOOLS.set_small_glyph_heightsc                 C   r  )zK
        Set / unset returning fontnames with their subset prefix.
        N)r  r@	  rQ   r   r   set_subset_fontnamesr  r   r   r   r  hT  
   
zTOOLS.set_subset_fontnamesc                   C   s   t t t t dS )z,
        Show anti-aliasing values.
        )r.	  r5   graphics_min_line_width)r   r^   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr   r   r   r   show_aa_levelsT  s
   zTOOLS.show_aa_levelc                   C   r  )z)
        MuPDF store size limit.
        Nr   r   r   r   r   store_maxsize~T     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  T  s   zTOOLS.store_shrinkc                   C   r  )z+
        MuPDF current store size.
        Nr   r   r   r   r   
store_sizeT  r  zTOOLS.store_sizec                 C   r  )zA
        Set ascender / descender corrections on or off.
        N)r  r@	  rR   r   r   set_skip_quad_correctionsr  r   r   r   unset_quad_correctionsT  r  zTOOLS.unset_quad_correctionsrX  r  r  r   )1rW   rX   rY   r[  ri  r  r  r
  r!
  ro  rp  rl  ro  rm  rn  rr  rq  rs  rk  rx  r   r  r
  r  rb  rk  r  r  r  r  r  r	  r  r  r  rJ  r  r  r  r  r  r  r  r  r  r  r  r  fitz_configr   r   r   r   r   lR  s    


%










6




		




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






r   )utilsc                 C   s0   g | ]\}\}}}||d  |d  |d  ffqS )r
  r   )re   r'  r   r  ri  r   r   r   rg   T  s    c                   C   s    t   t d  t d  d S r   )r^   r  fz_set_warning_callbackfz_set_error_callbackr   r   r   r   _atexitT  s   
r  c                 C   r
  r   )r  r  r  r   r   r   rr  U  s   
 )find_tablesc                   @   rV  )FitzDeprecationNrW  r   r   r   r   r  -U  rY  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   sZ   t j| ||||d}|d}|dk rt| d S ||d   d dd  }t| d S )N)r8   r  r   r  )warningsformatwarningr`   r9   re  )rw  catr/   r0   r(   r8   r5   r  r   r   r   showthis3U  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%   Fr  Tzclass z already has c                     s0   t jdd  d dtd | i |S )Nz"legacy_name=z" removed from z after v1.19.0 - use "z".r  )r  warnr  )r  r  class_legacy_namenew_name
new_objectr   r   deprecated_function[U  s
   z<restore_aliases.<locals>._alias.<locals>.deprecated_functionz;*** Deprecated and removed in version after v1.19.0 - use "z". ***
)r{  modulesrW   r  r   r	  r]  r[  )r  r  r  capitalise_nextr<  r  r   r  r   _alias>U  s,   


 zrestore_aliases.<locals>._aliasrl  fileGetr  r  soundGetr  ri
  r  getTextPager  r  setBlendModer  r  r  r  r  r   r"  setOCr(  r4  r  fileUpdr(  r)  ro  convertToPDFrq  r1  r2  deletePageRanger  embeddedFileAddr  embeddedFileCountr  embeddedFileDelr  embeddedFileGetr  embeddedFileInfor  embeddedFileNamesr  embeddedFileUpdr  r  r  r  ru
  r  getOCGsr  getPageFontListr  getPageImageListget_page_pixmapget_page_textr  getPageXObjectListr  getSigFlagsrt  getToCr  insert_pager  	insertPDFr0  r8  	isFormPDFr0  isPDFr:  r<  rf  rA  r  r  rm  new_pager  r'  r  pageCropBoxr  r.  
PDFCatalogr  
PDFTrailerr  previousLocationr  search_page_forr  set_metadataset_tocsetToCr9  r0  rH  rb  isStreamrd  r/  rl  ro  rp  metadataXMLget_areagetRectArear  r  r  r  r  rE  rG  	preRotaterK  preScalerL  preShearrO  preTranslater  	getPDFnowr  	getPDFstrr  getTextlengthr  ImagePropertiesr   	PaperRectr  	PaperSizer  r  r  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  rA  r  r	  r	  CropBoxPositionr	  r	  delete_widgetr  r  r  r  r  r  r  r  r  r  r  r  r	  r	  r	  r
  r
  getDisplayListr
  rK
  getFontListrY
  rZ
  getImageListr#
  rf
  getSVGimageget_text_blocksget_text_wordsr{
  insert_imager$
  r  insert_textboxr	  
_isWrappedr	  r	  r   r
  r
  MediaBoxSize	new_shaper
  r  
search_forr
  
setCropBoxr"
  setMediaBoxr7  show_pdf_pageshowPDFpager  update_linkr	  r6  r
  r  
copyPixmapr
  r
  invertIRectr  pillowWriter  
pillowDatar  
writeImagewritePNGrA  r  setResolutionrF  rG  rQ  r  getImageData
getPNGData
getPNGdatarR  r  fill_textboxrt  r   )r  filterwarningsr  showwarningr   r  r   r
  r  r&  r  r   r  r
  r   r  r  r  )r  r  r   r   r   restore_aliases0U  s  	+












































































































































r%  zPyMuPDF z : Python bindings for the MuPDF z* library (rebased implementation).
Python z running on r  l        z-bit).
)r%   r   r  r  )r   r   r   r   r   N)r  )rn
  rC  r   )rT  )r   r   r   r   r&  Nr  )r  r   r   )r   r   r  r  r&  N(  r[  atexitr  r~  r*   r  r  r   r  r  rS  r{  r  r  rw  r  r  r   r%   r   r   r  r4   r:   rq   r   r   r   r!   r#   r9   r<   r?   ry  r	  r  rf  rH   rI   r   r   rM   r@	  r   r   r]   __file__	importlib	machinerySourceFileLoaderload_moduler  r  r^   r   reinit_singlethreadedra   pymupdf_versionr  r  pymupdf_daterr   r  pymupdf_version_tuplert   FZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHrj  pymupdf_date2r}  VersionFitzVersionBindVersionDaters   format_gOptionalry  rz  r   OptDictr  r  rx  r   r  Sequencer  r   r  r   rv  ry   rz   r{   r|   r}   r   r   r   r   r  r   r  r  r  r
  r  FzDocument_insert_pdfr   r   r   r  r  r  r  r&  rS  r 
  r   r  r  r  r>  r  r
  r   r  r:  r  r  r
  r  rW   _selfrq  r#  r  _valuer   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_ADLAMrV  r  AnyAnyTypeBase14_fontnamesr  rM  rz  rD  r  r
  r
  r  rf  rI  r*  	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFrd  ri  rh  rn  rm  ro  rk  rl  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr  r  STAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_Draftr  r  r  r  TEXT_FONT_SUPERSCRIPTr  r  r  r  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLTEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_PRESERVE_IMAGESTEXT_INHIBIT_SPACESTEXT_DEHYPHENATETEXT_PRESERVE_SPANSTEXT_MEDIABOX_CLIPTEXT_CID_FOR_UNKNOWN_UNICODETEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICr  r  r  r  PDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLight
annot_skelr   rU  rT  rW  rx  rw  ry  r   dictkey_ascr  r  r  r  r  r  r  r  r  r  
dictkey_dar  r`  r
  dictkey_effectr  r_  r  r  r  dictkey_glyphr  r  r  r  ra  r  r  r  r  r  r  r)  rb  r  r  r  r  r  r   r  r  r  r  r	  r   r  r  r  r  r  r  r  r  r'  r  r  r  rt  r%  r#  r}  r  r  r  r  r  r  r  r   r^  r   r  r  r	  r!	  r  r  r   r  r!  r5  rB  r  r  r  r  r7  r  r  r  r  r
  r   r
  r  r  rg  r&	  r  r  r  r  r  re  r  rK  r"  r.  rI  rF  r  r  r  r3  r?  r  rD  r   rO  r	  r~	  r	  r  r	  r  r  r  r=	  r
  r  r  r  r  r  r  r  r  r  r  r  rO
  r  r_	  r  r
  r  r  r  r  r  r  r  r  r{  r
  r"  r+  r+  r,  r	  r/  r2  rV  r
  rX  r  r
  r  r  r  r  rF  r
  r"  r  r  r  r	  r  r  r  rA  r+  r  r  rh  r  rh  r  r}  r	  r  r  r  r   r   r	  r  r  r[  r   r  r  r   rH  MSG_BAD_DOCUMENTrh  MSG_BAD_LOCATIONrL  r:  r  r  r  r8  r2  r  r  r
  r  rY  r  rN	  r{  rD  r
  r  r]  r  r\  r  r  rs
  rt
  r	  r  r  r  r|  r{  rB  r	  r   r  r  r]	  r  r  r*  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'  rN  rQ  rS  rV  rX  rY  rZ  r]  r^  rb  rc  rd  rf  re  r  PdfFilterOptions2rh  	FzDevice2r-  	FzOutput2r3  rP  r	  rk
  r   r  r  r  r  r  r	  r	  r  r  r  r  rS  r  r
  r  r  r	  r  r  r  r  r  r9  r  r  r  r  r  rz  rp  r  rA  r=  r  r  rP
  r  rT  r  r   r  r  r  rC  rD  r,  rL  r{  r  rR  rO  r%  rE  rO  rR  r  r  rf  r  r   r  getColorInfoDictpdfcolorr  r  r  registerrecover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadri
  do_linksr#  del_toc_itemru
  rq  get_ocmdget_page_labelsget_page_numbersr  r  rt  
has_annots	has_linksr  r  scrubr  r  r"  set_ocmdset_page_labelsr  set_toc_itemsubset_fontsrM  r  	xref_copyr  apply_redactionsdelete_imager  r  r  r  r  r  r  r  r  r  r  r  get_image_inforN
  	get_labelr#
  r  r  get_text_selectionr  get_textpage_ocrr  r$
  r  r  insert_htmlboxr  replace_imager  r  r  r6  tabler  r"  DeprecationWarningr  r%  __version__version_infor  maxsizer   r   r   r   <module>   sp   







          s '    i!-                          P,   8 s\  *S>                        a 9 i      k    %  V   0





    		$	F	(6	Y87%52%
	 %*(:>7 ,!		,&'N# !!6@		-+!-I)&0 B	#""   .1:%5A
0E*G	'1	 's7
"S6   \6
,I*+  N					'J8C2 	,
 @    F	
  

