§
    �’jñŸ  ã                   óŽ  — d dl Z d dlZd dlZ	 ddlmZ n# e$ r d dlZY nw xY wej        Zej        ZdZ	dZ
dZdZ	 ej        Zn# e$ r eez  ez  ZY nw xY wej        Zej        edf         Zej        e         Zej        e         Zej        e         Zej        e         Zej        ej                 Z 	 	 	 	 	 dCd	ej!        d
e
dedej"        de#de$fd„Z%	 	 	 	 	 	 dDd	ej!        d
e
dedej"        de#de$fd„Z&	 	 	 	 dEd	ej!        d
e
dedej"        def
d„Z'	 dFd	ej!        de
dej"        defd„Z(	 	 dGd	ej!        de	de	d
e
dej"        f
d„Z)	 	 	 	 	 dHd	ej!        dededede#dedej"        fd„Z*	 dIddddddd œd	ej!        d!ed
e
dedej"        de#fd"„Z+dFdefd#„Z,d$ed%edefd&„Z-d	ej!        d'edefd(„Z.de$fd)„Z/de$fd*„Z0d+ede1fd,„Z2d+ede1fd-„Z3d.ej4        d$ede1fd/„Z5d0„ Z6	 d1„ Z7d2„ Z8defd3„Z9defd4„Z:d5edefd6„Z;d7e1d8ed9e1dej<        fd:„Z=d7e1d8edej<        fd;„Z>dFd<ed=e$dej<        fd>„Z?dFd7e1d8ed?e$dej<        fd@„Z@d7e1d8edAedej<        fdB„ZAdS )Jé    Né   )ÚpymupdfÚ
point_likeÚ	rect_likeÚmatrix_likeÚ	quad_likeFÚpageÚclipÚflagsÚtextpageÚsortÚreturnc                 ó(  — t          j        | ¦  «         |€t           j        }|}|€|                      ||¬¦  «        }n#t	          |d¦  «        | k    rt          d¦  «        ‚|                     ¦   «         }|€~|r|                     d„ ¬¦  «         |S )a_  Return the text blocks on a page.

    Notes:
        Lines in a block are concatenated with line breaks.
    Args:
        flags: (int) control the amount of data parsed into the textpage.
    Returns:
        A list of the blocks. Each item contains the containing rectangle
        coordinates, text lines, running block number and block type.
    N©r
   r   Úparentúnot a textpage of this pagec                 ó"   — | d         | d         fS ©Né   r   © )Úbs    ú;C:\Projects\DSCons\.venv\Lib\site-packages\pymupdf\utils.pyú<lambda>z!get_text_blocks.<locals>.<lambda>N   s   €  1 Q¤4¨¨1¬ ,€ ó    ©Úkey)r   ÚCheckParentÚTEXTFLAGS_BLOCKSÚget_textpageÚgetattrÚ
ValueErrorÚextractBLOCKSr   )r	   r
   r   r   r   ÚtpÚblockss          r   Úget_text_blocksr%   0   s©   € õ" Ô˜ÑÔÐØ€}ÝÔ(ˆØ	€BØ	€zØ×Ò D°ÐÑ6Ô6ˆˆÝ	��XÑ	Ô	 $Ò	&Ð	&ÝÐ6Ñ7Ô7Ð7à×ÒÑÔ€FØÐØØð 0Ø�ŠÐ.Ð.ˆÑ/Ô/Ð/Ø€Mr   r   c                 óp  ‡‡— ˆfd„}t          j        | ¦  «         |€t           j        }|}|€|                      ‰|¬¦  «        }n#t	          |d¦  «        | k    rt          d¦  «        ‚|                     |¦  «        }	|�$‰�"t          j        ‰¦  «        Šˆfd„|	D ¦   «         }	|€~|	r|r ||	¦  «        }	|	S )aœ  Return the text words as a list with the bbox for each word.

    Args:
        page: pymupdf.Page
        clip: (rect-like) area on page to consider
        flags: (int) control the amount of data parsed into the textpage.
        textpage: (pymupdf.TextPage) either passed-in or None.
        sort: (bool) sort the words in reading sequence.
        delimiters: (str,list) characters to use as word delimiters.
        tolerance: (float) consider words to be part of the same line if
            top or bottom coordinate are not larger than this. Relevant
            only if sort=True.

    Returns:
        Word tuples (x0, y0, x1, y1, "word", bno, lno, wno).
    c                 óR  •— |                       d„ ¬¦  «         g }| d         g}t          j        | d         dd…         ¦  «        }| dd…         D ]ª}t          j        |dd…         ¦  «        }t          |j        |j        z
  ¦  «        ‰k    s t          |j        |j        z
  ¦  «        ‰k    r|                     |¦  «         ||z  }Œy|                      d„ ¬¦  «         |                     |¦  «         |g}|}Œ«|                      d„ ¬¦  «         |                     |¦  «         |S )	z1Sort words line-wise, forgiving small deviations.c                 ó"   — | d         | d         fS r   r   ©Úws    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>n   s   €  ! A¤$¨¨!¬ € r   r   r   Né   r   c                 ó   — | d         S ©Nr   r   r)   s    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>{   s
   € ¨¨!¬€ r   c                 ó   — | d         S r-   r   r)   s    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>€   s
   €   !¤€ r   )r   r   ÚRectÚabsÚy0Úy1ÚappendÚextend)ÚwordsÚnwordsÚlineÚlrectr*   ÚwrectÚ	tolerances         €r   Ú
sort_wordsz"get_text_words.<locals>.sort_wordsl   s)  ø€ à�
Š
Ð-Ð-ˆ
Ñ.Ô.Ð.ØˆØ�a”ˆzˆÝ”˜U 1œX b q bœ\Ñ*Ô*ˆØ�q�r�r”ð 	ð 	ˆAÝ”L  2 A 2¤Ñ'Ô'ˆEå�E”H˜uœxÑ'Ñ(Ô(¨IÒ5Ð5Ý�u”x %¤(Ñ*Ñ+Ô+¨yÒ8Ð8à—’˜A‘”�Ø˜‘��à—	’	˜n˜n�	Ñ-Ô-Ð-Ø—’˜dÑ#Ô#Ð#Ø�s�Ø��à�	Š	�n�nˆ	Ñ%Ô%Ð%Ø�Š�dÑÔÐàˆr   Nr   r   r   c                 ó¤   •— g | ]L}t          ‰|d d…         z  ¦  «        dt          t          j        |d d…         ¦  «        ¦  «        z  k    ¯J|‘ŒMS )Nr+   g      à?)r0   r   r/   )Ú.0r*   r
   s     €r   ú
<listcomp>z"get_text_words.<locals>.<listcomp>”   s]   ø€ ð 
ð 
ð 
Ø¥ D¨1¨R¨a¨R¬5¡LÑ 1Ô 1°S½3½w¼|ÈAÈbÈqÈbÌEÑ?RÔ?RÑ;SÔ;SÑ5SÒ SÐ SˆAÐ SÐ SÐ Sr   )r   r   ÚTEXTFLAGS_WORDSr   r    r!   ÚextractWORDSr/   )
r	   r
   r   r   r   Ú
delimitersr:   r;   r#   r5   s
    `    `   r   Úget_text_wordsrB   R   s  øø€ ð4ð ð ð ð õ2 Ô˜ÑÔÐØ€}ÝÔ'ˆØ	€BØ	€zØ×Ò D°ÐÑ6Ô6ˆˆÝ	��XÑ	Ô	 $Ò	&Ð	&ÝÐ6Ñ7Ô7Ð7à�OŠO˜JÑ'Ô'€Eð Ð Ð 0åŒ|˜DÑ!Ô!ˆð
ð 
ð 
ð 
Øð
ñ 
ô 
ˆð ÐØØð "�ð "à�
˜5Ñ!Ô!ˆà€Lr   c           	      ó€  — d„ }d„ t          | |||d|¬¦  «        D ¦   «         }|sdS t          j        ¦   «         }|D ]
\  }}	||z  }Œg }
|d         g}|d         d         }|dd…         D ]—\  }}	|d	         \  }}t          |j        |j        z
  ¦  «        |k    s t          |j        |j        z
  ¦  «        |k    r|                     ||	f¦  «         ||z  }Œm |||¦  «        }|
                     ||f¦  «         ||	fg}|}Œ˜ |||¦  «        }|
                     ||f¦  «         |
                     d
