§
    šŠtjÕí  ã                  óR  — d Z ddlmZ ddlZddlZddlZddlZddlZddlmZ dd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mZ ddlm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#m$Z$m%Z% erddl&Z&ddl'Z'ddl(Z(ddl)Z)ddl*m+Z+ g d¢Z,g d¢Z-d6d„Z. ej/        e0¦  «        Z1dZ2dZ3dZ4dZ5h d£Z6d7d„Z7d8d „Z8d8d!„Z9d"d#gZ:d9d'„Z; G d(„ d)e ¦  «        Z< G d*„ d+e ¦  «        Z= G d,„ d-e ¦  «        Z> G d.„ d/e ¦  «        Z? G d0„ d1e ¦  «        Z@ G d2„ d3e ¦  «        ZA G d4„ d5e ¦  «        ZBdS ):z(Module contains common parsers for PDFs.é    )ÚannotationsN)Údatetime)ÚPath)ÚTemporaryDirectory)ÚTYPE_CHECKINGÚAnyÚBinaryIOÚIterableÚIteratorÚLiteralÚMappingÚOptionalÚSequenceÚUnionÚcast)Úurlparse)ÚDocument)ÚBaseBlobParser)ÚBlob)ÚBaseImageBlobParserÚRapidOCRBlobParser)ÚTextLinearizationConfig)Ú	DCTDecodeÚDCTÚ	JPXDecode)Ú	LZWDecodeÚLZWÚFlateDecodeÚFlÚASCII85DecodeÚA85ÚASCIIHexDecodeÚAHxÚRunLengthDecodeÚRLÚCCITTFaxDecodeÚCCFÚJBIG2DecodeÚimagesú,Sequence[Union[Iterable[np.ndarray], bytes]]ÚreturnÚstrc                óÔ   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w |¦   «         }d}| D ]3} ||¦  «        }|r$|j        r|d                     |j        ¦  «        z  }Œ4|S )zàExtract text from images with RapidOCR.

    Args:
        images: Images to extract text from.

    Returns:
        Text extracted from images.

    Raises:
        ImportError: If `rapidocr` package is not installed.
    r   )ÚRapidOCRzK`rapidocr` package not found, please install it with `pip install rapidocr`Ú ú
)Úrapidocrr.   ÚImportErrorÚtxtsÚjoin)r)   r.   ÚocrÚtextÚimgÚresults         ún/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/parsers/pdf.pyÚ!extract_from_images_with_rapidocrr:   @   s«   € ð
Ø%Ð%Ð%Ð%Ð%Ð%Ð%øÝð 
ð 
ð 
Ýð%ñ
ô 
ð 	
ð
øøøð
 ˆ(‰*Œ*€CØ€DØð +ð +ˆØ��S‘”ˆØð 	+�f”kð 	+Ø�D—I’I˜fœkÑ*Ô*Ñ*ˆDøØ€Ks   ‚	 ‰#z

{image_text}

r0   z
>   ÚsourceÚcreatorÚproducerÚtotal_pagesÚcreationdateÚblobr   ÚcontentÚformatc                ó®   — |rR| j         pd}|dk    r |                     dd¦  «        }d|› d|› d�}n#|dk    rd	t          j        |d
¬¦  «        › d|› d�}|S )a®  Format the content of the image with the source of the blob.

    blob: The blob containing the image.
    format::
      The format for the parsed output.
      - "text" = return the content as is
      - "markdown-img" = wrap the content into an image markdown link, w/ link
      pointing to (`![body)(#)`]
      - "html-img" = wrap the content as the `alt` text of an tag and link to
      (`<img alt="{body}" src="#"/>`)
    ú#zmarkdown-imgú]z\\]z![z](ú)zhtml-imgz
<img alt="T)Úquotez src="z" />)r;   ÚreplaceÚhtmlÚescape)r@   rA   rB   r;   s       r9   Ú_format_inner_imagerK   h   sˆ   € ð ð XØ”Ð# ˆØ�^Ò#Ð#Ø—o’o c¨6Ñ2Ô2ˆGØ/˜7Ð/Ð/ fÐ/Ð/Ð/ˆGˆGØ�zÒ!Ð!ØW¥4¤;¨w¸dÐ#CÑ#CÔ#CÐWÐWÈ6ÐWÐWÐWˆGØ€Nó    Úmetadataúdict[str, Any]c                óì   — t                                |                      ¦   «         ¦  «        st          d¦  «        ‚t	          |                      dd¦  «        t          ¦  «        st          d¦  «        ‚| S )z÷Validate that the metadata has all the standard keys and the page is an integer.

    The standard keys are:
    - source
    - total_page
    - creationdate
    - creator
    - producer

    Validate that page is an integer if it is present.
    z3The PDF parser must valorize the standard metadata.Úpager   z(The PDF metadata page must be a integer.)Ú_STD_METADATA_KEYSÚissubsetÚkeysÚ
ValueErrorÚ
isinstanceÚgetÚint)rM   s    r9   Ú_validate_metadatarX   ~   sg   € õ ×&Ò& x§}¢}¡¤Ñ7Ô7ð PÝÐNÑOÔOÐOÝ�h—l’l 6¨1Ñ-Ô-­sÑ3Ô3ð EÝÐCÑDÔDÐDØ€OrL   c                óx  — i }dddœ}|                       ¦   «         D �]\  }}t          |¦  «        t          t          fvrt          |¦  «        }|                     d¦  «        r
|dd…         }|                     ¦   «         }|dv rV	 t          j        |                     dd	¦  «        d
¦  «         	                    d¦  «        ||<   Œª# t          $ r |||<   Y Œ»w xY w||v r||||         <   |||<   ŒÔt          |t          ¦  «        r|                     ¦   «         ||<   �Œt          |t          ¦  «        r|||<   �Œ|S )zÖPurge metadata from unwanted keys and normalize key names.

    Args:
        metadata: The original metadata dictionary.

    Returns:
        The cleaned and normalized the key format of metadata dictionary.
    r>   r;   )Ú
page_countÚ	file_pathú/é   N)r?   Úmoddateú'r/   zD:%Y%m%d%H%M%S%zÚT)ÚitemsÚtyper,   rW   Ú
startswithÚlowerr   ÚstrptimerH   Ú	isoformatrT   rU   Ústrip)rM   Únew_metadataÚmap_keyÚkÚvs        r9   Ú_purge_metadatarl   ‘   sf  € ð $&€Là#Øðð €Gð —’Ñ Ô ð  ñ  ‰ˆˆ1Ý�‰7Œ7�3¥˜*Ð$Ð$Ý�A‘”ˆAØ�<Š<˜ÑÔð 	Ø�!�"�"”ˆAØ�GŠG‰IŒIˆØÐ+Ð+Ð+ð$Ý"*Ô"3Ø—I’I˜c 2Ñ&Ô&Ð(:ñ#ô #ç’)˜C‘.”.ð ˜Q‘�øõ ð $ð $ð $Ø"#�˜Q‘��ð$øøøà�'ˆ\ˆ\à'(ˆL˜ œÑ$ØˆL˜‰OˆOÝ˜�3ÑÔð 	 ØŸgšg™iœiˆL˜‰O‰OÝ˜�3ÑÔð 	 ØˆL˜‰OùØÐs   Â?CÃCÃCz


ú

Úextrasú	list[str]Útext_from_pagec                ó¬   ‡— dˆfd	„Š ‰| |d
¦  «        }|s=d}d                      t          d„ | ¦  «        ¦  «        }|rt          d         |z   }||z   }|S )a5  Insert extras such as image/table in a text between two paragraphs if possible,
    else at the end of the text.

    Args:
        extras: List of extra content (images/tables) to insert.
        text_from_page: The text content from the page.

    Returns:
        The merged text with extras inserted.
    rn   ro   rp   r,   ÚrecursÚboolr+   úOptional[str]c                ó@  •— | r˜t           D ]�}|                     |¦  «        }|dk    rpd }|r ‰	| |d |…         d¦  «        }|r|||d …         z   }nEd}d                     t          d„ | ¦  «        ¦  «        }|r||z   }|d |…         |z   ||d …         z   } nŒŽd }n|}|S )NéÿÿÿÿFr/   rm   c                ó   — | S ©N© ©Úxs    r9   ú<lambda>zO_merge_text_and_extras.<locals>._recurs_merge_text_and_extras.<locals>.<lambda>Ú   s   € À!€ rL   )Ú_PARAGRAPH_DELIMITERÚrfindr4   Úfilter)
rn   rp   rr   ÚdelimÚposÚprevious_textÚall_textÚ
all_extrasÚ
str_extrasÚ_recurs_merge_text_and_extrass
            €r9   r†   z=_merge_text_and_extras.<locals>._recurs_merge_text_and_extrasÉ   sü   ø€ ð ð 	&Ý-ð  ð  �Ø$×*Ò*¨5Ñ1Ô1�Ø˜"’9�9à$(�MØð Ø(EÐ(EØ" N°4°C°4Ô$8¸%ñ)ô )˜ð %ð 	Ø#0°>À#À$À$Ô3GÑ#G˜˜à%'˜
Ø%+§[¢[µ¸¸ÀVÑ1LÔ1LÑ%MÔ%M˜
Ø%ð <Ø).°Ñ);˜Jà*¨4¨C¨4Ô0°:Ñ=ÀÈsÈtÈtÔ@TÑTð !ð �Eð# ð&  �øà%ˆHØˆrL   Tr/   rm   c                ó   — | S rx   ry   rz   s    r9   r|   z(_merge_text_and_extras.<locals>.<lambda>ê   s   € °!€ rL   rv   )rn   ro   rp   r,   rr   rs   r+   rt   )r4   r   r}   )rn   rp   rƒ   r„   r…   r†   s        @r9   Ú_merge_text_and_extrasrˆ   ½   s‡   ø€ ðð ð ð ð ð ð< -Ð,¨V°^ÀTÑJÔJ€HØð /Øˆ
Ø—[’[¥¨¨°VÑ!<Ô!<Ñ=Ô=ˆ
Øð 	?Ý-¨bÔ1°JÑ>ˆJØ! JÑ.ˆà€OrL   c                  óJ   ‡ — e Zd ZdZ	 	 d dedddddœd!ˆ fd„Zd"d„Zd#d„Zˆ xZS )$ÚPyPDFParsera  Parse a blob from a PDF using `pypdf` library.

    This class provides methods to parse a blob from a PDF document, supporting various
    configurations such as handling password-protected PDFs, extracting images.
    It integrates the 'pypdf' library for PDF processing and offers synchronous blob
    parsing.

    Examples:
        Setup:

        .. code-block:: bash

            pip install -U langchain-community pypdf

        Load a blob from a PDF file:

        .. code-block:: python

            from langchain_core.documents.base import Blob

            blob = Blob.from_path("./example_data/layout-parser-paper.pdf")

        Instantiate the parser:

        .. code-block:: python

            from langchain_community.document_loaders.parsers import PyPDFParser

            parser = PyPDFParser(
                # password = None,
                mode = "single",
                pages_delimiter = "
",
                # images_parser = TesseractBlobParser(),
            )

        Lazily parse the blob:

        .. code-block:: python

            docs = []
            docs_lazy = parser.lazy_parse(blob)

            for doc in docs_lazy:
                docs.append(doc)
            print(docs[0].page_content[:100])
            print(docs[0].metadata)
    NFrP   r6   Úplain)ÚmodeÚpages_delimiterÚimages_parserÚimages_inner_formatÚextraction_modeÚextraction_kwargsÚpasswordúOptional[Union[str, bytes]]Úextract_imagesrs   rŒ   úLiteral['single', 'page']r�   r,   rŽ   úOptional[BaseImageBlobParser]r�   ú+Literal['text', 'markdown-img', 'html-img']r�   úLiteral['plain', 'layout']r‘   úOptional[dict[str, Any]]c               ó  •— t          ¦   «                              ¦   «          |dvrt          d¦  «        ‚|| _        |r|st	          ¦   «         }|| _        || _        || _        || _        || _	        || _
        |pi | _        dS )uý  Initialize a parser based on PyPDF.

        Args:
            password: Optional password for opening encrypted PDFs.
            extract_images: Whether to extract images from the PDF.
            mode: The extraction mode, either "single" for the entire document or "page"
                for page-wise extraction.
            pages_delimiter: A string delimiter to separate pages in single-mode
                extraction.
            images_parser: Optional image blob parser.
            images_inner_format: The format for the parsed output.
                - "text" = return the content as is
                - "markdown-img" = wrap the content into an image markdown link, w/ link
                pointing to (`![body)(#)`]
                - "html-img" = wrap the content as the `alt` text of an tag and link to
                (`<img alt="{body}" src="#"/>`)
            extraction_mode: â€œplainâ€� for legacy functionality, â€œlayoutâ€� extract text
                in a fixed width format that closely adheres to the rendered layout in
                the source pdf.
            extraction_kwargs: Optional additional parameters for the extraction
                process.

        Raises:
            ValueError: If the `mode` is not "single" or "page".
        ©ÚsinglerP   úmode must be single or pageN)ÚsuperÚ__init__rT   r”   r   rŽ   r�   r’   rŒ   r�   r�   r‘   )
