§
    �Øj”9  ã                   ól  — U d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlm	Z	 ddl
mZmZ d ej        z  ej        z  ej        z  Z e	j        ¦   «         ZdZdZ ed¦  «        Ze	j        Ze	j        Ze	j        Ze	j        Ze	j        Z d	Z! e" e j#        d
d¦  «        ¦  «        dz  Z$ ee%¦  «        j&        dz  Z'da(ej)        dz  e*d<   da+e,e*d<   d„ Z-de.de/fd„Z0e$fd„Z1d„ Z2d.d„Z3d.d„Z4de5fd„Z6d/de.fd„Z7e8dk    �r8	 d dlZd dl9Z9d dl:Z:d Z;g Z<ddiZ= ej>        e9j?        d         ¦  «        Z@ eAd e@jB        ›�¦  «         e@D ]]ZC e:jD        ¦   «         ZE e7eCe=¬!¦  «        ZFe; e:jD        ¦   «         eEz
  z  Z;eFd"         r"e< G                    eCjH        eFd#         f¦  «         Œ^ eAd$e;d%›d&e; eIe@¦  «        z  d'›d( eIe<¦  «        › d) eIe<¦  «         eIe@¦  «        z  dz  d%›d*�	¦  «          e>e@jB        d+z   d,¦  «        ZJ ejK        e<deJ¬-¦  «         eJ L                    ¦   «           ejK        e=¦  «         dS dS )0é    N)ÚPath)Úmupdfé   )ÚFEATURE_NAMESÚcompute_featuresÚType3ÚGlyphLessFontiýÿ  gš™™™™™¹?ÚPYMUPDF_OCR_MODEL_THRESHOLDé]   éd   zocr_decision_model.onnxÚ_sessionÚ Ú_input_namec                  ó  — t           €lt          j        ¦   «         } d| _        d| _        t          j        t          t          ¦  «        | ¦  «        a t                                ¦   «         d         j	        a
