
    TAi+1                        S r SSKJ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JrJr  SSKJr   " S	 S
\5      r\R0                  " \5      rSrSS jr      SS jrSS jr " S S5      rg)z9For grafting text-only PDF pages onto freeform PDF pages.    )annotationsN)suppress)Enum)Path)

DictionaryMatrixNameOperatorPagePdfPdfErrorStreamparse_content_streamunparse_content_stream)
PdfContextc                      \ rS rSrSrSrSrg)
RenderMode   r       N)__name__
__module____qualname____firstlineno__ON_TOP
UNDERNEATH__static_attributes__r       K/var/www/html/land-ocr/venv/lib/python3.13/site-packages/ocrmypdf/_graft.pyr   r      s    FJr   r   d   c                .    X;  a  [        0 5      X'   X   $ N)r   )objnames     r   _ensure_dictionaryr%   &   s    rN	9r   c                    [        U [        R                  5      n[        U[        R                  5      nUb  X$;  a  XU'   ggg)zdUpdate this obj's fonts with a reference to the Glyphless font.

obj can be a page or Form XObject.
N)r%   r	   	ResourcesFont)r#   fontfont_key	resourcesfontss        r   _update_resourcesr-   ,   s>     #37Iy$))4E 5h !6r   c                X   / nSnSn/ n/ n[        US5       H  u  pxU[        S5      :X  a  US   nU[        S5      :X  a  UR                  U5        U[        S5      :X  a   UR                  5       nU(       d9  U[        S5      :X  a  SnUR                  Xx45        M  UR                  Xx45        M  UR                  Xx45        U[        S	5      :X  d  M  SnUS
:w  a  UR                  U5        UR                  5         M     [        U5      n	[        X	5      Ul	        g ! [         a     Nf = f)NFr    TrqQBTTET   )
r   r
   appendpop
IndexErrorextendclearr   r   Contents)
pdfpagestreamin_text_objrender_moderender_mode_stacktext_objectsoperandsoperatorcontent_streams
             r   strip_invisible_textrF   <   s$   FKKL24<x~%"1+Kx}$$$[1x}$/335 8D>)"##X$89x23 458D>)#!#MM,/""$7 =: ,F3N3/DM)   s    D