Úselfr’   r”   rŒ   r�   rŽ   r�   r�   r‘   Ú	__class__s
            €r9   rŸ   zPyPDFParser.__init__#  sš   ø€ õJ 	‰Œ×ÒÑÔÐØÐ)Ð)Ð)ÝÐ:Ñ;Ô;Ð;Ø,ˆÔØð 	1 -ð 	1Ý.Ñ0Ô0ˆMØ*ˆÔØ#6ˆÔ Ø ˆŒØˆŒ	Ø.ˆÔØ.ˆÔØ!2Ð!8°bˆÔÐÐrL   r@   r   r+   úIterator[Document]c              #  ón  ‡ ‡K  — 	 ddl Šn# t          $ r t          d¦  «        ‚w xY wdˆˆ fd„}|                     ¦   «         5 } ‰j        |‰ j        ¬	¦  «        }t          d
d
ddœt          t          |j        pi ¦  «        z  |j	        t          |j        ¦  «        dœz  ¦  «        }g }t          |j        ¦  «        D ]›\  }} ||¬¦  «        }	‰                      |¦  «        }
t          |
g|	¦  «                             ¦   «         }‰ j        dk    r2t#          |t%          |||j        |         dœz  ¦  «        ¬¦  «        V — Œ†|                     |¦  «         Œœ‰ j        dk    r8t#          ‰ j                             |¦  «        t%          |¦  «        ¬¦  «        V — ddd¦  «         dS # 1 swxY w Y   dS )ám  
        Lazily parse the blob.
        Insert image, if possible, between two paragraphs.
        In this way, a paragraph can be continued on the next page.

        Args:
            blob: The blob to parse.

        Raises:
            ImportError: If the `pypdf` package is not found.

        Yield:
            An iterator over the parsed documents.
        r   NzE`pypdf` package not found, please install it with `pip install pypdf`rP   úpypdf.PageObjectr+   r,   c                ó’   •— ‰j                              d¦  «        r|                      ¦   «         S  | j        dd‰j        i‰j        ¤ŽS )zÛ
            Extract text from image given the version of pypdf.

            Args:
                page: The page object to extract text from.

            Returns:
                str: The extracted text.
            Ú3r�   Nry   )Ú__version__rc   Úextract_textr�   r‘   )rP   Úpypdfr    s    €€r9   Ú_extract_text_from_pagez7PyPDFParser.lazy_parse.<locals>._extract_text_from_pagel  sb   ø€ ð Ô ×+Ò+¨CÑ0Ô0ð Ø×(Ò(Ñ*Ô*Ð*à(�tÔ(ð ð Ø$(Ô$8ðàÔ,ðð ð rL   ©r’   ÚPyPDFr/   ©r=   r<   r?   )r;   r>   )rP   )rP   Ú
page_label©Úpage_contentrM   rœ   )rP   r¥   r+   r,   )rª   r2   Úas_bytes_ioÚ	PdfReaderr’   rl   r   ÚdictrM   r;   ÚlenÚpagesÚ	enumerateÚextract_images_from_pagerˆ   rg   rŒ   r   rX   Úpage_labelsÚappendr�   r4   )r    r@   r«   Úpdf_file_objÚ
pdf_readerÚdoc_metadataÚsingle_textsÚpage_numberrP   rp   Úimages_from_pagerƒ   rª   s   `           @r9   Ú
lazy_parsezPyPDFParser.lazy_parseV  sŽ  øøè è € ð	ØˆLˆLˆLˆLøÝð 	ð 	ð 	ÝØWñô ð ð	øøøð
	ð 	ð 	ð 	ð 	ð 	ð 	ð$ ×ÒÑÔð #	 <Ø(˜œ¨ÀÄÐNÑNÔNˆJå*Ø$°È"ÐMÐMÝ•t˜ZÔ0Ð6°BÑ7Ô7ñ8ð #œkÝ#& zÔ'7Ñ#8Ô#8ðð ññô ˆLð ˆLÝ%.¨zÔ/?Ñ%@Ô%@ð 2ð 2Ñ!�˜TØ!8Ð!8¸dÐ!CÑ!CÔ!C�Ø#'×#@Ò#@ÀÑ#FÔ#FÐ Ý1Ø%Ð&¨ñô ç’%‘'”'ð ð ”9 Ò&Ð&Ý"Ø%-Ý!3Ø(à(3Ø.8Ô.DÀ[Ô.Qðð ññ"ô "ð	ñ 	ô 	ð 	ð 	ð 	ð 	ð !×'Ò'¨Ñ1Ô1Ð1Ð1ØŒy˜HÒ$Ð$ÝØ!%Ô!5×!:Ò!:¸<Ñ!HÔ!HÝ/°Ñ=Ô=ðñ ô ð ð ð ðA#	ð #	ð #	ñ #	ô #	ð #	ð #	ð #	ð #	ð #	ð #	ð #	øøøð #	ð #	ð #	ð #	ð #	ð #	s   † ‹%ÁEF*Æ*F.Æ1F.úpypdf._page.PageObjectc           	     óÊ  — | j         sdS ddl}ddlm} dt	          t
          |d         ¦  «                             ¦   «         vrdS |d         d                              ¦   «         }g }|D �]9}d}||         d         dk    �r!t          ||         d	         ¦  «        |j	        j
        j        u r||         d	         d
d…         n||         d	         d         d
d…         }|t          v rj||         d         ||         d         }
}	t          j        ||                              ¦   «         t          j        ¬¦  «                             |	|
d¦  «        }nu|t$          v rRt          j        |                     t+          j        ||                              ¦   «         ¦  «        ¦  «        ¦  «        }nt.                               d¦  «         |�Ùt+          j        ¦   «         }|                     |¦  «                             |d¬¦  «         |                     ¦   «         j        dk    r�Œ¼t;          j        |                     ¦   «         d¬¦  «        }tA          | j          !                    |¦  «        ¦  «        j"        }| #                    tI          ||| j%        ¦  «        ¦  «         �Œ;tL           '                    tP           )                    tU          d|¦  «        ¦  «        ¬¦  «        S )úðExtract images from a PDF page and get the text using images_to_text.

        Args:
            page: The page object from which to extract images.

        Returns:
            str: The extracted text from the images on the page.
        r/   r   N©ÚImagez/XObjectz
/Resourcesz/Subtypez/Imagez/Filterr]   z/Heightz/Width©Údtyperv   úUnknown PDF Filter!ÚPNG)rB   z	image/png©Ú	mime_type©Ú
image_text)+rŽ   rª   ÚPILrÆ   r   r´   rS   Ú
get_objectrb   ÚgenericÚ_baseÚ
NameObjectÚ_PDF_FILTER_WITHOUT_LOSSÚnpÚ
frombufferÚget_dataÚuint8ÚreshapeÚ_PDF_FILTER_WITH_LOSSÚarrayÚopenÚioÚBytesIOÚloggerÚwarningÚ	fromarrayÚsaveÚ	getbufferÚnbytesr   Ú	from_dataÚgetvalueÚnextrÁ   r±   rº   rK   r�   Ú_FORMAT_IMAGE_STRrB   Ú_JOIN_IMAGESr4   r   )r    rP   rª   rÆ   ÚxObjectr)   ÚobjÚnp_imageÚ
img_filterÚheightÚwidthÚimage_bytesr@   rÎ   s                 r9   r¸   z$PyPDFParser.extract_images_from_page£  s¾  € ð Ô!ð 	Ø�2ØˆˆˆØÐÐÐÐÐà�T¥$¨¨\Ô(:Ñ;Ô;×@Ò@ÑBÔBÐBÐBØ�2à�|Ô$ ZÔ0×;Ò;Ñ=Ô=ˆØˆØð 	ñ 	ˆCØ ˆHØ�sŒ|˜JÔ'¨8Ò3Ñ3õ ˜G CœL¨Ô3Ñ4Ô4¸¼Ô8KÔ8VÐVÐVð ˜C”L Ô+¨A¨B¨BÔ/Ð/à  œ iÔ0°Ô3°A°B°BÔ7ð ð
 Õ!9Ð9Ð9Ø$+¨C¤L°Ô$;¸WÀS¼\È(Ô=S˜E�Få!œ}Ø œ×-Ò-Ñ/Ô/µr´xð ñ  ô  ç’g˜f e¨RÑ0Ô0ð �Hð  Õ#8Ð8Ð8Ý!œx¨¯
ª
µ2´:¸gÀc¼l×>SÒ>SÑ>UÔ>UÑ3VÔ3VÑ(WÔ(WÑXÔX�H�Hõ —N’NÐ#8Ñ9Ô9Ð9ØÐ'Ý"$¤*¡,¤,�Kà—O’O HÑ-Ô-×2Ò2°;ÀuÐ2ÑMÔMÐMØ"×,Ò,Ñ.Ô.Ô5¸Ò:Ð:Ù åœ>¨+×*>Ò*>Ñ*@Ô*@ÈKÐXÑXÔX�DÝ!% dÔ&8×&CÒ&CÀDÑ&IÔ&IÑ!JÔ!JÔ!W�JØ—M’MÝ+¨D°*¸dÔ>VÑWÔWñô ð ùõ !×'Ò'Ý#×(Ò(­°°fÑ)=Ô)=Ñ>Ô>ð (ñ 
ô 
ð 	
rL   ©NF)r’   r“   r”   rs   rŒ   r•   r�   r,   rŽ   r–   r�   r—   r�   r˜   r‘   r™   ©r@   r   r+   r¢   )rP   rÂ   r+   r,   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_DEFAULT_PAGES_DELIMITERrŸ   rÁ   r¸   Ú__classcell__©r¡   s   @r9   rŠ   rŠ   ò   s¡   ø€ € € € € ð.ð .ðd 15Ø$ð19ð
 +1Ø7Ø7;ØKQØ6=Ø6:ð19ð 19ð 19ð 19ð 19ð 19ð 19ð 19ðfKð Kð Kð KðZ4
ð 4
ð 4
ð 4
ð 4
ð 4
ð 4
ð 4
rL   rŠ   c                  ó‚   ‡ — e Zd ZdZdZ	 d(ddeddddœd)ˆ fd„Zed*d„¦   «         Zed+d„¦   «         Z		 	 d,d-d#„Z
d.d'„Zˆ xZS )/ÚPDFMinerParsera…  Parse a blob from a PDF using `pdfminer.six` library.

    This class provides methods to parse a blob from a PDF document, supporting various
    configurations such as handling password-protected PDFs, extracting images, and
    defining extraction mode.
    It integrates the 'pdfminer.six' library for PDF processing and offers synchronous
    blob parsing.

    Examples:
        Setup:

        .. code-block:: bash

            pip install -U langchain-community pdfminer.six pillow

        Load a blob from a PDF file:

        .. code-block:: python

            from langchain_core.documents.base import Blob

            blob = Blob.from_path("./example_data/layout-parser-paper.pdf")

        Instantiate the parser:

        .. code-block:: python

            from langchain_community.document_loaders.parsers import PDFMinerParser

            parser = PDFMinerParser(
                # password = None,
                mode = "single",
                pages_delimiter = "
",
                # extract_images = True,
                # images_to_text = convert_images_to_text_with_tesseract(),
            )

        Lazily parse the blob:

        .. code-block:: python

            docs = []
            docs_lazy = parser.lazy_parse(blob)

            for doc in docs_lazy:
                docs.append(doc)
            print(docs[0].page_content[:100])
            print(docs[0].metadata)
    FNrœ   r6   )r’   rŒ   r�   rŽ   r�   Úconcatenate_pagesr”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   rü   úOptional[bool]c               óh  •— t          ¦   «                              ¦   «          |dvrt          d¦  «        ‚|r|st          ¦   «         }|| _        || _        || _        || _        || _        || _	        |�?t          j        s&dt          _        t                               d¦  «         |rdnd| _        dS dS )aH  Initialize a parser based on PDFMiner.

        Args:
            password: Optional password for opening encrypted PDFs.
            mode: Extraction mode to use. Either "single" or "page" for page-wise
                extraction.
            pages_delimiter: A string delimiter to separate pages in single-mode
                extraction.
            extract_images: Whether to extract images from PDF.
            images_inner_format: The format for the parsed output.
                - "text" = return the content as is
                - "markdown-img" = wrap the content into an image markdown link, w/ link
                pointing to (`![body)(#)`]
                - "html-img" = wrap the content as the `alt` text of an tag and link to
                (`<img alt="{body}" src="#"/>`)
            concatenate_pages: Deprecated. If True, concatenate all PDF pages
                into one a single document. Otherwise, return one document per page.

        Returns:
            This method does not directly return data. Use the `parse` or `lazy_parse`
            methods to retrieve parsed documents with content and metadata.

        Raises:
            ValueError: If the `mode` is not "single" or "page".

        Warnings:
            `concatenate_pages` parameter is deprecated. Use `mode='single' or 'page'
            instead.
        r›   r�   NTzS`concatenate_pages` parameter is deprecated. Use `mode='single' or 'page'` instead.rœ   rP   )rž   rŸ   rT   r   r”   rŽ   r�   r’   rŒ   r�   rû   Ú_warn_concatenate_pagesrß   rà   )	r    r”   r’   rŒ   r�   rŽ   r�   rü   r¡   s	           €r9   rŸ   zPDFMinerParser.__init__  sÑ   ø€ õP 	‰Œ×ÒÑÔÐØÐ)Ð)Ð)ÝÐ:Ñ;Ô;Ð;Øð 	1 -ð 	1Ý.Ñ0Ô0ˆMØ,ˆÔØ*ˆÔØ#6ˆÔ Ø ˆŒØˆŒ	Ø.ˆÔØÐ(Ý!Ô9ð Ø9=•Ô6Ý—’ð=ñô ð ð %6ÐA˜˜¸6ˆDŒIˆIˆIð )Ð(rL   ÚsúUnion[bytes, str]r+   c                ó0  ‡— ddl mŠ t          | t          ¦  «        r.|                      d¦  «        rt          | dd…         dd¦  «        S 	 d„ | D ¦   «         }d	                     ˆfd
„|D ¦   «         ¦  «        S # t          $ r t          | ¦  «        cY S w xY w)zæ
        Decodes a PDFDocEncoding string to Unicode.
        Adds py3 compatibility to pdfminer's version.

        Args:
            s: The string to decode.

        Returns:
            str: The decoded Unicode string.
        r   )ÚPDFDocEncodings   þÿé   Nzutf-16beÚignorec              3  ób   K  — | ]*}t          |t          ¦  «        rt          |¦  «        n|V — Œ+d S rx   )rU   r,   Úord)Ú.0Úcs     r9   ú	<genexpr>z-PDFMinerParser.decode_text.<locals>.<genexpr>\  s;   è è € ÐCÐC¸A�j¨­CÑ0Ô0Ð7•C˜‘F”F�F°aÐCÐCÐCÐCÐCÐCrL   r/   c              3  ó(   •K  — | ]}‰|         V — Œd S rx   ry   )r  Úor  s     €r9   r
  z-PDFMinerParser.decode_text.<locals>.<genexpr>]  s(   øè è € Ð;Ð;°˜>¨!Ô,Ð;Ð;Ð;Ð;Ð;Ð;rL   )Úpdfminer.utilsr  rU   Úbytesrc   r,   r4   Ú
IndexError)r   Úordsr  s     @r9   Údecode_textzPDFMinerParser.decode_textK  s¿   ø€ ð 	2Ð1Ð1Ð1Ð1Ð1å�a�ÑÔð 	4 A§L¢L°Ñ$=Ô$=ð 	4Ý�q˜˜˜”u˜j¨(Ñ3Ô3Ð3ð	ØCÐCÀÐCÑCÔCˆDØ—7’7Ð;Ð;Ð;Ð;°dÐ;Ñ;Ô;Ñ;Ô;Ð;øÝð 	ð 	ð 	Ý�q‘6”6ˆMˆMˆMð	øøøs   Á,A9 Á9BÂBrë   r   c                ó8  — ddl m} t          | d¦  «        r|                      ¦   «         } t	          | t
          ¦  «        r't          t          t          j        | ¦  «        ¦  «        S t	          | |¦  «        rt           	                    | j
        ¦  «        S t	          | t          t          f¦  «        rt           	                    | ¦  «        S t	          | t          ¦  «        r9|                      ¦   «         D ]"\  }}t                               |¦  «        | |<   Œ#| S | S )zÒ
        Recursively resolve the metadata values.

        Args:
            obj: The object to resolve and decode. It can be of any type.

        Returns:
            The resolved and decoded object.
        r   )Ú	PSLiteralÚresolve)Úpdfminer.psparserr  Úhasattrr  rU   ÚlistÚmaprû   Úresolve_and_decoder  Únamer,   r  r´   ra   )rë   r  rj   rk   s       r9   r  z!PDFMinerParser.resolve_and_decodea  s  € ð 	0Ð/Ð/Ð/Ð/Ð/å�3˜	Ñ"Ô"ð 	 Ø—+’+‘-”-ˆCÝ�c�4Ñ Ô ð 		Ý��NÔ=¸sÑCÔCÑDÔDÐDÝ˜˜YÑ'Ô'ð 	Ý!×-Ò-¨c¬hÑ7Ô7Ð7Ý˜�c¥5˜\Ñ*Ô*ð 	Ý!×-Ò-¨cÑ2Ô2Ð2Ý˜�TÑ"Ô"ð 	ØŸ	š	™œð >ð >‘��1Ý'×:Ò:¸1Ñ=Ô=��A‘�ØˆJàˆ
rL   r/   TÚfpr	   ÚcachingrN   c           	     óâ  — ddl m}m}m}  ||¦  «        } ||||¬¦  «        }i }	|j        D ]}
|	                     |
¦  «         Œ|	                     ¦   «         D ]c\  }}	 t                               |¦  «        |	|<   Œ$# t          $ r3}t                               d|t          |¦  «        ¦  «         Y d}~Œ\d}~ww xY wt          t          |                     |¦  «        ¦  «        ¦  «        |	d<   |	S )ag  
        Extract metadata from a PDF file.

        Args:
            fp: The file pointer to the PDF file.
            password: The password for the PDF file, if encrypted. Defaults to an empty
                string.
            caching: Whether to cache the PDF structure. Defaults to True.

        Returns:
            Metadata of the PDF file.
        r   )ÚPDFDocumentÚPDFPageÚ	PDFParser)r’   r  zD[WARNING] Metadata key "%s" could not be parsed due to exception: %sNr>   )Úpdfminer.pdfpager  r  r   ÚinfoÚupdatera   rû   r  Ú	Exceptionrß   rà   r,   rµ   r  Úcreate_pages)r    r  r’   r  r  r  r   ÚparserÚdocrM   r"  rj   rk   Úes                 r9   Ú_get_metadatazPDFMinerParser._get_metadata}  s>  € ð$ 	EÐDÐDÐDÐDÐDÐDÐDÐDÐDð �˜2‘”ˆàˆk˜&¨8¸WÐEÑEÔEˆØˆà”Hð 	"ð 	"ˆDØ�OŠO˜DÑ!Ô!Ð!Ð!Ø—N’NÑ$Ô$ð 	ð 	‰DˆAˆqð
Ý,×?Ò?ÀÑBÔB�˜‘�øÝð ð ð õ —’ð$àÝ˜‘F”Fñ	ô ð ð ð ð ð ð øøøøðøøøõ #&¥d¨7×+?Ò+?ÀÑ+DÔ+DÑ&EÔ&EÑ"FÔ"Fˆ�Ñàˆs   ÁA=Á=
B:Â)B5Â5B:r@   r   r¢   c              #  óš  ‡ ‡‡‡‡‡‡K  — 	 ddl }ddlm} ddlm}mŠmŠm}m}m	Šm
Š ddlm}m} ddlm}	 t!          |j        ¦  «        dk     rt%          d¦  «        ‚n# t$          $ r t%          d	¦  «        ‚w xY w|                     ¦   «         5 }
t)          ¦   «         5 Š|	                     |
‰ j        pd
¬¦  «        } |¦   «         }t/          ddd
dœ‰                      |
‰ j        pd
¬¦  «        z  ¦  «        }|j        |d<    G ˆˆˆˆˆ ˆˆfd„d|¦  «        }t5          j        ¦   «         Š || || |¦   «         ¬¦  «        ¦  «        }g }t9          |¦  «        D ]û\  }}‰                     d¦  «         ‰                     d¦  «         |                     |¦  «         ‰                      ¦   «         }| !                    ¦   «         }‰ j"        dk    rP‰                     d¦  «         ‰                     d¦  «         tG          |tI          |d|iz  ¦  «        ¬¦  «        V — ŒÇ| %                    d¦  «        r
|dd…         }| &                    |¦  «         Œü‰ j"        dk    r:‰ j'         (                    |¦  «        }tG          |tI          |¦  «        ¬¦  «        V — ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )a€  
        Lazily parse the blob.
        Insert image, if possible, between two paragraphs.
        In this way, a paragraph can be continued on the next page.

        Args:
            blob: The blob to parse.

        Raises:
            ImportError: If the `pdfminer.six` or `pillow` package is not found.

        Yield:
            An iterator over the parsed documents.
        r   N)ÚPDFLayoutAnalyzer)ÚLAParamsÚLTContainerÚLTImageÚLTItemÚLTPageÚLTTextÚ	LTTextBox)ÚPDFPageInterpreterÚPDFResourceManager)r  i:>4z§This parser is tested with pdfminer.six version 20201018 or later. Remove pdfminer, and install pdfminer.six with `pip uninstall pdfminer && pip install pdfminer.six`.zMpdfminer package not found, please install it with `pip install pdfminer.six`r/   r¬   ÚPDFMinerr®   r;   c                  ó@   •‡ — e Zd Z	 	 ddˆ fd„Zdˆˆˆˆˆˆˆfd„Zˆ xZS )ú*PDFMinerParser.lazy_parse.<locals>.Visitorr]   NÚrsrcmgrr4  ÚpagenorW   ÚlaparamsúOptional[LAParams]r+   ÚNonec                óP   •— t          ¦   «                              |||¬¦  «         d S )N)r9  r:  )rž   rŸ   )r    r8  r9  r:  r¡   s       €r9   rŸ   z3PDFMinerParser.lazy_parse.<locals>.Visitor.__init__ß  s*   ø€ õ ‘G”G×$Ò$ W°VÀhÐ$ÑOÔOÐOÐOÐOrL   Últpager0  c           	     ó:   •‡— dˆˆˆˆˆˆˆˆ	fd„Š ‰|¦  «         d S )NÚitemr/  r+   r<  c                óŽ  •— t          | ‰¦  «        r| D ]} ‰|¦  «         Œn7t          | ‰	¦  «        r'‰                     |                      ¦   «         ¦  «         t          | ‰
¦  «        r‰                     d¦  «         d S t          | ‰¦  «        r´‰j        r«ddlm}  |‰¦  «        }|                     | ¦  «        }t          j        t          ‰¦  «        |z  ¦  «        }d|j
        d<   t          ‰j                             |¦  «        ¦  «        j        }‰                     t          ||‰j        ¦  «        ¦  «         d S d S d S )Nr0   r   )ÚImageWriterrD   r;   )rU   ÚwriteÚget_textrŽ   Úpdfminer.imagerB  Úexport_imager   Ú	from_pathr   rM   rç   rÁ   r±   rK   r�   )r@  ÚchildrB  Úimage_writerÚfilenamer@   rÎ   r-  r.  r1  r2  Úrenderr    ÚtempdirÚtext_ios          €€€€€€€€r9   rK  zIPDFMinerParser.lazy_parse.<locals>.Visitor.receive_layout.<locals>.renderè  sx  ø€ Ý% d¨KÑ8Ô8ð ;Ø)-ð .ð . Ø &  u¡¤  ð.å'¨¨fÑ5Ô5ð ;Ø#ŸMšM¨$¯-ª-©/¬/Ñ:Ô:Ð:Ý% d¨IÑ6Ô6ð !Ø#ŸMšM¨$Ñ/Ô/Ð/Ð/Ð/Ý'¨¨gÑ6Ô6ð !Ø#Ô1ð "Ø FÐ FÐ FÐ FÐ FÐ Fà/:¨{¸7Ñ/CÔ/C Ø+7×+DÒ+DÀTÑ+JÔ+J Ý'+¤~µd¸7±m´mÀhÑ6NÑ'OÔ'O Ø:= ¤¨hÑ 7Ý-1Ø$(Ô$6×$AÒ$AÀ$Ñ$GÔ$Gñ."ô ."ä".ð !+ð !(§¢Ý$7Ø(,¨j¸$Ô:Rñ%&ô %&ñ!"ô !"ð !"ð !"ð !"ð"ð "ð" !˜DrL   )r@  r/  r+   r<  ry   )
Úmer>  rK  r-  r.  r1  r2  r    rL  rM  s
     @€€€€€€€r9   Úreceive_layoutz9PDFMinerParser.lazy_parse.<locals>.Visitor.receive_layoutç  sX   øø€ ð!ð !ð !ð !ð !ð !ð !ð !ð !ð !ð !ð !ð !ð8 �F˜6‘N”N�N�N�NrL   )r]   N)r8  r4  r9  rW   r:  r;  r+   r<  )r>  r0  r+   r<  )ró   rô   rõ   rŸ   rO  rø   )r¡   r-  r.  r1  r2  r    rL  rM  s   @€€€€€€€r9   ÚVisitorr7  Þ  sŽ   øø€ € € € € ð #$Ø37ð	Pð Pð Pð Pð Pð Pð Pð#ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #rL   rP  )r:  rP   r°   úrv   rœ   ))ÚpdfminerÚpdfminer.converterr+  Úpdfminer.layoutr,  r-  r.  r/  r0  r1  r2  Úpdfminer.pdfinterpr3  r4  r!  r  rW   r¨   r2   r²   r   Ú	get_pagesr’   rl   r)  r;   rÝ   ÚStringIOr·   ÚtruncateÚseekÚprocess_pageræ   rg   rŒ   r   rX   Úendswithrº   r�   r4   )r    r@   rR  r+  r,  r/  r0  r3  r4  r  r»   r¶   r8  r½   rP  Úvisitor_for_allÚall_contentÚirP   rƒ   Údocument_contentr-  r.  r1  r2  rL  rM  s   `                    @@@@@@r9   rÁ   zPDFMinerParser.lazy_parse«  s�  øøøøøøøè è € ð	ØˆOˆOˆOØ<Ð<Ð<Ð<Ð<Ð<ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð RÐQÐQÐQÐQÐQÐQÐQØ0Ð0Ð0Ð0Ð0Ð0å�8Ô'Ñ(Ô(¨8Ò3Ð3Ý!ðLñô ð ð 4øõ ð 	ð 	ð 	Ýð2ñô ð ð	øøøð ×ÒÑÔð O	 <Õ1CÑ1EÔ1Eð O	ÈØ×%Ò% l¸T¼]Ð=PÈbÐ%ÑQÔQˆEØ(Ð(Ñ*Ô*ˆGÝ*Ø'°JÐPRÐSÐSØ×$Ò$ \¸D¼MÐ<OÈRÐ$ÑPÔPñQñô ˆLð &*¤[ˆL˜Ñ"ð&#ð &#ð &#ð &#ð &#ð &#ð &#ð &#ð &#ð &#ð &#ð &#ð &#Ð+ñ &#ô &#ð &#õP ”k‘m”mˆGØ0Ð0Ø˜˜ °8°8±:´:Ð>Ñ>Ô>ñô ˆOð ˆKÝ$ UÑ+Ô+ð 1ð 1‘��4Ø× Ò  Ñ#Ô#Ð#Ø—’˜Q‘”�Ø×,Ò,¨TÑ2Ô2Ð2à"×+Ò+Ñ-Ô-�à#Ÿ>š>Ñ+Ô+�Ø”9 Ò&Ð&Ø×$Ò$ QÑ'Ô'Ð'Ø—L’L ‘O”O�OÝ"Ø%-Ý!3°LÀFÈAÀ;Ñ4NÑ!OÔ!Oðñ ô ð ð ð ð ð
  ×(Ò(¨Ñ.Ô.ð 1Ø#+¨C¨R¨C¤=˜Ø×&Ò& xÑ0Ô0Ð0Ð0ØŒy˜HÒ$Ð$à#'Ô#7×#<Ò#<¸[Ñ#IÔ#IÐ ÝØ!1Ý/°Ñ=Ô=ðñ ô ð ð ð ðYO	ð O	ð O	ñ O	ô O	ð O	ð O	ð O	ð O	ð O	ð O	øøøð O	ð O	ð O	ð O	ð O	ð O	ð O	ñ O	ô O	ð O	ð O	ð O	ð O	ð O	ð O	ð O	øøøð O	ð O	ð O	ð O	ð O	ð O	sC   ‹AA ÁA7ÂK ÂG?J(ÊK Ê(J,	Ê,K Ê/J,	Ê0K Ë KËK©F)r”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   rü   rý   )r   r  r+   r,   )rë   r   r+   r   )r/   T)r  r	   r’   r,   r  rs   r+   rN   rò   )ró   rô   rõ   rö   rÿ   r÷   rŸ   Ústaticmethodr  r  r)  rÁ   rø   rù   s   @r9   rû   rû   Ú  s   ø€ € € € € ð0ð 0ðd $Ðð  %ð:Bð #'Ø*2Ø7Ø7;ØKQØ,0ð:Bð :Bð :Bð :Bð :Bð :Bð :Bð :Bðx ðð ð ñ „\ðð* ðð ð ñ „\ðð< Øð	,ð ,ð ,ð ,ð ,ð\yð yð yð yð yð yð yð yrL   rû   c            	      óŽ   ‡ — e Zd ZdZ ej        ¦   «         Z	 	 d)ddedddddœd*ˆ fd„Zd+d„Z		 d,d-d„Z
d.d$„Zd/d&„Zd0d'„Zd1d(„Zˆ xZS )2ÚPyMuPDFParsera²  Parse a blob from a PDF using `PyMuPDF` library.

    This class provides methods to parse a blob from a PDF document, supporting various
    configurations such as handling password-protected PDFs, extracting images, and
    defining extraction mode.
    It integrates the 'PyMuPDF' library for PDF processing and offers synchronous blob
    parsing.

    Examples:
        Setup:

        .. code-block:: bash

            pip install -U langchain-community pymupdf

        Load a blob from a PDF file:

        .. code-block:: python

            from langchain_core.documents.base import Blob

            blob = Blob.from_path("./example_data/layout-parser-paper.pdf")

        Instantiate the parser:

        .. code-block:: python

            from langchain_community.document_loaders.parsers import PyMuPDFParser

            parser = PyMuPDFParser(
                # password = None,
                mode = "single",
                pages_delimiter = "
",
                # images_parser = TesseractBlobParser(),
                # extract_tables="markdown",
                # extract_tables_settings=None,
                # text_kwargs=None,
            )

        Lazily parse the blob:

        .. code-block:: python

            docs = []
            docs_lazy = parser.lazy_parse(blob)

            for doc in docs_lazy:
                docs.append(doc)
            print(docs[0].page_content[:100])
            print(docs[0].metadata)
    NFrP   r6   )r’   rŒ   r�   rŽ   r�   Úextract_tablesÚextract_tables_settingsÚtext_kwargsr™   r”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   rd  ú/Union[Literal['csv', 'markdown', 'html'], None]re  r+   r<  c               ó>  •— t          ¦   «                              ¦   «          |dvrt          d¦  «        ‚|r|dvrt          d¦  «        ‚|| _        || _        || _        |pi | _        |r|st          ¦   «         }|| _        || _	        || _
        || _        |	| _        dS )aÓ  Initialize a parser based on PyMuPDF.

        Args:
            password: Optional password for opening encrypted PDFs.
            mode: The extraction mode, either "single" for the entire document or "page"
                for page-wise extraction.
            pages_delimiter: A string delimiter to separate pages in single-mode
                extraction.
            extract_images: Whether to extract images from the PDF.
            images_parser: Optional image blob parser.
            images_inner_format: The format for the parsed output.
                - "text" = return the content as is
                - "markdown-img" = wrap the content into an image markdown link, w/ link
                pointing to (`![body)(#)`]
                - "html-img" = wrap the content as the `alt` text of an tag and link to
                (`<img alt="{body}" src="#"/>`)
            extract_tables: Whether to extract tables in a specific format, such as
                "csv", "markdown", or "html".
            extract_tables_settings: Optional dictionary of settings for customizing
                table extraction.

        Returns:
            This method does not directly return data. Use the `parse` or `lazy_parse`
            methods to retrieve parsed documents with content and metadata.

        Raises:
            ValueError: If the mode is not "single" or "page".
            ValueError: If the extract_tables format is not "markdown", "html",
            or "csv".
        r›   r�   )ÚmarkdownrI   Úcsvzmode must be markdownN)rž   rŸ   rT   rŒ   r�   r’   rf  r   r”   r�   rŽ   rd  re  )r    rf  r”   r’   rŒ   r�   rŽ   r�   rd  re  r¡   s             €r9   rŸ   zPyMuPDFParser.__init__`  sÄ   ø€ õV 	‰Œ×ÒÑÔÐØÐ)Ð)Ð)ÝÐ:Ñ;Ô;Ð;Øð 	6˜nÐ4OÐOÐOÝÐ4Ñ5Ô5Ð5àˆŒ	Ø.ˆÔØ ˆŒØ&Ð,¨"ˆÔØð 	1 -ð 	1Ý.Ñ0Ô0ˆMØ,ˆÔØ#6ˆÔ Ø*ˆÔØ,ˆÔØ'>ˆÔ$Ð$Ð$rL   r@   r   r¢   c                ó,   — |                       |¦  «        S rx   )Ú_lazy_parse)r    r@   s     r9   rÁ   zPyMuPDFParser.lazy_parse�  s   € Ø×ÒØñ
ô 
ð 	
rL   c              #  óú  K  — 	 ddl }|p| j        }| j        sNddlm}m}m}m} i dd“dd“dd“dd“d	d“d
|“dd“dd“d|“dd“dd“dd“d|“d|“dd“dd“dd“ddddddœ¥| _        n# t          $ r t          d¦  «        ‚w xY wt          j
        5  |                     ¦   «         5 }|j        € |j        |¦  «        }	n |j        |d¬¦  «        }	|	j        r|	                     | j        ¦  «         ddddœ|                      |	|¦  «        z  }
g }|	D ]v}|                      |	||¦  «                             ¦   «         }| j        dk    r+t+          |t-          |
d|j        iz  ¦  «        ¬¦  «        V — Œa|                     |¦  «         Œw| j        d k    r8t+          | j                             |¦  «        t-          |
¦  «        ¬¦  «        V — ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )!a  Lazily parse the blob.
        Insert image, if possible, between two paragraphs.
        In this way, a paragraph can be continued on the next page.

        Args:
            blob: The blob to parse.
            text_kwargs: Optional keyword arguments to pass to the `get_text` method.
                If provided at run time, it will override the default text_kwargs.

        Raises:
            ImportError: If the `pypdf` package is not found.

        Yield:
            An iterator over the parsed documents.
        r   N)ÚDEFAULT_JOIN_TOLERANCEÚDEFAULT_MIN_WORDS_HORIZONTALÚDEFAULT_MIN_WORDS_VERTICALÚDEFAULT_SNAP_TOLERANCEÚclipÚvertical_strategyÚlinesÚhorizontal_strategyÚvertical_linesÚhorizontal_linesÚsnap_toleranceÚsnap_x_toleranceÚsnap_y_toleranceÚjoin_toleranceÚjoin_x_toleranceÚjoin_y_toleranceÚedge_min_lengthé   Úmin_words_verticalÚmin_words_horizontalÚintersection_toleranceÚintersection_x_toleranceÚintersection_y_tolerance)Útext_toleranceÚtext_x_toleranceÚtext_y_toleranceÚstrategyÚ	add_lineszGpymupdf package not found, please install it with `pip install pymupdf`Úpdf)ÚstreamÚfiletypeÚPyMuPDFr/   r®   rP   r°   rœ   )Úpymupdfrf  re  Úpymupdf.tablern  ro  rp  rq  r2   rc  Ú_lockr²   ÚdatarÜ   Úis_encryptedÚauthenticater’   Ú_extract_metadataÚ_get_page_contentrg   rŒ   r   rX   Únumberrº   r�   r4   )r    r@   rf  rŽ  rn  ro  rp  rq  r[   r'  r½   Úfull_contentrP   rƒ   s                 r9   rl  zPyMuPDFParser._lazy_parse¢  sÚ  è è € ð,)	ØˆNˆNˆNà%Ð9¨Ô)9ˆKØÔ/ð  ðð ð ð ð ð ð ð ð ð ð ð ð0à˜Dð0ð (¨ð0ð *¨7ð	0ð
 % dð0ð '¨ð0ð %Ð&<ð0ð '¨ð0ð '¨ð0ð %Ð&<ð0ð '¨ð0ð '¨ð0ð & qð0ð )Ð*Dð0ð +Ð,Hð0ð  -¨að!0ð" /°ð#0ð$ /°ð%0ð& '(Ø()Ø()Ø $Ø!%ð/0ð 0ð 0�Ô,øøõ2 ð 	ð 	ð 	Ýð-ñô ð ð	øøøõ Ô ð 	ð 	Ø×!Ò!Ñ#Ô#ð  yØ”9Ð$Ø&˜'œ, yÑ1Ô1�C�Cà&˜'œ,¨iÀ%ÐHÑHÔH�CØÔ#ð 4Ø×$Ò$ T¤]Ñ3Ô3Ð3à )Ø(Ø$&ð ð  ð ×*Ò*¨3°Ñ5Ô5ñ	 6�ð
  "�Øð 
6ð 
6�DØ#×5Ò5°c¸4ÀÑMÔM×SÒSÑUÔU�HØ”y FÒ*Ð*Ý&Ø)1Ý%7Ø ,°¸¼Ð/DÑ Dñ&ô &ðñ ô ð ð ð ð ð %×+Ò+¨HÑ5Ô5Ð5Ð5à”9 Ò(Ð(Ý"Ø%)Ô%9×%>Ò%>¸|Ñ%LÔ%LÝ!3°LÑ!AÔ!Aðñ ô ð ð ð ð5ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sC   „A"A' Á'BÂG0Â%D'GÇG0ÇG	ÇG0ÇG	Ç G0Ç0G4Ç7G4r'  úpymupdf.Documentúpymupdf.PagerN   c                ó  —  |j         di i | j        ¥|¥¤Ž}|                      ||¦  «        }|                      |¦  «        }g }|r|                     |¦  «         |r|                     |¦  «         t          ||¦  «        }|S )a:  Get the text of the page using PyMuPDF and RapidOCR and issue a warning
        if it is empty.

        Args:
            doc: The PyMuPDF document object.
            page: The PyMuPDF page object.
            blob: The blob being parsed.

        Returns:
            str: The text content of the page.
        ry   )rD  rf  Ú_extract_images_from_pageÚ_extract_tables_from_pagerº   rˆ   )	r    r'  rP   rf  rp   rÀ   Útables_from_pagern   rƒ   s	            r9   r•  zPyMuPDFParser._get_page_content  s¢   € ð" '˜œÐMÐMÐ)L¨DÔ,<Ð)LÀÐ)LÐMÐMˆØ×9Ò9¸#¸tÑDÔDÐØ×9Ò9¸$Ñ?Ô?ÐØˆØð 	,Ø�MŠMÐ*Ñ+Ô+Ð+Øð 	,Ø�MŠMÐ*Ñ+Ô+Ð+Ý)¨&°.ÑAÔAˆàˆrL   r´   c                óÈ   ‡— t          i ddd|j        |j        t          ‰¦  «        dœ¥ˆfd„‰j        D ¦   «         ¥¦  «        }dD ]}|‰j        v r‰j        |         ||<   Œ|S )z×Extract metadata from the document and page.

        Args:
            doc: The PyMuPDF document object.
            blob: The blob being parsed.

        Returns:
            dict: The extracted metadata.
        r�  r/   )r=   r<   r?   r;   r[   r>   c                óz   •— i | ]7}t          ‰j        |         t          t          f¦  «        ¯)|‰j        |         “Œ8S ry   )rU   rM   r,   rW   ©r  rj   r'  s     €r9   ú
<dictcomp>z3PyMuPDFParser._extract_metadata.<locals>.<dictcomp>4  sK   ø€ ð ð ð àÝ! #¤,¨q¤/µC½°:Ñ>Ô>ðØ�s”| A”ðð ð rL   )ÚmodDateÚcreationDate)rl   r;   rµ   rM   )r    r'  r@   rM   rj   s    `   r9   r”  zPyMuPDFParser._extract_metadata   s¤   ø€ õ #ðà )Ø(Ø$&Ø"œkØ!%¤Ý#& s¡8¤8ðð ððð ð ð à œ\ðñ ô ðñ
ô 
ˆð" -ð 	.ð 	.ˆAØ�C”LÐ Ð Ø!œl¨1œo�˜‘øØˆrL   c                ó(  — | j         sdS ddl}|                     ¦   «         }g }|D �]+}| j         �r |d         } |j        ||¦  «        }t	          j        |j        t          j        ¬¦  «                             |j	        |j
        d¦  «        }	t          j        ¦   «         }