t           t          fS )Nr   r   )r   ÚortÚSessionOptionsÚinter_op_num_threadsÚintra_op_num_threadsÚInferenceSessionÚstrÚ_MODEL_PATHÚ
get_inputsÚnamer   )Úoptss    ú‘/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/ocr/analyze_page.pyÚ_get_sessionr   '   sd   € åÐÝÔ!Ñ#Ô#ˆØ$%ˆÔ!Ø$%ˆÔ!ÝÔ'­­KÑ(8Ô(8¸$Ñ?Ô?ˆÝ×)Ò)Ñ+Ô+¨AÔ.Ô3ˆÝ•[Ð Ð ó    ÚfeaturesÚreturnc                 óð   ‡ — t          ¦   «         \  }}t          j        ˆ fd„t          D ¦   «         gt          j        ¬¦  «        }|                     d||i¦  «        d         }t          |d         ¦  «        S )z7Return the probability that these features require OCR.c                 ó    •— g | ]
}‰|         ‘ŒS © r"   )Ú.0Úfr   s     €r   ú
<listcomp>z+predict_ocr_probability.<locals>.<listcomp>5   s   ø€ Ð6Ð6Ð6 1�8˜A”;Ð6Ð6Ð6r   )ÚdtypeNr   )r   r   )r   ÚnpÚarrayr   Úfloat32ÚrunÚfloat)r   ÚsessionÚ
input_nameÚxÚprobass   `    r   Úpredict_ocr_probabilityr0   2   sm   ø€ å&™.œ.Ñ€GˆZÝ
ŒÐ6Ð6Ð6Ð6­Ð6Ñ6Ô6Ð7½r¼zÐJÑJÔJ€AØ�[Š[˜ 
¨A˜Ñ/Ô/°Ô2€FÝ�˜”ÑÔÐr   c                 óJ  — |}t          | ¦  «        D �]\  }}t          j        |d         ¦  «        }|j        rt          j        |d¦  «        }|d         rOt          j        |d         ¦  «        }	 t          j        ||¦  «        }t          j        |d¦  «        }n	#  d}Y nxY wt          j        t          j        |¦  «        }t          j        |dd¦  «        }t          |g|d         |¦  «        }t          |¦  «        }	t          ||	¦  «        }||k    rd||fc S �Œd||fS )	ai  Stage 2: Separate OCR check for large images.

    Currently not in use.

    Args:
        image_blocks: (list) image blocks in page.get_text("dict") format.
        prob: (float) OCR probability for rendered full page
        threshold: (float) probability threshold. If larger recommend OCR.

    Returns:
        bool (do OCR), probability, check count
    Úimager   ÚmaskNé€   ÚbboxTF)Ú	enumerateÚpymupdfÚPixmapÚalphaÚcsGRAYr   r0   Úmax)
Úimage_blocksÚprobÚ	thresholdÚ	best_probÚiÚblockÚpixr3   r   Úimg_probs
             r   Úcheck_imagesrD   :   s;  € ð €Iå˜lÑ+Ô+ð &ñ &‰ˆˆ5õ Œn˜U 7œ^Ñ,Ô,ˆØŒ9ð 	)Ý”.  aÑ(Ô(ˆCØ�Œ=ð 	Ý”> %¨¤-Ñ0Ô0ˆDðÝ”n S¨$Ñ/Ô/�Ý”n S¨!Ñ,Ô,��øðØ���øøøÝŒn�Wœ^¨SÑ1Ô1ˆÝŒn˜S # sÑ+Ô+ˆõ $ U G¨U°6¬]¸CÑ@Ô@ˆÝ*¨8Ñ4Ô4ˆÝ˜	 8Ñ,Ô,ˆ	à˜	Ò!Ð!Ø˜ AÐ%Ð%Ð%Ð%ñ "ð �)˜QÐÐs   Á1*BÂB"c                 óŒ   — | d         t           k    p3| d         dk    p'| d         t          z  dk    o| d         t          z  dk    S )zIf this is an OCR text span.Úfontr9   r   Ú
char_flags)ÚTESSERACT_FONT_NAMEÚTEXT_STROKEDÚTEXT_FILLED)Úspans    r   Úis_ocr_spanrL   d   sW   € ð 	ˆVŒÕ+Ò+ð 	
Ø�Œ=˜AÒð	
ð �Ô¥Ñ-°Ò2ð 6Ø�\Ô"¥[Ñ0°AÒ5ðr   Fc                 ó  — t          | d         |d         ¦  «        t          | d         |d         ¦  «        t          | d         |d         ¦  «        t          | d         |d         ¦  «        f}|r|nt          j        |Ž S ©úSpeedy version using indices.r   r   é   é   )r;   Úminr7   ÚRect©Úr1Úr2Ú	bbox_onlyr5   s       r   Úintersect_rectsrX   p   óq   € å��1”�r˜!”uÑÔ�s 2 a¤5¨"¨Q¬%Ñ0Ô0µ#°b¸´e¸RÀ¼UÑ2CÔ2CÅSÈÈAÌÐPRÐSTÔPUÑEVÔEVÐW€DØÐ5ˆ4ˆ4¥'¤,°Ð"5Ð5r   c                 ó  — t          | d         |d         ¦  «        t          | d         |d         ¦  «        t          | d         |d         ¦  «        t          | d         |d         ¦  «        f}|r|nt          j        |Ž S rN   )rR   r;   r7   rS   rT   s       r   Ú
join_rectsr[   v   rY   r   c                 óJ   — | d         | d         k    p| d         | d         k    S )rO   r   rP   r   rQ   r"   )r5   s    r   Úbbox_is_emptyr]   |   s'   € à�Œ7�d˜1”gÒÐ3  a¤¨D°¬GÒ!3Ð3r   éÈ   c                 óè	  — |€4|                       dt          t          j        ¦   «         ¬¦  «        d         }| j        }t          j        ¦   «         }|
 }|
 }d}	d}
d}d}d}d}d}d}g }g }g }g }|D �]Â}t          ||d         ¦  «        }|j        |j        z  }|sŒ+|d         t          k    �r(|d	         D �]}|d
         D �]}t          ||d         ¦  «        }|j        |j        z  }|sŒ+|d          
                    ¦   «         }|r|                     ¦   «         rŒ\|	t          |¦  «        z  }	t          |¦  «        r!|dz  }|                     |d         ¦  «         Œžt          d„ |D ¦   «         ¦  «        }|
|z  }
t!          ||¦  «        }||z  }|r!||z  }|                     |d         ¦  «         Œô|                     |d         ¦  «         �Œ�Œ�Œe|d         t"          k    rt!          ||¦  «        }||z  }�Œ�|d         t$          k    r$t!          ||¦  «        }||z  }|d         s|dz  }�ŒÂ�ŒÄ||z  |z  }t'          |¦  «        r2i 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“S |d          |d         z
  |d!         |d         z
  z  }|rt          |¦  «        dk    r|nd}||rt)          |¦  «        |z  nd|r||z  nd|rt)          |¦  «        |z  nd|r||z  nd|rt)          |¦  «        |z  nd|r||z  nd|	|
|r||z  nd|d|d"œ} |r—t+          |t,          ¦  «        r|                     d#d¦  «        dz   |d#<   |s
i | ¥dddd$œ¥S |D ]}!|                      |!¦  «         Œ|                      t          j        t          j        t          j        ¬%¦  «         i | ¥d&ddd$œ¥S |	r(|r&|
|	z  t:          k    r||z  t:          k    r
i | ¥d&ddd$œ¥S |s|s
i | ¥dddd$œ¥S t+          |t,          ¦  «        r|                     d'd¦  «        dz   |d'<   t=          ||| ¦  «        }"t+          |t,          ¦  «        r)|                     d(¦  «        rt?          j         |"¦  «         tC          |"¦  «        }#|#tD          k    }$|$r
i | ¥|$d)|#d$œ¥S |rKtG          ||#tD          ¦  «        \  }$}#}%t+          |t,          ¦  «        r|                     d*d¦  «        |%z   |d*<   i | ¥|$|$rd)nd|#d$œ¥S )+aµ  Analyze the page for the OCR decision.

    Args:
        blocks: (dict) output of page.get_text("dict") if already available
        replace_ocr: (bool) if True, we should make a new OCR text layer
        stats: (dict) if given fill in execution information (debugging)
    Returns:
        A dict with analysis results. The area-related float values are
        computed as fractions of the total covered area.

        "covered": Rect, page area covered by content
        "img_joins": float, fraction of area of the joined images
        "img_area": float, fraction of sum of image area sizes
        "txt_joins": float, fraction of area of the joined text spans
        "txt_area": float, fraction of sum of text span bbox area sizes
        "vec_joins": float, fraction of area of the joined vector characters
        "vec_area": float, fraction of sum of vectors
        "vec_norects": int, count of vectors with isrect=False (not in a rectangle)
        "chars_total": int, count of visible characters
        "chars_bad": int, count of Replacement Unicode characters
        "bad_areas": float, fraction of text areas having bad characters
        "ocr_spans": int, count: text spans with ignored text (render mode 3)
        "pixmap": Pixmap of page with all "good" text removed - for OCR use
        "needs_ocr": bool, final decision
        "reason": str | None, reason for the OCR decision
        "probability": float | None, OCR probability
    NÚdict)ÚflagsÚclipÚblocksr   g        r5   ÚtypeÚlinesÚspansÚtextr   c              3   ó0   K  — | ]}|t           k    ¯d V — ŒdS )r   N)ÚREPLACEMENT_CHARACTER)r#   Úcs     r   ú	<genexpr>zanalyze_page.<locals>.<genexpr>Ô   s-   è è € Ð#RÐ#R¨!°qÕ<QÒ7QÐ7Q AÐ7QÐ7QÐ7QÐ7QÐ#RÐ#Rr   ÚisrectÚcoveredÚ	img_joinsÚimg_areaÚ	txt_joinsÚtxt_areaÚ	vec_joinsÚvec_areaÚvec_norectsÚchars_totalÚ	chars_badÚ	bad_areasÚ	ocr_spansÚpixmapÚ	needs_ocrFÚreasonÚprobabilityrP   rQ   )rm   rn   ro   rp   rq   rr   rs   ru   rv   rw   rx   ry   rt   Úold_ocr)rz   r{   r|   )ÚimagesÚgraphicsrg   TÚmodel_checkÚshow_featuresÚimg_textÚ
img_checks)$Úget_textÚFLAGSr7   ÚINFINITE_RECTÚrectÚ
EMPTY_RECTrX   ÚwidthÚheightÚ
BLOCK_TEXTÚstripÚisspaceÚlenrL   ÚappendÚsumr[   ÚBLOCK_IMAGEÚBLOCK_VECTORr]   ÚabsÚ
isinstancer`   ÚgetÚadd_redact_annotÚapply_redactionsÚPDF_REDACT_IMAGE_NONEÚPDF_REDACT_LINE_ART_NONEÚPDF_REDACT_TEXT_REMOVEÚBAD_CHAR_THRESHOLDr   ÚpprintÚppr0   ÚOCR_MODEL_THRESHOLDrD   )&Úpagerc   Úreplace_ocrÚocr_dpiÚstatsÚ	page_rectÚimg_rectÚtxt_rectÚvec_rectru   rv   rw   ro   rq   rs   rt   rx   Úocr_span_boxesÚbad_char_boxesÚgood_char_boxesr<   Úbr5   ÚareaÚlÚsÚsrÚsr_arearg   Ú	bad_charsrm   Ú
cover_areaÚanalysisÚrr   r=   rz   Úcheck_counts&                                         r   Úanalyze_pagerµ   �   sl  € ð> €~ð —’ØÝÝÔ&Ñ(Ô(ð ñ 
ô 
ð ô	ˆð ”	€IÝÔ!Ñ#Ô#€HØˆy€HØˆy€HØ€KØ€IØ€IØ€HØ€HØ€HØ€KØ€IØ€NØ€NØ€OØ€Làð 6ñ 6ˆÝ˜y¨!¨F¬)Ñ4Ô4ˆØŒz˜DœKÑ'ˆØð 	Øð ˆVŒ9�
Ò"Ñ"Ø�w”Zð :ñ :�Ø˜7œð :ñ :�AÝ(¨¨q°¬yÑ9Ô9�BØ œh¨¬Ñ2�GØ"ð !Ø Ø˜Vœ9Ÿ?š?Ñ,Ô,�DØð ! 4§<¢<¡>¤>ð !Ø Ø¥3 t¡9¤9Ñ,�Kå" 1‘~”~ð !Ø! Q™˜	Ø&×-Ò-¨a°¬iÑ8Ô8Ð8Ø õ !$Ð#RÐ#R¨tÐ#RÑ#RÔ#RÑ RÔ R�IØ Ñ*�Iå)¨(°BÑ7Ô7�HØ Ñ'�HØ ð :à! WÑ,˜	Ø&×-Ò-¨a°¬iÑ8Ô8Ð8Ð8à'×.Ò.¨q°¬yÑ9Ô9Ð9Ñ9ñ5:ñ6 ð ˆVŒ9�Ò#Ð#å! (¨DÑ1Ô1ˆHØ˜ÑˆHñ àˆVŒ9�Ò$Ð$å! (¨DÑ1Ô1ˆHØ˜ÑˆHØ�X”;ð !Ø˜qÑ �Ùñ %ð ˜Ñ! HÑ,€GÝ�WÑÔð 
ð
Ø�wð
à˜ð
ð ˜ð
ð ˜ð	
ð
 ˜ð
ð ˜ð
ð ˜ð
ð ˜1ð
ð ˜1ð
ð ˜ð
ð ˜ð
ð ˜ð
ð �dð
ð ˜ð
ð �dð
ð  ˜4ð!
ð 	
ð& ˜!”*˜w qœzÑ)¨g°a¬j¸7À1¼:Ñ.EÑF€Jð ð	å�Ñ Ô  AÒ%Ð%ð 	ˆ	ð ð	 ð Ø5?ÐH•c˜(‘m”m jÑ0Ð0ÀSØ-7Ð@�H˜zÑ)Ð)¸SØ5?ÐH•c˜(‘m”m jÑ0Ð0ÀSØ-7Ð@�H˜zÑ)Ð)¸SØ5?ÐH•c˜(‘m”m jÑ0Ð0ÀSØ-7Ð@�H˜zÑ)Ð)¸SØ"ØØ/9ÐB�Y Ñ+Ð+¸sØØØ"ðð €Hð$ ð 
õ �e�TÑ"Ô"ð 	;Ø$Ÿyšy¨°AÑ6Ô6¸Ñ:ˆE�)ÑØð 	YàX�hÐX¨U¸dÐSWÐXÐXÐXÐXð  ð 	%ð 	%ˆAØ×!Ò! !Ñ$Ô$Ð$Ð$Ø×ÒÝÔ0ÝÔ5ÝÔ/ð 	ñ 	
ô 	
ð 	
ð