D)(D)c                  x    \ rS rSrSrSS jr        SS jrSS jrS rSS jr	            SS jr
S	rg
)
OcrGrafterr    z2Manages grafting text-only PDFs onto regular PDFs.c                ,   Xl         UR                  U l        [        R                  " U R                  5      U l        S U l        S U l        UR                  U l        UR                  S5      U l
        SU l        SU l        [        R                  U l        g )Nzgraft_layers.pdfr   r   )contextorigin	path_baser   openpdf_baser)   r*   pdfinfoget_pathoutput_fileemplacementsinterim_countr   r   r@   )selfrJ   s     r   __init__OcrGrafter.__init__g   sq     0'+	%)"++,>?%00r   c          
     ,   U(       a/  U R                   (       d  U R                  U5      u  U l         U l        SnU R                  U   R                  nU(       a  [        U5      R                  5       OS nUb  XpR                  :w  a  [        R                  S5        [        R                  " U5       nU =R                  S-  sl        UR                  S   n	U R                  R                  R                  U	5        U R                  R                  S   n
U R                  R                  U   R!                  U
["        R$                  4S9  U R                  R                  S	 S S S 5        SnU(       a  UnUnX-
  S-  n[        R                  S	U S
U S
U SU 35        U(       at  U R                   (       ac  U R                  c  ['        S5      eU R(                  R*                  R,                  nU R/                  US-   UU R                   U R                  UUS9  Xd-
  S-  nXR                  R                  U   l        [        R                  SU S
U SU 35        U R                  [2        -  S:X  a  U R5                  5         g g ! , (       d  f       GN*= f)NFzEmplacement updater   r   )retainTh  zCText rotation: (text, autorotate, content) -> text misalignment = (z, z) -> zFont key is not set)page_numtextpdfr)   r*   text_rotationstrip_old_textz*Page rotation: (content, auto) -> page = ()r)   
_find_fontr*   rO   rotationr   resolverL   logdebugr   rM   rR   pagesrN   r6   emplacer	   Parent
ValueErrorrJ   optionsredo_ocr_graft_text_layerRotateMAX_REPLACE_PAGESsave_and_reload)rT   pagenoimager\   autorotate_correctionemplaced_pagecontent_rotation
path_image	pdf_imageforeign_image_pagelocal_image_pager]   text_misaligned	strip_oldpage_rotations                  r   
graft_pageOcrGrafter.graft_pagev   sT    499'+w'?$DIt}<</88.3T%[((*
!jNN&B II*+*%!!Q&!%.__Q%7"##**+=>#'==#6#6r#: ##F+33$dkk^ 4  MM''+ & !M 4-(;sB		b!6 7r:J9K5!	
 tyy}}$ !677 ,,55I""!YY-( #  *ASH-:F#*		 !$9#:%P	
 00A5  " 6[ &%s   1B0J
Jc                   U R                   R                  S   n[        UR                  U R                  U R
                  S9  U R                  R                  SU R                  S-
   S35      nU R                  R                  R                  (       d(  [        [        5         UR                  5         SSS5        U R                  R                  SU R                  S-    S35      nU R                   R                  U5        U R                   R!                  5         ["        R$                  " U5      U l         Su  U l        U l        U =R                  S-  sl        g! , (       d  f       N= f)zSave and reload the Pdf.

This will keep a lid on our memory usage for very large files. Attach
the font to page 1 even if page 1 doesn't use it, so we have a way to get it
back.
r   r#   r)   r*   z.workingr   z.pdfNNN)rN   rd   r-   r#   r)   r*   rQ   with_suffixrS   rJ   rh   keep_temporary_filesr   FileNotFoundErrorunlinksavecloser   rM   )rT   page0old_file	next_files       r   rm   OcrGrafter.save_and_reload   s    ##A&eiidii$--P ##//(4;M;MPQ;Q:RRV0WX||##88+,! - $$00t))A-.d3
	 	9%+#- 	4=a -,s   #E
E+c                    U R                   R                  U R                  5        U R                   R                  5         U R                  $ r"   )rN   r   rQ   r   )rT   s    r   finalizeOcrGrafter.finalize   s6    4++,r   c                   Su  p#Sn [         R                  " U5       n UR                  S   R                  R	                  [
        R                  [        5       5      n[        U[        5      (       d  [        R                  S5         SSS5        gSnU H%  nUR	                  US5      nUc  M  [        U5      n  O   U(       a  U R                  R                  U5      n[        U[        5      (       d  [        R                  S5        Su  p#X#4sSSS5        $ ! [        [        [        4 a     SSS5        gf = f! , (       d  f       g= f! [         ["        4 a     gf = f)z1Copy a font from the filename text into pdf_base.r~   )z/f-0-0z/F1r   Nz)Page fonts are not stored in a dictionaryzFont is not a dictionary)r   rM   rd   r'   getr	   r(   r   AttributeErrorr8   KeyError
isinstancerb   warningrN   copy_foreignr   r   )	rT   textr)   r*   possible_font_namespdf_textpdf_text_fontspdf_text_fontfs	            r   r_   OcrGrafter._find_font   s3   #/	$8&%-^^A%6%@%@%D%D		:<&N
 ".*==KK KL%   !%,A$2$6$6q$$?M$0#'7	 -
 !==55mDD!$
33KK :;%/ND~+  
 '
H= &%  
&  , "8, 		sj   E D??D+D?
E D?1A!D?	E D<1D?2E ;D<<D??
E	E E E#"E#c               (   [         R                  S5        [        U5      R                  5       R                  S:X  a  g[
        R                  " U5       nUR                  S   R                  R                  5       nU R                  R                  R                  U5      n	UR                  S   R                  n
U
S   U
S   -
  U
S   U
S   -
  pU	R                  n
U
S   U
S   -
  U
S   U
S   -
  p[        5       R                  U* S-  U* S-  5      n[        5       R                  US-  US-  5      n[        5       R                  U
S   U
S   5      nU* S-  n[        5       R                  U5      nUS;   a  XpX-  nX-  n[        5       R!                  UU5      nUU-  U-  U-  U-  n[         R                  S	U5        [#        U	R$                  [&        R(                  5      n[#        U[&        R*                  5      n[&        R,                  " S
S9nU R                  R/                  U5      nUUU'   [&        R*                  Ul        [&        R2                  Ul        SUl        U
Ul        [;        UX4S9  SUR=                  5       -  SU-  -   S-   n[?        U R                  U5      nU(       a  [A        U R                  U	5        U	RC                  5         U RD                  [F        RH                  :X  a;  U	R                  R                  5       nU	R                  RK                  SU-   S-   5        U	RM                  UU RD                  [F        RN                  :H  S9  U	RC                  5         [;        U	R$                  X4S9  SSS5        g! , (       d  f       g= f)zBInsert the text layer from text page 0 on to pdf_base at page_num.Graftingr   N   r5   r   rZ   )Z   i  zGrafting with ctm %rzOCR-)prefixr}   s   q %s cm
s   %s Do
s   
Q
s   q
)prepend)(rb   rc   r   statst_sizer   rM   rd   r;   
read_bytesrN   pmediaboxr   
translatedrotatedscaledr%   r#   r	   r'   XObjectrandommake_streamTypeFormSubtypeFormTypeBBoxr-   encoder   rF   contents_coalescer@   r   r   writecontents_addr   )rT   r[   r\   r)   r*   r]   r^   r   pdf_text_contents	base_pager   wthtwphp	translateuntranslatecornerrotatescale_xscale_yscalectmbase_resources
base_xobjstext_xobj_namexobjpdf_draw_xobjnew_text_layeroriginals                                 r   rj   OcrGrafter._graft_text_layer   s    			*=''1, XXg( (q 1 : : E E G++--h7I  ~~a(11Ha[8A;.hqk0I ))Ha[8A;.hqk0I++RC!GbS1W=I (--b1fb1f=KX((!hqkBF +NS0MX%%m4F
 	)BgGgG HOOGW5E
 f$u,{:VCCII,c2/	t~~NN+NDLLIJ![[7N==,,->?D)-J~&DI99DLDM DI$TE 

,n1LMPXX  $DMM=AN$T]]I>''):#4#44 %--88:""((():X)EF""(8(8J<Q<Q(Q #  ''))--dNM s   L&N
N)
rJ   rR   r)   r*   rS   rQ   rL   rN   rO   r@   N)rJ   r   )rn   intro   Path | Noner\   r   rp   r   )returnNone)r   r   r   z%tuple[Dictionary | None, Name | None])r[   r   r\   r   r)   r   r*   r	   r]   r   r^   bool)r   r   r   r   __doc__rU   rz   rm   r   r_   rj   r   r   r   r   rH   rH   d   s    <1@# @# 	@#
 @#  #@#D < 
>XO XO 	XO
 XO XO XO XOr   rH   )r#   Dictionary | Streamr$   r	   )r#   r   r)   zDictionary | Noner*   zName | None)r<   r   r=   r   ) r   
__future__r   logging
contextlibr   enumr   pathlibr   pikepdfr   r   r	   r
   r   r   r   r   r   r   ocrmypdf._jobcontextr   r   	getLoggerr   rb   rl   r%   r-   rF   rH   r   r   r   <module>r      s    @ "       , 
 ! 	  	 %0PnO nOr   