
    |Hj]                     *   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	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  ej        dd            ed	
          Ze                    edgddgdg            ej        ddgd          Zd Zd Zd#dZd Zd Zd Zd Z e!                    d           ed          fdefd            Z"e!                    d          de#fd             Z$e%                    d!          d"             Z&dS )$    N)FastAPI
UploadFileFileHTTPException)JSONResponse)CORSMiddleware)convert_from_pathignorez.*pin_memory.*)messagezCarbon AI Extraction API)title*T)allow_originsallow_credentialsallow_methodsallow_headersenbnF)gpuc                 d   | | j         dk    rdS | j        dd         \  }}t          dt          |                    t          dt          |                    }}t	          |t          |                    t	          |t          |                    }}||k    s||k    rdS | ||||f         S )z;Safely crops an image without exceeding its canvas borders.Nr      )sizeshapemaxintmin)imagex1y1x2y2hws          %/var/www/html/Carbon-Document/main.py	safe_cropr$   X  s    }
at;rr?DAqCGG__c!SWWooBCGG__c!SWWooB	Rxx288tB2    c                    | | j         dk    rdS t          j        | t          j                  }t          j        |dddt          j                  }t          j        |dt          j        t          j        dd          }|S )z9Enhances text contrast for better OCR engine recognition.Nr   r   )fxfyinterpolation         )	r   cv2cvtColorCOLOR_BGR2GRAYresizeINTER_CUBICadaptiveThresholdADAPTIVE_THRESH_GAUSSIAN_CTHRESH_BINARY)r   graythreshs      r#   preprocess_for_ocrr7   e  sr    }
at<s122D:dDQ1COLLLD"c3133Db! F Mr%      c                    | | j         dk    rdS t          j        | t          j                  }t          j        |ddt          j                  d         }t          j        t          j        d          }t          j        |t          j	        |          }t          j
        |t          j        t          j                  \  }}d}|D ]+}t          j        |          }	d|	cxk     rd	k     rn &||	z  },||k    S )
z?Detects ink presence clusters via isolated structural contours.Nr   F   r*      )r   r   r+   i'  )r   r-   r.   r/   	thresholdTHRESH_BINARY_INVgetStructuringElement
MORPH_RECTmorphologyEx
MORPH_OPENfindContoursRETR_EXTERNALCHAIN_APPROX_SIMPLEcontourArea)
crop_imgthreshold_arear5   r6   kernelcontours_total_handwriting_areacntareas
             r#   is_handwriting_presentrN   q  s    8=A--u<#"455D]4c3+@AA!DF&s~v>>Ffcnf==F"63+<c>UVVKHa + +s##u"d*"!N22r%   c                 "   | | j         dk    rdS t          j        | t          j                  }t          j        |ddt          j                  \  }}|j        dd         \  }}|dz  }|ddd|f         }|dd||dz  f         }|dd|dz  |f         }	t          j        |dk              t          j        |dk              t          j        |	dk              g}
t          j	        |
          }|
|         dk     rdS dd	d
d}||         S )z
    Slices the ownership section into 3 horizontal segment zones,
    calculates pixel density in each, and determines the ticked entry.
    Nr      r*   r      x   '   নিজস্ব জমি (Own Land)1   লিজ নেওয়া জমি (Leased Land)J   যৌথ মালিকানাধীন জমি (Jointly Owned Land))r   r;   r   )
r   r-   r.   r/   r<   r=   r   npsumargmax)ownership_cropr5   rJ   r6   r!   r"   col_wsec1sec2sec3	densitiesmax_idxmappings                r#   detect_checked_valuera     s6   
 !4!9!9t<(:;;DdCc.CDDIAv<DAq FE!!!QuW*D!!!U57]"#D!!!U1WQY,D $$bfTS[&9&926$#+;N;NOIi	""GCt 5>W G
 7r%   c                 d   |dk    r_t          |           dk     rdS | d         }|j        dd         \  }}t          ||dz  |dz  |dz  |d	z            }t          |d
          S |dk    r_t          |           dk     rdS | d         }|j        dd         \  }}t          ||dz  |dz  |dz  |dz            }t          |d
          S |dk    r_t          |           dk     rdS | d         }|j        dd         \  }}t          ||dz  |dz  |dz  |dz            }t          |d          S dS )z
    Bypasses AI text matching entirely for verification pages. 
    Uses fast template-matching regions to find handwriting.
    rS   r   Fr;   Ng?gffffff?gffffff?gq=
ףp?i,  )rG   rT   g?g333333?g?g333333?rU   rQ   g?g333333?g      ?   )lenr   r$   rN   )imagesownership_typepage2r!   r"   sig_zonepage3s          r#   !verify_signature_by_template_zonerj     si    BBBv;;??5q	{2A21UAHa$hD!d(KK%hsCCCC 
N	N	Nv;;??5q	{2A21UAHa$hD!d(KK%hsCCCC 
g	g	gv;;??5q	{2A21UAHa$hD!d(KK%hsCCCC5r%   c           	      *   ddd}t          j        | t           j                  }t                              |d          }|D ]N\  }}}d|v sd|v r|d         dk    r|\  }}}	}
t          | |d	         |d         d
z
  |d	         dz   |	d         d
z             }|t          |          }|t                              |d	          }|rgd                    |                                          }t          j
        dd|                                          }t          |          dk    r||d<   d|v sd|v sd|v rT|\  }}}	}
