§
    �Øj˜Û  ã                   ó2  — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
Z
ddl
mZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZmZ 	 dd
lmZ n# e$ r	 ddlmZ Y nw xY we
j                              d¦  «         dZ! G d„ d¦  «        Z" G d„ d¦  «        Z#e	 G d„ d¦  «        ¦   «         Z$d=d„Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+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%e,fd&„Z-d'„ Z.d(„ Z/d)„ Z0e1d*k    �rddl2Z2ddl3Z3ddl4Z4	 e3j5        d+         Z6nA# e7$ r9  e8d,ej9         :                    e;¦  «        › d-�¦  «          e3j<        ¦   «          Y nw xY w e4j=        ¦   «         Z> e
j?        e6¦  «        Z@e3j5        d.d…         ZA eBe@jC        ¦  «        ZD eEeA¦  «        d.k    rôeAd         d/k    règ ZDeAd+          F                    d0e@jC        › ¦  «        ZGeG H                    d1¦  «        D ]lZId2eIv rE eJeKeI H                    d2¦  «        ¦  «        \  ZLZMeD N                     eBeLd+z
  eM¦  «        ¦  «         ŒKeD O                     eKeI¦  «        d+z
  ¦  «         Œm ePd3„ eDD ¦   «         dd4…         ¦  «        ZQeQ eP¦   «         k    r e3j<        d5eQ› d6e@› d7�¦  «          e-e@eD¬8¦  «        ZRe@jS        ZTeTd9z   ZU e2jV        eU¦  «         W                    eR X                    ¦   «         ¦  «          e4j=        ¦   «         ZY e8d:eT›d; eZeYe>z
  d.¦  «        › d<�¦  «         dS dS )>a  
This script accepts a PDF document filename and converts it to a text file
in Markdown format, compatible with the GitHub standard.

It must be invoked with the filename like this:

python pymupdf_rag.py input.pdf [-pages PAGES]

The "PAGES" parameter is a string (containing no spaces) of comma-separated
page numbers to consider. Each item is either a single page number or a
number range "m-n". Use "N" to address the document's last page number.
Example: "-pages 2-15,40,43-N"

It will produce a markdown text file called "input.md".

Text will be sorted in Western reading order. Any table will be included in
the text in markdwn format as well.

Dependencies
-------------
PyMuPDF v1.25.5 or later

Copyright and License
----------------------
Copyright (C) 2024-2025 Artifex Software, Inc.

PyMuPDF4LLM is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.

Alternative licensing terms are available from the licensor.
For commercial licensing, see <https://www.artifex.com/> or contact
Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
CA 94129, USA, for further information.
é    N)Ú
b2a_base64)Údefaultdict)Ú	dataclass)Úmupdf)Úget_raw_lines)Úcolumn_boxes)
ÚBULLETSÚREPLACEMENT_CHARACTERÚalmost_in_bboxÚare_disjointÚbbox_in_bboxÚbbox_is_emptyÚintersect_rectsÚis_ocr_textÚis_whiteÚstartswith_bullet)Útqdm)ÚProgressBarTz	
![](%s)
c            	       óD   — e Zd ZdZ	 	 	 ddedededefd	„Zdd
e	defd„Z
dS )ÚIdentifyHeadersa  Compute data for identifying header text.

    All non-white text from all selected pages is extracted and its font size
    noted as a rounded value.
    The most frequent font size (and all smaller ones) is taken as body text
    font size.
    Larger font sizes are mapped to strings of multiples of '#', the header
    tag in Markdown, which in turn is Markdown's representation of HTML's
    header tags <h1> to <h6>.
    Larger font sizes than body text but smaller than the <h6> font size are
    represented as <h6>.
    Né   é   ÚdocÚpagesÚ
body_limitÚ
max_levelsc           	      ó–  ‡ — t          |t          ¦  «        r|t          dd¦  «        vrt          d¦  «        ‚t          |t          j        ¦  «        r|}nt	          j        |¦  «        }|j        rtt	          j        |¦  «        }t          j
        t          j        |¦  «        t	          j        d¦  «        ¦  «        }|                     t	          j        d¦  «        ¦  «         |€t          |j        ¦  «        }t          t          ¦  «        }|D ]—}	|                     |	¦  «        }
|
                     dt          j        ¬¦  «        d	         }d
„ |D ¦   «         D ]L}t'          |d         ¦  «        }||xx         t)          |d                              ¦   «         ¦  «        z  cc<   ŒMŒ˜||k    r|                     ¦   «          i ‰ _        t1          d„ |                     ¦   «         D ¦   «         d„ ¬¦  «        }|r"t5          ||d         d         ¦  «        ‰ _        n|‰ _        t1          ˆ fd„|                     ¦   «         D ¦   «         d¬¦  «        d|…         }t;          |d¬¦  «        D ]\  }}d|z  dz   ‰ j        |<   Œ‰ j                             ¦   «         r0t=          ‰ j                             ¦   «         ¦  «        dz
  ‰ _        dS dS )zìRead all text and make a dictionary of fontsizes.

        Args:
            doc: PDF document or filename
            pages: consider these page numbers only
            body_limit: treat text with larger font size as a header
        é   é   z-max_levels must be an integer between 1 and 6ÚRootÚStructTreeRootNÚdict©ÚflagsÚblocksc                 óh   — g | ]/}|d          D ]$}|d         D ]}t          |d         ¦  «        °|‘ŒŒ%Œ0S )ÚlinesÚspansÚtext)r   )Ú.0ÚbÚlÚss       ú”/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/helpers/pymupdf_rag.pyú
<listcomp>z,IdentifyHeaders.__init__.<locals>.<listcomp>z   sp   € ð ð ð àØ˜7œðð ð Ø˜7œð	ð ð Ý  &¤	Ñ*Ô*ðØðð ð ð ð ó    Úsizer)   c                 ó   — g | ]	\  }}||f‘Œ
S © r3   )r*   ÚkÚvs      r.   r/   z,IdentifyHeaders.__init__.<locals>.<listcomp>�   s    € Ð2Ð2Ð2™˜˜1ˆa�ˆVÐ2Ð2Ð2r0   c                 ó"   — | d         | d         fS )Nr   r   r3   ©Úis    r.   ú<lambda>z*IdentifyHeaders.__init__.<locals>.<lambda>�   s   € À1ÀQÄ4ÈÈ1ÌÀ,€ r0   ©Úkeyéÿÿÿÿr   c                 ó*   •— g | ]}|‰j         k    ¯|‘ŒS r3   )r   )r*   ÚfÚselfs     €r.   r/   z,IdentifyHeaders.__init__.<locals>.<listcomp>™   s%   ø€ Ð@Ð@Ð@�1¨A°´Ò,?Ð,?ˆQÐ,?Ð,?Ð,?r0   T)Úreverse)Ústartú#ú )Ú
isinstanceÚintÚrangeÚ
ValueErrorÚpymupdfÚDocumentÚopenÚis_pdfÚ_as_pdf_documentr   Úpdf_dict_getÚpdf_trailerÚPDF_NAMEÚpdf_dict_delÚ
page_countr   Ú	load_pageÚget_textÚTEXTFLAGS_TEXTÚroundÚlenÚstripÚcloseÚ	header_idÚsortedÚitemsÚmaxr   ÚkeysÚ	enumerateÚmin)r?   r   r   r   r   ÚmydocÚmypdfÚrootÚ	fontsizesÚpnoÚpager%   ÚspanÚfontszÚtempÚsizesr8   r1   s   `                 r.   Ú__init__zIdentifyHeaders.__init__V   sï  ø€ õ ˜*¥cÑ*Ô*ð 	N¨jÅÀaÈÁÄÐ.KÐ.KÝÐLÑMÔMÐMÝ�c�7Ô+Ñ,Ô,ð 	&ØˆEˆEå”L Ñ%Ô%ˆEàŒ<ð 	BåÔ,¨UÑ3Ô3ˆEÝÔ%ÝÔ! %Ñ(Ô(­'Ô*:¸6Ñ*BÔ*Bñô ˆDð ×Ò�gÔ.Ð/?Ñ@Ô@ÑAÔAÐAàˆ=Ý˜%Ô*Ñ+Ô+ˆEå¥Ñ$Ô$ˆ	Øð 	?ð 	?ˆCØ—?’? 3Ñ'Ô'ˆDØ—]’] 6µÔ1G�]ÑHÔHÈÔRˆFðð àðñ ô ð ?ð ?�õ ˜t Fœ|Ñ,Ô,�Ø˜&Ð!Ð!Ô!¥S¨¨f¬×);Ò);Ñ)=Ô)=Ñ%>Ô%>Ñ>Ð!Ð!Ñ!Ð!ð?ð �CŠ<ˆ<à�KŠK‰MŒMˆMð ˆŒõ
 Ø2Ð2 	§¢Ñ 1Ô 1Ð2Ñ2Ô2Ð8NÐ8Nð
ñ 
ô 
ˆð ð 	)å! *¨d°2¬h°q¬kÑ:Ô:ˆDŒOˆOà(ˆDŒOõ Ø@Ð@Ð@Ð@˜	ŸšÑ(Ô(Ð@Ñ@Ô@Øð
ñ 
ô 
ð ˆ:ˆ+ôˆõ ! ¨aÐ0Ñ0Ô0ð 	1ð 	1‰GˆAˆtØ#&¨¡7¨S¡=ˆDŒN˜4Ñ Ð ØŒ>×ÒÑ Ô ð 	=Ý! $¤.×"5Ò"5Ñ"7Ô"7Ñ8Ô8¸1Ñ<ˆDŒOˆOˆOð	=ð 	=r0   rf   Úreturnc                 ó€   — t          |d         ¦  «        }|| j        k    rdS | j                             |d¦  «        }|S )úÍReturn appropriate markdown header prefix.

        Given a text span from a "dict"/"rawdict" extraction, determine the
        markdown header prefix string of 0 to n concatenated '#' characters.
        r1   Ú )rU   r   rY   Úget)r?   rf   re   ÚfontsizeÚhdr_ids        r.   Úget_header_idzIdentifyHeaders.get_header_id£   sC   € õ ˜˜fœÑ&Ô&ˆØ�t”Ò&Ð&Ø�2Ø”×#Ò# H¨bÑ1Ô1ˆØˆr0   )Nr   r   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚlistÚfloatrE   rj   r"   rr   r3   r0   r.   r   r   H   s™   € € € € € ðð ð  ØØðK=ð K=àðK=ð ðK=ð ð	K=ð
 ðK=ð K=ð K=ð K=ðZ
ð 
 $ð 
°cð 
ð 
ð 
ð 
ð 
ð 
r0   r   c                   ó0   — e Zd ZdZdefd„Zddedefd„ZdS )	Ú
TocHeadersaq  Compute data for identifying header text.

    This is an alternative to IdentifyHeaders. Instead of running through the
    full document to identify font sizes, it uses the document's Table Of
    Contents (TOC) to identify headers on pages.
    Like IdentifyHeaders, this also is no guarantee to find headers, but it
    represents a good chance for appropriately built documents. In such cases,
    this method can be very much faster and more accurate, because we can
    directly use the hierarchy level of TOC items to ientify the header level.
    Examples where this works very well are the Adobe PDF documents.
    r   c                 óÒ   — t          |t          j        ¦  «        r|}nt          j        |¦  «        }|                     ¦   «         | _        ||k    r|                     ¦   «          dS dS )z'Read and store the TOC of the document.N)rD   rH   rI   rJ   Úget_tocÚTOCrX   )r?   r   r`   s      r.   rj   zTocHeaders.__init__½   s]   € å�c�7Ô+Ñ,Ô,ð 	&ØˆEˆEå”L Ñ%Ô%ˆEà—;’;‘=”=ˆŒØ�CŠ<ˆ<à�KŠK‰MŒMˆMˆMˆMð ˆ<r0   Nrf   rk   c                 ó(  ‡— ‰sdS ˆfd„| j         D ¦   «         }|sdS |d                              ¦   «         }|D ]X}|d                              ¦   «         }|d         }|                     |¦  «        s|                     |¦  «        r
