ó
    �®žj·ð  ã            	       óÆ  • S r SSKr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JrJrJrJrJrJrJr  SSKJrJrJr  SSKJr  SS	KJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(  SS
K)J*r+  SSK,J-r-J.r.  SSK/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrNJOrOJPrPJQrQJRrRJSrSJTrTJUrUJVrVJWrWJXrX  \R²                  " \Z5      r[ " S S\-5      r\ " S S\-5      r] " S S\-5      r^ " S S\-5      r_ " S S\_5      r` " S S\5      ra " S S\-5      rb " S S\-5      rcS\cS\dS\bS S!4S" jreS#S$S \_\`-  4S% jrfS&\g\h\h\h\h4   S \4S' jriS&\g\h\h\h\h4   S \4S( jrjS)\ S \g\h\h\h\h4   4S* jrkS)\ S \!4S+ jrl\$RÚ                  S,   RÝ                  S-S.9roS \\\$\'4      4S/ jrpS \\"   4S0 jrqS \\%   4S1 jrrS \\   4S2 jrs SGS3\tS \\   4S4 jjru\ Rì                  S4S5\OS)\ S\bS-  S \&4S6 jjrwS5\OS \^4S7 jrxS5\OS)\ S \g\h\h4   4S8 jry " S9 S:5      rz " S; S<5      r{ " S= S>\-5      r| " S? S@5      r}SA\PS \P4SB jr~SA\PS S4SC jrSA\PS \P4SD jr€ " SE SF5      r�g)HzParser for PDF filesé    N)ÚIntEnum)ÚBytesIO)ÚPath)ÚAnyÚDictÚIteratorÚListÚOptionalÚSequenceÚTupleÚUnion)ÚBoundingBoxÚCoordOriginÚImageRefMode)ÚImageRef)ÚBitmapResourceÚBoundingRectangleÚ	ColorRGBAÚCoord2DÚPdfHyperlinkÚPdfMetaDataÚPdfPageBoundaryTypeÚPdfPageGeometryÚPdfShapeÚPdfTableOfContentsÚPdfTextCellÚ	PdfWidgetÚSegmentedPdfPageÚTextCellÚTextDirection)ÚImage)Ú	BaseModelÚ
ConfigDict)(ÚTIMING_KEY_CREATE_LINE_CELLSÚTIMING_KEY_CREATE_WORD_CELLSÚTIMING_KEY_DECODE_ANNOTSÚTIMING_KEY_DECODE_CONTENTSÚTIMING_KEY_DECODE_DIMENSIONSÚTIMING_KEY_DECODE_DOCUMENTÚTIMING_KEY_DECODE_FONTSÚTIMING_KEY_DECODE_FONTS_TOTALÚTIMING_KEY_DECODE_GRPHSÚTIMING_KEY_DECODE_GRPHS_TOTALÚTIMING_KEY_DECODE_PAGEÚTIMING_KEY_DECODE_RESOURCESÚTIMING_KEY_DECODE_XOBJECTSÚ TIMING_KEY_DECODE_XOBJECTS_TOTALÚTIMING_KEY_EXTRACT_ANNOTS_JSONÚ"TIMING_KEY_EXTRACT_DOC_ANNOTATIONSÚ(TIMING_KEY_PROCESS_DOCUMENT_FROM_BYTESIOÚ%TIMING_KEY_PROCESS_DOCUMENT_FROM_FILEÚTIMING_KEY_QPDF_PROCESSÚTIMING_KEY_ROTATE_CONTENTSÚTIMING_KEY_SANITISE_CONTENTSÚTIMING_KEY_SANITIZE_CELLSÚTIMING_KEY_SANITIZE_ORIENTATIONÚTIMING_KEY_TO_JSON_PAGEÚTIMING_PREFIX_DECODE_FONTÚTIMING_PREFIX_DECODE_GRPHÚTIMING_PREFIX_DECODE_PAGEÚTIMING_PREFIX_DECODE_XOBJECTÚTIMING_PREFIX_DECODING_PAGEÚDecodePageConfigÚPdfPageDecoderÚRenderConfigÚ_PageDecodeTimingsÚ_PageRenderTimingsÚ_threaded_pdf_parserÚ_threaded_pdf_rendererÚget_decode_page_timing_keysÚget_static_timing_keysÚis_static_timing_keyÚ
pdf_parserc                   ór   • \ rS rSr% Sr\" SS9r\\S'   Sr	\
S-  \S'   Sr\
S-  \S'   Sr\S    S-  \S	'   S
rg)ÚPdfTocEntryéP   a  PDF table of contents entry (recursive structure).

Attributes:
    title: The text of the TOC entry
    level: Nesting level in the hierarchy (0 for top level)
    page: Page number this entry points to (optional)
    children: Nested TOC entries (optional)
Úallow)ÚextraÚtitleNÚlevelÚpageÚchildren© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r#   Úmodel_configÚstrÚ__annotations__rR   ÚintrS   rT   r	   Ú__static_attributes__rU   ó    ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling_parse/pdf_parser.pyrM   rM   P   sH   ‡ ññ  GÑ,€LàƒJØ€Eˆ3�‰:ÓØ€Dˆ#�‰*ÓØ+/€Hˆd�=Ñ! DÑ(Ö/r`   rM   c                   óˆ   • \ rS rSr% Sr\" SSS9rSr\\	\
4   S-  \S'   Sr\	S-  \S'   Sr\	S-  \S	'   Sr\\   S-  \S
'   Srg)ÚPdfAnnotationséb   aÏ  PDF document annotations including form fields, language, metadata, and table of contents.

Attributes:
    form: AcroForm data containing interactive form fields (raw dict structure). None if no forms present.
    language: Document language code (e.g., 'en-US', 'fr-FR'). None if not specified.
    meta_xml: XMP metadata as XML string. None if no metadata present.
    table_of_contents: Document outline/bookmark structure as list of entries. None if no TOC.
TrO   )Úvalidate_assignmentrP   NÚformÚlanguageÚmeta_xmlÚtable_of_contentsrU   )rV   rW   rX   rY   rZ   r#   r[   rf   r   r\   r   r]   rg   rh   ri   r	   rM   r_   rU   r`   ra   rc   rc   b   s]   ‡ ññ °$¸gÑF€Là"&€Dˆ$ˆs�Cˆx‰.˜4Ñ
Ó&Ø€Hˆc�D‰jÓØ€Hˆc�D‰jÓØ26Ð�t˜KÑ(¨4Ñ/Ö6r`   rc   c                   ó2  • \ rS rSr% Sr\" SS9r0 r\\	\
4   \S'   0 r\\	\\
   4   \S'   S\
4S jrSS	\	S
\
S\
4S jjrS	\	S\\
   4S jrS	\	S\4S jrS	\	S\
4S jrS rS rS\\	\
4   4S jrS\\	\
4   4S jr\S\4S j5       r\S\\	   4S j5       rSrg)ÚTimingsét   a³  Timing information from PDF page parsing.

Provides detailed timing breakdown of the parsing process, useful for
performance analysis and optimization.

Attributes:
    data: Dictionary mapping operation names to elapsed time in seconds (summed).
        Common keys include:
        - 'decode_page': Total page decoding time
        - 'decode_dimensions': Time to parse page dimensions
        - 'decode_resources': Time to decode page resources (fonts, etc.)
        - 'decode_contents': Time to decode page content streams
        - 'decode_annots': Time to decode annotations
        - 'create_word_cells': Time to create word cells (if requested)
        - 'create_line_cells': Time to create line cells (if requested)
    raw_data: Dictionary mapping operation names to list of elapsed times.
        This is useful when an operation is repeated multiple times
        (e.g., decoding multiple fonts) and you want to see individual timings.
T©re   ÚdataÚraw_dataÚreturnc                 óH   • [        U R                  R                  5       5      $ )z%Get total time across all operations.)Úsumrn   Úvalues©Úselfs    ra   ÚtotalÚTimings.totalŽ   s   € ä�4—9‘9×#Ñ#Ó%Ó&Ð&r`   ÚkeyÚdefaultc                 ó8   • U R                   R                  X5      $ )z9Get timing for a specific operation (summed if repeated).)rn   Úget)ru   rx   ry   s      ra   r{   ÚTimings.get’   s   € à�y‰y�}‰}˜SÓ*Ð*r`   c                 ó:   • U R                   R                  U/ 5      $ )z/Get all timing values for a specific operation.)ro   r{   ©ru   rx   s     ra   Úget_allÚTimings.get_all–   s   € à�}‰}× Ñ   bÓ)Ð)r`   c                 óL   • [        U R                  R                  U/ 5      5      $ )z/Get the number of times an operation was timed.)Úlenro   r{   r~   s     ra   Ú	get_countÚTimings.get_countš   s   € ä�4—=‘=×$Ñ$ S¨"Ó-Ó.Ð.r`   c                 ó    • U R                   U   $ ©N©rn   r~   s     ra   Ú__getitem__ÚTimings.__getitem__ž   s   € Ø�y‰y˜‰~Ðr`   c                 ó6   • U R                   R                  5       $ )zGet all timing operation names.)rn   Úkeysrt   s    ra   r‹   ÚTimings.keys¡   s   € à�y‰y�~‰~ÓÐr`   c                 ó6   • U R                   R                  5       $ )z.Get all timing items as (name, seconds) pairs.)rn   Úitemsrt   s    ra   rŽ   ÚTimings.items¥   s   € à�y‰y�‰Ó Ð r`   c                 ó�   • U R                   R                  5        VVs0 s H  u  p[        U5      (       d  M  X_M     snn$ s  snnf )z'Get only static (constant) timing keys.©rn   rŽ   rJ   ©ru   ÚkÚvs      ra   Úget_static_timingsÚTimings.get_static_timings©   s5   € à!%§¡§¡Ô!2ÔNÒ!2™˜Ô6JÈ1×6M“�’Ñ!2ÒNÐNùÓNó
   žA¸Ac                 ó�   • U R                   R                  5        VVs0 s H  u  p[        U5      (       a  M  X_M     snn$ s  snnf )zGet only dynamic timing keys.r‘   r’   s      ra   Úget_dynamic_timingsÚTimings.get_dynamic_timings­   s5   € à!%§¡§¡Ô!2ÔRÒ!2™˜Ô:NÈq×:Q“�’Ñ!2ÒRÐRùÓRr—   c                  ó   • [        5       $ )z Get all static timing key names.)rI   rU   r`   ra   Ústatic_keysÚTimings.static_keys±   s   € ô &Ó'Ð'r`   c                  ó   • [        5       $ )zNGet timing keys used in decode_page method (in order, excluding global timer).)rH   rU   r`   ra   Údecode_page_keysÚTimings.decode_page_keys¶   s   € ô +Ó,Ð,r`   rU   N)ç        )rV   rW   rX   rY   rZ   r#   r[   rn   r   r\   Úfloatr]   ro   r	   rv   r{   r   r^   rƒ   rˆ   r‹   rŽ   r•   r™   ÚstaticmethodÚsetrœ   rŸ   r_   rU   r`   ra   rk   rk   t   s  ‡ ññ( °$Ñ7€Là€Dˆ$ˆs�EˆzÑ