„ ¬¦  «         |
d         d         }	|
d         d         j        }|
dd…         D ]V\  }}t          t          t          |j        |z
  |j        z  ¦  «        ¦  «        d¦  «        }d|dz   z  }|	||z   z  }	|j        }ŒW|	S )a¯  Extract plain text avoiding unacceptable line breaks.

    Text contained in clip will be sorted in reading sequence. Some effort
    is also spent to simulate layout vertically and horizontally.

    Args:
        page: pymupdf.Page
        clip: (rect-like) only consider text inside
        flags: (int) text extraction flags
        textpage: pymupdf.TextPage
        tolerance: (float) consider words to be on the same line if their top
            or bottom coordinates do not differ more than this.

    Notes:
        If a TextPage is provided, all text is checked for being inside clip
        with at least 50% of its bbox.
        This allows to use some "global" TextPage in conjunction with sub-
        selecting words in parts of the defined TextPage rectangle.

    Returns:
        A text string in reading sequence. Left indentation of each line,
        inter-line and inter-word distances strive to reflect the layout.
    c                 ón  — |                      d„ ¬¦  «         d}| j        }t          j        ¦   «         }|D ]~\  }}||z  }t	          t          t          |j        |z
  |j        z  t          |¦  «        z  ¦  «        ¦  «        || j        k    s|j        |k    rdnd¦  «        }|d|z  |z   z  }|j	        }Œ|S )aû  Create the string of one text line.

        We are trying to simulate some horizontal layout here, too.

        Args:
            clip: (pymupdf.Rect) the area from which all text is being read.
            line: (list) word tuples (rect, text) contained in the line
        Returns:
            Text in this line. Generated from words in 'line'. Distance from
            predecessor is translated to multiple spaces, thus simulating
            text indentations and large horizontal distances.
        c                 ó   — | d         j         S r-   )Úx0r)   s    r   r   z4get_sorted_text.<locals>.line_text.<locals>.<lambda>Í   s   €   !¤¤€ r   r   Ú r   r   ú )
r   rF   r   Ú
EMPTY_RECTÚmaxÚintÚroundÚwidthÚlenÚx1)r
   r7   ÚltextrO   r8   ÚrÚtÚdists           r   Ú	line_textz"get_sorted_text.<locals>.line_textÀ   sÉ   € ð 	�	Š	Ð'Ð'ˆ	Ñ(Ô(Ð(ØˆØŒWˆÝÔ"Ñ$Ô$ˆØð 		ð 		‰DˆAˆqØ�Q‰JˆEåÝ•E˜1œ4 "™9¨¬Ñ/µ#°a±&´&Ñ8Ñ9Ô9Ñ:Ô:Ø˜DœG’m�m q¤t¨r¢z z��¸ñô ˆDð
 �S˜4‘Z !‘^Ñ#ˆEØ”ˆBˆBØˆr   c                 óV   — g | ]&}t          j        |d d…         ¦  «        |d         f‘Œ'S )Nr+   )r   r/   )r=   r*   s     r   r>   z#get_sorted_text.<locals>.<listcomp>Þ   sC   € ð 
ð 
ð 
àõ 
Œ�a˜˜˜”eÑ	Ô	˜a œdÐ#ð
ð 
ð 
r   T)r
   r   r   r   r:   rG   r   r   Néÿÿÿÿc                 ó   — | d         j         S r-   )r2   )Úls    r   r   z!get_sorted_text.<locals>.<lambda>  s   € ˜a œdœg€ r   r   é   ú
)rB   r   rI   r0   r1   r2   r3   r   ÚminrK   rL   Úheight)r	   r
   r   r   r:   rT   r5   ÚtotalboxÚwrÚtextÚlinesr7   r8   Úw0rÚ_rP   r2   ÚdistanceÚbreakss                      r   Úget_sorted_textre   ¡   s9  € ð>ð ð ð<
ð 
åØØØØØØð
ñ 
ô 
ð
ñ 
ô 
€Eð ð ØˆrÝÔ!Ñ#Ô#€HØð ð ‰ˆˆDØ�B‰ˆˆà€EØ�!ŒHˆ:€DØ�!ŒH�QŒK€Eð ˜!˜"˜"”Ið ð ‰ˆˆDØ�b”‰ˆˆQõ ˆuŒx˜"œ%ÑÑ Ô  IÒ-Ð-µ°U´XÀÄÑ5EÑ1FÔ1FÈ)Ò1SÐ1SØ�KŠK˜˜T˜
Ñ#Ô#Ð#Ø�R‰KˆEˆEð �I˜h¨Ñ-Ô-ˆEØ�LŠL˜% ˜Ñ(Ô(Ð(Ø˜�J�<ˆDØˆEˆEð ˆI�h Ñ%Ô%€EØ	‡L‚L�%˜�Ñ Ô Ð ð 
‡J‚JÐ&Ð&€JÑ'Ô'Ð'à�Œ8�AŒ;€DØ	ˆqŒ�!ŒŒ€BØ˜a˜b˜bœ	ð ð ‰ˆˆuÝ•s�5 %¤(¨R¡-°5´<Ñ!?Ñ@Ô@ÑAÔAÀ1ÑEÔEˆØ˜ A™Ñ&ˆØ�˜‘ÑˆØŒXˆˆð €Kr   Úrectc                 ó®   — |}|€|                       ¦   «         }n#t          |d¦  «        | k    rt          d¦  «        ‚|                     |¦  «        }|€~|S )Nr   r   )r   r    r!   ÚextractTextbox)r	   rf   r   r#   Úrcs        r   Úget_textboxrj     sf   € ð
 
€BØ	€zØ×ÒÑ Ô ˆˆÝ	��XÑ	Ô	 $Ò	&Ð	&ÝÐ6Ñ7Ô7Ð7Ø	×	Ò	˜4Ñ	 Ô	 €BØÐØØ€Ir   Úp1Úp2c                 óò   — t          j        | ¦  «         |}|€"|                      |t           j        ¬¦  «        }n#t	          |d¦  «        | k    rt          d¦  «        ‚|                     ||¦  «        }|€~|S )Nr   r   r   )r   r   r   ÚTEXT_DEHYPHENATEr    r!   ÚextractSelection)r	   rk   rl   r
   r   r#   ri   s          r   Úget_text_selectionrp   &  sƒ   € õ Ô˜ÑÔÐØ	€BØ	€zØ×Ò DµÔ0HÐÑIÔIˆˆÝ	��XÑ	Ô	 $Ò	&Ð	&ÝÐ6Ñ7Ô7Ð7Ø	×	Ò	˜R Ñ	$Ô	$€BØÐØØ€Ir   ÚengéH   ÚlanguageÚdpiÚfullÚtessdatac                 óà   ‡— t          j        | ¦  «         t          j        ‰¦  «        Š|t           j         z  t           j         z  }ˆfd„}ˆfd„}|r || |||¦  «        S  || |||¦  «        S )ac  Create a Textpage from the OCR version of the page.

    OCR can be executed for the full page image, or (the default) only
    for areas that are not covered by readable digital text.

    Args:
        flags: (int) control content becoming part of the result.
        language: (str) specify expected language(s). Default is "eng" (English).
        dpi: (int) resolution in dpi, default 72.
        full: (bool) whether to OCR the full page, or to keep legible text
        tessdata: (str) path to Tesseract language data files. If None, the
                  built-in function is used to find the path.
    c                 ó€  •— |                       |¬¦  «        }t          j        |                     d|‰
¬¦  «        ¬¦  «        }|                     d¦  «        }| j        j        |j        j        z  }t          j        ||¦  «        | j        z  }| 	                    ||¬¦  «        }	t          j        | ¦  «        |	_        |	S )z$Perform OCR for the full page image.©rt   F©Úcompressrs   rv   ©Ústreamr   )r   Úmatrix)Ú
get_pixmapr   ÚDocumentÚpdfocr_tobytesÚ	load_pagerf   rM   ÚMatrixÚderotation_matrixr   ÚweakrefÚproxyr   )r	   rt   rs   r   ÚpixÚocr_pdfÚocr_pageÚunzoomÚctmÚtpagerv   s             €r   Úfull_ocrz"get_textpage_ocr.<locals>.full_ocrX  s¿   ø€ à�oŠo #ˆoÑ&Ô&ˆåÔ"Ø×%Ò%ØØ!Ø!ð &ñ ô ð
ñ 
ô 
ˆð ×$Ò$ QÑ'Ô'ˆØ”” 8¤=Ô#6Ñ6ˆÝŒn˜V VÑ,Ô,¨tÔ/EÑEˆØ×%Ò%¨E¸#Ð%Ñ>Ô>ˆõ ”} TÑ*Ô*ˆŒØˆr   c                 ó¤  •— | j         }t          j        ¦   «         }|                     || j        | j        ¬¦  «         |                     d¦  «        }|                     ¦   «          |                     |¬¦  «        }|                     ¦   «         d         }	 d„ |D ¦   «         }	|	rË|	D ]}
| 	                    |
¦  «         Œ| 
                    t          j        t          j        t          j        ¬¦  «         |                     |¬¦  «        }|                     ¦   «         d         }|                     || j        | j        ¬¦  «         |                     d¦  «        }|                     ¦   «          d„ |D ¦   «         }|D ]}