d|z  dz   c S ŒYdS )rm   rn   c                 óL   •— g | ] }|d          ¯
|d         ‰j         d z   k    ¯|‘Œ!S )r   r<   )Únumber)r*   Útre   s     €r.   r/   z,TocHeaders.get_header_id.<locals>.<listcomp>Ò   s6   ø€ ÐKÐKÐK˜¨¨1¬ÐK°!°B´%¸4¼;È¹?Ò2JÐ2J�!Ð2JÐ2JÐ2Jr0   r)   r   r   rB   rC   )r   rW   Ú
startswith)r?   rf   re   Úmy_tocr)   rƒ   ÚtitleÚlvls     `     r.   rr   zTocHeaders.get_header_idÉ   sÃ   ø€ ð ð 	Ø�2àKÐKÐKÐK˜TœXÐKÑKÔKˆØð 	Ø�2ð �FŒ|×!Ò!Ñ#Ô#ˆØð 	'ð 	'ˆAØ�a”D—J’J‘L”LˆEØ�A”$ˆCØ�Š˜uÑ%Ô%ð '¨×)9Ò)9¸$Ñ)?Ô)?ð 'à˜S‘y 3‘Ð&Ð&Ð&ð'ð ˆrr0   rs   )rt   ru   rv   rw   rx   rj   r"   rr   r3   r0   r.   r|   r|   °   s`   € € € € € ð
ð 
ð
˜Cð 
ð 
ð 
ð 
ðð  $ð °cð ð ð ð ð ð r0   r|   c                   ó   — e Zd ZdS )Ú
ParametersN)rt   ru   rv   r3   r0   r.   r‰   r‰   â   s   € € € € € à€Dr0   r‰   c                 ót  — | | ||f}g }| dd…         }|r‚|d         
 |z   }d}|rXd}t          t          |¦  «        dz
  dd¦  «        D ]2}|                     ||         j        ¦  «        r|||         z  }||= d}Œ3|°X|                     |¦  «         |d= |°‚t          t          |¦  «        d„ ¬¦  «        }|S )	a…  Join any rectangles with a pairwise non-empty overlap.

    Accepts and returns a list of Rect items.
    Note that rectangles that only "touch" each other (common point or edge)
    are not considered as overlapping.
    Use a positive "enlarge" parameter to enlarge rectangle by these many
    points in every direction.

    TODO: Consider using a sweeping line algorithm for this.
    Nr   TFr   r<   c                 ó   — | j         | j        fS rs   )Úx0Úy0©Úrs    r.   r9   zrefine_boxes.<locals>.<lambda>  s   € °a´d¸A¼D°\€ r0   r:   )rF   rV   Ú
intersectsÚirectÚappendrZ   Úset)ÚboxesÚenlargeÚdeltaÚ	new_rectsÚprectsr�   Úrepeatr8   s           r.   Úrefine_boxesrš   ç   s   € ð ˆX˜�x ¨'Ð2€EØ€Ià�1�1�1ŒX€Fà
ð Ø�AŒYˆJ˜ÑˆØˆØð 	"ØˆFÝ�3˜v™;œ;¨™?¨A¨rÑ2Ô2ð "ð "�Ø—<’<  q¤	¤Ñ0Ô0ð "Ø˜ œ‘N�AØ˜q˜	Ø!�Føð ð 	"ð 	×Ò˜ÑÔÐØ�1ˆIð ð õ •s˜9‘~”~Ð+AÐ+AÐBÑBÔB€IØÐr0   c                 óP  ‡ — ‰ j         ‰ j        k    r‰ j         dz  }n
‰ j        dz  }‰ ||| | fz   }ˆ fd„|D ¦   «         }t          d„ |D ¦   «         ¦  «        t          ‰ j         ¦  «        hz  }t          d„ |D ¦   «         ¦  «        t          ‰ j        ¦  «        hz  }t	          |¦  «        dk    st	          |¦  «        dk    rdS |D ]Ý}|d         }t          |¦  «        s t          t          ||¦  «        ¦  «        s dS 	 	 |j        |j        k    r@|j        |j        cxk    r|j        k    r$n n!|j	        |j
        k     r|j
        |j	        k    r	 	 	 |j	        |j
        k    r@|j	        |j	        cxk    r|j
        k    r$n Œ¼|j        |j        k     r|j        |j        k    r	 ŒÞdS )	a  Check whether the rectangle "box" contains 'signifiant' drawings.

    This means that some path is contained in the "interior" of box.
    To this end, we build a sub-box of 90% of the original box and check
    whether this still contains drawing paths.
    gš™™™™™™?c                 ó@   •— g | ]}|d          ‰v ¯|d          ‰k    ¯|‘ŒS ©Úrectr3   )r*   ÚpÚboxs     €r.   r/   z"is_significant.<locals>.<listcomp>  s5   ø€ ÐJÐJÐJ�a A f¤I°Ð$4Ð$4¸¸6¼ÀcÒ9IÐ9I�Ð9IÐ9IÐ9Ir0   c              3   óJ   K  — | ]}t          |d          j        ¦  «        V — ŒdS ©rž   N)rU   Úwidth©r*   rŸ   s     r.   ú	<genexpr>z!is_significant.<locals>.<genexpr>  s0   è è € Ð:Ð:¨A•�q˜”y”Ñ'Ô'Ð:Ð:Ð:Ð:Ð:Ð:r0   c              3   óJ   K  — | ]}t          |d          j        ¦  «        V — ŒdS r¢   )rU   Úheightr¤   s     r.   r¥   z!is_significant.<locals>.<genexpr>  s1   è è € Ð<Ð<¨a•%˜˜&œ	Ô(Ñ)Ô)Ð<Ð<Ð<Ð<Ð<Ð<r0   r   Frž   T)r£   r§   r“   rU   rV   r   r   r�   Úy1rŒ   Úx1)	r    ÚpathsÚdÚnboxÚmy_pathsÚwidthsÚheightsrŸ   rž   s	   `        r.   Úis_significantr°   
  sô  ø€ ð „y�3”:ÒÐØŒI˜ÑˆˆàŒJ˜ÑˆØ�!�Q˜˜˜Q˜B�Ñ€DàJÐJÐJÐJ˜5ÐJÑJÔJ€HÝÐ:Ð:°Ð:Ñ:Ô:Ñ:Ô:½eÀCÄIÑ>NÔ>NÐ=OÑO€FÝÐ<Ð<°8Ð<Ñ<Ô<Ñ<Ô<ÅÀcÄjÑ@QÔ@QÐ?RÑR€GÝ
ˆ6�{„{�aÒÐ�3˜w™<œ<¨1Ò,Ð,ØˆuØð ð ˆØ�Œyˆå˜$ÑÔð	Ý#0µÀÀtÑ1LÔ1LÑ#MÔ#Mð	ð �4�4ð ð	à”˜4œ7Ò"Ð"Ø”˜4œ7Ð-Ð-Ò-Ð- d¤gÒ-Ð-Ð-Ð-Ð-Ø”˜$œ'Ò!Ð!Ø”˜$œ'Ò!Ð!àð ð	à”˜4œ7Ò"Ð"Ø”˜4œ7Ð-Ð-Ò-Ð- d¤gÒ-Ð-Ð-Ð-Ð-Ø”˜$œ'Ò!Ð!Ø”˜$œ'Ò!Ð!àøØˆ5r0   c                  ó    — t          d¦  «        ‚)Nz;Function 'to_json' is only available in PyMuPDF-Layout mode©ÚNotImplementedError©ÚargsÚkwargss     r.   Úto_jsonr·   8  ó   € Ý
ØEñô ð r0   c                  ó    — t          d¦  «        ‚)Nz=Function 'to_chunks' is only available in PyMuPDF-Layout moder²   r´   s     r.   Ú	to_chunksrº   >  s   € Ý
ØGñô ð r0   c                  ó    — t          d¦  «        ‚)Nz;Function 'to_text' is only available in PyMuPDF-Layout moder²   r´   s     r.   Úto_textr¼   D  r¸   r0   c                 ó$   — ddl m}  || ¦  «        S )z³Return the ``(bbox, html, rows, cols, cells, extract)`` payload for each
    table on ``page``. Imported lazily so table_html loads only when
    table_output="html" is requested.r   )Úpage_html_tables)Úpymupdf4llm.helpers.table_htmlr¾   )re   r¾   s     r.   Ú_reconstruct_html_tablesrÀ   S  s(   € ð @Ð?Ð?Ð?Ð?Ð?àÐ˜DÑ!Ô!Ð!r0   c                 óv   — |dk    r| j         |         d         S | j        |                              d¬¦  «        S )z§Render table ``i`` as markdown (default) or reconstructed HTML.

    In HTML mode ``i`` indexes ``parms.html_tables`` directly, so no bbox
    matching is needed.
    Úhtmlr   F)Úclean)Úhtml_tablesÚtabsÚto_markdown)Úparmsr8   Útable_outputs      r.   Ú_table_stringrÉ   \  s?   € ð �vÒÐØÔ  Ô# AÔ&Ð&ØŒ:�aŒ=×$Ò$¨5Ð$Ñ1Ô1Ð1r0   Frn   Úpnggš™™™™™©?é–   id  Úlines_strictÚmarkdowné   )r   Úhdr_infoÚwrite_imagesÚembed_imagesÚignore_imagesÚignore_graphicsÚdetect_bg_colorÚ
image_pathÚimage_formatÚimage_size_limitÚfilenameÚ
force_textÚpage_chunksÚpage_separatorsÚmarginsÚdpiÚ
page_widthÚpage_heightÚtable_strategyrÈ   Úgraphics_limitÚfontsize_limitÚignore_codeÚextract_wordsÚshow_progressÚ
use_glyphsÚignore_alphark   c                ó	  ‡‡‡
‡‡‡‡‡+‡,‡-‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7‡8‡9‡:‡;‡<‡=‡>‡?‡@— |                      ¦   «         r2t          dt          |                      ¦   «         ¦  «        › d�¦  «         ‰du r‰du r‰du rt          d¦  «        ‚‰du rdŠd}d‰
cxk    rdk     sn t          d	¦  «        ‚|Š,|Š0|	Š1|Š-‰-du rd}d}|d
vrt          d¦  «        ‚|Š3|Š2‰2r9‰du r5t          j                             ‰2¦  «        st	          j        ‰2d¬¦  «         t          | t          j
        ¦  «        st          j        | ¦  «        } |€| j        n|Š.|Š/|}|}|}|Š+| j        s| j        r(|                      ¦   «         r|                      ¦   «          | j        rbt%          |d¦  «        r|                      ||¬¦  «         n:|                      |d¬¦  «         | j        } d| z  }!|                      ||!¬¦  «         |€!t+          t-          | j        ¦  «        ¦  «        }t%          |d¦  «        r|gdz  }t/          |¦  «        dk    rd|d         d|d         f}t/          |¦  «        dk    rt          d¦  «        ‚t1          d„ |D ¦   «         ¦  «        st          d¦  «        ‚t3          |¦  «        r|Š6nKt%          |d¦  «        rt3          |j        ¦  «        r|j        Š6n|du rd-d„Š6nt7          | ¦  «        }|j        Š6ˆ6fd„Š7d„ Š=ˆ,ˆ1ˆ2ˆˆ