ÓØ')€Hˆd�3˜˜U™Ð#Ñ$Ó)ð'�uô 'ñ+�sð + Uð +°Uõ +ð*˜3ð * 4¨¡;ô *ð/˜Sð / Sô /ð˜sð  uô ò ò!ðO D¨¨e¨Ñ$4ô OðS T¨#¨u¨*Ñ%5ô Sð ð(˜ó (ó ð(ð ð-˜d 3™ió -ó ó-r`   rk   c                   ól   • \ rS rSr% Sr\" SS9rSr\\	S'   Sr
\\	S'   Sr\\	S'   Sr\\	S	'   Sr\\	S
'   Srg)ÚPageDecodeTimingsé¼   z;Top-level timing breakdown for a threaded page decode task.Trm   r¡   Úmake_page_decoder_sÚdecode_page_sÚcreate_word_cells_sÚcreate_line_cells_sÚtotal_srU   N)rV   rW   rX   rY   rZ   r#   r[   r¨   r¢   r]   r©   rª   r«   r¬   r_   rU   r`   ra   r¦   r¦   ¼   sD   ‡ ÙEá°$Ñ7€Là!$Ð˜Ó$Ø€M�5ÓØ!$Ð˜Ó$Ø!$Ð˜Ó$Ø€GˆUÖr`   r¦   c                   ó(   • \ rS rSr% SrSr\\S'   Srg)ÚPageRenderTimingséÈ   z;Top-level timing breakdown for a threaded page render task.r¡   Úrender_page_srU   N)	rV   rW   rX   rY   rZ   r°   r¢   r]   r_   rU   r`   ra   r®   r®   È   s   ‡ ÙEà€M�5Ör`   r®   c                   ó$   • \ rS rSrSrSrSrSrSrg)ÚContentLeveléÎ   zQHow far a page entity travels. Ordered: SKIP < COMPUTE < COMPUTE_AND_MATERIALIZE.r   é   é   rU   N)	rV   rW   rX   rY   rZ   ÚSKIPÚCOMPUTEÚCOMPUTE_AND_MATERIALIZEr_   rU   r`   ra   r²   r²   Î   s   † Ù[à€DØ€GØÓr`   r²   c                   óþ   • \ rS rSr% Sr\" SS9r\R                  r	\\
S'   \R                  r\\
S'   \R                  r\\
S'   \R                  r\\
S'   \R                  r\\
S	'   Sr\\
S
'   S\\\\\\\4   4S jrSrg)ÚContentConfigéÖ   a%  Per-entity selection: skipped, computed-in-C++-only, or materialized.