| 	                    |
¦  «         Œ| 
                    t          j        t          j        t          j        ¬¦  «         |                     |¬	¦  «        }t          j        |                     d
|‰¬¦  «        ¬¦  «        }|d         }|                     |t          j        ¬¦  «         t%          j        | ¦  «        |_         |S )zˆPerform OCR for parts of the page without legible text.

        We create a temporary PDF for which we can freely redact text.
        )Ú	from_pageÚto_pager   )r   r$   c                 ó�   — g | ]C}|d          dk    r5|d         D ],}|d         D ]!}t          d¦  «        |d         v ¯|d         ‘Œ"Œ-ŒDS ©Útyper   r`   Úspansiýÿ  r_   Úbbox©Úchr©r=   r   rX   Úss       r   r>   z9get_textpage_ocr.<locals>.partial_ocr.<locals>.<listcomp>‚  sr   € ð 
ð 
ð 
àØ�Œy˜AŠ~ˆ~Ø�w”Zð ˆ~ØØ�w”Zð ˆ~àÝ�6‰{Œ{˜a œiÐ'Ð'ð ˆfŒIð
 (Ð'Ð'Ð'Ð'r   )ÚimagesÚgraphicsr_   rV   c                 ó�   — g | ]C}|d          dk    r5|d         D ],}|d         D ]!}t          d¦  «        |d         v¯|d         ‘Œ"Œ-ŒDS r’   r–   r˜   s       r   r>   z9get_textpage_ocr.<locals>.partial_ocr.<locals>.<listcomp>š  sr   € ð 
ð 
ð 
àØ�Œy˜AŠ~ˆ~Ø�w”Zð ˆ~ØØ�w”Zð ˆ~àÝ�v‘;”; ! F¤)Ð+Ð+ð ˆfŒIð
 ,Ð+Ð+Ð+Ð+r   ry   Frz   r|   )r   r   ÚopenÚ
insert_pdfÚnumberr‚   Úremove_rotationr   ÚextractDICTÚadd_redact_annotÚapply_redactionsÚPDF_REDACT_IMAGE_NONEÚPDF_REDACT_LINE_ART_NONEÚPDF_REDACT_TEXT_REMOVEr   r�   Úextend_textpageÚTEXT_ACCURATE_BBOXESr…   r†   )r	   rt   rs   r   ÚdocÚtemp_pdfÚ	temp_pager#   r$   Ú
fffd_spansr•   Úspan_bboxesr‡   rˆ   r‰   rv   s                  €r   Úpartial_ocrz%get_textpage_ocr.<locals>.partial_ocrl  s„  ø€ ð
 Œkˆõ ”<‘>”>ˆØ×Ò˜C¨4¬;ÀÄÐÑLÔLÐLØ×&Ò& qÑ)Ô)ˆ	Ø×!Ò!Ñ#Ô#Ð#ð ×#Ò#¨%Ð#Ñ0Ô0ˆØ—’Ñ!Ô! (Ô+ˆð	ð