t          j        |
|	¦  «         |
                     ¦   «         j        dk    rŒ®t#          j        |
                     ¦   «         d¬¦  «        }t)          | j                              |¦  «        ¦  «        j        }|                     t1          ||| j        ¦  «        ¦  «         �Œ-t4                               t8                               t=          d|¦  «        ¦  «        ¬¦  «        S )	a	  Extract images from a PDF page and get the text using images_to_text.

        Args:
            doc: The PyMuPDF document object.
            page: The PyMuPDF page object.

        Returns:
            str: The extracted text from the images on the page.
        r/   r   NrÇ   rv   úapplication/x-npyrË   rÍ   )rŽ   rŽ  Ú
get_imagesÚPixmaprÕ   rÖ   ÚsamplesrØ   rÙ   rî   rï   rÝ   rÞ   Únumpyrâ   rã   rä   r   rå   ræ   rç   rÁ   r±   rº   rK   r�   rè   rB   ré   r4   r   )r    r'  rP   rŽ  Úimg_listr)   r7   ÚxrefÚpixÚimagerð   r@   rÎ   s                r9   r›  z'PyMuPDFParser._extract_images_from_page@  s„  € ð Ô!ð 	Ø�2Øˆˆˆà—?’?Ñ$Ô$ˆØˆØð 	ñ 	ˆCØÔ!ñ Ø˜1”v�Ø$�g”n S¨$Ñ/Ô/�Ýœ c¤k½¼ÐBÑBÔB×JÒJØ”J ¤	¨2ñô �õ !œj™lœl�Ý”
˜;¨Ñ.Ô.Ð.Ø×(Ò(Ñ*Ô*Ô1°QÒ6Ð6Øå”~Ø×(Ò(Ñ*Ô*Ð6Iðñ ô �õ " $Ô"4×"?Ò"?ÀÑ"EÔ"EÑFÔFÔS�
à—’Ý'¨¨j¸$Ô:RÑSÔSñô ð ùõ !×'Ò'Ý#×(Ò(­°°fÑ)=Ô)=Ñ>Ô>ð (ñ 
ô 
ð 	
rL   c                ó¼  — | j         €dS ddl}t           |j        j        |fi | j        pi ¤Ž¦  «        }|r¥| j         dk    r$t                               d„ |D ¦   «         ¦  «        S | j         dk    r$t                               d„ |D ¦   «         ¦  «        S | j         dk    r$t                               d	„ |D ¦   «         ¦  «        S t          d
| j         › d�¦  «        ‚dS )z³Extract tables from a PDF page.

        Args:
            page: The PyMuPDF page object.

        Returns:
            str: The extracted tables in the specified format.
        Nr/   r   ri  c                ó6   — g | ]}|                      ¦   «         ‘ŒS ry   )Úto_markdown©r  Útables     r9   ú
