o
    e2                     @  sv  U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZmZ eeZdZ dddddZ!de"d< G dd dej#Z$dZ%G dd deZ&dMddZ'dNddZ(dOd d!Z)dPd&d'Z*dQd+d,Z+dRd2d3Z,dSd5d6Z-dTd9d:Z.dUd;d<Z/dVd@dAZ0dWdFdGZ1dXdIdJZ2dYdKdLZ3dS )Zz!Interface to Tesseract executable    )annotationsN)pi)fspath)Path)PIPESTDOUTCalledProcessErrorTimeoutExpired)Version)Image)MissingDependencyErrorSubprocessOutputErrorTesseractConfigError)OrientationConfidence)get_versionrunaj  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name='ocr-system' content='tesseract 4.1.1' />
  <meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word ocrp_wconf'/>
</head>
<body>
  <div class='ocr_page' id='page_1' title='image "_blank.png"; bbox 0 0 {0} {1}; ppageno 0'>
  </div>
 </body>
</html>
      )autoZotsuzadaptive-otsuZsauvolazdict[str, int]TESSERACT_THRESHOLDING_METHODSc                   @  s   e Zd ZdZdd ZdS )TesseractLoggerAdapterz6Prepend [tesseract] to messages emitted from tesseractc                 C  s   | j |d< d| |fS )Nextraz[tesseract] r   )selfmsgkwargs r   HD:\Projects\ConvertPro\env\Lib\site-packages\ocrmypdf/_exec/tesseract.pyprocess9   s   
zTesseractLoggerAdapter.processN)__name__
__module____qualname____doc__r   r   r   r   r   r   6   s    r   a  
    v?
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P<pre_n>[0-9]+)?
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))
            |
            (?:
                [-_\.]?
                (?P<post_l>post|rev|r)
                [-_\.]?
                (?P<post_n2>[0-9]+)?
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?
            (?P<dev_l>dev)
            [-_\.]?
            (?P<dev_n>[0-9]+)?
        )?
        (?P<date>
            [-_\.]
            (?:20[0-9][0-9] [0-1][0-9] [0-3][0-9])       # yyyy mm dd
        )?
        (?P<gitcount>
            [-_\.]?
            [0-9]+
        )?
        (?P<gitcommit>
            [-_\.]?
            g[0-9a-f]{2,10}
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
c                   @  s,   e Zd ZdZede d ejejB Z	dS )TesseractVersionzLModify standard packaging.Version regex to support Tesseract idiosyncracies.z^\s*z\s*$N)
r   r    r!   r"   recompileTESSERACT_VERSION_PATTERNVERBOSE
IGNORECASE_regexr   r   r   r   r#   j   s
    r#   returnstrc                   C  s   t dddS )N	tesseractztesseract\s(.+))regex)r   r   r   r   r   versionq   s   r.   boolc                   C  s
   t  dkS )z6Does Tesseract have -c thresholding method capability?z5.0)r.   r   r   r   r   has_thresholdingu   s   
r0   set[str]c               
   C  s   dd } ddg}zt |dttddd}|j}W n ty+ } zt| |j|d }~ww | D ]}|dr=t| |q0| ^}}dd	 |D S )
Nc                 S  s   d}|| 7 }|S )NzSTesseract failed to report available languages.
Output from Tesseract:
-----------
r   )outputr   r   r   r   
lang_error{   s   z!get_languages.<locals>.lang_errorr,   z--list-langsT)textstdoutstderrZlogs_errors_to_stdoutcheckErrorc                 S  s   h | ]}|  qS r   )strip).0langr   r   r   	<setcomp>   s    z get_languages.<locals>.<setcomp>)	r   r   r   r5   r   r   r2   
splitlines
startswith)r3   Z	args_tessprocr2   elineZ_headerrestr   r   r   get_languagesz   s,   	

rC   langs	list[str]engine_mode
int | Nonec                 C  s<   dg}| r| dd| g |d ur| dt|g |S )Nr,   z-l+z--oem)extendjoinr+   )rD   rF   argsr   r   r   tess_base_args   s   rL   binary_outputbytesdict[str, str]c                   s    fdd}t | S )Nc                  3  sT        D ] } |  } | jddd}t|dkr'|d  |d  fV  qd S )N:r   )maxsplitr   r   )decoder=   r9   splitlen)rA   partsrM   r   r   gen   s   z$_parse_tesseract_output.<locals>.gen)dict)rM   rW   r   rV   r   _parse_tesseract_output   s   
rY   
input_filer   timeoutfloatr   c           	   
   C  s   t dg|ddt| dg }zt|tt|dd}W n= ty(   tddd	 Y S  tyV } z#t|j	 t|j
 d
|jv sCd|jv rNtddW  Y d }~S t |d }~ww t|j	}t|dd}t|t|ddd	}|S )Nosd--psm0r5   Tr5   r6   r[   r7   r           )angle
confidences&   Too few characters. Skipping this page   Image too largezOrientation in degreeszOrientation confidence)rL   r   r   r   r   r	   r   r   tesseract_log_outputr5   r6   r2   r   rY   intgetr\   )	rZ   rF   r[   args_tesseractpr@   r]   rb   Zorient_confr   r   r   get_orientation   s2   






rj   	languagesc           
   
   C  s   t ||ddt| dg }zt|tt|dd}W n9 ty"   Y dS  tyQ } z$t|j t|j	 d|j