ð 
àð
ñ 
ô 
ˆ
ð ð 	(Ø"ð 1ð 1�Ø×*Ò*¨4Ñ0Ô0Ð0Ð0Ø×&Ò&ÝÔ4Ý Ô9ÝÔ3ð 'ñ ô ð ð ×'Ò'¨eÐ'Ñ4Ô4ˆBØ—^’^Ñ%Ô% hÔ/ˆFà×Ò ¨t¬{ÀDÄKÐÑPÔPÐPØ ×*Ò*¨2Ñ.Ô.ˆIØ×%Ò%Ñ'Ô'Ð'ð
ð 
àð
ñ 
ô 
ˆð  ð 	-ð 	-ˆDØ×&Ò& tÑ,Ô,Ð,Ð,ð 	×"Ò"ÝÔ0ÝÔ5ÝÔ/ð 	#ñ 	
ô 	
ð 	
ð
 ×"Ò" sÐ"Ñ+Ô+ˆõ ”,Ø×%Ò%ØØ!Ø!ð &ñ ô ð
ñ 
ô 
ˆð ˜1”:ˆð 	× Ò  ­7Ô+GÐ ÑHÔHÐHõ ”M $Ñ'Ô'ˆŒ	Øˆ	r   )r   r   Úget_tessdataÚ TEXT_USE_CID_FOR_UNKNOWN_UNICODEÚ TEXT_USE_GID_FOR_UNKNOWN_UNICODE)r	   r   rs   rt   ru   rv   r�   r®   s        `  r   Úget_textpage_ocrr²   9  s¼   ø€ õ* Ô˜ÑÔÐÝÔ# HÑ-Ô-€Hð 	ÝÔ3Ð
3ñ	4åÔ3Ð
3ñ	4ð 
ðð ð ð ð ð(Tð Tð Tð Tð Tðn ð 4Øˆx˜˜c 8¨UÑ3Ô3Ð3ð ˆ;�t˜S (¨EÑ2Ô2Ð2r   r_   )r
   r   r   r   rA   r:   Úoptionc                óØ  — t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        dœ
}| 	                    ¦   «         }||v sJ ‚||vrd}|€||         }|dk    rt          | |||||¬¦  «        S |dk    rt          | ||||¬¦  «        S |dk    r|rt          | ||||¬¦  «        S t          j        | ¦  «         d}	|d	v r| j        }|�t          j        |¦  «        }d}	n"t!          | ¦  «        t           j        u r| j        }	|}
|
€|                      ||¬
¦  «        }
n#t'          |
d¦  «        | k    rt)          d¦  «        ‚|dk    r|
                     |	|¬¦  «        }nÁ|dk    r|
                     |	|¬¦  «        }n£|dk    r|
                     |	|¬¦  «        }n…|dk    r|
                     |	|¬¦  «        }ng|dk    r|
                     ¦   «         }nL|dk    r|
                     ¦   «         }n1|dk    r|
                     ¦   «         }n|
                     |¬¦  «        }|€~
|S )aø  Extract text from a page or an annotation.

    This is a unifying wrapper for various methods of the pymupdf.TextPage class.

    Args:
        option: (str) text, words, blocks, html, dict, json, rawdict, xhtml or xml.
        clip: (rect-like) restrict output to this area.
        flags: bit switches to e.g. exclude images or decompose ligatures.
        textpage: reuse this pymupdf.TextPage and make no new one. If specified,
            'flags' and 'clip' are ignored.

    Returns:
        the output of methods get_text_words / get_text_blocks or pymupdf.TextPage
        methods extractText, extractHTML, extractDICT, extractJSON, extractRAWDICT,
        extractXHTML or etractXML respectively.
        Default and misspelling choice is "text".
    )
r_   ÚhtmlÚjsonÚrawjsonÚxmlÚxhtmlÚdictÚrawdictr5   r$   r_   Nr5   )r
   r   r   r   rA   r$   )r
   r   r   r   )r
   r   r   r:   )rµ   r¸   r¹   r   r   r   r¶   )Úcbr   r·   rº   r»   rµ   r¸   r¹   )r   )r   ÚTEXTFLAGS_TEXTÚTEXTFLAGS_HTMLÚTEXTFLAGS_DICTÚTEXTFLAGS_RAWDICTÚTEXTFLAGS_XMLÚTEXTFLAGS_XHTMLr?   r   ÚlowerrB   r%   re   r   Úcropboxr/   r“   ÚPager   r    r!   ÚextractJSONÚextractRAWJSONr¡   ÚextractRAWDICTÚextractHTMLÚ
extractXMLÚextractXHTMLÚextractText)r	   r³   r
   r   r   r   rA   r:   Úformatsr¼   r#   rR   s               r   Úget_textrÎ   Ë  sÍ  € õ: Ô&ÝÔ&ÝÔ&ÝÔ,ÝÔ$ÝÔ(ÝÔ&ÝÔ,ÝÔ(ÝÔ*ðð €Gð �\Š\‰^Œ^€FØ�WÐÐÐÐØ�WÐÐØˆØ€}Ø˜”ˆà�ÒÐÝØØØØØØ!ð
ñ 
ô 
ð 	
ð �ÒÐÝØ�t 5°8À$ð
ñ 
ô 
ð 	
ð �ÒÐ˜DÐÝØØØØØð
ñ 
ô 
ð 	
õ Ô˜ÑÔÐØ	€BØÐ)Ð)Ð)ØŒ|ˆØÐÝŒ|˜DÑ!Ô!ˆØˆˆÝ	ˆd‰Œ•w”|Ð	#Ð	#ØŒ\ˆà	€Bà	€zØ×Ò D°ÐÑ6Ô6ˆˆÝ	��XÑ	Ô	 $Ò	&Ð	&ÝÐ6Ñ7Ô7Ð7à�ÒÐØ�NŠN˜b tˆNÑ,Ô,ˆˆØ	�9Ò	Ð	Ø×Ò ¨$ÐÑ/Ô/ˆˆØ	�6Ò	Ð	Ø�NŠN˜b tˆNÑ,Ô,ˆˆØ	�9Ò	Ð	Ø×Ò ¨$ÐÑ/Ô/ˆˆØ	�6Ò	Ð	Ø�NŠNÑÔˆˆØ	�5ŠˆØ�MŠM‰OŒOˆˆØ	�7Ò	Ð	Ø�OŠOÑÔˆˆà�NŠN ˆNÑ%Ô%ˆàÐØØ€Hr   c                 óª  — t          | t          j        ¦  «        r|                      |¦  «        }n=t          | t          j        ¦  «        r| j        }nJ dt          | ¦  «        ›d�¦   «         ‚|j        ddœ}	 t          | d¦  «        r
| j	        |d<   n.# t          $ r! t          dk    rt          j        ¦   «          Y nw xY wt          j        dd¦  «        }|j        t          j        z  r|j        j        |_        |j        t          j        z  r|j        j        |_        |j        t          j        k    r|j        |d<   �n‘|j        t          j        k    r;|j        |d	<   ||d
<   |j        t          j        z  r|j        j        |d<   �nHd|d<   �nA|j        t          j        k    rm|j                             dd¦  «        |d<   |j        |d	<   |j        dk     r|j        |d
<   nî||d
<   |j        t          j        z  r|j        j        |d<   nÅd|d<   n¿|j        t          j        k    r|j                             dd¦  «        |d<   n‹|j        t          j        k    rl|j                              ¦   «         |                      ¦   «         z  rJ ‚| !                    |j        ¦  «         d
|v rt          j        |d
         ¦  «        |d
<   n
|j        |d	<   |S )Nr   zUnexpected type(ln)=ú.)ÚkindÚxrefrf   Úfromé   Úurir	   ÚtoÚzoomg        ú\ú/Úfile)"Ú
isinstancer   ÚOutlineÚdestinationÚLinkÚdestr“   rÑ   Úhasattrrf   Ú	ExceptionÚg_exceptions_verboseÚexception_infoÚPointr   ÚLINK_FLAG_L_VALIDÚltÚxÚLINK_FLAG_T_VALIDÚyÚLINK_URIrÕ   Ú	LINK_GOTOr	   ÚLINK_FLAG_R_IS_ZOOMÚrbÚ
LINK_GOTORÚ	file_specÚreplaceÚLINK_LAUNCHÚ
LINK_NAMEDÚnamedÚkeysÚupdate)ÚlnÚdocumentrß   ÚnlÚpnts        r   ÚgetLinkDictrú   8  s¶  € Ý�"•g”oÑ&Ô&ð -Ø�~Š~˜hÑ'Ô'ˆˆÝ	�B�œÑ	%Ô	%ð -ØŒwˆˆà,Ð,¥ R¡¤Ð,Ð,Ð,Ñ,Ô,ˆqØ”) QÐ	'Ð	'€BðÝ�2�vÑÔð 	!ØœˆBˆv‰JøøÝð ð ð å 1Ò$Ð$­Ô(>Ñ(@Ô(@Ð(@Øˆðøøøõ Œ-˜˜1Ñ
Ô
€CØ„z•GÔ-Ñ-ð Ø””	ˆŒØ„z•GÔ-Ñ-ð Ø””	ˆŒà„y•GÔ$Ò$Ð$Ø”Hˆˆ5‰	‰	à	Œ•gÔ'Ò	'Ð	'Ø”Yˆˆ6‰
Øˆˆ4‰ØŒ:�Ô3Ñ3ð 	ØœœˆBˆv‰J‰JàˆBˆv‰J‰Jà	Œ•gÔ(Ò	(Ð	(Ø”^×+Ò+¨D°#Ñ6Ô6ˆˆ6‰
Ø”Yˆˆ6‰
ØŒ9�qŠ=ˆ=Ø”yˆBˆt‰HˆHàˆBˆt‰HØŒz�GÔ7Ñ7ð !Ø!œWœY��6‘
�
à ��6‘
�
à	Œ•gÔ)Ò	)Ð	)Ø”^×+Ò+¨D°#Ñ6Ô6ˆˆ6‰
ˆ
à	Œ•gÔ(Ò	(Ð	(à”J—O’OÑ%Ô%¨¯ª©	¬	Ñ1Ð2Ð2Ð2Ø
�	Š	�$”*ÑÔÐØ�2ˆ:ˆ:Ý”} R¨¤XÑ.Ô.ˆBˆt‰Høð ”Yˆˆ6‰
Ø€Is   Á9B Â(B?Â>B?rÒ   Úddictc                 óV  — |sdS d„ }d„ }d„ }d„ }d„ }t          |¦  «        t          t          fv r || d|d¦  «        }|S |                     dt          j        ¦  «        }|t          j        k    rdS |d         t          j        k    rT|                     d	d¦  «        }	|                     d
t	          j        dd¦  «        ¦  «        }
|
\  }} || |||	¦  «        }|S |d         t          j        k    r% |t	          j	        |d         ¦  «        ¦  «        }|S |d         t          j
        k    r(t	          j	        |d         ¦  «        } |||¦  «        }|S |d         t          j        k    rM|d         dk     rAt	          j	        |d         ¦  «        } |t	          j	        |d
         ¦  «        ||¦  «        }|S |d         t          j        k    rZ|d         dk    rNt	          j	        |d         ¦  «        } ||d         |d
         j        |d
         j        |d	         ||¦  «        }|S dS )zrCalculate the PDF action string.

    Notes:
        Supports Link annotations and outline items (bookmarks).
    rG   c                 ó4   — d| › dt          |||f¦  «        › d�S )Nz/A<</S/GoTo/D[z	 0 R/XYZ z]>>©Ú	_format_g)Úar   ÚcÚds       r   r   zgetDestStr.<locals>.<lambda>{  s)   € Ð"X°1Ð"XÐ"X½yÈ!ÈQÐPQÈÑ?SÔ?SÐ"XÐ"XÐ"X€ r   c           	      ó@   — d| › dt          |||f¦  «        › d|› d|› d�	S )Nz/A<</S/GoToR/D[z /XYZ z]/F<</Fú/UFú/Type/Filespec>>>>rþ   )r   r   r  r  ÚeÚfs         r   r   zgetDestStr.<locals>.<lambda>|  s=   € Ð*}¸AÐ*}Ð*}ÅYÐPQÐSTÐVWÈyÑEYÔEYÐ*}Ð*}ÐbcÐ*}Ð*}ÐhiÐ*}Ð*}Ð*}€ r   c                 ó   — d| › d|› d|› d�S )Nz/A<</S/GoToR/Dz/F<</Fr  r  r   )r   r   r  s      r   r   zgetDestStr.<locals>.<lambda>}  s"   € Ð!V°!Ð!VÐ!V¸1Ð!VÐ!VÀÐ!VÐ!VÐ!V€ r   c                 ó   — d| › d|› d�S )Nz/A<</S/Launch/F<</Fr  r  r   )r   r   s     r   r   zgetDestStr.<locals>.<lambda>~  s   € ÐO°AÐOÐO¸!ÐOÐOÐO€ r   c                 ó   — d| › d�S )Nz/A<</S/URI/URIz>>r   )r   s    r   r   zgetDestStr.<locals>.<lambda>  s   € Ð.¨Ð.Ð.Ð.€ r   r   rÑ   r×   rÖ   rÕ   rÚ   r	   )r“   rK   ÚfloatÚgetr   Ú	LINK_NONErë   rä   rê   Úget_pdf_strrñ   rî   rç   ré   )rÒ   rû   Ústr_gotoÚ
str_gotor1Ú
str_gotor2Ú
str_launchÚstr_urirß   Úd_kindÚd_zoomrÖ   Úd_leftÚd_topÚfspecs                 r   Ú
getDestStrr  s  s;  € ð ð ØˆrØXÐX€HØ}Ð}€JØVÐV€JØOÐO€JØ.Ð.€GåˆE�{„{•s�E�lÐ"Ð"Øˆx˜˜a ¨Ñ*Ô*ˆØˆØ�YŠY�v�wÔ0Ñ1Ô1€Fà•Ô"Ò"Ð"ØˆràˆV„}�Ô)Ò)Ð)Ø—’˜6 1Ñ%Ô%ˆØ�YŠY�t�Wœ]¨1¨aÑ0Ô0Ñ1Ô1ˆØ‰ˆ�Øˆx˜˜f e¨VÑ4Ô4ˆØˆàˆV„}�Ô(Ò(Ð(Øˆw•wÔ*¨5°¬<Ñ8Ô8Ñ:Ô:ˆØˆàˆV„}�Ô+Ò+Ð+ÝÔ# E¨&¤MÑ2Ô2ˆØˆz˜% Ñ'Ô'ˆØˆàˆV„}�Ô*Ò*Ð*¨u°V¬}¸qÒ/@Ð/@ÝÔ# E¨&¤MÑ2Ô2ˆØˆz�'Ô-¨e°D¬kÑ:Ô:¸EÀ5ÑIÔIˆØˆàˆV„}�Ô*Ò*Ð*¨u°V¬}ÀÒ/AÐ/AÝÔ# E¨&¤MÑ2Ô2ˆØˆzØ�&ŒMØ�$ŒKŒMØ�$ŒKŒMØ�&ŒMØØñ
ô 
ˆð ˆàˆ2r   Úlnkc           	      ó¼  — | j         }| }|d         }t          t          ||z  ¦  «        ¦  «        }d}|d         t          j        k    rì|d         dk    r¨t          j        d         }|d         }| j                             |¦  «        }	|                     dt          j	        dd¦  «        ¦  «        }
| j        |         }|j         }| }|
|z  } ||	|j
        |j        |                     dd¦  «        |¦  «        }�nt          j        d	         } |t          j        |d         ¦  «        |¦  «        }�nÞ|d         t          j        k    rø|d         dk    r®t          j        d
         }|                     dt          j	        dd¦  «        ¦  «        }
t          |
¦  «        t          j	        urt          j	        dd¦  «        }
 ||d         |
j
        |
j        |                     dd¦  «        |d         |d         |¦  «        }�nt          j        d         } |t          j        |d         ¦  «        |d         |¦  «        }nÐ|d         t          j        k    r,t          j        d         } ||d         |d         |¦  «        }nŽ|d         t          j        k    r%t          j        d         } ||d         |¦  «        }nS|d         t          j        k    r=t          j        d         }|                     d¦  «        }|€|d         } |||¦  «        }|s|S t%          d„ |                      ¦   «         D ¦   «         ¦  «        }|                     dd¦  «        }|r!|d         |f|                     ¦   «         v r|}nFd}t          j                             ¦   «         dz   }	 ||z  }||                     ¦   «         vrn|dz  }Œ"|                     dd|› d�¦  «        }|S )NrÓ   rG   rÑ   r	   r   Úgoto1rÖ   r×   Úgoto2Úgotor1rÚ   Úgotor2ÚlaunchrÕ   ró   ÚnameÚ	nameddestc                 óZ   — g | ](}|d          t           j        k    ¯|d         |d         f‘Œ)S )r   r   rÔ   )r   ÚPDF_ANNOT_LINK)r=   rç   s     r   r>   zgetLinkText.<locals>.<listcomp>ì  s5   € ÐTÐTÐT˜!°Q°q´T½WÔ=SÒ5SÐ5Sˆ!ˆAŒ$��!”ˆÐ5SÐ5SÐ5Sr   ÚidrÒ   z-L%iTr   z/Linkz	/Link/NM(ú))Útransformation_matrixrÿ   Útupler   rë   Ú
annot_skelr   Ú	page_xrefr  rä   rç   ré   r  rî   r“   rñ   rê   rò   rº   Úannot_xrefsÚitemsÚTOOLSÚset_annot_stemÚvaluesrð   )r	   r  r‹   ÚictmrQ   rf   ÚannotÚtxtÚpnorÒ   rù   Ú	dest_pageÚdest_ctmÚ	dest_ictmÚipntÚlnameÚ
link_namesÚold_namer!  ÚiÚstems                        r   ÚgetLinkTextr=  ­  sÆ  € ð Ô
$€CØˆ4€DØˆFŒ€AÝ•U˜1˜t™8‘_”_Ñ%Ô%€Dà€EØ
ˆ6„{•gÔ'Ò'Ð'ØˆvŒ;˜!ÒÐÝÔ$ WÔ-ˆCØ�f”+ˆCØ”;×(Ò(¨Ñ-Ô-ˆDØ—'’'˜$¥¤¨a°Ñ 3Ô 3Ñ4Ô4ˆCØœ CÔ(ˆIØ Ô6ˆHØ!˜	ˆIØ˜‘?ˆDØ�C˜˜dœf d¤f¨c¯gªg°f¸aÑ.@Ô.@À$ÑGÔGˆE‰EåÔ$ WÔ-ˆCØ�C�Ô+¨C°¬IÑ6Ô6¸Ñ=Ô=ˆE‰Eà	ˆVŒ�Ô*Ò	*Ð	*ØˆvŒ;˜!ÒÐÝÔ$ XÔ.ˆCØ—'’'˜$¥¤¨a°Ñ 3Ô 3Ñ4Ô4ˆCÝ�C‰yŒy¥¤Ð-Ð-Ý”m A qÑ)Ô)�Ø�CØ�F”Ø”Ø”Ø—’˜ Ñ"Ô"Ø�F”Ø�F”Øñô ˆE‰Eõ Ô$ XÔ.ˆCØ�C�Ô+¨C°¬IÑ6Ô6¸¸F¼ÀTÑJÔJˆEˆEà	ˆVŒ�Ô+Ò	+Ð	+ÝÔ  Ô*ˆØ��C˜”K  V¤¨dÑ3Ô3ˆˆà	ˆVŒ�Ô(Ò	(Ð	(ÝÔ  Ô'ˆØ��C˜”J Ñ%Ô%ˆˆà	ˆVŒ�Ô*Ò	*Ð	*ÝÔ  Ô)ˆØ—’˜‘”ˆØˆ=Ø˜Ô$ˆEØ��E˜4Ñ Ô ˆØð Øˆõ ØTÐT˜t×/Ò/Ñ1Ô1ÐTÑTÔTñô €Jð �wŠw�t˜RÑ Ô €Hàð 	�S˜”[ (Ð+¨z×/?Ò/?Ñ/AÔ/AÐAÐAØˆˆàˆÝŒ}×+Ò+Ñ-Ô-°Ñ6ˆð	Ø˜!‘8ˆDØ˜:×,Ò,Ñ.Ô.Ð.Ð.ØØ�‰FˆAð		ð �MŠM˜(Ð$7°Ð$7Ð$7Ð$7Ñ8Ô8€EØ€Lr   c                  ó<   — d„ t          j        ¦   «         D ¦   «         S )zP
    Returns a list of upper-case colour names.
    :rtype: list of strings
    c                 ó   — g | ]	\  }}}}|‘Œ
S r   r   )r=   r!  rQ   Úgr   s        r   r>   z getColorList.<locals>.<listcomp>  s    € Ð?Ð?Ð?‘]�T˜1˜a ˆDÐ?Ð?Ð?r   ©r   Úcolors_wx_listr   r   r   ÚgetColorListrC    s"   € ð
 @Ð?¥gÔ&<Ñ&>Ô&>Ð?Ñ?Ô?Ð?r   c                  ó(   — t          j        ¦   «         S )zµ
    Returns list of (name, red, gree, blue) tuples, where:
        name: upper-case color name.
        read, green, blue: integers in range 0..255.
    :rtype: list of tuples
    rA  r   r   r   ÚgetColorInfoListrE    s   € õ Ô!Ñ#Ô#Ð#r   r!  c                 ót   — t          j        ¦   «                              |                      ¦   «         d¦  «        S )z˜Retrieve RGB color in PDF format by name.

    Returns:
        a triple of floats in range 0 to 1. In case of name-not-found, "white" is returned.
    )r   r   r   )r   Úcolors_pdf_dictr  rÃ   )r!  s    r   ÚgetColorrH     s+   € õ Ô"Ñ$Ô$×(Ò(¨¯ª©¬°yÑAÔAÐAr   c                 óº  — 	 t          ¦   «         t          ¦   «                              |                      ¦   «         ¦  «                 }n+# t          $ r t
          rt          j        ¦   «          Y dS w xY w|d         dz  }|d         dz  }|d         dz  }t          |||¦  «        }t          |dz  d¦  «        }t          |||¦  «        }||z
  }|dk    rd}	n8||k    rd||z
  |z  d	z  z  }	n#||k    rd||z
  |z  dz   z  }	nd||z
  |z  d
z   z  }	t          t          |	¦  «        ¦  «        }
|dk    rd}n||z  }t          t          |dz  ¦  «        ¦  «        }|
||fS )z¢Retrieve the hue, saturation, value triple of a color name.

    Returns:
        a triple (degree, percent, percent). If not found (-1, -1, -1) is returned.
    )rV   rV   rV   r   g     ào@rÔ   r   éd   r   g      N@é   r+   )rE  rC  ÚindexÚupperrá   râ   r   rã   rJ   rL   r[   rK   )r!  rç   rQ   r@  r   ÚcmaxÚVÚcminÚdeltaÚhueÚHÚsatÚSs                r   ÚgetColorHSVrV  )  s†  € ðÝÑÔ�|™~œ~×3Ò3°D·J²J±L´LÑAÔAÔBˆˆøÝð ð ð ÝÐ<¥GÔ$:Ñ$<Ô$<Ð$<Øˆ|ˆ|ðøøøð 	
ˆ!Œˆu‰€AØ	ˆ!Œˆu‰€AØ	ˆ!Œˆu‰€AÝˆq�!�Q‰<Œ<€DÝˆd�S‰j˜!ÑÔ€AÝˆq�!�Q‰<Œ<€DØ�4‰K€EØ�‚z€zØˆˆØ	�ŠˆØ˜˜A™ ‘¨!Ñ+Ñ,ˆˆØ	�ŠˆØ˜˜A™ ‘¨!Ñ+Ñ,ˆˆà˜˜A™ ‘¨!Ñ+Ñ,ˆå�E�#‰JŒJ‰Œ€Aàˆq‚y€yØˆˆà�d‰lˆÝ�E�#˜‘)ÑÔÑÔ€Aàˆq�!ˆ9Ðs   ‚AA Á$A0Á/A0r©   c                 ó,  — |                       |¦  «        \  }}}}d}d}|dk    r|||||fS |r€	 t          j        |¬¦  «        }|j        }|j        }|j        }	||z
  dk     r|	j        |k     r|	j        }d|z
  }n-# t          $ r  t          j        ¦   «          |dz  }|dz  }Y nw xY w|||||fS |dk    rQ	 t          j        |¦  «        }|j        }|j        }n7# t          $ r  t          j        ¦   «          |dz  }|dz  }Y nw xY w|dz  }|dz  }|||||fS )Ngš™™™™™é?gš™™™™™É¿rG   )Ú
fontbufferr   g333333ó?zn/a)	Úextract_fontr   ÚFontÚascenderÚ	descenderr•   r1   rá   rã   )
r©   rÒ   ÚfontnameÚextÚstypeÚbufferÚascÚdscÚfontr•   s
             r   Ú_get_font_propertiesrd  P  s„  € Ø#&×#3Ò#3°DÑ#9Ô#9Ñ €Hˆc�5˜&Ø
€CØ
€CØ
ˆb‚y€yØ˜˜e S¨#Ð-Ð-àð .ð	Ý”<¨6Ð2Ñ2Ô2ˆDØ”-ˆCØ”.ˆCØ”9ˆDØ�S‰y˜1Š}ˆ}Ø”7˜S’=�=Øœ'�CØ˜#‘g�øøÝð 	ð 	ð 	ÝÔ"Ñ$Ô$Ð$Ø�3‰JˆCØ�3‰JˆCˆCˆCð	øøøð ˜˜e S¨#Ð-Ð-Ø
ˆe‚|€|ð	Ý”< Ñ)Ô)ˆDØ”-ˆCØ”.ˆCˆCøÝð 	ð 	ð 	ÝÔ"Ñ$Ô$Ð$Ø�3‰JˆCØ�3‰JˆCˆCˆCð	øøøð
 	ˆs‰
ˆØˆs‰
ˆØ�S˜%  cÐ)Ð)s$   ¯A
A: Á:'B$Â#B$Â5"C Ã'DÄDc                 óh   — d}d}| j         j        }	 |sn|dz  }||j        z  }|j        }Œd|› d|› �S )Nr   r   z
num_spans=z num_chars=)Ú
m_internalÚheadrN   Únext)r_   Ú	num_spansÚ	num_charsÚspans       r   Ú_show_fz_textrl  u  sa   € ð
 €IØ€IØŒ?Ô€DðØð 	ØØ�Q‰ˆ	Ø�T”XÑˆ	ØŒyˆðð :˜	Ð9Ð9¨iÐ9Ð9Ð9r   c                 óÈ  — | \  }}|dd…                               d¦  «        dd…         }|dddœ}d}t          |¦  «        D ]Ÿ\  }} |rd}Œ
| d	k    r||dz            |d
<   d}Œ!|                      d¦  «        r8| dd…                              dd¦  «                             dd¦  «        }||d<   Œn|                      d¦  «        rt	          | dd…         ¦  «        }||d<   Œ |S )a"  Make a Python dict from a PDF page label rule.

    Args:
        item -- a tuple (pno, rule) with the start page number and the rule
                string like <</S/D...>>.
    Returns:
        A dict like
        {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
    rÔ   éþÿÿÿrÙ   r   NrG   )Ú	startpageÚprefixÚfirstpagenumFrU  ÚstyleTÚPú(r&  rp  ÚStrq  )ÚsplitÚ	enumerateÚ
startswithrð   rK   )Úitemr3  Úruler  Úskipr;  rç   s          r   Ú	rule_dictr|  ˜  s  € ð �I€CˆØ��"�Œ:×Ò˜CÑ Ô    Ô$€DØ R¸Ð;Ð;€AØ€DÝ˜T‘?”?ð "ð "‰ˆˆ4Øð 	ØˆDØØ�3Š;ˆ;Ø˜a !™eœˆAˆg‰JØˆDØØ�?Š?˜3ÑÔð 	Ø�Q�R�R”× Ò   bÑ)Ô)×1Ò1°#°rÑ:Ô:ˆAØˆAˆh‰KØØ�?Š?˜4Ñ Ô ð 	"Ý�D˜˜˜”H‘”ˆAØ !ˆAˆnÑøØ€Hr   c                 ó  ‡ — ˆ fd„|D ¦   «         d         }t          |¦  «        }|                     dd¦  «        }|                     dd¦  «        }|dv rdnd}‰ |d         z
  |d	         z   |z   }t          |||¦  «        S )
zäReturn the label for this page number.

    Args:
        pgNo: page number, 0-based.
        labels: result of doc._get_page_labels().
    Returns:
        The label (str) of the page number. Errors return an empty string.
    c                 ó,   •— g | ]}|d          ‰k    ¯|‘ŒS )r   r   )r=   rç   ÚpgNos     €r   r>   z!get_label_pno.<locals>.<listcomp>Å  s"   ø€ Ð.Ð.Ð.�!  1¤¨¢ ˆA   r   rV   rp  rG   rr  )r   ÚAr   ro  rq  )r|  r  Úconstruct_label)r  Úlabelsry  rz  rp  rr  rQ  Ú
pagenumbers   `       r   Úget_label_pnor„  º  s—   ø€ ð /Ð.Ð.Ð.�vÐ.Ñ.Ô.¨rÔ2€DÝ�T‰?Œ?€DØ�XŠX�h Ñ#Ô#€FØ�HŠH�W˜bÑ!Ô!€Eà˜:Ð%Ð%ˆBˆB¨1€EØ˜˜[Ô)Ñ)¨D°Ô,@Ñ@À5ÑH€JÝ˜5 &¨*Ñ5Ô5Ð5r   c                 ó~  — d}| dk    rt          |¦  «        }nŸ| dk    r"t          |¦  «                             ¦   «         }nw| dk    r"t          |¦  «                             ¦   «         }nO| dk    r"t	          |¦  «                             ¦   «         }n'| dk    r!t	          |¦  «                             ¦   «         }||z   }|S )z9Construct a label based on style, prefix and page number.rG   ÚDrQ   ÚRr   r€  )ÚstrÚintegerToRomanrÃ   rM  ÚintegerToLetter)rr  rp  r3  Ún_strÚresults        r   r�  r�  Ï  s»   € ð €EØ�‚|€|Ý�C‘”ˆˆØ	�#ŠˆÝ˜sÑ#Ô#×)Ò)Ñ+Ô+ˆˆØ	�#ŠˆÝ˜sÑ#Ô#×)Ò)Ñ+Ô+ˆˆØ	�#ŠˆÝ Ñ$Ô$×*Ò*Ñ,Ô,ˆˆØ	�#ŠˆÝ Ñ$Ô$×*Ò*Ñ,Ô,ˆØ�e‰^€FØ€Mr   c           
      óŠ  — ddl }|j        }d| }}t          d|¦  «        |k    r>|t          t	          j        d|¦  «        ¦  «        z  }|dz  }t          d|¦  «        |k    °>d}t          t          |¦  «        ¦  «        D ]B}t          |t          t	          j        d|¦  «        ¦  «        ¦  «        \  }}|||         z  }|}ŒC|S )z-Returns letter sequence string for integer i.r   Nr   é   rG   )ÚstringÚascii_uppercaseÚpowrK   ÚmathÚreversedÚrangeÚdivmod)	r;  r�  ÚlsÚnr   Ústr_tÚjr  r@  s	            r   rŠ  rŠ  â  sÉ   € ð €M€M€MØ	Ô	€BØˆa€q€AÝ