<listcomp>z;PyMuPDFParser._extract_tables_from_page.<locals>.<listcomp>|  s$   € Ð)WÐ)WÐ)WÀ%¨%×*;Ò*;Ñ*=Ô*=Ð)WÐ)WÐ)WrL   rI   c                ób   — g | ],}|                      ¦   «                              d d d ¬¦  «        ‘Œ-S )F)ÚheaderÚindexÚ	bold_rows)Ú	to_pandasÚto_htmlr±  s     r9   r³  z;PyMuPDFParser._extract_tables_from_page.<locals>.<listcomp>  sR   € ð ð ð ð "ð ŸšÑ)Ô)×1Ò1Ø#(Ø"'Ø&+ð 2ñ ô ðð ð rL   rj  c                ó`   — g | ]+}|                      ¦   «                              d d ¬¦  «        ‘Œ,S )F)rµ  r¶  )r¸  Úto_csvr±  s     r9   r³  z;PyMuPDFParser._extract_tables_from_page.<locals>.<listcomp>Š  sO   € ð ð ð ð
 "ð	 ŸšÑ)Ô)×0Ò0Ø#(Ø"'ð 1ñ ô ðð ð rL   zextract_tables z not implemented)	rd  rŽ  r  r²  Úfind_tablesre  Ú_JOIN_TABLESr4   rT   )r    rP   rŽ  Útables_lists       r9   rœ  z'PyMuPDFParser._extract_tables_from_pagej  s=  € ð ÔÐ&Ø�2ØˆˆˆåØ%ˆGŒMÔ% dÐSÐS¨tÔ/KÐ/QÈrÐSÐSñ