v sB|j
dkrI|jd	krIW Y d
}~dS t |d
}~ww t|j}t|dd}dt | }	|	S )z+Gets angle to deskew this page, in degrees.r^   2r5   Tr`   ra      Empty page!!    r   NzDeskew angler      )rL   r   r   r   r   r	   r   re   r5   r6   r2   
returncoder   rY   r\   rg   r   )
rZ   rk   rF   r[   rh   ri   r@   parsedZdeskew_radiansZdeskew_degreesr   r   r   
get_deskew   s.   




rr   streamNonec                 C  sZ  t tttdr
tjnd d}| sd S z|  }W n ty'   | dd}Y nw | }|D ]|}|dr6q.|dr<q.d|v rF|d q.|d	rQ|d
 q.d|v rVq.d|v r[q.d|	 v rs|
|  |dd }t|d|	 v sd|	 v r|
|  q.d|	 v r||  q.d|	 v r|
|  q.||  q.d S )Nr   r   utf-8ignorezTesseract Open SourcezWarning in pixReadMemZ
diacriticsz&lots of diacritics - possibly poor OCRzOSD: Weak marginzunsure about page orientationzError in pixScanForForegroundzError in boxClipToRectanglezparameter not found: zfound: r   error	exceptionwarningZread_params_file)r   loghasattrr   rR   UnicodeDecodeErrorr=   r>   ry   lowerrw   r9   rS   r   info)rs   Ztlogr4   linesrA   problemr   r   r   re      sH   


re   c                 C  s   | dkrd S t d d S )Nr   z+[tesseract] took too long to OCR - skipping)rz   ry   )r[   r   r   r   page_timedout  s   r   output_hocroutput_textimagec                 C  s\   t |}|j\}}W d   n1 sw   Y  | jt||dd |jddd dS )zjProduce a .hocr file that reports no text detected on a page that is
    the same size as the input image.Nru   encoding[skipped page])r   opensize
write_textHOCR_TEMPLATEformat)r   r   r   Zimwhr   r   r   _generate_null_hocr  s
   r   rf   
tessconfigpagesegmodethresholdingc              
   C  sb  | d}t||}|dur|dt|g |dkr(t r(|dd| g |	r1|d|	g |
r:|d|
g |t| t|d	d
g || zt|tt|dd}|j	}W n? t
yn   t| t|||  Y dS  ty } z t|j d|jv sd|jv rt|||  W Y d}~dS t |d}~ww t| | d r| d| dS dS )z5Generate a hOCR file, which must be converted to PDF. Nr^   r   -cthresholding_method=--user-words--user-patternsZhocrtxtTr`   rd   rm   .txt)with_suffixrL   rI   r+   r0   r   r   r   r   r5   r	   r   r   r   re   r2   r   existsreplace)rZ   r   r   rk   rF   r   r[   r   r   
user_wordsuser_patternsprefixrh   ri   r5   r@   r   r   r   generate_hocr$  s<   




r   
output_pdfc                 C  s   |j ddd | d d S )Nr   ru   r   rn   )r   write_bytes)r   r   r   r   r   use_skip_page_  s   r   c              
   C  sn  t ||}|dur|dt|g |ddg |dkr*t r*|dd| g |	r3|d|	g |
r<|d|
g |jt|j }|t| t|d	d
g || zt|t	t
|dd}|j}|d rr|d| W n= ty   t| t|| Y dS  ty } zt|j d|jv sd|jv rt|| W Y d}~dS t |d}~ww t| dS )zGenerate a PDF using Tesseract's internal PDF generator.

    We specifically a text-only PDF which is more suitable for combining with
    the input page.
    Nr^   r   ztextonly_pdf=1r   r   r   r   Zpdfr   Tr`   r   rd   rm   )rL   rI   r+   r0   parentr   stemr   r   r   r   r5   r   r   r   r	   r   r   r   re   r2   r   )rZ   r   r   rk   rF   r   r[   r   r   r   r   rh   r   ri   r5   r@   r   r   r   generate_pdff  s>   



r   )r*   r+   )r*   r/   )r*   r1   )rD   rE   rF   rG   r*   rE   )rM   rN   r*   rO   )rZ   r   rF   rG   r[   r\   r*   r   )
rZ   r   rk   rE   rF   rG   r[   r\   r*   r\   )rs   rN   r*   rt   )r[   r\   r*   rt   )r   r   r   r   r   r   r*   rt   )rZ   r   r   r   r   r   rk   rE   rF   rf   r   rE   r[   r\   r   rf   r   rf   r*   rt   )r   r   r   r   r*   rt   )rZ   r   r   r   r   r   rk   rE   rF   rf   r   rE   r[   r\   r   rf   r   rf   r*   rt   )4r"   
__future__r   loggingr$   mathr   osr   pathlibr   
subprocessr   r   r   r	   Zpackaging.versionr
   ZPILr   Zocrmypdf.exceptionsr   r   r   Zocrmypdf.pluginspecr   Zocrmypdf.subprocessr   r   	getLoggerr   rz   r   r   __annotations__LoggerAdapterr   r&   r#   r.   r0   rC   rL   rY   rj   rr   re   r   r   r   r   r   r   r   r   r   <module>   sH   
,




	

 

(



;