ˆb�!‰*Œ*˜Š/ˆ/Ø	�S•”˜"˜a‘”Ñ!Ô!Ñ!ˆØ	ˆQ‰ˆõ ˆb�!‰*Œ*˜Š/ˆ/ð €EÝ•e˜A‘h”hÑÔð ð ˆÝ�a��TœX b¨!™_œ_Ñ-Ô-Ñ.Ô.‰ˆˆ1Ø��A”‰ˆØˆˆØ€Lr   Únumc                 ób   ‡— dŠˆfd„}d                      d„  || ¦  «        D ¦   «         ¦  «        S )z$Return roman numeral for an integer.))iè  ÚM)i„  ÚCM)iô  r†  )i�  ÚCD)rJ  ÚC)éZ   ÚXC)é2   ÚL)é(   ÚXL)é
   ÚX)é	   ÚIX)rY   rO  )r+   ÚIV)r   ÚIc              3   ór   •K  — ‰D ]0\  }}t          | |¦  «        \  }}||z  V — | ||z  z  } | dk    r d S Œ1d S r-   )r•  )rš  rQ   Últrrç   rb   Úromans        €r   Ú	roman_numz!integerToRoman.<locals>.roman_num  sd   øè è € Øð 	ð 	‰FˆAˆsÝ˜#˜q‘>”>‰DˆAˆqØ˜‘'ˆMˆMˆMØ�1�q‘5‰LˆCØ�aŠxˆxØ��ð ð		ð 	r   rG   c                 ó   — g | ]}|‘ŒS r   r   )r=   r   s     r   r>   z"integerToRoman.<locals>.<listcomp>  s   € Ð.Ð.Ð.˜!�AÐ.Ð.Ð.r   )Újoin)rš  r¯  r®  s     @r   r‰  r‰  ô  sN   ø€ ð€Eð ð ð ð ð ð �7Š7Ð.Ð.˜y˜y¨™~œ~Ð.Ñ.Ô.Ñ/Ô/Ð/r   Úline_dirrk  r•   c                 óÒ  — | €|d         } | \  }}t          j        |¦  «        }t           j                             ¦   «         rd}n|d         |d         z
  }||d         z  }||z  }||z  }|dk    r7|dk    r1|j        d|fz
  }	|j        |dfz   }