ô 
ˆð ð 	ØÔ" jÒ0Ð0Ý#×(Ò(Ð)WÐ)WÈ;Ð)WÑ)WÔ)WÑXÔXÐXØÔ$¨Ò.Ð.Ý#×(Ò(ðð ð &1ðñ ô ñ	ô 	ð 	ð Ô$¨Ò-Ð-Ý#×(Ò(ðð ð
 &1ðñ ô ñô ð õ !ØK dÔ&9ÐKÐKÐKñô ð ð ˆrrL   rñ   )rf  r™   r”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   rd  rg  re  r™   r+   r<  rò   rx   )r@   r   rf  r™   r+   r¢   )r'  r˜  rP   r™  rf  rN   r+   r,   )r'  r˜  r@   r   r+   r´   )r'  r˜  rP   r™  r+   r,   )rP   r™  r+   r,   )ró   rô   rõ   rö   Ú	threadingÚLockr�  r÷   rŸ   rÁ   rl  r•  r”  r›  rœ  rø   rù   s   @r9   rc  rc  '  s  ø€ € € € € ð2ð 2ðl ˆIŒNÑÔ€Eð 15Ø$ð;?ð
 #'Ø*0Ø7Ø7;ØKQØJNØ<@ð;?ð ;?ð ;?ð ;?ð ;?ð ;?ð ;?ð ;?ðz