t          | |d	         d
z   |d         dz
  |d	         dz   |	d         dz             }t          |          }|r||d<   P|S )zBParses Page 1 metadata dynamically relative to layout anchor keys.NzJoyhari Ghorai)/   জমি মালিকানার ধরণ   কৃষকের নামr;   )detailu   কৃষকu	   নামrm   r   
   i   z[^A-Za-z\s] r   u   মালিকানাu	   ধরণu
   ধরণ:r+   iR  rl   )r-   r.   r/   readerreadtextr$   r7   joinstripresubrd   ra   )pageoutputr5   resultsbboxtextprobtltrbrbl	name_cropthresh_name	name_textcleaned_namerY   selected_modes                    r#   process_page1r     s   AEgwxxF<c011Dood1o--G# Z ZdDT!![D%8%8459III#' RR%dBqE2a58RU3Y1bQQ	("4Y"?"?K".$*OOKO$J$J	$ V+.88I+>+>+D+D+F+FL+-6."l+S+S+Y+Y+[+[L"<00144IU'E F &--1D1DX\H\H\#RR&tRURZARUS[RTUVRWZ\R\]]N0@@M ZLYHIMr%   c                 \   i }|                                                      d          }|rqt          | dddd          }t          |          dk     rt	          dd          t          j        t          j        |d	                   t
          j	                  }~n't          j
        |           }|t	          dd
          t          |          }|                    |           ~|                    d          }|st	          dd          d g}|r|dv rat          | dddd          }|rJ|                    t          j        t          j        |d	                   t
          j	                             nt          | dddd          }|D ]F}	|                    t          j        t          j        |	          t
          j	                             Gn'|                    t          j
        |                      t          ||          }
|
st	          dd| d          d|d<   |S )Nz.pdf   r;   r   )dpi
first_page	last_pagethread_count  z+Unable to render verification source files.status_codern   r   z!Invalid input image file pathway.rl   i  zPDocument Processing Rejected: No land ownership checkbox value ticked on page 1.)rS   rT   rQ   zMDocument Validation Rejected: Missing required signature layout block under 'z
' section.zSIGNED & VALIDu7   চুক্তিপত্র যাচাইকরণ)lowerendswithr	   rd   r   r-   r.   rV   arrayCOLOR_RGB2BGRimreadr   updategetappendrj   )	file_pathfinal_outputis_pdf	pdf_pagespage1
page1_datarf   images_pipelineslice_pagesp	is_signeds              r#   process_documentr     sf   L__''//F  
]%iSQRSbcddd	y>>AC8effffRXil33S5FGGI
9%%=C8[\\\\ u%%J
###!%%&WXXN 
e
 
 
 	
 fO 6}}}+I31XYhijjjK b&&s|BH[^4L4LcN_'`'`aaa ,I31XYhijjjK  U U&&s|BHQKKAR'S'STTTTU 	sz)44555 2/>RRI 
}cq}}}
 
 
 	

 O_LJKr%   z/extract-from-file.filec                   K   t           j                            | j                  d         }t	          j        d|          5 }t          j        | j        |           |j	        }d d d            n# 1 swxY w Y   	 t          |          }t          |          t           j                            |          rt          j        |           S S # t           j                            |          rt          j        |           w w xY w)Nr;   Fdeletesuffixcontent)ospathsplitextfilenametempfileNamedTemporaryFileshutilcopyfileobjr   namer   r   existsremove)r   r   	temp_file	temp_pathresults        r#   extract_from_filer   4  s%     Wdm,,Q/F		$E&	A	A	A #Y49i000N	# # # # # # # # # # # # # # #!!),,F+++7>>)$$ 	!Ii    	!27>>)$$ 	!Ii    	!s   "A11A58A5=C 6Dz/extract-from-urlfile_urlc                 j  K   |                      d          d         }d }	 t          j        |           }|j        dk    rt	          dd          t          j        dd|           5 }|                    |j                   |j	        }d d d            n# 1 swxY w Y   t          |          }t          |	          |r4t          j                            |          rt          j        |           S S S # |r4t          j                            |          rt          j        |           w w w xY w)
N.r:   r   z+Unable to pull file from remote URL target.r   Fr   r   )splitrequestsr   r   r   r   r   writer   r   r   r   r   r   r   r   )r   	extensionr   responser   r   s         r#   extract_from_urlr   B  sv     s##B'II!<))3&&C8effff(o)ooNNN 	'R[OOH,---!I	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' "),,F+++ 	!	22 	!Ii    	! 	!9 	!	22 	!Ii    	! 	!s0   A	C9 *"BC9 BC9 B !C9 99D2/c                  
    ddiS )Nr   z-Carbon AI Extraction API Running Successfully r   r%   r#   healthr   V  s    FGGr%   )r8   )'r   rv   r   r   warningsnumpyrV   r-   easyocrr   fastapir   r   r   r   fastapi.responsesr   fastapi.middleware.corsr   	pdf2imager	   filterwarningsappadd_middlewareReaderrr   r$   r7   rN   ra   rj   r   r   postr   strr   r   r   r   r%   r#   <module>r      sT  b	 
			 				        



   < < < < < < < < < < < < * * * * * * 2 2 2 2 2 2 ' ' ' ' ' '  *: ; ; ; ;
 g.///   %%%     
t%	0	0	0
 
 
	 	 	3 3 3 3,  D# # #R  H8 8 8| 
/3tCyy 
! 
!* 
! 
! 
!  
! 
!S ! ! ! !& H H H H Hr%   