|j        |dfz
  }|j        d|fz   }nª|dk    r7|dk    r1|j        |dfz   }	|j        d|fz
  }
|j        d|fz   }|j        |dfz
  }nm|dk    r7|dk    r1|j        d|fz
  }	|j        |dfz   }
|j        |dfz
  }|j        d|fz   }n0|j        |dfz   }	|j        d|fz
  }
|j        d|fz   }|j        |dfz
  }t          j        |	|
||¦  «        S )a�  Compute the quad located inside the bbox.

    The bbox may be any of the resp. tuples occurring inside the given span.

    Args:
        line_dir: (tuple) 'line["dir"]' of the owning line or None.
        span: (dict) the span. May be from get_texttrace() method.
        bbox: (tuple) the bbox of the span or any of its characters.
    Returns:
        The quad which is wrapped by the bbox.
    NÚdirr   r[  r\  Úsizer   )	r   r/   r-  Úset_small_glyph_heightsÚblÚtrÚbrÚtlÚQuad)r²  rk  r•   ÚcosÚsinr  r\   ÚhsÚhcÚulÚurÚllÚlrs                r   Úrecover_bbox_quadrÄ    sÍ  € ð ÐØ˜”;ˆØ�H€CˆÝŒ<˜ÑÔ€DÝ„}×,Ò,Ñ.Ô.ð 1Øˆˆà�Ô˜t KÔ0Ñ0ˆà��f”Ñ€Fð 