ˆfd„Š>dd‰fdt          j        fˆ-ˆ0ˆ3ˆ7ˆ:ˆ=ˆ>ˆ@fd„Š@d„ Š4d„ Š:d„ }"ˆ-ˆ3fd „Š9ˆ>ˆ@fd!„Š8d"„ Š;d#„ Š5ˆ.fd$„}#d%t*          d&t*          fd'„Š?ˆ+ˆ-ˆ/ˆ3ˆ4ˆˆ5ˆˆ
ˆ8ˆ9ˆ:ˆ;ˆˆ>ˆ?ˆˆ@fd(„}$|du rd}%ng }%|                      ¦   «         }&dt          j        z  t          j        z  }'dt          j         z  t          j        z  t          j        z  t          j!        _"        |r|'tF          j$        z  }'|r"t          d)‰.› d*�¦  «         tK          |¦  «        }|D ]sŠ< |$| ‰<||'‰.||¦  «        }(|du r|%|(j&        z  }%nPˆ<fd+„|&D ¦   «         }) |#| ‰<¦  «        }*|% '                    |*|)|(j(        |(j)        |(j*        |(j&        |(j+        d,œ¦  «         ~(Œt|%S ).aƒ  Process the document and return the text of the selected pages.

    Args:
        doc: pymupdf.Document or string.
        pages: list of page numbers to consider (0-based).
        hdr_info: callable or object having method 'get_hdr_info'.
        write_images: (bool) save images / graphics as files.
        embed_images: (bool) embed images in markdown text (base64 encoded)
        image_path: (str) store images in this folder.
        image_format: (str) use this image format. Choose a supported one.
        force_text: (bool) output text despite of image background.
        page_chunks: (bool) whether to segment output by page.
        page_separators: (bool) whether to include page separators in output.
        margins: omit content overlapping margin areas.
        dpi: (int) desired resolution for generated images.
        page_width: (float) assumption if page layout is variable.
        page_height: (float) assumption if page layout is variable.
        table_strategy: choose table detection strategy
        table_output: ("markdown" or "html") render tables as markdown (default)
            or as reconstructed HTML <table> via pymupdf4llm.helpers.table_html.
        graphics_limit: (int) if vector graphics count exceeds this, ignore all.
        ignore_code: (bool) suppress code-like formatting (mono-space fonts)
        extract_words: (bool, False) include "words"-like output in page chunks
        show_progress: (bool, False) print progress as each page is processed.
        use_glyphs: (bool, False) replace the Invalid Unicode by glyph numbers.
        ignore_alpha: (bool, True) ignore text with alpha = 0 (transparent).

    z,Warning - arguments ignored in legacy mode: ú.Fz4Images and text on images cannot both be suppressed.Trn   r   r   z8'image_size_limit' must be non-negative and less than 1.)rÍ   rÂ   z,'table_output' must be 'markdown' or 'html'.)Úexist_okNÚ	__float__)r£   r§   i  é   é   z'margins must be one, two or four floatsc              3   ó6   K  — | ]}t          |d ¦  «        V — ŒdS )rë   N)Úhasattr)r*   Úms     r.   r¥   zto_markdown.<locals>.<genexpr>Ü  s,   è è € Ð:Ð:¨Q•˜˜KÑ(Ô(Ð:Ð:Ð:Ð:Ð:Ð:r0   zmargin values must be floatsrr   c                 ó   — dS )Nrn   r3   )r-   re   s     r.   r9   zto_markdown.<locals>.<lambda>æ  s   € ¨R€ r0   c                 ó–   •‡— t          d„ t          ˆˆfd„| D ¦   «         ¦  «        D ¦   «         ¦  «        }|sdS d|d         dz
  z  dz   S )Nc                 ó   — g | ]
}|d k    ¯|‘ŒS ©r   r3   ©r*   r,   s     r.   r/   z6to_markdown.<locals>.max_header_id.<locals>.<listcomp>í  s$   € ÐXÐXÐX�1ÐRSÐVWÒRWÐRWˆQÐRWÐRWÐRWr0   c                 óD   •— g | ]}t           ‰|‰¬ ¦  «        ¦  «        ‘ŒS )©re   )rV   )r*   r-   rr   re   s     €€r.   r/   z6to_markdown.<locals>.max_header_id.<locals>.<listcomp>í  s0   ø€ ÐMÐMÐMÀ!�S  ¨q°tÐ!<Ñ!<Ô!<Ñ=Ô=ÐMÐMÐMr0   rn   rB   r   r   rC   )rZ   r“   )r(   re   Úhdr_idsrr   s    ` €r.   Úmax_header_idz"to_markdown.<locals>.max_header_idë  sk   øø€ ÝØXÐX�ÐMÐMÐMÐMÐMÀuÐMÑMÔMÑNÔNÐXÑXÔXñ
ô 
ˆð ð 	Ø�2Ø�g˜a”j 1‘nÑ%¨Ñ+Ð+r0   c                 óN  — t          j        |d         ¦  «        }| D ]‡}|d         }|j        |j        z   dz  }||vrŒ!|d                              ¦   «         }|d         }dD ]5}|                     |dt          t          |¦  «        ¦  «        › �¦  «        }Œ6d|› d	|› d
�}|c S dS )a  Accept a span and return a markdown link string.

        Args:
            links: a list as returned by page.get_links()
            span: a span dictionary as returned by page.get_text("dict")

        Returns:
            None or a string representing the link in MD format.
        ÚbboxÚfromrí   r)   Úuriz()
ú%ú[z](ú)N)rH   ÚRectÚtlÚbrrW   ÚreplaceÚhexÚord)	Úlinksrf   rû   ÚlinkÚhotÚmiddler)   rý   Úcs	            r.   Úresolve_linksz"to_markdown.<locals>.resolve_linksó  sÑ   € õ Œ|˜D œLÑ)Ô)ˆàð 	ð 	ˆDØ�v”,ˆCØ”f˜sœv‘o¨Ñ*ˆFØ˜T�>�>ØØ˜”<×%Ò%Ñ'Ô'ˆDØ�u”+ˆCð ð 8ð 8�Ø—k’k !Ð%6­­S°©V¬V©¬Ð%6Ð%6Ñ7Ô7��Ø%�tÐ%Ð%˜sÐ%Ð%Ð%ˆDØˆKˆKˆKð	ð 	r0   c           
      ó¢  •— | j         }|j        |j        j        ‰z  k     s|j        |j        j        ‰z  k     rdS ‰du s‰du r|                     |‰¬¦  «        }ndS |j        dk    s|j        dk    rdS ‰du r“t
          j                             | j        ¦  «         	                    dd¦  «        }t
          j         
                    ‰
|› d|j        › d|› d‰	› �¦  «        }|                     |¦  «         | 	                    dd	¦  «        S ‰du r?t          |                     ‰	¦  «        ¦  «                             ¦   «         }d
‰	› d�|z   }|S dS )z¥Optionally render the rect part of a page.

        We will ignore images that are empty or that have an edge smaller
        than x% of the corresponding page edge.rn   T)ÚcliprÝ   r   rC   ú-ré   ú\ú/zdata:image/z;base64,)re   r£   rž   r§   Ú
get_pixmapÚosÚpathÚbasenamerØ   r  Újoinr‚   Úsaver   ÚtobytesÚdecode)rÇ   rž   r8   re   ÚpixrØ   Úimage_filenameÚdataÚDPIÚIMG_EXTENSIONÚIMG_PATHrÑ   r×   rÐ   s           €€€€€€r.   Ú
save_imagezto_markdown.<locals>.save_image  sp  ø€ ð
 ŒzˆàŒJ˜œœÐ+;Ñ;Ò;Ð;ØŒ{˜TœYÔ-Ð0@Ñ@Ò@Ð@à�2Ø˜4ÐÐ <°4Ð#7Ð#7Ø—/’/ t°�/Ñ5Ô5ˆCˆCà�2ØŒ:˜Š?ˆ?˜cœi¨1šn˜nØ�2à˜4ÐÐÝ”w×'Ò'¨¬Ñ7Ô7×?Ò?ÀÀSÑIÔIˆHÝœWŸ\š\Ø˜XÐIÐI¨¬ÐIÐI°aÐIÐI¸-ÐIÐIñô ˆNð �HŠH�^Ñ$Ô$Ð$Ø!×)Ò)¨$°Ñ4Ô4Ð4Ø˜TÐ!Ð!å˜cŸkšk¨-Ñ8Ô8Ñ9Ô9×@Ò@ÑBÔBˆDØ8 Ð8Ð8Ð8¸4Ñ?ˆDØˆKØˆrr0   r  c           
      ó@  •‡ ‡*— |€‰ j         }d}t          ‰ j        |d‰ j         ¬¦  «        }ˆ/ˆ fd„|D ¦   «         }‰ j                             d„ |D ¦   «         ¦  «         d}d}d}	d}
|D �]ã\  Š*} ‰/‰*‰ j        ¦  «        sŒ|r×ˆ*ˆ fd	„‰ j                             ¦   «         D ¦   «         }|D ]®\  }}|d
t          ‰ |‰-¦  «        z   d
z   z  }‰+rq‰-dk    rkt          t          d„ ‰ j        |         j        j        ‰ j        |         j        z   D ¦   «         ¦  «        d„ ¬¦  «        }‰ j                             |¦  «         ‰ j                             |¦  «         d}
Œ¯|�r<t#          t%          ‰ j        ¦  «        ¦  «        D �]}|‰ j        v rŒ‰ j        |         }t)          |j        ‰*j        ¦  «        t-          |j        ‰*j        ¦  «        k     rÉ	 	 ‰*j        |j        cxk    r‰*j        k     sKn ‰*j        |j        cxk     r‰*j        k    s-n |j        ‰*j        cxk    r‰*j        cxk     r|j        k    rcn Œ¹ ‰1‰ ||¦  «        }|r|t4          |z  z  }|du r$ ‰2‰ |ddd¬¦  «        }t7          |¦  «        s||z  }‰ j                             |¦  «         d}
�Œ‰ j                             ‰*¦  «         t%          ‰ j        ¦  «        dk    r+‰*j        ‰ j        d         j        z
  ‰*j        dz  k    r|d
z  }d                     d„ |D ¦   «         ¦  «                             ¦   «         }t?          d„ |D ¦   «         ¦  «        }t?          d„ |D ¦   «         ¦  «        }t?          d„ |D ¦   «         ¦  «        }t?          d„ |D ¦   «         ¦  «        } ‰.|‰ j         ¬¦  «        }|r}|rd|z   dz   }|rd|z   dz   }|rd|z   dz   }|rd|z   dz   }||
k    r|||z   d
z   z  }n?| !                    d
¦  «        r|dd…         }| !                    d
¦  «        °|d|z   d
z   z  }|}
�Œ³|}
|rK‰,sI|	s|d z  }d}	tE          ‰*j        |j        z
  |d         d!         d"z  z  ¦  «        }d|z  }|||z   d
z   z  }�Œ|	r	|s|d z  }d}	|d         }|d#         }||k    r|d
z  }|}|r‰*j        |j        z
  ‰*j        dz  k    s;|d$          #                    d%¦  «        s tI          |d$         ¦  «        s|d&         dz  r|d
z  }‰*}|	r|d z  }d}	tK          |¦  «        D �]9\  }}|d&         tL          j'        z  }|d&         tL          j(        z  otS          |¦  «         }|d&         tL          j*        z  p|d'         tL          j+        j,        z  } |d&         tL          j-        z  }!|d'         tL          j+        j.        z  }"|d'         tL          j+        j/        z  }#|d'         tL          j+        j0        z  }$g }%g }&|r*|%                     d(¦  «         |&                     d)¦  «         | r*|%                     d¦  «         |&                     d¦  «         |!r*|%                     d¦  «         |&                     d¦  «         |"r*|%                     d¦  «         |&                     d¦  «         |#r*|%                     d*¦  «         |&                     d+¦  «         |$r*|%                     d,¦  «         |&                     d-¦  «         |r*|%                     d¦  «         |&                     d¦  «         d                     |%¦  «        }%d                     tc          |&¦  «        ¦  «        }& ‰0‰ j2        |¦  «        }'|'r|› |%› |'› |&› d�}n#|› |%› |d$                              ¦   «         › |&› d�}tI          |¦  «        r¢d.|dd…         z   }| 3                    d/d¦  «        }|d0         d         |j        z
  }(|d0         d1         |d0         d         z
  t%          |d$         ¦  «        z  })|)d2k    r|d!         d"z  })dtE          ti          |(|)z  ¦  «        ¦  «        z  |z   }||z  }�Œ;|	s|d
z  }�Œå|d
z  }|	r|d z  }d}	|d3z  }| 3                    d4d
¦  «         3                    d/d¦  «         3                    d5d3¦  «        S )6a*  Output the text found inside the given clip.

        This is an alternative for plain text in that it outputs
        text enriched with markdown styling.
        The logic is capable of recognizing headers, body text, code blocks,
        inline code, bold, italic and bold-italic styling.
        There is also some effort for list supported (ordered / unordered) in
        that typical characters are replaced by respective markdown characters.

        'tables'/'images' indicate whether this execution should output these
        objects.
        Nrn   rÎ   )r  Ú	toleranceÚignore_invisiblec                 óf   •— g | ]-} ‰|d          ‰j                              ¦   «         ¦  «        ¯+|‘Œ.S rô   )Ú	tab_rectsÚvalues)r*   r,   Úoutside_all_bboxesrÇ   s     €€r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>L  sN   ø€ ð 
ð 
ð 
ØÐ!3Ð!3°A°a´D¸%¼/×:PÒ:PÑ:RÔ:RÑ!SÔ!Sð
Øð
ð 
ð 
r0   c                 ó   — g | ]
}|d          ‘ŒS rô   r3   rõ   s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>P  s   € Ð 6Ð 6Ð 6¨!  1¤Ð 6Ð 6Ð 6r0   r<   Fc                 ó"  •— g | ]‹\  }}|j         ‰j        k    rv|‰j        vrm	 	 ‰j        |j        cxk    r‰j        k     sKn ‰j        |j        cxk     r‰j        k    s-n |j        ‰j        cxk    r‰j        cxk     r|j        k    ¯„n n||f‘ŒŒS rô   )r¨   r�   Úwritten_tablesrŒ   r©   )r*   r8   Útab_rectÚlrectrÇ   s      €€r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>`  s×   ø€ ð "ð "ð "á#˜˜8Ø”{ e¤hÒ.Ð.Ø Ô!5Ð5Ð5àð 6ð !œ8 x¤{Ð=Ð=Ò=Ð=°U´XÒ=Ð=Ð=Ð=Ø œ8 h¤kÐ=Ð=Ò=Ð=°U´XÒ=Ð=Ð=Ð=Ø#œ;¨%¬(ÐLÐLÒLÐL°U´XÐLÐLÒLÐLÀÄÒLÐLÐLÐLÐLð ˜�Mð MÐLÐLr0   ú
rÂ   c                 ó:   — g | ]}|®t          j        |¦  «        ‘ŒS rs   ©rH   r  ©r*   r  s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>t  s/   € ð !"ð !"ð !"à()à'( }õ %,¤L°¡O¤Oð (5 } }r0   c                 ó   — | j         | j        fS rs   ©r¨   rŒ   ©r  s    r.   r9   z1to_markdown.<locals>.write_text.<locals>.<lambda>{  s   € ¨1¬4°´¨,€ r0   r:   r   T©ÚtablesÚimagesrÙ   r   éþÿÿÿg      ø?rC   c                 ó   — g | ]
}|d          ‘ŒS )r)   r3   ©r*   r-   s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>ª  s   € Ð6Ð6Ð6¨1˜Q˜vœYÐ6Ð6Ð6r0   c                 ó$   — g | ]}|d          dz  ‘ŒS )Ú
char_flagsr   r3   r9  s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>­  s!   € Ð DÐ DÐ D¸  <¤°1Ñ!4Ð DÐ DÐ Dr0   c                 ó8   — g | ]}|d          t           j        z  ‘ŒS r#   )rH   ÚTEXT_FONT_ITALICr9  s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>¯  s$   € ÐSÐSÐSÈ˜a œj­7Ô+CÑCÐSÐSÐSr0   c                 ól   — g | ]1}|d          t           j        z  p|d         t           j        j        z  ‘Œ2S )r$   r;  )rH   ÚTEXT_FONT_BOLDr   ÚFZ_STEXT_BOLDr9  s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>²  sM   € ð ð ð ð ð �w”Z¥'Ô"8Ñ8ð GØ˜,œ­'¬-Ô*EÑEðð ð r0   c                 ó8   — g | ]}|d          t           j        z  ‘ŒS r#   )rH   ÚTEXT_FONT_MONOSPACEDr9  s     r.   r/   z3to_markdown.<locals>.write_text.<locals>.<listcomp>¹  s$   € ÐUÐUÐUÈ!˜A˜gœJ­Ô)EÑEÐUÐUÐUr0   r÷   ú`Ú_z**z~~z```
r1   ç      à?Úblockr)   rÿ   r$   r;  z<sup>z</sup>z<u>z</u>z<mark>z</mark>z- z  rû   rí   g        z