Øð
àØ!Øð	
ð 
ð 
ð 	
ð 	ð
àð
ð ˜Ñ#Õ&8Ò8Ð8Ø˜Ñ Õ#5Ò5Ð5ð
Øð
àØ!Øð	
ð 
ð 
ð 	
ð ð 
˜xð 
ð
Øð
àØØð	
ð 
ð 
ð 	
õ �%�ÑÔð ?Ø$Ÿyšy¨¸Ñ:Ô:¸QÑ>ˆˆmÑå ¨	°4Ñ8Ô8€Hå�%�ÑÔð  5§9¢9¨_Ñ#=Ô#=ð ÝŒ	�(ÑÔÐå" 8Ñ,Ô,€DØÕ+Ò+€Ið ð 
ð
Øð
à"Ø Øð	
ð 
ð 
ð 	
ð ð KÝ'3Ø˜$Õ 3ñ(
ô (
Ñ$ˆ	�4˜õ �e�TÑ"Ô"ð 	KØ"'§)¢)¨L¸!Ñ"<Ô"<¸{Ñ"JˆE�,ÑðØ
ðàØ )Ð3�*�*¨tØð	ð ð ð r   Ú__main__r�   TzOCR-Analysis for doc.name=)r¢   rz   r{   zNEW: duration: z.2fzs, per page: z.4fzs OCR: z pages (z%)z.txtÚw)r‰   Ústream)F)NFr^   N)MÚosrœ   Úpathlibr   Únumpyr'   Úonnxruntimer   r7   r   Úcompute_ocr_featuresr   r   ÚTEXT_ACCURATE_BBOXESÚTEXT_PRESERVE_IMAGESÚTEXT_COLLECT_VECTORSr…   Úfz_device_grayÚGRAYÚTYPE3_FONT_NAMErH   Úchrri   ÚFZ_STEXT_STROKEDrI   ÚFZ_STEXT_FILLEDrJ   ÚFZ_STEXT_BLOCK_TEXTr‹   ÚFZ_STEXT_BLOCK_IMAGEr‘   ÚFZ_STEXT_BLOCK_VECTORr’   r›   ÚintÚgetenvrž   Ú__file__Úparentr   r   r   Ú__annotations__r   r   r   r`   r+   r0   rD   rL   rX   r[   Úboolr]   rµ   Ú__name__ÚsysÚtimeÚdurationÚ	ocr_pagesÚ
STATISTICSÚopenÚargvÚdocÚprintr   rŸ   Úperf_counterÚt0r²   r�   ÚnumberrŽ   Úoutr�   Úcloser"   r   r   ú<module>rß      s9  ðØ 	€	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð à AÐ AÐ AÐ AÐ AÐ AÐ AÐ Að ØÔ"ñ#àÔ"ñ#ð Ô"ñ#ð ð €uÔÑÔ€Ø€Ø%Ð Ø˜˜F™œÐ ØÔ%€ØÔ#€ØÔ&€
ØÔ(€ØÔ*€àÐ ð �c˜)˜"œ)Ð$AÀ2ÑFÔFÑGÔGÈ#ÑMÐ ð ˆd�8‰nŒnÔ#Ð&?Ñ?€Ø(,€ˆ#Ô
 Ñ