�#‰€BØ	�#‰€BØ	ˆQ‚w€w�2˜’7�7ØŒW˜˜2�wÑˆØŒW˜˜A�wÑˆØŒW˜˜A�wÑˆØŒW˜˜2�wÑˆˆØ	ˆqŠˆ�R˜1’W�WØŒW˜˜A�wÑˆØŒW˜˜2�wÑˆØŒW˜˜2�wÑˆØŒW˜˜A�wÑˆˆØ	ˆqŠˆ�R˜1’W�WØŒW˜˜2�wÑˆØŒW˜˜A�wÑˆØŒW˜˜A�wÑˆØŒW˜˜2�wÑˆˆàŒW˜˜A�wÑˆØŒW˜˜2�wÑˆØŒW˜˜2�wÑˆØŒW˜˜A�wÑˆÝŒ<˜˜B  BÑ'Ô'Ð'r   c                 óê   — t          | ¦  «        t          ust          | ¦  «        dk    rt          d¦  «        ‚t          |¦  «        t          urt          d¦  «        ‚t          | ||d         ¦  «        S )zÐRecover the quadrilateral of a text span.

    Args:
        line_dir: (tuple) 'line["dir"]' of the owning line.
        span: the span.
    Returns:
        The quadrilateral enveloping the span's text.
    rÔ   úbad line dir argumentúbad span argumentr•   )r“   r(  rN   r!   rº   rÄ  )r²  rk  s     r   Úrecover_quadrÈ  H  sj   € õ ˆH�~„~�UÐ"Ð"¥c¨(¡m¤m°qÒ&8Ð&8ÝÐ0Ñ1Ô1Ð1ÝˆD�z„z�ÐÐÝÐ,Ñ-Ô-Ð-Ý˜X t¨T°&¬\Ñ:Ô:Ð:r   r7   r”   c                 ó  ‡— |€| d         }t          |¦  «        dk    rt          d¦  «        ‚| d         }|\  }}t          ||d         ¦  «        }t          |¦  «        dk    rt          ||d         ¦  «        }n|}|j        }|j        }t          j        ||¦  «        }	||	z  }
t
          j                             ¦   «         Št          ˆfd„|D ¦   «         ¦  «        }t          j
        d| |
j        d¦  «        }|j        }||	 z  }|S )	aç  Calculate the line quad for 'dict' / 'rawdict' text extractions.

    The lower quad points are those of the first, resp. last span quad.
    The upper points are determined by the maximum span quad height.
    From this, compute a rect with bottom-left in (0, 0), convert this to a
    quad and rotate and shift back to cover the text of the spans.

    Args:
        spans: (list, optional) sub-list of spans to consider.
    Returns:
        pymupdf.Quad covering selected spans.
    Nr”   r   zbad span listr´  r   rV   c                 óL   •— g | ] }|d          ‰rdn|d         |d         z
  z  ‘Œ!S )rµ  r   r[  r\  r   )r=   r™   Úsmalls     €r   r>   z%recover_line_quad.<locals>.<listcomp>|  s8   ø€ ÐWÐWÐWÈAˆˆ6Œ˜5ÐF�a�a q¨¤}°q¸´~Ñ'EÑ	GÐWÐWÐWr   )rN   r!   rÈ  rÂ  rÃ  r   Úplanish_liner-  r¶  rJ   r/   rç   Úquad)r7   r”   r²  r¼  r½  Úq0Úq1Úline_llÚline_lrÚmat0Úx_lrÚhÚ	line_rectÚ	line_quadrË  s                 @r   Úrecover_line_quadr×  X  s  ø€ ð €}Ø�W”ˆÝ