z 
z


)5r  r   ÚtextpageÚaccept_invisibleÚ
line_rectsÚextendÚ	img_rectsr%  r[   rÉ   rZ   r“   rÅ   ÚheaderÚcellsr*  r’   rF   rV   Úwritten_imagesr\   r�   r_   r¨   rŒ   r©   ÚGRAPHICS_TEXTr   r§   r  rW   Úallre   ÚendswithrE   r„   r   r^   rH   ÚTEXT_FONT_SUPERSCRIPTrB  r   r?  r   r@  r=  ÚFZ_STEXT_STRIKEOUTÚFZ_STEXT_UNDERLINEÚFZ_STEXT_HIGHLIGHTÚreversedr  r  rU   )3rÇ   r  r5  r6  rÙ   Ú
out_stringÚnlinesÚ
prev_lrectÚprev_bnoÚcodeÚprev_hdr_stringr(   Útab_candidatesr8   rD  rM  r�   ÚpathnameÚimg_txtr)   Úall_strikeoutÚ
all_italicÚall_boldÚall_monoÚ
hdr_stringr–   ÚindentÚspan0Úbnor-   ÚsuperscriptÚmonoÚboldÚitalicÚ	strikeoutÚ	underlineÚ	highlightÚprefixÚsuffixÚltextÚdistÚcwidthr,  ÚEXTRACT_WORDSÚIGNORE_CODEÚTABLE_OUTPUTrù   r'  r  r   Ú
write_texts3   `                                         @€€€€€€€€r.   rw  zto_markdown.<locals>.write_text-  s³
  øøø€ ð( ˆ<Ø”:ˆDØˆ
õ ØŒNØØØ!&Ô!7Ð7ð	
ñ 
ô 
ˆð
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
ˆð 	Ô×ÒÐ 6Ð 6¨vÐ 6Ñ 6Ô 6Ñ7Ô7Ð7àˆ
ØˆØˆØˆà"ð g	#ñ g	#‰LˆE�5à%Ð% e¨U¬_Ñ=Ô=ð Øð
 ð  +ð"ð "ð "ð "ð "à',¤×'<Ò'<Ñ'>Ô'>ð"ñ "ô "�ð +ð +ð +‘D�A�qØ $­°u¸aÀÑ)NÔ)NÑ"NÐQUÑ"UÑU�Jð %ð 7¨¸Ò)?Ð)?å &Ýð!"ð !"à-2¬Z¸¬]Ô-AÔ-GØ&+¤j°¤mÔ&9ñ.:ð!"ñ !"ô !"ñô ð !7Ð 6ð
!ñ 
!ô 
!˜ð Ô(×/Ò/°Ñ6Ô6Ð6ØÔ(×/Ò/°Ñ2Ô2Ð2Ø&*�O�Oð
 ñ /Ý�s 5¤?Ñ3Ô3Ñ4Ô4ð /ñ /�AØ˜EÔ0Ð0Ð0Ø Øœ¨Ô*�AÝ˜1œ4 ¤Ñ*Ô*­S°´°u´xÑ-@Ô-@Ò@Ð@Øð Aà œ8 q¤tÐ6Ð6Ò6Ð6¨e¬hÒ6Ð6Ð6Ð6Ø œ8 a¤dÐ6Ð6Ò6Ð6¨e¬hÒ6Ð6Ð6Ð6Øœ4 5¤8Ð>Ð>Ò>Ð>¨e¬hÐ>Ð>Ò>Ð>¸!¼$Ò>Ð>Ð>Ð>Ð>à#- :¨e°Q¸Ñ#:Ô#:˜Ø#ð CØ&­-¸(Ñ*BÑB˜Jð &¨Ð-Ð-Ø&0 jØ %Ø !Ø',Ø',Ø+/ð'ñ 'ô '˜Gõ $,¨GÑ#4Ô#4ð 6Ø *¨gÑ 5 
ØÔ,×3Ò3°AÑ6Ô6Ð6Ø*.˜ùàÔ×#Ò# EÑ*Ô*Ð*õ �EÔ$Ñ%Ô%¨Ò)Ð)Ø”H˜uÔ/°Ô3Ô6Ñ6¸¼ÈÑ9KÒKÐKà˜dÑ"�
à—8’8Ð6Ð6°Ð6Ñ6Ô6Ñ7Ô7×=Ò=Ñ?Ô?ˆDõ  Ð DÐ D¸eÐ DÑ DÔ DÑEÔEˆMåÐSÐSÈUÐSÑSÔSÑTÔTˆJåðð ð #ðñ ô ñô ˆHõ ÐUÐUÈuÐUÑUÔUÑVÔVˆHð '˜ u°5´:Ð>Ñ>Ô>ˆJàð Øð ,Ø ™:¨Ñ+�DØð ,Ø ™:¨Ñ+�DØð .Ø $™;¨Ñ-�DØ ð .Ø $™;¨Ñ-�DØ Ò0Ð0Ø *¨tÑ"3°dÑ":Ñ:�J�Jð %×-Ò-¨dÑ3Ô3ð 5Ø%/°°°¤_˜
ð %×-Ò-¨dÑ3Ô3ð 5à #¨¡*¨tÑ"3Ñ3�JØ",�Ùà(ˆOð ð 
 ð 
Øð  Ø 'Ñ)�JØ�Dõ ˜UœX¨¬Ñ/°E¸!´H¸VÔ4DÀsÑ4JÑKÑLÔL�Ø˜u™�à˜f t™m¨dÑ2Ñ2�
Ùàð ˜Hð Ø˜gÑ%�
Ø�à˜!”HˆEØ˜”.ˆCØ�hŠˆØ˜dÑ"�
Ø�ð ð#à”H˜zœ}Ñ,¨u¬|¸cÑ/AÒAÐAØ˜”=×+Ò+¨CÑ0Ô0ð Bå$ U¨6¤]Ñ3Ô3ð Bð ˜”> AÑ%ð Bð
 ˜dÑ"�
ØˆJð ð Ø˜gÑ%�
Ø�å! %Ñ(Ô(ð B#ñ B#‘��1à œj­7Ô+HÑH�à�g”J¥Ô!=Ñ=ð +Ý'¨™NœNÐ*ð ð
 �g”J¥Ô!7Ñ7ð EØ˜”­¬Ô)DÑDð ð ˜7œ¥gÔ&>Ñ>�Ø˜lœO­g¬mÔ.NÑN�	Ø˜lœO­g¬mÔ.NÑN�	Ø˜lœO­g¬mÔ.NÑN�	ð �Ø�àð ,Ø—M’M 'Ñ*Ô*Ð*Ø—M’M (Ñ+Ô+Ð+àð (Ø—M’M $Ñ'Ô'Ð'Ø—M’M $Ñ'Ô'Ð'àð 'Ø—M’M #Ñ&Ô&Ð&Ø—M’M #Ñ&Ô&Ð&àð (Ø—M’M $Ñ'Ô'Ð'Ø—M’M $Ñ'Ô'Ð'àð *Ø—M’M %Ñ(Ô(Ð(Ø—M’M &Ñ)Ô)Ð)àð -Ø—M’M (Ñ+Ô+Ð+Ø—M’M )Ñ,Ô,Ð,àð 'Ø—M’M #Ñ&Ô&Ð&Ø—M’M #Ñ&Ô&Ð&àŸš ™œ�ØŸš¥¨&Ñ!1Ô!1Ñ2Ô2�ð &˜ e¤k°1Ñ5Ô5�Øð OØ(ÐB¨&ÐB°%ÐB¸ÐBÐBÐB�D�Dà(ÐN¨&ÐN°!°F´)·/²/Ñ2CÔ2CÐNÀVÐNÐNÐN�DÝ$ TÑ*Ô*ð BØ $ q r r¤(™?�DØŸ<š<¨¨cÑ2Ô2�DØ  œ=¨Ô+¨d¬gÑ5�DØ# Fœm¨AÔ.°°v´¸qÔ1AÑAÅSÈÈvÌÑEWÔEWÑW�FØ ’}�}Ø!& v¤°Ñ!4˜Ø¥¥U¨4°&©=Ñ%9Ô%9Ñ!:Ô!:Ñ:¸TÑA�Dà˜dÑ"�
‘
Øð #Ø˜dÑ"�
ùØ�dÑˆ
Øð 	Ø˜'Ñ!ˆJØˆDØ�fÑˆ
à×Ò˜u dÑ+Ô+×3Ò3°D¸#Ñ>Ô>×FÒFÀxÐQWÑXÔXð	
r0   c                 ó:   ‡ — t          ˆ fd„|D ¦   «         ¦  «        S )z1Check if rect is contained in a rect of the list.c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S rs   )r   ©r*   r�   rž   s     €r.   r¥   z8to_markdown.<locals>.bbox_in_any_bbox.<locals>.<genexpr>J  ó-   øè è € Ð<Ð<¨Q•<  aÑ(Ô(Ð<Ð<Ð<Ð<Ð<Ð<r0   ©Úany©rž   Ú	rect_lists   ` r.   Úbbox_in_any_bboxz%to_markdown.<locals>.bbox_in_any_bboxH  ó&   ø€ åÐ<Ð<Ð<Ð<°)Ð<Ñ<Ô<Ñ<Ô<Ð<r0   c                 ó:   ‡ — t          ˆ fd„|D ¦   «         ¦  «        S )z/Check if rect is outside all rects in the list.c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S rs   )r   rz  s     €r.   r¥   z:to_markdown.<locals>.outside_all_bboxes.<locals>.<genexpr>N  r{  r0   )rP  r~  s   ` r.   r'  z'to_markdown.<locals>.outside_all_bboxesL  r�  r0   c                 óŽ   ‡— | d         dz
  | d         dz
  | d         dz   | d         dz   gŠt          ˆfd„|D ¦   «         ¦  «        S )z;Check if middle of rect is contained in a rect of the list.r   r   rí   rÎ   c              3   ó<   •K  — | ]}t          ‰|d ¬¦  «        V — ŒdS )rE  )ÚportionN)r   )r*   r�   Úenlargeds     €r.   r¥   z:to_markdown.<locals>.almost_in_any_bbox.<locals>.<genexpr>T  s2   øè è € ÐOÐOÀ•> (¨A°sÐ;Ñ;Ô;ÐOÐOÐOÐOÐOÐOr0   r|  )rž   r  r‡  s     @r.   Úalmost_in_any_bboxz'to_markdown.<locals>.almost_in_any_bboxP  sV   ø€ ð ˜”G˜a‘K  a¤¨1¡¨d°1¬g¸©k¸4À¼7ÀQ¹;ÐGˆÝÐOÐOÐOÐOÀYÐOÑOÔOÑOÔOÐOr0   c           	      ó€  •‡— d}‰�êt          ˆfd„| j                             ¦   «         D ¦   «         d„ ¬¦  «        D ]³\  }}|| j        v rŒ|t	          | |‰¦  «        dz   z  }‰rq‰dk    rkt          t          d„ | j        |         j        j        | j        |         j        z   D ¦   «         ¦  «        d	„ ¬¦  «        }| j	         
                    |¦  «         | j                             |¦  «         Œ´nÍ| j                             ¦   «         D ]³\  }}|| j        v rŒ|t	          | |‰¦  «        dz   z  }‰rq‰dk    rkt          t          d
„ | j        |         j        j        | j        |         j        z   D ¦   «         ¦  «        d„ ¬¦  «        }| j	         
                    |¦  «         | j                             |¦  «         Œ´|S )z)Output tables above given text rectangle.rn   Nc                 ó@   •— g | ]}|d          j         ‰j        k    ¯|‘ŒS ©r   )r¨   r�   )r*   ÚjÚ	text_rects     €r.   r/   z6to_markdown.<locals>.output_tables.<locals>.<listcomp>[  s+   ø€ ÐOÐOÐO�q°q¸´t´wÀ)Ä,Ò7NÐ7N�Ð7NÐ7NÐ7Nr0   c                 ó6   — | d         j         | d         j        fS )Nr   r2  )rŒ  s    r.   r9   z4to_markdown.<locals>.output_tables.<locals>.<lambda>\  s   € ˜q œtœw¨¨!¬¬Ð0€ r0   r:   r-  rÂ   c                 ó:   — g | ]}|®t          j        |¦  «        ‘ŒS rs   r/  r0  s     r.   r/   z6to_markdown.<locals>.output_tables.<locals>.<listcomp>e  ó/   € ð ð ð à$%à#$ =õ !(¤¨Q¡¤ð $1 = =r0   c                 ó   — | j         | j        fS rs   r2  r3  s    r.   r9   z4to_markdown.<locals>.output_tables.<locals>.<lambda>l  ó   €  q¤t¨Q¬T l€ r0   c                 ó:   — g | ]}|®t          j        |¦  «        ‘ŒS rs   r/  r0  s     r.   r/   z6to_markdown.<locals>.output_tables.<locals>.<listcomp>z  r�  r0   c                 ó   — | j         | j        fS rs   r2  r3  s    r.   r9   z4to_markdown.<locals>.output_tables.<locals>.<lambda>�  r’  r0   )rZ   r%  r[   r*  rÉ   r“   rÅ   rL  rM  rI  rJ  r’   )rÇ   r�  Úthis_mdr8   ÚtrectrM  rt  rv  s    `    €€r.   Úoutput_tablesz"to_markdown.<locals>.output_tablesV  s1  øø€ àˆØÐ Ý"ØOÐOÐOÐO˜EœO×1Ò1Ñ3Ô3ÐOÑOÔOØ0Ð0ðñ ô ð /ð /‘��5ð ˜Ô,Ð,Ð,ØØ�=¨°°<Ñ@Ô@À4ÑGÑG�Ø ð 3 \°VÒ%;Ð%;å"Ýðð à).¬°A¬Ô)=Ô)CØ"'¤*¨Q¤-Ô"5ñ*6ðñ ô ñô ð 3Ð2ð