%Ð ,Ð ,Ñ ,Ø€ˆSÐ Ð Ñ ð!ð !ð !ð dð ¨uð ð ð ð ð 0Cð 'ð 'ð 'ð 'ðT	ð 	ð 	ð6ð 6ð 6ð 6ð6ð 6ð 6ð 6ð4˜4ð 4ð 4ð 4ð 4ð
yð yÐSWð yð yð yð yðx ˆzÒÑØ!Ø€M€M€MØ€J€J€JØ€K€K€Kà€HØ€IØ! 4Ð(€JØ
ˆ'Œ,�s”x ”{Ñ
#Ô
#€CØ	€EÐ
)˜cœhÐ
)Ð
)Ñ*Ô*Ð*Øð @ð @ˆØˆTÔÑ Ô ˆØ�< ¨JÐ7Ñ7Ô7ˆØÐ%�DÔ%Ñ'Ô'¨"Ñ,Ñ,ˆØ�KÔ ð 	@Ø×Ò˜dœk¨8°HÔ+=Ð>Ñ?Ô?Ð?øØ	€Eð 	O˜(ð  	Oð  	Oð  	O°X¸c¸cÀ#¹h¼hÑ5Fð  	Oð  	Oð  	OÐSVÐSVÐW`ÑSaÔSað  	Oð  	OÐknÐknÐoxÑkyÔkyÐz}Ðz}ð  Bñ  {Cô  {Cñ  lCð  DGñ  lGð  	Oð  	Oð  	Oð  	Oñô ð ð ˆ$ˆsŒx˜&Ñ  #Ñ
&Ô
&€CØ€F„Iˆi˜s¨3Ð/Ñ/Ô/Ð/Ø‡I‚I�K„K€KØ€F„IˆjÑÔÐÐÐð/ Ðr   