ˆ5�z„z�Q‚€Ý˜Ñ)Ô)Ð)Ø�EŒ{€HØ�H€CˆÝ	�h  a¤Ñ	)Ô	)€BÝ
ˆ5�z„z�A‚~€~Ý˜( E¨"¤IÑ.Ô.ˆˆàˆàŒe€GØŒe€GåÔ ¨Ñ1Ô1€Dð �T‰>€DåŒM×1Ò1Ñ3Ô3€EåØWÐWÐWÐWÐQVÐWÑWÔWñ	ô 	€Aõ ”˜Q   D¤F¨AÑ.Ô.€IØ”€IØ�$�Ñ€IØÐr   Úcharsc                 ó,  — | €|d         } |€t          | |¦  «        S d|                     ¦   «         vrt          d¦  «        ‚t          | ||d         ¦  «        }t	          |¦  «        dk    rt          | ||d         ¦  «        }n|}|j        }|j        }t          j        ||¦  «        }||z  }t          j	         
                    ¦   «         }	|d         |	rdn|d	         |d
         z
  z  }
t          j        d|
 |j        d¦  «        }|j        }|| z  }|S )a^  Calculate the span quad for 'dict' / 'rawdict' text extractions.

    Notes:
        There are two execution paths:
        1. For the full span quad, the result of 'recover_quad' is returned.
        2. For the quad of a sub-list of characters, the char quads are
           computed and joined. This is only supported for the "rawdict"
           extraction option.

    Args:
        line_dir: (tuple) 'line["dir"]' of the owning line.
        span: (dict) the span.
        chars: (list, optional) sub-list of characters to consider.
    Returns:
        pymupdf.Quad covering selected characters.
    Nr´  rØ  z)need 'rawdict' option to sub-select charsr   r   rV   rµ  r[  r\  )rÈ  rô   r!   Úrecover_char_quadrN   rÂ  rÃ  r   rÌ  r-  r¶  r/   rç   rÍ  )r²  rk  rØ  rÎ  rÏ  Úspan_llÚspan_lrrÒ  rÓ  rË  rÔ  Ú	span_rectÚ	span_quads                r   Úrecover_span_quadrß  …  s  € ð" ÐØ˜”;ˆØ€}Ý˜H dÑ+Ô+Ð+Ø�d—i’i‘k”kÐ!Ð!ÝÐDÑEÔEÐEå	˜8 T¨5°¬8Ñ	4Ô	4€BÝ
ˆ5�z„z�A‚~€~Ý˜x¨¨u°R¬yÑ9Ô9ˆˆàˆàŒe€GØŒe€GÝÔ ¨Ñ1Ô1€Dà�T‰>€DåŒM×1Ò1Ñ3Ô3€EØˆVŒ˜UÐN˜˜¨¨jÔ)9¸DÀÔ<MÑ)MÑO€Aå”˜Q   D¤F¨AÑ.Ô.€IØ”€IØ�$�Ñ€IØÐr   Úcharc                 óÔ  — | €|d         } t          | ¦  «        t          ust          | ¦  «        dk    rt          d¦  «        ‚t          |¦  «        t          urt          d¦  «        ‚t          |¦  «        t          u rt          j        |d         ¦  «        }n@t          |¦  «        t          u rt          j        |d         ¦  «        }nt          d¦  «        ‚t          | ||¦  «        S )aD  Recover the quadrilateral of a text character.

    This requires the "rawdict" option of text extraction.

    Args:
        line_dir: (tuple) 'line["dir"]' of the span's line.
        span: (dict) the span dict.
        char: (dict) the character dict.
    Returns:
        The quadrilateral enveloping the character.
    Nr´  rÔ   rÆ  rÇ  r•   r   )r“   r(  rN   r!   rº   r   r/   rÄ  )r²  rk  rà  r•   s       r   rÚ  rÚ  ²  sÐ   € ð ÐØ˜”;ˆÝˆH�~„~�UÐ"Ð"¥c¨(¡m¤m°qÒ&8Ð&8ÝÐ0Ñ1Ô1Ð1ÝˆD�z„z�ÐÐÝÐ,Ñ-Ô-Ð-ÝˆD�z„z•TÐÐÝŒ|˜D œLÑ)Ô)ˆˆÝ	ˆd‰Œ•uÐ	Ð	ÝŒ|˜D œGÑ$Ô$ˆˆåÐ,Ñ-Ô-Ð-å˜X t¨TÑ2Ô2Ð2r   )NNNF)NNNFNr   )NNNr   )N)NN)r   rq   rr   FN)r_   )Br’  Útypingr…   rG   r   rá   Úformat_grÿ   râ   r   r   r   r   Ú
ByteStringÚAttributeErrorÚbytesÚ	bytearrayÚ
memoryviewÚAnyÚAnyTypeÚUnionrK   ÚOptIntÚOptionalr  ÚOptFloatrˆ  ÚOptStrrº   ÚOptDictÚOptBytesÚSequenceÚOptSeqrÅ   ÚTextPageÚboolÚlistr%   rB   re   rj   rp   r²   rÎ   rú   r  r=  rC  rE  r(  rH  rV  r€   rd  rl  r|  r„  r�  rŠ  r‰  r»  rÄ  rÈ  r×  rß  rÚ  r   r   r   ú<module>r÷     sÄ  ðð €€€Ø €€€Ø €€€ðØÐÐÐÐÐÐøØð ð ð Ø€N€N€N€N€Nðøøøð Ô€	àÔ3Ð à€
Ø€	Ø€Ø€	ð0ØÔ"€J€JøØð 0ð 0ð 0à˜Ñ" ZÑ/€J€J€Jð0øøøð Œ*€Ø	Œ�c˜4�iÔ	 €ØŒ?˜5Ô!€Ø	Œ˜Ô	€Ø
Œ/˜$Ô
€ØŒ?˜:Ô&€Ø	Œ˜œÔ	)€ðð ØØ!%Øðð Ø
Œ,ðà
ðð ðð Ôð	ð
 ðð 
ðð ð ð ðH ØØ!%ØØØðLð LØ
Œ,ðLà
ðLð ðLð Ôð	Lð
 ðLð 
ðLð Lð Lð Lðb ØØ!%Øðrð rØ
Œ,ðrà
ðrð ðrð Ôð	rð 	ðrð rð rð rðp "&ðð Ø
Œ,ðà
ðð Ôðð 	ð	ð ð ð ð( Ø!%ðð Ø
Œ,ðàðð 	ðð ð	ð
 Ôðð ð ð ð* ØØØØðO3ð O3Ø
Œ,ðO3àðO3ð ðO3ð 
ð	O3ð
 ðO3ð ðO3ð ÔðO3ð O3ð O3ð O3ðh ðjð ØØ!%ØØØðjð jð jØ
Œ,ðjàðjð ð	jð
 ðjð Ôðjð ðjð jð jð jðZ8ð 8 dð 8ð 8ð 8ð 8ðv7�Sð 7 ð 7¨#ð 7ð 7ð 7ð 7ðtP�g”lð P¨ð P°#ð Pð Pð Pð PðB@�dð @ð @ð @ð @ð$˜$ð $ð $ð $ð $ðB�3ð B˜5ð Bð Bð Bð Bð$�cð $˜eð $ð $ð $ð $ðN"*˜gÔ.ð "*°cð "*¸eð "*ð "*ð "*ð "*ðJ:ð :ð :ð"ð$ð ð ðD6ð 6ð 6ð*¨3ð ð ð ð ð&˜#ð ð ð ð ð$0˜ð 0 ð 0ð 0ð 0ð 0ðD/( ð /(¨Tð /(¸ð /(À7Ä<ð /(ð /(ð /(ð /(ðd;˜5ð ;¨ð ;°´ð ;ð ;ð ;ð ;ð *ð *˜Dð *¨ð *¸¼ð *ð *ð *ð *ðZ*ð * ð *¨Tð *¸$ð *È'Ì,ð *ð *ð *ð *ðZ3 ð 3¨Tð 3¸ð 3À'Ä,ð 3ð 3ð 3ð 3ð 3ð 3s   Ž •	! !»A ÁAÁA