ñ 
ô 
�Eð Ô$×+Ò+¨EÑ2Ô2Ð2ØÔ$×+Ò+¨AÑ.Ô.Ð.Ð.ð+/ð0 "œO×1Ò1Ñ3Ô3ð /ð /‘��5Ø˜Ô,Ð,Ð,ØØ�=¨°°<Ñ@Ô@À4ÑGÑG�Ø ð 3 \°VÒ%;Ð%;å"Ýðð à).¬°A¬Ô)=Ô)CØ"'¤*¨Q¤-Ô"5ñ*6ðñ ô ñô ð 3Ð2ð
ñ 
ô 
�Eð Ô$×+Ò+¨EÑ2Ô2Ð2ØÔ$×+Ò+¨AÑ.Ô.Ð.Ð.Øˆr0   c                 óˆ  •— | j         sdS d}|�³t          | j         ¦  «        D ]�\  }}|j        |j        k    rŒ|j        |j        k    s|j        |j        k    rŒ7|| j        v rŒA ‰| ||¦  «        }| j                             |¦  «         |r|t          |z  z  }|r$ ‰	| |ddd¬¦  «        }t          |¦  «        s||z  }Œžn€t          | j         ¦  «        D ]k\  }}|| j        v rŒ ‰| ||¦  «        }| j                             |¦  «         |r|t          |z  z  }|r$ ‰	| |ddd¬¦  «        }t          |¦  «        s||z  }Œl|S )z0Output images and graphics above text rectangle.rn   NFTr4  )	rK  r^   r�   rŒ   r©   rN  r’   rO  r   )
rÇ   r�  rÙ   r•  r8   Úimg_rectr^  r_  r   rw  s
           €€r.   Úoutput_imagesz"to_markdown.<locals>.output_images‡  sÍ  ø€ àŒð 	Ø�2ØˆØÐ Ý(¨¬Ñ9Ô9ð +ð +‘��8Ø”; ¤Ò-Ð-ØØ”; )¤,Ò.Ð.°(´+ÀÄÒ2MÐ2MØØ˜Ô,Ð,Ð,ØØ%˜: e¨X°qÑ9Ô9�ØÔ$×+Ò+¨AÑ.Ô.Ð.Øð 8Ø�}¨xÑ7Ñ7�GØð 	+Ø(˜jØØ Ø$Ø$Ø#'ðñ ô �Gõ $ GÑ,Ô,ð +Ø 7Ñ*˜øð)+õ,  )¨¬Ñ9Ô9ð +ð +‘��8Ø˜Ô,Ð,Ð,ØØ%˜: e¨X°qÑ9Ô9�ØÔ$×+Ò+¨AÑ.Ô.Ð.Øð 8Ø�}¨xÑ7Ñ7�GØð 	+Ø(˜jØØ Ø$Ø$Ø#'ðñ ô �Gõ $ GÑ,Ô,ð +Ø 7Ñ*˜øàˆr0   c                 ó€   — 	 t          d„ |                      ¦   «         D ¦   «         ¦  «        }|dhk    rdS n#  Y nxY wdS )z~Check if page exclusivley contains OCR text.

        For this to be true, all text must be written as "ignore-text".
        c                 ó2   — g | ]}d |d         v ¯|d         ‘ŒS )r)   r   r3   ©r*   r+   s     r.   r/   z4to_markdown.<locals>.page_is_ocr.<locals>.<listcomp>½  s%   € ÐQÐQÐQ qÀ&ÈAÈaÌDÀ.À.˜a œdÀ.À.À.r0   zignore-textTF)r“   Úget_bboxlog)re   Ú
text_typess     r.   Úpage_is_ocrz to_markdown.<locals>.page_is_ocr·  sY   € ð
	ÝÐQÐQ¨D×,<Ò,<Ñ,>Ô,>ÐQÑQÔQÑRÔRˆJØ˜m˜_Ò,Ð,Ø�tð -øð	ØˆDøøøØˆus   ‚27 ·;c                 óâ  — |                       | j        j        | j        j        | j        j        dz   | j        j        dz   f¬¦  «        }|j        r|j        sdS |                     dd¦  «        }|                       | j        j        dz
  | j        j        | j        j        | j        j        dz   f¬¦  «        }|j        r|j        sdS |                     dd¦  «        }||k    sdS |                       | j        j        | j        j        dz
  | j        j        dz   | j        j        f¬¦  «        }|j        r|j        sdS |                     dd¦  «        }||k    sdS |                       | j        j        dz
  | j        j        dz
  | j        j        | j        j        f¬¦  «        }|j        r|j        sdS |                     dd¦  «        }||k    sdS |d         dz  |d         dz  |d         dz  fS )a,  Determine the background color of the page.

        The function returns a PDF RGB color triple or None.
        We check the color of 10 x 10 pixel areas in the four corners of the
        page. If they are unicolor and of the same color, we assume this to
        be the background color.
        é
   )r  Nr   éÿ   r   rí   )	r  rž   rŒ   r�   ÚsamplesÚis_unicolorÚpixelr©   r¨   )re   r  Úpixel_ulÚpixel_urÚpixel_llÚpixel_lrs         r.   Úget_bg_colorz!to_markdown.<locals>.get_bg_colorÄ  s  € ð �oŠoØ”)”, ¤	¤¨d¬i¬l¸RÑ.?ÀÄÄÐPRÑARÐSð ñ 
