ó
    �®žj#  ã                   ó~  • S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJrJrJrJrJr  S SKJr  S S	KJr  S S
KJrJr  S SKJr  S SKJr  S SKJ r   S SK!J"r"  \ RF                  " \$5      r%Sr&\&\&4r'S\(\	\	4   S\(\)\)4   4S jr*S\R*                  S\(\)\)4   4S jr+ " S S\5      r, " S S\5      r-g)é    N)ÚIterable)ÚBytesIO)ÚPath)ÚSupportsFloat)ÚBoundingBoxÚCoordOriginÚSize)ÚBoundingRectangleÚPdfPageBoundaryTypeÚPdfPageGeometryÚSegmentedPdfPageÚTextCell)ÚImage)ÚAbstractDocumentBackend)ÚPdfDocumentBackendÚPdfPageBackend)ÚPdfBackendOptions)ÚInputFormat)ÚInputDocument)ÚDocumentLoadErrorg      R@ÚdpiÚreturnc                 ó¶  • [        U [        5      (       a  [        U 5      S:w  a  [        SU < 35      e [	        U S   5      [	        U S   5      p![        R                  " U5      (       a  [        R                  " U5      (       d  [        SU < 35      eUS::  d  US::  a  [        SU < 35      eX4$ ! [
        [        4 a  n[        SU < 35      UeS nAff = f)Né   zInvalid image DPI metadata: r   é   )Ú
isinstanceÚtupleÚlenÚ
ValueErrorÚfloatÚ	TypeErrorÚmathÚisfinite)r   Údpi_xÚdpi_yÚexcs       ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/backend/image_backend.pyÚ_validate_dpir(   "   sÑ   € Ü�cœ5×!Ñ!¤S¨£X°£]ÜÐ7¸±wÐ?Ó@Ð@ðJÜ˜S ™V“}¤e¨C°©F£mˆuô �=Š=˜×Ñ¤t§}¢}°U×';Ñ';ÜÐ7¸±wÐ?Ó@Ð@Ø�ƒz�U˜a“ZÜÐ7¸±wÐ?Ó@Ð@àˆ<Ðøô ”zÐ"ó JÜÐ7¸±wÐ?Ó@ÀcÐIûðJús   µB3 Â3CÃCÃCÚimagec                 ón   • U R                   R                  S5      n[        US;   a
  [        5      $ U5      $ )Nr   )N)r   r   )ÚinfoÚgetr(   Ú_DEFAULT_DPI)r)   r   s     r'   Ú_get_frame_dpir.   3   s.   € Ø
�*‰*�.‰.˜Ó
€CÜ¨°Ó)>œÓHÐHÀCÓHÐHó    c                   ó  • \ rS rSrS\R                  S\S\\\4   SS4S jr\	S\4S j5       r
S\4S	 jrS
\S\4S jrS\4S jrS\\   4S jrSS\S\\   4S jjr SS\S\S-  S\R                  4S jjrS\4S jrS rSrg)Ú_ImagePageBackendé8   r)   Úpage_nor   r   Nc                 óN   • Xl         X l        X0l        U R                   S LU l        g ©N)Ú_imageÚ_page_noÚ_dpiÚvalid)Úselfr)   r3   r   s       r'   Ú__init__Ú_ImagePageBackend.__init__9   s#   € ð +0ŒØŒØŒ	ØŸ;™;¨dÐ2ˆ�
r/   c                 ó    • U R                   S-   $ )Nr   )r7   ©r:   s    r'   r3   Ú_ImagePageBackend.page_noA   s   € à�}‰}˜qÑ Ð r/   c                 ó   • U R                   $ r5   )r9   r>   s    r'   Úis_validÚ_ImagePageBackend.is_validE   s   € Ø�z‰zÐr/   Úbboxc                 ó   • g)NÚ © )r:   rC   s     r'   Úget_text_in_rectÚ"_ImagePageBackend.get_text_in_rectH   s   € àr/   c                 óD  • U R                   c   eU R                  5       n[        SS[        UR                  5      [        UR
                  5      [        R                  S9n[        S[        R                  " U5      [        R                  UUUUUS9n[        U/ / / SSSS9$ )Nç        ©ÚlÚtÚrÚbÚcoord_origin)ÚangleÚrectÚboundary_typeÚart_bboxÚ
bleed_bboxÚ	crop_bboxÚ
media_bboxÚ	trim_bboxF)Ú	dimensionÚ
char_cellsÚ
word_cellsÚtextline_cellsÚ	has_charsÚ	has_wordsÚ	has_lines)r6   Úget_sizer   r    ÚwidthÚheightr   Ú
BOTTOMLEFTr   r
   Úfrom_bounding_boxr   ÚCROP_BOXr   )r:   Ú	page_sizerC   rY   s       r'   Úget_segmented_pageÚ$_ImagePageBackend.get_segmented_pageL   s©   € à�{‰{Ñ&Ð&Ð&Ø—M‘M“Oˆ	ÜØØÜ�I—O‘OÓ$Ü�I×$Ñ$Ó%Ü$×/Ñ/ñ