Field name is the entity; the value is the lifecycle level. Set per call
on get_page (with a document-level default), so a page can be escalated to
a richer level on demand (e.g. surface word cells once a table is found).
Trm   Úchar_cells_content_levelÚword_cells_content_levelÚline_cells_content_levelÚshapes_content_levelÚbitmaps_content_levelÚinclude_bitmap_bytesrp   c                 óä   • [        U R                  5      [        U R                  5      [        U R                  5      [        U R                  5      [        U R
                  5      U R                  4$ r†   )r^   r¼   r½   r¾   r¿   rÀ   rÁ   rt   s    ra   Ú	cache_keyÚContentConfig.cache_keyê   s[   € ä�×-Ñ-Ó.Ü�×-Ñ-Ó.Ü�×-Ñ-Ó.Ü�×)Ñ)Ó*Ü�×*Ñ*Ó+Ø×%Ñ%ð
ð 	
r`   rU   N)rV   rW   rX   rY   rZ   r#   r[   r²   r¸   r¼   r]   r½   r¾   r¿   rÀ   rÁ   ÚboolÚtupler^   rÃ   r_   rU   r`   ra   rº   rº   Ö   s—   ‡ ññ °$Ñ7€Là-9×-QÑ-QÐ˜lÓQØ-9×-QÑ-QÐ˜lÓQØ-9×-QÑ-QÐ˜lÓQØ)5×)MÑ)MÐ˜,ÓMØ*6×*NÑ*NÐ˜<ÓNð 	ð ˜$ó ð
˜5  c¨3°°S¸$Ð!>Ñ?÷ 
r`   rº   c                   óê   • \ rS rSr% Sr\" SS9rSr\\	S'   Sr
\\	S'   Sr\\	S'   S	r\\	S
'   Sr\\	S'   S	r\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Srg)ÚDecodeConfigéõ   zâHow to compute page content (tuning, not selection).

Fixed when the document is opened; the C++ page-decoder cache freezes these
at first decode, so they cannot vary per page. Entity selection lives on
ContentConfig instead.
Trm   Údo_sanitizationÚenforce_same_fontg      ð?Úhorizontal_cell_toleranceg…ëQ¸Õ?Ú!word_space_width_factor_for_mergeÚ!line_space_width_factor_for_mergeÚ,line_space_width_factor_for_merge_with_spaceéÿÿÿÿÚmax_num_linesÚmax_num_bitmapsçü©ñÒMbP?Úmin_visible_clip_extentÚdo_thread_safer   Ú#release_native_memory_every_n_pagesÚapply_actual_textFÚkeep_glyphsÚkeep_qpdf_warningsrU   N)rV   rW   rX   rY   rZ   r#   r[   rÊ   rÅ   r]   rË   rÌ   r¢   rÍ   rÎ   rÏ   rÑ   r^   rÒ   rÔ   rÕ   rÖ   r×   rØ   rÙ   r_   rU   r`   ra   rÈ   rÈ   õ   s¨   ‡ ññ °$Ñ7€Là €O�TÓ Ø"Ð�tÓ"Ø'*Ð˜uÓ*Ø/3Ð% uÓ3Ø/2Ð% uÓ2Ø:>Ð0°%Ó>Ø€M�3ÓØ€O�SÓØ%)Ð˜UÓ)Ø€N�DÓØ/0Ð'¨Ó0Ø"Ð�tÓ"Ø€K�ÓØ$Ð˜Ö$r`   rÈ   Údecode_configÚpage_boundaryÚcontent_configrp   Ú_DecodePageConfigc                 óÀ  • [        5       nXl        U R                  Ul        U R                  Ul        U R                  Ul        U R
                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul	        U R                  Ul
        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        UR                   ["        R$                  :¬  Ul        UR(                  ["        R$                  :¬  Ul        UR,                  ["        R$                  :¬  Ul        UR0                  ["        R$                  :¬  Ul        UR4                  ["        R$                  :¬  Ul        UR4                  ["        R$                  :¬  =(       a    UR8                  Ul        U$ )zICompile the public decode and content configs into the C++ decode config.)rÝ   rÛ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÑ   rÒ   rÔ   rÕ   rÖ   r×   rØ   rÙ   r¼   r²   r·   Úkeep_char_cellsr½   Úcreate_word_cellsr¾   Úcreate_line_cellsr¿   Úkeep_shapesrÀ   Úkeep_bitmapsrÁ   Úextract_bitmap_pixels)rÚ   rÛ   rÜ   Úcpps       ra   Ú_compile_decode_configræ     s§  € ô Ó
€CØ%ÔØ'×7Ñ7€CÔØ)×;Ñ;€CÔØ$1×$KÑ$K€CÔ!à×7Ñ7ð Ô)ð 	×7Ñ7ð Ô)ð 	×BÑBð Ô4ð &×3Ñ3€CÔØ'×7Ñ7€CÔØ"/×"GÑ"G€CÔØ&×5Ñ5€CÔà×9Ñ9ð Ô+ð *×;Ñ;€CÔØ#×/Ñ/€C„OØ*×=Ñ=€CÔà×/Ñ/´<×3GÑ3GÑGð Ôð 	×/Ñ/´<×3GÑ3GÑGð Ôð 	×/Ñ/´<×3GÑ3GÑGð Ôð %×9Ñ9¼\×=QÑ=QÑQ€C„OØ%×;Ñ;¼|×?SÑ?SÑS€CÔð 	×,Ñ,´×0DÑ0DÑD÷ 	0Ø×/Ñ/ð Ôð €Jr`   Úraw_timingsz'_PageDecodeTimings | _PageRenderTimingsc                 óè   • U R                   U R                  U R                  U R                  U R                  S.n[        U [        5      (       a  [        S0 UDSU R                  0D6$ [        S0 UD6$ )zKCopy native threaded timing objects into the public Pydantic timing models.)r¨   r©   rª   r«   r¬   r°   rU   )
r¨   r©   rª   r«   r¬   Ú
isinstancerE   r®   r°   r¦   )rç   rn   s     ra   Ú_page_timings_from_rawrê   E  s{   € ð
  +×>Ñ>Ø$×2Ñ2Ø*×>Ñ>Ø*×>Ñ>Ø×&Ñ&ñ€Dô �+Ô1×2Ñ2Ü ñ 
Øñ
à%×3Ñ3ò
ð 	
ô Ñ$˜tÑ$Ð$r`   Úbboxc                 óp   • [        U S   U S   U S   U S   U S   U S   U S   U S   [        R                  S9	$ )Nr   r´   rµ   é   )	Úr_x0Úr_y0Úr_x1Úr_y1Úr_x2Úr_y2Úr_x3Úr_y3Úcoord_origin)r   r   Ú
BOTTOMLEFT©rë   s    ra   Ú_to_bounding_rectanglerù   X  sR   € ô Ø�!‰WØ�!‰WØ�!‰WØ�!‰WØ�!‰WØ�!‰WØ�!‰WØ�!‰WÜ ×+Ñ+ñ
ð 
r`   c                 óP   • [        U S   U S   U S   U S   [        R                  S9$ )Nr   r´   rµ   rí   )ÚlÚbÚrÚtrö   )r   r   r÷   rø   s    ra   Ú_to_bounding_boxrÿ   h  s4   € ÜØ
ˆq‰'Ø
ˆq‰'Ø
ˆq‰'Ø
ˆq‰'Ü ×+Ñ+ñð r`   Úboundary_typec                 ó–   • [        U R                  5       5      n[        U R                  5       5      nU[        R                  :X  a  U$ U$ r†   )rÆ   Úget_media_bboxÚget_crop_bboxr   Ú	MEDIA_BOX)Úpage_dimr   Ú
media_bboxÚ	crop_bboxs       ra   Ú_get_boundary_bboxr  r  sE   € ô �x×.Ñ.Ó0Ó1€JÜ�h×,Ñ,Ó.Ó/€IàÔ+×5Ñ5Ó5ØÐàÐr`   c                 ó$  • [        U R                  5       5      n[        U R                  5       5      n[        X5      n[	        U R                  5       U[        U5      [        U5      [        U5      [        U5      [        U5      [        U5      S9$ )N)Úangler   ÚrectÚart_bboxr  Ú	trim_bboxr  Ú
bleed_bbox)rÆ   r  r  r  r   Ú	get_anglerù   rÿ   )r  r   r  r  Úboundary_bboxs        ra   Ú_to_page_geometry_from_decoderr    s€   € ô �h×,Ñ,Ó.Ó/€IÜ�x×.Ñ.Ó0Ó1€JÜ& xÓ?€MäØ× Ñ Ó"Ø#Ü# MÓ2Ü! )Ó,Ü# JÓ/Ü" 9Ó-Ü" 9Ó-Ü# IÓ.ñ	ð 	r`   ÚrgbaT)Úcall_default_factoryc                 ó.  • / n[         n[        U 5       Hý  u  p4UR                  [        [	        UR
                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  S9UR                  5       UR                  UR                  UR                  UR                   UR"                  UR$                  (       a  [&        R(                  O[&        R*                  UUR,                  S9
5        Mÿ     U$ )N©rî   rï   rð   rñ   rò   ró   rô   rõ   )
r  r  ÚtextÚorigÚfont_keyÚ	font_nameÚwidgetÚtext_directionÚindexÚrendering_mode)Ú_PDF_TEXT_CELL_RGBA_DEFAULTÚ	enumerateÚappendr   r   rî   rï   rð   rñ   rò   ró   rô   rõ   Ú
model_copyr  r  r  r  Úleft_to_rightr    ÚLEFT_TO_RIGHTÚRIGHT_TO_LEFTr  )Úcells_containerÚresultÚrgba_defaultÚindÚcells        ra   Ú_to_cells_from_decoderr*  Ÿ  sÔ   € Ø13€FÜ.€Lä˜Ö/‰	ˆØ�‰ÜÜ&ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ñ	ð "×,Ñ,Ó.Ø—Y‘YØ—Y‘YØŸ™ØŸ.™.Ø—{‘{ð ×)×)ô "×/Ò/ä&×4Ñ4àØ#×2Ñ2ñ/ö	
ñ 0ð: €Mr`   c                 ó  • / n[        U 5       GHw  u  p#UR                  5       nUR                  5       nUR                  5       n[	        S[        U5      S5       GH&  nXgS-      nXgS-      n	/ n
[	        X‰5       H"  nU
R                  [        XK   X[   5      5        M$     UR                  5       nUR                  5       nUR                  [        UUU
UR                  5       UR                  5       UR                  5       UR                  5       UR                  5       UR!                  5       [#        UR%                  5       5      UR'                  5       [)        US   US   US   S9[)        US   US   US   S9S95        GM)     GMz     U$ )Nr   rµ   r´   )rý   Úgrü   )r  Ú	parent_idÚpointsÚhas_graphics_stateÚ
line_widthÚmiter_limitÚline_capÚ	line_joinÚ
dash_phaseÚ
dash_arrayÚflatnessÚrgb_strokingÚrgb_filling)r  Úget_xÚget_yÚget_iÚranger‚   r   r   Úget_rgb_stroking_opsÚget_rgb_filling_opsr   Úget_has_graphics_stateÚget_line_widthÚget_miter_limitÚget_line_capÚget_line_joinÚget_dash_phaseÚlistÚget_dash_arrayÚget_flatnessr   )Úshapes_containerr&  r(  ÚshapeÚx_coordsÚy_coordsÚindicesÚpair_idxÚi0Úi1r.  r“   Úrgb_sÚrgb_fs                 ra   Ú_to_shapes_from_decoderrR  Ã  sk  € Ø€FäÐ 0×1‰
ˆØ—;‘;“=ˆØ—;‘;“=ˆØ—+‘+“-ˆä˜a¤ W£¨q×1ˆHØ¨™lÑ+ˆBØ¨™lÑ+ˆBà$&ˆFÜ˜2–]�Ø—‘œg h¡k°8±;Ó?Ö@ñ #ð ×.Ñ.Ó0ˆEØ×-Ñ-Ó/ˆEà�M‰MÜØØ&Ø!Ø',×'CÑ'CÓ'EØ$×3Ñ3Ó5Ø %× 5Ñ 5Ó 7Ø"×/Ñ/Ó1Ø#×1Ñ1Ó3Ø$×3Ñ3Ó5Ü# E×$8Ñ$8Ó$:Ó;Ø"×/Ñ/Ó1Ü!*¨U°1©X¸¸q¹ÀUÈ1ÁXÑ!NÜ )¨E°!©H¸¸a¹ÀEÈ!ÁHÑ Mñ÷ô 2ñ 2ðD €Mr`   c                 óÀ  • / n[        U 5       HÌ  u  p#UR                  [        U[        UR                  UR
                  UR                  UR
                  UR                  UR                  UR                  UR                  S9UR                  =(       d    S UR                  =(       d    S UR                  =(       d    S UR                  =(       d    S S95        MÎ     U$ )Nr  )r  r  Úwidget_textÚwidget_descriptionÚwidget_field_nameÚwidget_field_type)r  r   r   r   Úx0Úy0Úx1Úy1r  ÚdescriptionÚ
field_nameÚ
field_type)Úwidgets_containerr&  r(  r  s       ra   Ú_to_widgets_from_decoderr`  ë  s¯   € Ø €Fä Ð!2Ö3‰ˆØ�‰ÜØÜ&ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ØŸ™ñ	ð #ŸK™K×/¨4Ø#)×#5Ñ#5×#=¸Ø"(×"3Ñ"3×";°tØ"(×"3Ñ"3×";°tñö	
ñ 4ð* €Mr`   c                 óH  • / n[        U 5       H�  u  p#UR                  [        U[        UR                  UR
                  UR                  UR
                  UR                  UR                  UR                  UR                  S9UR                  =(       d    S S95        M’     U$ )Nr  )r  r  Úuri)	r  r   r   r   rX  rY  rZ  r[  rb  )Úhyperlinks_containerr&  r(  Ú	hyperlinks       ra   Ú_to_hyperlinks_from_decoderre    s…   € Ø!#€Fä#Ð$8Ö9‰ˆØ�‰ÜØÜ&Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™Ø"Ÿ™ñ	ð —M‘M×) Tñö	
ñ :ð$ €Mr`   rÁ   c                 ó¢  • / n[        U 5       GH  u  p4[        USS5      (       d  M  S n[        R                  nUR                  nUR
                  nUR                  n	UR                  n
[        USS5      (       a0  UR                  nUR                  nUR                  n	UR                  n
U(       Ga>   UR                  5       nU(       Ga%  [        U5      S:”  Ga  UR                  5       nS nUS;   a   [        R                   " [#        U5      5      nOSUS;   aM  UR%                  5       nUR&                  nUR(                  nUS:”  a  US:”  a  [        R*                  " XïU4U5      nUb‡  UR,                  S:w  a  UR/                  S5      n[1        X—-
  5      nUS:”  a,  UR&                  S:”  a  [3        UR&                  S	-  U-  5      nOS
n[4        R6                  " UUS9n[        R8                  nURA                  [C        [        U5      [E        UUU	UU	U
UU
S9S UUS95        GM     U$ ! [:         a    [<        R?                  S5         N[f = f)NÚ
is_visibleTÚhas_visible_bboxFr   )ÚjpegÚjp2)ÚrawÚjbig2ÚRGBAg      R@éH   )ÚdpizDFailed to extract image data for bitmap, falling back to placeholderr  )r  r  rb  ÚimageÚmode)#r  Úgetattrr   ÚPLACEHOLDERrX  rY  rZ  r[  Ú
visible_x0Ú
visible_y0Ú
visible_x1Ú
visible_y1Úget_image_as_bytesr‚   Úget_image_formatÚPILImageÚopenr   Úget_pil_modeÚimage_widthÚimage_heightÚ	frombytesrq  ÚconvertÚabsÚroundr   Úfrom_pilÚEMBEDDEDÚ	ExceptionÚ_logÚdebugr   r   r   )Úimages_containerrÁ   r&  r(  rp  Ú	image_refrq  Úbbox_x0Úbbox_y0Úbbox_x1Úbbox_y1Úimage_bytesÚfmtÚ	pil_imageÚpil_modeÚwÚhÚ
bbox_widthro  s                      ra   Ú!_to_bitmap_resources_from_decoderr•    s5  € ð $&€FäÐ 0×1‰
ˆÜ�u˜l¨D×1Ñ1Ùàˆ	Ü×'Ñ'ˆØ—(‘(ˆØ—(‘(ˆØ—(‘(ˆØ—(‘(ˆä�5Ð,¨e×4Ñ4Ø×&Ñ&ˆGØ×&Ñ&ˆGØ×&Ñ&ˆGØ×&Ñ&ˆGçð"Ø#×6Ñ6Ó8�ç¤3 {Ó#3°aÔ#7Ø×0Ñ0Ó2�CØ7;�Ià˜oÓ-Ü$,§M¢M´'¸+Ó2FÓ$G™	ØÐ 0Ó0Ø#(×#5Ñ#5Ó#7˜Ø!×-Ñ-˜Ø!×.Ñ.˜Ø˜q›5 Q¨£UÜ(0×(:Ò(:Ø (¨a¨&°+ó)˜Ið !Ñ,Ø$Ÿ>™>¨VÓ3Ø(1×(9Ñ(9¸&Ó(A˜Iä%(¨Ñ):Ó%;˜
Ø%¨›>¨e×.?Ñ.?À!Ó.CÜ"'¨×(9Ñ(9¸DÑ(@À:Ñ(MÓ"N™Cà"$˜Cä$,×$5Ò$5°iÀSÑ$I˜	Ü+×4Ñ4˜ð 	�‰ÜÜ˜&“kÜ&Ø Ø Ø Ø Ø Ø Ø Ø ñ	ð ØØñ÷	
ñm 2ðR €Møô1 ó Ü—
‘
ØZöðús   Â5D=H,È,IÉIÚpage_decoderc                 ó’  • Uc
  [        5       n[        R                  nUR                  U:X  a  [	        U R                  5       5      O/ n[        [        U R                  5       U5      U/ / [        U5      S:„  UR                  U:X  a"  [        U R                  5       UR                  S9O/ UR                  U:X  a  [        U R!                  5       5      O/ [#        U R%                  5       5      ['        U R)                  5       5      S9	nUR*                  U:X  aP  U R-                  5       (       a;  [	        U R/                  5       5      Ul        [        UR0                  5      S:„  Ul        UR4                  U:X  aP  U R7                  5       (       a;  [	        U R9                  5       5      Ul        [        UR:                  5      S:„  Ul        U$ )z3Convert a C++ PdfPageDecoder to a SegmentedPdfPage.r   )rÁ   )	Ú	dimensionÚ
char_cellsÚ
word_cellsÚtextline_cellsÚ	has_charsÚbitmap_resourcesÚshapesÚwidgetsÚ
hyperlinks)rº   r²   r¸   r¼   r*  Úget_char_cellsr   r  Úget_page_dimensionr‚   rÀ   r•  Úget_page_imagesrÁ   r¿   rR  Úget_page_shapesr`  Úget_page_widgetsre  Úget_page_hyperlinksr½   Úhas_word_cellsÚget_word_cellsrš  Ú	has_wordsr¾   Úhas_line_cellsÚget_line_cellsr›  Ú	has_lines)r–  r   rÜ   ÚMATr™  Úsegmented_pages         ra   Úsegmented_page_from_decoderr¯  p  s¢  € ð ÑÜ&›ˆÜ
×
.Ñ
.€Cð ×2Ñ2°cÓ9ô 	˜|×:Ñ:Ó<Ô=àð ô &Ü0Ø×+Ñ+Ó-¨}ó
ð ØØÜ�j“/ AÑ%ð ×3Ñ3°sÓ:ô	 .Ø×,Ñ,Ó.Ø%3×%HÑ%Hòð
 ð ×2Ñ2°cÓ9ô $ L×$@Ñ$@Ó$BÔCàä(¨×)FÑ)FÓ)HÓIÜ.¨|×/OÑ/OÓ/QÓRñ-€Nð2 ×.Ñ.°#Ó5¸,×:UÑ:U×:WÑ:WÜ$:Ø×'Ñ'Ó)ó%
ˆÔ!ô $' ~×'@Ñ'@Ó#AÀAÑ#EˆÔ à×.Ñ.°#Ó5¸,×:UÑ:U×:WÑ:WÜ(>Ø×'Ñ'Ó)ó)
ˆÔ%ô $' ~×'DÑ'DÓ#EÈÑ#IˆÔ àÐr`   c                 ór   • [        [        U R                  5       5      [        U R                  5       5      S9$ )N©rn   ro   )rk   ÚdictÚget_timingsÚget_timings_raw)r–  s    ra   Ú_timings_from_decoderrµ  ¨  s1   € ÜÜ�,×*Ñ*Ó,Ó-Ü�l×2Ñ2Ó4Ó5ñð r`   c                 ó†   • [        U R                  5       U5      n[        US   US   -
  5      [        US   US   -
  5      4$ )Nrµ   r   rí   r´   )r  r¢  r�  )r–  r   rë   s      ra   Ú_page_size_from_decoderr·  ¯  sH   € ô ˜l×=Ñ=Ó?ÀÓO€DÜˆt�A‰w˜˜a™Ñ Ó!¤3 t¨A¡w°°a±Ñ'8Ó#9Ð9Ð9r`   c                   óÂ  • \ rS rSr\R
                  SS4SSS\S\S\S-  S\S-  4