ô 
ˆð Œ{ð 	 #¤/ð 	Ø�4Ø—9’9˜Q ‘?”?ˆØ�oŠoØ”)”, Ñ# T¤Y¤\°4´9´<ÀÄÄÐPRÑARÐSð ñ 
ô 
ˆð Œ{ð 	 #¤/ð 	Ø�4Ø—9’9˜Q ‘?”?ˆØ˜8Ò#Ð#Ø�4Ø�oŠoØ”)”, ¤	¤¨rÑ 1°4´9´<À"Ñ3DÀdÄiÄlÐSð ñ 
ô 
ˆð Œ{ð 	 #¤/ð 	Ø�4Ø—9’9˜Q ‘?”?ˆØ˜8Ò#Ð#Ø�4Ø�oŠoØ”)”, Ñ# T¤Y¤\°BÑ%6¸¼	¼ÀdÄiÄlÐSð ñ 
ô 
ˆð Œ{ð 	 #¤/ð 	Ø�4Ø—9’9˜Q ‘?”?ˆØ˜8Ò#Ð#Ø�4Ø˜”˜cÑ! 8¨A¤;°Ñ#4°h¸q´kÀCÑ6GÐHÐHr0   c                 óh   •— | j                              ¦   «         }‰|d<   | j        |d<   |dz   |d<   |S )NÚ	file_pathrQ   r   re   )ÚmetadataÚcopyrQ   )r   rd   ÚmetaÚFILENAMEs      €r.   Úget_metadataz!to_markdown.<locals>.get_metadataì  s>   ø€ ØŒ|× Ò Ñ"Ô"ˆØ$ˆˆ[ÑØ œ^ˆˆ\ÑØ˜Q‘wˆˆV‰Øˆr0   Úwordsrk   c                 ó:  — | sg S g }| d         g}t          j        | d         dd…         ¦  «        }| dd…         D ]²}t          |d         |j        z
  ¦  «        dk    s!t          |d         |j        z
  ¦  «        dk    r#|                     |¦  «         ||dd…         z  }Œg|                     d„ ¬¦  «         |                     |¦  «         |g}t          j        |dd…         ¦  «        }Œ³|                     d„ ¬¦  «         |                     |¦  «         |S )	a  Reorder words in lines.

        The argument list must be presorted by bottom, then left coordinates.

        Words with similar top / bottom coordinates are assumed to belong to
        the same line and will be sorted left to right within that line.
        r   Nrì   r   rÎ   c                 ó   — | d         S ©Nr   r3   ©Úws    r.   r9   z1to_markdown.<locals>.sort_words.<locals>.<lambda>  s
   € ¨¨!¬€ r0   r:   c                 ó   — | d         S r¶  r3   r·  s    r.   r9   z1to_markdown.<locals>.sort_words.<locals>.<lambda>	  s
   €   !¤€ r0   )rH   r  Úabsr�   r¨   r’   ÚsortrJ  )r³  ÚnwordsÚliner,  r¸  s        r.   Ú
sort_wordszto_markdown.<locals>.sort_wordsó  s#  € ð ð 	ØˆIØˆØ�a”ˆzˆÝ”˜U 1œX b q bœ\Ñ*Ô*ˆØ�q�r�r”ð 	,ð 	,ˆAÝ�1�Q”4˜%œ(‘?Ñ#Ô# qÒ(Ð(­C°°!´°u´x±Ñ,@Ô,@ÀAÒ,EÐ,EØ—’˜A‘”�Ø˜˜2˜A˜2œ‘��à—	’	˜n˜n�	Ñ-Ô-Ð-Ø—’˜dÑ#Ô#Ð#Ø�s�Ýœ Q r¨ r¤UÑ+Ô+��Ø�	Š	�n�nˆ	Ñ%Ô%Ð%Ø�Š�dÑÔÐØˆr0   c           
      ó4  •‡+‡,‡-— | |         }|                      ¦   «          t          ¦   «         Š,|‰,_        |‰,_        d‰,_        g ‰,_        g ‰,_        g ‰,_        g ‰,_        g ‰,_	         ‰:|¦  «        p‰5‰,_
        ‰.sdn
 ‰4|¦  «        ‰,_        |\  }}	}
}|j        ||	|
 | fz   ‰,_        d„ |                     ¦   «         D ¦   «         ‰,_        d„ |                     ¦   «         D ¦   «         ‰,_        |                     |‰,j        ¬¦  «        ‰,_        |s|                     ¦   «         }ng }t+          t-          |¦  «        ¦  «        D ]+}t/          j        ||         d         ¦  «        ||         d<   Œ,ˆ6ˆ,fd„|D ¦   «         }|                     d„ d	¬
¦  «         |rtt5          ‰,j        ¦  «        dz  Š+ˆ+ˆ,fd„|D ¦   «         }t-          |¦  «        t-          |¦  «        k     r.|} ‰<‰,‰,j        d¦  «        }|r‰,xj        t6          |z  z  c_        |dd…         }t+          t-          |¦  «        dz
  dd¦  «        D ]B}||         d         }|j        r||= Œt+          |¦  «        D ]}|||         d         v r||=  nŒŒC|‰,_        d„ ‰,j        D ¦   «         ‰,_        t-          d„ |                     ¦   «         D ¦   «         ¦  «        }‰0r|‰0k    rd	}d	}nd}g ‰,_        g ‰,_         g ‰,_!        i }|s‰>s�nˆ‰1dk    rtE          |¦  «        ‰,_!        tG          ‰,j!        ¦  «        D ]T\  }\  }}}}}}t/          j        |¦  «        ||<   ‰,j         $                    tK          ||         ¦  «        ||dœ¦  «         ŒU�n| &                    ‰,j        ‰>¬¦  «        }|j        D ]3}|j'        dk     s|j(        dk     rŒ‰,j          $                    |¦  «         Œ4‰,j                              d„ ¬¦  «         tG          ‰,j         ¦  «        D ]{\  }}t/          j        |j)        ¦  «        t/          j        |j*        j)        ¦  «        z  ||<   ‰,j         $                    tK          ||         ¦  «        |j'        |j(        dœ¦  «         Œ||‰,_+        tY          | -                    ¦   «         ¦  «        ‰,_.        |s"ˆ9ˆ,fd„| /                    ¦   «         D ¦   «         }ng }|rg }g Š-| 0                    |¬¦  «        }|D ]'}tc          ||¦  «        r‰- $                    |¦  «         Œ(ˆ2ˆ-fd„|D ¦   «         ‰,_2        ‰- 3                    ‰,j        ¦  «         ‰,j         3                    ‰-¦  «         ti          tk          ‰,j        ¦  «        d„ ¬¦  «        ‰,_        g ‰,_6        to          ‰-¦  «        ‰,_8        ts          d„ tG          ‰,j8        ¦  «        D ¦   «         ¦  «        ‰,_:        t-          ‰,j         ;                    ¦   «         ¦  «        } | dk    r*t-          ‰,j         <                    ¦   «         ¦  «        | z  }!nd}!|r|!d k     r	‰,j        g}"n@t{          ‰,j        ‰,j2        ‰3 ‰,j        ‰,j.        ‰,j8        z   |d!         |d         |¬"¦  «        }"	 |"D ]U}#‰,xj         ‰8‰,|#¦  «        z  c_        ‰,xj         ‰7‰,|#‰3¦  «        z  c_        ‰,xj         ‰?‰,|#‰3d	d	¬#¦  «        z  c_        ŒV‰,j         >                    d$d%¦  «         >                    d&d¦  «        ‰,_        ‰,xj         ‰8‰,d¦  «        z  c_        ‰,xj         ‰7‰,d‰3¦  «        z  c_        ‰,j         ?                    d'¦  «        r.‰,j        dd…         ‰,_        ‰,j         ?                    d'¦  «        °.‰,j         >                    t�          d¦  «        t‚          ¦  «        ‰,_        ‰/d	u r¹‰,j         B                    ¦   «         }$|$                     d(„ ¬¦  «         g }%‰,j	        D ]\}&g }'|$D ]7}(t/          j        |(dd)…         ¦  «        })|)|&v r|' $                    |(¦  «         Œ8|% 3                     ‰=|'¦  «        ¦  «         Œ]g }*|%D ]}(|(|*vr|* $                    |(¦  «         Œ|*}%ng }%|%‰,_        ‰;r‰,xj        d*‰,j        jC        › d+�z  c_        ‰,S ),a  Process one page.

        Args:
            doc: pymupdf.Document
            pno: 0-based page number
            textflags: text extraction flag bits

        Returns:
            Markdown string of page content and image, table and vector
            graphics information.
        rn   Nc                 ó>   — g | ]}|d          t           j        k    ¯|‘ŒS )Úkind)rH   ÚLINK_URIrõ   s     r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>1  s)   € ÐTÐTÐT˜Q°a¸´iÅ7ÔCSÒ6SÐ6S�qÐ6SÐ6SÐ6Sr0   c                 ó   — g | ]	}|j         ‘Œ