ˆô $ØÜ"×4Ò4°TÓ:Ü-×6Ñ6ØØØØØñ	
ˆ	ô  ØØØØØØØñ
ð 	
r/   c                 ó   • / $ r5   rF   r>   s    r'   Úget_text_cellsÚ _ImagePageBackend.get_text_cellsk   s   € àˆ	r/   Úscalec              #   óþ   #   • U R                   c   eU R                  5       n[        SS[        UR                  5      [        UR
                  5      [        R                  S9nUS:w  a  UR                  US9nUv •  g 7f)NrJ   rK   r   )rl   )	r6   r`   r   r    ra   rb   r   ÚTOPLEFTÚscaled)r:   rl   rf   Úfull_page_bboxs       r'   Úget_bitmap_rectsÚ"_ImagePageBackend.get_bitmap_rectso   su   é € à�{‰{Ñ&Ð&Ð&Ø—M‘M“Oˆ	Ü$ØØÜ�I—O‘OÓ$Ü�I×$Ñ$Ó%Ü$×,Ñ,ñ
ˆð �A‹:Ø+×2Ñ2¸Ð2Ð?ˆNØÓùs   ‚A;A=Úcropboxc                 óv  • U R                   c   eU R                  5       nUc  SSUR                  UR                  4u  pEpgOÌUR                  [
        R                  :w  a  UR                  UR                  5      nUR                  5       u  pEpg[        [        SU5      UR                  5      n[        [        SU5      UR                  5      n[        [        SU5      UR                  5      n[        [        SU5      UR                  5      n[        S[        Xd-
  U-  5      5      [        S[        Xu-
  U-  5      5      4nX@R                  S   -  [        -  XPR                  S   -  [        -  X`R                  S   -  [        -  XpR                  S   -  [        -  4n	X€R                   R                  :X  aP  U	SS[        U R                   R                  5      [        U R                   R                  5      4:X  a  U R                   $ U R                   R!                  U["        R$                  R&                  U	S9$ )NrJ   r   r   )ÚresampleÚbox)r6   r`   ra   rb   rP   r   rn   Úto_top_left_originÚas_tupleÚminÚmaxÚroundr8   Ú_POINTS_PER_INCHÚsizer    Úresizer   Ú
ResamplingÚLANCZOS)
r:   rl   rs   rf   ÚleftÚtopÚrightÚbottomÚtarget_sizeÚ
source_boxs
             r'   Úget_page_imageÚ _ImagePageBackend.get_page_image~   sð  € ð �{‰{Ñ&Ð&Ð&Ø—M‘M“Oˆ	à‰?Ø'*¨C°·±À)×BRÑBRÐ'RÑ$ˆD�u˜fà×#Ñ#¤{×':Ñ':Ó:Ø!×4Ñ4°Y×5EÑ5EÓF�Ø'.×'7Ñ'7Ó'9Ñ$ˆD�uÜ”s˜3 “~ y§¡Ó7ˆDÜ”c˜#˜s“m Y×%5Ñ%5Ó6ˆCÜœ˜C ›¨¯©Ó9ˆEÜœ˜S &Ó)¨9×+;Ñ+;Ó<ˆFô �”5˜%™,¨%Ñ/Ó0Ó1Ü�”5˜&™,¨%Ñ/Ó0Ó1ð
ˆð
 —9‘9˜Q‘<ÑÔ"2Ñ2Ø—)‘)˜A‘,ÑÔ!1Ñ1Ø—I‘I˜a‘LÑ Ô#3Ñ3Ø—Y‘Y˜q‘\Ñ!Ô$4Ñ4ð	
ˆ
ð Ÿ+™+×*Ñ*Ó*¨zØØÜ�$—+‘+×#Ñ#Ó$Ü�$—+‘+×$Ñ$Ó%ð	>
ó 0
ð —;‘;Ðà�{‰{×!Ñ!ØÜ×%Ñ%×-Ñ-Øð "ð 
ð 	
r/   c                 óà   • U R                   c   e[        U R                   R                  [        -  U R                  S   -  U R                   R
                  [        -  U R                  S   -  S9$ )Nr   r   )ra   rb   )r6   r	   ra   r|   r8   rb   r>   s    r'   r`   Ú_ImagePageBackend.get_size§   s_   € Ø�{‰{Ñ&Ð&Ð&ÜØ—+‘+×#Ñ#Ô&6Ñ6¸¿¹À1¹ÑEØ—;‘;×%Ñ%Ô(8Ñ8¸4¿9¹9ÀQ¹<ÑGñ
ð 	
r/   c                 ó   • S U l         g r5   )r6   r>   s    r'   ÚunloadÚ_ImagePageBackend.unload®   s	   € àˆ�r/   )r8   r6   r7   r9   )r   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Úintr   r    r;   Úpropertyr3   ÚboolrA   r   ÚstrrG   r   rg   r   r   rj   rq   r‡   r	   r`   rŒ   Ú__static_attributes__rF   r/   r'   r1   r1   8   sâ   † ð3Ø—[‘[ð3Ø+.ð3Ø5:¸5À%¸<Ñ5Hð3à	ô3ð ð!˜ó !ó ð!ð˜$ô ð [ð °Sô ð
Ð$4ô 
ð> ¨Ñ 2ô ñ eð °H¸[Ñ4Iõ ð  ?Cñ'
Øð'
Ø)4°tÑ);ð'
à	�‰õ'
ðR
˜$ô 
õr/   r1   c            	       ó¼   ^ • \ rS rSrSr SS\S\\-  S\S-  SS4S jjr	S\
4S	 jrS\4S
 jrS\S\4S jr\S\\   4S j5       r\S\
4S j5       rU 4S jrSrU =r$ )ÚImageDocumentBackendé³   u�  Image-native backend that bypasses pypdfium2.

Notes:
    - Subclasses PdfDocumentBackend to satisfy pipeline type checks.
    - Intentionally avoids calling PdfDocumentBackend.__init__ to skip
      the imageâ†’PDF conversion and any pypdfium2 usage.
    - Handles multi-page TIFF by extracting frames eagerly to separate
      Image objects to keep thread-safety when pages process in parallel.
NÚin_docÚpath_or_streamÚoptionsr   c                 óÔ  • Uc
  [        5       n[        R                  " XX#5        X0l        U R                  [
        R                  1;  a  [        SU R                   S35      e/ U l        / U l	         [        R                  " U R                  5       n[        USS5      nUS:”  a€  [        U5       Hp  nUR                  U5        U R                  R!                  [#        U5      5        U R                  R!                  UR%                  5       R'                  S5      5        Mr     ONU R                  R!                  [#        U5      5        U R                  R!                  UR'                  S5      5        S S S 5        g ! , (       d  f       g = f! [(         aO  nU R                   H  nUR+                  5         M     / U l        / U l	        [-        SU R.                   35      UeS nAff = f)NzIncompatible file format z$ was passed to ImageDocumentBackend.Ún_framesr   ÚRGBz"Could not load image for document )r   r   r;   rœ   Úinput_formatr   ÚIMAGEÚRuntimeErrorÚ_framesÚ
_frame_dpir   Úopenr›   ÚgetattrÚrangeÚseekÚappendr.   ÚcopyÚconvertÚ	ExceptionÚcloser   Úfile)	r:   rš   r›   rœ   ÚimgÚframe_countÚiÚeÚframes	            r'   r;   ÚImageDocumentBackend.__init__¾   s†  € ð ‰?Ü'Ó)ˆGä×(Ò(¨°~ÔOØ*1Œà×Ñ¤[×%6Ñ%6Ð$7Ó7ÜØ+¨D×,=Ñ,=Ð+>Ð>bÐcóð ð
 +-ˆŒØ57ˆŒð	Ü—’˜D×/Ñ/Ô0°Cô & c¨:°qÓ9�à “?Ü" ;Ö/˜ØŸ™ œØŸ™×.Ñ.¬~¸cÓ/BÔCØŸ™×+Ñ+¨C¯H©H«J×,>Ñ,>¸uÓ,EÖFò 0ð
 —O‘O×*Ñ*¬>¸#Ó+>Ô?Ø—L‘L×'Ñ'¨¯©°EÓ(:Ô;÷ 1×0Ö0ûô ó 	ØŸœ�Ø—‘–ñ &àˆDŒLØ ˆDŒOÜ#Ø4°T·Y±Y°KÐ@óàðûð	ús8   Á2 F ÂC"E=Å4F Å=
FÆF ÆF Æ
G'ÆA
G"Ç"G'c                 ó2   • [        U R                  5      S:„  $ )Nr   ©r   r£   r>   s    r'   rA   ÚImageDocumentBackend.is_validê   s   € Ü�4—<‘<Ó  1Ñ$Ð$r/   c                 ó,   • [        U R                  5      $ r5   r¶   r>   s    r'   Ú
page_countÚImageDocumentBackend.page_countí   s   € Ü�4—<‘<Ó Ð r/   r3   c                 ó®   • SUs=::  a  [        U R                  5      :  d  O  [        SU 35      e[        U R                  U   XR                  U   5      $ )Nr   zPage index out of range: )r   r£   Ú
IndexErrorr1   r¤   )r:   r3   s     r'   Ú	load_pageÚImageDocumentBackend.load_pageð   sO   € Ø�WÕ0œs 4§<¡<Ó0Õ0ÜÐ8¸¸	ÐBÓCÐCÜ Ø�L‰L˜Ñ! 7¯O©O¸GÑ,Dó
ð 	
r/   c                 ó$   • [         R                  1$ r5   )r   r¡   ©Úclss    r'   Úsupported_formatsÚ&ImageDocumentBackend.supported_formats÷   s   € ô ×!Ñ!Ð"Ð"r/   c                 ó   • g)NTrF   rÀ   s    r'   Úsupports_paginationÚ(ImageDocumentBackend.supports_paginationü   s   € àr/   c                 ó„   >• U R                    H  nUR                  5         M     / U l         / U l        [        TU ]  5         g r5   )r£   r­   r¤   ÚsuperrŒ   )r:   r³   Ú	__class__s     €r'   rŒ   ÚImageDocumentBackend.unload   s2   ø€ Ø—\”\ˆEØ�K‰KŽMñ "àˆŒØˆŒÜ‰‰Õr/   )r¤   r£   rœ   r5   )rŽ   r�   r�   r‘   Ú__doc__r   r   r   r   r;   r”   rA   r’   r¹   r1   r½   ÚclassmethodÚsetr   rÂ   rÅ   rŒ   r–   Ú__classcell__)rÉ   s   @r'   r˜   r˜   ³   s³   ø† ñð -1ñ	*àð*ð   $™ð*ð # TÑ)ð	*ð
 
õ*ðX%˜$ô %ð!˜Cô !ð
 ð 
Ð):ô 
ð ð# # kÑ"2ó #ó ð#ð ð Dó ó ð÷ó r/   r˜   ).Úloggingr"   Úcollections.abcr   Úior   Úpathlibr   Útypingr   Údocling_core.types.docr   r   r	   Údocling_core.types.doc.pager
   r   r   r   r   ÚPILr   Ú docling.backend.abstract_backendr   Údocling.backend.pdf_backendr   r   Ú!docling.datamodel.backend_optionsr   Údocling.datamodel.base_modelsr   Údocling.datamodel.documentr   Údocling.exceptionsr   Ú	getLoggerrŽ   Ú_logr|   r-   r   r    r(   r.   r1   r˜   rF   r/   r'   Ú<module>rß      sÈ   ðó Û Ý $Ý Ý Ý  ç AÑ A÷õ õ å Dß JÝ ?Ý 5Ý 4Ý 0à×Ò˜Ó"€àÐ Ø Ð"2Ð3€ð�u˜]¨MÐ9Ñ:ð ¸uÀUÈEÀ\Ñ?Rô ð"I˜%Ÿ+™+ð I¨%°°u°Ñ*=ô Iô
x˜ô xôvRÐ-õ Rr/   