ð 
ð 
ð 
ð 15ð_ð _ð _ð _ð _ðBð ð ð ð:ð ð ð ð@(
ð (
ð (
ð (
ðT,ð ,ð ,ð ,ð ,ð ,ð ,ð ,rL   rc  c                  ód   ‡ — e Zd ZdZ ej        ¦   «         Z	 dddedddœdˆ fd„Zdd„Z	dd„Z
ˆ xZS ) ÚPyPDFium2Parserao  Parse a blob from a PDF using `PyPDFium2` library.

    This class provides methods to parse a blob from a PDF document, supporting various
    configurations such as handling password-protected PDFs, extracting images, and
    defining extraction mode.
    It integrates the 'PyPDFium2' library for PDF processing and offers synchronous
    blob parsing.

    Examples:
        Setup:

        .. code-block:: bash

            pip install -U langchain-community pypdfium2

        Load a blob from a PDF file:

        .. code-block:: python

            from langchain_core.documents.base import Blob

            blob = Blob.from_path("./example_data/layout-parser-paper.pdf")

        Instantiate the parser:

        .. code-block:: python

            from langchain_community.document_loaders.parsers import PyPDFium2Parser

            parser = PyPDFium2Parser(
                # password=None,
                mode="page",
                pages_delimiter="
",
                # extract_images = True,
                # images_to_text = convert_images_to_text_with_tesseract(),
            )

        Lazily parse the blob:

        .. code-block:: python

            docs = []
            docs_lazy = parser.lazy_parse(blob)

            for doc in docs_lazy:
                docs.append(doc)
            print(docs[0].page_content[:100])
            print(docs[0].metadata)
    FNrP   r6   )r’   rŒ   r�   rŽ   r�   r”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   r+   r<  c               óæ   •— t          ¦   «                              ¦   «          |dvrt          d¦  «        ‚|| _        |r|st	          ¦   «         }|| _        || _        || _        || _        || _	        dS )uk  Initialize a parser based on PyPDFium2.

        Args:
            password: Optional password for opening encrypted PDFs.
            mode: The extraction mode, either "single" for the entire document or "page"
                for page-wise extraction.
            pages_delimiter: A string delimiter to separate pages in single-mode
                extraction.
            extract_images: Whether to extract images from the PDF.
            images_parser: Optional image blob parser.
            images_inner_format: The format for the parsed output.
                - "text" = return the content as is
                - "markdown-img" = wrap the content into an image markdown link, w/ link
                pointing to (`![body)(#)`]
                - "html-img" = wrap the content as the `alt` text of an tag and link to
                (`<img alt="{body}" src="#"/>`)
            extraction_mode: â€œplainâ€� for legacy functionality, â€œlayoutâ€� for experimental
                layout mode functionality
            extraction_kwargs: Optional additional parameters for the extraction
                process.

        Returns:
            This method does not directly return data. Use the `parse` or `lazy_parse`
            methods to retrieve parsed documents with content and metadata.

        Raises:
            ValueError: If the mode is not "single" or "page".
        r›   r�   N)