S r3   r�   )r*   Úas     r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>4  s   € Ð;Ð;Ð;¨˜QœVÐ;Ð;Ð;r0   )r$   r  rû   c                 ó  •— g | ]‚}|d          j         ‰‰j        j         z  k    rb|d          j        ‰‰j        j        z  k    rD|d                               ‰j        ¦  «        r$|d          j         dk    r|d          j        dk    ¯€|‘ŒƒS )rû   rÎ   )r£   r  r§   r�   )r*   r8   r×   rÇ   s     €€r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>B  sž   ø€ ð 
ð 
ð 
àØ�ŒyŒÐ"2°U´ZÔ5EÑ"EÒEÐEØ�&”	Ô Ð$4°u´zÔ7HÑ$HÒHÐHØ�&”	×$Ò$ U¤ZÑ0Ô0ð Ià�&”	” !Ò#Ð#Ø�&”	Ô  1Ò$Ð$ð ð %Ð$Ð$r0   c                 ó,   — t          | d         ¦  «        S ©Nrû   ©rº  r7   s    r.   r9   z6to_markdown.<locals>.get_page_output.<locals>.<lambda>M  s   € ¥C¨¨&¬	¡N¤N€ r0   T©r;   r@   gÍÌÌÌÌÌì?c                 óV   •— g | ]%}t          |d          ‰j        z  ¦  «        ‰k     ¯#|‘Œ&S ©rû   )rº  r  )r*   r8   Úimg_max_sizerÇ   s     €€r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>R  s6   ø€ ÐVÐVÐV˜!­3¨q°¬y¸5¼:Ñ/EÑ+FÔ+FÈÒ+UÐ+U�AÐ+UÐ+UÐ+Ur0   Úfullé   r   r   r<   c                 ó   — g | ]
}|d          ‘ŒS rË  r3   )r*   r8   s     r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>g  s   € Ð;Ð;Ð;¨˜1˜Vœ9Ð;Ð;Ð;r0   c                 ó&   — g | ]}d |d         v ¯|‘ŒS )r  r   r3   r�  s     r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>j  s!   € ÐNÐNÐN A¸vÈÈ1Ì¸~¸~˜a¸~¸~¸~r0   FrÂ   )rû   ÚrowsÚcolumns)r  Ústrategyrí   c                 ó6   — | j         d         | j         d         fS )Nr   r   rË  )rƒ   s    r.   r9   z6to_markdown.<locals>.get_page_output.<locals>.<lambda>Ž  s   € ¨1¬6°!¬9°a´f¸Q´iÐ*@€ r0   r:   c                 óx  •— g | ]¶}|d          ‰j         v r¥|d          j        ‰j         j        k     rŠ|d          j        ‰j         j        k     ro|d          j        dk    s|d          j        dk    rM|d         dk    r|d         ‰j        k    °† ‰|d          ‰j        ¦  «        ¯� ‰|d          ‰j        ¦  «        ¯´|‘Œ·S )rž   rÎ   Útyper>   Úfill)r  r£   r§   Úbg_colorÚ
tab_rects0Úannot_rects)r*   rŸ   r'  rÇ   s     €€r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>¤  sß   ø€ ð 
ð 
ð 
àØ�V”9 ¤
Ð*Ð*Ø�f”I”O e¤jÔ&6Ò6Ð6Ø�f”IÔ$ u¤zÔ'8Ò8Ð8Ø�v”Y”_ qÒ(Ð(¨A¨f¬IÔ,<¸qÒ,@Ð,@Ø˜6œ cÒ)Ð)¨a°¬i¸5¼>Ò.IÐ.IØ&Ð& q¨¤y°%Ô2BÑCÔCð /Jà&Ð& q¨¤y°%Ô2CÑDÔDð /Jð ð /JÐ.IÐ.Ir0   )Údrawingsc                 ó8   •— g | ]} ‰|d          ‰¦  «        ¯|‘ŒS r�   r3   )r*   rŸ   r€  Úvg_clusters0s     €€r.   r/   z8to_markdown.<locals>.get_page_output.<locals>.<listcomp>À  s@   ø€ ð 
ð 
ð 
ØÐ 0Ð 0°°6´¸LÑ IÔ Ið
Øð
ð 
ð 
r0   c                 ó   — | j         | j        fS rs   r2  rŽ   s    r.   r9   z6to_markdown.<locals>.get_page_output.<locals>.<lambda>Ç  s   € ÀaÄdÈAÌDÀ\€ r0   c              3   ó$   K  — | ]\  }}||fV — Œd S rs   r3   )r*   r8   r�   s      r.   r¥   z7to_markdown.<locals>.get_page_output.<locals>.<genexpr>Í  s*   è è € Ð RÐ R©D¨A¨q ! Q Ð RÐ RÐ RÐ RÐ RÐ Rr0   é   rÎ   )rª   Úno_image_textrG  ÚavoidÚfooter_marginÚheader_marginrÒ   )rÙ   r6  r5  z ,ú,z-
r-  c                 ó"   — | d         | d         fS )NrÎ   r   r3   r·  s    r.   r9   z6to_markdown.<locals>.get_page_output.<locals>.<lambda>  s   € ¨¨1¬¨q°¬t¨€ r0   rì   z

--- end of page=z ---

)DÚremove_rotationr‰   re   rØ   Ú	md_stringr6  r5  Úgraphicsr³  rI  rH  rØ  rž   r  Ú	get_linksr  ÚannotsrÚ  Úget_textpagerG  Úget_image_inforF   rV   rH   r  r»  rº  rO  Úis_emptyrK  rž  r*  rÅ   rÄ   rÀ   r^   r’   ÚtupleÚfind_tablesÚ	row_countÚ	col_countrû   rL  r%  ry   r&  rÙ  Úget_drawingsÚcluster_drawingsr°   Úactual_pathsrJ  rZ   r“   rN  rš   rÝ  r"   Úvg_clustersÚextractBLOCKSÚextractTEXTr   r  r„   Úchrr
   ÚextractWORDSr‚   )@r   rd   rÜ   Ú	textflagsr±  ÚIGNORE_IMAGESÚIGNORE_GRAPHICSre   ÚleftÚtopÚrightÚbottomÚimg_infor8   ÚsaneÚnamer�   rŒ  Úgraphics_countÚtoo_many_graphicsr%  rž   Ú_htmlrÑ  ÚcolsÚ_cellsÚ_extractrÅ   rƒ   rª   Úclustersrû   Úblock_countÚchar_densityÚ
text_rectsr�  Úrawwordsr³  r,  Úlwordsr¸  Úwrectr¼  rÌ  rÇ   rÝ  ÚDETECT_BG_COLORrt  ÚGRAPHICS_LIMITrv  r€  rÙ   r«  rç   r×   rš  r—  r'  r   rÛ   r   r¾  rà   rw  s@                                              @@@€€€€€€€€€€€€€€€€€€r.   Úget_page_outputz$to_markdown.<locals>.get_page_output  så	  øøøø€ ð �3ŒxˆØ×ÒÑÔÐÝ‘”ˆØˆŒ
Ø!ˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØˆÔàˆK˜ÑÔÐ- ð 	Ôð
 &5ÐL˜˜¸,¸,ÀtÑ:LÔ:LˆŒà#*Ñ ˆˆc�5˜&Ø”Y $¨¨e¨V°f°WÐ!=Ñ=ˆŒ