S	 jjr	S
\
S\S\4S jrS\4S jrS\4S jrS\\
\
4   4S jrS\
4S jrS\S-  4S jrS\S-  4S jrSS.S\S-  S\\\
\4      4S jjrS\S\\   4S jrS\\   S\\   4S jr S\!S-  4S jr"SS.S
\
S\S-  S\4S jjr#SS.S
\
S\S-  S\\\$4   4S jjr% SS\S-  4S jjr&Sr'g) ÚPdfDocumenti·  NÚparserrK   rx   r   rÚ   rÜ   c                 ó  • Xl         X l        X0l        U=(       d
    [        5       R	                  5       U l        U=(       d
    [        5       R	                  5       U l        0 U l        0 U l	        S U l
        S U l        S U l        g r†   )Ú_parserÚ_keyÚ_boundary_typerÈ   r!  Ú_decode_configrº   Ú_content_configÚ_pagesÚ_decoded_content_configsÚ_tocÚ_metaÚ_annotations)ru   rº  rx   r   rÚ   rÜ   s         ra   Ú__init__ÚPdfDocument.__init__¸  sr   € ð $*ŒØŒ	Ø+ÔØ,×>´³×JÑJÓLˆÔØ .× A´-³/×MÑMÓOˆÔð ð 	Œð CEˆÔ%Ø/3ˆŒ	Ø)-ˆŒ
Ø37ˆÕr`   Úpage_norp   c           	      óì  • SUs=::  a  U R                  5       ::  d/  O  [        SU SU R                   SU R                  5        S35      eUS-
  nUR                  5       nU R                  R                  U5      nUGbs  UR                  [        R                  :¼  a  UR                  [        R                  :  Gd3  UR                  [        R                  :¼  a  UR                  [        R                  :  d÷  UR                  [        R                  :¼  a  UR                  [        R                  :  d»  UR                  [        R                  :¼  a  UR                  [        R                  :  d  UR                  [        R                  :¼  a  UR                  [        R                  :  dC  UR                  [        R                  :¼  Ga'  UR                  (       Ga  UR                  (       Gd  [        UR                  UR                  5      Ul        [        UR                  UR                  5      Ul	        [        UR                  UR                  5      Ul
        [        UR                  UR                  5      Ul        [        UR                  UR                  5      Ul        UR                  =(       d    UR                  Ul        U R                  R!                  U R                  US9  SnUc  UOUn[#        U R$                  U R&                  R(                  US9nU R                  R+                  U R                  X7S	9nUc  [        S
U 35      eUR                  5       U R                  U'   U$ )a  Return a C++ page-decoder that satisfies content_config.

The C++ page-decoder cache freezes config at first decode, so if the
cached decoder lacks cells this request needs, evict it and re-decode
with the union of old and new levels (capability grows monotonically).
r´   zincorrect page_no: z	 for key=z (min:1, max:Ú)N©rx   rS   ©rÚ   rÛ   rÜ   )rx   rS   ÚconfigzFailed to decode page )Únumber_of_pagesÚ
ValueErrorr½  r!  rÂ  r{   r¼   r²   r·   r½   r¾   r¿   rÀ   rÁ   Úmaxr¼  Úunload_document_pageræ   r¿  r¾  ÚvalueÚget_page_decoder)	ru   rÈ  rÜ   rS   ÚneededÚhaveÚdecode_content_configrå   Údecoders	            ra   Ú_ensure_page_decoderÚ PdfDocument._ensure_page_decoderÎ  sí  € ð �WÕ6 × 4Ñ 4Ó 6Õ6ÜØ% g Y¨i¸¿	¹	°{ð CØ#×3Ñ3Ó5Ð6°að9óð ð ˜‰{ˆØ×*Ñ*Ó,ˆØ×,Ñ,×0Ñ0°Ó9ˆàÒà×/Ñ/´<×3GÑ3GÓGØ×1Ñ1´L×4HÑ4HÔHð ×/Ñ/´<×3GÑ3GÓGØ×1Ñ1´L×4HÑ4HÓHð ×/Ñ/´<×3GÑ3GÓGØ×1Ñ1´L×4HÑ4HÓHð ×+Ñ+¬|×/CÑ/CÓCØ×-Ñ-´×0DÑ0DÓDð ×,Ñ,´×0DÑ0DÓDØ×.Ñ.´×1EÑ1EÓEð ×,Ñ,´×0DÑ0DÔDØ×/×/Ð/Ø×1×1Ð1ô /2Ø×/Ñ/°×1NÑ1Nó/ˆFÔ+ô /2Ø×/Ñ/°×1NÑ1Nó/ˆFÔ+ô /2Ø×/Ñ/°×1NÑ1Nó/ˆFÔ+ô +.Ø×+Ñ+¨T×-FÑ-Fó+ˆFÔ'ô ,/Ø×,Ñ,¨d×.HÑ.Hó,ˆFÔ(ð ×+Ñ+×H¨t×/HÑ/Hð Ô'ð �L‰L×-Ñ-°$·)±)À$Ð-ÑGØˆDà*.©,¡¸DÐÜ$Ø×-Ñ-Ø×-Ñ-×3Ñ3Ø0ñ
ˆð
 —,‘,×/Ñ/°D·I±IÀDÐ/ÐUˆØ‰?ÜÐ5°g°YÐ?Ó@Ð@Ø1F×1QÑ1QÓ1Sˆ×%Ñ% gÑ.Øˆr`   c                 óH   • U R                   R                  U R                  S9$ )N©rx   )r¼  Ú	is_loadedr½  rt   s    ra   rÜ  ÚPdfDocument.is_loaded  s   € Ø�|‰|×%Ñ%¨$¯)©)Ð%Ð4Ð4r`   c                 óà   • U R                   R                  5         U R                  R                  5         U R                  5       (       a%  U R                  R                  U R                  5      $ g©NF)rÁ  ÚclearrÂ  rÜ  r¼  Úunload_documentr½  rt   s    ra   ÚunloadÚPdfDocument.unload  sM   € Ø�‰×ÑÔØ×%Ñ%×+Ñ+Ô-à�>‰>×ÑØ—<‘<×/Ñ/°·	±	Ó:Ð:àr`   Ú