rž   rŸ   rT   r”   r   rŽ   r�   r’   rŒ   r�   )r    r”   r’   rŒ   r�   rŽ   r�   r¡   s          €r9   rŸ   zPyPDFium2Parser.__init__Ð  s…   ø€ õL 	‰Œ×ÒÑÔÐØÐ)Ð)Ð)ÝÐ:Ñ;Ô;Ð;Ø,ˆÔØð 	1 -ð 	1Ý.Ñ0Ô0ˆMØ*ˆÔØ#6ˆÔ Ø ˆŒØˆŒ	Ø.ˆÔÐÐrL   r@   r   r¢   c              #  óê  K  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY wt          j        5  |                     ¦   «         5 }d}	  |j        || j        d¬¦  «        }g }ddddœt          |                     ¦   «         ¦  «        z  }|j	        |d	<   t          |¦  «        |d
<   t          |¦  «        D �]\  }}|                     ¦   «         }	d                     |	                     ¦   «                              ¦   «         ¦  «        }
|	                     ¦   «          |                      |¦  «        }t%          |g|
¦  «                             ¦   «         }|                     ¦   «          | j        dk    rA|                     d¦  «        s|dz  }t-          |t/          i |¥d|i¥¦  «        ¬¦  «        V — Œÿ|                     |¦  «         �Œ| j        dk    r8t-          | j                             |¦  «        t/          |¦  «        ¬¦  «        V — |r|                     ¦   «          n# |r|                     ¦   «          w w xY wddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )r¤   r   NzKpypdfium2 package not found, please install it with `pip install pypdfium2`T)r’   Ú	autocloseÚ	PyPDFium2r/   r®   r;   r>   r0   rP   r°   rœ   )Ú	pypdfium2r2   rÂ  r�  r²   ÚPdfDocumentr’   rl   Úget_metadata_dictr;   rµ   r·   Úget_textpager4   Úget_text_rangeÚ
splitlinesÚcloser›  rˆ   rg   rŒ   r[  r   rX   rº   r�   )r    r@   rÇ  r[   r¼   r—  r½   r¿   rP   Ú	text_pagerp   Úimage_from_pagerƒ   s                r9   rÁ   zPyPDFium2Parser.lazy_parse  sƒ  è è € ð	ØÐÐÐÐøÝð 	ð 	ð 	Ýð+ñô ð ð	øøøõ Ô"ð 4	+ð 4	+Ø×!Ò!Ñ#Ô#ð 3+ yØ!�
ð1+Ø!6 Ô!6Ø!¨D¬MÀTð"ñ "ô "�Jð $&�Lð %0Ø#.Ø(*ð$ð $õ (¨
×(DÒ(DÑ(FÔ(FÑGÔGñ	$H�Lð
 .2¬[�L Ñ*Ý25°j±/´/�L Ñ/å-6°zÑ-BÔ-Bð :ñ :Ñ)˜ TØ$(×$5Ò$5Ñ$7Ô$7˜	Ø)-¯ªØ%×4Ò4Ñ6Ô6×AÒAÑCÔCñ*ô *˜ð "ŸšÑ)Ô)Ð)Ø*.×*HÒ*HÈÑ*NÔ*N˜Ý#9Ø,Ð-¨~ñ$ô $çš%™'œ'ð !ð Ÿ
š
™œ˜àœ9¨Ò.Ð.à#+×#4Ò#4°TÑ#:Ô#:ð 1Ø (¨DÑ 0 Ý"*Ø-5Ý);ð%&Ø*6ð%&à(.°ð%&ð %&ñ*"ô *"ð#ñ #ô #ð ð ð ð ð )×/Ò/°Ñ9Ô9Ð9Ñ9à”y HÒ,Ð,Ý&Ø)-Ô)=×)BÒ)BÀ<Ñ)PÔ)PÝ%7¸Ñ%EÔ%Eðñ ô ð ð ð ð
 "ð +Ø"×(Ò(Ñ*Ô*Ð*øøð "ð +Ø"×(Ò(Ñ*Ô*Ð*Ð*ð+øøøðe3+ð 3+ð 3+ñ 3+ô 3+ð 3+ð 3+ð 3+ð 3+ð 3+ð 3+øøøð 3+ð 3+ð 3+ð 3+ð4	+ð 4	+ð 4	+ñ 4	+ô 4	+ð 4	+ð 4	+ð 4	+ð 4	+ð 4	+ð 4	+ð 4	+øøøð 4	+ð 4	+ð 4	+ð 4	+ð 4	+ð 4	+sV   „	 ‰#²I(ÁIÁGH(ÈIÈ(IÉIÉI(ÉI	ÉI(ÉI	ÉI(É(I,É/I,úpypdfium2._helpers.page.PdfPagec                ó  — | j         sdS ddlm} t          |                     |j        f¬¦  «        ¦  «        }|sdS g }|D �]}t          j        ¦   «         }|                     ¦   «          	                    ¦   «         }|j
        dk     rŒHt          j        ||                     ¦   «          	                    ¦   «         ¦  «         t          j        |                     ¦   «         d¬¦  «        }t!          | j                              |¦  «        ¦  «        j        }	|                     t)          ||	| j        ¦  «        ¦  «         |                     ¦   «          �Œt.                               t2                               |¦  «        ¬¦  «        S )	rÄ   r/   r   N)r   r  r¥  rË   rÍ   )rŽ   Úpypdfium2.rawÚrawr  Úget_objectsÚFPDF_PAGEOBJ_IMAGErÝ   rÞ   Ú
get_bitmapÚto_numpyÚsizer©  râ   r   rå   ræ   rç   rÁ   r±   rº   rK   r�   rÍ  rè   rB   ré   r4   )
r    rP   Úpdfium_cr)   Ú
str_imagesr­  rð   rì   r@   Útext_from_images
             r9   r›  z)PyPDFium2Parser._extract_images_from_pageQ  so  € ð Ô!ð 	Ø�2à(Ð(Ð(Ð(Ð(Ð(å�d×&Ò&¨xÔ/JÐ.LÐ&ÑMÔMÑNÔNˆØð 	Ø�2Øˆ
Øð 	ñ 	ˆEÝœ*™,œ,ˆKØ×'Ò'Ñ)Ô)×2Ò2Ñ4Ô4ˆHØŒ}˜qÒ Ð ØÝŒJ�{ E×$4Ò$4Ñ$6Ô$6×$?Ò$?Ñ$AÔ$AÑBÔBÐBÝ”> +×"6Ò"6Ñ"8Ô"8ÐDWÐXÑXÔXˆDÝ" 4Ô#5×#@Ò#@ÀÑ#FÔ#FÑGÔGÔTˆOØ×ÒÝ# D¨/¸4Ô;SÑTÔTñô ð ð �KŠK‰MŒMˆM‰MÝ ×'Ò'µ<×3DÒ3DÀZÑ3PÔ3PÐ'ÑQÔQÐQrL   r`  )r”   rs   r’   rt   rŒ   r•   r�   r,   rŽ   r–   r�   r—   r+   r<  rò   )rP   rÐ  r+   r,   )ró   rô   rõ   rö   r¿  rÀ  r�  r÷   rŸ   rÁ   r›  rø   rù   s   @r9   rÂ  rÂ  ™  s´   ø€ € € € € ð0ð 0ðh ˆIŒNÑÔ€Eð  %ð0/ð #'Ø*0Ø7Ø7;ØKQð0/ð 0/ð 0/ð 0/ð 0/ð 0/ð 0/ð 0/ðdM+ð M+ð M+ð M+ð^Rð Rð Rð Rð Rð Rð Rð RrL   rÂ  c                  ó:   — e Zd ZdZ	 	 	 ddd„Zdd„Zdd„Zdd„ZdS )ÚPDFPlumberParserzParse `PDF` with `PDFPlumber`.NFrf  úOptional[Mapping[str, Any]]Údedupers   r”   r+   r<  c                óz   — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|pi | _        || _        || _        dS )zØInitialize the parser.

        Args:
            text_kwargs: Keyword arguments to pass to ``pdfplumber.Page.extract_text()``
            dedupe: Avoiding the error of duplicate characters if `dedupe=True`.
        r   NzEpillow package not found, please install it with `pip install pillow`)rÏ   r2   rf  rß  r”   )r    rf  rß  r”   rÏ   s        r9   rŸ   zPDFPlumberParser.__init__u  sf   € ð	ØˆJˆJˆJˆJøÝð 	ð 	ð 	ÝØWñô ð ð	øøøð 'Ð,¨"ˆÔØˆŒØ,ˆÔÐÐs   ‚ ‡!r@   r   r¢   c              #  óÈ   ‡ ‡‡K  — ddl }‰                     ¦   «         5 } |j        |¦  «        Šˆˆˆ fd„‰j        D ¦   «         E d{V —† ddd¦  «         dS # 1 swxY w Y   dS )úLazily parse the blob.r   Nc                ó  •— g | ]„}t          ‰                     |¦  «        d z   ‰                     |¦  «        z   t          ‰j        ‰j        |j        dz
  t          ‰j        ¦  «        dœfi ˆfd„‰j        D ¦   «         ¤Ž¬¦  «        ‘Œ…S )r0   r]   )r;   r[   rP   r>   c                ó|   •— i | ]8}t          ‰j        |         ¦  «        t          t          fv ¯*|‰j        |         “Œ9S ry   )rb   rM   r,   rW   r   s     €r9   r¡  z:PDFPlumberParser.lazy_parse.<locals>.<listcomp>.<dictcomp>ž  sH   ø€ ð ð ð à !Ý# C¤L°¤OÑ4Ô4½½c¸
ÐBÐBð ˜sœ|¨AœàBÐBÐBrL   r°   )	r   Ú_process_page_contentr›  r´   r;   r¿   rµ   r¶   rM   )r  rP   r@   r'  r    s     €€€r9   r³  z/PDFPlumberParser.lazy_parse.<locals>.<listcomp>’  sÔ   ø€ ð ð ð ð& õ% Ø!%×!;Ò!;¸DÑ!AÔ!AØñ"à×4Ò4°TÑ:Ô:ñ";õ "à&*¤kØ)-¬Ø$(Ô$4°qÑ$8Ý+.¨s¬y©>¬>ð	ð ðð ðð ð ð à%(¤\ðñ ô ðð ð	ñ ô ðð ð rL   )Ú
pdfplumberr²   rÜ   r¶   )r    r@   ræ  r[   r'  s   ``  @r9   rÁ   zPDFPlumberParser.lazy_parse‹  sð   øøøè è € àÐÐÐà×ÒÑÔð 	 9Ø!�*”/ )Ñ,Ô,ˆCðð ð ð ð ð ð&  œIð'ñ ô ð ð ð ð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ž,AÁAÁArP   úpdfplumber.page.Pager,   c                ó|   — | j         r$ |                     ¦   «         j        di | j        ¤ŽS  |j        di | j        ¤ŽS )z)Process the page content based on dedupe.ry   )rß  Údedupe_charsr©   rf  )r    rP   s     r9   rå  z&PDFPlumberParser._process_page_content¨  sQ   € àŒ;ð 	HØ3�4×$Ò$Ñ&Ô&Ô3ÐGÐG°dÔ6FÐGÐGÐGØ ˆtÔ Ð4Ð4 4Ô#3Ð4Ð4Ð4rL   c                óf  — ddl m} | j        sdS g }|j        D �]‰}|d         d         j        t
          v �r|d         d         dk    r‚|                     t          j        | 	                    d|d         d	         |d         d
         f|d          
                    ¦   «         ¦  «                             d¦  «        ¦  «        ¦  «         Œ²|                     t          j        |d          
                    ¦   «         t          j        ¬¦  «                             |d         d
         |d         d	         d¦  «        ¦  «         �Œ,|d         d         j        t          v r/|                     |d          
                    ¦   «         ¦  «         �Œut!          j        d¦  «         �Œ‹t%          |¦  «        S )z8Extract images from page and get the text with RapidOCR.r   rÅ   r/   r‹  ÚFilterÚBitsPerComponentr]   Ú1ÚWidthÚHeightÚLrÇ   rv   rÉ   )rÏ   rÆ   r”   r)   r  rÔ   rº   rÕ   rÛ   Ú	frombytesr×   ÚconvertrÖ   rØ   rÙ   rÚ   ÚwarningsÚwarnr:   )r    rP   rÆ   r)   r7   s        r9   r›  z*PDFPlumberParser._extract_images_from_page®  sª  € àÐÐÐÐÐàÔ"ð 	Ø�2àˆØ”;ð 	5ñ 	5ˆCØ�8Œ}˜XÔ&Ô+Õ/GÐGÑGØ�x”=Ð!3Ô4¸Ò9Ð9Ø—M’MÝœØ!ŸOšOØ #Ø!$ X¤¨wÔ!7¸¸X¼ÀxÔ9PÐ QØ # H¤× 6Ò 6Ñ 8Ô 8ñô ÷ &šg c™lœlñô ñô ð ð ð —M’MÝœ c¨(¤m×&<Ò&<Ñ&>Ô&>ÅbÄhÐOÑOÔO×WÒWØ œM¨(Ô3°S¸´]À7Ô5KÈRñô ñô ð ñ ð
 �X”˜xÔ(Ô-Õ1FÐFÐFØ—’˜c (œm×4Ò4Ñ6Ô6Ñ7Ô7Ð7Ñ7å”Ð3Ñ4Ô4Ð4Ñ4å0°Ñ8Ô8Ð8rL   )NFF)rf  rÞ  rß  rs   r”   rs   r+   r<  rò   )rP   rç  r+   r,   )ró   rô   rõ   rö   rŸ   rÁ   rå  r›  ry   rL   r9   rÝ  rÝ  r  sz   € € € € € Ø(Ð(ð 48ØØ$ð	-ð -ð -ð -ð -ð,ð ð ð ð:5ð 5ð 5ð 5ð9ð 9ð 9ð 9ð 9ð 9rL   rÝ  c                  ó.   — e Zd ZdZ	 	 dddœdd„Zdd„ZdS )ÚAmazonTextractPDFParsera—  Send `PDF` files to `Amazon Textract` and parse them.

    For parsing multi-page PDFs, they have to reside on S3.

    The AmazonTextractPDFLoader calls the
    [Amazon Textract Service](https://aws.amazon.com/textract/)
    to convert PDFs into a Document structure.
    Single and multi-page documents are supported with up to 3000 pages
    and 512 MB of size.

    For the call to be successful an AWS account is required,
    similar to the
    [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
    requirements.

    Besides the AWS configuration, it is very similar to the other PDF
    loaders, while also supporting JPEG, PNG and TIFF and non-native
    PDF formats.

    ```python
    from langchain_community.document_loaders import AmazonTextractPDFLoader
    loader=AmazonTextractPDFLoader("example_data/alejandro_rosalez_sample-small.jpeg")
    documents = loader.load()
    ```

    One feature is the linearization of the output.
    When using the features LAYOUT, FORMS or TABLES together with Textract

    ```python
    from langchain_community.document_loaders import AmazonTextractPDFLoader
    # you can mix and match each of the features
    loader=AmazonTextractPDFLoader(
        "example_data/alejandro_rosalez_sample-small.jpeg",
        textract_features=["TABLES", "LAYOUT"])
    documents = loader.load()
    ```

    it will generate output that formats the text in reading order and
    try to output the information in a tabular structure or
    output the key/value pairs with a colon (key: value).
    This helps most LLMs to achieve better accuracy when
    processing these texts.

    ``Document`` objects are returned with metadata that includes the ``source`` and
    a 1-based index of the page number in ``page``. Note that ``page`` represents
    the index of the result returned from Textract, not necessarily the as-written
    page number in the document.

    N)Úlinearization_configÚtextract_featuresúOptional[Sequence[int]]ÚclientúOptional[Any]r÷  ú!Optional[TextLinearizationConfig]r+   r<  c               óž  ‡— 	 ddl Šddlmc m} ‰| _        || _        |�ˆfd„|D ¦   «         | _        ng | _        |�|| _        n#| j                             dddd¬¦  «        | _        n# t          $ r t          d	¦  «        ‚w xY w|s>	 ddl
}|                     d
¦  «        | _        dS # t          $ r t          d¦  «        ‚w xY w|| _        dS )a5  Initializes the parser.

        Args:
            textract_features: Features to be used for extraction, each feature
                               should be passed as an int that conforms to the enum
                               `Textract_Features`, see `amazon-textract-caller` pkg
            client: boto3 textract client
            linearization_config: Config to be used for linearization of the output
                                  should be an instance of TextLinearizationConfig from
                                  the `textractor` pkg
        r   Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS ry   )ÚTextract_Features)r  ÚfÚtcs     €r9   r³  z4AmazonTextractPDFParser.__init__.<locals>.<listcomp>  s4   ø€ ð *ð *ð *Ø01�B×(Ò(¨Ñ+Ô+ð*ð *ð *rL   Tz# z## Ú*)Úhide_figure_layoutÚtitle_prefixÚsection_header_prefixÚlist_element_prefixz½Could not import amazon-textract-caller or amazon-textract-textractor python package. Please install it with `pip install amazon-textract-caller` & `pip install amazon-textract-textractor`.ÚtextractzRCould not import boto3 python package. Please install it with `pip install boto3`.)ÚtextractcallerÚtextractor.entities.documentÚentitiesÚdocumentr  Ú
textractorrø  r÷  r   r2   Úboto3rú  Úboto3_textract_client)r    rø  rú  r÷  r  r  r  s         @r9   rŸ   z AmazonTextractPDFParser.__init__  sb  ø€ ð&	Ø'Ð'Ð'Ð'Ø=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=àˆDŒGØ(ˆDŒOà Ð,ð*ð *ð *ð *Ø5Fð*ñ *ô *�Ô&Ð&ð *,�Ô&à#Ð/Ø,@�Ô)Ð)à,0¬O×,SÒ,SØ'+Ø!%Ø*/Ø(+ð	 -Tñ -ô -�Ô)øøõ ð 	ð 	ð 	Ýð<ñô ð ð	øøøð ð 	0ðØ���à-2¯\ª\¸*Ñ-EÔ-E�Ô*Ð*Ð*øÝð ð ð Ý!ðBñô ð ðøøøð *0ˆDÔ&Ð&Ð&s   ƒA%A) Á)BÂ	B) Â)Cr@   r   r¢   c              #  ól  K  — |j         r!t          t          |j         ¦  «        ¦  «        nd}|rL|j        dk    rA|j        r:| j                             t          |j         ¦  «        | j        | j        ¬¦  «        }nI| j                             | 	                    ¦   «         | j        | j        j
        j        | j        ¬¦  «        }| j        j                             |¦  «        }t          |j        ¦  «        D ]<\  }}t          |                     | j        ¬¦  «        |j        |dz   dœ¬¦  «        V — Œ=dS )	zùIterates over the Blob pages and returns an Iterator with a Document
        for each page, like the other parsers If multi-page document, blob.path
        has to be set to the S3 URI and for single page docs
        the blob.data is taken
        NÚs3)Úinput_documentÚfeaturesr  )r  r  Ú	call_moder  )Úconfigr]   ©r;   rP   r°   )Úpathr   r,   ÚschemeÚnetlocr  Úcall_textractrø  r  Úas_bytesÚTextract_Call_ModeÚ