ð UÐT $§.¢.Ñ"2Ô"2ÐTÑTÔTˆŒð <Ð;¨T¯[ª[©]¬]Ð;Ñ;Ô;ˆÔð ×*Ò*°ÀÄÐ*ÑLÔLˆŒð ð 	Ø×*Ò*Ñ,Ô,ˆHˆHàˆHÝ•s˜8‘}”}Ñ%Ô%ð 	Dð 	DˆAÝ")¤,¨x¸¬{¸6Ô/BÑ"CÔ"CˆH�QŒK˜ÑÐð
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ˆð 	�ŠÐ2Ð2¸DˆÑAÔAÐAð ð 	<Ý˜uœz™?œ?¨SÑ0ˆLØVÐVÐVÐVÐV˜xÐVÑVÔVˆDÝ�4‰yŒy�3˜x™=œ=Ò(Ð(Ø�à!�z %¨¬°VÑ<Ô<�Øð <Ø�O”O¥}°tÑ';Ñ;�O”Oà˜C˜R˜C”=ˆå•s˜8‘}”} qÑ(¨!¨RÑ0Ô0ð 	ð 	ˆAØ˜”˜FÔ#ˆAØŒzð Ø˜Q�KØÝ˜1‘X”Xð ð �Ø˜ œ FÔ+Ð+Ð+Ø  ˜Ø�Eð ,øð  ˆŒà;Ð;¨e¬lÐ;Ñ;Ô;ˆŒõ ÐNÐN¨×)9Ò)9Ñ);Ô);ÐNÑNÔNÑOÔOˆØð 	&˜n¨~Ò=Ð=Ø"ˆOØ $ÐÐà %Ðð  "ˆÔØˆŒ
ØˆÔØˆ	àð #	 .ð #	áØ˜VÒ#Ð#õ !9¸Ñ >Ô >ˆEÔÝBKÈEÔL]ÑB^ÔB^ð ð Ñ>�Ñ>�D˜%  t¨V°XÝ&œ|¨DÑ1Ô1�	˜!‘Ø”×#Ò#Ý" 9¨Q¤<Ñ0Ô0¸$È4ÐPÐPñô ð ð ñð ×#Ò#¨¬¸nÐ#ÑMÔMˆDØ”[ð %ð %�à”; ’?�? a¤k°A¢o oØØ”
×!Ò! !Ñ$Ô$Ð$Ð$ØŒJ�OŠOÐ @Ð @ˆOÑAÔAÐAõ " %¤*Ñ-Ô-ð ð ‘��1Ý&œ|¨A¬FÑ3Ô3µg´lÀ1Ä8Ä=Ñ6QÔ6QÑQ�	˜!‘Ø”×#Ò#å % i°¤lÑ 3Ô 3Ø !¤Ø#$¤;ðð ñô ð ð ð $ˆŒå 	× 0Ò 0Ñ 2Ô 2Ñ3Ô3ˆÔð
 ð 	ð
ð 
ð 
ð 
ð 
à×*Ò*Ñ,Ô,ð
ñ 
ô 
ˆEˆEð ˆEàð 	ØˆEð ˆð ×(Ò(°%Ð(Ñ8Ô8ˆØð 	*ð 	*ˆDÝ˜d EÑ*Ô*ð *Ø×#Ò# DÑ)Ô)Ð)øð
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
ˆÔð
 	×Ò˜EœOÑ,Ô,Ð,ØŒ×Ò˜|Ñ,Ô,Ð,Ý ¥ U¤_Ñ!5Ô!5Ð;QÐ;QÐRÑRÔRˆŒØ!ˆÔõ *¨,Ñ7Ô7ˆÔå Ð RÐ RµI¸eÔ>PÑ4QÔ4QÐ RÑ RÔ RÑRÔRˆÔÝ˜%œ.×6Ò6Ñ8Ô8Ñ9Ô9ˆØ˜Š?ˆ?Ý˜uœ~×9Ò9Ñ;Ô;Ñ<Ô<¸{ÑJˆLˆLàˆLàð 	 °Ò!2Ð!2ð  œ*˜ˆJˆJå%Ø”
ØÔ(Ø",˜nØœØÔ&¨Ô);Ñ;Ø% aœjØ% aœjØ+ð	ñ 	ô 	ˆJð	ð $ð 	ð 	ˆIàˆOŒO˜}˜}¨U°IÑ>Ô>Ñ>ˆOŒOØˆOŒO˜}˜}¨U°I¸zÑJÔJÑJˆOŒOð ˆOŒO˜z˜zØØØ%ØØð ñ  ô  ñ ˆOŒOˆOð  œ/×1Ò1°$¸Ñ<Ô<×DÒDÀUÈBÑOÔOˆŒð 	ˆŒ˜=˜=¨°Ñ5Ô5Ñ5ˆŒØˆŒ˜=˜=¨°°jÑAÔAÑAˆŒàŒo×(Ò(¨Ñ.Ô.ð 	2Ø#œo¨a¨b¨bÔ1ˆEŒOð Œo×(Ò(¨Ñ.Ô.ð 	2àœ/×1Ò1µ#°a±&´&Õ:OÑPÔPˆŒà˜DÐ Ð à”~×2Ò2Ñ4Ô4ˆHØ�MŠMÐ4Ð4ˆMÑ5Ô5Ð5àˆEØÔ)ð 1ð 1�Ø�Ø!ð )ð )�AÝ#œL¨¨2¨A¨2¬Ñ/Ô/�EØ �~�~ØŸš aÑ(Ô(Ð(øØ—’˜Z˜Z¨Ñ/Ô/Ñ0Ô0Ð0Ð0ð ˆFØð %ð %�Ø˜F�?�?Ø—M’M !Ñ$Ô$Ð$øØˆEˆEð ˆEØˆŒØð 	RàˆOŒOÐQ°e´jÔ6GÐQÐQÐQÑQˆOŒOØˆr0   zProcessing z...c                 ó2   •— g | ]}|d          ‰dz   k    ¯|‘ŒS )r<   r   r3   )r*   rƒ   rd   s     €r.   r/   zto_markdown.<locals>.<listcomp>M  s+   ø€ Ð<Ð<Ð<˜q¨1¨R¬5°C¸!±GÒ+;Ð+;˜Ð+;Ð+;Ð+;r0   )r®  Ú	toc_itemsr5  r6  ré  r)   r³  rs   ),r]   Úprintr“   rG   r  r  ÚexistsÚmakedirsrD   rH   rI   rJ   r  Úis_form_pdfrK   Ú
has_annotsÚbakeÚis_reflowablerï   ÚlayoutrQ   ry   rF   rV   rP  Úcallablerr   r   r  r~   ÚTEXT_MEDIABOX_CLIPÚTEXT_COLLECT_STYLESrT   ÚtableÚFLAGSr   Ú$FZ_STEXT_USE_GID_FOR_UNKNOWN_UNICODEr   rè  r’   r5  r6  ré  r³  )Ar   r   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rÈ   rá   râ   rã   rä   rå   ræ   rç   r¶   ÚFONTSIZE_LIMITrü  rý  rQ   r§   rˆ  r²  r  Údocument_outputÚtocrû  rÇ   Ú	page_tocsr®  r  r  rt  r±  r  ru  r  r  rv  r€  r«  rr   rù   rš  r—  r'  r   rd   r  r   r¾  rw  sA      ``     ` ` `    `       `               @@@@@@@@@@@@@@@@@@@@@@r.   rÆ   rÆ   g  s  øøøøøøøøøøøøøøøøøøøøøøøøøøøøø€ ðx ‡{‚{�}„}ð TÝÐR½SÀÇÂÁÄÑ=OÔ=OÐRÐRÐRÑSÔSÐSà�uÐÐ °Ð!6Ð!6¸:ÈÐ;NÐ;NÝÐOÑPÔPÐPØ�tÐÐØˆØˆ
ØÐ Ð$Ð$Ò$Ð$ 1Ò$Ð$Ð$Ð$ÝÐSÑTÔTÐTØ
€CØ€KØ €MØ!€MØ˜ÐÐØˆØˆØÐ/Ð/Ð/ÝÐGÑHÔHÐHØ€LØ€HØð -�L DÐ(Ð(µ´·²ÀÑ1IÔ1IÐ(Ý
Œ�H tÐ,Ñ,Ô,Ð,å�c�7Ô+Ñ,Ô,ð  ÝŒl˜3ÑÔˆà#Ð+ˆsŒxˆx°€HØ#€NØ#€NØ!€MØ%€OØ%€OØ
„ð ˜3œ:ð ¨#¯.ª.Ñ*:Ô*:ð Ø�Š‰
Œ
ˆ
ð Ôð 	8Ý�; Ñ,Ô,ð 	8à�JŠJ˜Z°ˆJÑ<Ô<Ð<Ð<ð �JŠJ˜Z°ˆJÑ4Ô4Ð4ØœˆJØ˜:Ñ%ˆFØ�JŠJ˜Z°ˆJÑ7Ô7Ð7à€}Ý•U˜3œ>Ñ*Ô*Ñ+Ô+ˆåˆw˜Ñ$Ô$ð  Ø�)˜a‘-ˆÝ
ˆ7�|„|�qÒÐØ�g˜a”j ! W¨Q¤ZÐ0ˆÝ
ˆ7�|„|�qÒÐÝÐBÑCÔCÐCÝÐ:Ð:°'Ð:Ñ:Ô:Ñ:Ô:ð 9ÝÐ7Ñ8Ô8Ð8õ �ÑÔð /Ø ˆˆÝ	�˜?Ñ	+Ô	+ð /µ¸Ô9OÑ0PÔ0Pð /Ø Ô.ˆˆØ	�UÐ	Ð	Ø/Ð/Ð/ˆˆå" 3Ñ'Ô'ˆØ Ô.ˆð,ð ,ð ,ð ,ð ,ðð ð ð4ð ð ð ð ð ð ð ð ð ðF ØØðY
ð Y
åŒlðY
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ð Y
ðv=ð =ð =ð=ð =ð =ðPð Pð Pð/ð /ð /ð /ð /ð /ðb.ð .ð .ð .ð .ð .ð`ð ð ð&Ið &Ið &IðPð ð ð ð ð�$ð ¥4ð ð ð ð ð4Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rðh �eÐÐØˆˆàˆð �+Š+‰-Œ-€Cð
 	
Ý
Ô
$ñ	%õ Ô
%ñ	&ð ð 	
Ý
Ô
 ñ	!å
Ô
%ñ	&õ Ô
$ñ		%õ „MÔð ð @Ø•UÔ?Ñ?ˆ	àð #ÝÐ)˜HÐ)Ð)Ð)Ñ*Ô*Ð*Ý˜EÑ"Ô"ˆØð ð ˆØ�ØØØØØØØñ
ô 
ˆð ˜%ÐÐØ˜uœÑ.ˆOˆOð =Ð<Ð<Ð< CÐ<Ñ<Ô<ˆIà#�| C¨Ñ-Ô-ˆHØ×"Ò"à (Ø!*Ø#œlØ#œlØ %¤Ø!œOØ"œ[ðð ñ
ô 
ð 
ð ˆEàÐr0   c                 óÈ  — |                       ¦   «         }t          t          |¦  «        ¦  «        D ]4}||         }t          j        |d         ¦  «        |j        z  |d<   |||<   Œ5|                     d„ d¬¦  «         t          t          |¦  «        dz
  dd¦  «        D ]B}||         d         }|j        r||= Œt          |¦  «        D ]}|||         d         v r||=  nŒŒC|S )Nrû   c                 ó,   — t          | d         ¦  «        S rÇ  rÈ  r7   s    r.   r9   z/extract_images_on_page_simple.<locals>.<lambda>j  ó   € ¥ A f¤I¡¤€ r0   TrÉ  r   r   r<   )rí  rF   rV   rH   r  r  r»  rî  )re   rÇ   r×   r  r8   Úitemr�   rŒ  s           r.   Úextract_images_on_page_simpler-  `  s
  € ð ×"Ò"Ñ$Ô$€HÝ•3�x‘=”=Ñ!Ô!ð ð ˆØ˜Œ{ˆÝ”| D¨¤LÑ1Ô1°E´JÑ>ˆˆV‰Øˆ�‰ˆð ‡M‚MÐ.Ð.¸€MÑ=Ô=Ð=å•3�x‘=”= 1Ñ$ a¨Ñ,Ô,ð ð ˆØ�QŒK˜ÔˆØŒ:ð 	Ø˜�ØÝ�q‘”ð 	ð 	ˆAØ�H˜Q”K Ô'Ð'Ð'Ø˜Q�KØ�ð (øð €Or0   c                 ó0  — g }|                       ¦   «         D ]~}t          j        |d         ¦  «        |j        z  }|j        s8t          |j        | j        j        z  |j        | j        j        z  ¦  «        |k     rŒd||d<   | 	                    |¦  «         Œ|S rÇ  )
rí  rH   r  r  rî  r\   r£   rž   r§   r’   )re   rÇ   r×   r  r,  r�   s         r.   Úfilter_small_imagesr/  y  sŸ   € Ø€HØ×#Ò#Ñ%Ô%ð ð ˆÝŒL˜˜fœÑ&Ô&¨¬Ñ3ˆØŒ:ð 	Ý�”˜$œ)œ/Ñ)¨1¬8°d´iÔ6FÑ+FÑGÔGØòð ð ØˆˆV‰Ø�Š˜ÑÔÐÐØ€Or0   c                 ó   — t          | ||¦  «        }|                     d„ d¬¦  «         t          t          |¦  «        dz
  dd¦  «        D ]B}||         d         }|j        r||= Œt          |¦  «        D ]}|||         d         v r||=  nŒŒC|S )Nc                 ó,   — t          | d         ¦  «        S rÇ  rÈ  r7   s    r.   r9   z4extract_images_on_page_simple_drop.<locals>.<lambda>‹  r+  r0   TrÉ  r   r   r<   rû   )r/  r»  rF   rV   rî  )re   rÇ   r×   r  r8   r�   rŒ  s          r.   Ú"extract_images_on_page_simple_dropr2  ‡  sº   € Ý" 4¨Ð0@ÑAÔA€Hð ‡M‚MÐ.Ð.¸€MÑ=Ô=Ð=å•3�x‘=”= 1Ñ$ a¨Ñ,Ô,ð ð ˆØ�QŒK˜ÔˆØŒ:ð 	Ø˜�ØÝ�q‘”ð 	ð 	ˆAØ�H˜Q”K Ô'Ð'Ð'Ø˜Q�KØ�ð (øð €Or0   Ú__main__r   zUsage:
python z
 input.pdfrí   z-pagesÚNrå  r  c                 ó8   — g | ]}|t           j        k    ¯|d z   ‘ŒS r‹  )r   rQ   )r*   Úns     r.   r/   r/   ·  s(   € ÐGÐGÐG Q°1½¼Ò3FÐ3F˜1˜q™5Ð3FÐ3FÐ3Fr0   rì   zPage number(s) z	 not in 'z'.)r   z.mdz$Markdown creation time for FILENAME=rC   z sec.rô   )[rw   r  ÚreÚstringÚbinasciir   Úcollectionsr   Údataclassesr   rH   r   Ú"pymupdf4llm.helpers.get_text_linesr   Ú pymupdf4llm.helpers.multi_columnr   Úpymupdf4llm.helpers.utilsr	   r
   r   r   r   r   r   r   r   r   r   r   ÚImportErrorÚpymupdf4llm.helpers.progressÚTOOLSÚunset_quad_correctionsrO  r   r|   r‰   rš   r°   r·   rº   r¼   rÀ   rÉ   rx   rÆ   r-  r/  r2  rt   ÚpathlibÚsysÚtimeÚargvrØ   Ú
IndexErrorr  r  r  Ú__file__ÚexitÚperf_counterÚt0rJ   r   rÇ   rF   rQ   r   rV   r  Ú
pages_specÚsplitÚspecÚmaprE   rA   ÚendrJ  r’   r“   Úwrong_pagesrè  r  r±  ÚoutnameÚPathÚwrite_bytesÚencodeÚt1rU   r3   r0   r.   ú<module>rW     sä  ðð#ð #ðJ 
€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø !Ð !Ð !Ð !Ð !Ð !à €€€Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð9Ø(Ð(Ð(Ð(Ð(Ð(Ð(øØð 9ð 9ð 9Ø8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð9øøøð „× $Ò $ TÑ *Ô *Ð *à€ðeð eð eð eð eñ eô eð eðP.ð .ð .ð .ð .ñ .ô .ð .ðd ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ „ð	ð ð  ð  ð  ðF+ð +ð +ð\ð ð ðð ð ðð ð ð"ð "ð "ð2ð 2ð 2ð ØØØØØØØØØØØØØØØØØØ!ØØØØØØØØð;vð vð vð> 	ð?vð vð vð vðrð ð ð2ð ð ðð ð ð& ˆzÒÑØ€N€N€NØ€J€J€JØ€K€K€KðØ”8˜A”;ˆˆøØð ð ð ØˆÐF ¤× 0Ò 0°Ñ :Ô :ÐFÐFÐFÑGÔGÐGØˆŒ‰
Œ
ˆ
ˆ
ˆ
ðøøøð 
ˆÔ	Ñ	Ô	€Bà
ˆ'Œ,�xÑ
 Ô
 €CØŒH�Q�R�RŒL€EØˆE�#”.Ñ!Ô!€EØ
€sˆ5�z„z�Q‚€˜5 œ8 xÒ/Ð/Øˆð ˜1”X×%Ò% c¨c¬nÐ+>Ñ?Ô?ˆ
Ø×$Ò$ SÑ)Ô)ð 	,ð 	,ˆDØ�dˆ{ˆ{Ø ˜S  d§j¢j°¡o¤oÑ6Ô6‘
��sØ—’˜U˜U 5¨1¡9¨cÑ2Ô2Ñ3Ô3Ð3Ð3à—’˜S˜S ™YœY¨™]Ñ+Ô+Ð+Ð+ð �cÐGÐG¨%ÐGÑGÔGÈÈÈÔKÑLÔLˆØ˜#˜#™%œ%ÒÐØˆCŒHÐD {ÐDÐD¸SÐDÐDÐDÑEÔEÐEð �ØØðñ ô €Ið Œx€Hà˜Ñ€GØ€G„L�ÑÔ×%Ò% i×&6Ò&6Ñ&8Ô&8Ñ9Ô9Ð9Ø	ˆÔ	Ñ	Ô	€BØ	€EÐ
I¨Ð
IÐ
I°E°E¸"¸R¹%À±N´NÐ
IÐ
IÐ
IÑJÔJÐJÐJÐJðW Ðs$   ÁA ÁA%Á$A%Ä	D Ä;EÅE