page_rangec                 ó†  • [        US   US   5       H¦  nUS:  a  [        R                  S5        U R                   Vs/ s H  o3S   U:X  d  M  UPM     nnU(       a?  US-
  nU R                  R                  U R                  US9  U H  nU R                  U	 M     U R                  R                  US5        M¨     gs  snf )z3unload page in range [page_range[0], page_range[1][r   r´   zpage_no should always be >=1!rË  N)	r<  r†  ÚerrorrÁ  r¼  rÑ  r½  rÂ  Úpop)ru   rä  rÈ  r“   Ú
cache_keysÚpage_nums         ra   Úunload_pagesÚPdfDocument.unload_pages(  s§   € ä˜Z¨™]¨J°q©MÖ:ˆGØ˜‹{Ü—
‘
Ð:Ô;à%)§[¢[ÓD¢[ °a±D¸G±OŸ!¡[ˆJÐDÞà" Q™;�Ø—‘×1Ñ1°d·i±iÀhÐ1ÑOÛ#�AØŸ™ Ašñ $à×)Ñ)×-Ñ-¨g°tÖ<ò ;ùò Es   ¿B>ÁB>c                 óˆ   • U R                  5       (       a#  U R                  R                  U R                  S9$ [	        S5      e)NrÛ  úThis document is not loaded.)rÜ  r¼  rÎ  r½  ÚRuntimeErrorrt   s    ra   rÎ  ÚPdfDocument.number_of_pages7  s7   € Ø�>‰>×ÑØ—<‘<×/Ñ/°D·I±IÐ/Ð>Ð>äÐ=Ó>Ð>r`   c                 ój  • U R                   b  U R                   $ U R                  5       (       a{  U R                  R                  U R                  S9nUc  U R                   $ [        U[        5      (       a(  [        US9U l         U R                   R                  5         U R                   $ [        S5      e)NrÛ  )Úxmlrí  )
rÄ  rÜ  r¼  Úget_meta_xmlr½  ré   r\   r   Ú
initialiserî  )ru   rñ  s     ra   Úget_metaÚPdfDocument.get_meta=  sŽ   € à�:‰:Ñ!Ø—:‘:Ðà�>‰>×ÑØ—,‘,×+Ñ+°·	±	Ð+Ð:ˆCà‰{Ø—z‘zÐ!ä˜#œs×#Ñ#Ü(¨SÑ1�”
Ø—
‘
×%Ñ%Ô'à—:‘:Ðô Ð=Ó>Ð>r`   c                 óH  • U R                  5       (       aƒ  U R                  R                  U R                  S9nUc  U R                  $ U R                  b  U R                  $ [        SS9U l        U R                  US9U R                  l        U R                  $ [        S5      e)NrÛ  z<root>©r  ©Útocrí  )	rÜ  r¼  Úget_table_of_contentsr½  rÃ  r   Ú_to_table_of_contentsrT   rî  )ru   rù  s     ra   rú  Ú!PdfDocument.get_table_of_contentsQ  s‰   € Ø�>‰>×ÑØ—,‘,×4Ñ4¸¿¹Ð4ÐCˆCà‰{Ø—y‘yÐ à�y‰yÑ$Ø—y‘yÐ ä*°Ñ9ˆDŒIØ!%×!;Ñ!;ÀÐ!;Ð!DˆD�I‰IÔà—9‘9ÐäÐ=Ó>Ð>r`   ©rÜ   c             #   ó€   #   • [        U R                  5       5       H  nUS-   U R                  US-   US94v •  M     g 7f©Nr´   rý  ©r<  rÎ  Úget_page©ru   rÜ   rÈ  s      ra   Úiterate_pagesÚPdfDocument.iterate_pagesb  sD   é € ô
 ˜T×1Ñ1Ó3Ö4ˆGà˜!‘Ø—‘˜g¨™k¸.�ÐIðô ò 5ùs   ‚<>rù  c                 ó�   • / nU H=  n[        US   S9nSU;   a  U R                  US   S9Ul        UR                  U5        M?     U$ )NrQ   r÷  rT   rø  )r   rû  rT   r   )ru   rù  r&  ÚitemÚsubtocs        ra   rû  Ú!PdfDocument._to_table_of_contentsm  sT   € àˆÛˆDÜ'¨T°'©]Ñ;ˆFØ˜TÓ!Ø"&×"<Ñ"<ÀÀjÑAQÐ"<Ð"R�”Ø�M‰M˜&Ö!ñ	 ð ˆr`   Útoc_listc                 ó  • / nU H|  n[        UR                  SS5      UR                  S5      UR                  S5      S9nUR                  S5      (       a  U R                  US   5      Ul        UR	                  U5        M~     U$ )z1Convert raw TOC dict list to PdfTocEntry objects.rQ   Ú rR   rS   )rQ   rR   rS   rT   )rM   r{   Ú_to_pdf_toc_entryrT   r   )ru   r	  r&  r  Úentrys        ra   r  ÚPdfDocument._to_pdf_toc_entryx  s|   € àˆÛˆDÜØ—h‘h˜w¨Ó+Ø—h‘h˜wÓ'Ø—X‘X˜fÓ%ñˆEð
 �x‰x˜
×#Ñ#Ø!%×!7Ñ!7¸¸ZÑ8HÓ!I�”Ø�M‰M˜%Ö ñ ð ˆr`   c                 óÄ  • U R                   b  U R                   $ U R                  5       (       a¨  U R                  R                  U R                  S9nUc  U R                   $ SnUR                  S5      (       a  U R                  US   5      n[        UR                  S5      UR                  S5      UR                  S5      US9U l         U R                   $ [        S5      e)	zÿGet document annotations including form fields, language, metadata, and TOC.

Returns:
    Optional[PdfAnnotations]: Annotations object with form, language, meta_xml,
        and table_of_contents fields. None if document is not loaded or no annotations.
NrÛ  ri   rf   rg   rh   )rf   rg   rh   ri   rí  )	rÅ  rÜ  r¼  Úget_annotationsr½  r{   r  rc   rî  )ru   Úannots_dictÚtoc_entriess      ra   r  ÚPdfDocument.get_annotations†  sÑ   € ð ×ÑÑ(Ø×$Ñ$Ð$à�>‰>×ÑØŸ,™,×6Ñ6¸4¿9¹9Ð6ÐEˆKàÑ"Ø×(Ñ(Ð(ð ˆKØ�‰Ð2×3Ñ3Ø"×4Ñ4°[ÐATÑ5UÓV�ä .Ø —_‘_ VÓ,Ø$Ÿ™¨Ó4Ø$Ÿ™¨Ó4Ø"-ñ	!ˆDÔð ×$Ñ$Ð$äÐ=Ó>Ð>r`   c                óø   • U=(       d    U R                   nXR                  5       4nX@R                  ;   a  U R                  U   $ U R                  X5      n[	        XPR
                  U5      nX`R                  U'   U$ )z¾Get a page as SegmentedPdfPage (zero-copy from C++).

content_config overrides the document default for this page; requesting
a richer level than was previously decoded re-decodes the page.
)rÀ  rÃ   rÁ  rØ  r¯  r¾  )ru   rÈ  rÜ   ÚccrÃ   r×  rS   s          ra   r  ÚPdfDocument.get_page¦  sn   € ð ×3˜t×3Ñ3ˆØŸl™l›nÐ-ˆ	ØŸ™Ó#Ø—;‘;˜yÑ)Ð)à×+Ñ+¨GÓ8ˆÜ*¨7×4GÑ4GÈÓLˆØ!%�‰�IÑØˆr`   c                ó²  • U=(       d    U R                   nSUs=::  a  U R                  5       ::  aF  O  OCU R                  R                  U R                  US-
  S9  U R
                  R                  US5        U R                  X5      n[        X@R                  U5      n[        [        UR                  5       5      [        UR                  5       5      S9nXV4$ )zØGet a page along with timing information.

Forces a fresh decode (evicting any cached native decoder for the page)
so the returned timings reflect actual decode work, and does not store
the result in the page cache.
r´   rË  Nr±  )rÀ  rÎ  r¼  rÑ  r½  rÂ  rç  rØ  r¯  r¾  rk   r²  r³  r´  )ru   rÈ  rÜ   r  r×  r®  Útimingss          ra   Úget_page_with_timingsÚ!PdfDocument.get_page_with_timings»  s¹   € ð ×3˜t×3Ñ3ˆØ�Õ1˜4×/Ñ/Ó1Ö1Ø�L‰L×-Ñ-°$·)±)À'ÈAÁ+Ð-ÑNØ×)Ñ)×-Ñ-¨g°tÔ<Ø×+Ñ+¨GÓ8ˆÜ4°W×>QÑ>QÐSUÓVˆÜÜ�g×)Ñ)Ó+Ó,Ü˜'×1Ñ1Ó3Ó4ñ
ˆð Ð&Ð&r`   c                 ój   • [        SU R                  5       S-   5       H  nU R                  X!S9  M     g rÿ  r   r  s      ra   Úload_all_pagesÚPdfDocument.load_all_pagesÓ  s1   € ô ˜Q × 4Ñ 4Ó 6¸Ñ :Ö;ˆGØ�M‰M˜'ˆMÓAò <r`   )
rÅ  r¾  rÀ  r¿  rÂ  r½  rÄ  rÁ  r¼  rÃ  r†   )(rV   rW   rX   rY   r   ÚCROP_BOXr\   rÈ   rº   rÆ  r^   rB   rØ  rÅ   rÜ  râ  rÆ   rê  rÎ  r   rô  r   rú  r   r   r   r  r²  r	   rû  r   rM   r  rc   r  r  rk   r  r  r_   rU   r`   ra   r¹  r¹  ·  sÊ  † ð
 .A×-IÑ-IØ-1Ø/3ñ8àð8ð ð8ð +ð	8ð
 $ dÑ*ð8ð &¨Ñ,õ8ð,LØðLØ,9ðLà	ôLð\5˜4ô 5ð˜ô ð= u¨S°#¨X¡ô =ð? ô ?ð?˜+¨Ñ,ô ?ð(?Ð'9¸DÑ'@ô ?ð( 04ò	ð &¨Ñ,ð	ð 
�%˜Ð-Ð-Ñ.Ñ	/õ		ð	¨ð 	°$Ð7IÑ2Jô 	ð¨$¨t©*ð ¸¸kÑ9Jô ð? °$Ñ!6ô ?ðH 04ò	àðð &¨Ñ,ð	ð
 
õð2 04ò	'àð'ð &¨Ñ,ð	'ð
 
Ð Ð(Ñ	)õ'ð4 04ñBà%¨Ñ,÷Bð Br`   r¹  c                   ó  • \ rS rSrSS\4S jjrS\4S jrS\\   4S jrS\	R                  SSS4S	\\\\4   S
\S\	S\S-  S\S-  S\S-  S\4S jjr  SS\S\S\S-  S\S\4
S jjr  SS\S\S\S-  S\S\4
S jjrSrg)ÚDoclingPdfParseriÛ  Úloglevelc                 ó    • [        US9U l        g)zœ
Set the log level using a string label.

Parameters:
    level (str): Logging level as a string.
             One of ['fatal', 'error', 'warning', 'info']
©rR   N)rK   rº  ©ru   r!  s     ra   rÆ  ÚDoclingPdfParser.__init__Ü  s   € ô ! xÑ0ˆ�r`   c                 ó6   • U R                   R                  US9  g)zžSet the log level using a string label.

Parameters:
level (str): Logging level as a string.
             One of ['fatal', 'error', 'warning', 'info']
   )")
r#  N)rº  Úset_loglevel_with_labelr$  s     ra   Úset_loglevelÚDoclingPdfParser.set_loglevelæ  s   € ð 	�‰×+Ñ+°(Ð+Ò;r`   rp   c                 ó6   • U R                   R                  5       $ )zsList the keys of the loaded documents.

Returns:
    List[str]: A list of keys for the currently loaded documents.
)rº  Úlist_loaded_keysrt   s    ra   r+  Ú!DoclingPdfParser.list_loaded_keysð  s   € ð �{‰{×+Ñ+Ó-Ð-r`   TNÚpath_or_streamÚlazyr   ÚpasswordrÚ   rÜ   c                 óÐ  • [        U[        5      (       a  [        U5      nU=(       d
    [        5       n[        U[        5      (       a,  SU< 3nU R	                  U[        U5      UUR
                  S9n	O®[        U[        5      (       a™  [        R                  " SS9n
UR                  S5      =n(       a+  U
R                  U5        UR                  S5      =n(       a  M+  UR                  S5        U
R                  5       nSU 3nU R                  UUUUR
                  S9n	W	(       a0  [        U R                  WUUUS9nU(       d  UR!                  5         U$ [#        S	W 35      e)
Núkey=©rx   Úfilenamer/  rÙ   F©Úusedforsecurityé    r   )rx   rn   r/  rÙ   )rº  rx   r   rÚ   rÜ   ú!Failed to load document with key )ré   r\   r   rÈ   Ú_load_documentrÙ   r   ÚhashlibÚsha256ÚreadÚupdateÚseekÚ	hexdigestÚ_load_document_from_bytesior¹  rº  r  rî  )ru   r-  r.  r   r/  rÚ   rÜ   Úeffective_decode_configrx   ÚsuccessÚhasherÚchunkÚhashÚ
result_docs                 ra   ÚloadÚDoclingPdfParser.loadø  s_  € ô �n¤c×*Ñ*Ü! .Ó1ˆNà"/×"A´<³>Ðä�n¤d×+Ñ+Ø˜Ñ*Ð+ˆCØ×)Ñ)ØÜ˜^Ó,Ø!Ø#:×#MÑ#Mð	 *ð ‰Gô ˜¬×0Ñ0Ü—^’^°EÑ:ˆFà)×.Ñ.¨tÓ4Ð4�%Õ4Ø—‘˜eÔ$ð *×.Ñ.¨tÓ4Ð4�%×4à×Ñ Ô"Ø×#Ñ#Ó%ˆDà˜˜�-ˆCØ×6Ñ6ØØ#Ø!Ø#:×#MÑ#Mð	 7ð ˆGö Ü$Ø—{‘{ØØ+Ø5Ø-ñˆJö Ø×)Ñ)Ô+àÐäÐ!BÀ3À%ÐHÓIÐIr`   rx   r3  rÙ   c                 óX   • U R                   R                  UUR                  S5      UUS9$ )aH  Load a document by key and filename.

Parameters:
    key (str): The unique key to identify the document.
    filename (str): The path to the document file to load.
    password (str, optional): Optional password for password-protected files

Returns:
    bool: True if the document was successfully loaded, False otherwise.)")
Úutf8r2  )rº  Úload_documentÚencode)ru   rx   r3  r/  rÙ   s        ra   r8  ÚDoclingPdfParser._load_document/  s5   € ð" �{‰{×(Ñ(ØØ—_‘_ VÓ,ØØ1ð	 )ð 
ð 	
r`   rn   c                 ó:   • U R                   R                  UUUUS9$ )a  Load a document by key from a BytesIO-like object.

Parameters:
    key (str): The unique key to identify the document.
     bytes_io (Any): A BytesIO-like object containing the document data.

Returns:
     bool: True if the document was successfully loaded, False otherwise.)")
)rx   Úbytes_ior/  rÙ   )rº  Úload_document_from_bytesio)ru   rx   rn   r/  rÙ   s        ra   r?  Ú,DoclingPdfParser._load_document_from_bytesioG  s,   € ð  �{‰{×5Ñ5ØØØØ1ð	 6ð 
ð 	
r`   )rº  )Úfatalrß  )rV   rW   rX   rY   r\   rÆ  r(  r	   r+  r   r  r   r   r   rÅ   rÈ   rº   r¹  rF  r8  r?  r_   rU   r`   ra   r   r   Û  s4  † ñ1 õ 1ð< Sô <ð. $ s¡)ô .ð Ø-@×-IÑ-IØ#Ø-1Ø/3ñ5Jà˜c 4¨Ð0Ñ1ð5Jð ð5Jð +ð	5Jð
 ˜‘*ð5Jð $ dÑ*ð5Jð &¨Ñ,ð5Jð 
õ5Jðv  $Ø#(ñ
àð
ð ð
ð ˜‘*ð	
ð
 !ð
ð 
õ
ð8  $Ø#(ñ
àð
ð ð
ð ˜‘*ð	
ð
 !ð
ð 
÷
ð 
r`   r   c                   óš   • \ rS rSr% Sr\" SS9rSr\\	S'   Sr
\\	S'   S	r\\	S
'   \R                  r\\	S'   Sr\S-  \	S'   Sr\S-  \	S'   Srg)ÚThreadedPdfParserConfigi_  a£  Configuration for the threaded PDF parser.

Attributes:
    loglevel: Logging level ('fatal', 'error', 'warning', 'info').
    threads: Number of worker threads for parallel page decoding.
    max_concurrent_results: Maximum results buffered before workers pause.
    boundary_type: Page boundary used for geometry conversion and page sizing.
    render_config: Optional render configuration for parse-and-render mode.
