
    diU8                        S SK r S SKrS SKrS SKrS SKrS SKJrJr  S SKJ	r	  S SK
r
S SKJrJr  S SKJr  S SKJr  S SKrS SKrS SKJr  \ R,                  " \ R.                  S9  \ R0                  " \5      rS	rS
rSr\" SS9r " S S\5      r\ RC                  SS5      r"S\ S\ 4S jr#S\ S-  S\ 4S jr$S\ S\%\    4S jr&\RN                  " S\RP                  5      r)S\R*                  S\R*                  4S jr*S\R*                  S\ 4S jr+S\ S\%\    4S jr,S\ S\%\    4S jr-S\ S\%\    4S  jr.S!\ S"\ S\ 4S# jr/\Ra                  S$5      S%\4S& j5       r1g)'    N)ThreadPoolExecutoras_completed)Set)FastAPIHTTPException)	BaseModel)convert_from_path)Image)levelzben+eng      zLand PDF Search API)titlec                   F    \ rS rSr% \\   \S'   \\   \S'   \\   \S'   Srg)SearchRequest   pdf_urlsJL_NoDaag_No N)__name__
__module____qualname____firstlineno__liststr__annotations____static_attributes__r       /var/www/html/land-ocr/main.pyr   r      s     3i9#Yr   r   u   ০১২৩৪৫৬৭৮৯
0123456789textreturnc                 |    U R                  [        5      n [        R                  " SSU 5      R	                  5       n U $ )Nz\s+ )	translateBN_TO_ENresubstrip)r!   s    r   normalize_textr*      s0    >>(#D66&#t$**,DKr   cellc                 *    U (       a  [        U 5      $ S$ )N )r*   )r+   s    r   
clean_cellr.      s    #'>$/R/r   c                     [        [        R                  " SU [        R                  5      5      nU=(       d     [        [        R                  " SU 5      5      $ )NuK   (?:জে\.?\s*এল\.?\s*নং|J\.?\s*L\.?\s*No\.?)\s*[:\-]?\s*(\d{2,4})z\b\d{2,4}\b)setr'   findall
IGNORECASE)r!   labeleds     r   extract_jl_numbersr4      s@    "**Vbmm G ;c"**^T:;;r   z\b(\d{2,4})\s+[\u0980-\u09FF]imgc                 H    U R                   S:w  a  U R                  S5      n U $ )u1   Light preprocessing → faster + often better OCRL)modeconvertr5   s    r   preprocess_image_for_ocrr;      s"    
xx3kk# Jr   c                 L    [        U 5      n [        R                  " U [        SS9$ )Nz--psm 6 -c tessedit_do_invert=0)langconfig)r;   pytesseractimage_to_stringOCR_LANGr:   s    r   ocr_pagerB      s(    
"3
'C&&0 r   pdf_pathc                 ^    [        U [        [        SS9n/ n[        [        S9 nU Vs0 s H  oCR	                  [
        U5      U_M     nn[        U5       H.  n UR                  5       nUR                  [        U5      5        M0     SSS5        SR                  U5      n	[        U	5      $ s  snf ! [         a#  n[        R                  SU 35         SnAM  SnAff = f! , (       d  f       N_= f! [         a/  n[        R                  SU  SU 35        [!        5       s SnA$ SnAff = f)	z2Parallel OCR across pages using ThreadPoolExecutorjpeg)dpithread_countfmt)max_workerszOCR failed on one page: Nr$   zOCR failed for : )r	   DPIMAX_WORKERSr   submitrB   r   resultappendr*   	Exceptionloggerwarningjoinr4   errorr0   )
rC   images	ocr_textsexecutorr5   future_to_imgfuturer!   efull_ocrs
             r   extract_jl_from_ocrr\      s   "$	
 	K8HLRSFS__Xs;S@FMS&}5C!==?D$$^D%9: 6 9 88I&!(++ T
 ! CNN%=aS#ABBC 98  xj1#67uso   #C3 C" B-
C"*B2C"	#C3 -C"2
C<CC"CC""
C0,C3 3
D,=$D'!D,'D,c                    [        5       n [        R                  " U 5       nUR                   H  nSSSSS.nUR	                  U5       Hg  nU=(       d    /  HU  nU(       d  M  US   (       d  M  [        US   5      n[        R                  " SU5      (       d  MD  UR                  U5        MW     Mi     [        UR                  5       =(       d    S5      nUR                  [        R                  U5      5        M     S S S 5        U$ ! , (       d  f       U$ = f! [         a&  n	[        R!                  SU  SU	 35         S n	A	U$ S n	A	ff = f)	Nlines   )vertical_strategyhorizontal_strategysnap_tolerancejoin_tolerancer   z\d{2,4}r-   zpdfplumber failed for rJ   )r0   
pdfplumberopenpagesextract_tablesr.   r'   	fullmatchaddr*   extract_textupdateDAAG_LINE_PATTERNr1   rP   rQ   rT   )
rC   resultspdfpagetable_settingstablerow	daag_cellr!   rZ   s
             r   extract_daag_from_pdf_textrt     s    G?__X&#		 *1+2&'&'	" "00@E${{33q66(23q6(:I!||J	BB 'I 6	  + A &d&7&7&9&?R@088>?# " ', N- '&, N  ?-hZr!=>>N?sG   D >D	$D	0(D	A#D	?D 	
DD D 
E%EEocr_textc                     [        U 5      n[        R                  " SSU5      n[        [        R                  U5      5      $ )Nu   দা\s*গu	   দাগ)r*   r'   r(   r0   rl   r1   )ru   r!   s     r   extract_daag_numbers_ocrrw   5  s5    (#D66/;5D ((.//r   urlfolderc                 N   [         R                  R                  U[         R                  R                  U 5      5      n[        R
                  " U SS9nUR                  5         [        US5       nUR                  UR                  5        S S S 5        U$ ! , (       d  f       U$ = f)N   )timeoutwb)
ospathrS   basenamerequestsgetraise_for_statusre   writecontent)rx   ry   r   rfs        r   download_pdfr   ;  su    77<< 0 0 56DS"%A	dD	Q			 
K 
	Ks   /B
B$z/extractpayloadc                 4  #    [        U R                  5      n[        U R                  5      n[        5       n[        5       n/ n[        R                  " 5        n/ nU R
                   H  n UR                  [        X5      5        M      U H  n [        U5      nUR                  X-  5         [        U5      nUR                  X--  5        X$-
  (       d  ML   [        U[        SS9nSR!                  S U 5       5      nUR                  U[#        U5      -  5        M     S S S 5        ['        U5      ['        U5      S
.['        X-
  5      ['        X$-
  5      S
.US.nUS   S   (       d  US   S   (       d  U$ [)        SUS9e! [         a:  n	SU SU	 3n
[        R                  U
5        UR                  U
5         S n	A	GMZ  S n	A	ff = f! [         a9  n	SU SU	 3n
[        R                  U
5        UR                  U
5         S n	A	GNZS n	A	ff = f! [         a9  n	SU SU	 3n
[        R                  U
5        UR                  U
5         S n	A	GNS n	A	ff = f! [         a$  n	[        R%                  S	U	 35         S n	A	GM  S n	A	ff = f! , (       d  f       GNm= f7f)NzFailed to download rJ   zJL OCR failed for z!pdfplumber extraction failed for rE   )rF   rH   r$   c              3   J   #    U  H  n[        [        U5      5      v   M     g 7f)N)r*   rB   ).0r5   s     r   	<genexpr>$extract_land_data.<locals>.<genexpr>q  s      (AG#x}55s   !#zDaag OCR fallback failed: )r   r   )found	not_founderrorsr   r   r   i  )status_codedetail)r0   r   r   tempfileTemporaryDirectoryr   rO   r   rP   rQ   rT   r\   rk   rt   r	   rK   rS   rw   rR   sortedr   )r   req_jlreq_daagfound_jl
found_daagr   tmpdir	pdf_pathsrx   rZ   msgrC   jl_from_ocrdaag_from_pdfrU   ru   responses                    r   extract_land_datar   D  sp    F7??#HH5JF		$	$	&&	##C#  c!:; $ "H#1(; 45# :8 D!!(":; $$E.xSfMF"xx (AG(  H %%h1I(1S&ST9 " 
'\ H%j)

 F-.h34
 
H K )(;2G	2R
C
99k  #+C51#6S!c""#  #*8*Bqc:S!c""#  #9(2aSIS!c""# ! ENN%?s#CDDES 
'	&s   AJJ+F	JG	.HJAIJ A"J
G.G:JGJ	
H.HJHJ
I.IJIJ
JI>7J>JJ
JJ)2loggingr~   r'   r   asyncioconcurrent.futuresr   r   typingr   r   fastapir   r   pydanticr   	pdf2imager	   r?   rd   PILr
   basicConfigINFO	getLoggerr   rQ   rA   rK   rL   appr   r   	maketransr&   r*   r.   r0   r4   compileUNICODErl   r;   rB   r\   rt   rw   r   postr   r   r   r   <module>r      s  h  	 	   ?   *  '      ',, '			8	$	)*I  ==9<H  0S4Z 0C 0<S <SX < JJ?L %++ %++ %++ # # #c( 8 S 80s 0s3x 0c 3 3  *B:] B: B:r   