FORCE_SYNCr  r   rÜ   r·   r¶   rD  r÷  r;   )r    r@   Úurl_parse_resultÚtextract_response_jsonr  ÚidxrP   s          r9   rÁ   z"AmazonTextractPDFParser.lazy_parseB  sT  è è € ð 8<´yÐJ�8¥C¨¬	¡N¤NÑ3Ô3Ð3ÀdÐð ð	à Ô'¨4Ò/Ð/Ø Ô'ð 0ð &*¤W×%:Ò%:Ý" 4¤9™~œ~ØÔ/Ø&*Ô&@ð &;ñ &ô &Ð"Ð"ð &*¤W×%:Ò%:Ø#Ÿ}š}™œØÔ/Øœ'Ô4Ô?Ø&*Ô&@ð	 &;ñ &ô &Ð"ð ”?Ô+×0Ò0Ð1GÑHÔHˆå" 8¤>Ñ2Ô2ð 	ð 	‰IˆC�ÝØ!Ÿ]š]°$Ô2K˜]ÑLÔLØ$(¤K¸¸q¹ÐAÐAðñ ô ð ð ð ð ð	ð 	rL   )NN)rø  rù  rú  rû  r÷  rü  r+   r<  rò   )ró   rô   rõ   rö   rŸ   rÁ   ry   rL   r9   rö  rö  Ð  sf   € € € € € ð0ð 0ðh 6:Ø $ð=0ð
 CGð=0ð =0ð =0ð =0ð =0ð =0ð~!ð !ð !ð !ð !ð !rL   rö  c                  ó*   — e Zd ZdZdd„Zdd„Zdd„ZdS )ÚDocumentIntelligenceParserzjLoads a PDF with Azure Document Intelligence
    (formerly Form Recognizer) and chunks at character level.rú  r   Úmodelr,   c                óJ   — t          j        d¦  «         || _        || _        d S )Na<  langchain_community.document_loaders.parsers.pdf.DocumentIntelligenceParserand langchain_community.document_loaders.pdf.DocumentIntelligenceLoader are deprecated. Please upgrade to langchain_community.document_loaders.DocumentIntelligenceLoader for any file parsing purpose using Azure Document Intelligence service.)ró  rô  rú  r"  )r    rú  r"  s      r9   rŸ   z#DocumentIntelligenceParser.__init__j  s/   € ÝŒðñ	
ô 	
ð 	
ð ˆŒØˆŒ
ˆ
ˆ
rL   r@   r   r8   r+   r¢   c              #  óª   K  — |j         D ]H}d                     d„ |j        D ¦   «         ¦  «        }t          ||j        |j        dœ¬¦  «        }|V — ŒId S )Nú c                ó   — g | ]	}|j         ‘Œ
S ry   )rA   )r  Úlines     r9   r³  z=DocumentIntelligenceParser._generate_docs.<locals>.<listcomp>x  s   € ÐAÐAÐA° ¤ÐAÐAÐArL   r  r°   )r¶   r4   rt  r   r;   r¿   )r    r@   r8   ÚprA   Úds         r9   Ú_generate_docsz)DocumentIntelligenceParser._generate_docsv  s{   è è € Ø”ð 
	ð 
	ˆAØ—h’hÐAÐA¸¼ÐAÑAÔAÑBÔBˆGåØ$à"œkØœMðð ðñ ô ˆAð ˆGˆGˆGˆGð
	ð 
	rL   c              #  ó  K  — |                      ¦   «         5 }| j                             | j        |¦  «        }|                     ¦   «         }|                      ||¦  «        }|E d{V —† ddd¦  «         dS # 1 swxY w Y   dS )râ  N)r²   rú  Úbegin_analyze_documentr"  r8   r*  )r    r@   Úfile_objÚpollerr8   Údocss         r9   rÁ   z%DocumentIntelligenceParser.lazy_parseƒ  sÇ   è è € ð ×ÒÑÔð 	 8Ø”[×7Ò7¸¼
ÀHÑMÔMˆFØ—]’]‘_”_ˆFà×&Ò& t¨VÑ4Ô4ˆDàˆOˆOˆOˆOˆOˆOˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   —AA7Á7A;Á>A;N)rú  r   r"  r,   )r@   r   r8   r   r+   r¢   rò   )ró   rô   rõ   rö   rŸ   r*  rÁ   ry   rL   r9   r!  r!  f  s\   € € € € € ðAð Að
ð 
ð 
ð 
ðð ð ð ð	ð 	ð 	ð 	ð 	ð 	rL   r!  )r)   r*   r+   r,   )r@   r   rA   r,   rB   r,   r+   r,   )rM   rN   r+   rN   )rn   ro   rp   r,   r+   r,   )Crö   Ú
__future__r   rI   rÝ   Úloggingr¿  ró  r   Úpathlibr   Útempfiler   Útypingr   r   r	   r
   r   r   r   r   r   r   r   Úurllib.parser   r©  rÕ   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   Ú1langchain_community.document_loaders.blob_loadersr   Ú3langchain_community.document_loaders.parsers.imagesr   r   ræ  rŽ  rª   rÇ  Ú)textractor.data.text_linearization_configr   rÚ   rÔ   r:   Ú	getLoggerró   rß   rè   ré   r½  r÷   rQ   rK   rX   rl   r}   rˆ   rŠ   rû   rc  rÂ  rÝ  rö  r!  ry   rL   r9   ú<module>r<     s  ðØ .Ð .à "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð "Ð !Ð !Ð !Ð !Ð !à €€€Ø Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -à DÐ DÐ DÐ DÐ DÐ DØ BÐ BÐ BÐ BÐ BÐ Bðð ð ð ð ð ð ð ð
 ð RØÐÐÐØ€N€N€NØ€L€L€LØÐÐÐØQÐQÐQÐQÐQÐQà9Ð9Ð9Ð ðð ð Ð ð"ð ð ð ð< 
ˆÔ	˜8Ñ	$Ô	$€à*Ð Ø€Ø€Ø!Ð àUÐUÐUÐ ðð ð ð ð,ð ð ð ð&#ð #ð #ð #ðN Ø
ðÐ ð2ð 2ð 2ð 2ðje
ð e
ð e
ð e
ð e
�.ñ e
ô e
ð e
ðPJð Jð Jð Jð J�^ñ Jô Jð JðZ
oð oð oð oð o�Nñ oô oð oðdVRð VRð VRð VRð VR�nñ VRô VRð VRðr[9ð [9ð [9ð [9ð [9�~ñ [9ô [9ð [9ð|Sð Sð Sð Sð S˜nñ Sô Sð Sðl&ð &ð &ð &ð & ñ &ô &ð &ð &ð &rL   