T)Úarbitrary_types_allowedrQ  r!  é   Úthreadsé    Úmax_concurrent_resultsr   NÚrender_configÚpage_content_configrU   )rV   rW   rX   rY   rZ   r#   r[   r!  r\   r]   rV  r^   rX  r   r  r   rY  rC   rZ  rº   r_   rU   r`   ra   rS  rS  _  sb   ‡ ññ °dÑ;€Là€HˆcÓØ€GˆSÓØ"$Ð˜CÓ$Ø)<×)EÑ)E€MÐ&ÓEØ)-€M�< $Ñ&Ó-Ø04Ð˜¨Ñ-Ö4r`   rS  c                   óÚ  • \ rS rSrSrS\S\S-  S\S\4S jr\	S	\
4S
 j5       r\	S	\4S j5       rS	\4S jr S3S\S-  S	\4S jjrS	\4S jrS	\4S jrSSSS.S\S\
S\
S\
S	\
4
S jjrSSSS.S\
S\
S\S	\\   4S jjrSS.S\S	\\   4S  jjrS	\4S! jrS	\\\4   4S" jrS	\4S# jr\ S$\!S%\"\   S	\#RH                  4S& j5       r%S	\#RH                  4S' jr&S(\S	\#RH                  4S) jr'S*\\\4   S	\#RH                  4S+ jr(S,\#RH                  S-\S-  S	\#RH                  4S. jr)   S4S(\S-  S*\\\4   S-  S-\S-  S	\#RH                  4S/ jjr*S	\+\\,4   4S0 jr-S	\\+\\,4      4S1 jr.S2r/g)5ÚPageParseResultit  z:Outcome of one page processed by DoclingThreadedPdfParser.r   rY  NrÜ   Úbatch_content_configc                óF  • Xl         X l        X0l        X@l        XPl        0 U l        S U l        S U l        UR                  U l        UR                  S-   U l	        UR                  U l
        U R                  (       ap  UR                  5       u  U l        n[        U R                  5      U l        [        UR                  5      U l        [!        U R                  U5      u  U l        U l        g ['        5       U l        [        UR                  5      U l        SU l        SU l        g )Nr´   r¡   )Ú_rawr¾  Ú_render_configrÀ  Ú_batch_content_configrÁ  Ú_page_decoderÚ_default_imageÚdoc_keyÚpage_numberrA  r{   rµ  Ú_timingsrê   r  r·  Ú
page_widthÚpage_heightrk   )ru   Ú
raw_resultr   rY  rÜ   r]  Ú_s          ra   rÆ  ÚPageParseResult.__init__w  sï   € ð Œ	Ø+ÔØ+ÔØ-ÔØ%9Ô"ØTVˆŒØ48ˆÔØ59ˆÔà&×.Ñ.ˆŒØ *× 6Ñ 6¸Ñ :ˆÔØ'×/Ñ/ˆŒà�<�<Ø$.§N¡NÓ$4Ñ!ˆDÔ Ü1°$×2DÑ2DÓEˆDŒMÜ1°*×2DÑ2DÓEˆDŒLÜ0GØ×"Ñ" Mó1Ñ-ˆDŒO˜TÕ-ô $›IˆDŒMÜ1°*×2DÑ2DÓEˆDŒLØ!ˆDŒOØ"ˆDÕr`   rp   c                 óD   • U R                   SL=(       a    U R                  $ )z@Whether get_image() can return a rendered image for this result.N)r`  rA  rt   s    ra   Ú	has_imageÚPageParseResult.has_imageš  s   € ð ×"Ñ"¨$Ð.×?°4·<±<Ð?r`   c                 óZ   • U R                   (       a  gU R                  R                  5       $ )z0Error description; empty string when successful.r  )rA  r_  ræ  rt   s    ra   Úerror_messageÚPageParseResult.error_messageŸ  s   € ð �<�<ØØ�y‰y�‰Ó Ð r`   c                 ó¾   • U R                   (       d2  [        SU R                   SU R                   SU R                   35      eU R
                  c   eU R
                  $ )NzCannot access failed page z for z: )rA  rî  re  rd  rp  rb  rt   s    ra   Ú_require_page_decoderÚ%PageParseResult._require_page_decoder¦  s`   € Ø�|�|ÜØ,¨T×-=Ñ-=Ð,>¸eÀDÇLÁLÀ>ÐQSÐTX×TfÑTfÐSgÐhóð ð ×!Ñ!Ñ-Ð-Ð-Ø×!Ñ!Ð!r`   c                 óÐ  • U=(       d    U R                   nUGbp  U R                  nUR                  [        R                  :¼  a  UR                  [        R                  :  dð  UR
                  [        R                  :¼  a  UR
                  [        R                  :  d´  UR                  [        R                  :¼  a  UR                  [        R                  :  dx  UR                  [        R                  :¼  a  UR                  [        R                  :  d<  UR                  [        R                  :¼  a)  UR                  [        R                  :  a  [        S5      eUR                  (       a  UR                  (       d  [        S5      eUR                  5       nX@R                  ;  a0  [        U R                  5       U R                  US9U R                  U'   U R                  U   $ )u  Return the parsed page, converting lazily on first access.

The threaded batch decodes once, so content_config here only changes
Python materialization, not the C++ decode. Any entity the batch
computed (level >= COMPUTE) may be raised to COMPUTE_AND_MATERIALIZE per result â€”
this is the intended pattern: decode the batch at COMPUTE, then surface
cells only on the pages that need them. You may also lower emit, and
turn include_bitmap_bytes off. The rejected cases are the ones the
batch cannot serve: requesting an entity the batch skipped (never
computed in C++), or asking for bitmap bytes when the batch decoded
without them â€” the image samples were never defiltered, so the request
would otherwise yield empty data. Set either on
ThreadedPdfParserConfig.page_content_config instead.
z‹content_config requests an entity the batch skipped at decode time; raise it on ThreadedPdfParserConfig.page_content_config (to >= COMPUTE)z•content_config requests bitmap bytes but the batch decoded without them; set include_bitmap_bytes=True on ThreadedPdfParserConfig.page_content_config)r–  r   rÜ   )rÀ  ra  r¼   r²   r·   r½   r¾   r¿   rÀ   rÏ  rÁ   rÃ   rÁ  r¯  rs  r¾  )ru   rÜ   r  ÚbatchrÃ   s        ra   r  ÚPageParseResult.get_page®  s‡  € ð$ ×3˜t×3Ñ3ˆØÒ%Ø×.Ñ.ˆEð ×/Ñ/´<×3GÑ3GÓGØ×6Ñ6¼×9MÑ9MÓMð ×/Ñ/´<×3GÑ3GÓGØ×6Ñ6¼×9MÑ9MÓMð ×/Ñ/´<×3GÑ3GÓGØ×6Ñ6¼×9MÑ9MÓMð ×+Ñ+¬|×/CÑ/CÓCØ×2Ñ2´\×5IÑ5IÓIð ×,Ñ,´×0DÑ0DÓDØ×3Ñ3´l×6JÑ6JÓJô !ðRóð ð
 ×&×&¨u×/I×/Iô
 !ðBóð ð
 —L‘L“Nˆ	ØŸK™KÓ'Ü%@Ø!×7Ñ7Ó9Ø"×1Ñ1Ø!ñ&ˆD�K‰K˜	Ñ"ð
 �{‰{˜9Ñ%Ð%r`   c                 ó   • U R                   $ )z2Return structured timing data for this page parse.)rf  rt   s    ra   r³  ÚPageParseResult.get_timingsñ  s   € à�}‰}Ðr`   c                 ó^   • U R                   R                  5       u  p[        [        U5      S9$ )aˆ  Return the native per-phase timings for this page.

These are the decoder's own `pdf_timings` -- `decode_page` and its
children -- and, when the batch renders, the renderer's `render_page`
breakdown merged into the same map. `get_timings()` reports the four
coarse pipeline stages instead; this is what
scripts/benchmarking/run_performance_analysis.py needs to attribute
time inside a stage.
r‡   )r_  r{   rk   r²  )ru   rj  rn   s      ra   Úget_decoder_timingsÚ#PageParseResult.get_decoder_timingsõ  s$   € ð —)‘)—-‘-“/‰ˆÜœD ›JÑ'Ð'r`   FT©Úcharsrž  Úbitmapsrë   r~  rž  r  c                óx  • UR                  U R                  S9n[        UR                  UR                  5      n[        UR                  UR                  5      n[        UR                  UR                  5      n[        UR                  UR                  5      n	U R                  5       R                  XhXy/UUUS9$ )zÄReturn whether visible page content intersects bbox.

bbox may use top-left or bottom-left coordinates. Native code expects
page coordinates with bottom-left origin as [left, bottom, right, top].
©rh  r}  )
Úto_bottom_left_originrh  Úminrû   rý   rÐ  rü   rþ   rs  Úintersects_with)
ru   rë   r~  rž  r  Úbbox_blÚleftÚrightÚbottomÚtops
             ra   r„  ÚPageParseResult.intersects_with  sŸ   € ð ×,Ñ,¸×9IÑ9IÐ,ÐJˆÜ�7—9‘9˜gŸi™iÓ(ˆÜ�G—I‘I˜wŸy™yÓ)ˆÜ�W—Y‘Y §	¡	Ó*ˆÜ�'—)‘)˜WŸY™YÓ'ˆà×)Ñ)Ó+×;Ñ;Ø˜5Ð&ØØØð	 <ð 
ð 	
r`   rÓ   ©Ú
horizontalÚverticalÚ	tolerancerŒ  r�  rŽ  c                ó�   • U R                  5       R                  UUUS9 Vs/ s H  n[        [        U5      5      PM     sn$ s  snf )zAReturn visible horizontal and/or vertical stroked shape segments.r‹  )rs  Úget_shape_linesrÿ   rÆ   )ru   rŒ  r�  rŽ  rë   s        ra   r�  ÚPageParseResult.get_shape_lines  sY   € ð ×2Ñ2Ó4×DÑDØ%Ø!Ø#ð Eñ ó
ò�ô œU 4›[Ö)ññ
ð 	
ùò 
s   ¢Ar¡   ©rŽ  c                óŒ   • U R                  5       R                  US9 Vs/ s H  n[        [        U5      5      PM     sn$ s  snf )z@Return bboxes of visible shapes connected by overlapping bboxes.r’  )rs  Ú"get_connected_shape_bounding_boxesrÿ   rÆ   )ru   rŽ  rë   s      ra   r”  Ú2PageParseResult.get_connected_shape_bounding_boxes-  sS   € ð ×2Ñ2Ó4×WÑWØ#ð Xñ ó
ò�ô œU 4›[Ö)ññ
ð 	
ùò 
s    Ac                 ó�   • U R                   c%  [        SU R                   SU R                   35      e[	        U R                   5      $ )Nz&Rendered image not available for page ú of )r`  rî  re  rd  Ú_copy_render_configrt   s    ra   Ú_rendering_configÚ!PageParseResult._rendering_config:  sI   € Ø×ÑÑ&ÜØ8¸×9IÑ9IÐ8JÈ$ÈtÏ|É|ÈnÐ]óð ô # 4×#6Ñ#6Ó7Ð7r`   c                 óz   • U R                  5         U R                  5         U R                  R                  u  pnX!4$ r†   )rs  r™  r_  Úimage_shape)ru   ÚheightÚwidthrj  s       ra   Ú_default_canvas_sizeÚ$PageParseResult._default_canvas_sizeA  s6   € Ø×"Ñ"Ô$Ø×ÑÔ ØŸ9™9×0Ñ0Ñˆ�qØˆ}Ðr`   c                 ó�   • U R                   S::  d  U R                  S::  a  g[        SU R                   -  SU R                  -  5      $ )Nr   r¡   g      à?)rg  rh  rÐ  rt   s    ra   Ú_scale_abs_toleranceÚ$PageParseResult._scale_abs_toleranceG  s?   € Ø�?‰?˜aÓ 4×#3Ñ#3°qÓ#8ØÜ�3˜Ÿ™Ñ(¨#°×0@Ñ0@Ñ*@ÓAÐAr`   Ú	raw_bytesrœ  c           	      ób   • Uu  p#n[         R                  " SX24U SSSS5      R                  5       $ )Nrm  rk  r   r´   )rz  Ú
frombufferÚcopy)r¤  rœ  r�  rž  rj  s        ra   Ú_image_from_bytesÚ!PageParseResult._image_from_bytesL  s9   € ð 'Ñˆ�qÜ×"Ò"Ø�U�O Y°°v¸qÀ!ó
ç
‰$‹&ð	r`   c                 óT  • U R                  5         U R                  5         U R                  cp  U R                  R	                  5       nU(       d%  [        SU R                   SU R                   35      eU R                  XR                  R                  5      U l        U R                  $ )Nú!Rendered image is empty for page r—  )
rs  r™  rc  r_  Ú	get_imagerî  re  rd  r¨  rœ  )ru   r¤  s     ra   Ú_get_default_imageÚ"PageParseResult._get_default_imageU  s“   € Ø×"Ñ"Ô$Ø×ÑÔ à×ÑÑ&ØŸ	™	×+Ñ+Ó-ˆIÞÜ"Ø7¸×8HÑ8HÐ7IÈÈdÏlÉlÈ^Ð\óð ð #'×"8Ñ"8ØŸ9™9×0Ñ0ó#ˆDÔð ×"Ñ"Ð"r`   Úscalec                 ó
  • U R                  5       nU R                  5       nXl        SUl        SUl        UR                  U5      u  pEU(       d%  [        SU R                   SU R                   35      eU R                  XE5      $ )NrÐ   r«  r—  ©
rs  r™  r¯  Úcanvas_widthÚcanvas_heightÚrender_imagerî  re  rd  r¨  )ru   r¯  r–  rY  r¤  rœ  s         ra   Ú_render_image_at_scaleÚ&PageParseResult._render_image_at_scaled  s…   € Ø×1Ñ1Ó3ˆØ×.Ñ.Ó0ˆØ#ÔØ%'ˆÔ"Ø&(ˆÔ#Ø!-×!:Ñ!:¸=Ó!IÑˆ	ÞÜØ3°D×4DÑ4DÐ3EÀTÈ$Ï,É,ÈÐXóð ð ×%Ñ% iÓ=Ð=r`   Úcanvas_sizec                 ó  • U R                  5       nU R                  5       nSUl        Uu  Ul        Ul        UR                  U5      u  pEU(       d%  [        SU R                   SU R                   35      eU R                  XE5      $ )Nç      ð¿r«  r—  r±  )ru   r·  r–  rY  r¤  rœ  s         ra   Ú_render_image_at_canvas_sizeÚ,PageParseResult._render_image_at_canvas_sizeq  s‰   € ð ×1Ñ1Ó3ˆØ×.Ñ.Ó0ˆØ"ˆÔØBMÑ?ˆÔ" MÔ$?Ø!-×!:Ñ!:¸=Ó!IÑˆ	ÞÜØ3°D×4DÑ4DÐ3EÀTÈ$Ï,É,ÈÐXóð ð ×%Ñ% iÓ=Ð=r`   rp  Úcropboxc                 óD  • Uc  U$ U R                   S::  d  U R                  S::  a  U$ UR                  U R                  S9nUR                  U R                   -  nUR                  U R                  -  n[        S[        UR                  U-  5      5      n[        S[        UR                  U-  5      5      n[        UR                  [        UR                  U-  5      5      n[        UR                  [        UR                  U-  5      5      n	UR                  XgX‰45      $ )Nr   r�  )rg  rh  Úto_top_left_originrž  r�  rÐ  r‚  rû   rþ   rƒ  rý   rü   Úcrop)
ru   rp  r¼  Úcropbox_top_leftÚx_scaleÚy_scaler†  r‰  r‡  rˆ  s
             ra   Ú_crop_imageÚPageParseResult._crop_image  sü   € ð ‰?ØˆLØ�?‰?˜aÓ 4×#3Ñ#3°qÓ#8ØˆLà"×5Ñ5À$×BRÑBRÐ5ÐSÐØ—+‘+ §¡Ñ/ˆØ—,‘, ×!1Ñ!1Ñ1ˆä�1”eÐ,×.Ñ.°Ñ8Ó9Ó:ˆÜ�!”UÐ+×-Ñ-°Ñ7Ó8Ó9ˆÜ�E—K‘K¤Ð'7×'9Ñ'9¸GÑ'CÓ!DÓEˆÜ�U—\‘\¤5Ð)9×);Ñ);¸gÑ)EÓ#FÓGˆØ�z‰z˜4 eÐ4Ó5Ð5r`   c                 óD  • Ub  Ub  [        S5      eUc$  Uc!  U R                  5       nU R                  XC5      $ Ub{  US::  a  [        SU 35      eU R                  5       n[        R
                  " UUR                  SU R                  5       S9(       a  U R                  5       nOlU R                  U5      nOZUc   eUS   S::  d	  US   S::  a  [        SU 35      eX R                  5       :X  a  U R                  5       nOU R                  U5      nU R                  XC5      $ )zReturn the rendered page image.z-Provide either scale or canvas_size, not bothr   zscale must be > 0, got r¡   )Úrel_tolÚabs_tolr´   z0canvas_size must contain positive integers, got )rÏ  r­  rÃ  r™  ÚmathÚiscloser¯  r¢  rµ  rŸ  rº  )ru   r¯  r·  r¼  rp  rY  s         ra   r¬  ÚPageParseResult.get_image‘  s3  € ð Ñ Ñ!8ÜÐLÓMÐMà‰=˜[Ñ0Ø×+Ñ+Ó-ˆEØ×#Ñ# EÓ3Ð3àÑØ˜‹zÜ Ð#:¸5¸'Ð!BÓCÐCØ ×2Ñ2Ó4ˆMÜ�|Š|ØØ×#Ñ#ØØ×1Ñ1Ó3÷	ð ×/Ñ/Ó1‘à×3Ñ3°EÓ:‘àÑ*Ð*Ð*Ø˜1‰~ Ó" k°!¡n¸Ó&9Ü ØFÀ{ÀmÐTóð ð ×7Ñ7Ó9Ó9Ø×/Ñ/Ó1‘à×9Ñ9¸+ÓF�à×Ñ Ó/Ð/r`   c                 ó>   • U R                  5       R                  5       $ r†   )rs  Úexport_render_instructions_jsonrt   s    ra   Ú _export_render_instructions_jsonÚ0PageParseResult._export_render_instructions_json¹  s   € Ø×)Ñ)Ó+×KÑKÓMÐMr`   c                 ó>   • U R                  5       R                  5       $ r†   )rs  Úexport_bitmap_artifactsrt   s    ra   Ú_export_bitmap_artifactsÚ(PageParseResult._export_bitmap_artifacts¼  s   € Ø×)Ñ)Ó+×CÑCÓEÐEr`   )ra  r¾  rÀ  rc  rb  rÁ  r_  r`  rf  rd  rh  re  rg  rA  r  r†   )NNN)0rV   rW   rX   rY   rZ   r   rC   rº   rÆ  ÚpropertyrÅ   rm  r\   rp  rB   rs  r   r  rk   r³  r{  r   r„  r¢   r	   r�  r”  r™  rÆ   r^   rŸ  r¢  r£   Úbytesr   rz  r!   r¨  r­  rµ  rº  rÃ  r¬  r   r   rÍ  rÑ  r_   rU   r`   ra   r\  r\  t  s²  † ÙDð!#ð +ð	!#ð
 $ dÑ*ð!#ð &ð!#ð ,ô!#ðF ð@˜4ó @ó ð@ð ð!˜só !ó ð!ð" ~ô "ð 04ñA&à%¨Ñ,ðA&ð 
õA&ðF˜Wô ð( Wô (ð" ØØò
ð ð
ð ð	
ð
 ð
ð ð
ð 
õ
ð:  ØØò
ð ð
ð ð	
ð
 ð
ð 
ˆkÑ	õ
ð( ò
ð ð
ð 
ˆkÑ	õ	
ð8 <ô 8ð e¨C°¨H¡oô ðB eô Bð
 ðØðØ'/°¡}ðà	�‰óó ðð# H§N¡Nô #ð>¨Eð >°h·n±nô >ð>Ø   c ™?ð>à	�‰ô>ð6Ø—^‘^ð6Ø.9¸DÑ.@ð6à	�‰ô6ð( #Ø.2Ø&*ñ	&0à�t‰|ð&0ð ˜3 ˜8‘_ tÑ+ð&0ð ˜tÑ#ð	&0ð
 
�‰õ&0ðPN°$°s¸C°x±.ô NðF¨$¨t°C¸°H©~Ñ*>÷ Fr`   r\  Úsrcc                 ó  • [        5       nU R                  Ul        [        U S5      (       a  U R                  Ul        [        U S5      (       a  U R                  Ul        [        U S5      (       a  U R
                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul	        U R                  Ul
        U R                  Ul        U R                  Ul        U R                  Ul        U$ )NÚrender_shapesÚrender_shadingsÚrender_non_rect_clip_masks)rC   Úrender_textÚhasattrr×  rØ  rÙ  Úmin_stroke_widthÚdraw_text_bboxÚresolve_fontsÚuse_embedded_fontsÚfont_similarity_cutoffr¯  r²  r³  )rÕ  Údsts     ra   r˜  r˜  À  sÙ   € Ü
‹.€CØ—o‘o€C„OÜˆs�O×$Ñ$Ø×-Ñ-ˆÔÜˆsÐ%×&Ñ&Ø!×1Ñ1ˆÔÜˆsÐ0×1Ñ1Ø),×)GÑ)GˆÔ&Ø×/Ñ/€CÔØ×+Ñ+€CÔØ×)Ñ)€CÔØ ×3Ñ3€CÔØ!$×!;Ñ!;€CÔØ—	‘	€C„IØ×'Ñ'€CÔØ×)Ñ)€CÔØ€Jr`   c                 óØ  • U R                   S:„  nU R                  S:„  nU R                  S:„  nU R                   S:w  a  U R                   S::  a  [        S5      eU R                  S:w  a  U R                  S::  a  [        S5      eU R                  S:w  a  U R                  S::  a  [        S5      eU R                  S:  a  [        S5      eU(       a  U(       d  U(       a  [        S5      eg g )	Nr   r¹  z%render_config.scale must be > 0 or -1rÐ   z,render_config.canvas_width must be > 0 or -1z-render_config.canvas_height must be > 0 or -1z+render_config.min_stroke_width must be >= 0zIrender_config.scale cannot be combined with canvas_width or canvas_height)r¯  r²  r³  rÏ  rÜ  )rÕ  Ú
have_scaleÚ
have_widthÚhave_heights       ra   Ú_validate_render_configræ  Ô  s×   € Ø—‘˜Q‘€JØ×!Ñ! AÑ%€JØ×#Ñ# aÑ'€Kà
‡y�y�DÓ˜SŸY™Y¨!›^ÜÐ@ÓAÐAØ
×Ñ˜2Ó #×"2Ñ"2°aÓ"7ÜÐGÓHÐHØ
×Ñ˜BÓ 3×#4Ñ#4¸Ó#9ÜÐHÓIÐIØ
×Ñ˜aÓÜÐFÓGÐGÞ–z¦[ÜØWó
ð 	
ð &1€zr`   c                 ó.   • [        U 5        [        U 5      $ r†   )ræ  r˜  )rÕ  s    ra   Ú_validated_render_configrè  ç  s   € Ü˜CÔ Ü˜sÓ#Ð#r`   c            	       óê   • \ rS rSrSr  SS\S-  S\S-  4S jjr  SS\\	\
\4   S\	S-  S	\\   S-  S
\	4S jjrS\	S
\4S jrS\	S
\4S jrS\	S
\4S jrSS jrS
\4S jrS
\S   4S jrSS jrSrg)ÚDoclingThreadedPdfParseriì  zKThreaded PDF parser that decodes pages from multiple documents in parallel.NÚparser_configrÚ   c                 ó  • Uc
  [        5       nXl        UR                  b  [        UR                  5      Ul        U=(       d
    [	        5       R                  5       U l        UR                  =(       d
    [        5       R                  5       U l	        U R                  R                  5       U l
        [        U R                  UR                  R                  U R                  S9U l        0 U l        0 U l        UR                  c:  [#        UR$                  UR&                  UR(                  U R                  S9U l        g [-        UR$                  UR&                  UR(                  U R                  UR                  S9U l        g )NrÌ  )r!  Únum_threadsrX  rÍ  )r!  rí  rX  rÚ   rY  )rS  Ú_parser_configrY  rè  rÈ   r!  r¿  rZ  rº   rÀ  ra  ræ   r   rÒ  Ú_cpp_decode_configÚ_page_countsÚ_scheduled_page_countsrF   r!  rV  rX  r¼  rG   )ru   rë  rÚ   s      ra   rÆ  Ú!DoclingThreadedPdfParser.__init__ï  sC  € ð
 Ñ Ü3Ó5ˆMà+ÔØ×&Ñ&Ñ2Ü*BØ×+Ñ+ó+ˆMÔ'ð  -×>´³×JÑJÓLˆÔà×-Ñ-×@´³ß
‰*‹,ð 	Ôð &*×%9Ñ%9×%DÑ%DÓ%FˆÔ"ä"8Ø×-Ñ-Ø'×5Ñ5×;Ñ;Ø×5Ñ5ñ#
ˆÔð
 -/ˆÔØ68ˆÔ#à×&Ñ&Ñ.Ü/Ø&×/Ñ/Ø)×1Ñ1Ø'4×'KÑ'KØ×.Ñ.ñ	ˆD�Lô 2Ø&×/Ñ/Ø)×1Ñ1Ø'4×'KÑ'KØ"×5Ñ5Ø+×9Ñ9ñˆD�Lr`   r-  r/  Úpage_numbersrp   c                 ót  • [        U[        5      (       a  [        U5      n[        U[        5      (       aI  SU< 3nU R                  R	                  U[        U5      R                  S5      UUb  [        U5      OSS9nOÔ[        U[        5      (       a¨  [        R                  " SS9nUR                  S5      =n(       a+  UR                  U5        UR                  S5      =n(       a  M+  UR                  S5        UR                  5       nSU 3nU R                  R                  UUUUb  [        U5      OSS	9nO[        S
[!        U5       35      eU(       d  [#        SU 35      eU R                  R%                  U5      U R&                  U'   U R                  R)                  U5      U R*                  U'   U$ )a  Load a document for parallel processing.

Parameters:
    path_or_stream: File path or BytesIO object.
    password: Optional password for protected files.
    page_numbers: Optional 1-indexed physical pages to schedule.

Returns:
    str: The document key.
r1  rI  N)rx   r3  r/  ró  Fr4  r6  r   )rx   rN  r/  ró  z$Expected str, Path, or BytesIO, got r7  )ré   r\   r   r¼  rJ  rK  rE  r   r9  r:  r;  r<  r=  r>  rO  Ú	TypeErrorÚtyperî  rÎ  rð  Úscheduled_number_of_pagesrñ  )	ru   r-  r/  ró  rx   rA  rB  rC  Úhash_vals	            ra   rF  ÚDoclingThreadedPdfParser.load  s£  € ô  �n¤c×*Ñ*Ü! .Ó1ˆNä�n¤d×+Ñ+Ø˜Ñ*Ð+ˆCØ—l‘l×0Ñ0ØÜ˜^Ó,×3Ñ3°FÓ;Ø!Ø3?Ñ3KœT ,Ô/ÐQUð	 1ð ‰Gô ˜¬×0Ñ0Ü—^’^°EÑ:ˆFØ)×.Ñ.¨tÓ4Ð4�%Õ4Ø—‘˜eÔ$ð *×.Ñ.¨tÓ4Ð4�%×4à×Ñ Ô"Ø×'Ñ'Ó)ˆHà˜˜
Ð#ˆCØ—l‘l×=Ñ=ØØ'Ø!Ø3?Ñ3KœT ,Ô/ÐQUð	 >ð ‰Gô Ø6´t¸NÓ7KÐ6LÐMóð ö ÜÐ!BÀ3À%ÐHÓIÐIà!%§¡×!=Ñ!=¸cÓ!Bˆ×Ñ˜#ÑØ+/¯<©<×+QÑ+QÐRUÓ+Vˆ×#Ñ# CÑ(Øˆ
r`   rd  c                 óZ   • XR                   ;  a  [        SU 35      eU R                   U   $ )z2Return the total page count for a loaded document.úDocument key not loaded: )rð  rÏ  ©ru   rd  s     ra   Ú
page_countÚ#DoclingThreadedPdfParser.page_countO  s2   € à×+Ñ+Ó+ÜÐ8¸¸	ÐBÓCÐCØ× Ñ  Ñ)Ð)r`   c                 óZ   • XR                   ;  a  [        SU 35      eU R                   U   $ )z;Return the number of pages scheduled for threaded emission.rû  )rñ  rÏ  rü  s     ra   Úscheduled_page_countÚ-DoclingThreadedPdfParser.scheduled_page_countU  s2   € à×5Ñ5Ó5ÜÐ8¸¸	ÐBÓCÐCØ×*Ñ*¨7Ñ3Ð3r`   c                 ó¬   • U R                   R                  U5      nU R                  R                  US5        U R                  R                  US5        U$ )z<Unload one document after threaded processing has completed.N)r¼  rá  rð  rç  rñ  )ru   rd  Úunloadeds      ra   râ  ÚDoclingThreadedPdfParser.unload[  sG   € à—<‘<×/Ñ/°Ó8ˆØ×Ñ×Ñ˜g tÔ,Ø×#Ñ#×'Ñ'¨°Ô6Øˆr`   c                 ó    • U R                   R                  5         U R                  R                  5         U R                  R                  5         g)z=Unload all documents after threaded processing has completed.N)r¼  Úunload_all_documentsrð  rà  rñ  rt   s    ra   Ú
unload_allÚ#DoclingThreadedPdfParser.unload_allb  s6   € à�‰×)Ñ)Ô+Ø×Ñ×ÑÔ!Ø×#Ñ#×)Ñ)Õ+r`   c                 ó6   • U R                   R                  5       $ )z´Check if there are remaining tasks to consume.

On first call, builds the task queue and starts worker threads.

Returns:
    bool: True if there are remaining results to consume.
)r¼  Ú	has_tasksrt   s    ra   r
  Ú"DoclingThreadedPdfParser.has_tasksh  s   € ð �|‰|×%Ñ%Ó'Ð'r`   r\  c              #   óŠ   #   • U R                  5       (       a*  U R                  5       v •  U R                  5       (       a  M)  gg7f)z'Yield page results in completion order.N)r
  Úget_taskrt   s    ra   Úiterate_resultsÚ(DoclingThreadedPdfParser.iterate_resultsr  s-   é € à�n‰n×ÑØ—-‘-“/Ò!ð �n‰n×Õùs   ‚=AÁAc                 óÄ   • [        U R                  R                  5       U R                  R                  U R                  R
                  U R                  U R                  S9$ )z·Get the next completed page decode result.

Blocks until a result is available.

Returns:
    PageParseResult: Parsed page result with lazy page conversion and optional image access.
)r   rY  rÜ   r]  )r\  r¼  r  rî  r   rY  rÀ  ra  rt   s    ra   r  Ú!DoclingThreadedPdfParser.get_taskw  sQ   € ô Ø�L‰L×!Ñ!Ó#Ø×-Ñ-×;Ñ;Ø×-Ñ-×;Ñ;Ø×/Ñ/Ø!%×!;Ñ!;ñ
ð 	
r`   )ra  rÀ  rï  r¿  rð  r¼  rî  rñ  )NN)rp   N)rp   r\  )rV   rW   rX   rY   rZ   rS  rÈ   rÆ  r   r\   r   r   r   r^   rF  rý  r   rÅ   râ  r  r
  r   r  r  r_   rU   r`   ra   rê  rê  ì  sÝ   † ÙUð 9=Ø-1ñ)à.°Ñ5ð)ð $ dÑ*õ)ð\  $Ø-1ñ	3à˜c 4¨Ð0Ñ1ð3ð ˜‘*ð3ð ˜s‘m dÑ*ð	3ð
 
õ3ðj* #ð *¨#ô *ð4¨Cð 4°Cô 4ð˜cð  dô ô,ð(˜4ô (ð" Ð*;Ñ!<ô "÷

r`   rê  )T)‚rZ   r9  ÚloggingrÈ  Úenumr   Úior   Úpathlibr   Útypingr   r   r   r	   r
   r   r   r   Údocling_core.types.doc.baser   r   r   Údocling_core.types.doc.documentr   Údocling_core.types.doc.pager   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ÚPILr!   rz  Úpydanticr"   r#   Údocling_parse.pdf_parsersr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rÝ   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   Ú	getLoggerrV   r†  rM   rc   rk   r¦   r®   r²   rº   rÈ   r\   ræ   rê   rÆ   r¢   rù   rÿ   r  r  Úmodel_fieldsÚget_defaultr  r*  rR  r`  re  rÅ   r•  r  r¯  rµ  r·  r¹  r   rS  r\  r˜  ræ  rè  rê  rU   r`   ra   Ú<module>r      sP  ðÙ ã Û Û Ý Ý Ý ß N× NÓ Nç NÑ NÝ 4÷÷ ÷ ÷ ñ õ" "ß *÷)÷ )÷ )÷ )÷ )÷ )÷ )÷ )÷ )÷ )ó )ðX ×Ò˜Ó"€ô0�)ô 0ô$7�Yô 7ô$E-ˆiô E-ôP	˜	ô 	ôÐ)ô ô �7ô  ô
�Iô 
ô>%�9ô %ð43àð3ð ð3ð "ð	3ð
 ô3ðl%Ø:ð%àÐ*Ñ*ô%ð&Ø
��u˜e UÐ*Ñ
+ðàôð ˜5 ¨¨u°eÐ!;Ñ<ð Àô ð
à&ð
ð ˆ5�%˜ Ð%Ñ&ô
ðà&ðð ôð6 *×6Ñ6°vÑ>×JÑJØð Kð Ð ð
!¨t°E¸+ÀxÐ:OÑ4PÑ/Qô !ðH%°°h±ô %ðP°4¸	±?ô ð6¸¸lÑ9Kô ð4 "&ñOàðOð 
ˆ.ÑõOðh *=×)EÑ)EØ+/ñ5Ø ð5à&ð5ð " DÑ(ð5ð õ	5ðp¨ð ¸7ô ð:Ø ð:à&ð:ð ˆ5�%ˆ<Ñô:÷aBñ aB÷H	A
ñ A
ôH5˜iô 5÷*IFñ IFðX
˜\ð ¨lô ð(
 ð 
°$ô 
ð&$ ,ð $°<ô $÷
Y
ò Y
r`   